email/mail/EditorSrc/cmsgmailfetchfileop.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/EditorSrc/cmsgmailfetchfileop.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,363 @@
+/*
+* Copyright (c) 2002-2007 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: State machine -based operation for fetching files as attachments.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "cmsgmailfetchfileop.h"
+#include "MsgMailEditorDocument.h"
+#include "MailLog.h"
+#include "Msgattachmentverifier.h"
+#include "cmsgmailrestoresuperop.h"
+#include "MailUtils.h"
+#include <MsgEditorAppUi.rsg>
+#include <MsgMailEditor.rsg>
+#include <coemain.h>
+#include <mmsvattachmentmanager.h>
+
+// LOCAL CONSTANT
+
+// appoximated 3 attachments / message
+const TInt KFetchFileGranularity = 3;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::CMsgMailFetchFileOp
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMsgMailFetchFileOp::CMsgMailFetchFileOp(
+    MsgAttachmentUtils::TMsgAttachmentFetchType aFetchType,
+    CMsgMailEditorDocument& aDocument )
+    : CMsgMailBaseOp( aDocument ),
+      iFetchType( aFetchType )
+    {
+    //We set a higher priority to fetch op so that touch events won´t get
+    //leaked to editors toolbar
+    SetPriority( EActivePriorityWsEvents + 1 );
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::ConstructL()
+    {
+    LOG( "CMsgMailFetchFileOp::ConstructL" );
+    iFetchArray = new( ELeave ) CDesCArrayFlat( KFetchFileGranularity );
+    iManager = &( iDocument.GetAttachmentManagerL() );
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMsgMailFetchFileOp* CMsgMailFetchFileOp::NewL(
+    MsgAttachmentUtils::TMsgAttachmentFetchType aFetchType,
+    CMsgMailEditorDocument& aDocument )
+    {
+    CMsgMailFetchFileOp* self =
+        new( ELeave ) CMsgMailFetchFileOp( aFetchType, aDocument );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// Destructor
+CMsgMailFetchFileOp::~CMsgMailFetchFileOp()
+    {
+    LOG( "CMsgMailFetchFileOp::~CMsgMailFetchFileOp" );
+    if( iBlocker )
+        {
+		// iBlocker is deleted in AknInputBlockCancel
+        iBlocker->Cancel();
+        }
+    Cancel();
+    delete iFetchArray;
+    delete iRestoreSuperOp;
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::HandleStateActionL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::HandleStateActionL()
+    {
+    switch ( iState )
+        {
+        case ESelectFiles:
+            {
+            SelectFilesL();
+            break;
+            }
+        case EAddAttas:
+            {
+            AddAttasL();
+            break;
+            }
+        case ERestoreAllAttas:
+            {
+            RestoreAllAttasL();
+            break;
+            }
+        case EFinalize:
+            {
+            FinalizeL();
+            break;
+            }
+        default:
+            {
+            // should never come here
+            ASSERT( EFalse );
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::SetNextState
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::SetNextState()
+    {
+    switch ( iState )
+        {
+        case EIdleState:
+            {
+            iState = ESelectFiles;
+            break;
+            }
+        case ESelectFiles:
+            {
+            iState = EAddAttas;
+            break;
+            }
+        case EAddAttas:
+            {
+            iState = ERestoreAllAttas;
+            break;
+            }
+        case ERestoreAllAttas:
+            {
+            iState = EFinalize;
+            break;
+            }
+        case EFinalize:
+        default:
+            {
+            iState = EIdleState;
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::HandleOperationCancel
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::HandleOperationCancel()
+    {
+    LOG( "CMsgMailFetchFileOp::HandleOperationCancel, deleting iRestoreSuperOp" );
+    if( iBlocker )
+        {
+        iBlocker->Cancel();
+        }
+    delete iRestoreSuperOp;
+    iRestoreSuperOp = NULL;
+    if ( iState == EAddAttas )
+        {
+        // cancel possibly ongoing AddAttachmentL() request, doesn't do
+        // anything if request isn't outstanding
+        LOG( "HandleOperationCancel, cancel manager's request" );
+        iManager->CancelRequest();
+        }
+    LOG( "HandleOperationCancel, ...finished" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::AknInputBlockCancel
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::AknInputBlockCancel()
+    {
+    delete iBlocker;
+    iBlocker = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::SelectFilesL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::SelectFilesL()
+    {
+    TInt fetchResult( EFalse );
+
+    // starting phase -> initialize operation data
+    iFetchCount = 0;
+    iFileName = KNullDesC;
+    iFetchArray->Reset();
+
+    CMsgAttachmentVerifier* verifier =
+        CMsgAttachmentVerifier::NewLC( iDocument.Session() );
+
+    if ( iFetchType == MsgAttachmentUtils::EUnknown )
+    	{
+    	if ( MsgAttachmentUtils::FetchAnyFileL( iFileName,
+    	                                        *( CCoeEnv::Static() ),
+    	                                        verifier ) )
+    	    {
+    	    fetchResult = ETrue;
+    	    iFetchCount = 1;
+    	    }
+    	}
+    else
+    	{
+    	fetchResult = MsgAttachmentUtils::FetchFileL( iFetchType,
+                                        iFileName,
+    	                                *iFetchArray,
+    	                                ETrue,
+    	                                EFalse,
+    	                                verifier );
+    	iFetchCount = iFetchArray->Count();
+       	}
+	// Check fetch results. EFalse if user cancels the fetch.
+    if ( fetchResult == EFalse )
+        {
+        User::Leave( KErrCancel );
+        }
+    CleanupStack::PopAndDestroy( verifier ); // verifier
+    CompleteStateAction();
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::AddAttasL
+// In current implementation multiple attachments are added as a one step, and
+// failure with one attachment interrupts entire procedure.
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::AddAttasL()
+    {
+    StartWaitNoteL( R_WAIT_INSERTING_ATTACHMENT, EFalse, R_MEB_WAIT_NOTE );
+    ASSERT( iFetchCount > 0 ); // op was cancelled if nothing was selected
+    
+	if( iBlocker )
+        {
+        iBlocker->Cancel();
+        }
+    // NewL version does not exist
+    iBlocker = CAknInputBlock::NewCancelHandlerLC( this ); 
+    CleanupStack::Pop( iBlocker );
+
+    if ( iFetchCount > 1 )
+    	{
+    	AddMultipleAttachmentsL( *iFetchArray, iDocument, iStatus );
+    	}
+    else
+        {
+        AddSingleAttachmentL( iFileName, iDocument, iStatus );
+        }
+    SetActive();
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::RestoreAllAttasL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::RestoreAllAttasL()
+    {
+    delete iRestoreSuperOp;
+    iRestoreSuperOp = NULL;
+    iRestoreSuperOp = CMsgMailRestoreSuperOp::NewL( iDocument );
+    iRestoreSuperOp->StartOp( iStatus );
+    SetActive();
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::FinalizeL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::FinalizeL()
+    {
+    StopWaitNote();
+    if( iBlocker )
+        {
+        iBlocker->Cancel();
+        }
+    
+    TBool invalidAttas = iRestoreSuperOp->ShowNoteIfInvalidAttaL();
+    TBool drmAttas = iRestoreSuperOp->ShowNoteIfDRMAttaL();
+    if ( !invalidAttas && !drmAttas )
+        { // Restore operation reported no problems so we determine that the
+          // attachment was really added. Note that we actually restored ALL
+          // the attachments and some of them could have theoretically reported
+          // a problem, but in practise this should correctly indicate the
+          // success of attachment adding operation.
+        MailUtils::ConfirmationNoteL( R_MAIL_EDITOR_ADDED_ATTACH_TEXT );
+        }
+    CompleteStateAction();
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::AddMultipleAttachmentsL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::AddMultipleAttachmentsL(
+    CDesCArray& aAttachments,
+    CMsgMailEditorDocument& aDocument,
+    TRequestStatus& aStatus ) const
+    {
+    TInt count( aAttachments.Count() );
+    for ( TInt i( 0 ); i < count; i++ )
+        {
+        TPtrC attaName = aAttachments.MdcaPoint( i );
+        AddSingleAttachmentL( attaName, aDocument, aStatus );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMsgMailFetchFileOp::AddSingleAttachmentL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailFetchFileOp::AddSingleAttachmentL(
+    const TDesC& aAttachmentName,
+    CMsgMailEditorDocument& /*aDocument*/,
+    TRequestStatus& aStatus ) const
+    {
+    // Add attachment to message
+    TInt attaSize( MailUtils::FileSize( aAttachmentName ) );
+    User::LeaveIfError( attaSize );
+
+    CMsvAttachment* info = CMsvAttachment::NewL( CMsvAttachment::EMsvFile );
+    CleanupStack::PushL(info);
+
+    // info needs to be updated before attachment
+    // is saved to mail message.
+    // Mime type needs to be set later, see RestoreAttachmentsL
+    info->SetAttachmentNameL( aAttachmentName );
+    info->SetSize( attaSize );
+    iManager->AddAttachmentL( aAttachmentName, info, aStatus );
+    CleanupStack::Pop( info ); // info, ownership transferred
+    }
+
+// End Of File