diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/CommandsExtension/src/CPbk2CopyContactsCmd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/CommandsExtension/src/CPbk2CopyContactsCmd.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,568 @@ +/* +* Copyright (c) 2005-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 contacts command. +* +*/ + + +// INCLUDE FILES +#include "CPbk2CopyContactsCmd.h" + +// Phonebook 2 +#include "TPbk2CopyContactsResults.h" +#include +#include +#include +#include +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// System includes +#include +#include +#include + +/// Unnamed namespace for local definitions +namespace { + +const TInt KOneSelected = 1; + +enum TPbk2CopyContactsCmdState + { + EPbk2CopyContactsCmdInit, + EPbk2CopyContactsCmdRetrieve, + EPbk2CopyContactsCmdCopy, + EPbk2CopyContactsCmdShowResults, + EPbk2CopyContactsCmdComplete + }; + +#ifdef _DEBUG +enum TPanicCode + { + EPreCond_ConstructL, + EInvalidStoreSelection + }; + +void Panic(TInt aReason) + { + _LIT(KPanicText, "CPbk2CopyContactsCmd"); + User::Panic(KPanicText, aReason); + } +#endif // _DEBUG + +} /// namespace + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::CPbk2CopyContactsCmd +// -------------------------------------------------------------------------- +// +CPbk2CopyContactsCmd::CPbk2CopyContactsCmd( + MPbk2ContactUiControl& aUiControl ) : + CActive( EPriorityStandard ), + iStoreUiControl( &aUiControl ), + iState( EPbk2CopyContactsCmdInit ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::~CPbk2CopyContactsCmd +// -------------------------------------------------------------------------- +// +CPbk2CopyContactsCmd::~CPbk2CopyContactsCmd() + { + Cancel(); + + if ( iNameListUiControl ) + { + iNameListUiControl->RegisterCommand( NULL ); + } + + delete iFocusedContactBookmark; + delete iCopiedContacts; + delete iDecorator; + delete iContactLinks; + delete iCopyOperation; + delete iCopier; + delete iContact; + delete iRetrieveOperation; + delete iDriveSpaceCheck; + Release( iAppServices ); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::NewL +// -------------------------------------------------------------------------- +// +CPbk2CopyContactsCmd* CPbk2CopyContactsCmd::NewL( + MPbk2ContactUiControl& aUiControl) + { + CPbk2CopyContactsCmd* self = + new( ELeave ) CPbk2CopyContactsCmd(aUiControl); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::ConstructL +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::ConstructL() + { + iAppServices = CPbk2ApplicationServices::InstanceL(); + + // safe since this is a contructor reference parameter + iNameListUiControl = iStoreUiControl->ParentControl(); + if ( !iNameListUiControl ) + { + iNameListUiControl = iStoreUiControl; + } + __ASSERT_DEBUG(iNameListUiControl, Panic(EPreCond_ConstructL)); + + iNameListUiControl->RegisterCommand( this ); + + CActiveScheduler::Add(this); + + iDecorator = Pbk2ProcessDecoratorFactory::CreateProgressDialogDecoratorL( + R_GENERAL_COPY_PROGRESS_NOTE, ETrue); + iDecorator->SetObserver(*this); + iContactLinks = CVPbkContactLinkArray::NewL(); + iDriveSpaceCheck = CPbk2DriveSpaceCheck::NewL + ( CCoeEnv::Static()->FsSession() ); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::RunL +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::RunL() + { + switch (iState) + { + case EPbk2CopyContactsCmdInit: + { + InitL(); + break; + } + case EPbk2CopyContactsCmdRetrieve: + { + RetrieveL(); + break; + } + case EPbk2CopyContactsCmdCopy: + { + StartCopyL(); + break; + } + case EPbk2CopyContactsCmdShowResults: + { + ShowResultsL(); + break; + } + default: + { + FinishCommandL(); + break; + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::DoCancel +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::DoCancel() + { + delete iCopyOperation; + iCopyOperation = NULL; + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::RunError +// -------------------------------------------------------------------------- +// +TInt CPbk2CopyContactsCmd::RunError(TInt aError) + { + HandleError(aError); + return KErrNone; + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::ExecuteLD +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::ExecuteLD() + { + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::AddObserver +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::AddObserver(MPbk2CommandObserver& aObserver) + { + iCommandObserver = &aObserver; + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::ResetUiControl +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::ResetUiControl( + MPbk2ContactUiControl& aUiControl) + { + if (iNameListUiControl == &aUiControl) + { + iStoreUiControl = NULL; + iNameListUiControl = NULL; + } + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::StepComplete +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::StepComplete( + MVPbkContactOperationBase& /*aOperation*/, + TInt aStepSize) + { + iCopiedSuccessfully += aStepSize; + iDecorator->ProcessAdvance(aStepSize); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::StepFailed +// -------------------------------------------------------------------------- +// +TBool CPbk2CopyContactsCmd::StepFailed( + MVPbkContactOperationBase& /*aOperation*/, + TInt /*aStepSize*/, TInt aError) + { + HandleError(aError); + // Stop copy operation + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::OperationComplete +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::OperationComplete( + MVPbkContactOperationBase& /*aOperation*/) + { + iDecorator->ProcessStopped(); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::ProcessDismissed +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::ProcessDismissed( TInt /*aCancelCode*/ ) + { + Cancel(); + delete iCopyOperation; + iCopyOperation = NULL; + iState = EPbk2CopyContactsCmdShowResults; + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::VPbkSingleContactOperationComplete +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::VPbkSingleContactOperationComplete( + MVPbkContactOperationBase& /*aOperation*/, + MVPbkStoreContact* aContact) + { + iContact = aContact; + delete iRetrieveOperation; + iRetrieveOperation = NULL; + iState = EPbk2CopyContactsCmdCopy; + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::VPbkSingleContactOperationFailed +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::VPbkSingleContactOperationFailed( + MVPbkContactOperationBase& /*aOperation*/, + TInt aError) + { + HandleError(aError); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::IssueRequest +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::IssueRequest() + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::InitL +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::InitL() + { + if (iStoreUiControl) + { + // Get target store + CArrayPtr* selected = + iStoreUiControl->SelectedContactStoresL(); + + __ASSERT_DEBUG(selected && selected->Count() == KOneSelected, + Panic(EInvalidStoreSelection)); + + iTargetStore = (*selected)[0]; + delete selected; + + iDriveSpaceCheck->SetStore( iTargetStore->StoreProperties().Uri() ); + iDriveSpaceCheck->DriveSpaceCheckL(); + // Get selected contacts + MVPbkContactLinkArray* links = + iNameListUiControl->SelectedContactsOrFocusedContactL(); + if ( links ) + { + CleanupDeletePushL(links); + // Create links that are not from target store + CreateLinkArrayL(*links); + CleanupStack::PopAndDestroy(); // links + + const TInt contactCount = iContactLinks->Count(); + if (contactCount == 0) + { + // Nothing to copy + ShowSelectedContactsInfoNoteL(); + iState = EPbk2CopyContactsCmdComplete; + } + if (contactCount == KOneSelected) + { + iState = EPbk2CopyContactsCmdRetrieve; + } + else if (contactCount > KOneSelected) + { + iState = EPbk2CopyContactsCmdCopy; + } + } + else + { + iState = EPbk2CopyContactsCmdComplete; + } + } + else + { + // UI control doenst exist anymore, end + iState = EPbk2CopyContactsCmdComplete; + } + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::RetrieveL +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::RetrieveL() + { + iRetrieveOperation = + iAppServices-> + ContactManager().RetrieveContactL((*iContactLinks)[0], + *this ); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::StartCopyL +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::StartCopyL() + { + if ( !iCopier ) + { + iCopier = CVPbkContactCopier::NewL( iAppServices->ContactManager() ); + } + + if ( !iCopiedContacts ) + { + iCopiedContacts = CVPbkContactLinkArray::NewL(); + } + + // Start copying + + if (iNameListUiControl) + { + // Blank UI control to avoid flicker + iNameListUiControl->SetBlank( ETrue ); + + // If find is NOT active then save focus. Copying will cause + // the UI control to reset find text and focus. Otherwise the focus + // must be kept over the copying process. + if ( iNameListUiControl->FindTextL().Length() == 0 && + !iFocusedContactBookmark ) + { + const MVPbkBaseContact* cnt = + iNameListUiControl->FocusedContactL(); + if ( cnt ) + { + iFocusedContactBookmark = cnt->CreateBookmarkLC(); + CleanupStack::Pop(); + } + } + } + + // Copy command doesn't need resulted contact links + iCopiedContacts->ResetAndDestroy(); + iCopyOperation = iCopier->CopyContactsL( + CVPbkContactCopier::EVPbkUsePlatformSpecificDuplicatePolicy, + *iContactLinks, iTargetStore, *iCopiedContacts, *this ); + + iDecorator->ProcessStartedL(iContactLinks->Count()); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::ShowResultsL +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::ShowResultsL() + { + const TInt contactCount = iContactLinks->Count(); + if (iContact) + { + HBufC* title = + iAppServices->NameFormatter(). + GetContactTitleL( + iContact->Fields(), + MPbk2ContactNameFormatter::EPreserveLeadingSpaces); + CleanupStack::PushL(title); + TPbk2CopyContactsResults results(iCopiedSuccessfully, *title); + results.ShowNoteL(); + CleanupStack::PopAndDestroy(title); + } + else + { + TPbk2CopyContactsResults results( + iCopiedSuccessfully, iContactLinks->Count()); + results.ShowNoteL(); + } + iState = EPbk2CopyContactsCmdComplete; + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::FinishCommandL +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::FinishCommandL() + { + // After the command is done, wake up the UI control. + if ( iNameListUiControl ) + { + iNameListUiControl->SetBlank( EFalse ); + // Reset find due to case that if contact was not really copied + // (=the target contact had already all the same fields) then + // UI control doesn't receive any events and find text is not + // reset by the UI control. + iNameListUiControl->ResetFindL(); + if ( iFocusedContactBookmark ) + { + // The focus must be set due to reason that when copying + // causes a merge of contact data (=editing contact) the names + // list UI control receives first 'removed' event that will set + // focus to incorrect place. + iNameListUiControl->SetFocusedContactL( + *iFocusedContactBookmark ); + } + + iNameListUiControl->UpdateAfterCommandExecution(); + } + + iCommandObserver->CommandFinished(*this); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::CreateLinkArrayL +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::CreateLinkArrayL + ( MVPbkContactLinkArray& aSelection ) + { + const TVPbkContactStoreUriPtr& targetUri = + iTargetStore->StoreProperties().Uri(); + const TInt count = aSelection.Count(); + for (TInt i = 0; i < count; ++i) + { + TVPbkContactStoreUriPtr uri = + aSelection[i].ContactStore().StoreProperties().Uri(); + if (targetUri.Compare(uri, + TVPbkContactStoreUriPtr::EContactStoreUriAllComponents) != 0) + { + iContactLinks->AppendL(aSelection[i].CloneLC()); + CleanupStack::Pop(); // created link + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::ShowSelectedContactsInfoNoteL +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::ShowSelectedContactsInfoNoteL() + { + HBufC* prompt = StringLoader::LoadLC(R_QTN_PHOB_NOTE_NO_COPY_TO_PHONE); + CAknInformationNote* dlg = new(ELeave) CAknInformationNote(ETrue); + dlg->ExecuteLD(*prompt); + CleanupStack::PopAndDestroy(prompt); + } + +// -------------------------------------------------------------------------- +// CPbk2CopyContactsCmd::HandleError +// -------------------------------------------------------------------------- +// +void CPbk2CopyContactsCmd::HandleError(TInt aError) + { + if (iNameListUiControl) + { + iNameListUiControl->SetBlank( EFalse ); + iNameListUiControl->UpdateAfterCommandExecution(); + } + + if (aError != KErrNone) + { + // Copy operation is responsible to stop operation + CCoeEnv::Static()->HandleError(aError); + + iDecorator->ProcessStopped(); + } + iCommandObserver->CommandFinished(*this); + } + +// End of File