phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactCopyPolicyManager.cpp
changeset 0 e686773b3f54
--- /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