diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mricalviewer/src/cmrattachmentinfofetcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mricalviewer/src/cmrattachmentinfofetcher.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,383 @@ +/* +* Copyright (c) 2007-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: Implementation for MR attachment fetcher +* +*/ + +#include "emailtrace.h" +#include "cmrattachmentinfofetcher.h" +#include "esmricalviewerutils.h" + +#include "cfsmailclient.h" +#include "cfsmailfolder.h" +#include "cfsmailmessagepart.h" +#include "cfsmailcommon.h" +#include "esmricalvieweropcodes.hrh" + +#include +#include +#include + +// Unnamed namespace for local definitions +namespace { // codescanner::namespace + +// Maximum URI length +const TInt KMaxUriLength( 256 ); + +// CMail attachment URI +_LIT8( KCMailUri, "cmail://"); + +// Literal for URI UID format +_LIT8( KUriUIDFormat, "%d.%d/"); + +/** + * Appends attachment information to URI. + * @param aUri Reference to URI + * @param aId Id to be added + */ +void AppendMailIdToUri( + TDes8& aUri, + TFSMailMsgId aId ) + { + aUri.AppendFormat( KUriUIDFormat, + aId.PluginId().iUid, + aId.Id() ); + } +} + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::CMRAttachmentInfoFetcher +// --------------------------------------------------------------------------- +// +CMRAttachmentInfoFetcher::CMRAttachmentInfoFetcher( + CFSMailClient& aMailClient, + CCalSession& aCalSession, + CCalEntry& aCalEntry ) +: CESMRIcalViewerAsyncCommand( + EESMRFetchAttachmentInfo, + aCalSession ), + iMailClient( aMailClient ), + iCalEntry( aCalEntry ) + { + FUNC_LOG; + iResult.iOpType = OperationType(); + iResult.iResultCode = KErrNone; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::~CMRAttachmentInfoFetcher +// --------------------------------------------------------------------------- +// +CMRAttachmentInfoFetcher::~CMRAttachmentInfoFetcher() + { + FUNC_LOG; + CancelCommand(); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::NewL +// --------------------------------------------------------------------------- +// +CMRAttachmentInfoFetcher* CMRAttachmentInfoFetcher::NewL( + CFSMailClient& aMailClient, + CCalSession& aCalSession, + CCalEntry& aCalEntry ) + { + FUNC_LOG; + + CMRAttachmentInfoFetcher* self = + new (ELeave) CMRAttachmentInfoFetcher( + aMailClient, aCalSession, aCalEntry ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::ConstructL +// --------------------------------------------------------------------------- +// +void CMRAttachmentInfoFetcher::ConstructL() + { + FUNC_LOG; + //do nothing + } + +// --------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::FetchMailL +// --------------------------------------------------------------------------- +// +void CMRAttachmentInfoFetcher::ExecuteAsyncCommandL() + { + FUNC_LOG; + + iResult.iMessage = Message(); + iResult.iOpType = OperationType(); + iResult.iResultCode = KErrNone; + + iMailMessage = Message(); + iResult.iMessage = iMailMessage; + TBool operationStarted( ETrue ); + + TFSPartFetchState messageLoadState( iMailMessage->FetchLoadState() ); + if( !iMailMessage->IsFlagSet( EFSMsgFlag_Attachments ) ) + { + operationStarted = EFalse; + } + else if ( EFSEmailStructureUnknown == messageLoadState ) + { + // Message structure needs to be fetched first + // After structure is fetched, then message parts can be fetched + // When structure fetching is completed, part fetching is triggered + // automatically + FetchMessageStructureL(); + } + else + { + // Message structure is already known --> Part can be fetched + // Wait operation is started if part needs to fetched. + operationStarted = ConstructAttachmentInformationL(); + } + + if ( !operationStarted ) + { + NotifyCompletion(); + } + + } + +// --------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::CancelAsyncCommand +// --------------------------------------------------------------------------- +// +void CMRAttachmentInfoFetcher::CancelAsyncCommand() + { + FUNC_LOG; + + if ( EIdle != iState ) + { + TRAP_IGNORE( iMailClient.CancelAllL() ); + + iResult.iResultCode = KErrCancel; + Observer()->OperationError( iResult ); + } + + } + +// --------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::RequestResponseL +// --------------------------------------------------------------------------- +// +void CMRAttachmentInfoFetcher::RequestResponseL( + TFSProgress aEvent, + TInt aRequestId ) + { + FUNC_LOG; + TRAPD( err, HandleRequestResponseL(aEvent, aRequestId) ); + + if ( KErrNone != err ) + { + // Error occured --> Cancel operations + iResult.iResultCode = err; + NotifyCompletion(); + } + } + +// ----------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::FetchMessageStructureL +// ----------------------------------------------------------------------------- +// +void CMRAttachmentInfoFetcher::FetchMessageStructureL() + { + FUNC_LOG; + + TFSMailMsgId currentMailboxId = + iMailMessage->GetMailBoxId(); + + TFSMailMsgId currentMessageFolderId = + iMailMessage->GetFolderId(); + + CFSMailFolder* currentFolder = + iMailClient.GetFolderByUidL( + currentMailboxId, + currentMessageFolderId ); + + CleanupStack::PushL( currentFolder ); + + iState = EFetchingStructure; + RArray messageIds; + CleanupClosePushL( messageIds ); + messageIds.Append( iMailMessage->GetMessageId() ); + iStructureRequestId = + currentFolder->FetchMessagesL( + messageIds, + EFSMsgDataStructure, + *this ); + + CleanupStack::PopAndDestroy();//messageIds + CleanupStack::PopAndDestroy( currentFolder ); + } + +// ----------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::ConstructAttachmentInformationL +// ----------------------------------------------------------------------------- +// +TBool CMRAttachmentInfoFetcher::ConstructAttachmentInformationL() + { + FUNC_LOG; + + TBool operationStarted( EFalse ); + + TFSMailMsgId calpartId; + calpartId.SetNullId(); + + CFSMailMessage* msg = Message(); + + // Fetch own pointer email message, because message structure is + // not necessarily up to date + CFSMailMessage* message = + iMailClient.GetMessageByUidL( + msg->GetMailBoxId(), + msg->GetFolderId(), + msg->GetMessageId(), + EFSMsgDataStructure ); + CleanupStack::PushL( message ); + + CFSMailMessagePart* calendarPart = + ESMRIcalViewerUtils::LocateCalendarPartL( *message ); + + if ( !calendarPart && !message->IsMRInfoSet() ) + { + // message does not contain calendar part at all + iResult.iResultCode = KErrNotFound; + User::Leave( KErrNotFound ); + } + + CleanupStack::PushL( calendarPart ); + + if ( calendarPart ) + { + calpartId = calendarPart->GetPartId(); + } + + RCPointerArray attachments; + CleanupClosePushL( attachments ); + + message->AttachmentListL( attachments ); + + TInt attachmentCount( attachments.Count() ); + for( TInt i(0); i < attachmentCount; i++ ) + { + TInt contentSize( attachments[i]->ContentSize() ); + TPtrC attachmentName( attachments[i]->AttachmentNameL() ); + + if ( contentSize >= 0 && attachmentName.Length() && + calpartId != attachments[i]->GetPartId() ) + { + HBufC8* uriBuf = HBufC8::NewLC( KMaxUriLength ); + TPtr8 uri( uriBuf->Des() ); + + uri.Append( KCMailUri ); + + // Setting attachment URI + AppendMailIdToUri( uri, message->GetMailBoxId() ); + AppendMailIdToUri( uri, message->GetFolderId() ); + AppendMailIdToUri( uri, message->GetMessageId() ); + AppendMailIdToUri( uri, attachments[i]->GetPartId() ); + + CCalAttachment* attachment = CCalAttachment::NewUriL( uri ); + CleanupStack::PushL( attachment ); + + // Setting attachment label + attachment->SetLabelL( + attachments[i]->AttachmentNameL() ); + + iCalEntry.AddAttachmentL( *attachment ); + CleanupStack::Pop( attachment ); + CleanupStack::PopAndDestroy( uriBuf ); + } + } + + CleanupStack::PopAndDestroy( &attachments ); + CleanupStack::PopAndDestroy( calendarPart ); + CleanupStack::PopAndDestroy( message ); + + return operationStarted; + } + +// ----------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::FetchMessageContentsL +// ----------------------------------------------------------------------------- +// +void CMRAttachmentInfoFetcher::HandleRequestResponseL( + TFSProgress aEvent, + TInt /*aRequestId*/ ) + { + FUNC_LOG; + + TBool operationStarted( EFalse ); + + if ( /*aRequestId == iStructureRequestId && */ + EFetchingStructure == iState ) + { + // Fetching message structure + switch ( aEvent.iProgressStatus ) + { + case TFSProgress::EFSStatus_RequestComplete: + { + // Starting part fetching + operationStarted = ConstructAttachmentInformationL(); + iResult.iResultCode = aEvent.iError; + } + break; + case TFSProgress::EFSStatus_RequestCancelled: + { + // Error occured during fetch operation + iResult.iResultCode = KErrCancel; + } + break; + default: + break; + } + } + + if ( !operationStarted ) + { + NotifyCompletion(); + } + + } + +// ----------------------------------------------------------------------------- +// CMRAttachmentInfoFetcher::NotifyCompletion +// ----------------------------------------------------------------------------- +// +void CMRAttachmentInfoFetcher::NotifyCompletion() + { + FUNC_LOG; + if ( KErrNone == iResult.iResultCode ) + { + Observer()->OperationCompleted( iResult ); + } + else + { + Observer()->OperationError( iResult ); + } + } + +// EOF