--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkEng/src/TVPbkStoreContactAnalyzer.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,369 @@
+/*
+* 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: VPbk store contact analyzer.
+*
+*/
+
+
+#include "TVPbkStoreContactAnalyzer.h"
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <CVPbkFieldTypeSelector.h>
+#include <MVPbkStoreContactFieldCollection.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactStoreProperties.h>
+#include <VPbkUtils.h>
+
+// System includes
+#include <barsread.h>
+#include <coemain.h>
+
+// non-class function declarations
+template<typename T> TInt t_HasFieldL( T aSelector,
+ TInt aStartIndex,
+ const MVPbkStoreContact* aContact,
+ const MVPbkStoreContact* aClassContact,
+ const CVPbkContactManager& aClassContactManager );
+
+template<typename T> TBool t_IsFieldTypeSupportedL( T aSelector,
+ const MVPbkStoreContact* aContact,
+ const MVPbkStoreContact* aClassContact,
+ const CVPbkContactManager& aClassContactManager );
+
+template<typename T> TBool t_IsFieldTypeIncludedL(
+ const MVPbkFieldType& aFieldType,
+ T aSelector,
+ const CVPbkContactManager& aClassContactManager );
+
+template<typename T> TBool t_IsFieldTypeIncludedL(
+ const MVPbkBaseContactField& aField,
+ T aSelector,
+ const CVPbkContactManager& aClassContactManager );
+
+CVPbkFieldTypeSelector* CreateSelectorLC(
+ VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector aType,
+ const CVPbkContactManager& aContactManager );
+
+CVPbkFieldTypeSelector* CreateSelectorLC(
+ VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aType,
+ const CVPbkContactManager& aContactManager );
+
+TBool IsFieldTypeIncluded
+ ( const MVPbkFieldTypeList& aFieldTypes,
+ const MVPbkFieldTypeSelector& aFieldTypeSelector );
+
+TInt IsFieldIncluded
+ (const MVPbkBaseContactFieldCollection& aFields,
+ TInt aStartIndex,
+ const MVPbkContactFieldSelector& aFieldTypeSelector);
+
+
+// --------------------------------------------------------------------------
+// TVPbkStoreContactAnalyzer::TVPbkStoreContactAnalyzer
+// --------------------------------------------------------------------------
+//
+EXPORT_C TVPbkStoreContactAnalyzer::TVPbkStoreContactAnalyzer
+ ( const CVPbkContactManager& aContactManager,
+ const MVPbkStoreContact* aContact ) :
+ iContactManager( aContactManager ),
+ iContact( aContact )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// TVPbkStoreContactAnalyzer::HasFieldL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt TVPbkStoreContactAnalyzer::HasFieldL
+ ( VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector aFieldTypeSelector,
+ TInt aStartIndex/* = 0*/,
+ const MVPbkStoreContact* aContact/* = NULL*/ ) const
+ {
+ return t_HasFieldL<VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector>
+ (aFieldTypeSelector,aStartIndex,aContact,
+ iContact, iContactManager);
+ }
+
+// --------------------------------------------------------------------------
+// TVPbkStoreContactAnalyzer::HasFieldL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt TVPbkStoreContactAnalyzer::HasFieldL
+ ( VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionTypeSelector,
+ TInt aStartIndex/* = 0*/,
+ const MVPbkStoreContact* aContact/* = NULL*/ ) const
+ {
+ return t_HasFieldL<VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector>
+ (aActionTypeSelector,aStartIndex,aContact,
+ iContact, iContactManager);
+ }
+
+// --------------------------------------------------------------------------
+// TVPbkStoreContactAnalyzer::IsFieldTypeSupportedL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool TVPbkStoreContactAnalyzer::IsFieldTypeSupportedL
+ ( VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector aFieldTypeSelector,
+ const MVPbkStoreContact* aContact /*= NULL*/ ) const
+ {
+ return t_IsFieldTypeSupportedL<VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector>
+ ( aFieldTypeSelector, aContact, iContact, iContactManager);
+ }
+
+// --------------------------------------------------------------------------
+// TVPbkStoreContactAnalyzer::IsFieldTypeSupportedL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool TVPbkStoreContactAnalyzer::IsFieldTypeSupportedL
+ ( VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionTypeSelector,
+ const MVPbkStoreContact* aContact /*= NULL*/ ) const
+ {
+ return t_IsFieldTypeSupportedL<VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector>
+ ( aActionTypeSelector, aContact, iContact, iContactManager);
+ }
+
+// --------------------------------------------------------------------------
+// TVPbkStoreContactAnalyzer::IsFieldTypeIncludedL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool TVPbkStoreContactAnalyzer::IsFieldTypeIncludedL
+ ( const MVPbkFieldType& aFieldType,
+ VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector aFieldTypeSelector ) const
+ {
+ return t_IsFieldTypeIncludedL<VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector>
+ ( aFieldType, aFieldTypeSelector, iContactManager );
+ }
+
+// --------------------------------------------------------------------------
+// TVPbkStoreContactAnalyzer::IsFieldTypeIncludedL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool TVPbkStoreContactAnalyzer::IsFieldTypeIncludedL
+ ( const MVPbkFieldType& aFieldType,
+ VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionTypeSelector ) const
+ {
+ return t_IsFieldTypeIncludedL<VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector>
+ ( aFieldType, aActionTypeSelector, iContactManager );
+ }
+
+// --------------------------------------------------------------------------
+// TVPbkStoreContactAnalyzer::IsFieldTypeIncludedL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool TVPbkStoreContactAnalyzer::IsFieldTypeIncludedL
+ ( const MVPbkBaseContactField& aField,
+ VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector aFieldTypeSelector ) const
+ {
+ return t_IsFieldTypeIncludedL<VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector>
+ ( aField, aFieldTypeSelector, iContactManager );
+ }
+
+// --------------------------------------------------------------------------
+// TVPbkStoreContactAnalyzer::IsFieldTypeIncludedL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool TVPbkStoreContactAnalyzer::IsFieldTypeIncludedL
+ ( const MVPbkBaseContactField& aField,
+ VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionTypeSelector ) const
+ {
+ return t_IsFieldTypeIncludedL<VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector>
+ ( aField, aActionTypeSelector, iContactManager );
+ }
+
+// --------------------------------------------------------------------------
+// t_HasFieldL
+// --------------------------------------------------------------------------
+//
+template<class T> TInt t_HasFieldL( T aSelector, TInt aStartIndex,
+ const MVPbkStoreContact* aContact,
+ const MVPbkStoreContact* aClassContact,
+ const CVPbkContactManager& aClassContactManager )
+ {
+ TInt ret = KErrNotFound;
+ const MVPbkStoreContact* tempContact = aClassContact;
+
+ if ( aContact )
+ {
+ tempContact = aContact;
+ }
+
+ // Check that there is contact to analyze
+ if ( tempContact )
+ {
+ // Read the contact field selector from resource
+ MVPbkContactFieldSelector* fieldTypeSelector =
+ static_cast<MVPbkContactFieldSelector*>
+ ( CreateSelectorLC( aSelector, aClassContactManager ) );
+
+ // Check if the specified field is included to contact
+ const MVPbkStoreContactFieldCollection& fields =
+ tempContact->Fields();
+ ret = IsFieldIncluded( fields, aStartIndex, *fieldTypeSelector );
+ CleanupStack::PopAndDestroy( ); // fieldTypeSelector;
+ }
+
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// t_IsFieldTypeSupportedL
+// --------------------------------------------------------------------------
+//
+template<class T> TBool t_IsFieldTypeSupportedL( T aSelector,
+ const MVPbkStoreContact* aContact,
+ const MVPbkStoreContact* aClassContact,
+ const CVPbkContactManager& aClassContactManager )
+ {
+ TBool ret = EFalse;
+ const MVPbkStoreContact* tempContact = aClassContact;
+
+ if (aContact)
+ {
+ tempContact = aContact;
+ }
+
+ // Check that there is contact to analyze
+ if ( tempContact )
+ {
+ // Read the field type selector from resource
+ MVPbkFieldTypeSelector* fieldTypeSelector =
+ static_cast<MVPbkFieldTypeSelector*>
+ ( CreateSelectorLC( aSelector, aClassContactManager ) );
+
+ // Check if the specified field type is supported by contact
+ const MVPbkFieldTypeList& fieldTypes =
+ tempContact->ParentStore().StoreProperties().SupportedFields();
+ ret = IsFieldTypeIncluded( fieldTypes, *fieldTypeSelector );
+ CleanupStack::PopAndDestroy( ); // fieldTypeSelector;
+ }
+
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// t_IsFieldTypeIncludedL
+// --------------------------------------------------------------------------
+//
+template<class T> TBool t_IsFieldTypeIncludedL(
+ const MVPbkFieldType& aFieldType,
+ T aSelector,
+ const CVPbkContactManager& aClassContactManager )
+ {
+ CVPbkFieldTypeSelector* selector = CreateSelectorLC( aSelector, aClassContactManager );
+ TBool ret = selector->IsFieldTypeIncluded( aFieldType );
+ CleanupStack::PopAndDestroy( selector );
+ return ret;
+ }
+
+template<class T> TBool t_IsFieldTypeIncludedL(
+ const MVPbkBaseContactField& aField,
+ T aSelector,
+ const CVPbkContactManager& aClassContactManager )
+ {
+ TBool ret = EFalse;
+ // Get the field type
+ const MVPbkFieldType* fieldType =
+ VPbkUtils::MatchFieldType( aClassContactManager.FieldTypes(), aField );
+
+ if ( fieldType )
+ {
+ CVPbkFieldTypeSelector* selector = CreateSelectorLC( aSelector,
+ aClassContactManager );
+ ret = selector->IsFieldTypeIncluded( *fieldType );
+ CleanupStack::PopAndDestroy();
+ }
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CreateSelectorLC
+// --------------------------------------------------------------------------
+//
+CVPbkFieldTypeSelector* CreateSelectorLC(
+ VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector aType,
+ const CVPbkContactManager& aContactManager )
+ {
+ CVPbkFieldTypeSelector* fieldTypeSelector = VPbkFieldTypeSelectorFactory::BuildFieldTypeSelectorL(
+ aType, aContactManager.FieldTypes() );
+
+ CleanupStack::PushL( fieldTypeSelector );
+ return fieldTypeSelector;
+ }
+
+// --------------------------------------------------------------------------
+// CreateSelectorLC
+// --------------------------------------------------------------------------
+//
+CVPbkFieldTypeSelector* CreateSelectorLC(
+ VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aType,
+ const CVPbkContactManager& aContactManager )
+ {
+ CVPbkFieldTypeSelector* fieldTypeSelector = VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+ aType, aContactManager.FieldTypes() );
+
+ CleanupStack::PushL( fieldTypeSelector );
+ return fieldTypeSelector;
+ }
+
+// --------------------------------------------------------------------------
+// IsFieldTypeIncluded
+// --------------------------------------------------------------------------
+//
+TBool IsFieldTypeIncluded
+ ( const MVPbkFieldTypeList& aFieldTypes,
+ const MVPbkFieldTypeSelector& aFieldTypeSelector )
+ {
+ TBool ret( EFalse );
+ TInt fieldTypeCount( aFieldTypes.FieldTypeCount() );
+
+ for ( TInt i = 0; i < fieldTypeCount && !ret; ++i )
+ {
+ const MVPbkFieldType& fieldType = aFieldTypes.FieldTypeAt( i );
+ if ( aFieldTypeSelector.IsFieldTypeIncluded( fieldType ) )
+ {
+ ret = ETrue;
+ }
+ }
+
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// IsFieldTypeIncluded
+// --------------------------------------------------------------------------
+//
+TInt IsFieldIncluded
+ (const MVPbkBaseContactFieldCollection& aFields,
+ TInt aStartIndex,
+ const MVPbkContactFieldSelector& aFieldTypeSelector)
+ {
+ TInt ret( KErrNotFound );
+ TInt fieldCount( aFields.FieldCount() );
+
+ for ( TInt i = aStartIndex; i < fieldCount && ret == KErrNotFound; ++i )
+ {
+ const MVPbkBaseContactField& field = aFields.FieldAt( i );
+ if ( aFieldTypeSelector.IsFieldIncluded( field ) )
+ {
+ ret = i;
+ }
+ }
+
+ return ret;
+ }
+
+// End of File