applayerpluginsandutils/bookmarksupport/src/repository.cpp
changeset 0 b16258d2340f
--- /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);
+	}