--- 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 <CVPbkContactManager.h>
#include <MVPbkContactStoreList.h>
#include <MVPbkContactLink.h>
+#include <CPbk2StoreConfiguration.h>
+#include <CVPbkContactStoreUriArray.h>
#include <VPbkContactStoreUris.h>
#include <TVPbkContactStoreUriPtr.h>
#include <CVPbkTopContactManager.h>
@@ -28,22 +30,20 @@
#include <TVPbkStoreContactAnalyzer.h>
#include <MVPbkFieldType.h>
#include <VPbkEng.rsg>
-
#include <MVPbkContactViewBase.h>
#include <MVPbkBaseContactFieldCollection.h>
#include <MVPbkContactFieldTextData.h>
#include <MVPbkContactFieldData.h>
-
#include <CVPbkContactLinkArray.h>
#include <MVPbkContactLink.h>
#include <MVPbkContactOperationBase.h>
#include <MVPbkOperationObserver.h>
-#include <MVPbkContactStore.h> // MVPbkContactStore
+#include <MVPbkContactStore.h>
+#include <MVPbkContactStoreProperties.h>
#include <MVPbkStoreContact.h>
+#include <PbkGlobalSettingFactory.h>
#include <centralrepository.h>
-#include <PbkGlobalSettingFactory.h>
-
#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<TDesC>& 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