diff -r 34879f5cfc63 -r 2666d9724c76 phonebookui/Phonebook2/USIMExtension/src/CPsu2CopyAllToPbkCmd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/USIMExtension/src/CPsu2CopyAllToPbkCmd.cpp Thu Jul 15 18:22:55 2010 +0300 @@ -0,0 +1,697 @@ +/* +* Copyright (c) 2010 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 all SIM contacts to phone memory. +* +* NOTE: Contains a lot of similar code that in CPsu2CopySimContactsCmd. +* 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 "CPsu2CopyAllToPbkCmd.h" + +// Phonebook 2 +#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 +#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 { + + +const TInt KTargetStoresCount = 1; + +#ifdef _DEBUG +enum TPanicCode + { + EStorePropertyNotFound_CreateSimViewsL + }; + +void Panic(TInt aReason) + { + _LIT(KPanicText, "CPsu2CopyAllToPbkCmd"); + User::Panic(KPanicText, aReason); + } +#endif // _DEBUG + + +} /// namespace + + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::CPsu2CopyAllToPbkCmd +// -------------------------------------------------------------------------- +// +CPsu2CopyAllToPbkCmd::CPsu2CopyAllToPbkCmd() + : CActive( EPriorityStandard ) + { + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::~CPsu2CopyAllToPbkCmd +// -------------------------------------------------------------------------- +// +CPsu2CopyAllToPbkCmd::~CPsu2CopyAllToPbkCmd() + { + Cancel(); + delete iDecorator; + delete iCopyOperation; + delete iCopier; + delete iCopiedContacts; + delete iValidSourceStoreUris; + iSourceViews.ResetAndDestroy(); + CloseStores(); + delete iSourceContactLinks; + iSourceStores.Close(); + delete iTheOnlyContactTitle; + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::NewL +// -------------------------------------------------------------------------- +// +CPsu2CopyAllToPbkCmd* CPsu2CopyAllToPbkCmd::NewL() + { + CPsu2CopyAllToPbkCmd* self = + new( ELeave ) CPsu2CopyAllToPbkCmd( ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ConstructL +// Symbian 2nd phase constructor can leave. +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ConstructL() + { + CActiveScheduler::Add(this); + + iValidSourceStoreUris = CVPbkContactStoreUriArray::NewL(); + iValidSourceStoreUris->AppendL( + VPbkContactStoreUris::SimGlobalSdnUri() ); + iValidSourceStoreUris->AppendL( + VPbkContactStoreUris::SimGlobalAdnUri() ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::RunL +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::RunL() + { + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPsu2CopyAllToPbkCmd::RunL res %d task %d"), + iStatus.Int(), iNextTask); + + switch ( iNextTask ) + { + case EOpenStores: + { + OpenStoresL(); + break; + } + case ECheckSimStorePrerequisites: + { + CheckSimStorePrerequisitesL(); + break; + } + case ELaunchCopyAllSIMContactsQueryL: + { + LaunchCopyAllSIMContactsQueryL(); + break; + } + case ECreateSimViews: + { + CreateSimViewsL(); + break; + } + case ECopyContacts: + { + CopyContactsL(); + break; + } + case EComplete: // FALLTHROUGH + default: + { + Complete(); + break; + } + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::DoCancel +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::DoCancel() + { + // Nothing to do here + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::RunError +// -------------------------------------------------------------------------- +// +TInt CPsu2CopyAllToPbkCmd::RunError( TInt aError ) + { + Finish( aError ); + return KErrNone; + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ExecuteLD +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ExecuteLD() + { + StartNext( EOpenStores ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::AddObserver +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::AddObserver( MPbk2CommandObserver& aObserver ) + { + iCommandObserver = &aObserver; + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ResetUiControl +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ResetUiControl + ( MPbk2ContactUiControl& /*aUiControl*/ ) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::StoreReady +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::StoreReady + ( MVPbkContactStore& /*aContactStore*/) + { + ++iCounter; + // KTargetStoresCount = 1, as we are always copying to phone memory + if ( iNextTask == EOpenStores && + iSourceStores.Count() + KTargetStoresCount == iCounter ) + { + StartNext(ECheckSimStorePrerequisites); + } + + // iNextTask == EOpenStores above + // --> ignore the case where a store later becomes ready and command is + // already in later phases + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::StoreUnavailable +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::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 already moved on to next phase, ignore store becoming unavailable + // let the ContactViewError or StepFailed handle this + if ( iNextTask == EOpenStores) + { + // If all source stores failed to open -> complete command + if ( iSourceStores.Count() == 0 ) + { + StartNext( EComplete ); + } + // All available stores are open + else if ( iSourceStores.Count() + KTargetStoresCount == iCounter ) + { + StartNext( ECheckSimStorePrerequisites ); + } + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::HandleStoreEventL +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::HandleStoreEventL + ( MVPbkContactStore& /*aContactStore*/, + TVPbkContactStoreEvent /*aStoreEvent*/ ) + { + // Nothing to be done here + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ContactViewReady +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ContactViewReady + ( MVPbkContactViewBase& /*aView*/) + { + ++iCounter; + if ( iSourceViews.Count() == iCounter ) + { + StartNext( ECopyContacts ); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ContactViewUnavailable +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ContactViewUnavailable + ( MVPbkContactViewBase& /*aView*/ ) + { + // Nothing to be done here, wait view ready events + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ContactAddedToView +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ContactAddedToView + ( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) + { + // Nothing to be done here + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ContactRemovedFromView +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ContactRemovedFromView + ( MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, + const MVPbkContactLink& /*aContactLink*/ ) + { + // Nothing to be done here + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ContactViewError +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ContactViewError + ( MVPbkContactViewBase& /*aView*/, TInt aError, + TBool /*aErrorNotified*/ ) + { + Finish( aError ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::StepComplete +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::StepComplete + ( MVPbkContactOperationBase& /*aOperation*/, TInt aStepSize ) + { + iCopiedSuccessfully += aStepSize; + iDecorator->ProcessAdvance( aStepSize ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::StepFailed +// -------------------------------------------------------------------------- +// +TBool CPsu2CopyAllToPbkCmd::StepFailed + ( MVPbkContactOperationBase& /*aOperation*/, TInt /*aStepSize*/, + TInt aError ) + { + Finish( aError ); + + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::OperationComplete +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::OperationComplete + ( MVPbkContactOperationBase& /*aOperation*/ ) + { + // Decorator calls ProcessDismissed + iDecorator->ProcessStopped(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ProcessDismissed +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ProcessDismissed( TInt /*aCancelCode*/ ) + { + iDecoratorShown = EFalse; + Cancel(); + delete iCopyOperation; + iCopyOperation = NULL; + StartNext( EComplete ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::OpenStoresL +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::OpenStoresL() + { + // 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] ); + if ( source ) + { + iSourceStores.AppendL( source ); + source->OpenL( *this ); + } + } + + // Also make sure the target store is always loaded and opened + Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(). + LoadContactStoreL( VPbkContactStoreUris::DefaultCntDbUri() ); + iTargetStore = Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(). + ContactStoresL().Find( VPbkContactStoreUris::DefaultCntDbUri() ); + iTargetStore->OpenL( *this ); + + // Next: wait for StoreReady and/or StoreUnavailable notifications + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::CheckSimStorePrerequisitesL +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::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(); + } + + if ( sourceContactCount > 0 ) + { + StartNext ( ELaunchCopyAllSIMContactsQueryL ); + } + else + { + StartNext ( EComplete ); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::LaunchCopyAllSIMContactsQueryL +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::LaunchCopyAllSIMContactsQueryL() + { + HBufC* text = StringLoader::LoadLC( R_QTN_SIMP_NOTE_COPY_ALL_SIM ); + + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + TInt ret = dlg->ExecuteLD( R_PBK2_GENERAL_CONFIRMATION_QUERY, *text ); + + CleanupStack::PopAndDestroy( text ); + + StartNext ( ret ? ECreateSimViews : EComplete ); + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::CreateSimViewsL +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::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 + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::CopyContactsL +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::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 ) + { + // store the first contact's title, if only one contact copied, + // show the name of that single contact in the results note. + if ( j == 0 ) + { + iTheOnlyContactTitle = Phonebook2::Pbk2AppUi()->ApplicationServices(). + NameFormatter().GetContactTitleL( + iSourceViews[i]->ContactAtL(j).Fields(), + MPbk2ContactNameFormatter::EPreserveLeadingSpaces); + } + // create link + 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() ); + + + if (targetStore) + { + // Start copying + iDecorator = Pbk2ProcessDecoratorFactory::CreateProgressDialogDecoratorL + ( R_GENERAL_COPY_PROGRESS_NOTE, EFalse ); + iDecorator->SetObserver( *this ); + + iCopiedContacts->ResetAndDestroy(); + iCopyOperation = iCopier->CopyContactsL( + CVPbkContactCopier::EVPbkUsePlatformSpecificDuplicatePolicy, + *iSourceContactLinks, targetStore, *iCopiedContacts, *this ); + + // Show progress note + iDecorator->ProcessStartedL( iSourceContactLinks->Count() ); + iDecoratorShown = ETrue; + } + else + { + StartNext( EComplete ); + } + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::ShowResultsL +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::ShowResultsL() + { + + if (iSourceContactLinks->Count() == 1 && iTheOnlyContactTitle) + { + TPsu2SimCopyResults results( + iCopiedSuccessfully, iTheOnlyContactTitle->Des() ); + results.ShowNoteL(); + } + else + { + TPsu2SimCopyResults results( + iCopiedSuccessfully, iSourceContactLinks->Count() ); + results.ShowNoteL(); + } + + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::Complete +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::Complete() + { + if ( iSourceContactLinks ) + { + TRAP_IGNORE( ShowResultsL() ); + } + + iCommandObserver->CommandFinished( *this ); + } + +// --------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::Finish +// --------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::Finish( TInt aReason ) + { + if ( aReason != KErrNone && aReason != KErrCancel ) + { + CCoeEnv::Static()->HandleError( aReason ); + } + + if (iDecorator && iDecoratorShown) + { + // Decorator calls ProcessDismissed --> StartNext( EComplete ); + iDecorator->ProcessStopped(); + } + else + { + StartNext( EComplete ); + } + } + +// --------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::StartNext +// --------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::StartNext( TNextTask aNextTask ) + { + iNextTask = aNextTask; + + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + } + +// -------------------------------------------------------------------------- +// CPsu2CopyAllToPbkCmd::CloseStores +// -------------------------------------------------------------------------- +// +void CPsu2CopyAllToPbkCmd::CloseStores() + { + const TInt count = iSourceStores.Count(); + for ( TInt i = 0; i < count; ++i ) + { + iSourceStores[i]->Close( *this ); + } + + iTargetStore->Close( *this ); + } + +// End of File