--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/bookmarksupport/src/repository.cpp Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,129 @@
+// 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 the repository access base class.
+// @internalComponent
+//
+//
+
+#include "repository.h"
+
+CRepositoryAccessor::CRepositoryAccessor()
+ : iStatus(EStatusCreating)
+ {
+ }
+
+void CRepositoryAccessor::SetRepository(CRepository& aRepository)
+ {
+ iRepository = &aRepository;
+ }
+
+void CRepositoryAccessor::CommitL()
+ {
+ TUint32 indexBase = IndexBase();
+
+ switch (iStatus)
+ {
+ case EStatusCreating:
+ TransactionL(ETransNew);
+ break;
+ case EStatusDirty:
+ TransactionL(ETransSave);
+ break;
+ case EStatusDeleted:
+ TransactionL(ETransRemove);
+ break;
+ case EStatusClean:
+ default:
+ // Do nothing
+ break;
+ }
+ iStatus = EStatusClean;
+ }
+
+void CRepositoryAccessor::SetClean()
+ {
+ iStatus = EStatusClean;
+ }
+
+void CRepositoryAccessor::SetDirty()
+ {
+ if (iStatus == EStatusClean)
+ {
+ iStatus = EStatusDirty;
+ }
+ }
+
+void CRepositoryAccessor::DeleteL()
+ {
+ iStatus = EStatusDeleted;
+ }
+
+Bookmark::TItemId CRepositoryAccessor::NextIndexL()
+ {
+ TInt nextIndex = 0;
+ User::LeaveIfError(iRepository->Get(KRepNextIndex, nextIndex));
+ if (nextIndex > Bookmark::KMaxBookmarkEntries)
+ {
+ User::Leave(Bookmark::KErrNoMoreSpace);
+ }
+
+ Bookmark::TItemId id = nextIndex;
+ ++nextIndex;
+ User::LeaveIfError(iRepository->Set(KRepNextIndex, nextIndex));
+
+ return id;
+ }
+
+void CRepositoryAccessor::TransactionL(TTransType aTransType)
+ {
+ // Loads are not performed in transactions. This is because property entries
+ // need to be filled as they go along. The alternative would be to fill some type of
+ // dynamic array and that pass this to a second method that will fill in the objects data members.
+ if (aTransType == ETransLoad)
+ {
+ TransLoadL();
+ return;
+ }
+
+ TUint32 failedIndex;
+ // start a transaction
+ TInt result = KErrLocked;
+ do
+ {
+ iRepository->StartTransaction(CRepository::EConcurrentReadWriteTransaction);
+ iRepository->CleanupCancelTransactionPushL();
+
+ switch(aTransType)
+ {
+ case ETransNew:
+ TransNewL();
+ break;
+ case ETransSave:
+ TransSaveL();
+ break;
+ case ETransRemove:
+ TransRemoveL();
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+
+ // commit the transaction
+ result = iRepository->CommitTransaction(failedIndex);
+ CleanupStack::PopAndDestroy();
+ } while (result == KErrLocked);
+
+ User::LeaveIfError(result);
+ }