email/imum/Mtms/Src/MsvPop3CopyMoveOperation.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Mtms/Src/MsvPop3CopyMoveOperation.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,313 @@
+/*
+* Copyright (c) 2006 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: 
+*       Operation to copy or move messages
+*
+*/
+
+#include <eikenv.h>
+#include <imum.rsg>
+#include <MsvPrgReporter.h>
+#include <ImumInMailboxUtilities.h>
+
+#include "MsvConnectionValidation.h"
+#include "MsvEmailConnectionProgressProvider.h"
+#include "EmailUtils.H"
+#include "ImumDisconnectOperation.h"
+#include "MsvPop3CopyMoveOperation.h"
+#include "MsvPop3FetchOperation.h"
+#include "IMSSettingsNoteUi.h"
+
+// Constants and defines
+const TInt KCopyOrMoveOpPriority = CActive::EPriorityStandard;
+
+
+// ----------------------------------------------------------------------------
+// NewL
+// ----------------------------------------------------------------------------
+CMsvPop3CopyMoveOperation* CMsvPop3CopyMoveOperation::NewL(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aObserverRequestStatus,
+    MMsvProgressReporter& aReporter,
+    TMsvId aService, TMsvId aTarget,
+    const CMsvEntrySelection& aSel,
+    TBool aMoveMsgs)
+    {
+    IMUM_STATIC_CONTEXT( CMsvPop3CopyMoveOperation::NewL, 0, mtm, KImumMtmLog );
+    IMUM_IN();
+     // static
+    CMsvPop3CopyMoveOperation* op = new(ELeave) CMsvPop3CopyMoveOperation(
+        aMailboxApi,
+        aObserverRequestStatus,
+        aReporter,
+        aService,
+        aTarget,
+        aMoveMsgs);
+    CleanupStack::PushL(op);
+    op->ConstructL(aSel);
+    CleanupStack::Pop();
+    IMUM_OUT();
+    return op;
+    }
+
+// ----------------------------------------------------------------------------
+// ~CMsvPop3CopyMoveOperation
+// ----------------------------------------------------------------------------
+CMsvPop3CopyMoveOperation::~CMsvPop3CopyMoveOperation()
+    {
+    IMUM_CONTEXT( CMsvPop3CopyMoveOperation::~CMsvPop3CopyMoveOperation, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    delete iLocalSel;
+    delete iRemoteSel;
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// DoRunL
+// ----------------------------------------------------------------------------
+void CMsvPop3CopyMoveOperation::DoRunL()
+    {
+    IMUM_CONTEXT( CMsvPop3CopyMoveOperation::DoRunL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    switch(iState)
+        {
+        case ELocalMsgs:
+            if(GetOperationCompletionCodeL() != KErrNone)
+                {
+                // Failed to copy local messages.
+                iState = EIdle;
+                CompleteObserver();
+                }
+            else
+                {
+                DoRemoteFetchL();
+                }
+            break;
+        case ERemoteMsgs:
+            iState = EIdle;
+            CompleteObserver();
+            break;
+        default:
+            break;
+        }
+    if(iOperation)
+        iMtm = iOperation->Mtm();
+    else
+        iMtm = KUidMsgTypePOP3;
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// GetErrorProgressL
+// ----------------------------------------------------------------------------
+const TDesC8& CMsvPop3CopyMoveOperation::GetErrorProgressL(TInt aError)
+    {
+    IMUM_CONTEXT( CMsvPop3CopyMoveOperation::GetErrorProgressL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    iError = aError;
+    switch(iState)
+        {
+        case ERemoteMsgs:
+            if(iOperation)
+                {
+                // iOperation is a CMsvPop3FetchOperation.
+                return STATIC_CAST(CImumOnlineOperation*,iOperation)->
+                    GetErrorProgressL(aError);
+                }
+            break;
+        case ELocalMsgs:
+        default:
+            break;
+        }
+    TPop3Progress& progress = iErrorProgress();
+    progress.iTotalMsgs = 0;
+    progress.iMsgsToProcess = 0;
+    progress.iBytesDone = 0;
+    progress.iTotalBytes = 0;
+    progress.iErrorCode = iError;
+    progress.iPop3Progress = (iMoving) ?
+        (TPop3Progress::EPopMoving) : (TPop3Progress::EPopCopying);
+    progress.iPop3SubStateProgress = progress.iPop3Progress;
+    IMUM_OUT();
+    return iErrorProgress;
+    }
+
+// ----------------------------------------------------------------------------
+// SortMessageSelectionL
+// ----------------------------------------------------------------------------
+void CMsvPop3CopyMoveOperation::SortMessageSelectionL(
+    const CMsvEntrySelection& aSel)
+    {
+    IMUM_CONTEXT( CMsvPop3CopyMoveOperation::SortMessageSelectionL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    // Sort messages into complete and incomplete selections.
+    delete iLocalSel;
+    iLocalSel = NULL;
+    iLocalSel = new(ELeave) CMsvEntrySelection;
+    delete iRemoteSel;
+    iRemoteSel = NULL;
+    iRemoteSel = new(ELeave) CMsvEntrySelection;
+
+    TInt err;
+    TMsvId id;
+    TMsvId service;
+    TMsvEntry tentry;
+    for(TInt count=0; count<aSel.Count(); count++)
+        {
+        id = aSel[count];
+        err = iMsvSession.GetEntry(id, service, tentry);
+        if(KErrNone == err)
+            {
+            if(tentry.Complete())
+                {
+                iLocalSel->AppendL(id);
+                }
+            else
+                {
+                iRemoteSel->AppendL(id);
+                }
+            }
+        }
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// DoLocalCopyMoveL
+// ----------------------------------------------------------------------------
+void CMsvPop3CopyMoveOperation::DoLocalCopyMoveL()
+    {
+    IMUM_CONTEXT( CMsvPop3CopyMoveOperation::DoLocalCopyMoveL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    if(iLocalSel->Count())
+        {
+        CMsvEntry* centry = iMsvSession.GetEntryL(iService);
+        CleanupStack::PushL(centry);
+        iStatus = KRequestPending;
+        delete iOperation;
+        iOperation = NULL;
+        iOperation = MsvEmailMtmUiUtils::DoCEntryCopyMoveL(
+            *centry,
+            *iLocalSel,
+            iTarget,
+            iStatus,
+            !iMoving);
+        CleanupStack::PopAndDestroy(); // centry
+        }
+    else
+        {
+        CompleteThis();
+        }
+    iState = ELocalMsgs;
+    SetActive();
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// DoRemoteFetchL
+// ----------------------------------------------------------------------------
+void CMsvPop3CopyMoveOperation::DoRemoteFetchL()
+    {
+    IMUM_CONTEXT( CMsvPop3CopyMoveOperation::DoRemoteFetchL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    TInt msgCount = iRemoteSel->Count();
+    if(msgCount)
+        {
+        CMsvEntry* centry = iMsvSession.GetEntryL(iService);
+        TBool doIt = centry->Entry().Connected();
+        delete centry;
+        if(!doIt)
+            {
+            // Prompt user before connecting.
+            iReporter.MakeProgressVisibleL(EFalse);
+            TInt queryResouce =  msgCount > 1 ?
+                R_EMAIL_FETCH_MESSAGES_BEFORE_COPY_QUERY :
+                R_EMAIL_FETCH_MESSAGE_BEFORE_COPY_QUERY;
+            doIt = CIMSSettingsNoteUi::ShowQueryL(
+                queryResouce, R_EMAIL_CONFIRMATION_QUERY );
+            }
+        if(doIt)
+            {
+            iReporter.MakeProgressVisibleL(ETrue);
+            TImPop3GetMailInfo info;
+            info.iMaxEmailSize = KMaxTInt32;
+            info.iDestinationFolder = iTarget;
+            TInt fnId = (iMoving) ? (KPOP3MTMMoveMailSelectionWhenAlreadyConnected) : (KPOP3MTMCopyMailSelectionWhenAlreadyConnected);
+            iStatus = KRequestPending;
+            delete iOperation;
+            iOperation = NULL;
+            iOperation = CMsvPop3FetchOperation::NewL(
+                iMailboxApi,
+                iStatus,
+                iReporter,
+                fnId,
+                iService,
+                info,
+                *iRemoteSel);
+            }
+        }
+    if(iStatus != KRequestPending)
+        {
+        CompleteThis();
+        }
+    iState = ERemoteMsgs;
+    SetActive();
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CMsvPop3CopyMoveOperation
+// ----------------------------------------------------------------------------
+CMsvPop3CopyMoveOperation::CMsvPop3CopyMoveOperation(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aObserverRequestStatus,
+    MMsvProgressReporter& aReporter,
+    TMsvId aService,
+    TMsvId aTarget,
+    TBool aMoveMsgs)
+    :
+    CImumDiskSpaceObserverOperation(
+        aMailboxApi,
+        KCopyOrMoveOpPriority,
+        aObserverRequestStatus,
+        aReporter),
+    iMoving(aMoveMsgs),
+    iTarget(aTarget)
+    {
+    IMUM_CONTEXT( CMsvPop3CopyMoveOperation::CMsvPop3CopyMoveOperation, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    iService = aService;
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// ConstructL
+// ----------------------------------------------------------------------------
+void CMsvPop3CopyMoveOperation::ConstructL(const CMsvEntrySelection& aSel)
+    {
+    IMUM_CONTEXT( CMsvPop3CopyMoveOperation::ConstructL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    SortMessageSelectionL(aSel);
+    BaseConstructL(KUidMsgTypePOP3);
+    DoLocalCopyMoveL();
+    IMUM_OUT();
+    }
+