diff -r 000000000000 -r 72b543305e3a email/imum/Mtms/Src/Imap4FetchAttachmentOp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imum/Mtms/Src/Imap4FetchAttachmentOp.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,174 @@ +/* +* 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: +* Fetch attachments +* +*/ + + +#include +#include + +#include "Imap4FetchAttachmentOp.h" +#include "EmailMsgSizerOperation.h" +#include "EmailUtils.H" +#include "ImumDisconnectOperation.h" +#include +#include "IMAPPRGR.H" +#include "ImumMtmLogging.h" +#include "ImumPanic.h" + + +CImap4FetchAttachmentOp* CImap4FetchAttachmentOp::NewL( + CImumInternalApi& aMailboxApi, + TRequestStatus& aStatus, + MMsvProgressReporter& aReporter, + TMsvId aService, + const CMsvEntrySelection& aSel) + { + IMUM_STATIC_CONTEXT( CImap4FetchAttachmentOp::NewL, 0, mtm, KImumMtmLog ); + IMUM_IN(); + + CImap4FetchAttachmentOp* op = new(ELeave) CImap4FetchAttachmentOp( + aMailboxApi, aStatus, aReporter, aService); + CleanupStack::PushL(op); + op->ConstructL(aSel); + CleanupStack::Pop(); + IMUM_OUT(); + return op; + } + +CImap4FetchAttachmentOp::~CImap4FetchAttachmentOp() + { + IMUM_CONTEXT( CImap4FetchAttachmentOp::~CImap4FetchAttachmentOp, 0, KImumMtmLog ); + IMUM_IN(); + IMUM_OUT(); + + delete iSelection; + } + +void CImap4FetchAttachmentOp::DoConnectedOpL() + { + IMUM_CONTEXT( CImap4FetchAttachmentOp::DoConnectedOpL, 0, KImumMtmLog ); + IMUM_IN(); + + delete iOperation; + iOperation = NULL; + // iOperation is set in base class function InvokeClientMtmAsyncFunctionL + TPckgBuf optionsBuf; + TImImap4GetMailInfo& options = optionsBuf(); + options.iMaxEmailSize = KMaxTInt32; + options.iGetMailBodyParts = EGetImap4EmailAttachments; + options.iDestinationFolder = 0; // not used with fetch attachment operation + InvokeClientMtmAsyncFunctionL( + KIMAP4MTMPopulate, *iSelection, iService, optionsBuf); + SetActive(); + IMUM_OUT(); + } + +const TDesC8& CImap4FetchAttachmentOp::ConnectedOpErrorProgressL(TInt aError) + { + IMUM_CONTEXT( CImap4FetchAttachmentOp::ConnectedOpErrorProgressL, 0, KImumMtmLog ); + IMUM_IN(); + + __ASSERT_DEBUG(iState==EStateDoingOp || iState==EStateIdle, + User::Panic(KImumMtmUiPanic,EPanicWrongStateForOpErrorProgress)); + iUiProgress().iError=aError; + IMUM_OUT(); + return iUiProgress; + } + +const TDesC8& CImap4FetchAttachmentOp::ProgressL() + { + IMUM_CONTEXT( CImap4FetchAttachmentOp::ProgressL, 0, KImumMtmLog ); + IMUM_IN(); + + if(iState!=EStateDoingOp) + { + IMUM_OUT(); + return CImap4ConnectedOp::ProgressL(); + } + else + { + TPckgBuf fetchProgressBuf; + fetchProgressBuf.Copy(iOperation->ProgressL()); + const TImap4CompoundProgress& opProgress=fetchProgressBuf(); + TImap4UiProgress& uiProgress=iUiProgress(); + uiProgress.iBytesToDo=opProgress.iGenericProgress.iBytesToDo; + uiProgress.iBytesDone=opProgress.iGenericProgress.iBytesDone; + uiProgress.iError=fetchProgressBuf().iGenericProgress.iErrorCode; + IMUM_OUT(); + return iUiProgress; + } + } + +CImap4FetchAttachmentOp::CImap4FetchAttachmentOp( + CImumInternalApi& aMailboxApi, + TRequestStatus& aStatus, + MMsvProgressReporter& aReporter, + TMsvId aService) + : + CImap4ConnectedOp(aMailboxApi, aStatus, aReporter, aService) + { + IMUM_CONTEXT( CImap4FetchAttachmentOp::CImap4FetchAttachmentOp, 0, KImumMtmLog ); + IMUM_IN(); + + iConnectionCompletionState = CImapConnectionOp::ECompleteAfterConnect; + // Don't do a sync. + TImap4UiProgress uiProgress; + uiProgress.iUiOperation=TImap4UiProgress::EFetchingAttachment; + // Used during fetch stage to differentiate from + iUiProgress()=uiProgress; + // standard message fetch. + IMUM_OUT(); + } + +void CImap4FetchAttachmentOp::ConstructL(const CMsvEntrySelection& aSel) + { + IMUM_CONTEXT( CImap4FetchAttachmentOp::ConstructL, 0, KImumMtmLog ); + IMUM_IN(); + + __ASSERT_DEBUG(aSel.Count(), + User::Panic(KImumMtmUiPanic,EPanicSelectionEmpty)); + if ( aSel.Count() == 0 ) + { + User::Leave( KErrNotSupported ); + } + iSelection = aSel.CopyL(); + BaseConstructL(KUidMsgTypeIMAP4); + + // Get message size. + CMsvEntry* centry = iMsvSession.GetEntryL(aSel[0]); + TInt32 msgSize = centry->Entry().iSize; + delete centry; + + // Check message size. + if ( MsvEmailMtmUiUtils::CheckAvailableDiskSpaceForDownloadL( + msgSize, *iEikEnv, iMsvSession ) ) + { + StartL(); + } + else + { + // Not enough disk space or memory. + // User already notified, so 'this' op completes without error. + CompleteThis(); + iState = EStateDisconnecting; + + SetActive(); + } + IMUM_OUT(); + } + +