email/mail/ViewerSrc/MsgMailViewerRemoveAttachment.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/ViewerSrc/MsgMailViewerRemoveAttachment.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,269 @@
+/*
+* Copyright (c) 2002 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:  E-mail attachment remove operation.
+*
+*/
+
+
+// INCLUDE FILES
+#include <miutset.h> // KUidMsgTypeIMAP4
+#include <cacheman.h> // CImPruneMessage
+#include <eikenv.h>   // CEikonEnv
+#include <mmsvattachmentmanager.h>
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS  
+#include <cimprunemessage.h>
+#endif
+
+
+
+#include "MailLog.h"
+#include "MsgMailViewerRemoveAttachment.h"
+#include "CMailMessage.h"
+
+enum TLoadState
+        {
+        EChangeStatus = 1,
+        EDeleteAttachment,
+        EChangeAttachmentEntryStatus,
+        EAllDone        
+        };
+// ================= MEMBER FUNCTIONS =======================
+
+// Constructor
+CMsgMailViewerRemoveAttachmentOp::CMsgMailViewerRemoveAttachmentOp(
+    CMsvSession& aMsvSession, TRequestStatus& aObserverRequestStatus,
+    TMsvId aMsgID)
+    : CMsvOperation(aMsvSession, EPriorityStandard, aObserverRequestStatus)
+    {
+    CActiveScheduler::Add(this);
+    iMtm = KUidMsgTypeIMAP4; // operation possible only for IMAP messages
+    iMsgID = aMsgID;
+    iState = EDeleteAttachment;
+    }
+
+   
+// 2nd phase constructor
+inline void CMsgMailViewerRemoveAttachmentOp::ConstructL(
+    const TMsvId aAttachmentId)
+    {
+    LOG("CMsgMailViewerRemoveAttachmentOp::ConstructL");
+    iCentry = iMsvSession.GetEntryL(iMsgID);
+        
+    iMsgEntry = iMsvSession.GetEntryL(aAttachmentId);
+    
+    iPruneMsg = CImPruneMessage::NewL(*iMsgEntry, 
+        iMsvSession.FileSession());
+    
+    iPruneMsg->StartL(aAttachmentId, iStatus);
+    iObserverRequestStatus = KRequestPending;
+    
+    SetActive();
+    }
+
+inline void CMsgMailViewerRemoveAttachmentOp::ConstructL(
+    CMailMessage& aMailMessage, TMsvAttachmentId aAttachmentId )
+    {
+    LOG("CMsgMailViewerRemoveAttachmentOp::ConstructL 2");
+    aMailMessage.AttachmentManager().RemoveAttachmentL(
+        aAttachmentId, iStatus );
+    iState = EAllDone;    
+    iObserverRequestStatus = KRequestPending;
+
+    SetActive();
+    }    
+
+
+// Symbian OS constructor
+CMsgMailViewerRemoveAttachmentOp* 
+CMsgMailViewerRemoveAttachmentOp::NewLC(CMsvSession& aMsvSession, 
+    TRequestStatus& aObserverRequestStatus, const TMsvId aAttachmentId,
+    TMsvId aMsgID)
+    {
+    CMsgMailViewerRemoveAttachmentOp *op = new(ELeave) 
+        CMsgMailViewerRemoveAttachmentOp(
+            aMsvSession, aObserverRequestStatus, aMsgID);
+    CleanupStack::PushL(op);
+    
+    op->ConstructL(aAttachmentId);
+    return op;
+    }
+    
+     
+CMsgMailViewerRemoveAttachmentOp*  CMsgMailViewerRemoveAttachmentOp::NewL(
+    CMailMessage& aMailMessage, 
+    TRequestStatus& aObserverRequestStatus, 
+    TMsvAttachmentId aAttachmentId )
+    {
+    CMsgMailViewerRemoveAttachmentOp *op = 
+        new( ELeave ) CMsgMailViewerRemoveAttachmentOp(
+        *aMailMessage.Session(), aObserverRequestStatus, 0 );
+    CleanupStack::PushL(op);
+    
+    op->ConstructL( aMailMessage, aAttachmentId );
+    CleanupStack::Pop( op );
+        
+    return op;
+    }    
+
+
+// Destructor
+CMsgMailViewerRemoveAttachmentOp::~CMsgMailViewerRemoveAttachmentOp()
+    {
+    LOG("CMsgMailViewerRemoveAttachmentOp destructor");
+    
+    Cancel();
+    delete iMsvOp;
+    delete iMsgEntry;
+    delete iPruneMsg;
+    delete iCentry;
+    }
+    
+// Returns progress of the operation using TMsvLocalOperationProgress
+const TDesC8& CMsgMailViewerRemoveAttachmentOp::ProgressL()
+    {
+    return iProgress;
+    }
+
+// Cancels outstanding operation
+void CMsgMailViewerRemoveAttachmentOp::DoCancel()
+    {
+    LOG("CMsgMailViewerRemoveAttachmentOp::DoCancel");
+    if(iPruneMsg)
+        {
+        iPruneMsg->Cancel();
+        iProgress().iError = KErrCancel;
+        }
+    
+    if(iMsvOp)
+        {
+        iMsvOp->Cancel();
+        iProgress().iError = KErrCancel;
+        }
+    
+    }
+
+// Handles an active object’s request completion event
+void CMsgMailViewerRemoveAttachmentOp::RunL()
+    {
+    LOG("CMsgMailViewerRemoveAttachmentOp::RunL");
+    delete iMsvOp;
+    iMsvOp = NULL;
+    
+    switch(iState)
+        {
+        case EDeleteAttachment:
+            LOG("RunL: EDeleteAttachment");
+            iState = EChangeStatus;
+            break;
+        
+        case EChangeStatus:
+            LOG("RunL: EChangeStatus");
+            iState = EChangeAttachmentEntryStatus;
+            break;
+        
+        case EChangeAttachmentEntryStatus:
+            LOG("RunL: EChangeAttachmentEntryStatus");
+            iState = EAllDone;
+            break;            
+        
+        default:
+            LOG("RunL: default");
+            break;
+        }
+    
+    DoNextStateL();        
+    }
+    
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerRemoveAttachmentOp::DoNextStateL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerRemoveAttachmentOp::DoNextStateL()
+    {
+    LOG("CMsgMailViewerRemoveAttachmentOp::DoNextState");
+    TRequestStatus* status;
+    
+    switch(iState)
+        {
+        case EChangeStatus:
+            LOG("EChangeStatus");
+            UpdateStatusL();
+            SetActive();
+            break;
+        case EChangeAttachmentEntryStatus:
+            LOG("EChangeAttachmentEntryStatus");
+            UpdateAttachmentStatusL();
+            SetActive();
+            break;              
+        case EAllDone:
+            LOG("EAllDone");
+            iProgress().iError = iStatus.Int();
+            status = &iObserverRequestStatus;
+            User::RequestComplete(status, KErrNone);
+            break;
+        default:
+            LOG1("CMsgMailViewerRemoveAttachmentOp::DoNextState:False State%d",
+                iState);
+            break;
+        
+        }
+    
+    }
+// ----------------------------------------------------------------------------
+// CMsgMailViewerRemoveAttachmentOp::UpdateAttachmentStatusL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerRemoveAttachmentOp::UpdateAttachmentStatusL()
+    {
+    TMsvEntry attachment = iMsgEntry->Entry();
+    
+    //Set attachment entry as not comleted
+    attachment.SetComplete( EFalse );
+    
+    ASSERT( iMsvOp == NULL );         
+    iMsvOp = iMsgEntry->ChangeL(attachment, iStatus);
+    }
+
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerRemoveAttachmentOp::UpdateStatusL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerRemoveAttachmentOp::UpdateStatusL()
+    {
+    TMsvEntry tentry = iCentry->Entry();
+    ASSERT( tentry.iType == KUidMsvMessageEntry );    
+    //Set entry as not comleted
+    tentry.SetComplete(EFalse);
+    ASSERT( iMsvOp == NULL );    
+    iMsvOp = iCentry->ChangeL(tentry, iStatus);
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailViewerRemoveAttachmentOp::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CMsgMailViewerRemoveAttachmentOp::RunError(TInt aError)
+    {
+    Cancel();    
+    
+    iProgress().iError = aError;
+    
+    // ActiveSheduler Panics if this returns != KErrNone
+    return KErrNone;
+    }
+
+// End of File