diff -r ebe688cedc25 -r 7fdbb852d323 email/mail/EditorSrc/cmsgmailfetchfileop.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/mail/EditorSrc/cmsgmailfetchfileop.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -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 +#include +#include +#include + +// 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