diff -r 000000000000 -r 8466d47a6819 meetingrequest/mricalviewer/src/cesmrimapmailfetcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mricalviewer/src/cesmrimapmailfetcher.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,307 @@ +/* +* 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 IMAP mail fetcher +* +*/ + + +#include "emailtrace.h" +#include "cesmrimapmailfetcher.h" +#include "esmricalviewerutils.h" +// +#include "CFSMailClient.h" +#include "CFSMailFolder.h" +#include "CFSMailMessagePart.h" +#include "CFSMailCommon.h" +#include "esmricalvieweropcodes.hrh" +// + + +// Unnamed namespace for local definitions +namespace { + +// Preferred byte count definition +const TInt KPreferredByteCount(0); +} + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::CESMRImapMailFetcherCmd +// --------------------------------------------------------------------------- +// +CESMRImapMailFetcherCmd::CESMRImapMailFetcherCmd( + CFSMailClient& aMailClient, + CCalSession& aCalSession ) +: CESMRIcalViewerAsyncCommand( + EESMRFetchMailContent, + aCalSession ), + iMailClient( aMailClient ) + { + FUNC_LOG; + iResult.iOpType = OperationType(); + iResult.iResultCode = KErrNone; + } + +// --------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::~CESMRImapMailFetcherCmd +// --------------------------------------------------------------------------- +// +CESMRImapMailFetcherCmd::~CESMRImapMailFetcherCmd() + { + FUNC_LOG; + CancelCommand(); + } + +// --------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::NewL +// --------------------------------------------------------------------------- +// +CESMRImapMailFetcherCmd* CESMRImapMailFetcherCmd::NewL( + CFSMailClient& aMailClient, + CCalSession& aCalSession ) + { + FUNC_LOG; + + CESMRImapMailFetcherCmd* self = + new (ELeave) CESMRImapMailFetcherCmd( aMailClient, aCalSession ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + + return self; + } + +// --------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::ConstructL +// --------------------------------------------------------------------------- +// +void CESMRImapMailFetcherCmd::ConstructL() + { + FUNC_LOG; + //do nothing + } + +// --------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::FetchMailL +// --------------------------------------------------------------------------- +// +void CESMRImapMailFetcherCmd::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 ( 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 = FetchMessageContentsL(); + } + + if ( !operationStarted ) + { + NotifyCompletion(); + } + + } + +// --------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::CancelAsyncCommand +// --------------------------------------------------------------------------- +// +void CESMRImapMailFetcherCmd::CancelAsyncCommand() + { + FUNC_LOG; + + if ( EIdle != iState ) + { + TRAP_IGNORE( iMailClient.CancelAllL() ); + + iResult.iResultCode = KErrCancel; + Observer()->OperationError( iResult ); + } + + } + +// --------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::RequestResponseL +// --------------------------------------------------------------------------- +// +void CESMRImapMailFetcherCmd::RequestResponseL( + TFSProgress aEvent, + TInt aRequestId ) + { + FUNC_LOG; + TRAPD( err, HandleRequestResponseL(aEvent, aRequestId) ); + + if ( KErrNone != err ) + { + // Error occured --> Cancel operations + iResult.iResultCode = err; + NotifyCompletion(); + } + } + +// ----------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::FetchMessageStructureL +// ----------------------------------------------------------------------------- +// +void CESMRImapMailFetcherCmd::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 ); + + } + +// ----------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::FetchMessageContentsL +// ----------------------------------------------------------------------------- +// +TBool CESMRImapMailFetcherCmd::FetchMessageContentsL() + { + FUNC_LOG; + TBool operationStarted( EFalse ); + + CFSMailMessagePart* calendarPart = ESMRIcalViewerUtils::LocateCalendarPartL( *iMailMessage ); + if ( !calendarPart ) + { + // message does not contain calendar part at all + iResult.iResultCode = KErrNotFound; + return operationStarted; + } + CleanupStack::PushL( calendarPart ); + + TFSPartFetchState partLoadState( calendarPart->FetchLoadState() ); + if ( EFSFull != partLoadState ) + { + // part is not fetched to device + iMessagePartRequestId = + calendarPart->FetchMessagePartL( + calendarPart->GetPartId(), + *this, + KPreferredByteCount ); + + iState = EFetchingContents; + operationStarted = ETrue; + } + + CleanupStack::PopAndDestroy( calendarPart ); + calendarPart = NULL; + return operationStarted; + } + +// ----------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::FetchMessageContentsL +// ----------------------------------------------------------------------------- +// +void CESMRImapMailFetcherCmd::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 = FetchMessageContentsL(); + iResult.iResultCode = aEvent.iError; + } + break; + case TFSProgress::EFSStatus_RequestCancelled: + { + // Error occured during fetch operation + iResult.iResultCode = KErrCancel; + } + break; + default: + break; + } + } + + if ( !operationStarted ) + { + NotifyCompletion(); + } + + } + +// ----------------------------------------------------------------------------- +// CESMRImapMailFetcherCmd::NotifyCompletion +// ----------------------------------------------------------------------------- +// +void CESMRImapMailFetcherCmd::NotifyCompletion() + { + FUNC_LOG; + if ( KErrNone == iResult.iResultCode ) + { + Observer()->OperationCompleted( iResult ); + } + else + { + Observer()->OperationError( iResult ); + } + } + +// EOF +