diff -r 000000000000 -r e686773b3f54 phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactAttributeManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactAttributeManager.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,777 @@ +/* +* Copyright (c) 2005-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: An engine level attribute manager implementation that is +* constructed in CVPbkContactManager. +* Loads store level attribute managers as ECOM components. +* +*/ + + +#include "CVPbkContactAttributeManager.h" + +#include +#include +#include +#include +#include + +namespace { + +/** + * Null typelist. + */ +struct NullTypelist { }; + +/** + * Typelist. + */ +template +struct Typelist + { + typedef _Head Head; + typedef _Tail Tail; + }; + +/** + * Typelist indexing helper. + */ +template +struct NthInList + { + typedef typename NthInList< typename _List::Tail, _Index-1>::Ret Ret; + }; + +template +struct NthInList<_List, 0> + { + typedef typename _List::Head Ret; + }; + +/** + * TFunct2 + */ +template +NONSHARABLE_CLASS(TFunct2) + { + public: + typedef typename NthInList<_FuncParList, 0>::Ret Par1; + typedef typename NthInList<_FuncParList, 1>::Ret Par2; + TFunct2(_FPtrType aPtr, + Par1& aObjA, Par2& aObjB); + void operator()(_X* aCallee, _W& aValue); + protected: + _FPtrType iFuncPtr; + Par1& iPar1; + Par2& iPar2; + }; + + +/** + * TFunct2::TFunct2 + */ +template +TFunct2<_FPtrType, _FuncParList, _X, _W>::TFunct2( + _FPtrType aPtr, Par1& aObjA, Par2& aObjB) : + iFuncPtr(aPtr), iPar1(aObjA), iPar2(aObjB) + { + } + +/** + * TFunct2::operator() + */ +template +void TFunct2<_FPtrType, _FuncParList, _X, _W>::operator()( + _X* aCallee, _W& aValue) + { + aValue = (aCallee->*iFuncPtr)(iPar1, iPar2); + } + + +/** + * TFunct3 + */ +template +NONSHARABLE_CLASS(TFunct3) + { + public: + typedef typename NthInList<_FuncParList, 0>::Ret Par1; + typedef typename NthInList<_FuncParList, 1>::Ret Par2; + typedef typename NthInList<_FuncParList, 2>::Ret Par3; + TFunct3(_FPtrType aPtr, + Par1& aObjA, Par2& aObjB, Par3& aObjC); + void operator()(_X* aCallee, _W& aValue); + private: + _FPtrType iFuncPtr; + Par1& iPar1; + Par2& iPar2; + Par3& iPar3; + }; + + +/** + * TFunct3::TFunct3 + */ +template +TFunct3<_FPtrType, _FuncParList, _X, _W>::TFunct3( + _FPtrType aPtr, Par1& aObjA, Par2& aObjB, Par3& aObjC) : + iFuncPtr(aPtr), iPar1(aObjA), iPar2(aObjB), iPar3(aObjC) + { + } + +/** + * TFunct3::Call + */ +template +void TFunct3<_FPtrType, _FuncParList, _X, _W>::operator()( + _X* aCallee, _W& aValue) + { + aValue = (aCallee->*iFuncPtr)(iPar1, iPar2, iPar3); + } + + +/** + * Initialisation for TBool. + */ +inline void initialize(TBool& aPtr) + { + aPtr = EFalse; + } + +/** + * Initialisation for MVPbkContactOperationBase pointer. + */ +inline void initialize(MVPbkContactOperationBase*& aPtr) + { + aPtr = NULL; + } + +/** + * Initialisation for MVPbkStoreContactFieldCollection pointer. + */ +inline void initialize(MVPbkStoreContactFieldCollection*& aPtr) + { + aPtr = NULL; + } + +// --------------------------------------------------------------------------- +// ForEachPluginL +// --------------------------------------------------------------------------- +// +template +_A ForEachPluginL( + TArray aAttrPlugins, + _B aObj ) + { + _A result; + initialize(result); + + const TInt count = aAttrPlugins.Count(); + for (TInt i = 0; i < count && !result; ++i) + { + CVPbkContactAttributePlugin* plugin = aAttrPlugins[i]; + if (plugin) + { + aObj(plugin, result); + } + } + + return result; + } + +// --------------------------------------------------------------------------- +// CleanupResetAndDestroy +// --------------------------------------------------------------------------- +// +void CleanupResetAndDestroy( TAny* aObj ) + { + if (aObj) + { + static_cast(aObj)->ResetAndDestroy(); + } + } +} + + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::CVPbkContactAttributeManager +// --------------------------------------------------------------------------- +// +CVPbkContactAttributeManager::CVPbkContactAttributeManager( + CVPbkContactManager& aContactManager) : + iContactManager(aContactManager) + { + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::ConstructL +// --------------------------------------------------------------------------- +// +inline void CVPbkContactAttributeManager::ConstructL() + { + LoadAttributePluginsL(); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::NewL +// --------------------------------------------------------------------------- +// +CVPbkContactAttributeManager* CVPbkContactAttributeManager::NewL( + CVPbkContactManager& aContactManager ) + { + CVPbkContactAttributeManager* self = + new(ELeave) CVPbkContactAttributeManager( aContactManager ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::~CVPbkContactAttributeManager +// --------------------------------------------------------------------------- +// +CVPbkContactAttributeManager::~CVPbkContactAttributeManager() + { + iAttributePlugins.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::LoadAttributePluginsL +// --------------------------------------------------------------------------- +// +void CVPbkContactAttributeManager::LoadAttributePluginsL() + { + RImplInfoPtrArray implementations; + TEComResolverParams resolverParams; + + resolverParams.SetWildcardMatch(ETrue); + _LIT8(KVPbkAttributePlugin, KVPbkContactAttributePluginDataString); + resolverParams.SetDataType(KVPbkAttributePlugin); + + REComSession::ListImplementationsL( + TUid::Uid(KVPbkContactAttributePluginInterfaceUID), implementations); + CleanupStack::PushL(TCleanupItem(CleanupResetAndDestroy, &implementations)); + + CVPbkContactAttributePlugin::TParam param(iContactManager); + const TInt count = implementations.Count(); + for (TInt i = count-1; i >= 0; --i) + { + CImplementationInformation* implInfo = implementations[i]; + CleanupStack::PushL(implInfo); + implementations.Remove(i); + + CVPbkContactAttributePlugin* plugin = + CVPbkContactAttributePlugin::NewL(implInfo->ImplementationUid(), param); + CleanupStack::PushL(plugin); + iAttributePlugins.AppendL(plugin); + CleanupStack::Pop(plugin); + + CleanupStack::PopAndDestroy(implInfo); + } + CleanupStack::PopAndDestroy(); // implementations + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::ListContactsL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::ListContactsL( + TUid aAttributeType, + MVPbkContactFindObserver& aObserver) + { + CVPbkContactFindOperation* operation = CVPbkContactFindOperation::NewLC(aObserver); + + const TInt pluginCount(iAttributePlugins.Count()); + for (TInt i = 0; i < pluginCount; ++i) + { + CVPbkContactAttributePlugin* plugin = iAttributePlugins[i]; + MVPbkContactOperation* subOperation = NULL; + if (plugin && (plugin->AttributeType() == aAttributeType)) + { + subOperation = + plugin->CreateListContactsOperationL(aAttributeType, aObserver); + } + + if (subOperation) + { + CleanupDeletePushL(subOperation); + operation->AddSubOperationL(subOperation); + CleanupStack::Pop(); // subOperation + } + } + + if (operation->SubOperationCount() == 0) + { + CleanupStack::PopAndDestroy(operation); + operation = NULL; + } + + if (operation) + { + operation->StartL(); + CleanupStack::Pop(operation); + } + + return operation; + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::ListContactsL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::ListContactsL( + const MVPbkContactAttribute& aAttribute, + MVPbkContactFindObserver& aObserver) + { + CVPbkContactFindOperation* operation = CVPbkContactFindOperation::NewLC(aObserver); + + const TInt pluginCount(iAttributePlugins.Count()); + for (TInt i = 0; i < pluginCount; ++i) + { + CVPbkContactAttributePlugin* plugin = iAttributePlugins[i]; + MVPbkContactOperation* subOperation = NULL; + if (plugin && (plugin->AttributeType() == aAttribute.AttributeType())) + { + subOperation = + plugin->CreateListContactsOperationL(aAttribute, aObserver); + } + + if (subOperation) + { + CleanupDeletePushL(subOperation); + operation->AddSubOperationL(subOperation); + CleanupStack::Pop(); // subOperation + } + } + + if (operation->SubOperationCount() == 0) + { + CleanupStack::PopAndDestroy(operation); + operation = NULL; + } + + if (operation) + { + operation->StartL(); + CleanupStack::Pop(operation); + } + + return operation; + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::HasContactAttributeL +// --------------------------------------------------------------------------- +// +TBool CVPbkContactAttributeManager::HasContactAttributeL( + TUid aAttributeType, + const MVPbkStoreContact& aContact) const + { + typedef TBool (MVPbkContactAttributeManager::*FPtrType)(TUid, + const MVPbkStoreContact&) const; + FPtrType ptr = &MVPbkContactAttributeManager::HasContactAttributeL; + typedef Typelist > FuncParams; + TFunct2 + call(ptr, aAttributeType, aContact); + return ForEachPluginL(iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::HasContactAttributeL +// --------------------------------------------------------------------------- +// +TBool CVPbkContactAttributeManager::HasContactAttributeL( + const MVPbkContactAttribute& aAttribute, + const MVPbkStoreContact& aContact) const + { + typedef TBool (MVPbkContactAttributeManager::*FPtrType)( + const MVPbkContactAttribute&, + const MVPbkStoreContact&) const; + FPtrType ptr = &MVPbkContactAttributeManager::HasContactAttributeL; + typedef Typelist > FuncParams; + TFunct2 + call(ptr, aAttribute, aContact); + return ForEachPluginL(iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::HasFieldAttributeL +// --------------------------------------------------------------------------- +// +TBool CVPbkContactAttributeManager::HasFieldAttributeL( + TUid aAttributeType, + const MVPbkStoreContactField& aField) const + { + typedef TBool (MVPbkContactAttributeManager::*FPtrType)(TUid, + const MVPbkStoreContactField&) const; + FPtrType ptr = &MVPbkContactAttributeManager::HasFieldAttributeL; + typedef Typelist > FuncParams; + TFunct2 + call(ptr, aAttributeType, aField); + return ForEachPluginL(iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::HasFieldAttributeL +// --------------------------------------------------------------------------- +// +TBool CVPbkContactAttributeManager::HasFieldAttributeL( + const MVPbkContactAttribute& aAttribute, + const MVPbkStoreContactField& aField) const + { + typedef TBool (MVPbkContactAttributeManager::*FPtrType)( + const MVPbkContactAttribute&, + const MVPbkStoreContactField& ) const; + FPtrType ptr = &MVPbkContactAttributeManager::HasFieldAttributeL; + typedef Typelist > FuncParams; + TFunct2 + call(ptr, aAttribute, aField); + return ForEachPluginL(iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::SetContactAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::SetContactAttributeL( + const MVPbkContactLink& aContactLink, + const MVPbkContactAttribute& aAttribute, + MVPbkSetAttributeObserver& aObserver) + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + const MVPbkContactLink&, const MVPbkContactAttribute&, + MVPbkSetAttributeObserver&); + FPtrType ptr = &MVPbkContactAttributeManager::SetContactAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aContactLink, aAttribute, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::SetFieldAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::SetFieldAttributeL( + MVPbkStoreContactField& aField, + const MVPbkContactAttribute& aAttribute, + MVPbkSetAttributeObserver& aObserver) + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + MVPbkStoreContactField&, const MVPbkContactAttribute&, + MVPbkSetAttributeObserver&); + FPtrType ptr = &MVPbkContactAttributeManager::SetFieldAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aField, aAttribute, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::RemoveContactAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* + CVPbkContactAttributeManager::RemoveContactAttributeL( + const MVPbkContactLink& aContactLink, + const MVPbkContactAttribute& aAttribute, + MVPbkSetAttributeObserver& aObserver) + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + const MVPbkContactLink&, const MVPbkContactAttribute&, + MVPbkSetAttributeObserver&); + FPtrType ptr = &MVPbkContactAttributeManager::RemoveContactAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aContactLink, aAttribute, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::RemoveContactAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* + CVPbkContactAttributeManager::RemoveContactAttributeL( + const MVPbkContactLink& aContactLink, + TUid aAttributeType, + MVPbkSetAttributeObserver& aObserver ) + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + const MVPbkContactLink&, TUid, MVPbkSetAttributeObserver&); + FPtrType ptr = &MVPbkContactAttributeManager::RemoveContactAttributeL; + typedef Typelist > > FuncParams; + TFunct3 call( + ptr, aContactLink, aAttributeType, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::RemoveFieldAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* + CVPbkContactAttributeManager::RemoveFieldAttributeL( + MVPbkStoreContactField& aField, + const MVPbkContactAttribute& aAttribute, + MVPbkSetAttributeObserver& aObserver) + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + MVPbkStoreContactField&, const MVPbkContactAttribute&, + MVPbkSetAttributeObserver&); + FPtrType ptr = &MVPbkContactAttributeManager::RemoveFieldAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aField, aAttribute, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::RemoveFieldAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* + CVPbkContactAttributeManager::RemoveFieldAttributeL( + MVPbkStoreContactField& aField, + TUid aAttributeType, + MVPbkSetAttributeObserver& aObserver) + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + MVPbkStoreContactField&, TUid, MVPbkSetAttributeObserver&); + FPtrType ptr = &MVPbkContactAttributeManager::RemoveFieldAttributeL; + typedef Typelist > > FuncParams; + TFunct3 call( + ptr, aField, aAttributeType, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::FindFieldsWithAttributeLC +// --------------------------------------------------------------------------- +// +MVPbkStoreContactFieldCollection* + CVPbkContactAttributeManager::FindFieldsWithAttributeLC( + TUid aAttributeType, + MVPbkStoreContact& aContact) const + { + typedef MVPbkStoreContactFieldCollection* (MVPbkContactAttributeManager::*FPtrType)( + TUid, MVPbkStoreContact&) const; + FPtrType ptr = &MVPbkContactAttributeManager::FindFieldsWithAttributeLC; + typedef Typelist > FuncParams; + TFunct2 + call(ptr, aAttributeType, aContact); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::FindFieldsWithAttributeLC +// --------------------------------------------------------------------------- +// +MVPbkStoreContactFieldCollection* + CVPbkContactAttributeManager::FindFieldsWithAttributeLC( + const MVPbkContactAttribute& aAttribute, + MVPbkStoreContact& aContact) const + { + typedef MVPbkStoreContactFieldCollection* (MVPbkContactAttributeManager::*FPtrType)( + const MVPbkContactAttribute&, MVPbkStoreContact&) const; + FPtrType ptr = &MVPbkContactAttributeManager::FindFieldsWithAttributeLC; + typedef Typelist > FuncParams; + TFunct2 + call(ptr, aAttribute, aContact); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::FindFieldWithAttributeL +// --------------------------------------------------------------------------- +// +MVPbkStoreContactField* CVPbkContactAttributeManager::FindFieldWithAttributeL( + const MVPbkContactAttribute& aAttr, + MVPbkStoreContact& aContact ) const + { + MVPbkStoreContactFieldCollection& fields = aContact.Fields(); + const TInt count = fields.FieldCount(); + for ( TInt i = 0; i < count; ++i ) + { + MVPbkStoreContactField& field = fields.FieldAt( i ); + if ( HasFieldAttributeL( aAttr, field ) ) + { + return &field; + } + } + return NULL; + } + + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::HasContactAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::HasContactAttributeL( + TUid aAttributeType, + const MVPbkStoreContact& aContact, + MVPbkSingleAttributePresenceObserver& aObserver) const + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + TUid, const MVPbkStoreContact&, MVPbkSingleAttributePresenceObserver&) const; + FPtrType ptr = &MVPbkContactAttributeManager::HasContactAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aAttributeType, aContact, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::HasContactAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::HasContactAttributeL( + const MVPbkContactAttribute& aAttribute, + const MVPbkStoreContact& aContact, + MVPbkSingleAttributePresenceObserver& aObserver) const + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + const MVPbkContactAttribute&, const MVPbkStoreContact&, + MVPbkSingleAttributePresenceObserver&) const; + FPtrType ptr = &MVPbkContactAttributeManager::HasContactAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aAttribute, aContact, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::HasFieldAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::HasFieldAttributeL( + TUid aAttributeType, + const MVPbkStoreContactField& aField, + MVPbkSingleAttributePresenceObserver& aObserver) const + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + TUid, const MVPbkStoreContactField&, MVPbkSingleAttributePresenceObserver&) const; + FPtrType ptr = &MVPbkContactAttributeManager::HasFieldAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aAttributeType, aField, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::HasFieldAttributeL +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::HasFieldAttributeL( + const MVPbkContactAttribute& aAttribute, + const MVPbkStoreContactField& aField, + MVPbkSingleAttributePresenceObserver& aObserver) const + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + const MVPbkContactAttribute&, const MVPbkStoreContactField&, + MVPbkSingleAttributePresenceObserver&) const; + FPtrType ptr = &MVPbkContactAttributeManager::HasFieldAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aAttribute, aField, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::FindFieldsWithAttributeLC +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::FindFieldsWithAttributeL( + TUid aAttributeType, + MVPbkStoreContact& aContact, + MVPbkMultiAttributePresenceObserver& aObserver) const + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + TUid, MVPbkStoreContact&, + MVPbkMultiAttributePresenceObserver&) const; + FPtrType ptr = &MVPbkContactAttributeManager::FindFieldsWithAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aAttributeType, aContact, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// --------------------------------------------------------------------------- +// CVPbkContactAttributeManager::FindFieldsWithAttributeLC +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CVPbkContactAttributeManager::FindFieldsWithAttributeL( + const MVPbkContactAttribute& aAttribute, + MVPbkStoreContact& aContact, + MVPbkMultiAttributePresenceObserver& aObserver) const + { + typedef MVPbkContactOperationBase* (MVPbkContactAttributeManager::*FPtrType)( + const MVPbkContactAttribute&, MVPbkStoreContact&, + MVPbkMultiAttributePresenceObserver&) const; + FPtrType ptr = &MVPbkContactAttributeManager::FindFieldsWithAttributeL; + typedef Typelist > > FuncParams; + TFunct3 + call(ptr, aAttribute, aContact, aObserver); + return ForEachPluginL( + iAttributePlugins.Array(), call); + } + +// End of File