diff -r 0396474f30f5 -r 4ce476e64c59 meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrattachmentcommandhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrattachmentcommandhandler.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,880 @@ +/* +* Copyright (c) 2009 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: MR attahcment field implementation + * + */ + +#include "cmrattachmentcommandhandler.h" +#include "cmropenattachmentcommand.h" +#include "cmrremoveattachmentcommand.h" +#include "cmrsaveattachmentcommand.h" +#include "cmrsaveandopenattachmentcommand.h" +#include "cesmrrichtextlink.h" +#include "mcalremoteattachmentinfo.h" +#include "mcalremoteattachment.h" +#include "mcalremoteattachmentoperation.h" +#include "ccalremoteattachmentinfo.h" +#include "ccalremoteattachmentapi.h" +#include "cesmrgenericfieldevent.h" +#include "cesmrfieldcommandevent.h" +#include "mesmrfieldeventqueue.h" +#include "esmrdef.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +// DEBUG +#include "emailtrace.h" + + +// unnamed namespace for local definitions +namespace { // codescanner::namespace + +_LIT8( KUnknownDatatype, "unknown"); + +#if defined(_DEBUG) + +// Panic literal +_LIT( KMRAttachmentCommandHandler, "MRAttachmentCommandHandler" ); + +/** + * Panic codes + */ +enum TMRAttachmentCommandHandlerPanic + { + // Invalid command + EMRAttachmentCommandHandlerInvalidCommand, + // Attachment is not found + EMRAttachmentCommandHandlerAttachmentNotFound, + // Remote attachment information not set + EMRAttachmentCommandHandlerRemoteInfoNotSet, + // Remote command cannot be found + EMRAttachmentCommandHandlerRemoteCommandNotFound, + // Remote attachment is not found + EMRAttachmentCommandHandlerRemoteAttachmentNotFound + }; + +void Panic( TMRAttachmentCommandHandlerPanic aPanic ) + { + User::Panic( KMRAttachmentCommandHandler, aPanic ); + } + +#endif // _DEBUG + +/** + * Shows information note when one attachment is saved. + */ +void ShowInfoNoteL() + { + CAknGlobalNote* note = CAknGlobalNote::NewLC(); + HBufC* text = + StringLoader::LoadLC( R_MEET_REQ_INFO_NOTE_ONE_ATTACHMENT_SAVED ); + note->ShowNoteL( + EAknGlobalInformationNote, + *text ); + CleanupStack::PopAndDestroy( 2, note ); + } + +/** + * Shows information note when multiple attachments have been saved. + */ +void ShowInfoNoteL( TInt aAttachmentCount ) + { + CAknGlobalNote* note = CAknGlobalNote::NewLC(); + HBufC* text = StringLoader::LoadLC( + R_MEET_REQ_INFO_NOTE_MULTIPLE_ATTACHMENTS_SAVED, + aAttachmentCount ); + note->ShowNoteL( + EAknGlobalInformationNote, + *text ); + CleanupStack::PopAndDestroy( 2, note ); + } + +} // namespace + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::CMRAttachmentCommandHandler +// --------------------------------------------------------------------------- +// +CMRAttachmentCommandHandler::CMRAttachmentCommandHandler( + CCalEntry& aEntry, + MESMRFieldEventQueue& aEventQueue) : + iEntry( aEntry ), + iEventQueue( aEventQueue ) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::~CMRAttachmentCommandHandler +// --------------------------------------------------------------------------- +// +CMRAttachmentCommandHandler::~CMRAttachmentCommandHandler() + { + FUNC_LOG; + + iDownloadOperations.ResetAndDestroy(); + delete iDocHandler; + } + + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::NewL +// --------------------------------------------------------------------------- +// +CMRAttachmentCommandHandler* CMRAttachmentCommandHandler::NewL( + CCalEntry& aEntry, + MESMRFieldEventQueue& aEventQueue ) + { + FUNC_LOG; + + CMRAttachmentCommandHandler* self = + new (ELeave) CMRAttachmentCommandHandler( aEntry, aEventQueue ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::ConstructL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::ConstructL() + { + FUNC_LOG; + + iDocHandler = CDocumentHandler::NewL(); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::HandleAttachmentCommandL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::HandleAttachmentCommandL( + TInt aCommandId, + const CESMRRichTextLink& aSelectedLink ) + { + FUNC_LOG; + + TInt attachmentIndex( ResolveAttachmentIndexL( aSelectedLink.Value() ) ); + HandleAttachmentCommandInternalL( aCommandId, attachmentIndex ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::IsRemoteAttachmentL +// --------------------------------------------------------------------------- +// +TBool CMRAttachmentCommandHandler::IsRemoteAttachmentL( + const CESMRRichTextLink& aSelectedLink ) + { + FUNC_LOG; + + TInt index = ResolveAttachmentIndexL( aSelectedLink.Value() ); + + CCalAttachment* attachment = iEntry.AttachmentL( index ); + + TBool remoteAttachment( ETrue ); + + if ( CCalAttachment::EFile == attachment->Type() ) + { + remoteAttachment = EFalse; + } + + return remoteAttachment; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::SetRemoteAttachmentInformationL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::SetRemoteAttachmentInformationL( + CCalRemoteAttachmentApi& aRemoteAttaApi, + CCalRemoteAttachmentInfo& aAttachmentInfo ) + { + FUNC_LOG; + + iRemoteAttachmentApi = &aRemoteAttaApi; + iAttachmentInfo = &aAttachmentInfo; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::SetRemoteAttachmentInformationL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::HandleRemoteAttachmentCommandL( + TInt aCommandId, + const CESMRRichTextLink& aSelectedLink ) + { + FUNC_LOG; + + // Check that remote attachment information is being set + __ASSERT_DEBUG( + iRemoteAttachmentApi, + Panic(EMRAttachmentCommandHandlerRemoteInfoNotSet) ); + + __ASSERT_DEBUG( + iAttachmentInfo, + Panic(EMRAttachmentCommandHandlerRemoteInfoNotSet) ); + + HandleRemoteAttachmentCommandInternalL( + aCommandId, + aSelectedLink.Value() ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::RemoteOperations +// --------------------------------------------------------------------------- +// +RPointerArray& + CMRAttachmentCommandHandler::RemoteOperations() + { + FUNC_LOG; + return iDownloadOperations; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::CurrentCommandInProgress +// --------------------------------------------------------------------------- +// +TInt CMRAttachmentCommandHandler::CurrentCommandInProgress() const + { + FUNC_LOG; + + return iCommandInProgress; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::Progress +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::Progress( + MCalRemoteAttachmentOperation* aOperation, + TInt aPercentageCompleted ) + { + FUNC_LOG; + + TRAP_IGNORE( NotifyProgressL( + aOperation->AttachmentInformation().AttachmentLabel(), + aPercentageCompleted )); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::OperationCompleted +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::OperationCompleted( + MCalRemoteAttachmentOperation* aOperation, + RFile& aAttachment ) + { + FUNC_LOG; + + TRAP_IGNORE( HandleOperationCompletedL( aOperation, aAttachment ) ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::OperationError +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::OperationError( + MCalRemoteAttachmentOperation* /*aOperation*/, + TInt aErrorCode ) + { + FUNC_LOG; + + // Operation failed or cancelled, hide download indicator + TRAP_IGNORE( HideDownloadIndicatorL() ); + iCommandInProgress = 0; + + if ( aErrorCode != KErrCancel ) + { + // Operation failed, show error note + CCoeEnv::Static()->HandleError( aErrorCode ); + } + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::ResolveAttachmentIndexL +// --------------------------------------------------------------------------- +// +TInt CMRAttachmentCommandHandler::ResolveAttachmentIndexL( + const TDesC& aAttachmentLabel ) + { + FUNC_LOG; + + TInt index( KErrNotFound ); + + TInt attachmentCount( iEntry.AttachmentCountL() ); + for (TInt i(0); i < attachmentCount && KErrNotFound == index; ++i ) + { + CCalAttachment* attachment = iEntry.AttachmentL(i); + + TPtrC attachmentLabel( attachment->Label() ); + if ( !aAttachmentLabel.Compare(attachmentLabel) ) + { + index = i; + } + } + + // Check that attachment is always found + // If attachment is not found --> Our data is corrupted + __ASSERT_DEBUG( + KErrNotFound != index, + Panic( EMRAttachmentCommandHandlerAttachmentNotFound) ); + + return index; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::ResolveAttachmentIndexL +// --------------------------------------------------------------------------- +// +TInt CMRAttachmentCommandHandler::CommandIndex( + const TDesC& aAttachmentLabel ) + { + FUNC_LOG; + + TInt index( KErrNotFound ); + + TInt commandCount( iDownloadOperations.Count() ); + for ( TInt i(0); i < commandCount && KErrNotFound == index; ++i ) + { + // There are download operations in progress + const MCalRemoteAttachment& attachInfo = + iDownloadOperations[i]->AttachmentInformation(); + + TPtrC label( attachInfo.AttachmentLabel() ); + if ( !label.Compare( aAttachmentLabel ) ) + { + index = i; + } + } + + return index; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::RemoteAttachmentIndex +// --------------------------------------------------------------------------- +// +TInt CMRAttachmentCommandHandler::RemoteAttachmentIndexL( + const TDesC& aAttachmentLabel ) + { + FUNC_LOG; + + TInt index( KErrNotFound ); + + TInt remoteAttCount( iAttachmentInfo->AttachmentCount() ); + for ( TInt i(0); i < remoteAttCount && index == KErrNotFound; ++i ) + { + TPtrC remoteAttName( iAttachmentInfo->AttachmentL(i).AttachmentLabel() ); + + if ( !remoteAttName.Compare( aAttachmentLabel ) ) + { + index = i; + } + } + + return index; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::HandleOperationCompleted +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::HandleOperationCompletedL( + MCalRemoteAttachmentOperation* aOperation, + RFile& aAttachment ) + { + FUNC_LOG; + + // Notify 'download ready' event + CESMRFieldCommandEvent* event = CESMRFieldCommandEvent::NewLC( + NULL, + EMRCmdHideAttachmentIndicator ); + + iEventQueue.NotifyEventAsyncL( event ); + + CleanupStack::Pop( event ); + + // First search the correct operation from the list + TInt operationIndex( CommandIndex(aOperation->AttachmentInformation().AttachmentLabel() ) ); + + __ASSERT_DEBUG( + operationIndex != KErrNotFound, + Panic( EMRAttachmentCommandHandlerRemoteCommandNotFound) ); + + // Resolve current download operation in progress + MCalRemoteAttachmentOperation* operation = iDownloadOperations[ operationIndex ]; + CleanupDeletePushL( operation ); + iDownloadOperations.Remove( operationIndex ); + + TInt attachmentIndex( ResolveAttachmentIndexL( + operation->AttachmentInformation().AttachmentLabel() ) ); + + if ( KErrNotFound == attachmentIndex ) + { + User::Leave( KErrNotFound ); + } + + if ( EESMRViewerCancelAttachmentDownload != iCommandInProgress ) + { + // Update the remote attachment to be local attachment ... + UpdateLocalAttachmentL( + operation->AttachmentInformation().AttachmentLabel(), + aAttachment, + attachmentIndex ); + } + + // Then execute normal local file attachment command + if ( EESMRViewerOpenAttachment == iCommandInProgress || + EESMRViewerSaveAttachment == iCommandInProgress || + EESMRViewerSaveAllAttachments == iCommandInProgress ) + { + TInt attachmentIndex( + ResolveAttachmentIndexL( + operation->AttachmentInformation().AttachmentLabel() ) ); + + if ( EESMRViewerOpenAttachment == iCommandInProgress ) + { + // When opening attachment from remote storage --> Ask user to + // save attachment first as well. + HandleAttachmentCommandInternalL( + EESMRViewerOpenAndSaveAttachment, attachmentIndex ); + + iCommandInProgress = 0; + } + else + { + HandleAttachmentCommandInternalL( + EESMRViewerSaveAttachment, attachmentIndex ); + + if ( EESMRViewerSaveAllAttachments == iCommandInProgress && + iAttachmentInfo->AttachmentCount() ) + { + iCommandInProgress = 0; + + // There are more attachments to be downloaded --> Download next + SaveNextRemoteAttachmentL(); + } + else + { + if ( !iAttachmentInfo->AttachmentCount() ) + { + // All remote attachments have been saved. Show info note. + ShowInfoNoteL( iEntry.AttachmentCountL() ); + } + iCommandInProgress = 0; + } + } + } + + CleanupStack::PopAndDestroy( operation ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::HandleAttachmentCommandInternalL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::HandleAttachmentCommandInternalL( + TInt aCommandId, + TInt aAttachmentIndex ) + { + FUNC_LOG; + + if ( iDownloadOperations.Count() ) + { + // Cancel ongoing remote operations ... + iDownloadOperations.ResetAndDestroy(); + } + + CMRAttachmentCommand* command = NULL; + + // Creating command + switch ( aCommandId ) + { + case EESMRViewerOpenAttachment: + case EESMREditorOpenAttachment: + { + command = CMROpenAttachmentCommand::NewL( *iDocHandler ); + } + break; + case EESMREditorRemoveAttachment: + case EESMREditorRemoveAllAttachments: + { + command = CMRRemoveAttachmentCommand::NewL(); + } + break; + case EESMRViewerSaveAttachment: + { + command = CMRSaveAttachmentCommand::NewL( *iDocHandler ); + } + break; + case EESMRViewerOpenAndSaveAttachment: + { + command = CMRSaveAndOpenAttachmentCommand::NewL( *iDocHandler ); + } + break; + case EESMRViewerSaveAllAttachments: + { + SaveAllAttachmentsL(); + } + break; + default: + break; + } + + if ( command ) + { + CleanupDeletePushL( command ); + + // Executing command. TRAP errors so cancellation can be handled + // without an extra error note. + TRAPD( error, + ExecuteCommandL( aCommandId, *command, aAttachmentIndex ) ) + + if ( error != KErrCancel ) + { + User::LeaveIfError( error ); + + if ( aCommandId == EESMRViewerSaveAttachment + && iCommandInProgress != EESMRViewerSaveAllAttachments ) + { + ShowInfoNoteL(); + } + } + else // KErrCancel + { + iCommandInProgress = 0; + } + + CleanupStack::PopAndDestroy( command ); + } + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::UpdateLocalAttachmentL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::UpdateLocalAttachmentL( + const TDesC& aAttachmentLabel, + RFile& aAttachment, + TInt aAttachmentIndex ) + { + FUNC_LOG; + + // Create file attachment and add to calendar entry + CCalAttachment* fileAttachment = CCalAttachment::NewFileL( aAttachment ); + CleanupStack::PushL( fileAttachment ); + + RApaLsSession apaSession; + TDataRecognitionResult dataType; + User::LeaveIfError( apaSession.Connect() ); + apaSession.RecognizeData( aAttachment, dataType ); + apaSession.Close(); + + // set attachment properties + TPtrC8 contentType( dataType.iDataType.Des8() ); + + if ( contentType.Length() ) + { + fileAttachment->SetMimeTypeL( contentType ); + } + else + { + fileAttachment->SetMimeTypeL( KUnknownDatatype ); + } + + fileAttachment->SetLabelL( aAttachmentLabel ); + iEntry.AddAttachmentL( *fileAttachment ); // calEntry takes ownership + CleanupStack::Pop( fileAttachment ); + + // Remove remote attachment + CCalAttachment* attachment = iEntry.AttachmentL( aAttachmentIndex ); + iEntry.DeleteAttachmentL( *attachment ); + attachment = NULL; + + TInt remoteAttachmentIndex( RemoteAttachmentIndexL( aAttachmentLabel ) ); + if ( KErrNotFound != remoteAttachmentIndex ) + { + iAttachmentInfo->RemoveAttachmentAtL( remoteAttachmentIndex ); + } + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::NotifyProgressL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::NotifyProgressL( + const TDesC& aAttachmentLabel, + TInt aPercentageCompleted ) + { + FUNC_LOG; + + CDesCArray* descArray = new (ELeave) CDesCArrayFlat( 1 ); + CleanupStack::PushL( descArray ); + descArray->AppendL( aAttachmentLabel ); + CArrayFix* intArray = new (ELeave) CArrayFixFlat( 1 ); + CleanupStack::PushL( intArray ); + intArray->AppendL( aPercentageCompleted ); + + HBufC* statusText = StringLoader::LoadL( + R_QTN_MEET_REQ_ATTACHMENTS_DOWNLOAD_PREFIX, + *descArray, + *intArray ); + + CleanupStack::PushL( statusText ); + + // Create field change event + CESMRGenericFieldEvent* event = CESMRGenericFieldEvent::NewLC( + NULL, + MESMRFieldEvent::EESMRFieldChangeEvent ); + + // Add this field as parameter + TInt fieldId = EESMRFieldViewerAttachments; + CESMRFieldEventValue* field = CESMRFieldEventValue::NewLC( + MESMRFieldEventValue::EESMRInteger, + &fieldId ); + event->AddParamL( field ); + CleanupStack::Pop( field ); + + // Add new value as parameter + CESMRFieldEventValue* value = CESMRFieldEventValue::NewLC( + CESMRFieldEventValue::EESMRString, + statusText ); + + // Encapsulate value, so receiver gets the field value type + event->AddParamL( value, ETrue ); + CleanupStack::Pop( value ); + + // Send event + iEventQueue.NotifyEventAsyncL( event ); + CleanupStack::Pop( event ); + + // Ownership transferred to field event value + CleanupStack::Pop( statusText ); + CleanupStack::PopAndDestroy( intArray ); + CleanupStack::PopAndDestroy( descArray ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::HandleRemoteAttachmentCommandInternalL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::HandleRemoteAttachmentCommandInternalL( + TInt aCommandId, + const TDesC& aRemoteAttachmentLabel ) + { + FUNC_LOG; + + // Fetch correct attachment from the entry + TInt index = ResolveAttachmentIndexL( aRemoteAttachmentLabel ); + CCalAttachment* attachment = iEntry.AttachmentL( index ); + + if ( CCalAttachment::EFile == attachment->Type() ) + { + // This is local attachment ... + User::Leave( KErrArgument ); + } + + switch ( aCommandId ) + { + case EESMRViewerOpenAttachment: + case EESMRViewerSaveAttachment: + { + TInt remoteAttIndex( + RemoteAttachmentIndexL( aRemoteAttachmentLabel ) ); + + RPointerArray attachmentArray; + CleanupClosePushL( attachmentArray ); + const MCalRemoteAttachment& remoteAttachment( + iAttachmentInfo->AttachmentL(remoteAttIndex) ); + attachmentArray.Append( &remoteAttachment ); + + if ( !iCommandInProgress ) + { + // There are no ongoing command for this attachment + // ==> We can start new one ... + + iCommandInProgress = aCommandId; + + // Before we can execute the actual command, we need to be sure + // that attachments are being downloaded to device. + iRemoteAttachmentApi->DownloadAttachmentsL( + attachmentArray, + iDownloadOperations, + *this ); + } + + CleanupStack::PopAndDestroy( &attachmentArray ); + } + break; + + case EESMRViewerCancelAttachmentDownload: + { + if ( EESMRViewerSaveAllAttachments == iCommandInProgress ) + { + iCommandInProgress = aCommandId; + iDownloadOperations.ResetAndDestroy(); + } + else + { + // Cancelling is done by simply deleting the command + iCommandInProgress = aCommandId; + TInt remoteCommand( CommandIndex( + aRemoteAttachmentLabel )); + + MCalRemoteAttachmentOperation* command = + iDownloadOperations[remoteCommand]; + + iDownloadOperations.Remove( remoteCommand ); + delete command; + } + } + break; + case EESMRViewerSaveAllAttachments: + { + SaveAllAttachmentsL(); + } + break; + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::HideDownloadIndicatorL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::HideDownloadIndicatorL() + { + FUNC_LOG; + + CESMRFieldCommandEvent* event = CESMRFieldCommandEvent::NewLC( + NULL, + EMRCmdHideAttachmentIndicator ); + iEventQueue.NotifyEventAsyncL(event); + CleanupStack::Pop(event); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::ExecuteCommandL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::ExecuteCommandL( + TInt aCommandId, + CMRAttachmentCommand& aCommand, + TInt aAttachmentIndex ) + { + // Executing command + switch ( aCommandId ) + { + case EESMREditorRemoveAllAttachments: + { + for( TInt i = iEntry.AttachmentCountL() ; i > 0; --i ) + { + aCommand.ExecuteAttachmentCommandL( iEntry, i - 1 ); + } + } + case EESMRViewerSaveAllAttachments: + { + for( TInt i = 0; i < iEntry.AttachmentCountL(); ++i ) + { + aCommand.ExecuteAttachmentCommandL( iEntry, i ); + } + } + break; + default: + { + aCommand.ExecuteAttachmentCommandL( iEntry, aAttachmentIndex ); + } + break; + } + + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::SaveAllAttachmentsL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::SaveAllAttachmentsL() + { + // Save local attachments + CMRAttachmentCommand* command = + CMRSaveAttachmentCommand::NewL( *iDocHandler ); + + TRAPD( error, + ExecuteCommandL( EESMRViewerSaveAllAttachments, *command, 0 ) ) + + delete command; + + if ( error != KErrCancel ) + { + // Check if error happened during local attachment saving + User::LeaveIfError( error ); + + // Proceed with remote attachments + if ( iAttachmentInfo->AttachmentCount() > 0 ) + { + SaveNextRemoteAttachmentL(); + } + else // Show Save all info note + { + ShowInfoNoteL( iEntry.AttachmentCountL() ); + } + } + } + +// --------------------------------------------------------------------------- +// CMRAttachmentCommandHandler::SaveNextRemoteAttachmentL +// --------------------------------------------------------------------------- +// +void CMRAttachmentCommandHandler::SaveNextRemoteAttachmentL() + { + __ASSERT_DEBUG( iAttachmentInfo->AttachmentCount() > 0, + Panic( EMRAttachmentCommandHandlerRemoteAttachmentNotFound ) ); + + // Save first remote attachment of attachment info + RPointerArray attachmentArray; + CleanupClosePushL( attachmentArray ); + const MCalRemoteAttachment& remoteAttachment( + iAttachmentInfo->AttachmentL( 0 ) ); + attachmentArray.AppendL( &remoteAttachment ); + + if ( !iCommandInProgress ) + { + // There are no ongoing command for this attachment + // ==> We can start new one ... + iCommandInProgress = EESMRViewerSaveAllAttachments; + + // Before we can execute the actual command, we need to be sure + // that attachments are being downloaded to device. + iRemoteAttachmentApi->DownloadAttachmentsL( + attachmentArray, + iDownloadOperations, + *this ); + } + + CleanupStack::PopAndDestroy( &attachmentArray ); + } + +// EOF