--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactCopyPolicyManager.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -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 <CVPbkContactCopyPolicyManager.h>
+
+#include <CVPbkContactCopyPolicy.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <VPbkPolicyUid.h>
+#include <ecom/ecom.h>
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CleanupResetAndDestroy
+// -----------------------------------------------------------------------------
+//
+namespace
+ {
+ void CleanupResetAndDestroy(TAny* aObj)
+ {
+ if (aObj)
+ {
+ static_cast<RImplInfoPtrArray*>(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