phonebookui/Phonebook2/CommandsExtension/src/CPbk2CopyContactsCmd.cpp
changeset 0 e686773b3f54
child 3 04ab22b956c2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/CommandsExtension/src/CPbk2CopyContactsCmd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,567 @@
+/*
+* 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 <MPbk2CommandObserver.h>
+#include <MPbk2ContactUiControl.h>
+#include <Pbk2ProcessDecoratorFactory.h>
+#include <Pbk2Commands.rsg>
+#include <MPbk2ContactNameFormatter.h>
+#include <CPbk2DriveSpaceCheck.h>
+#include <CPbk2AppUiBase.h>
+#include <CPbk2ApplicationServices.h>
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <CVPbkContactLinkArray.h>
+#include <CVPbkContactCopier.h>
+#include <MVPbkContactOperationBase.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactStoreProperties.h>
+#include <MVPbkContactLink.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactBookmark.h>
+
+// System includes
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <coemain.h>
+
+/// 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<MVPbkContactStore>* 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();
+        }
+    }
+
+//  End of File