applayerpluginsandutils/bookmarksupport/src/bookmarkbase.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/bookmarksupport/src/bookmarkbase.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,580 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <bookmark.h>
+#include "bkmrk.h"
+#include "bkmrkfolder.h"
+
+/**
+RBkNode constructor
+@publishedPartner
+@released
+*/
+EXPORT_C RBkNode::RBkNode() : iItem(NULL)
+	{
+	}
+
+/**
+Closes the RBkNode handle and decrements the reference count
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::Close()
+	{
+	if (iItem)
+		{
+		iItem->DecRefCount();
+		}
+	iItem = NULL;
+	}
+
+/**
+Returns the type of the object that the RBkNode handle is connected to
+
+@return The type of the object connected to
+@publishedPartner
+@released
+*/
+EXPORT_C Bookmark::TType RBkNode::Type() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+
+	return iItem->Type();
+	}
+
+/**
+Method for querying the bookmark item's database id.
+
+@return The item's ID.
+@publishedPartner
+@released
+*/
+EXPORT_C Bookmark::TItemId RBkNode::Id() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+
+	return iItem->Id();
+	}
+
+/**
+Method for querying a bookmark item's parent folder. Only the root will not have
+a parent. The method will leave if an attempt is made to call this on the root folder
+
+@return The opened RBkFolder object.
+@leave KErrNotFound This will leave if called on the root folder (the root folder has no parent).
+@publishedPartner
+@released
+*/
+EXPORT_C RBkFolder RBkNode::OpenParentL() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+
+	CBookmarkFolder* parent = iItem->Parent();
+	if (!parent)
+		{
+		User::Leave(KErrNotFound);
+		}
+	return parent->OpenFolder();
+	}
+	
+/**
+Opens RBkBookmark handle from this RBkNode handle. This is usually done when iterating through a folder. 
+You must ensure that this RBkNode handle is of the type: Bookmark::ETypeBookmark before calling this method. 
+
+This method does NOT close the RBkNode handle
+
+@return The opened RBkBookmark object
+@leave	Bookmark::KErrWrongType The method will leave if an attempt is made to call this with a RBkNode handle which is not of
+the Bookmark::ETypeBookmark type.
+@publishedPartner
+@released
+*/
+EXPORT_C RBkBookmark RBkNode::OpenBookmarkL() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+
+	if (Type() != Bookmark::ETypeBookmark)
+		{
+		// can't create a bookmark from a folder item
+		User::Leave(Bookmark::KErrWrongType);
+		}
+		
+	RBkBookmark handle;
+	handle.SetItem(*iItem);
+	return handle;
+	}
+
+/**
+Opens RBkFolder handle from this RBkNode handle. This is usually done when iterating through a folder. 
+You must ensure that this RBkNode handle is of the type: Bookmark::ETypeFolder before calling this method. 
+
+This method does NOT close the RBkNode handle
+
+@return The opened RBkFolder object.
+@leave	Bookmark::KErrWrongType The method will leave if an attempt is made to call this with a RBkNode handle which is not of
+the Bookmark::ETypeFolder type.
+@publishedPartner
+@released
+*/
+EXPORT_C RBkFolder RBkNode::OpenFolderL() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+
+	if (Type() != Bookmark::ETypeFolder)
+		{
+		// can't create a bookmark from a folder item
+		User::Leave(Bookmark::KErrWrongType);
+		}
+		
+	RBkFolder handle;
+	handle.SetItem(*iItem);
+	return handle;
+	}
+
+/**
+Moves the item to another folder
+
+This function will leave if called on the root folder or an out of memory condition
+occurs. 
+
+@param aNewParent The new parent folder
+@leave Bookmark::KErrReadOnly This function will leave if the item is read only.
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetParentL(RBkFolder& aNewParent)
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+
+	LeaveIfRootL();
+	// Push the bookmark internal item into the cleanupstack using TCleanupItem.
+	// else the iItem will not get deleted in case of a leave from AppendL function.
+	CleanupStack::PushL ( TCleanupItem ( RBkNode::DeleteBkmrkItem, iItem ) );
+	aNewParent.Folder()->AppendL(*iItem);
+	CleanupStack::Pop ();
+	}
+
+/**
+Gets the items title text.
+
+@return A reference to the bookmark's title text
+@publishedPartner
+@released
+*/
+EXPORT_C const TDesC& RBkNode::Title() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+
+	return iItem->Title();
+	}
+	
+/**
+Sets the item's title text. Folder titles must be unique.
+
+@param aTitle The item's new title.
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetTitleL(const TDesC& aTitle)
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+
+	LeaveIfRootL();
+	iItem->SetTitleL(aTitle);
+	}
+
+/**
+Gets the item description text.
+
+@return Reference to the bookmark's description text
+@publishedPartner
+@released
+*/
+EXPORT_C const TDesC& RBkNode::DescriptionL() const
+	{
+	CBkmrkProperties* properties = ExtendedPropertiesL();
+	return properties->Description();
+	}
+	
+/**
+Sets the item's decription text.
+
+@param aDescription The item's new description
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetDescriptionL(const TDesC& aDescription)
+	{
+	LeaveIfRootL();
+	CBkmrkProperties* properties = ExtendedPropertiesL();
+	properties->SetDescriptionL(aDescription);
+	}
+
+/**
+Returns whether the item is public or private
+
+@return ETrue if the bookmark or folder is public, otherwise EFalse
+@publishedPartner
+@released
+*/
+EXPORT_C TBool RBkNode::IsPublic() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+	return iItem->IsPublic();
+	}
+	
+/**
+Sets the public or private status.
+
+@param aPublic Whether the item is to be public or private
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetPublicL(TBool aPublic)
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+	LeaveIfRootL();
+	iItem->SetPublicL(aPublic);
+	}
+
+/**
+Returns whether the item is read only or not
+
+@return ETrue if the bookmark or folder can be written to, otherwise EFalse
+@publishedPartner
+@released
+*/
+EXPORT_C TBool RBkNode::IsWritable() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+	return iItem->IsWritable();;
+	}
+	
+/**
+Sets item to Read Only. An item can always be made Read Only, but the bookmark database must be opened as
+Bookmark::EVisibilityManager in order to set an item back to Read/Write.
+This function will leave if called on the root folder.
+
+@see Bookmark::TVisibility
+@param aWritable Whether the item is to be read only or not
+@leave KErrPermissionDenied This function will leave, when the bookmark database is not opened in 
+Bookmark::EVisibilityManager.
+@leave Bookmark::KErrOperationDenied This function will leave, if called on the root folder.
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetWritableL(TBool aWritable)
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+	
+	LeaveIfRootL();
+	iItem->SetWritableL(aWritable);
+	}
+
+/**
+Returns the ID if an icon is assigned to this bookmark item.
+
+@return The ID of the icon or KNullBookmarkID if no item has been assigned.
+@publishedPartner
+@released
+*/
+EXPORT_C Bookmark::TAttachmentId RBkNode::IconIdL() const
+	{
+	CBkmrkProperties* properties = ExtendedPropertiesL();
+	return properties->IconId();
+	}
+	
+/**
+Sets the icon. Call this with KNullIconID to remove the icon. Icons are stored centrally in
+the database and are shared by bookmark items. If the icon oes not exist in the database this
+method will leave
+
+@param aIconId The ID of the icon.
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetIconIdL(Bookmark::TAttachmentId aIconId)
+	{
+	LeaveIfRootL();
+	CBkmrkProperties* properties = ExtendedPropertiesL();
+	properties->SetIconIdL(aIconId);
+	}
+
+/**
+Gets a custom property for the given property ID. This method will leave
+if no such property has been registered on the database
+
+@param aPropertyId The ID of the property you wish to get
+@param aValue An integer the data value
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::GetCustomPropertyL(TUid aPropertyId, TInt& aValue) const
+	{
+	User::LeaveIfError(ExtendedPropertiesL()->CustomProperties().GetCustomProperty(aPropertyId, aValue));
+	}
+	
+/**
+Gets a custom property for the given property ID. This method will leave
+if no such property has been registered on the database
+
+@param aPropertyId The ID of the property you wish to get
+@param aValue A floating point data value
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::GetCustomPropertyL(TUid aPropertyId, TReal& aValue) const
+	{
+	User::LeaveIfError(ExtendedPropertiesL()->CustomProperties().GetCustomProperty(aPropertyId, aValue));
+	}
+	
+/**
+Gets a custom property for the given property ID. This method will leave
+if no such property has been registered on the database
+
+@param aPropertyId The ID of the property you wish to get
+@param aValue A 16 bit descriptor
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::GetCustomPropertyL(TUid aPropertyId, TDes& aValue) const
+	{
+	User::LeaveIfError(ExtendedPropertiesL()->CustomProperties().GetCustomProperty(aPropertyId, aValue));
+	}
+	
+/**
+Gets a custom property for the given property ID. This method will leave
+if no such property has been registered on the database
+
+@param aPropertyId The ID of the property you wish to get
+@param aValue An 8 bit descriptor
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::GetCustomPropertyL(TUid aPropertyId, TDes8& aValue) const
+	{
+	User::LeaveIfError(ExtendedPropertiesL()->CustomProperties().GetCustomProperty(aPropertyId, aValue));
+	}
+	
+/**
+Assigns a new custom property value to the bookmark item. This method will leave
+if no such property has been registered on the database
+
+@param aPropertyId The ID of the property you wish to set
+@param aValue An integer data value
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetCustomPropertyL(TUid aPropertyId, TInt aValue)
+	{
+	LeaveIfRootL();
+	ExtendedPropertiesL()->CustomProperties().SetCustomPropertyL(aPropertyId, aValue);
+	iItem->SetDirty();
+	}
+
+/**
+Assigns a new custom property value to the bookmark item. This method will leave
+if no such property has been registered on the database
+
+@param aPropertyId The ID of the property you wish to set
+@param aValue A floating point data value
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetCustomPropertyL(TUid aPropertyId, TReal aValue) __SOFTFP
+	{
+	LeaveIfRootL();
+	ExtendedPropertiesL()->CustomProperties().SetCustomPropertyL(aPropertyId, aValue);
+	iItem->SetDirty();
+	}
+
+/**
+Assigns a new custom property value to the bookmark item. This method will leave
+if no such property has been registered on the database
+
+@param aPropertyId The ID of the property you wish to set
+@param aValue A 16 bit descriptor
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetCustomPropertyL(TUid aPropertyId, const TDesC& aValue)
+	{
+	LeaveIfRootL();
+	ExtendedPropertiesL()->CustomProperties().SetCustomPropertyL(aPropertyId, aValue);
+	iItem->SetDirty();
+	}
+
+/**
+Assigns a new custom property value to the bookmark item. This method will leave
+if no such property has been registered on the database
+
+@param aPropertyId The ID of the property you wish to set
+@param aValue An 8 bit descriptor
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetCustomPropertyL(TUid aPropertyId, const TDesC8& aValue)
+	{
+	LeaveIfRootL();
+	ExtendedPropertiesL()->CustomProperties().SetCustomPropertyL(aPropertyId, aValue);
+	iItem->SetDirty();
+	}
+
+/**
+Returns the item's owner if it is a private bookmark.  
+
+@see Bookmark::TVisibility
+@return The item's owner security ID
+@leave KErrPermissionDenied This function will leave when the bookmark database 
+is not opened as Bookmark::EVisibilityManager.
+@publishedPartner
+@released
+*/
+EXPORT_C TSecureId RBkNode::OwnerL() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+	iItem->LeaveIfNotInManagerModeL ();
+	TSecureId id;
+	iItem->GetOwnerL(id);
+	return id;
+	}
+	
+/**
+Sets the owner security ID of this bookmark item. All applications which have opened the bookmark database as 
+Bookmark::EVisibilityManager can use this function. In other visibility modes the aOwner must be the current SID, 
+otherwise function will leave with KErrPermissionDenied
+
+@param aOwner The new owner ID.
+@leave KErrPermissionDenied When the aOwner is not the current SID and the bookmark database is opened in
+non-manager mode.
+@leave Bookmark::KErrOperationDenied This function will leave, if called on the root folder.
+@publishedPartner
+@released
+*/
+EXPORT_C void RBkNode::SetOwnerL(TSecureId aOwner)
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+	LeaveIfRootL();
+	iItem->SetOwnerL(aOwner);
+	}
+
+/**
+Not intended for external use.
+
+@internalComponent
+*/
+CBookmarkBase* RBkNode::Item() const
+	{
+	return iItem;
+	}
+
+/**
+Not intended for external use.
+
+@internalComponent
+*/
+void RBkNode::SetItem(CBookmarkBase& aItem)
+	{
+	// Must not try to assign an already open item
+	__ASSERT_ALWAYS(!iItem, User::Panic(Bookmark::KBookmarkErrCorrupt, Bookmark::KErrCorrupt));
+
+	iItem = &aItem;
+	iItem->IncRefCount();
+	}
+
+/**
+Not intended for external use.
+
+@internalComponent
+*/
+CBkmrkProperties* RBkNode::ExtendedPropertiesL() const
+	{
+	// The handle must be open and attached to a concrete bookmark object
+	__ASSERT_ALWAYS(iItem, User::Panic(Bookmark::KBookmarkErrHandleNotOpen, Bookmark::KErrNotOpen));
+	
+	CBkmrkProperties* properties = &(iItem->ExtendedPropertiesL());
+	return properties;
+	}
+
+void RBkNode::LeaveIfRootL() const
+	{
+	if (Title().Compare(Bookmark::KTxtRootTitle) == 0)
+		{
+		User::Leave(Bookmark::KErrOperationDenied);
+		}
+	}
+
+/**
+ Sets the last modified time to an arbitrary value. Only applications which have opened the bookmark 
+ database as Bookmark::EVisibilityManager can use this function, otherwise it will leave with 
+ KErrPermissionDenied error code.
+
+ Note: The last modified time is automatically set to the current time during a commit. This
+ function should only be used if the caller needs to set to a different time (for example when 
+ synchronising bookmarks).
+ 
+ @param aTime The time to set.
+ @leave KErrPermissionDenied This function will leave, when the bookmark database is not opened in 
+ Bookmark::EVisibilityManager.
+ @publishedPartner
+ @released
+ */
+EXPORT_C void RBkNode::SetLastModifiedL ( const TTime& aTime )
+	{	
+	iItem->LeaveIfNotInManagerModeL ();
+	
+	CBkmrkProperties* properties = ExtendedPropertiesL();		
+	properties->SetLastModified ( aTime );
+	iItem->SetDirty();
+	}
+
+/**
+ Returns the last modified time. If the last modified time was never set, this will return 
+ the value of midnight January 1st 1970 UTC. This can occur when using a version 1.0.0 database.
+ 
+ @return Last modified date value.
+ @publishedPartner
+ @released
+ */
+EXPORT_C TTime RBkNode::LastModifiedL () const
+	{
+	CBkmrkProperties* properties = ExtendedPropertiesL();
+	return properties->LastModified();
+	}
+
+void RBkNode::DeleteBkmrkItem ( TAny* aPtr )
+	{
+	CBookmarkBase* bkItem = ( CBookmarkBase* )aPtr;
+	if ( bkItem )
+		{
+		bkItem->DecRefCount ();
+		delete bkItem;
+		bkItem = NULL;					
+		}
+	}