phoneengine/PhoneCntFinder/ContactService/src/CPhCntContactManager.cpp
branchRCL_3
changeset 62 5266b1f337bd
child 81 c26cc2a7c548
equal deleted inserted replaced
61:41a7f70b3818 62:5266b1f337bd
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Contact manager
       
    15 *
       
    16 */
       
    17 
       
    18 #include <CVPbkContactManager.h>
       
    19 #include <CVPbkContactStoreUriArray.h>
       
    20 #include <TVPbkContactStoreUriPtr.h>
       
    21 #include <MVPbkContactStoreList.h>
       
    22 #include <MPbk2ContactNameFormatter.h>
       
    23 #include <CPbk2SortOrderManager.h>
       
    24 #include <Pbk2ContactNameFormatterFactory.h>
       
    25 #include <CVPbkContactIdConverter.h>
       
    26 #include <MVPbkContactStore.h>
       
    27 #include <MVPbkContactLink.h>
       
    28 #include <CVPbkContactLinkArray.h>
       
    29 #include <MVPbkContactAttributeManager.h>
       
    30 #include <CVPbkSpeedDialAttribute.h>
       
    31 #include <CPbk2ImageManager.h>
       
    32 #include <MVPbkStoreContact.h>
       
    33 #include <VPbkContactStoreUris.h>
       
    34 #include <MVPbkFieldType.h>
       
    35 #include <CVPbkFieldTypeRefsList.h>
       
    36 #include <VPbkEng.rsg>
       
    37 #include <MVPbkContactStoreProperties.h>
       
    38 #include <CVPbkFieldTypeSelector.h>
       
    39 #include <VPbkContactViewFilterBuilder.h>
       
    40 #include <talogger.h>
       
    41 
       
    42 #include "cphcntcontactmatchstrategy.h"
       
    43 #include "CPhCntContactManager.h"
       
    44 #include "CPhCntContact.h"
       
    45 #include "cphcntcontactstoreuris.h"
       
    46 #include "mphcntstoreloaderobserver.h"
       
    47 
       
    48 // ---------------------------------------------------------------------------
       
    49 // Static constructor
       
    50 // ---------------------------------------------------------------------------
       
    51 //
       
    52 CPhCntContactManager* CPhCntContactManager::NewL()
       
    53     {
       
    54     CPhCntContactManager* self = new( ELeave )CPhCntContactManager();
       
    55     CleanupStack::PushL( self );
       
    56     self->ConstructL();
       
    57     CleanupStack::Pop( self );
       
    58     return self;
       
    59     }
       
    60 
       
    61 // ---------------------------------------------------------------------------
       
    62 // Destructor
       
    63 // ---------------------------------------------------------------------------
       
    64 //
       
    65 CPhCntContactManager::~CPhCntContactManager()
       
    66     {
       
    67     delete iVoipFieldTypeList;
       
    68     delete iImageManager;
       
    69     delete iSpeedDialAttribute;
       
    70     delete iContactIdConverter;
       
    71     delete iContactNameFormatter;
       
    72     delete iSortOrder;
       
    73     if( iContactManager )
       
    74         {
       
    75         TRAP_IGNORE( iContactManager->ContactStoresL().CloseAll( *this ) );
       
    76         }
       
    77     delete iContactManager;
       
    78     delete iContactStoreUris;
       
    79     }
       
    80 
       
    81 // ---------------------------------------------------------------------------
       
    82 // Gives contact manager.
       
    83 // ---------------------------------------------------------------------------
       
    84 //
       
    85 CVPbkContactManager& CPhCntContactManager::ContactManager() const
       
    86     {
       
    87     return *iContactManager;
       
    88     }
       
    89 
       
    90 // ---------------------------------------------------------------------------
       
    91 // From MPhCntContactManager
       
    92 // Retrieves contact from contact stores.
       
    93 // ---------------------------------------------------------------------------
       
    94 //
       
    95 MVPbkContactOperationBase* CPhCntContactManager::RetrieveContactL(
       
    96     const MVPbkContactLink& aLink,
       
    97     MVPbkSingleContactOperationObserver& aObserver)
       
    98     {
       
    99     return iContactManager->RetrieveContactL( aLink, aObserver );
       
   100     }
       
   101 
       
   102 // ---------------------------------------------------------------------------
       
   103 // From MPhCntContactManager
       
   104 // Gives contact stores.
       
   105 // ---------------------------------------------------------------------------
       
   106 //
       
   107 MVPbkContactStoreList& CPhCntContactManager::ContactStoresL() const
       
   108     {
       
   109     return iContactManager->ContactStoresL();
       
   110     }
       
   111 
       
   112 // ---------------------------------------------------------------------------
       
   113 // From MPhCntContactManager
       
   114 // Creates contact match strategy.
       
   115 // ---------------------------------------------------------------------------
       
   116 //
       
   117 MPhCntContactMatchStrategy* CPhCntContactManager::CreateContactMatchStrategyL(
       
   118     MVPbkContactFindObserver& aObserver,
       
   119     TDuplicateRemovalStrategy aStrategy )
       
   120     {
       
   121     const TUint32 removeDuplicatesStrategyFlag =
       
   122         CVPbkPhoneNumberMatchStrategy::EVPbkDuplicatedContactsMatchFlag |
       
   123         CVPbkPhoneNumberMatchStrategy::EVPbkBestMatchingFlag;
       
   124     const TUint32 dontRemoveDuplicatesStrategyFlag = 
       
   125         CVPbkPhoneNumberMatchStrategy::EVPbkBestMatchingFlag;
       
   126         
       
   127     return CPhCntContactMatchStrategy::NewL(
       
   128         *iContactManager,
       
   129         *iContactStoreUris,
       
   130         aObserver,
       
   131         aStrategy == ERemoveDuplicates ? 
       
   132             removeDuplicatesStrategyFlag : dontRemoveDuplicatesStrategyFlag );
       
   133     }
       
   134 
       
   135 // ---------------------------------------------------------------------------
       
   136 // From MPhCntContactManager
       
   137 // Converts contact ids to contact links.
       
   138 // ---------------------------------------------------------------------------
       
   139 //
       
   140 MVPbkContactLinkArray* CPhCntContactManager::ConvertContactIdsToLinksL(
       
   141         const CArrayFix<TContactItemId>& aContactId ) const
       
   142     {
       
   143     CVPbkContactLinkArray* contactLinks = CVPbkContactLinkArray::NewLC();
       
   144 
       
   145     const TInt contactIdCount( aContactId.Count() );
       
   146     for( TInt i = 0; i < contactIdCount; i++ )
       
   147         {
       
   148         MVPbkContactLink* link =
       
   149             ConvertContactIdToLinkL( aContactId.At( i ) );
       
   150 
       
   151         if( link )
       
   152             {
       
   153             contactLinks->AppendL( link );
       
   154             }
       
   155         }
       
   156     CleanupStack::Pop( contactLinks );
       
   157     return contactLinks;
       
   158     }
       
   159 
       
   160 // ---------------------------------------------------------------------------
       
   161 // From MPhCntContactManager
       
   162 // Converts contact id to contact link.
       
   163 // ---------------------------------------------------------------------------
       
   164 //
       
   165 MVPbkContactLink* CPhCntContactManager::ConvertContactIdToLinkL(
       
   166     TContactItemId aContactId ) const
       
   167     {
       
   168     MVPbkContactLink* link = NULL;
       
   169     if( aContactId != KNullContactId )
       
   170         {
       
   171         link = iContactIdConverter->IdentifierToLinkLC( aContactId );
       
   172         CleanupStack::Pop(); // link
       
   173         }
       
   174     return link;
       
   175     }
       
   176 
       
   177 // ---------------------------------------------------------------------------
       
   178 // From MPhCntContactManager
       
   179 // Converts contact link to contact id.
       
   180 // ---------------------------------------------------------------------------
       
   181 //
       
   182 TContactItemId CPhCntContactManager::ConvertContactLinkToContactId(
       
   183     const MVPbkContactLink& aContactLink ) const
       
   184     {
       
   185     return iContactIdConverter->LinkToIdentifier( aContactLink );
       
   186     }
       
   187 
       
   188 // ---------------------------------------------------------------------------
       
   189 // From MPhCntContactManager
       
   190 // Converts contact link descriptor to contact link.
       
   191 // ---------------------------------------------------------------------------
       
   192 //
       
   193 MVPbkContactLink* CPhCntContactManager::ConvertDescriptorToLinkL(
       
   194     const TDesC8& aPackedLink ) const
       
   195     {
       
   196     MVPbkContactLink* link = NULL;
       
   197     if( aPackedLink.Length() > 0 )
       
   198         {
       
   199         MVPbkContactLinkArray* links =
       
   200             iContactManager->CreateLinksLC( aPackedLink );
       
   201         if( links && links->Count() > 0 )
       
   202             {
       
   203             link = links->At( 0 ).CloneLC();
       
   204             CleanupStack::Pop(); // Link from CloneLC
       
   205             }
       
   206         CleanupStack::PopAndDestroy(); // Links
       
   207         }
       
   208     return link;
       
   209     }
       
   210 
       
   211 // ---------------------------------------------------------------------------
       
   212 // From MPhCntContactManager
       
   213 // Retrieves speed dial contact link.
       
   214 // ---------------------------------------------------------------------------
       
   215 //
       
   216 MVPbkContactOperationBase* CPhCntContactManager::RetrieveSpeedDialContactLinkL(
       
   217         const TInt aSpeedDialPosition,
       
   218         MVPbkContactFindObserver& aObserver )
       
   219     {
       
   220     MVPbkContactAttributeManager& attributeManager =
       
   221         iContactManager->ContactAttributeManagerL();
       
   222 
       
   223     iSpeedDialAttribute->SetIndex( aSpeedDialPosition );
       
   224 
       
   225 
       
   226     return attributeManager.ListContactsL(
       
   227                 *iSpeedDialAttribute,
       
   228                 aObserver );
       
   229     }
       
   230 
       
   231 // ---------------------------------------------------------------------------
       
   232 // From MPhCntContactManager
       
   233 // Indicates whether the field had a speed dial attribute set.
       
   234 // ---------------------------------------------------------------------------
       
   235 //
       
   236 TBool CPhCntContactManager::HasSpeedDialL(
       
   237 		const TInt aSpeedDialPosition,
       
   238 		const MVPbkStoreContactField& aField )
       
   239     {
       
   240     TBool result = EFalse;
       
   241 
       
   242     MVPbkContactAttributeManager& attributeManager =
       
   243         iContactManager->ContactAttributeManagerL();
       
   244 
       
   245 	CVPbkSpeedDialAttribute* attr = CVPbkSpeedDialAttribute::NewL( aSpeedDialPosition );
       
   246     CleanupStack::PushL( attr );
       
   247 
       
   248     result = attributeManager.HasFieldAttributeL(
       
   249     			*attr,
       
   250     			aField );
       
   251 
       
   252 	CleanupStack::PopAndDestroy( attr );
       
   253 
       
   254 	return result;
       
   255     }
       
   256 
       
   257 // ---------------------------------------------------------------------------
       
   258 // From MPhCntContactManager
       
   259 // Retrieves contacts image.
       
   260 // ---------------------------------------------------------------------------
       
   261 //
       
   262 MPbk2ImageOperation* CPhCntContactManager::RetrieveImageL(
       
   263     MVPbkStoreContact& aStoreContact,
       
   264     const MVPbkFieldType& aFieldType,
       
   265     MPbk2ImageGetObserver& aObserver )
       
   266     {
       
   267 
       
   268     return iImageManager->GetImageAsyncL(
       
   269         	NULL,
       
   270             aStoreContact,
       
   271             aFieldType,
       
   272             aObserver );
       
   273     }
       
   274 
       
   275 // ---------------------------------------------------------------------------
       
   276 // From MPhCntContactManager
       
   277 // Creates field type selector.
       
   278 // ---------------------------------------------------------------------------
       
   279 //
       
   280 CVPbkFieldTypeSelector* CPhCntContactManager::CreateFieldTypeSelectorL() const
       
   281     {
       
   282     return CVPbkFieldTypeSelector::NewL( iContactManager->FieldTypes() );
       
   283     }
       
   284 
       
   285 // ---------------------------------------------------------------------------
       
   286 // From MPhCntContactManager
       
   287 // Appends filter to selector.
       
   288 // ---------------------------------------------------------------------------
       
   289 //
       
   290 void CPhCntContactManager::AppendFilterToSelectorL(
       
   291     CVPbkFieldTypeSelector& aSelector,
       
   292     TVPbkContactViewFilter aFilter )
       
   293     {
       
   294     VPbkContactViewFilterBuilder::BuildContactViewFilterL(
       
   295 		aSelector,
       
   296 		aFilter,
       
   297 		*iContactManager );
       
   298     }
       
   299 
       
   300 
       
   301 //-----------------------------------------------------------------------------
       
   302 // From base class MPhCntContactFinder.
       
   303 // Loads the contact store specified in the given contact link.
       
   304 //-----------------------------------------------------------------------------
       
   305 //
       
   306 void CPhCntContactManager::LoadContactStoreL( const TDesC8& aContactLink,
       
   307         MPhCntStoreLoaderObserver& aObserver )
       
   308     {
       
   309     __ASSERT_ALWAYS( NULL == iStoreLoaderObserver, User::Leave( KErrInUse ) );
       
   310 
       
   311     MVPbkContactLink* link = ConvertDescriptorToLinkL( aContactLink );
       
   312 
       
   313     // Link conversion has a side effect of loading store plug-in, but
       
   314     // make sure that store really gets loaded.
       
   315     const TVPbkContactStoreUriPtr uri
       
   316         = link->ContactStore().StoreProperties().Uri();
       
   317     delete link;
       
   318     iContactManager->LoadContactStoreL( uri );
       
   319 
       
   320     // Start asynchronous opening of the store.
       
   321     MVPbkContactStore* store = iContactManager->ContactStoresL().Find( uri );
       
   322     __ASSERT_ALWAYS( NULL != store, User::Leave( KErrNotFound ) );
       
   323 
       
   324     store->OpenL( *this );
       
   325     iStoreLoaderObserver = &aObserver;
       
   326     }
       
   327 
       
   328 //-----------------------------------------------------------------------------
       
   329 // From base class MPhCntContactManager.
       
   330 //-----------------------------------------------------------------------------
       
   331 //
       
   332 CPhCntContactStoreUris& CPhCntContactManager::ContactStoreUrisL()
       
   333     {
       
   334     TEFLOGSTRING( KTAOBJECT, "CNT CPhCntContactManager::ContactStoreListL" );
       
   335     return *iContactStoreUris;
       
   336     }
       
   337 
       
   338 //-----------------------------------------------------------------------------
       
   339 // From base class MPhCntContactFinder.
       
   340 // Constructs fieldtype list, which identifies voip fields and
       
   341 // performs the find for voip fields.
       
   342 //-----------------------------------------------------------------------------
       
   343 //
       
   344 MVPbkContactOperationBase* CPhCntContactManager::FindVoipContactsL(
       
   345     const TDesC& aSipURI,
       
   346     MVPbkContactFindObserver& aObserver ) const
       
   347     {
       
   348     return iContactManager->FindL( aSipURI, *iVoipFieldTypeList, aObserver );
       
   349     }
       
   350 
       
   351 // ---------------------------------------------------------------------------
       
   352 // From MPhCntContactManager
       
   353 // Gives contact name formatter.
       
   354 // ---------------------------------------------------------------------------
       
   355 //
       
   356 MPbk2ContactNameFormatter& CPhCntContactManager::ContactNameFormatter()
       
   357     {
       
   358     return *iContactNameFormatter;
       
   359     }
       
   360 
       
   361 // ---------------------------------------------------------------------------
       
   362 // From MVPbkContactStoreListObserver
       
   363 // Indication that contact stores has been opened.
       
   364 // ---------------------------------------------------------------------------
       
   365 //
       
   366 void CPhCntContactManager::OpenComplete()
       
   367     {
       
   368     if ( iStoreLoaderObserver )
       
   369         {      
       
   370         iStoreLoaderObserver->ContactStoreLoadingCompleted(
       
   371            iContactStore, KErrNone );
       
   372         iStoreLoaderObserver = NULL;
       
   373         }
       
   374     }
       
   375 
       
   376 // ---------------------------------------------------------------------------
       
   377 // From MVPbkContactStoreListObserver
       
   378 // Indication that contact store has been opened.
       
   379 // ---------------------------------------------------------------------------
       
   380 //
       
   381 void CPhCntContactManager::StoreReady(
       
   382     MVPbkContactStore& aContactStore )
       
   383     {
       
   384     
       
   385     TVPbkContactStoreUriPtr uri = aContactStore.StoreProperties().Uri();
       
   386 
       
   387     if ( !iContactStoreUris->ContactStores().IsIncluded( uri ) )
       
   388         {
       
   389         TRAP_IGNORE( iContactStoreUris->AddContactStoreL( uri ) );
       
   390         }
       
   391     
       
   392     iContactStore = &aContactStore;
       
   393      
       
   394     iContactStoreUris->StoreReady( uri );
       
   395     }
       
   396 
       
   397 // ---------------------------------------------------------------------------
       
   398 // From MVPbkContactStoreListObserver
       
   399 // Indication that contact store has become unavailable.
       
   400 // ---------------------------------------------------------------------------
       
   401 //
       
   402 void CPhCntContactManager::StoreUnavailable(
       
   403     MVPbkContactStore& aContactStore,
       
   404     TInt /*aReason*/ )
       
   405     {
       
   406     TVPbkContactStoreUriPtr uri = aContactStore.StoreProperties().Uri();
       
   407     iContactStoreUris->StoreUnavailable( uri );
       
   408     }
       
   409 
       
   410 // ---------------------------------------------------------------------------
       
   411 // From MVPbkContactStoreListObserver
       
   412 // Contact store event.
       
   413 // ---------------------------------------------------------------------------
       
   414 //
       
   415 void CPhCntContactManager::HandleStoreEventL(
       
   416     MVPbkContactStore& aContactStore,
       
   417     TVPbkContactStoreEvent aStoreEvent )
       
   418     {
       
   419     switch( aStoreEvent.iEventType )
       
   420         {
       
   421         case TVPbkContactStoreEvent::EStoreRestoreBeginning:
       
   422         case TVPbkContactStoreEvent::EStoreBackupBeginning:
       
   423             StoreUnavailable( aContactStore, KErrNone );
       
   424             break;
       
   425 
       
   426         case TVPbkContactStoreEvent::EStoreBackupRestoreCompleted:
       
   427             StoreReady( aContactStore );
       
   428             break;
       
   429         default:
       
   430             break;
       
   431         }
       
   432     }
       
   433 
       
   434 //-----------------------------------------------------------------------------
       
   435 // From base class MPhCntContactFinder.
       
   436 // Loads the contact store specified with URI.
       
   437 //-----------------------------------------------------------------------------
       
   438 void CPhCntContactManager::LoadContactStoreWithUriL(
       
   439     const TDesC& aStoreUri,
       
   440     MPhCntStoreLoaderObserver& aObserver )
       
   441     {
       
   442     __ASSERT_ALWAYS( NULL == iStoreLoaderObserver, User::Leave( KErrInUse ) );
       
   443     iContactManager->LoadContactStoreL( aStoreUri );
       
   444 
       
   445     // Start asynchronous opening of the store.
       
   446     MVPbkContactStore* store = iContactManager->ContactStoresL().Find( aStoreUri );
       
   447     __ASSERT_ALWAYS( NULL != store, User::Leave( KErrNotFound ) );
       
   448 
       
   449     store->OpenL( *this );
       
   450     iStoreLoaderObserver = &aObserver;
       
   451     }
       
   452 
       
   453 // ---------------------------------------------------------------------------
       
   454 // Constructor
       
   455 // ---------------------------------------------------------------------------
       
   456 //
       
   457 CPhCntContactManager::CPhCntContactManager()
       
   458     {
       
   459     }
       
   460 
       
   461 // ---------------------------------------------------------------------------
       
   462 // Second phase constructor
       
   463 // ---------------------------------------------------------------------------
       
   464 //
       
   465 void CPhCntContactManager::ConstructL()
       
   466     {
       
   467     iContactStoreUris = CPhCntContactStoreUris::NewL();
       
   468 
       
   469     iContactManager =
       
   470         CVPbkContactManager::NewL( iContactStoreUris->ContactStores() );
       
   471 
       
   472     // Open stores so that they are accesible.
       
   473     iContactManager->ContactStoresL().OpenAllL( *this );
       
   474 
       
   475     const MVPbkFieldTypeList& fieldTypes = iContactManager->FieldTypes();
       
   476 
       
   477     iSortOrder = CPbk2SortOrderManager::NewL( fieldTypes );
       
   478 
       
   479     iContactNameFormatter = Pbk2ContactNameFormatterFactory::CreateL(
       
   480             KNullDesC, fieldTypes,
       
   481             *iSortOrder );
       
   482     MVPbkContactStoreList& contactStores = iContactManager->ContactStoresL();
       
   483     TVPbkContactStoreUriPtr uri(VPbkContactStoreUris::DefaultCntDbUri() );
       
   484     iContactDBStore = contactStores.Find( uri );
       
   485     iContactIdConverter = CVPbkContactIdConverter::NewL( *iContactDBStore );
       
   486     iSpeedDialAttribute = CVPbkSpeedDialAttribute::NewL();
       
   487 
       
   488     iImageManager = CPbk2ImageManager::NewL( *iContactManager );
       
   489 
       
   490     iVoipFieldTypeList = CVPbkFieldTypeRefsList::NewL();
       
   491     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VOIPGEN ) );
       
   492     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VOIPHOME ) );
       
   493     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VOIPWORK ) );
       
   494     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_MOBILEPHONEHOME ) );
       
   495     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_MOBILEPHONEWORK ) );
       
   496     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_MOBILEPHONEGEN ) );
       
   497     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_LANDPHONEHOME ) );
       
   498     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_LANDPHONEWORK ) );
       
   499     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_LANDPHONEGEN ) );
       
   500     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_CARPHONE ) );
       
   501     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_IMPP ) );
       
   502     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_SIP ) );
       
   503     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_PAGERNUMBER ) );
       
   504     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_FAXNUMBERGEN ) );
       
   505     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_FAXNUMBERHOME ) );
       
   506     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_FAXNUMBERWORK ) );
       
   507     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VIDEONUMBERHOME ) );
       
   508     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VIDEONUMBERWORK ) );
       
   509     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VIDEONUMBERGEN ) );
       
   510     AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_ASSTPHONE ) );
       
   511     }
       
   512 
       
   513 // ---------------------------------------------------------------------------
       
   514 // Adds voip field type to array.
       
   515 // ---------------------------------------------------------------------------
       
   516 //
       
   517 void CPhCntContactManager::AddVoipFieldTypeL(
       
   518     const MVPbkFieldType* aVoipFieldType )
       
   519     {
       
   520     if( aVoipFieldType )
       
   521         {
       
   522         iVoipFieldTypeList->AppendL( *aVoipFieldType );
       
   523         }
       
   524     }
       
   525 
       
   526 // ---------------------------------------------------------------------------
       
   527 // Return list of additional contact store uris.
       
   528 // ---------------------------------------------------------------------------
       
   529 //
       
   530 const CVPbkContactStoreUriArray& CPhCntContactManager::AdditionalContactStoreUris()
       
   531     {
       
   532     return iContactStoreUris->AdditionalContactStores();
       
   533     }