diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/USIMThinExtension/src/CPsu2CopySimContactsCmd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/USIMThinExtension/src/CPsu2CopySimContactsCmd.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,935 @@ +/* +* Copyright (c) 2002-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: Phonebook 2 copy "new SIM" contacts to phone memory. +* +* NOTE: CPsu2CopySimContactsCmd contains a lot of similar code to this class. +* Reason is that there is no clear place to share common SIM related code between +* USIMThinExtension.dll and USIMExtension.dll. This is a potential place for +* future refactoring. +* +*/ + + +// INCLUDE FILES +#include "CPsu2CopySimContactsCmd.h" + +// Phonebook 2 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +/// Use R_PBK2_GENERAL_CONFIRMATION_QUERY from UI controls +/// As a core components UiControl's resource file is loaded in core Pbk2 +#include +/// Use R_GENERAL_COPY_PROGRESS_NOTE from Commands +/// As a core components Command's resource file is loaded in core Pbk2 +#include +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// System includes +#include +#include +#include +#include +#include + +// Debugging headers +#include + +/// Unnamed namespace for local definitions +namespace { + +// CONSTANTS +const TInt KSimNotChecked = 0; +const TInt KSimChecked = 1; +_LIT( KPsu2ThinUiExtResourceFile, "Pbk2USimThinUIRes.rsc" ); + + +#ifdef _DEBUG +enum TPanicCode + { + EPreCond_ValidStoreConfigurationL, + EStorePropertyNotFound_CreateSimViewsL, + ENullTarget_CopyContactsL + }; + +void Panic(TInt aReason) + { + _LIT(KPanicText, "CPsu2CopySimContactsCmd"); + User::Panic(KPanicText, aReason); + } +#endif // _DEBUG + +/// Tasks +enum TNextTask + { + ECheckCopyPrerequisites, + EOpenSimStores, + ECheckSimStorePrerequisites, + ELaunchNewSIMInsertedQuery, + ECreateSimViews, + ECopyContacts, + EShowResults, + EComplete + }; + +} /// namespace + + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::CPsu2CopySimContactsCmd +// -------------------------------------------------------------------------- +// +CPsu2CopySimContactsCmd::CPsu2CopySimContactsCmd + ( MPbk2StartupMonitor& aStartupMonitor ) : + CActive( EPriorityStandard ), + iStartupMonitor( aStartupMonitor ), + iResourceFile( *CCoeEnv::Static() ) + { + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::~CPsu2CopySimContactsCmd +// -------------------------------------------------------------------------- +// +CPsu2CopySimContactsCmd::~CPsu2CopySimContactsCmd() + { + Cancel(); + delete iDecorator; + delete iCopyOperation; + delete iCopier; + delete iCopiedContacts; + delete iValidSourceStoreUris; + iSourceViews.ResetAndDestroy(); + CloseStores(); + delete iSourceContactLinks; + iSourceStores.Close(); + iResourceFile.Close(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::NewL +// -------------------------------------------------------------------------- +// +CPsu2CopySimContactsCmd* CPsu2CopySimContactsCmd::NewL + ( MPbk2StartupMonitor& aStartupMonitor ) + { + CPsu2CopySimContactsCmd* self = + new( ELeave ) CPsu2CopySimContactsCmd( aStartupMonitor ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ConstructL +// Symbian 2nd phase constructor can leave. +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ConstructL() + { + CActiveScheduler::Add(this); + + iDecorator = Pbk2ProcessDecoratorFactory::CreateProgressDialogDecoratorL + ( R_GENERAL_COPY_PROGRESS_NOTE, EFalse ); + iDecorator->SetObserver( *this ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::RunL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::RunL() + { + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPsu2CopySimContactsCmd::RunL res %d task %d"), + iStatus.Int(), iNextTask); + + if ( iStatus.Int() == KErrNone ) + { + switch ( iNextTask ) + { + case ECheckCopyPrerequisites: + { + CheckCopyPrerequisitesL(); + break; + } + case EOpenSimStores: + { + OpenSimStoresL(); + break; + } + case ECheckSimStorePrerequisites: + { + CheckSimStorePrerequisitesL(); + break; + } + case ELaunchNewSIMInsertedQuery: + { + LaunchNewSIMInsertedQueryL(); + break; + } + case ECreateSimViews: + { + CreateSimViewsL(); + break; + } + case ECopyContacts: + { + CopyContactsL(); + break; + } + case EShowResults: + { + ShowResultsL(); + break; + } + case EComplete: // FALLTHROUGH + default: + { + CompleteL(); + break; + } + } + } + else + { + CompleteWithError( iStatus.Int() ); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::DoCancel +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::DoCancel() + { + // Nothing to do here + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::RunError +// -------------------------------------------------------------------------- +// +TInt CPsu2CopySimContactsCmd::RunError( TInt aError ) + { + iStartupMonitor.HandleStartupFailed( aError ); + iCommandObserver->CommandFinished(*this); + return KErrNone; + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ExecuteLD +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ExecuteLD() + { + iNextTask = ECheckCopyPrerequisites; + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::AddObserver +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::AddObserver( MPbk2CommandObserver& aObserver ) + { + iCommandObserver = &aObserver; + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ResetUiControl +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ResetUiControl + ( MPbk2ContactUiControl& /*aUiControl*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::StoreReady +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::StoreReady + ( MVPbkContactStore& /*aContactStore*/) + { + ++iCounter; + if ( iSourceStores.Count() == iCounter ) + { + iNextTask = ECheckSimStorePrerequisites; + IssueRequest(); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::StoreUnavailable +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::StoreUnavailable + ( MVPbkContactStore& aContactStore, TInt /*aReason*/ ) + { + // Remove URI + iValidSourceStoreUris->Remove( aContactStore.StoreProperties().Uri() ); + + // Remove store + const TInt count = iSourceStores.Count(); + TBool storeRemoved = EFalse; + for ( TInt i = 0; i < count && !storeRemoved; ++i ) + { + if ( iSourceStores[i] == &aContactStore ) + { + iSourceStores[i]->Close( *this ); + iSourceStores.Remove( i ); + storeRemoved = ETrue; + } + } + + // If all source stores failed to open -> complete command + if ( iSourceStores.Count() == 0 ) + { + iNextTask = EComplete; + IssueRequest(); + } + // All available stores are open + else if ( iSourceStores.Count() == iCounter ) + { + iNextTask = ECheckSimStorePrerequisites; + IssueRequest(); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::HandleStoreEventL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::HandleStoreEventL + ( MVPbkContactStore& /*aContactStore*/, + TVPbkContactStoreEvent /*aStoreEvent*/ ) + { + // Nothing to be done here + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ContactViewReady +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ContactViewReady + ( MVPbkContactViewBase& /*aView*/) + { + ++iCounter; + if ( iSourceViews.Count() == iCounter ) + { + iNextTask = ECopyContacts; + IssueRequest(); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ContactViewUnavailable +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ContactViewUnavailable + ( MVPbkContactViewBase& /*aView*/ ) + { + // Nothing to be done here, wait view ready events + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ContactAddedToView +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ContactAddedToView + ( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) + { + // Nothing to be done here + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ContactRemovedFromView +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ContactRemovedFromView + ( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) + { + // Nothing to be done here + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ContactViewError +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ContactViewError + ( MVPbkContactViewBase& /*aView*/, TInt aError, + TBool /*aErrorNotified*/ ) + { + IssueRequest( aError ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::StepComplete +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::StepComplete + ( MVPbkContactOperationBase& /*aOperation*/, TInt aStepSize ) + { + iCopiedSuccessfully += aStepSize; + iDecorator->ProcessAdvance( aStepSize ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::StepFailed +// -------------------------------------------------------------------------- +// +TBool CPsu2CopySimContactsCmd::StepFailed + ( MVPbkContactOperationBase& /*aOperation*/, TInt /*aStepSize*/, + TInt aError ) + { + CCoeEnv::Static()->HandleError(aError); + if( aError == KErrDiskFull ) + { + // When disk get full during copy, show the results + Cancel(); + delete iCopyOperation; + iCopyOperation = NULL; + iNextTask = EShowResults; + IssueRequest(); + } + else + { + IssueRequest( aError ); + } + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::OperationComplete +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::OperationComplete + ( MVPbkContactOperationBase& /*aOperation*/ ) + { + // Decorator calls ProcessDismissed + iDecorator->ProcessStopped(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ProcessDismissed +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ProcessDismissed( TInt /*aCancelCode*/ ) + { + Cancel(); + delete iCopyOperation; + iCopyOperation = NULL; + iNextTask = EShowResults; + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::IssueRequest +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::IssueRequest() + { + IssueRequest( KErrNone ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::IssueRequest +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::IssueRequest( TInt aResult ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, aResult ); + SetActive(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::CheckCopyPrerequisitesL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::CheckCopyPrerequisitesL() + { + if ( ValidStoreConfigurationL() && + NewSimCardForPhonebook2AppL() ) + { + iNextTask = EOpenSimStores; + } + else + { + iNextTask = EComplete; + } + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::OpenSimStoresL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::OpenSimStoresL() + { + // Load and open source stores to contact manager + const TInt count = iValidSourceStoreUris->Count(); + for ( TInt i = 0; i < count; ++i ) + { + Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(). + LoadContactStoreL( (*iValidSourceStoreUris)[i] ); + MVPbkContactStore* source = + Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(). + ContactStoresL().Find( (*iValidSourceStoreUris)[i] ); + iSourceStores.AppendL( source ); + source->OpenL( *this ); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::CheckSimStorePrerequisitesL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::CheckSimStorePrerequisitesL() + { + // If there are no contacts to copy then do nothing + TInt sourceContactCount = 0; + const TInt count = iSourceStores.Count(); + for ( TInt i = 0; i < count; ++i ) + { + sourceContactCount += + iSourceStores[i]->StoreInfo().NumberOfContactsL(); + } + + iNextTask = EComplete; + if ( sourceContactCount > 0 ) + { + iNextTask = ELaunchNewSIMInsertedQuery; + } + else + { + SetNewSimCardKeyL(); + } + + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::LaunchNewSIMInsertedQueryL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::LaunchNewSIMInsertedQueryL() + { + // Open resource as late as possible so that it's not opened in start-up + // if not needed + iResourceFile.OpenL( KPbk2RomFileDrive, + KDC_RESOURCE_FILES_DIR, KPsu2ThinUiExtResourceFile ); + + HBufC* text = StringLoader::LoadLC( R_QTN_SIMP_NOTE_NEW_SIM_COPY ); + + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + TInt ret = dlg->ExecuteLD( R_PBK2_GENERAL_CONFIRMATION_QUERY, *text ); + if ( iAvkonAppUi->IsForeground() ) + { + // Despite of user answer set P&S key + SetNewSimCardKeyL(); + SetShowSIMContactsL( ret ); + iNextTask = ret ? ECreateSimViews : EComplete; + } + else + { + iNextTask = EComplete; + } + + CleanupStack::PopAndDestroy( text ); + IssueRequest(); + } + + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::SetShowSIMContactsL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::SetShowSIMContactsL( TBool aShow ) + { + const TDesC& adnUri = VPbkContactStoreUris::SimGlobalAdnUri(); + + CVPbkContactStoreUriArray* uriArray = + Phonebook2::Pbk2AppUi()->ApplicationServices().StoreConfiguration(). + CurrentConfigurationL(); + CleanupStack::PushL( uriArray ); + + if ( iAvkonAppUi->IsForeground() ) + { + if ( aShow ) + { + if ( !uriArray->IsIncluded(adnUri) ) + { + // Show SIM contact also in names list: + Phonebook2::Pbk2AppUi()->ApplicationServices().StoreConfiguration(). + AddContactStoreURIL( adnUri ); + } + } + else + { + if ( uriArray->IsIncluded(adnUri) ) + { + // Do not show SIM contacts: + Phonebook2::Pbk2AppUi()->ApplicationServices().StoreConfiguration(). + RemoveContactStoreURIL( adnUri ); + } + } + + iNextTask = EComplete; + } + + CleanupStack::PopAndDestroy( uriArray ); + } + + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::CreateSimViewsL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::CreateSimViewsL() + { + // Set views ready counter to zero + iCounter = 0; + + const TInt count = iSourceStores.Count(); + for ( TInt i = 0; i < count; ++i ) + { + // Find store property + const CPbk2StoreProperty* prop = + Phonebook2::Pbk2AppUi()->ApplicationServices().StoreProperties(). + FindProperty( iSourceStores[i]->StoreProperties().Uri() ); + __ASSERT_DEBUG( prop, + Panic( EStorePropertyNotFound_CreateSimViewsL ) ); + // Get Virtual Phonebook view definition + // There is only one view defintion for SIM stores + // -> take the first one + const CVPbkContactViewDefinition& viewDef = + (prop->Views())[0]->ViewDefinition(); + MVPbkContactView* view = iSourceStores[i]->CreateViewLC( + viewDef, + *this, + Phonebook2::Pbk2AppUi()->ApplicationServices(). + SortOrderManager().SortOrder() ); + iSourceViews.AppendL( view ); + CleanupStack::Pop(); // view + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::CopyContactsL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::CopyContactsL() + { + if ( !iCopier ) + { + iCopier = CVPbkContactCopier::NewL + ( Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager() ); + } + + // Create an array for source contact links + if ( !iSourceContactLinks ) + { + iSourceContactLinks = CVPbkContactLinkArray::NewL(); + } + + if ( !iCopiedContacts ) + { + iCopiedContacts = CVPbkContactLinkArray::NewL(); + } + + // Create links to the contacts that are copied + const TInt viewCount = iSourceViews.Count(); + for ( TInt i = 0; i < viewCount; ++i ) + { + const TInt contactCount = iSourceViews[i]->ContactCountL(); + for( TInt j = 0; j < contactCount; ++j ) + { + MVPbkContactLink* link = + iSourceViews[i]->ContactAtL(j).CreateLinkLC(); + iSourceContactLinks->AppendL( link ); + CleanupStack::Pop(); // link + } + } + + // Views can be destroyed now because links have been created + iSourceViews.ResetAndDestroy(); + + // Get target store + MVPbkContactStore* targetStore = + Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(). + ContactStoresL().Find( VPbkContactStoreUris::DefaultCntDbUri() ); + // Target store must exist as cheked in ValidStoreConfigurationL + __ASSERT_DEBUG( targetStore, Panic( ENullTarget_CopyContactsL )); + + // Start copying + iCopiedContacts->ResetAndDestroy(); + iCopyOperation = iCopier->CopyContactsL( + CVPbkContactCopier::EVPbkUsePlatformSpecificDuplicatePolicy, + *iSourceContactLinks, targetStore, *iCopiedContacts, *this ); + + + // Show progress note + iDecorator->ProcessStartedL( iSourceContactLinks->Count() ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ShowResultsL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::ShowResultsL() + { + TPbk2CopyContactsResults results( + iCopiedSuccessfully, iSourceContactLinks->Count() ); + results.ShowNoteL(); + + iNextTask = EComplete; + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::CompleteL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::CompleteL() + { + iStartupMonitor.HandleStartupComplete(); + iCommandObserver->CommandFinished( *this ); + + if (iAvkonAppUi->IsForeground()) + { + PublishOpenCompleteL(); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::PublishOpenCompleteL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::PublishOpenCompleteL() + { + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPsu2CopySimContactsCmd::PublishOpenCompleteL") ); + + TInt err = RProperty::Define( TUid::Uid( KPbk2PSUidPublic ), + KPhonebookOpenCompleted, RProperty::EInt ); + if ( err != KErrAlreadyExists ) + { + User::LeaveIfError( err ); + } + RProperty prop; + CleanupClosePushL( prop ); + User::LeaveIfError(prop.Attach( TUid::Uid( KPbk2PSUidPublic ), + KPhonebookOpenCompleted )); + TInt value( EPhonebookClosed ); + err = prop.Get( value ); + if ( err == KErrNone && value != EPhonebookOpenCompleted) + { + // Only publish once per phonebook opening + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("publish EPhonebookOpenCompleted") ); + err = prop.Set( EPhonebookOpenCompleted ); + } + User::LeaveIfError( err ); + + CleanupStack::PopAndDestroy(&prop); + } + + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::CompleteWithError +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::CompleteWithError( TInt aError ) + { + iStartupMonitor.HandleStartupFailed( aError ); + iCommandObserver->CommandFinished( *this ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::ValidStoreConfigurationL +// -------------------------------------------------------------------------- +// +TBool CPsu2CopySimContactsCmd::ValidStoreConfigurationL() + { + __ASSERT_DEBUG( !iValidSourceStoreUris, + Panic(EPreCond_ValidStoreConfigurationL)); + + CVPbkContactStoreUriArray* currentConfig = + Phonebook2::Pbk2AppUi()->ApplicationServices(). + StoreConfiguration().CurrentConfigurationL(); + CleanupStack::PushL( currentConfig ); + CVPbkContactStoreUriArray* validConfig = + Phonebook2::Pbk2AppUi()->ApplicationServices(). + StoreValidityInformer().CurrentlyValidStoresL(); + CleanupStack::PushL( validConfig ); + + // ADN/SDN is valid source if it's not in current configuration + iValidSourceStoreUris = CVPbkContactStoreUriArray::NewL(); + const TDesC& adnUri = VPbkContactStoreUris::SimGlobalAdnUri(); + const TDesC& sdnUri = VPbkContactStoreUris::SimGlobalSdnUri(); + if ( !currentConfig->IsIncluded( adnUri )) + { + iValidSourceStoreUris->AppendL( adnUri ); + } + if ( !currentConfig->IsIncluded( sdnUri )) + { + iValidSourceStoreUris->AppendL( sdnUri ); + } + + // No sim store needs to be handled in this command, + // directly set the flag. + if ( iValidSourceStoreUris->Count() == 0 ) + { + SetNewSimCardKeyL(); + } + + TBool result = EFalse; + // If there are source stores and contact model is valid + // then configuration is valid + if ( iValidSourceStoreUris->Count() > 0 && + validConfig->IsIncluded( + VPbkContactStoreUris::DefaultCntDbUri() )) + { + result = ETrue; + } + + CleanupStack::PopAndDestroy( 2 ); + return result; + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::NewSimCardForPhonebook2AppL +// -------------------------------------------------------------------------- +// +TBool CPsu2CopySimContactsCmd::NewSimCardForPhonebook2AppL() + { + MVPbkSimStateInformation* simStateInfo = + VPbkSimStoreFactory::GetSimStateInformationL(); + CleanupDeletePushL( simStateInfo ); + TBool newSimCard = simStateInfo->NewSimCardL(); + CleanupStack::PopAndDestroy(); // simStateInfo + + if ( newSimCard ) + { + RProperty queryProperty; + TInt queryDone = KSimNotChecked; + TInt result = queryProperty.Get( + TUid::Uid( KPbk2UID3 ), KPhonebookSimCopyAsked, queryDone ); + queryProperty.Close(); + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPsu2CopySimContactsCmd::NewSimCardForPhonebook2AppL res %d status %d"), + result, queryDone); + // If result is KErrNone it means that the key has been set + // and query has been asked before, KErrNotFound means that key + // is not set and query hasn't been asked + if ( result == KErrNotFound ) + { + return ETrue; + } + } + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::CloseStores +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::CloseStores() + { + const TInt count = iSourceStores.Count(); + for ( TInt i = 0; i < count; ++i ) + { + iSourceStores[i]->Close( *this ); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopySimContactsCmd::SetNewSimCardKeyL +// -------------------------------------------------------------------------- +// +void CPsu2CopySimContactsCmd::SetNewSimCardKeyL() + { + RProperty queryProperty; + CleanupClosePushL( queryProperty ); + + // Check if the key has been defined + TInt queryDone = KSimNotChecked; + TInt result = queryProperty.Get( + TUid::Uid( KPbk2UID3 ), KPhonebookSimCopyAsked, queryDone ); + + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPsu2CopySimContactsCmd::SetNewSimCardKeyL res %d status %d"), + result, queryDone); + + if ( result == KErrNotFound ) + { + _LIT_SECURITY_POLICY_C1( newSimCardQueryReadPolicy, + ECapabilityReadUserData ); + _LIT_SECURITY_POLICY_S0( newSimCardQueryWritePolicy, KPbk2UID3 ); + + // Define a property for query done flag + User::LeaveIfError( queryProperty.Define( + TUid::Uid( KPbk2UID3 ), + KPhonebookSimCopyAsked, + RProperty::EInt, + newSimCardQueryReadPolicy, + newSimCardQueryWritePolicy )); + } + + // Set the value to KSimChecked + User::LeaveIfError( queryProperty.Set( + TUid::Uid( KPbk2UID3 ), + KPhonebookSimCopyAsked, + KSimChecked )); + + CleanupStack::PopAndDestroy(); // queryProperty + } + +// End of File