email/imum/Mtms/Src/Imap4CopyMoveLocalOp.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Mtms/Src/Imap4CopyMoveLocalOp.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,282 @@
+/*
+* 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: 
+*       Copy or move a selection of messages that may or may not be complete
+*
+*/
+
+
+#include <eikenv.h>
+#include <eikrutil.h>
+
+#include "Imap4CopyMoveLocalOp.h"
+#include "Imap4FetchOp.h"
+#include "EmailMsgSizerOperation.h"
+#include "EmailUtils.H"
+#include "ImumDisconnectOperation.h"
+#include <imum.rsg>
+#include <imapcmds.h>
+#include "IMAPPRGR.H"
+#include "ImumMtmLogging.h"
+#include "ImumPanic.h"
+#include "IMSSettingsNoteUi.h"
+
+const TInt KCopyMoveLocalOpPriority = CActive::EPriorityStandard;
+
+
+CImap4CopyMoveLocalOp* CImap4CopyMoveLocalOp::NewL(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aStatus,
+    MMsvProgressReporter& aReporter,
+    const CMsvEntrySelection& aSel,
+    TMsvId aTargetId,
+    TBool aCopy)
+    {
+    IMUM_STATIC_CONTEXT( CImap4CopyMoveLocalOp::NewL, 0, mtm, KImumMtmLog );
+    IMUM_IN();
+    
+    CImap4CopyMoveLocalOp* op = new(ELeave) CImap4CopyMoveLocalOp(
+        aMailboxApi, aStatus, aReporter, aTargetId, aCopy);
+    CleanupStack::PushL(op);
+    op->ConstructL(aSel);
+    CleanupStack::Pop();
+    IMUM_OUT();
+    return op;
+    }
+
+CImap4CopyMoveLocalOp::~CImap4CopyMoveLocalOp()
+    {
+    IMUM_CONTEXT( CImap4CopyMoveLocalOp::~CImap4CopyMoveLocalOp, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    delete iLocalSel;
+    delete iRemoteSel;
+    IMUM_OUT();
+    }
+
+const TDesC8& CImap4CopyMoveLocalOp::GetErrorProgressL(TInt aError)
+    {
+    IMUM_CONTEXT( CImap4CopyMoveLocalOp::GetErrorProgressL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    // Called to report a leave in DoRunL()
+    if(!iProgressBuf().iGenericProgress.iErrorCode)
+        {
+        TImap4CompoundProgress& prog = iProgressBuf();
+        if(iCopying)
+            {
+            prog.iGenericProgress.iOperation = TImap4GenericProgress::ECopyToLocal;
+            prog.iGenericProgress.iState = TImap4GenericProgress::ECopying;
+            }
+        else
+            {
+            prog.iGenericProgress.iOperation = TImap4GenericProgress::EMoveToLocal;
+            prog.iGenericProgress.iState = TImap4GenericProgress::EMoving;
+            }
+
+        prog.iGenericProgress.iErrorCode = aError;
+        }
+    IMUM_OUT();
+    return iProgressBuf;
+    }
+
+void CImap4CopyMoveLocalOp::DoRunL()
+    {
+    IMUM_CONTEXT( CImap4CopyMoveLocalOp::DoRunL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    TInt returnValue( KErrNone );
+    switch(iState)
+        {
+        case ELocalMsgs:
+            // Local copy complete
+            returnValue = GetOperationCompletionCodeL();
+            if( returnValue != KErrNone )
+                {
+                // Failed to copy local messages.
+                iState = EIdle;
+                CompleteObserver( returnValue );
+                }
+            else
+                {
+                DoRemoteFetchL();
+                }
+            break;
+        case ERemoteMsgs:
+            // Remote fetch complete.
+            iState = EIdle;
+            CompleteObserver();
+            break;
+        case EIdle:
+        default:
+            break;
+        }
+    IMUM_OUT();
+    }
+
+CImap4CopyMoveLocalOp::CImap4CopyMoveLocalOp(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aStatus,
+    MMsvProgressReporter& aReporter,
+    TMsvId aTargetId,
+    TBool aCopy)
+    :
+    CImumDiskSpaceObserverOperation(aMailboxApi, KCopyMoveLocalOpPriority, aStatus, aReporter),
+    iCopying(aCopy),
+    iTarget(aTargetId)
+    {
+    IMUM_CONTEXT( CImap4CopyMoveLocalOp::CImap4CopyMoveLocalOp, 0, KImumMtmLog );
+    IMUM_IN();
+    IMUM_OUT();
+    
+    }
+
+void CImap4CopyMoveLocalOp::ConstructL(const CMsvEntrySelection& aSel)
+    {
+    IMUM_CONTEXT( CImap4CopyMoveLocalOp::ConstructL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    __ASSERT_DEBUG(aSel.Count(),
+        User::Panic(KImumMtmUiPanic,EPanicSelectionEmpty));
+    if ( aSel.Count() == 0 )
+        {
+        User::Leave( KErrNotSupported );
+        }
+    BaseConstructL(KUidMsgTypeIMAP4);
+    CMsvEntry* centry = iMsvSession.GetEntryL(aSel[0]);
+    iService = centry->OwningService();
+    delete centry;
+    SortMessageSelectionL(aSel);
+    DoLocalCopyMoveL();
+    IMUM_OUT();
+    }
+
+void CImap4CopyMoveLocalOp::SortMessageSelectionL(const CMsvEntrySelection& aSel)
+    {
+    IMUM_CONTEXT( CImap4CopyMoveLocalOp::SortMessageSelectionL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    // Sort messages into complete and incomplete selections.
+    __ASSERT_DEBUG(!iLocalSel,
+        User::Panic(KImumMtmUiPanic,EPanicSelAlreadyCreated));
+    iLocalSel = new(ELeave) CMsvEntrySelection;
+    __ASSERT_DEBUG(!iRemoteSel,
+        User::Panic(KImumMtmUiPanic,EPanicSelAlreadyCreated));
+    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();
+    }
+
+void CImap4CopyMoveLocalOp::DoLocalCopyMoveL()
+    {
+    IMUM_CONTEXT( CImap4CopyMoveLocalOp::DoLocalCopyMoveL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    iState = ELocalMsgs;
+    iStatus = KRequestPending;
+    if(iLocalSel->Count())
+        {
+        CMsvEntry* centry = iMsvSession.GetEntryL((*iLocalSel)[0]);
+        CleanupStack::PushL(centry);
+        TMsvId parent = centry->Entry().Parent();
+        centry->SetEntryL(parent);
+        __ASSERT_DEBUG(!iOperation,
+            User::Panic(KImumMtmUiPanic,EPanicOpAlreadySet));
+        delete iOperation;
+        iOperation = NULL;
+        iOperation = MsvEmailMtmUiUtils::DoCEntryCopyMoveL(
+            *centry, *iLocalSel, iTarget, iStatus, iCopying);
+        CleanupStack::PopAndDestroy(); // centry
+        }
+    else
+        {
+        CompleteThis();
+        }
+    SetActive();
+    IMUM_OUT();
+    }
+
+void CImap4CopyMoveLocalOp::DoRemoteFetchL()
+    {
+    IMUM_CONTEXT( CImap4CopyMoveLocalOp::DoRemoteFetchL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    TInt numMsgs = iRemoteSel->Count();
+    iState = ERemoteMsgs;
+    if(numMsgs)
+        {
+        CMsvEntry* centry = iMsvSession.GetEntryL(iService);
+        TBool doIt = centry->Entry().Connected();
+        delete centry;
+        if(!doIt)
+            {
+            numMsgs += iLocalSel->Count();
+            iReporter.MakeProgressVisibleL(EFalse);
+
+            // Prompt user before connecting.
+            TInt queryResouce =  numMsgs > 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);
+            iStatus = KRequestPending;
+            delete iOperation;
+            iOperation = NULL;
+            TImImap4GetMailInfo getMailInfo;
+            getMailInfo.iMaxEmailSize = KMaxTInt32;
+            getMailInfo.iGetMailBodyParts = EGetImap4EmailBodyTextAndAttachments;
+            getMailInfo.iDestinationFolder = iTarget;
+
+            iOperation = CImap4FetchOp::NewL(
+                iMailboxApi,
+                iStatus,
+                iReporter,
+                iService,
+                (iCopying?KIMAP4MTMCopyMailSelectionWhenAlreadyConnected:KIMAP4MTMMoveMailSelectionWhenAlreadyConnected),
+                getMailInfo,
+                *iRemoteSel);
+            }
+        }
+    if(iStatus != KRequestPending)
+        {
+        CompleteThis();
+        }
+    SetActive();
+    IMUM_OUT();
+    }
+