--- /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