--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/bookmarksupport/src/bkmrkdb.cpp Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,1011 @@
+// 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:
+// Internal class for opening and manipulating the bookmark database.
+// @internalComponent
+//
+//
+
+#include <e32test.h>
+
+#include "bkmrk.h"
+#include "bkmrkfolder.h"
+#include "bkmrkdb.h"
+#include "repository.h"
+
+_LIT8(KEmptyIconData, "");
+
+const TInt KVersionMajor = 1;
+const TInt KVersionMinor = 0;
+const TInt KVersionBuild = 1;
+
+const TInt KFirstIndex = 1;
+
+CBookmarkDb* CBookmarkDb::NewL(Bookmark::TVisibility aVisibility, MBookmarkObserver* aObserver)
+ {
+ CBookmarkDb* self = new (ELeave) CBookmarkDb(aObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL(aVisibility);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CBookmarkDb::~CBookmarkDb()
+ {
+ delete iHomeText;
+ delete iSearchUri;
+ delete iDatabaseWatcher;
+ delete iDatabaseRepository;
+ delete iFolderWatcher;
+ delete iFolderRepository;
+ delete iBookmarkWatcher;
+ delete iBookmarkRepository;
+ delete iIconWatcher;
+ delete iIconRepository;
+ Reset();
+ delete iCustomProperties;
+ delete iPropertyRegister;
+
+ delete iUnloadedFolderList;
+ }
+
+CBookmarkDb::CBookmarkDb(MBookmarkObserver* aObserver)
+ : iObserver(aObserver)
+ {
+ }
+
+void CBookmarkDb::ConstructL(Bookmark::TVisibility aVisibility)
+ {
+ RThread thread;
+ TSecurityInfo secInfo(thread);
+ TBool hasWriteUserData = secInfo.iCaps.HasCapability(ECapabilityWriteUserData);
+ if (aVisibility == Bookmark::EVisibilityManager && !hasWriteUserData)
+ {
+ User::Leave(KErrPermissionDenied);
+ }
+
+ iVisibility = (aVisibility == Bookmark::EVisibilityDefault) ? Bookmark::EVisibilityAll : aVisibility;
+
+ iDatabaseRepository = CRepository::NewL(KUidBookmarkDatabaseRepository);
+ SetRepository(*iDatabaseRepository);
+ iFolderRepository = CRepository::NewL(KUidFolderRepository);
+ iBookmarkRepository = CRepository::NewL(KUidBookmarkRepository);
+ iIconRepository = CRepository::NewL(KUidIconRepository);
+
+ iPropertyRegister = CPropertyReg::NewL();
+ iCustomProperties = CPropertyList::NewL(*iDatabaseRepository, *iPropertyRegister, CPropertyReg::EGroupDatabase, KDbCusPropertyStart);
+
+ // Create the repositories if they don't exist
+ TPckgBuf<TVersion> pckg;
+ TInt err = iDatabaseRepository->Get(KVersionIndex, pckg);
+ if (err == KErrNone)
+ {
+ TransactionL(ETransLoad);
+ iBkmrkDbInitialized = ETrue;
+ }
+ else if (err == KErrNotFound)
+ {
+ // Set all as default empty values
+ iHomeId = Bookmark::KNullItemID;
+ iHomeText = KNullDesC().AllocL();
+ iSearchUri = KNullDesC8().AllocL();
+ iDefaultProxy = 0;
+ iDefaultNap = 0;
+ }
+ else
+ {
+ User::Leave(err);
+ }
+
+ if (iObserver)
+ {
+ iDatabaseWatcher = new (ELeave) CBkmrkWatcher(EBkmrkWatcherDatabase, *this, *iDatabaseRepository);
+ iDatabaseWatcher->WatchL();
+ iFolderWatcher = new (ELeave) CBkmrkWatcher(EBkmrkWatcherFolder, *this, *iFolderRepository);
+ iFolderWatcher->WatchL();
+ iBookmarkWatcher = new (ELeave) CBkmrkWatcher(EBkmrkWatcherBookmark, *this, *iBookmarkRepository);
+ iBookmarkWatcher->WatchL();
+ iIconWatcher = new (ELeave) CBkmrkWatcher(EBkmrkWatcherIcon, *this, *iIconRepository);
+ iIconWatcher->WatchL();
+ }
+
+ iTreeSync = EFalse;
+ iConfigSync = EFalse;
+ iIconSync = EFalse;
+
+ iUnloadedFolderList = new (ELeave) CDesCArrayFlat(10);
+ SetClean();
+ }
+
+void CBookmarkDb::Reset()
+ {
+ ResetTree();
+ ResetIcons();
+ if (iCustomProperties)
+ {
+ iCustomProperties->Reset();
+ }
+ }
+
+void CBookmarkDb::ResetTree()
+ {
+ if (iRoot)
+ {
+ iRoot->Reset();
+ delete iRoot;
+ iRoot = NULL;
+ iTreeConstructed = EFalse;
+ }
+
+ if (iUnloadedFolderList)
+ {
+ iUnloadedFolderList->Reset();
+ }
+
+ iFolderList.Reset();
+ iBookmarkList.Reset();
+
+ for (TInt index = iDeletedList.Count() - 1; index >= 0; --index)
+ {
+ delete iDeletedList[index];
+ }
+ iDeletedList.Reset();
+ }
+
+void CBookmarkDb::ResetIcons()
+ {
+ for (TInt index = iIconList.Count() - 1; index >= 0; --index)
+ {
+ delete iIconList[index];
+ }
+ iIconList.Reset();
+
+ iIconSync = EFalse;
+ }
+
+void CBookmarkDb::RefreshL()
+ {
+ // If no repository files( no bookmark data ) exists, it is not required to
+ // refresh the bookmark view. Check whether the repository has data or not
+ //
+ if ( HasDataInRepositoryL () )
+ {
+ TransactionL(ETransLoad);
+ ResetTree();
+ ConstructTreeL();
+ ResetIcons();
+ LoadIconsL();
+ }
+ }
+
+void CBookmarkDb::InitialiseRepL(CRepository& aRepository)
+ {
+ TPckgBuf<TVersion> pckg;
+ TInt err = aRepository.Get(KVersionIndex, pckg);
+ if (err == KErrNotFound)
+ {
+ TInt result = KErrLocked;
+ do
+ {
+ aRepository.StartTransaction(CRepository::EConcurrentReadWriteTransaction);
+
+ // create entries in the repository
+ TVersion version(KVersionMajor, KVersionMinor, KVersionBuild);
+ TPckgBuf<TVersion> pckg(version);
+ aRepository.Create(KVersionIndex, pckg);
+ aRepository.Create(KRepNextIndex, KFirstIndex);
+
+ // commit the transaction
+ TUint32 failedIndex;
+ result = aRepository.CommitTransaction(failedIndex);
+ } while (result == KErrLocked);
+ User::LeaveIfError(result);
+ }
+ else if (err != KErrNone)
+ {
+ User::Leave(err);
+ }
+ }
+
+
+void CBookmarkDb::CommitL()
+ {
+ CreateDefaultRepositoriesL ();
+
+ CRepositoryAccessor::CommitL();
+
+ iPropertyRegister->CommitL();
+ iCustomProperties->CommitL();
+
+ TInt index = iFolderList.Count() - 1;
+ for (;index >= 0; --index)
+ {
+ iFolderList[index]->CommitL();
+ }
+
+ index = iBookmarkList.Count() - 1;
+ for (;index >= 0; --index)
+ {
+ iBookmarkList[index]->CommitL();
+ }
+
+ index = iIconList.Count() - 1;
+ for (;index >= 0; --index)
+ {
+ iIconList[index]->CommitL();
+ }
+
+ index = iDeletedList.Count() - 1;
+ for (;index >= 0; --index)
+ {
+ iDeletedList[index]->CommitL();
+ delete iDeletedList[index];
+ iDeletedList[index] = NULL;
+ }
+ iDeletedList.Reset();
+ }
+
+CBookmarkFolder& CBookmarkDb::RootL()
+ {
+ ConstructTreeL();
+ return *iRoot;
+ }
+
+CBookmarkFolder* CBookmarkDb::FindFolder(const TDesC& aFolderName)
+ {
+ TInt index = iFolderList.Count() - 1;
+ for (;index >=0; --index)
+ {
+ if (iFolderList[index] != NULL &&
+ aFolderName.Compare(iFolderList[index]->Title()) == 0)
+ {
+ return static_cast<CBookmarkFolder*>(iFolderList[index]);
+ }
+ }
+
+ return NULL;
+ }
+
+CBookmark& CBookmarkDb::CreateBookmarkL(CBookmarkFolder& aParent)
+ {
+ CreateDefaultRepositoriesL ();
+ ConstructTreeL();
+ CBookmarkFolder* parent = &aParent;
+ CBookmark* bookmark = CBookmark::NewL(*parent, *this);
+ CleanupStack::PushL(bookmark);
+ bookmark->AssignIdL();
+ bookmark->SetTitleL(KNullDesC);
+ iBookmarkList.AppendL(bookmark);
+ CleanupStack::Pop(bookmark);
+
+ return *bookmark;
+ }
+
+CBookmarkFolder& CBookmarkDb::CreateFolderL(const TDesC& aFolderName, CBookmarkFolder& aParent)
+ {
+ CreateDefaultRepositoriesL ();
+ if (FindFolder(aFolderName) || FindUnloadedFolder(aFolderName))
+ {
+ User::Leave(Bookmark::KErrTitleAlreadyUsed);
+ }
+
+ ConstructTreeL();
+ CBookmarkFolder* parent = &aParent;
+ CBookmarkFolder* folder = CBookmarkFolder::NewL(parent, *this);
+ CleanupStack::PushL(folder);
+ folder->AssignIdL();
+ folder->SetTitleL(aFolderName);
+ iFolderList.AppendL(folder);
+ CleanupStack::Pop(folder);
+
+ return *folder;
+ }
+
+void CBookmarkDb::DeleteItemL(Bookmark::TItemId aItem, TBool aRecursive)
+ {
+ if (aItem == Bookmark::KRootItemID)
+ {
+ User::Leave(Bookmark::KErrOperationDenied);
+ }
+
+ CBookmarkBase* item = FindItem(aItem);
+ if (!item)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ if (item->Type() == Bookmark::ETypeFolder && !aRecursive)
+ {
+ CBookmarkFolder* folder = static_cast<CBookmarkFolder*>(item);
+ folder->SendChildrenToFolderL(*iRoot);
+ }
+
+ // Bookmark items are not deleted until the database is commited
+ // Deleted items are removed from the folder tree and go into a
+ // 'deleted' list. On a commit the deleted list is deleted from memory
+ // and from the repository.
+ item->DeleteL();
+ }
+
+void CBookmarkDb::RemoveBookmarkL(CBookmark* aBookmark)
+ {
+ TInt index = iBookmarkList.Find(aBookmark);
+ if (index != KErrNotFound)
+ {
+ if (Home() == aBookmark)
+ {
+ SetHome(NULL);
+ }
+ iBookmarkList.Remove(index);
+ iDeletedList.AppendL(aBookmark);
+ }
+ }
+
+void CBookmarkDb::RemoveFolderL(CBookmarkFolder* aFolder)
+ {
+ TInt index = iFolderList.Find(aFolder);
+ if (index != KErrNotFound)
+ {
+ iFolderList.Remove(index);
+ iDeletedList.AppendL(aFolder);
+ }
+ }
+
+const TDesC8& CBookmarkDb::IconL(Bookmark::TAttachmentId aIconId)
+ {
+ LoadIconsL();
+ TInt index = FindIcon(aIconId);
+ if (index == KErrNotFound)
+ {
+ User::Leave(KErrNotFound);
+ }
+ return iIconList[index]->Data();
+ }
+
+Bookmark::TAttachmentId CBookmarkDb::CreateIconL(const TDesC8& aData)
+ {
+ CreateDefaultRepositoriesL ();
+
+ LoadIconsL();
+ CBkmrkAttachment* icon = CBkmrkAttachment::NewL(*iIconRepository, aData);
+ CleanupStack::PushL(icon);
+ icon->SetIdL();
+ iIconList.AppendL(icon);
+ CleanupStack::Pop(icon);
+ return icon->Id();
+ }
+
+TInt CBookmarkDb::DeleteIconL(Bookmark::TAttachmentId aIconId)
+ {
+ LoadIconsL();
+ TInt index = FindIcon(aIconId);
+ if (index == KErrNotFound)
+ {
+ return KErrNotFound;
+ }
+
+ iDeletedList.AppendL(iIconList[index]);
+ iIconList[index]->DeleteL();
+ iIconList.Remove(index);
+
+ return KErrNone;
+ }
+
+TVersion CBookmarkDb::Version()
+ {
+ TVersion version(KVersionMajor, KVersionMinor, KVersionBuild);
+ return version;
+ }
+
+Bookmark::TVisibility CBookmarkDb::Visibility()
+ {
+ return iVisibility;
+ }
+
+void CBookmarkDb::SetHome(CBookmark* aHome)
+ {
+ iHome = aHome;
+ if (iHome)
+ {
+ iHomeId = iHome->Id();
+ }
+ else
+ {
+ iHomeId = Bookmark::KNullItemID;
+ }
+ SetDirty();
+ }
+
+CBookmark* CBookmarkDb::Home()
+ {
+ return iHome;
+ }
+
+const TDesC& CBookmarkDb::HomePageText() const
+ {
+ return *iHomeText;
+ }
+
+void CBookmarkDb::SetHomePageTextL(const TDesC& aHomePageText)
+ {
+ // The aHomePageText must be smaller that the maximim descriptor storage size
+ __ASSERT_ALWAYS(aHomePageText.Length() <= Bookmark::KMaxDescriptorLength, User::Panic(Bookmark::KBookmarkErrTooLong, KErrArgument));
+
+ delete iHomeText;
+ iHomeText = NULL;
+ iHomeText = aHomePageText.AllocL();
+ SetDirty();
+ }
+
+const TDesC8& CBookmarkDb::SearchUri() const
+ {
+ return *iSearchUri;
+ }
+
+void CBookmarkDb::SetSearchUriL(const TDesC8& aUri)
+ {
+ // The aUri must be smaller that the maximim uri storage size
+ __ASSERT_ALWAYS(aUri.Length() <= Bookmark::KMaxUriLength, User::Panic(Bookmark::KBookmarkErrTooLong, KErrArgument));
+
+ delete iSearchUri;
+ iSearchUri = NULL;
+ iSearchUri = aUri.AllocL();
+ SetDirty();
+ }
+
+TUint32 CBookmarkDb::DefaultProxy() const
+ {
+ return iDefaultProxy;
+ }
+
+void CBookmarkDb::SetDefaultProxy(TUint32 aServiceId)
+ {
+ iDefaultProxy = aServiceId;
+ SetDirty();
+ }
+
+TUint32 CBookmarkDb::DefaultNap() const
+ {
+ return iDefaultNap;
+ }
+
+void CBookmarkDb::SetDefaultNap(TUint32 aNetworkId)
+ {
+ iDefaultNap = aNetworkId;
+ SetDirty();
+ }
+
+TBool CBookmarkDb::IsTreeConstructed()
+ {
+ return (iRoot != NULL && iTreeConstructed);
+ }
+
+void CBookmarkDb::ConstructTreeL()
+ {
+ if (!iRoot)
+ {
+ iRoot = CBookmarkFolder::NewL(NULL, *this);
+ iRoot->SetTitleL(Bookmark::KTxtRootTitle);
+ iRoot->SetId(Bookmark::KRootItemID);
+ }
+ if ( !IsTreeConstructed() && HasDataInRepositoryL () )
+ {
+ // Load the tree only if the bookmark db is initialized
+ // and the tree is not already constructed.
+ LoadTreeL ();
+ }
+ }
+
+CBookmarkBase* CBookmarkDb::FindItem(Bookmark::TItemId aItemId)
+ {
+ if (aItemId == Bookmark::KRootItemID)
+ {
+ return iRoot;
+ }
+
+ CBookmarkBase* item = NULL;
+
+ TInt index = 0;
+ TInt count = 0;
+ // the top bit of the id indicates whether the id is a folder or bookmark
+ TInt topBitSet = aItemId & KFolderIdMaskID;
+ if (topBitSet == 0)
+ {
+ // item is a bookmark
+ count = iBookmarkList.Count();
+ for (index = 0; index < count; ++index)
+ {
+ if (iBookmarkList[index]->Id() == aItemId)
+ {
+ // bookmark item found
+ item = iBookmarkList[index];
+ break;
+ }
+ }
+ }
+ else
+ {
+ // item is a folder
+ Bookmark::TItemId folderId;
+ count = iFolderList.Count();
+ for (index = 0; index < count; ++index)
+ {
+ folderId = iFolderList[index]->Id();
+ if (folderId == aItemId)
+ {
+ // folder item found
+ item = iFolderList[index];
+ break;
+ }
+ }
+ }
+
+ return item;
+ }
+
+CRepository& CBookmarkDb::FolderRepository()
+ {
+ return *iFolderRepository;
+ }
+
+CRepository& CBookmarkDb::BookmarkRepository()
+ {
+ return *iBookmarkRepository;
+ }
+
+CPropertyList& CBookmarkDb::CustomProperties()
+ {
+ return *iCustomProperties;
+ }
+
+CPropertyReg& CBookmarkDb::PropertyRegister()
+ {
+ return *iPropertyRegister;
+ }
+
+void CBookmarkDb::BWONotify(TBkmrkWatcherType aType)
+ {
+ switch(aType)
+ {
+ case EBkmrkWatcherFolder:
+ case EBkmrkWatcherBookmark:
+ iObserver->MBONotify(MBookmarkObserver::EEventUpdatedBookmarkTree);
+ iTreeSync = EFalse;
+ break;
+ case EBkmrkWatcherDatabase:
+ iObserver->MBONotify(MBookmarkObserver::EEventUpdatedConfig);
+ iConfigSync = EFalse;
+ break;
+ case EBkmrkWatcherIcon:
+ iObserver->MBONotify(MBookmarkObserver::EEventUpdatedIcons);
+ iIconSync = EFalse;
+ break;
+ default:
+ break;
+ }
+ }
+
+void CBookmarkDb::LoadBookmarkListL(CRepository& aRepository, TBkmrkList& aList, Bookmark::TType aType, TBool aLoadAll)
+ {
+ RArray<TUint32> entryList;
+ CleanupClosePushL(entryList);
+ aRepository.FindL(KRepIndexFind, KRepIndexMask, entryList);
+ CBookmarkBase* newItem;
+ TInt count = entryList.Count();
+ for (TInt index = 0;index < count; ++index)
+ {
+ if (aType == Bookmark::ETypeFolder)
+ {
+ newItem = CBookmarkFolder::NewL(NULL, *this);
+ }
+ else
+ {
+ newItem = CBookmark::NewL(*iRoot, *this);
+ }
+ CleanupStack::PushL(newItem);
+ newItem->SetIdFromIndexBase(entryList[index]);
+ newItem->TransactionL(ETransLoad);
+ if (aLoadAll || CheckAccessL(*newItem))
+ {
+ aList.AppendL(newItem);
+ CleanupStack::Pop(newItem);
+ }
+ else
+ {
+ if (aType == Bookmark::ETypeFolder)
+ {
+ iUnloadedFolderList->AppendL(newItem->Title());
+ }
+ CleanupStack::PopAndDestroy(newItem);
+ }
+ }
+ CleanupStack::PopAndDestroy(&entryList);
+ }
+
+void CBookmarkDb::AddItemsToFolderTreeL(TBkmrkList& aList)
+ {
+ TInt rank = 0;
+ CBookmarkFolder* parent;
+ CBookmarkBase* item;
+ TInt count = aList.Count();
+ for (TInt index = 0; index < count; ++index)
+ {
+ item = aList[index];
+ parent = static_cast<CBookmarkFolder*>(FindItem(item->ParentId()));
+ if (!parent)
+ {
+ item->SetOrphaned(ETrue);
+ iRoot->AppendL(*item);
+ }
+ else
+ {
+ rank = item->Rank();
+ if (rank < parent->Count())
+ {
+ parent->InsertL(*item, rank);
+ }
+ else
+ {
+ parent->AppendL(*item);
+ }
+ }
+ item->SetClean();
+ }
+ }
+
+TBool CBookmarkDb::RemoveFolderIfPublicL(CBookmarkFolder& aFolder)
+ {
+ // This method removes public folders in private-only mode.
+ // If not in this mode this method should not be called
+ __ASSERT_DEBUG(iVisibility == Bookmark::EVisibilityPrivate, User::Invariant());
+
+ TBool containsPrivate = EFalse;
+ for (TInt index = aFolder.Count() - 1; index >= 0; --index)
+ {
+ if (aFolder.At(index).Type() == Bookmark::ETypeFolder)
+ {
+ if (RemoveFolderIfPublicL(static_cast<CBookmarkFolder&>(aFolder.At(index))))
+ {
+ containsPrivate = ETrue;
+ }
+ }
+ else
+ {
+ // child is a bookmark which will only exist if it is private
+ containsPrivate = ETrue;
+ }
+ }
+
+ if (&aFolder != iRoot && !containsPrivate && !CheckAccessL(aFolder))
+ {
+ // The folder is not the root, does not contain any private items and is not private itself
+ // we can remove the folder
+ TInt index = iFolderList.Find(&aFolder);
+ iFolderList.Remove(index);
+ iUnloadedFolderList->AppendL(aFolder.Title());
+ delete &aFolder;
+ }
+
+ return containsPrivate;
+ }
+
+void CBookmarkDb::LoadTreeL()
+ {
+ if (HasOpenHandles())
+ {
+ User::Leave(Bookmark::KErrOpenHandle);
+ }
+
+ iLoading = ETrue;
+
+ // If we are in private-only mode then we need to open all the folders initially.
+ // We need to include public folders that contain private bookmarks
+ TBool privateMode = (Visibility() == Bookmark::EVisibilityPrivate);
+
+ // The pointers inside the folder list will not get deleted if LoadBookmarkListL or
+ // AddItemsToFolderTreeL functions leave. Attach the folder list into TCleanupItem
+ CleanupStack::PushL ( TCleanupItem ( CBookmarkDb::ResetAndDestroyBkmrkList, &iFolderList ) );
+ // Load folders into folder list
+ LoadBookmarkListL(*iFolderRepository, iFolderList, Bookmark::ETypeFolder, privateMode);
+ AddItemsToFolderTreeL(iFolderList);
+ CleanupStack::Pop (); // Pop the cleanup item object
+
+ // Load bookmarks into bookmark list
+ CleanupStack::PushL ( TCleanupItem ( CBookmarkDb::ResetAndDestroyBkmrkList, &iBookmarkList ) );
+ LoadBookmarkListL(*iBookmarkRepository, iBookmarkList, Bookmark::ETypeBookmark, EFalse);
+ AddItemsToFolderTreeL(iBookmarkList);
+ CleanupStack::Pop (); // Pop the cleanup item object
+ if (privateMode)
+ {
+ // remove folders that are not private and contain no private items.
+ RemoveFolderIfPublicL(*iRoot);
+ }
+
+ SetHome(static_cast<CBookmark*>(FindItem(iHomeId)));
+
+ iLoading = EFalse;
+ iTreeSync = ETrue;
+ iTreeConstructed = ETrue;
+ }
+
+TBool CBookmarkDb::IsLoading()
+ {
+ return iLoading;
+ }
+
+void CBookmarkDb::LoadIconsL()
+ {
+ if (!iIconSync)
+ {
+ RArray<TUint32> entryList;
+ CleanupClosePushL ( entryList );
+ iIconRepository->FindL(KRepIndexFind, KRepIconIndexMask, entryList);
+ CBkmrkAttachment* newIcon;
+ TInt index = 0;
+ TInt count = entryList.Count();
+ for (;index < count; ++index)
+ {
+ newIcon = CBkmrkAttachment::NewL(*iIconRepository, KEmptyIconData);
+ CleanupStack::PushL(newIcon);
+ newIcon->SetIdFromIndexBase(entryList[index]);
+ newIcon->TransactionL(ETransLoad);
+ iIconList.AppendL(newIcon);
+ CleanupStack::Pop(newIcon);
+ newIcon->SetClean();
+ }
+ CleanupStack::PopAndDestroy ( &entryList );
+
+ iIconSync = ETrue;
+ }
+
+ }
+
+TBool CBookmarkDb::HasOpenHandles()
+ {
+ if (!iRoot)
+ {
+ return EFalse;
+ }
+
+ TInt index = iFolderList.Count() -1;
+ for (; index >= 0; --index)
+ {
+ if (iFolderList[index]->RefCount() != 0)
+ {
+ return ETrue;
+ }
+ }
+
+ index = iBookmarkList.Count() -1;
+ for (; index >= 0; --index)
+ {
+ if (iBookmarkList[index]->RefCount() != 0)
+ {
+ return ETrue;
+ }
+ }
+
+ return EFalse;
+ }
+
+TInt CBookmarkDb::FindIcon(Bookmark::TAttachmentId aIconId)
+ {
+ TInt index = iIconList.Count() - 1;
+ for (;index >= 0; --index)
+ {
+ if (iIconList[index]->Id() == aIconId)
+ {
+ break;
+ }
+ }
+ return index;
+ }
+
+TBool CBookmarkDb::FindUnloadedFolder(const TDesC& aFolderName)
+ {
+ TInt index = iUnloadedFolderList->Count() - 1;
+ for (;index >=0; --index)
+ {
+ if (aFolderName.Compare((*iUnloadedFolderList)[index]) == 0)
+ {
+ return ETrue;
+ }
+ }
+
+ return EFalse;
+ }
+
+TBool CBookmarkDb::CheckAccessL(CBookmarkBase& aItem)
+ {
+ TBool accessible = EFalse;
+
+ // Always accessible if the item is the home page
+ if (aItem.Type() == Bookmark::ETypeBookmark && aItem.Id() == iHomeId)
+ {
+ return ETrue;
+ }
+
+ TBool owned = EFalse;
+ if (!aItem.IsPublic())
+ {
+ RThread thread;
+ TSecurityInfo secInfo(thread);
+ TSecureId id;
+ aItem.GetOwnerL(id);
+ if (id == secInfo.iSecureId)
+ {
+ owned = ETrue;
+ }
+ }
+
+ switch(iVisibility)
+ {
+ case Bookmark::EVisibilityPublic:
+ accessible = aItem.IsPublic();
+ break;
+ case Bookmark::EVisibilityPrivate:
+ accessible = owned;
+ break;
+ case Bookmark::EVisibilityAll:
+ accessible = (owned || aItem.IsPublic());
+ break;
+ case Bookmark::EVisibilityManager:
+ accessible = ETrue;
+ break;
+ case Bookmark::EVisibilityDefault:
+ default:
+ // should have been assigned to one of the values above
+ // during construction so shouldn't get here
+ User::Invariant();
+ break;
+ }
+
+ return accessible;
+ }
+
+
+void CBookmarkDb::TransNewL()
+ {
+ TInt customPropertyCount = 0;
+ // create entries in the repository
+ TVersion version(KVersionMajor, KVersionMinor, KVersionBuild);
+ TPckgBuf<TVersion> pckg(version);
+ iRepository->Create(KVersionIndex, pckg);
+ iRepository->Create(KDbHomeIdIndex, iHomeId);
+ iRepository->Create(KDbHomeTextIndex, *iHomeText);
+ iRepository->Create(KDbSearchUriIndex, *iSearchUri);
+ iRepository->Create(KDbDefaultProxyIndex, iDefaultProxy);
+ iRepository->Create(KDbDefaultNapIndex, iDefaultNap);
+ iRepository->Create(KRepBkmrkPropertyStart, customPropertyCount);
+ iRepository->Create(KRepFldrPropertyStart, customPropertyCount);
+ iRepository->Create(KRepDbPropertyStart, customPropertyCount);
+ }
+
+void CBookmarkDb::TransSaveL()
+ {
+ // create entries in the repository
+ TVersion version(KVersionMajor, KVersionMinor, KVersionBuild);
+ TPckgBuf<TVersion> pckg(version);
+ iRepository->Set(KVersionIndex, pckg);
+ iRepository->Set(KDbHomeIdIndex, iHomeId);
+ iRepository->Set(KDbHomeTextIndex, *iHomeText);
+ iRepository->Set(KDbSearchUriIndex, *iSearchUri);
+ iRepository->Set(KDbDefaultProxyIndex, iDefaultProxy);
+ iRepository->Set(KDbDefaultNapIndex, iDefaultNap);
+ }
+
+void CBookmarkDb::TransLoadL()
+ {
+ TPckgBuf<TVersion> pckg;
+ User::LeaveIfError(iRepository->Get(KVersionIndex, pckg));
+ TVersion version = pckg();
+ if (version.iMajor != KVersionMajor ||
+ version.iMinor != KVersionMinor )
+ {
+ User::Leave(Bookmark::KErrBadVersion);
+ }
+
+ User::LeaveIfError(iRepository->Get(KDbHomeIdIndex, iHomeId));
+ HBufC* homeText = HBufC::NewLC(Bookmark::KMaxDescriptorLength);
+ TPtr16 ptr = homeText->Des();
+ User::LeaveIfError(iRepository->Get(KDbHomeTextIndex, ptr));
+ SetHomePageTextL(*homeText);
+ CleanupStack::PopAndDestroy(homeText);
+
+
+ HBufC8* searchUri = HBufC8::NewLC(Bookmark::KMaxDataLength);
+ TPtr8 ptr8 = searchUri->Des();
+ User::LeaveIfError(iRepository->Get(KDbSearchUriIndex, ptr8));
+ SetSearchUriL(*searchUri);
+ CleanupStack::PopAndDestroy(searchUri);
+
+ User::LeaveIfError(iRepository->Get(KDbDefaultProxyIndex, iDefaultProxy));
+ User::LeaveIfError(iRepository->Get(KDbDefaultNapIndex, iDefaultNap));
+
+ iCustomProperties->TransLoadL();
+ SetClean();
+ iTreeSync = ETrue;
+ }
+
+void CBookmarkDb::TransRemoveL()
+ {
+ iDatabaseRepository->Delete(KVersionIndex);
+ iDatabaseRepository->Delete(KDbHomeIdIndex);
+ iDatabaseRepository->Delete(KDbHomeTextIndex);
+ iDatabaseRepository->Delete(KDbSearchUriIndex);
+ iDatabaseRepository->Delete(KDbDefaultProxyIndex);
+ iDatabaseRepository->Delete(KDbDefaultNapIndex);
+ iDatabaseRepository->Delete(KRepBkmrkPropertyStart);
+ iDatabaseRepository->Delete(KRepFldrPropertyStart);
+ iDatabaseRepository->Delete(KRepDbPropertyStart);
+ }
+
+TUint32 CBookmarkDb::IndexBase()
+ {
+ return KIndexBaseZero;
+ }
+
+void CBookmarkDb::SetIdFromIndexBase(TUint32 /*aIndexBase*/)
+ {
+ // the id and index base is always 0 so do nothing
+ }
+
+void CBookmarkDb::ResetAndDestroyBkmrkList ( TAny* aPtr )
+ {
+ TBkmrkList& bkList = *( TBkmrkList* )aPtr;
+
+ // Delete all items added. Otherwise these items will not get deleted and there will
+ // be a memory leak.
+ for ( TInt index = bkList.Count() - 1; index >= 0; --index )
+ {
+ delete bkList[ index ];
+ }
+ bkList.Reset ();
+ }
+
+void CBookmarkDb::CreateDefaultRepositoriesL ()
+ {
+ if ( !iBkmrkDbInitialized )
+ {
+ TransactionL ( ETransNew );
+ InitialiseRepL ( *iFolderRepository );
+ InitialiseRepL ( *iBookmarkRepository );
+ InitialiseRepL ( *iIconRepository );
+ iBkmrkDbInitialized = ETrue;
+ }
+ }
+
+TBool CBookmarkDb::HasDataInRepositoryL ()
+ {
+ if ( !iBkmrkDbInitialized )
+ {
+ const TUint32 KNullKey = 0x00000000;
+ RArray<TUint32> foundKeys;
+ CleanupClosePushL ( foundKeys );
+ iDatabaseRepository->FindL ( KNullKey, KNullKey, foundKeys );
+ if ( foundKeys.Count () > 0 )
+ {
+ // Repository has data.
+ iBkmrkDbInitialized = ETrue;
+ }
+ CleanupStack::PopAndDestroy (); // foundKeys
+ }
+ return iBkmrkDbInitialized;
+ }
+
+#ifndef EKA2
+GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
+ {
+ return(KErrNone);
+ }
+#endif // EKA2