applayerpluginsandutils/bookmarksupport/src/propertyreg.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/bookmarksupport/src/propertyreg.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,302 @@
+// 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:
+// Classes for registering custom properties.
+// @internalComponent
+// 
+//
+
+#include "propertyreg.h"
+
+CPropertyReg* CPropertyReg::NewL()
+	{
+	CPropertyReg* self = new (ELeave) CPropertyReg();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+CPropertyReg::CPropertyReg()
+	{
+	}
+
+CPropertyReg::~CPropertyReg()
+	{
+	Reset();
+	delete iDatabaseRepository;
+	}
+	
+void CPropertyReg::Reset()
+	{
+	TInt index = iDatabaseProperties.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		delete iDatabaseProperties[index];
+		}
+	iDatabaseProperties.Reset();
+	
+	index = iFolderProperties.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		delete iFolderProperties[index];
+		}
+	iFolderProperties.Reset();
+	
+	index = iBookmarkProperties.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		delete iBookmarkProperties[index];
+		}
+	iBookmarkProperties.Reset();
+
+	index = iDeletedList.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		delete iDeletedList[index];
+		}
+	iDeletedList.Reset();
+	}
+	
+void CPropertyReg::ConstructL()
+	{
+	iDatabaseRepository = CRepository::NewL(KUidBookmarkDatabaseRepository);
+	LoadPropertiesL();
+	}
+	
+void CPropertyReg::RefreshL()
+	{
+	Reset();
+	LoadPropertiesL();
+	}
+	
+void CPropertyReg::CommitL()
+	{
+	TInt index = iDatabaseProperties.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		if (iDatabaseProperties[index])
+			{
+			iDatabaseProperties[index]->CommitL();
+			}
+		}
+		
+	index = iFolderProperties.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		if (iFolderProperties[index])
+			{
+			iFolderProperties[index]->CommitL();
+			}
+		}
+		
+	index = iBookmarkProperties.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		if (iBookmarkProperties[index])
+			{
+			iBookmarkProperties[index]->CommitL();
+			}
+		}
+		
+	index = iDeletedList.Count() - 1;
+	for (;index >= 0; --index)
+		{
+		iDeletedList[index]->CommitL();
+		delete iDeletedList[index];
+		}
+	iDeletedList.Reset();
+	}
+
+TUint32 CPropertyReg::AssignIdL(TPropertyGroup aGroup)
+	{
+	TUint32 nextEntryId = 0;
+	switch(aGroup)
+		{
+	case EGroupDatabase:
+		nextEntryId = KRepDbPropertyStart;
+		break;
+	case EGroupFolder:
+		nextEntryId = KRepFldrPropertyStart;
+		break;
+	case EGroupBookmark:
+		nextEntryId = KRepBkmrkPropertyStart;
+		break;
+	default:
+		// not a TPropertyGroup value so should not get to here
+		User::Invariant();	
+		break;
+		}
+		
+	TInt nextIndex = 0;
+	User::LeaveIfError(iDatabaseRepository->Get(nextEntryId, nextIndex));
+		if (nextIndex >= Bookmark::KMaxCustomProperties)
+		{
+		User::Leave(Bookmark::KErrNoMoreSpace);
+		}
+	
+	// The repository index for this property will be the property type start position
+	// plus 1 plus the newly assigned index value. The plus one is because the the start
+	// position index holds the next index that can be assigned.
+	TUint32 entryIndex = (nextEntryId + 1) + nextIndex;
+	++nextIndex;
+	User::LeaveIfError(iDatabaseRepository->Set(nextEntryId, nextIndex));
+	
+	return entryIndex;
+	}
+
+void CPropertyReg::RegisterPropertyL(TPropertyGroup aGroup, TUid aCustomId, Bookmark::TPropertyType aDataType)
+	{
+	TPropertyList& list = List(aGroup);
+	if (FindProperty(list, aCustomId) != KErrNotFound)
+		{
+		User::Leave(Bookmark::KErrUidAlreadyUsed);
+		}
+
+	CCustomProperty* property = CCustomProperty::NewL(*iDatabaseRepository);
+	CleanupStack::PushL(property);
+	TUint32 newEntryId = AssignIdL(aGroup);		
+	property->SetIdFromIndexBase(newEntryId);
+	property->SetUid(aCustomId);
+	property->SetType(aDataType);
+	list.AppendL(property);
+	CleanupStack::Pop(property);
+	}
+
+TInt CPropertyReg::DeregisterPropertyL(TPropertyGroup aGroup, TUid aCustomId)
+	{
+	TPropertyList& list = List(aGroup);
+	TInt index = FindProperty(list, aCustomId);
+	if (index == KErrNotFound)
+		{
+		return KErrNotFound;
+		}
+	
+	list[index]->DeleteL();
+	iDeletedList.AppendL(list[index]);
+	list.Remove(index);
+	
+	return KErrNone;
+	}
+
+TInt CPropertyReg::PropertyIndex(TPropertyGroup aGroup, TUid aPropertyId, Bookmark::TPropertyType aType)
+	{
+	TPropertyList& list = List(aGroup);
+	TInt index = FindProperty(list, aPropertyId);
+	if (index != KErrNotFound)
+		{
+		if (list[index]->Type() != aType)
+			{
+			index = KErrNotFound;
+			}
+		}
+	return index;
+	}
+
+TInt CPropertyReg::GetPropertyType(TPropertyGroup aGroup, TInt aPropertyIndex, Bookmark::TPropertyType& aType)
+	{
+	TInt error = KErrNone;
+	TPropertyList& list = List(aGroup);
+	if (aPropertyIndex >= list.Count() || !list[aPropertyIndex])
+		{
+		error = Bookmark::KErrNotRegistered;
+		}
+	else
+		{
+		aType = list[aPropertyIndex]->Type();
+		}
+		
+	return error;
+	}
+	
+TInt CPropertyReg::FindProperty(TPropertyList& aList, TUid aPropertyId)
+	{
+	TInt index = aList.Count() -1;
+	for (;index >= 0; --index)
+		{
+		if (aList[index] && aList[index]->Uid() == aPropertyId)
+			{
+			break;
+			}
+		}
+		
+	return index;
+	}
+	
+TPropertyList& CPropertyReg::List(TPropertyGroup aGroup)
+	{
+	TPropertyList* list = NULL;
+
+	switch(aGroup)
+		{
+	case EGroupDatabase:
+		list = &iDatabaseProperties;
+		break;
+	case EGroupFolder:
+		list = &iFolderProperties;
+		break;
+	case EGroupBookmark:
+		list = &iBookmarkProperties;
+		break;
+	default:
+		// not a TPropertyGroup value so should not get to here
+		User::Invariant();	
+		break;
+		}
+		
+	return *list;
+	}
+
+
+void CPropertyReg::LoadPropertyListL(TPropertyList& aList, TUint32 aPropertyStart)
+	{
+	RArray<TUint32> entryList;
+	CleanupClosePushL(entryList);
+	iDatabaseRepository->FindL(aPropertyStart, KRepPropertyMask, entryList);	
+	
+	TInt count = 0;
+	iDatabaseRepository->Get(aPropertyStart, count);
+	count++;
+	
+	CCustomProperty* newProperty;
+	
+	TInt listEntry = 1;
+	for (TInt index = 1; index < count; ++index)
+		{
+		if (entryList.Count() > 1 && entryList[listEntry] == aPropertyStart + index)
+			{
+			newProperty = CCustomProperty::NewL(*iDatabaseRepository);
+			CleanupStack::PushL(newProperty);
+			newProperty->SetIdFromIndexBase(entryList[listEntry]);
+			newProperty->TransactionL(CRepositoryAccessor::ETransLoad);
+			aList.AppendL(newProperty);
+			CleanupStack::Pop(newProperty);
+			listEntry++;
+			}
+		else
+			{
+			aList.AppendL(NULL);
+			}
+		}
+	CleanupStack::PopAndDestroy(&entryList);
+	}
+
+
+void CPropertyReg::LoadPropertiesL()
+	{
+	LoadPropertyListL(iDatabaseProperties, KRepDbPropertyStart);
+	LoadPropertyListL(iFolderProperties, KRepFldrPropertyStart);
+	LoadPropertyListL(iBookmarkProperties, KRepBkmrkPropertyStart);
+	}
+
+