diff -r 000000000000 -r b16258d2340f applayerpluginsandutils/bookmarksupport/src/propertyreg.cpp --- /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 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); + } + +