email/imum/Mtms/Src/Imap4FetchAttachmentOp.cpp
changeset 0 72b543305e3a
--- /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 <eikenv.h>
+#include <eikrutil.h>
+
+#include "Imap4FetchAttachmentOp.h"
+#include "EmailMsgSizerOperation.h"
+#include "EmailUtils.H"
+#include "ImumDisconnectOperation.h"
+#include <imapcmds.h>
+#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<TImImap4GetMailInfo> 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<TImap4CompoundProgress> 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();
+    }
+
+