applayerpluginsandutils/bookmarksupport/src/propertylist.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/bookmarksupport/src/propertylist.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,393 @@
+// 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:
+// Class for managing custom property lists
+// @internalComponent
+// 
+//
+
+#include "propertylist.h"
+#include "repository.h"
+
+CPropertyList* CPropertyList::NewL(CRepository& iRepository, CPropertyReg& aPropertyRegister, CPropertyReg::TPropertyGroup aGroup, TUint32 aIndexBase)
+	{
+	CPropertyList* self = new (ELeave) CPropertyList(iRepository, aPropertyRegister, aGroup, aIndexBase);
+	return self;
+	}
+
+CPropertyList::CPropertyList(CRepository& iRepository, CPropertyReg& aPropertyRegister, CPropertyReg::TPropertyGroup aGroup, TUint32 aIndexBase)
+	: CRepositoryAccessor(), iPropertyRegister(aPropertyRegister), iGroup(aGroup), iIndexBase(aIndexBase)
+	{
+	SetRepository(iRepository);
+	}
+
+CPropertyList::~CPropertyList()
+	{
+	Reset();
+	}
+
+void CPropertyList::Reset()
+	{
+	TInt index = iPropertyValues.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		delete iPropertyValues[index];
+		}
+	iPropertyValues.Reset();
+	}
+	
+TInt CPropertyList::PropertyIndex(TUid aPropertyId, Bookmark::TPropertyType aType) const
+	{
+	TInt index = iPropertyRegister.PropertyIndex(iGroup, aPropertyId, aType);
+	TInt count = iPropertyValues.Count();
+	if (index == KErrNotFound || index >= count || !iPropertyValues[index])
+		{
+		index = KErrNotFound;
+		}
+		
+	return index;
+	}
+
+TInt CPropertyList::GetCustomProperty(TUid aPropertyId, TInt& aValue) const
+	{
+	TInt index = PropertyIndex(aPropertyId, Bookmark::EDataTypeInt);
+	if (index == KErrNotFound)
+		{
+		return KErrNotFound;
+		}
+
+	TInt* intPtr = static_cast<TInt*>(iPropertyValues[index]);
+	aValue = *intPtr;
+	return KErrNone;
+	}
+
+TInt CPropertyList::GetCustomProperty(TUid aPropertyId, TReal& aValue) const
+	{
+	TInt index = PropertyIndex(aPropertyId, Bookmark::EDataTypeReal);
+	if (index == KErrNotFound)
+		{
+		return KErrNotFound;
+		}
+
+	TReal* realPtr = static_cast<TReal*>(iPropertyValues[index]);
+	aValue = *realPtr;
+	return KErrNone;
+	}
+
+TInt CPropertyList::GetCustomProperty(TUid aPropertyId, TDes& aValue) const
+	{
+	TInt index = PropertyIndex(aPropertyId, Bookmark::EDataTypeDes16);
+	if (index == KErrNotFound)
+		{
+		return KErrNotFound;
+		}
+
+	TDes* descPtr = static_cast<TDes*>(iPropertyValues[index]);
+	if (aValue.MaxLength() < descPtr->Length())
+		{
+		return KErrArgument;
+		}
+	aValue = *descPtr;
+	return KErrNone;
+	}
+	
+TInt CPropertyList::GetCustomProperty(TUid aPropertyId, TDes8& aValue) const
+	{
+	TInt index = PropertyIndex(aPropertyId, Bookmark::EDataTypeDes8);
+	if (index == KErrNotFound)
+		{
+		return KErrNotFound;
+		}
+
+	TDes8* desc8Ptr = static_cast<TDes8*>(iPropertyValues[index]);
+	if (aValue.MaxLength() < desc8Ptr->Length())
+		{
+		return KErrArgument;
+		}
+	aValue = *desc8Ptr;
+	return KErrNone;
+	}
+	
+void CPropertyList::SetCustomPropertyL(TUid aPropertyId, TInt aValue)
+	{
+	TInt index = iPropertyRegister.PropertyIndex(iGroup, aPropertyId, Bookmark::EDataTypeInt);
+	if (index == KErrNotFound)
+		{
+		User::Leave(Bookmark::KErrNotRegistered);
+		}
+	UpdateValueListItemL(index, Bookmark::EDataTypeInt, &aValue);
+	SetDirty();
+	}
+
+void CPropertyList::SetCustomPropertyL(TUid aPropertyId, TReal aValue)
+	{
+	TInt index = iPropertyRegister.PropertyIndex(iGroup, aPropertyId, Bookmark::EDataTypeReal);
+	if (index == KErrNotFound)
+		{
+		User::Leave(Bookmark::KErrNotRegistered);
+		}
+	UpdateValueListItemL(index, Bookmark::EDataTypeReal, &aValue);
+	SetDirty();
+	}
+
+void CPropertyList::SetCustomPropertyL(TUid aPropertyId, const TDesC& aValue)
+	{
+	// The aValue must be smaller that the maximim descriptor storage size
+	__ASSERT_ALWAYS(aValue.Length() <= Bookmark::KMaxDescriptorLength, User::Panic(Bookmark::KBookmarkErrTooLong, KErrArgument));
+
+	TInt index = iPropertyRegister.PropertyIndex(iGroup, aPropertyId, Bookmark::EDataTypeDes16);
+	if (index == KErrNotFound)
+		{
+		User::Leave(Bookmark::KErrNotRegistered);
+		}
+	UpdateValueListItemL(index, Bookmark::EDataTypeDes16, &aValue);
+	SetDirty();
+	}
+
+void CPropertyList::SetCustomPropertyL(TUid aPropertyId, const TDesC8& aValue)
+	{
+	// The aValue must be smaller that the maximim data storage size
+	__ASSERT_ALWAYS(aValue.Length() <= Bookmark::KMaxDataLength, User::Panic(Bookmark::KBookmarkErrTooLong, KErrArgument));
+
+	TInt index = iPropertyRegister.PropertyIndex(iGroup, aPropertyId, Bookmark::EDataTypeDes8);
+	if (index == KErrNotFound)
+		{
+		User::Leave(Bookmark::KErrNotRegistered);
+		}
+	UpdateValueListItemL(index, Bookmark::EDataTypeDes8, &aValue);
+	SetDirty();
+	}
+
+void CPropertyList::UpdateValueListItemL(TInt aIndex, Bookmark::TPropertyType aType, const TAny* aValue)
+	{
+	TInt lastIndex = iPropertyValues.Count() - 1;
+	if (aIndex > lastIndex)
+		{
+		// create Null values in the property list.
+		for (; lastIndex < aIndex; ++lastIndex)
+			{
+			iPropertyValues.AppendL(NULL);
+			}
+		}
+		
+	//Delete any previously allocated memory
+	delete iPropertyValues[aIndex];
+	iPropertyValues[aIndex] = NULL;	
+
+	switch (aType)
+		{
+		case Bookmark::EDataTypeInt:
+			{
+			const TInt* intPtr = static_cast<const TInt*>(aValue);
+			TInt* newInt = new (ELeave) TInt;
+			*newInt = *intPtr;
+			iPropertyValues[aIndex] = newInt;
+			break;
+			}
+		case Bookmark::EDataTypeReal:
+			{
+			const TReal* realPtr = static_cast<const TReal*>(aValue);
+			TReal* newReal = new (ELeave) TReal;
+			*newReal = *realPtr;
+			iPropertyValues[aIndex] = newReal;
+			break;
+			}
+		case Bookmark::EDataTypeDes16:
+			{
+			const TDes* buffer16 = static_cast<const TDes*>(aValue);
+			iPropertyValues[aIndex] = buffer16->AllocL();
+			break;
+			}
+		case Bookmark::EDataTypeDes8:
+			{
+			const TDes8* buffer8 = static_cast<const TDes8*>(aValue);
+			iPropertyValues[aIndex] = buffer8->AllocL();
+			break;
+			}
+		default:
+			// Should not get to here
+			User::Leave(Bookmark::KErrCorrupt);
+			break;
+		}
+	}
+
+void CPropertyList::TransNewL()
+	{
+	TransSaveL();
+	}
+
+void CPropertyList::TransSaveL()
+	{
+	RArray<TUint32> entryList;
+	TBool creating;
+	TInt* intPtr = NULL;
+	TReal* realPtr = NULL;
+	TDesC* desc16Ptr = NULL;
+	TDesC8* desc8Ptr = NULL;
+	TInt index;
+	Bookmark::TPropertyType type;
+	
+	for (index = iPropertyValues.Count() - 1; index >= 0; --index)
+		{
+		if (iPropertyValues[index])
+			{
+			if (iPropertyRegister.GetPropertyType(iGroup, index, type) != KErrNone)
+				{
+				User::Leave(Bookmark::KErrNotRegistered);
+				}
+				
+			// if the index does not yet exist in the database we need to create it.
+			creating = EFalse;
+			if (KErrNotFound == iRepository->FindL(iIndexBase + index, KRepExactMask, entryList))
+				{
+				creating = ETrue;
+				}
+			entryList.Reset();
+				
+			switch (type)
+				{
+			case Bookmark::EDataTypeInt:
+				intPtr = static_cast<TInt*>(iPropertyValues[index]);
+				if (creating)
+					{
+					iRepository->Create(iIndexBase + index, *intPtr);
+					}
+				else
+					{
+					iRepository->Set(iIndexBase + index, *intPtr);
+					}
+				break;
+			case Bookmark::EDataTypeReal:
+				realPtr = static_cast<TReal*>(iPropertyValues[index]);
+				if (creating)
+					{
+					iRepository->Create(iIndexBase + index, *realPtr);
+					}
+				else
+					{
+					iRepository->Set(iIndexBase + index, *realPtr);
+					}
+				break;
+			case Bookmark::EDataTypeDes16:
+				desc16Ptr = static_cast<TDes*>(iPropertyValues[index]);
+				if (creating)
+					{
+					iRepository->Create(iIndexBase + index, *desc16Ptr);
+					}
+				else
+					{
+					iRepository->Set(iIndexBase + index, *desc16Ptr);
+					}
+				break;
+			case Bookmark::EDataTypeDes8:
+				desc8Ptr = static_cast<TDes8*>(iPropertyValues[index]);
+				if (creating)
+					{
+					iRepository->Create(iIndexBase + index, *desc8Ptr);
+					}
+				else
+					{
+					iRepository->Set(iIndexBase + index, *desc8Ptr);
+					}
+				break;
+			default:
+				// Should not get to here
+				User::Leave(Bookmark::KErrCorrupt);
+				break;
+				}
+			}
+		}
+	}
+
+void CPropertyList::TransLoadL()
+	{
+	RArray<TUint32> entryList;
+	CleanupClosePushL ( entryList );
+	iRepository->FindL(iIndexBase, KCusPropertyMask, entryList);
+
+	TInt intValue = 0;
+	TReal realValue = 0.0;
+	HBufC* desc16Buffer = HBufC::NewLC(Bookmark::KMaxDescriptorLength);
+	TPtr desc16Ptr = desc16Buffer->Des();
+	HBufC8* desc8Buffer = HBufC8::NewLC(Bookmark::KMaxDataLength);
+	TPtr8 desc8Ptr = desc8Buffer->Des();
+
+	TInt valueIndex = 0;
+	TInt index = 0;
+	Bookmark::TPropertyType type;
+
+	TInt count = entryList.Count();
+	for (;index < count; ++index)
+		{
+		valueIndex = entryList[index] - iIndexBase;
+		if (iPropertyRegister.GetPropertyType(iGroup, valueIndex, type) != KErrNone)
+			{
+			// remove redundant entries
+			User::LeaveIfError(iRepository->Delete(entryList[index]));
+			}
+		else
+			{
+			switch (type)
+				{
+			case Bookmark::EDataTypeInt:
+				User::LeaveIfError(iRepository->Get(entryList[index], intValue));
+				UpdateValueListItemL(valueIndex, type, &intValue);
+				break;
+			case Bookmark::EDataTypeReal:
+				User::LeaveIfError(iRepository->Get(entryList[index], realValue));
+				UpdateValueListItemL(valueIndex, type, &realValue);
+				break;
+			case Bookmark::EDataTypeDes16:
+				User::LeaveIfError(iRepository->Get(entryList[index], desc16Ptr));
+				UpdateValueListItemL(valueIndex, type, &desc16Ptr);
+				break;
+			case Bookmark::EDataTypeDes8:
+				User::LeaveIfError(iRepository->Get(entryList[index], desc8Ptr));
+				UpdateValueListItemL(valueIndex, type, &desc8Ptr);
+				break;
+			default:
+				// Should not get to here
+				User::Leave(Bookmark::KErrCorrupt);
+				break;
+				}
+			}
+		}	
+	
+	CleanupStack::PopAndDestroy(desc8Buffer);
+	CleanupStack::PopAndDestroy(desc16Buffer);
+	CleanupStack::PopAndDestroy ( &entryList );
+	
+	SetClean();
+	}
+	
+void CPropertyList::TransRemoveL()
+	{
+	TInt index = iPropertyValues.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		if (iPropertyValues[index])
+			{
+			iRepository->Delete(iIndexBase + index);
+			}
+		}
+	}
+
+TUint32 CPropertyList::IndexBase()
+	{
+	return iIndexBase;
+	}
+
+void CPropertyList::SetIdFromIndexBase(TUint32 aIndexBase)
+	{
+	iIndexBase = aIndexBase;
+	}