diff -r 000000000000 -r 72b543305e3a email/imum/Mtms/Src/MsvPop3CopyMoveOperation.cpp --- /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 +#include +#include +#include + +#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; countAppendL(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(); + } +