phonebookengines/VirtualPhonebook/VPbkEng/src/TVPbkStoreContactAnalyzer.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
--- /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