diff -r 000000000000 -r 5f000ab63145 phoneengine/PhoneCntFinder/ContactService/src/CPhCntContactManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneengine/PhoneCntFinder/ContactService/src/CPhCntContactManager.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,523 @@ +/* +* Copyright (c) 2006 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: Contact manager +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cphcntcontactmatchstrategy.h" +#include "CPhCntContactManager.h" +#include "CPhCntContact.h" +#include "cphcntcontactstoreuris.h" +#include "mphcntstoreloaderobserver.h" + +// --------------------------------------------------------------------------- +// Static constructor +// --------------------------------------------------------------------------- +// +CPhCntContactManager* CPhCntContactManager::NewL() + { + CPhCntContactManager* self = new( ELeave )CPhCntContactManager(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CPhCntContactManager::~CPhCntContactManager() + { + delete iVoipFieldTypeList; + delete iImageManager; + delete iSpeedDialAttribute; + delete iContactIdConverter; + delete iContactNameFormatter; + delete iSortOrder; + if( iContactManager ) + { + TRAP_IGNORE( iContactManager->ContactStoresL().CloseAll( *this ) ); + } + delete iContactManager; + delete iContactStoreUris; + } + +// --------------------------------------------------------------------------- +// Gives contact manager. +// --------------------------------------------------------------------------- +// +CVPbkContactManager& CPhCntContactManager::ContactManager() const + { + return *iContactManager; + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Retrieves contact from contact stores. +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CPhCntContactManager::RetrieveContactL( + const MVPbkContactLink& aLink, + MVPbkSingleContactOperationObserver& aObserver) + { + return iContactManager->RetrieveContactL( aLink, aObserver ); + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Gives contact stores. +// --------------------------------------------------------------------------- +// +MVPbkContactStoreList& CPhCntContactManager::ContactStoresL() const + { + return iContactManager->ContactStoresL(); + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Creates contact match strategy. +// --------------------------------------------------------------------------- +// +MPhCntContactMatchStrategy* CPhCntContactManager::CreateContactMatchStrategyL( + MVPbkContactFindObserver& aObserver, + TBool aRemoveDuplicates ) + { + return CPhCntContactMatchStrategy::NewL( + *iContactManager, + *iContactStoreUris, + aObserver, + aRemoveDuplicates ? + CVPbkPhoneNumberMatchStrategy::EVPbkDuplicatedContactsMatchFlag : + CVPbkPhoneNumberMatchStrategy::EVPbkMatchFlagsNone ); + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Converts contact ids to contact links. +// --------------------------------------------------------------------------- +// +MVPbkContactLinkArray* CPhCntContactManager::ConvertContactIdsToLinksL( + const CArrayFix& aContactId ) const + { + CVPbkContactLinkArray* contactLinks = CVPbkContactLinkArray::NewLC(); + + const TInt contactIdCount( aContactId.Count() ); + for( TInt i = 0; i < contactIdCount; i++ ) + { + MVPbkContactLink* link = + ConvertContactIdToLinkL( aContactId.At( i ) ); + + if( link ) + { + contactLinks->AppendL( link ); + } + } + CleanupStack::Pop( contactLinks ); + return contactLinks; + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Converts contact id to contact link. +// --------------------------------------------------------------------------- +// +MVPbkContactLink* CPhCntContactManager::ConvertContactIdToLinkL( + TContactItemId aContactId ) const + { + MVPbkContactLink* link = NULL; + if( aContactId != KNullContactId ) + { + link = iContactIdConverter->IdentifierToLinkLC( aContactId ); + CleanupStack::Pop(); // link + } + return link; + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Converts contact link to contact id. +// --------------------------------------------------------------------------- +// +TContactItemId CPhCntContactManager::ConvertContactLinkToContactId( + const MVPbkContactLink& aContactLink ) const + { + return iContactIdConverter->LinkToIdentifier( aContactLink ); + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Converts contact link descriptor to contact link. +// --------------------------------------------------------------------------- +// +MVPbkContactLink* CPhCntContactManager::ConvertDescriptorToLinkL( + const TDesC8& aPackedLink ) const + { + MVPbkContactLink* link = NULL; + if( aPackedLink.Length() > 0 ) + { + MVPbkContactLinkArray* links = + iContactManager->CreateLinksLC( aPackedLink ); + if( links && links->Count() > 0 ) + { + link = links->At( 0 ).CloneLC(); + CleanupStack::Pop(); // Link from CloneLC + } + CleanupStack::PopAndDestroy(); // Links + } + return link; + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Retrieves speed dial contact link. +// --------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CPhCntContactManager::RetrieveSpeedDialContactLinkL( + const TInt aSpeedDialPosition, + MVPbkContactFindObserver& aObserver ) + { + MVPbkContactAttributeManager& attributeManager = + iContactManager->ContactAttributeManagerL(); + + iSpeedDialAttribute->SetIndex( aSpeedDialPosition ); + + + return attributeManager.ListContactsL( + *iSpeedDialAttribute, + aObserver ); + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Indicates whether the field had a speed dial attribute set. +// --------------------------------------------------------------------------- +// +TBool CPhCntContactManager::HasSpeedDialL( + const TInt aSpeedDialPosition, + const MVPbkStoreContactField& aField ) + { + TBool result = EFalse; + + MVPbkContactAttributeManager& attributeManager = + iContactManager->ContactAttributeManagerL(); + + CVPbkSpeedDialAttribute* attr = CVPbkSpeedDialAttribute::NewL( aSpeedDialPosition ); + CleanupStack::PushL( attr ); + + result = attributeManager.HasFieldAttributeL( + *attr, + aField ); + + CleanupStack::PopAndDestroy( attr ); + + return result; + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Retrieves contacts image. +// --------------------------------------------------------------------------- +// +MPbk2ImageOperation* CPhCntContactManager::RetrieveImageL( + MVPbkStoreContact& aStoreContact, + const MVPbkFieldType& aFieldType, + MPbk2ImageGetObserver& aObserver ) + { + + return iImageManager->GetImageAsyncL( + NULL, + aStoreContact, + aFieldType, + aObserver ); + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Creates field type selector. +// --------------------------------------------------------------------------- +// +CVPbkFieldTypeSelector* CPhCntContactManager::CreateFieldTypeSelectorL() const + { + return CVPbkFieldTypeSelector::NewL( iContactManager->FieldTypes() ); + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Appends filter to selector. +// --------------------------------------------------------------------------- +// +void CPhCntContactManager::AppendFilterToSelectorL( + CVPbkFieldTypeSelector& aSelector, + TVPbkContactViewFilter aFilter ) + { + VPbkContactViewFilterBuilder::BuildContactViewFilterL( + aSelector, + aFilter, + *iContactManager ); + } + + +//----------------------------------------------------------------------------- +// From base class MPhCntContactFinder. +// Loads the contact store specified in the given contact link. +//----------------------------------------------------------------------------- +// +void CPhCntContactManager::LoadContactStoreL( const TDesC8& aContactLink, + MPhCntStoreLoaderObserver& aObserver ) + { + __ASSERT_ALWAYS( NULL == iStoreLoaderObserver, User::Leave( KErrInUse ) ); + + MVPbkContactLink* link = ConvertDescriptorToLinkL( aContactLink ); + + // Link conversion has a side effect of loading store plug-in, but + // make sure that store really gets loaded. + const TVPbkContactStoreUriPtr uri + = link->ContactStore().StoreProperties().Uri(); + delete link; + iContactManager->LoadContactStoreL( uri ); + + // Start asynchronous opening of the store. + MVPbkContactStore* store = iContactManager->ContactStoresL().Find( uri ); + __ASSERT_ALWAYS( NULL != store, User::Leave( KErrNotFound ) ); + + store->OpenL( *this ); + iStoreLoaderObserver = &aObserver; + } + +//----------------------------------------------------------------------------- +// From base class MPhCntContactManager. +//----------------------------------------------------------------------------- +// +CPhCntContactStoreUris& CPhCntContactManager::ContactStoreUrisL() + { + TEFLOGSTRING( KTAOBJECT, "CNT CPhCntContactManager::ContactStoreListL" ); + return *iContactStoreUris; + } + +//----------------------------------------------------------------------------- +// From base class MPhCntContactFinder. +// Constructs fieldtype list, which identifies voip fields and +// performs the find for voip fields. +//----------------------------------------------------------------------------- +// +MVPbkContactOperationBase* CPhCntContactManager::FindVoipContactsL( + const TDesC& aSipURI, + MVPbkContactFindObserver& aObserver ) const + { + return iContactManager->FindL( aSipURI, *iVoipFieldTypeList, aObserver ); + } + +// --------------------------------------------------------------------------- +// From MPhCntContactManager +// Gives contact name formatter. +// --------------------------------------------------------------------------- +// +MPbk2ContactNameFormatter& CPhCntContactManager::ContactNameFormatter() + { + return *iContactNameFormatter; + } + +// --------------------------------------------------------------------------- +// From MVPbkContactStoreListObserver +// Indication that contact stores has been opened. +// --------------------------------------------------------------------------- +// +void CPhCntContactManager::OpenComplete() + { + } + +// --------------------------------------------------------------------------- +// From MVPbkContactStoreListObserver +// Indication that contact store has been opened. +// --------------------------------------------------------------------------- +// +void CPhCntContactManager::StoreReady( + MVPbkContactStore& aContactStore ) + { + TVPbkContactStoreUriPtr uri = aContactStore.StoreProperties().Uri(); + + if ( iStoreLoaderObserver + && !iContactStoreUris->ContactStores().IsIncluded( uri ) ) + { + TRAP_IGNORE( iContactStoreUris->AddContactStoreL( uri ) ); + + iStoreLoaderObserver->ContactStoreLoadingCompleted( + &aContactStore, KErrNone ); + iStoreLoaderObserver = NULL; + } + iContactStoreUris->StoreReady( uri ); + } + +// --------------------------------------------------------------------------- +// From MVPbkContactStoreListObserver +// Indication that contact store has become unavailable. +// --------------------------------------------------------------------------- +// +void CPhCntContactManager::StoreUnavailable( + MVPbkContactStore& aContactStore, + TInt /*aReason*/ ) + { + TVPbkContactStoreUriPtr uri = aContactStore.StoreProperties().Uri(); + iContactStoreUris->StoreUnavailable( uri ); + } + +// --------------------------------------------------------------------------- +// From MVPbkContactStoreListObserver +// Contact store event. +// --------------------------------------------------------------------------- +// +void CPhCntContactManager::HandleStoreEventL( + MVPbkContactStore& aContactStore, + TVPbkContactStoreEvent aStoreEvent ) + { + switch( aStoreEvent.iEventType ) + { + case TVPbkContactStoreEvent::EStoreRestoreBeginning: + case TVPbkContactStoreEvent::EStoreBackupBeginning: + StoreUnavailable( aContactStore, KErrNone ); + break; + + case TVPbkContactStoreEvent::EStoreBackupRestoreCompleted: + StoreReady( aContactStore ); + break; + default: + break; + } + } + +//----------------------------------------------------------------------------- +// From base class MPhCntContactFinder. +// Loads the contact store specified with URI. +//----------------------------------------------------------------------------- +void CPhCntContactManager::LoadContactStoreWithUriL( + const TDesC& aStoreUri, + MPhCntStoreLoaderObserver& aObserver ) + { + __ASSERT_ALWAYS( NULL == iStoreLoaderObserver, User::Leave( KErrInUse ) ); + iContactManager->LoadContactStoreL( aStoreUri ); + + // Start asynchronous opening of the store. + MVPbkContactStore* store = iContactManager->ContactStoresL().Find( aStoreUri ); + __ASSERT_ALWAYS( NULL != store, User::Leave( KErrNotFound ) ); + + store->OpenL( *this ); + iStoreLoaderObserver = &aObserver; + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CPhCntContactManager::CPhCntContactManager() + { + } + +// --------------------------------------------------------------------------- +// Second phase constructor +// --------------------------------------------------------------------------- +// +void CPhCntContactManager::ConstructL() + { + iContactStoreUris = CPhCntContactStoreUris::NewL(); + + iContactManager = + CVPbkContactManager::NewL( iContactStoreUris->ContactStores() ); + + // Open stores so that they are accesible. + iContactManager->ContactStoresL().OpenAllL( *this ); + + const MVPbkFieldTypeList& fieldTypes = iContactManager->FieldTypes(); + + iSortOrder = CPbk2SortOrderManager::NewL( fieldTypes ); + + iContactNameFormatter = Pbk2ContactNameFormatterFactory::CreateL( + KNullDesC, fieldTypes, + *iSortOrder ); + MVPbkContactStoreList& contactStores = iContactManager->ContactStoresL(); + TVPbkContactStoreUriPtr uri(VPbkContactStoreUris::DefaultCntDbUri() ); + iContactDBStore = contactStores.Find( uri ); + iContactIdConverter = CVPbkContactIdConverter::NewL( *iContactDBStore ); + iSpeedDialAttribute = CVPbkSpeedDialAttribute::NewL(); + + iImageManager = CPbk2ImageManager::NewL( *iContactManager ); + + iVoipFieldTypeList = CVPbkFieldTypeRefsList::NewL(); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VOIPGEN ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VOIPHOME ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VOIPWORK ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_MOBILEPHONEHOME ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_MOBILEPHONEWORK ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_MOBILEPHONEGEN ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_LANDPHONEHOME ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_LANDPHONEWORK ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_LANDPHONEGEN ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_CARPHONE ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_IMPP ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_SIP ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_PAGERNUMBER ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_FAXNUMBERGEN ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_FAXNUMBERHOME ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_FAXNUMBERWORK ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VIDEONUMBERHOME ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VIDEONUMBERWORK ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_VIDEONUMBERGEN ) ); + AddVoipFieldTypeL( fieldTypes.Find( R_VPBK_FIELD_TYPE_ASSTPHONE ) ); + } + +// --------------------------------------------------------------------------- +// Adds voip field type to array. +// --------------------------------------------------------------------------- +// +void CPhCntContactManager::AddVoipFieldTypeL( + const MVPbkFieldType* aVoipFieldType ) + { + if( aVoipFieldType ) + { + iVoipFieldTypeList->AppendL( *aVoipFieldType ); + } + } + +// --------------------------------------------------------------------------- +// Return list of additional contact store uris. +// --------------------------------------------------------------------------- +// +const CVPbkContactStoreUriArray& CPhCntContactManager::AdditionalContactStoreUris() + { + return iContactStoreUris->AdditionalContactStores(); + }