diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactCopyPolicyManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactCopyPolicyManager.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2002-2007 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: A class offers an API to find copy policy for different stores +* +*/ + + + +// INCLUDE FILES +#include + +#include +#include +#include +#include + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CleanupResetAndDestroy +// ----------------------------------------------------------------------------- +// +namespace + { + void CleanupResetAndDestroy(TAny* aObj) + { + if (aObj) + { + static_cast(aObj)->ResetAndDestroy(); + } + } + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CVPbkContactCopyPolicyManager::CVPbkContactCopyPolicyManager +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVPbkContactCopyPolicyManager::CVPbkContactCopyPolicyManager() + { + } + +// ----------------------------------------------------------------------------- +// CVPbkContactCopyPolicyManager::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVPbkContactCopyPolicyManager::ConstructL() + { + RImplInfoPtrArray implementations; + TEComResolverParams resolverParams; + + resolverParams.SetWildcardMatch(ETrue); + _LIT8(KPbkExtension, KVPbkCopyPolicyDataString); + resolverParams.SetDataType(KPbkExtension); + + REComSession::ListImplementationsL( + TUid::Uid(KVPbkCopyPolicyInterfaceUID), + resolverParams, KRomOnlyResolverUid, implementations); + + CleanupStack::PushL(TCleanupItem(CleanupResetAndDestroy, &implementations)); + + const TInt count = implementations.Count(); + for (TInt i = count-1; i >= 0; --i) + { + CImplementationInformation* implInfo = implementations[i]; + CleanupStack::PushL(implInfo); + implementations.Remove(i); + iImplementationInfoArray.AppendL(implInfo); + CleanupStack::Pop(implInfo); + } + CleanupStack::PopAndDestroy(); // implementations + } + +// ----------------------------------------------------------------------------- +// CVPbkContactCopyPolicyManager::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CVPbkContactCopyPolicyManager* CVPbkContactCopyPolicyManager::NewL() + { + CVPbkContactCopyPolicyManager* self = + new( ELeave ) CVPbkContactCopyPolicyManager; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// Destructor +CVPbkContactCopyPolicyManager::~CVPbkContactCopyPolicyManager() + { + iImplementationInfoArray.ResetAndDestroy(); + iPolicyArray.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CVPbkContactCopyPolicyManager::GetPolicyL +// ----------------------------------------------------------------------------- +// +EXPORT_C MVPbkContactCopyPolicy* CVPbkContactCopyPolicyManager::GetPolicyL( + CVPbkContactManager& aContactManager, + const TVPbkContactStoreUriPtr& aUri) + { + MVPbkContactCopyPolicy* policy = NULL; + CImplementationInformation* info = FindInfoL(aUri); + if (info) + { + TUid uid(info->ImplementationUid()); + policy = FindPolicy(uid); + if (!policy) + { + policy = LoadPolicyL(uid, aContactManager); + } + } + return policy; + } + +// ----------------------------------------------------------------------------- +// CVPbkContactCopyPolicyManager::FindInfoL +// ----------------------------------------------------------------------------- +// +CImplementationInformation* CVPbkContactCopyPolicyManager::FindInfoL( + const TVPbkContactStoreUriPtr& aUri) + { + CImplementationInformation* info = NULL; + const TPtrC domain = aUri.Component( + TVPbkContactStoreUriPtr::EContactStoreUriStoreType); + const TInt count = iImplementationInfoArray.Count(); + for (TInt i = 0; i < count && !info; ++i) + { + const TInt length = iImplementationInfoArray[i]->OpaqueData().Length(); + HBufC* opaqueBuf = HBufC::NewLC(length); + TPtr opaque = opaqueBuf->Des(); + opaque.Copy(iImplementationInfoArray[i]->OpaqueData()); + + if (opaque.CompareF(domain) == 0) + { + info = iImplementationInfoArray[i]; + } + CleanupStack::PopAndDestroy(opaqueBuf); + } + return info; + } + +// ----------------------------------------------------------------------------- +// CVPbkContactCopyPolicyManager::FindPolicy +// ----------------------------------------------------------------------------- +// +MVPbkContactCopyPolicy* CVPbkContactCopyPolicyManager::FindPolicy(TUid aUid) + { + const TInt count = iPolicyArray.Count(); + for (TInt i = 0; i < count; ++i) + { + if (iPolicyArray[i]->ImplementationUid() == aUid) + { + return iPolicyArray[i]; + } + } + return NULL; + } + +// ----------------------------------------------------------------------------- +// CVPbkContactCopyPolicyManager::LoadPolicyL +// ----------------------------------------------------------------------------- +// +MVPbkContactCopyPolicy* CVPbkContactCopyPolicyManager::LoadPolicyL(TUid aUid, + CVPbkContactManager& aContactManager) + { + CVPbkContactCopyPolicy::TParam param(aContactManager); + CVPbkContactCopyPolicy* policy = CVPbkContactCopyPolicy::NewL(aUid, param); + CleanupStack::PushL(policy); + iPolicyArray.AppendL(policy); + CleanupStack::Pop(policy); + return policy; + } +// End of File