diff -r 94dc1107e8b2 -r 40a3f856b14d phoneuis/easydialing/src/easydialingcontactdatamanager.cpp --- a/phoneuis/easydialing/src/easydialingcontactdatamanager.cpp Thu Jul 15 18:38:16 2010 +0300 +++ b/phoneuis/easydialing/src/easydialingcontactdatamanager.cpp Thu Aug 19 09:54:27 2010 +0300 @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include #include #include @@ -28,22 +30,20 @@ #include #include #include - #include #include #include #include - #include #include #include #include -#include // MVPbkContactStore +#include +#include #include +#include #include -#include - #include "easydialingcontactdata.h" #include "easydialingcontactdatamanager.h" #include "easydialingutils.h" @@ -52,12 +52,30 @@ #include "easydialinglogger.h" // --------------------------------------------------------------------------- +// CEasyDialingContactDataManager::NewL +// --------------------------------------------------------------------------- +// +CEasyDialingContactDataManager* CEasyDialingContactDataManager::NewL() + { + CEasyDialingContactDataManager* self = + new ( ELeave ) CEasyDialingContactDataManager(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- // CEasyDialingContactDataManager::CEasyDialingContactDataManager // --------------------------------------------------------------------------- // -CEasyDialingContactDataManager::CEasyDialingContactDataManager(CVPbkContactManager* aContactManager) - : iImageOperation(NULL), iContactManager(aContactManager), iContactOperation(NULL), - iContactThumbnailSetting(ETrue), iStoreReady(EFalse) +CEasyDialingContactDataManager::CEasyDialingContactDataManager() + : iPbkStoreConfiguration(NULL), + iImageOperation(NULL), + iContactManager(NULL), + iContactOperation(NULL), + iContactThumbnailSetting(ETrue), + iStoreReady(EFalse) { } @@ -76,11 +94,19 @@ delete iImageOperation; delete iContactOperation; delete iFavsView; - if (iContactStore) + + if ( iContactManager ) { - iContactStore->Close( *this); + TRAP_IGNORE( iContactManager->ContactStoresL().CloseAll( *this ) ); } + delete iContactManager; + if ( iPbkStoreConfiguration ) + { + iPbkStoreConfiguration->RemoveObserver( *this ); + } + delete iPbkStoreConfiguration; + if ( iPbkSettings ) { iPbkSettings->Close(); @@ -94,31 +120,43 @@ // void CEasyDialingContactDataManager::ConstructL() { + // Create contact store configuration handler + iPbkStoreConfiguration = CPbk2StoreConfiguration::NewL(); + iPbkStoreConfiguration->AddObserverL( *this ); + + // Create manager for all the supported contact stores + CVPbkContactStoreUriArray* supportedStores = + iPbkStoreConfiguration->SupportedStoreConfigurationL(); + CleanupStack::PushL( supportedStores ); + iContactManager = CVPbkContactManager::NewL( *supportedStores ); + CleanupStack::PopAndDestroy( supportedStores ); + + // Open the stores and start observing them + iContactManager->ContactStoresL().OpenAllL( *this ); + iImageManager = CPbk2ImageManager::NewL(*iContactManager); - TVPbkContactStoreUriPtr uri( VPbkContactStoreUris::DefaultCntDbUri() ); - iContactStore = iContactManager->ContactStoresL().Find( uri ); - iVPbkTopContactManager = CVPbkTopContactManager::NewL( *iContactManager ); iImageManagerParams.iFlags = TPbk2ImageManagerParams::EScaleImage | TPbk2ImageManagerParams::EKeepAspectRatio; iThumbnailFieldType = iContactManager->FieldTypes().Find( R_VPBK_FIELD_TYPE_THUMBNAILPIC ); - // Open the store - iContactStore->OpenL( *this ); - // Read easydialing setting from cenrep. CRepository* cenrep = CRepository::NewL( KCRUidEasyDialSettings ); CleanupStack::PushL( cenrep ); User::LeaveIfError( cenrep->Get( KEasyDialingContactThumbnails, iContactThumbnailSetting ) ); CleanupStack::PopAndDestroy( cenrep ); + // Start observing Phoenbook setting for the name order iPbkSettings = PbkGlobalSettingFactory::CreatePersistentSettingL(); iPbkSettings->ConnectL( MPbkGlobalSetting::EGeneralSettingCategory ); iPbkSettings->RegisterObserverL( this ); // Get name order from Phonebook settings UpdateNameOrderL(); + + // Check if store with favourites is configured to be searched. + SetupFavStoreSearchedL(); } // --------------------------------------------------------------------------- @@ -131,6 +169,15 @@ } // --------------------------------------------------------------------------- +// CEasyDialingContactDataManager::ContactManager +// --------------------------------------------------------------------------- +// +CVPbkContactManager& CEasyDialingContactDataManager::ContactManager() + { + return *iContactManager; + } + +// --------------------------------------------------------------------------- // CEasyDialingContactDataManager::SetThumbnailSize // --------------------------------------------------------------------------- // @@ -161,12 +208,13 @@ if (newIndex == KErrNotFound) { MVPbkContactLink* newLink = aContact->CloneLC(); - CEasyDialingContactData *newThumbnail = new (ELeave) CEasyDialingContactData(newLink); + CEasyDialingContactData* newData = new (ELeave) CEasyDialingContactData(newLink); CleanupStack::Pop(); // newLink newIndex = iContactDataArray.Count(); - CleanupStack::PushL(newThumbnail); - iContactDataArray.AppendL(newThumbnail); - CleanupStack::Pop(newThumbnail); + CleanupStack::PushL(newData); + iContactDataArray.AppendL(newData); + CleanupStack::Pop(newData); + SetStoreFlagsForContact(newData); } iContactDataArray[ newIndex ]->SetFav( aFav ); @@ -179,33 +227,41 @@ } // --------------------------------------------------------------------------- -// CEasyDialingContactDataManager::GetThumbnailAndFav +// CEasyDialingContactDataManager::IndexForId // --------------------------------------------------------------------------- // -TBool CEasyDialingContactDataManager::GetThumbnailAndFav(const TDesC& aId, CFbsBitmap*& aThumbnail, TBool& aFav) +TInt CEasyDialingContactDataManager::IndexForId( const TDesC& aId ) const { - LOGSTRING("CEasyDialingContactDataManager: GetThumbnailAndFav"); TUint idVal(0); TLex lex(aId); lex.Val(idVal, EHex); + return idVal; + } + +// --------------------------------------------------------------------------- +// CEasyDialingContactDataManager::GetThumbnail +// --------------------------------------------------------------------------- +// +TBool CEasyDialingContactDataManager::GetThumbnail( TInt aIndex, CFbsBitmap*& aThumbnail ) + { + LOGSTRING("CEasyDialingContactDataManager: GetThumbnail"); TBool retVal; - CEasyDialingContactData* thumbnail = iContactDataArray[idVal]; - aFav = thumbnail->Fav(); - if (thumbnail->IsLoaded()) + CEasyDialingContactData* contactData = iContactDataArray[aIndex]; + if ( contactData->IsLoaded() ) { - aThumbnail = thumbnail->Thumbnail(); + aThumbnail = contactData->Thumbnail(); retVal = ETrue; } else { aThumbnail = NULL; retVal = EFalse; - if (iWaitingContacts.Find(idVal) == KErrNotFound) + if (iWaitingContacts.Find(aIndex) == KErrNotFound) { - LOGSTRING1("iWaitingContacts.Append %d", idVal); - iWaitingContacts.Append(idVal); + LOGSTRING1("iWaitingContacts.Append %d", aIndex); + iWaitingContacts.Append(aIndex); TRAPD(err, LoadNextContactDataL()); if (err) { @@ -213,11 +269,41 @@ } } } - LOGSTRING("CEasyDialingContactDataManager: GetThumbnailAndFav Exit"); + LOGSTRING("CEasyDialingContactDataManager: GetThumbnail Exit"); return retVal; } // --------------------------------------------------------------------------- +// CEasyDialingContactDataManager::IsFav +// --------------------------------------------------------------------------- +// +TBool CEasyDialingContactDataManager::IsFav( TInt aIndex ) const + { + CEasyDialingContactData* contactData = iContactDataArray[aIndex]; + return contactData->Fav(); + } + +// --------------------------------------------------------------------------- +// CEasyDialingContactDataManager::IsSimContact +// --------------------------------------------------------------------------- +// +TBool CEasyDialingContactDataManager::IsSimContact( TInt aIndex ) const + { + CEasyDialingContactData* contactData = iContactDataArray[aIndex]; + return contactData->IsSimContact(); + } + +// --------------------------------------------------------------------------- +// CEasyDialingContactDataManager::IsSdnContact +// --------------------------------------------------------------------------- +// +TBool CEasyDialingContactDataManager::IsSdnContact( TInt aIndex ) const + { + CEasyDialingContactData* contactData = iContactDataArray[aIndex]; + return contactData->IsSdnContact(); + } + +// --------------------------------------------------------------------------- // CEasyDialingContactDataManager::IsFavL // --------------------------------------------------------------------------- // @@ -239,7 +325,7 @@ // TInt CEasyDialingContactDataManager::NumberOfFavsL() { - if ( iFavsView && iFavsViewReady ) + if ( iFavsView && iFavsViewReady && iFavStoreSearched ) { return iFavsView->ContactCountL(); } @@ -255,7 +341,7 @@ // MVPbkContactLink* CEasyDialingContactDataManager::FavLinkLC( TInt aIndex ) { - if ( !iFavsView || !iFavsViewReady ) + if ( !iFavsView || !iFavsViewReady || !iFavStoreSearched ) { // LC function should not return normally unless it has actually // put something to cleanup stack @@ -318,6 +404,23 @@ } // --------------------------------------------------------------------------- +// CEasyDialingContactDataManager::GetCurrentStoreUrisL +// --------------------------------------------------------------------------- +// +void CEasyDialingContactDataManager::GetCurrentStoreUrisL( RPointerArray& aUris ) + { + CVPbkContactStoreUriArray* storeUris = iPbkStoreConfiguration->CurrentConfigurationL(); + CleanupStack::PushL( storeUris ); + for ( TInt i = 0 ; i < storeUris->Count() ; ++i ) + { + HBufC* dbUri = (*storeUris)[i].UriDes().AllocLC(); + aUris.AppendL( dbUri ); + CleanupStack::Pop( dbUri ); + } + CleanupStack::PopAndDestroy( storeUris ); + } + +// --------------------------------------------------------------------------- // CEasyDialingContactDataManager::Pause // --------------------------------------------------------------------------- // @@ -388,17 +491,21 @@ if ( !iImageOperation && !iContactOperation && iWaitingContacts.Count() && iStoreReady && !iPause ) { // first we need to load the contact item - CEasyDialingContactData* tn = iContactDataArray[iWaitingContacts[0]]; - iContactOperation = iContactManager->RetrieveContactL( *(tn->ContactLink()), *this); - - if (!iContactOperation) + const TInt index( iWaitingContacts[0] ); + + if ( index >= 0 && index < iContactDataArray.Count() ) { - tn->LoadingComplete(); - RDebug::Print(_L("iWaitingContacts.Remove %d"), iWaitingContacts[0]); - iWaitingContacts.Remove(0); - LoadNextContactDataL(); + CEasyDialingContactData* data = iContactDataArray[index]; + iContactOperation = iContactManager->RetrieveContactL( *(data->ContactLink()), *this); + if (!iContactOperation) + { + data->LoadingComplete(); + RDebug::Print(_L("iWaitingContacts.Remove %d"), iWaitingContacts[0]); + iWaitingContacts.Remove(0); + LoadNextContactDataL(); + } } - } + } LOGSTRING("CEasyDialingContactDataManager: LoadNextContactDataL Exit"); } @@ -410,9 +517,14 @@ void CEasyDialingContactDataManager::Pbk2ImageGetComplete(MPbk2ImageOperation& aOperation, CFbsBitmap* aBitmap) { LOGSTRING("CEasyDialingContactDataManager: Pbk2ImageGetComplete"); - TInt index = iWaitingContacts[0]; - LOGSTRING1("iWaitingContacts.Remove %d", iWaitingContacts[0]); - iWaitingContacts.Remove(0); + TInt index( KErrNotFound ); + if ( iWaitingContacts.Count() > 0 ) + { + index = iWaitingContacts[0]; + LOGSTRING1("iWaitingContacts.Remove %d", iWaitingContacts[0]); + iWaitingContacts.Remove(0); + } + delete &aOperation; iImageOperation = NULL; delete iStoreContact; @@ -437,6 +549,30 @@ Pbk2ImageGetComplete(aOperation, NULL); } +// ----------------------------------------------------------------------------- +// ConfigurationChanged +// From MPbk2StoreConfigurationObserver +// Called when contact store configuration changes +// ----------------------------------------------------------------------------- +// +void CEasyDialingContactDataManager::ConfigurationChanged() + { + TRAP_IGNORE( SetupFavStoreSearchedL() ); + iObserver->StoreConfigurationChanged(); + } + +// ----------------------------------------------------------------------------- +// ConfigurationChangedComplete +// From MPbk2StoreConfigurationObserver +// Called when contact store configuration change has been informed to all +// observers +// ----------------------------------------------------------------------------- +// +void CEasyDialingContactDataManager::ConfigurationChangedComplete() + { + // no implementation needed + } + // --------------------------------------------------------------------------- // CEasyDialingContactDataManager::SettingChangedL // From MPbkGlobalSettingObserver @@ -509,13 +645,15 @@ void CEasyDialingContactDataManager::DoHandleImageGetCompleteL(CFbsBitmap* aBitmap, TInt aIndex) { LOGSTRING("CEasyDialingContactDataManager: DoHandleImageGetCompleteL"); - CEasyDialingContactData *tn = iContactDataArray[aIndex]; - tn->LoadingComplete(); - if (aBitmap) + if ( aIndex >= 0 && aIndex < iContactDataArray.Count() ) { - tn->SetThumbnail(aBitmap); + CEasyDialingContactData* data = iContactDataArray[aIndex]; + data->LoadingComplete(); + if (aBitmap) + { + data->SetThumbnail(aBitmap); + } } - LoadNextContactDataL(); InformObserver(); LOGSTRING("CEasyDialingContactDataManager: DoHandleImageGetCompleteL Exit"); @@ -556,7 +694,7 @@ } LOGSTRING1("CEasyDialingContactDataManager: VoiceCallAvailable returns %d", ret); - return ret; + return ret; } @@ -577,7 +715,7 @@ } LOGSTRING1("CEasyDialingContactDataManager: VideoCallAvailable returns %d", ret); - return ret; + return ret; } @@ -598,7 +736,7 @@ } LOGSTRING1("CEasyDialingContactDataManager: UniEditorAvailable returns %d", ret); - return ret; + return ret; } @@ -647,29 +785,20 @@ iObserver->AllContactDataLoaded(); } } - + // --------------------------------------------------------------------------- // CEasyDialingContactDataManager::StoreReady -// from MVPbkContactStoreObserver -// Called when the contact store is ready to be used, signals -// the next engine state. +// from MVPbkContactStoreListObserver // @param aContactStore The store that is ready. // --------------------------------------------------------------------------- // - void CEasyDialingContactDataManager::StoreReady( MVPbkContactStore& /*aContactStore*/ ) { - // next open the favourites view - TRAPD( err, iVPbkTopContactManager->GetTopContactsViewL( *this, *this ) ); - if ( err ) - { - HandleError( err ); - } } - + // --------------------------------------------------------------------------- // CEasyDialingContactDataManager::StoreUnavailable -// from MVPbkContactStoreObserver +// from MVPbkContactStoreListObserver // Called when a contact store becomes unavailable. // @param aContactStore The store that became unavailable. // @param aReason The reason why the store is unavailable. @@ -679,27 +808,46 @@ void CEasyDialingContactDataManager::StoreUnavailable( MVPbkContactStore& /*aContactStore*/, TInt /*aReason*/ ) { - // Opening main contact database failed. Easydialing can operate without - // it, but thumbnails and favourite stars can't be shown, and availability - // of action menu items can't be checked. + // Opening some contact database failed. Easydialing can operate without + // any database connections, but thumbnails and favourite stars can't be + // shown, and availability of action menu items can't be checked. // Of course, if easydialing can't open the database, probably PCSServer // can't open it either... } // --------------------------------------------------------------------------- // CEasyDialingContactDataManager::HandleStoreEventL -// from MVPbkContactStoreObserver +// from MVPbkContactStoreListObserver // Called when changes occur in the contact store. -// IGNORED. +// IGNORED because ED plugin reacts to contact modifications by listening +// to PCS cache update events. // @param aContactStore A store whose event it is. // @param aStoreEvent The event that has occurred. // --------------------------------------------------------------------------- // -void CEasyDialingContactDataManager::HandleStoreEventL(MVPbkContactStore& /*aContactStore*/, - TVPbkContactStoreEvent /*aStoreEvent*/) +void CEasyDialingContactDataManager::HandleStoreEventL( MVPbkContactStore& /*aContactStore*/, + TVPbkContactStoreEvent /*aStoreEvent*/ ) { } +// ----------------------------------------------------------------------------- +// CEasyDialingPlugin::OpenComplete +// From MVPbkContactStoreListObserver. +// Called when all contact stores are ready to be used, signals +// the next engine state. +// +// ----------------------------------------------------------------------------- +// +void CEasyDialingContactDataManager::OpenComplete() + { + // next open the favourites view + TRAPD( err, iVPbkTopContactManager->GetTopContactsViewL( *this, *this ) ); + if ( err ) + { + HandleError( err ); + } + } + // --------------------------------------------------------------------------- // CEasyDialingContactDataManager::VPbkOperationFailed // --------------------------------------------------------------------------- @@ -711,7 +859,7 @@ // Loading list of favourite contacts failed. // Continue as if none of the contacts are favourited. delete iFavsOperation; - iFavsOperation = NULL; + iFavsOperation = NULL; delete iFavsView; iFavsView = NULL; iFavsViewReady = EFalse; @@ -843,10 +991,9 @@ // Find out the available communication methods for the contact. GetAvailableServicesL( aContact, aIndex ); - // Next initiate async thumbnail get operation. - if(GetContactThumbnailSetting()) // reads the iContactThumbnailSetting value if it is false we dont fetch images + if (GetContactThumbnailSetting()) // reads the iContactThumbnailSetting value if it is false we dont fetch images { if (iImageManager->HasImage(*iStoreContact, *iThumbnailFieldType)) { @@ -861,7 +1008,7 @@ { CEasyDialingContactData *tn = iContactDataArray[aIndex]; tn->LoadingComplete(); - LOGSTRING1("iWaitingContacts.Remove %d", iWaitingContacts[0]); + LOGSTRING1("iWaitingContacts.Remove %d", iWaitingContacts[0]); iWaitingContacts.Remove(0); delete iStoreContact; iStoreContact = NULL; @@ -872,9 +1019,9 @@ else { // Opening contact failed. Mark contact data loaded, so it's not opened again. - CEasyDialingContactData *tn = iContactDataArray[aIndex]; - tn->LoadingComplete(); - LOGSTRING1("iWaitingContacts.Remove %d", iWaitingContacts[0]); + CEasyDialingContactData* data = iContactDataArray[aIndex]; + data->LoadingComplete(); + LOGSTRING1("iWaitingContacts.Remove %d", iWaitingContacts[0]); iWaitingContacts.Remove(0); LoadNextContactDataL(); InformObserver(); @@ -924,13 +1071,17 @@ LOGSTRING("CEasyDialingContactDataManager: VPbkSingleContactOperationComplete"); delete &aOperation; iContactOperation = NULL; - TInt index = iWaitingContacts[0]; - LOGSTRING1("VPbkSingleContactOperationComplete, Index=%d", index); - TRAPD(err, DoHandleContactOperationCompleteL(aContact, index)); - if (err) + if ( iWaitingContacts.Count() > 0 ) { - HandleError(err); + TInt index = iWaitingContacts[0]; + LOGSTRING1("VPbkSingleContactOperationComplete, Index=%d", index); + TRAPD(err, DoHandleContactOperationCompleteL(aContact, index)); + if ( err ) + { + HandleError(err); + } } + LOGSTRING("CEasyDialingContactDataManager: VPbkSingleContactOperationComplete Exit"); } @@ -999,6 +1150,38 @@ } } +// --------------------------------------------------------------------------- +// CEasyDialingContactDataManager::SetupFavStoreSearchedL +// --------------------------------------------------------------------------- +// +void CEasyDialingContactDataManager::SetupFavStoreSearchedL() + { + // Check if favourite contact store (i.e. the default contact store) is one + // of the stores configured to be searched. + CVPbkContactStoreUriArray* storeUris = + iPbkStoreConfiguration->CurrentConfigurationL(); + iFavStoreSearched = + storeUris->IsIncluded( VPbkContactStoreUris::DefaultCntDbUri() ); + delete storeUris; + } + +// --------------------------------------------------------------------------- +// CEasyDialingContactDataManager::SetStoreFlagsForContact +// --------------------------------------------------------------------------- +// +void CEasyDialingContactDataManager::SetStoreFlagsForContact( + CEasyDialingContactData* aContactData ) const + { + MVPbkContactLink* link = aContactData->ContactLink(); + const TDesC& uri = link->ContactStore().StoreProperties().Uri().UriDes(); + + TBool isSim = ( uri.Compare( VPbkContactStoreUris::SimGlobalAdnUri() ) == 0 ); + aContactData->SetSimContact( isSim ); + + TBool isSdn = ( uri.Compare( VPbkContactStoreUris::SimGlobalSdnUri() ) == 0 ); + aContactData->SetSdnContact( isSdn ); + } + // End of File