--- /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);
+ }
+
+