diff -r 000000000000 -r 72b543305e3a email/imum/Mtms/Src/Imap4CopyMoveLocalOp.cpp --- /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 +#include + +#include "Imap4CopyMoveLocalOp.h" +#include "Imap4FetchOp.h" +#include "EmailMsgSizerOperation.h" +#include "EmailUtils.H" +#include "ImumDisconnectOperation.h" +#include +#include +#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; countAppendL(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(); + } +