diff -r d189ee25cf9d -r 3533d4323edc meetingrequest/mricalviewer/src/cesmrimapicalretriever.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mricalviewer/src/cesmrimapicalretriever.cpp Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,353 @@ +/* +* 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: ESMR mrinfo calendar entry retriever implementation +* +*/ + + +#include "emailtrace.h" +#include "cesmrimapicalretriever.h" +#include "cesmrimapmailfetcher.h" +#include "tesmrinputparams.h" +#include "esmricalviewerutils.h" +#include "esmrconfig.hrh" + +// +#include "cfsmailclient.h" +#include "cfsmailbox.h" +#include "cfsmailmessage.h" +#include "cfsmailmessagepart.h" +#include "cfsmailcommon.h" +#include "cesmragnexternalinterface.h" +#include "esmricalvieweropcodes.hrh" +// + +// hardcoded paths removal +#include "esmrhelper.h" +// +#include +#include +#include +#include +#include +#include + +// Unnamed namespace for local definitions +namespace { + +// Mime type literal for text/calendar +_LIT8( KTextCalendar8, "text/calendar" ); + +// Literal for received ics filename +// hard coded path removal, store goes to process's own private directory +//_LIT( KTempReceivedIcsFile, +// "c:\\temp\\tempreceived.ics" ); //codescanner::driveletters +_LIT( KTempReceivedIcsFileName, "temp\\tempreceived.ics" ); +// + +// Definition for temporary folder +// hard coded path removal, store goes to process's own private directory +//_LIT( KTempFolder, "c:\\temp\\" ); //codescanner::driveletters +// + +// Definition for first position +const TInt KFirstPos(0); + +/** + * Cleanup operations for RPointerArray. + * + * @param aArray Pointer to RPointerArray. + */ +void CalEntryPointerArrayCleanup( TAny* aArray ) + { + RPointerArray* entryArray = + static_cast*>( aArray ); + + entryArray->ResetAndDestroy(); + entryArray->Close(); + } + +}//namespace + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetriever::CESMRImapIcalRetrieverCmd +// --------------------------------------------------------------------------- +// +CESMRImapIcalRetrieverCmd::CESMRImapIcalRetrieverCmd( + CCalSession& aCalSession, + CFSMailClient& aMailClient, + TESMRInputParams& aInputParameters ) +: CESMRIcalViewerAsyncCommand( EESMRLoadMRIcalData, aCalSession ), + iMailClient( aMailClient ), + iInputParameters( aInputParameters ) + { + FUNC_LOG; + iResult.iResultCode = KErrNone; + iResult.iOpType = OperationType(); + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetriever::~CESMRImapIcalRetrieverCmd +// --------------------------------------------------------------------------- +// +CESMRImapIcalRetrieverCmd::~CESMRImapIcalRetrieverCmd() + { + FUNC_LOG; + CancelCommand(); + delete iCalImporter; + delete iMailFetcher; + delete iConvertedEntry; + delete iIcsFilename; + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetriever::NewL +// --------------------------------------------------------------------------- +// +CESMRImapIcalRetrieverCmd* CESMRImapIcalRetrieverCmd::NewL( + CCalSession& aCalSession, + CFSMailClient& aMailClient, + TESMRInputParams& aInputParameters ) + { + FUNC_LOG; + CESMRImapIcalRetrieverCmd* self = + new (ELeave) CESMRImapIcalRetrieverCmd( + aCalSession, + aMailClient, + aInputParameters ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetriever::ConstructL +// --------------------------------------------------------------------------- +// +void CESMRImapIcalRetrieverCmd::ConstructL() + { + FUNC_LOG; + BaseConstructL(); + + TFileName fileName(KTempReceivedIcsFileName); + User::LeaveIfError(ESMRHelper::CreateAndAppendPrivateDirToFileName(fileName)); + iIcsFilename = fileName.AllocL(); + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetriever::ExecuteAsyncCommandL +// --------------------------------------------------------------------------- +// +void CESMRImapIcalRetrieverCmd::ExecuteAsyncCommandL() + { + FUNC_LOG; + delete iCalImporter; iCalImporter = NULL; + delete iMailFetcher; iMailFetcher = NULL; + + iCalImporter = CESMRAgnExternalInterface::NewL( KTextCalendar8 ); + iMailFetcher = CESMRImapMailFetcherCmd::NewL( + iMailClient , + CalSession() ); + + // Ensure mesasge is fetched to device + // Completion is noticed via observer + iMailFetcher->ExecuteCommandL( + *Message(), + *this ); + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetriever::CancelAsyncCommand +// --------------------------------------------------------------------------- +// +void CESMRImapIcalRetrieverCmd::CancelAsyncCommand() + { + FUNC_LOG; + if ( iMailFetcher ) + { + iMailFetcher->CancelCommand(); + } + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetriever::AgnImportErrorL +// --------------------------------------------------------------------------- +// +MESMRAgnImportObserver::TImpResponse CESMRImapIcalRetrieverCmd::AgnImportErrorL( + MESMRAgnImportObserver::TImpError /*aType*/, + const TDesC8& /*aUid*/, + const TDesC& /*aContext*/) + { + FUNC_LOG; + // Ignore error and continue processing + return MESMRAgnImportObserver::EImpResponseContinue; + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetrieverCmd::OperationCompleted +// --------------------------------------------------------------------------- +// +void CESMRImapIcalRetrieverCmd::OperationCompleted( + MESMRIcalViewerObserver::TIcalViewerOperationResult aResult ) + { + FUNC_LOG; + if ( aResult.iOpType == EESMRFetchMailContent ) + { + TRAPD( error, HandleMailContentL() ); + + if ( error != KErrNone || + !iInputParameters.iCalEntry ) + { + aResult.iOpType = OperationType(); + aResult.iResultCode = KErrNotSupported; + Observer()->OperationError( aResult ); + } + else + { + aResult.iOpType = OperationType(); + Observer()->OperationCompleted( aResult ); + } + } + else + { + aResult.iOpType = OperationType(); + aResult.iResultCode = KErrNotSupported; + + Observer()->OperationError( aResult ); + } + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetrieverCmd::HandleMailContentL +// --------------------------------------------------------------------------- +// +void CESMRImapIcalRetrieverCmd::HandleMailContentL() + { + FUNC_LOG; + 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 does not contain calendar part at all + iResult.iResultCode = KErrNotFound; + User::Leave( KErrNotFound ); + } + CleanupStack::PushL( calendarPart ); + + CreateEntryL( *calendarPart, *msg ); + iInputParameters.iCalEntry = iConvertedEntry; + iCalendarPartId = calendarPart->GetPartId(); + + CleanupStack::PopAndDestroy( calendarPart ); + CleanupStack::PopAndDestroy( message ); + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetrieverCmd::OperationError +// --------------------------------------------------------------------------- +// +void CESMRImapIcalRetrieverCmd::OperationError( + MESMRIcalViewerObserver::TIcalViewerOperationResult aResult ) + { + FUNC_LOG; + iResult.iResultCode = aResult.iResultCode; + Observer()->OperationError( iResult ); + } + +// --------------------------------------------------------------------------- +// CESMRImapIcalRetriever::CreateEntryL +// --------------------------------------------------------------------------- +// +void CESMRImapIcalRetrieverCmd::CreateEntryL( + CFSMailMessagePart& aMessagePart, + CFSMailMessage& aMsg) + { + FUNC_LOG; + delete iConvertedEntry; iConvertedEntry = NULL; + + aMessagePart.CopyContentFileL( *iIcsFilename ); + + //set up calendar session; just creating and deleting these leads to memory + //and handle leaks. + RFs& rfs( CEikonEnv::Static()->FsSession() );// codescanner::eikonenvstatic + + RFileReadStream fileStream; + fileStream.PushL(); + User::LeaveIfError( fileStream.Open( rfs, *iIcsFilename, EFileRead)); // + + RPointerArray entries; + CleanupStack::PushL( + TCleanupItem( + CalEntryPointerArrayCleanup, + &entries ) ); + + // Replaced with internal ical module + TRAPD( err, iCalImporter->ImportL( + entries, + fileStream, + 0, + *this ) ); + + User::LeaveIfError( err ); + + TInt entryCount( entries.Count() ); + if ( !entryCount ) + { + // There are no entries to be processed + User::Leave( KErrNotSupported ); + } + + // Only the first entry is processed --> Others are discarded. + iConvertedEntry = entries[ KFirstPos ]; + entries.Remove( KFirstPos ); + + CleanupStack::PopAndDestroy( &entries ); + CleanupStack::PopAndDestroy( &fileStream ); + + //If there is no organizer (special case for some Exchange servers) + //we need to add mail sender as organizer + if(!iConvertedEntry->OrganizerL()) + { + CFSMailAddress* sender = aMsg.GetSender(); + + if(sender) + { + CCalUser* organizer = CCalUser::NewL( sender->GetEmailAddress() ); + CleanupStack::PushL(organizer); + + organizer->SetCommonNameL( sender->GetDisplayName() ); + iConvertedEntry->SetOrganizerL(organizer); + + CleanupStack::Pop( organizer ); // Ownership trasferred + } + } + } + +// EOF +