--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrtasks/src/cesmrsendmrrespfsmailtask.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,358 @@
+/*
+* 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 sending MR response via fs email
+*
+*/
+#include "emailtrace.h"
+#include "cesmrsendmrrespfsmailtask.h"
+
+#include <caluser.h>
+#include <calentry.h>
+#include <utf.h>
+//<cmail>
+#include "mmrinfoprocessor.h"
+//</cmail>
+#include <f32file.h>
+#include <coemain.h>
+#include <bautils.h>
+#include <cmrmailboxutils.h>
+
+#include "cesmrcaldbmgr.h"
+#include "mesmrmeetingrequestentry.h"
+#include "cesmrmailplaitextformatter.h"
+#include "cesmrfsemailmanager.h"
+#include "cesmrcalimportexporter.h"
+#include "tesmrinputparams.h"
+#include "cesmrcaluserutil.h"
+#include "esmrhelper.h"
+
+// Unnamed namespace for local definitions
+namespace {
+// Literal for plain text separator
+_LIT( KPlainTextResponseTxtSeparator,
+ "\n----------------------------------------\n");
+
+
+// Literal for response iCal file
+//<cmail> remove hard coded paths
+//_LIT( KPath, "c:\\temp\\" ); //codescanner::driveletters
+//_LIT( KFileAndPath, "c:\\temp\\response.ics" ); //codescanner::driveletters
+//_LIT( KPath, "temp\\" );
+_LIT( KFileName, "temp\\response.ics" );
+//</cmail>
+
+} // namespace
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::CESMRSendMRRespFSMailTask
+// ---------------------------------------------------------------------------
+//
+CESMRSendMRRespFSMailTask::CESMRSendMRRespFSMailTask(
+ TESMRCommand aCommand,
+ MESMRCalDbMgr& aCalDbMgr,
+ MESMRMeetingRequestEntry& aEntry,
+ CMRMailboxUtils& aMRMailboxUtils,
+ TESMRResponseType aResponseType )
+: CESMRTaskBase( aCalDbMgr, aEntry, aMRMailboxUtils ),
+ iCommand( aCommand ),
+ iResponseType( aResponseType )
+ {
+ FUNC_LOG;
+ //do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::~CESMRSendMRRespFSMailTask
+// ---------------------------------------------------------------------------
+//
+CESMRSendMRRespFSMailTask::~CESMRSendMRRespFSMailTask()
+ {
+ FUNC_LOG;
+ delete iCaluserUtil;
+ delete iEntryToSend;
+ delete iResponseMessage;
+ delete iEmailMgr;
+ delete iTextFormatter;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRSendMRRespFSMailTask* CESMRSendMRRespFSMailTask::NewL(
+ TESMRCommand aCommand,
+ MESMRCalDbMgr& aCalDbMgr,
+ MESMRMeetingRequestEntry& aEntry,
+ CMRMailboxUtils& aMRMailboxUtils,
+ TESMRResponseType aResponseType,
+ const TDesC& aResponseMessage )
+ {
+ FUNC_LOG;
+ CESMRSendMRRespFSMailTask* self =
+ new (ELeave) CESMRSendMRRespFSMailTask(
+ aCommand,
+ aCalDbMgr,
+ aEntry,
+ aMRMailboxUtils,
+ aResponseType );
+
+ CleanupStack::PushL(self);
+ self->ConstructL(aResponseMessage);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRSendMRRespFSMailTask::ConstructL(
+ const TDesC& aResponseMessage )
+ {
+ FUNC_LOG;
+ BaseConstructL();
+ iEmailMgr = CESMRFSEMailManager::NewL( MailboxUtils() );
+ iTextFormatter = CESMRMailPlainTextFormatter::NewL( MailboxUtils() );
+ iResponseMessage = aResponseMessage.AllocL();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::ExecuteTaskL
+// ---------------------------------------------------------------------------
+//
+void CESMRSendMRRespFSMailTask::ExecuteTaskL()
+ {
+ FUNC_LOG;
+ iEntryToSend = ESMREntry().ValidateEntryL();
+
+ // Checking input paramters
+ if( CCalEntry::EMethodReply != iEntryToSend->MethodL() &&
+ EESMRCmdRemoveFromCalendar != iCommand )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ if ( ESMREntry().IsSyncObjectPresent( ) )
+ {
+ SendMailViaSyncL();
+ }
+ else
+ {
+ iCaluserUtil = CESMRCalUserUtil::NewL( *iEntryToSend );
+
+ // create mail message:
+ ConstructMailL();
+
+ TInt ret = iEmailMgr->SendMessageL();
+ User::LeaveIfError(ret);
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::ConstructMailL
+// ---------------------------------------------------------------------------
+//
+void CESMRSendMRRespFSMailTask::ConstructMailL()
+ {
+ FUNC_LOG;
+ // Prepare email manager for sending
+ CCalUser *mailboxUser = ESMREntry().Entry().PhoneOwnerL();
+ iEmailMgr->PrepareForSendingL(
+ ESMRHelper::AddressWithoutMailtoPrefix(
+ mailboxUser->Address() ) );
+
+ // set the email subject
+ HBufC* subject =
+ iTextFormatter->Subject16LC(
+ *iEntryToSend,
+ ESMREntry().IsForwardedL(),
+ ESMREntry().IsEntryEditedL() );
+
+ iEmailMgr->SetSubjectL(*subject);
+ CleanupStack::PopAndDestroy(subject);
+ subject = NULL;
+
+ // Set the To recipient
+ iEmailMgr->AppendToRecipientL(
+ iEntryToSend->OrganizerL()->Address(),
+ iEntryToSend->OrganizerL()->CommonName() );
+
+ // Set text/plain part
+ AddPlainTextPartL();
+
+ // Set text/calendar part:
+ AddCalendarPartL();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::AddPlainTextPartL
+// ---------------------------------------------------------------------------
+//
+void CESMRSendMRRespFSMailTask::AddPlainTextPartL()
+ {
+ FUNC_LOG;
+
+ HBufC* plainText = iTextFormatter->Body16LC( *iEntryToSend );
+ if ( iResponseMessage )
+ {
+ TPtrC plainTextSeparator( KPlainTextResponseTxtSeparator() );
+
+ plainText = plainText->ReAlloc(
+ plainText->Length() +
+ plainTextSeparator.Length() +
+ iResponseMessage->Length() );
+
+ CleanupStack::Pop( plainText );
+ CleanupStack::PushL( plainText );
+
+ TPtr ptrPlainText( plainText->Des() );
+ ptrPlainText.Append( plainTextSeparator );
+ ptrPlainText.Append( *iResponseMessage );
+ }
+
+ iEmailMgr->CreateTextPlainPartL(*plainText);
+ CleanupStack::PopAndDestroy(plainText);
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::AddCalendarPartL
+// ---------------------------------------------------------------------------
+//
+void CESMRSendMRRespFSMailTask::AddCalendarPartL()
+ {
+ FUNC_LOG;
+ SetAttendeesL();
+
+ CESMRCalImportExporter* calExporter =
+ CESMRCalImportExporter::NewLC();
+
+ HBufC* calendarPart =
+ calExporter->ExportToICal16LC( *iEntryToSend );
+
+ //<cmail> removing hardcoded paths
+ TFileName fileName(KFileName);
+ User::LeaveIfError(ESMRHelper::CreateAndAppendPrivateDirToFileName(fileName));
+ SaveICalToFileL( *calendarPart, fileName );
+ iEmailMgr->CreateTextCalendarPartL(
+ CESMRFSEMailManager::EESMRMethodResponse,
+ fileName);
+ //</cmail>
+
+ CleanupStack::PopAndDestroy( calendarPart );
+ CleanupStack::PopAndDestroy( calExporter );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::SendMailViaSyncL
+// ---------------------------------------------------------------------------
+//
+void CESMRSendMRRespFSMailTask::SendMailViaSyncL()
+ {
+ FUNC_LOG;
+ TESMRInputParams startupParams;
+
+ if ( ESMREntry().StartupParameters(startupParams) )
+ {
+ MMRInfoProcessor::TMRInfoResponseMode responseMode (
+ MMRInfoProcessor::EMRInfoResponseSendAndSync );
+
+ if ( EESMRResponseDontSend == iResponseType )
+ {
+ responseMode = MMRInfoProcessor::EMRInfoResponseSync;
+ }
+ else if ( EESMRCmdRemoveFromCalendar == iCommand )
+ {
+ responseMode = MMRInfoProcessor::EMRInfoRemoveFromCal;
+ }
+
+ MMRInfoObject& infoObject = ESMREntry().ValidateSyncObjectL();
+ iEmailMgr->SendMailViaSyncL(
+ startupParams,
+ infoObject,
+ responseMode,
+ *iResponseMessage );
+ }
+ else
+ {
+ User::Leave( KErrArgument );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::SaveICalToFileL
+// ---------------------------------------------------------------------------
+//
+TInt CESMRSendMRRespFSMailTask::SaveICalToFileL(
+ const TDesC& aICal,
+ const TDesC& aFilename )
+ {
+ FUNC_LOG;
+ //create 8 bit buffer for temp file content
+ TInt length = aICal.Length() * 2;
+ HBufC8* buffer = HBufC8::NewLC( length );
+ TPtr8 des = buffer->Des();
+
+ // covert the 16 bit iCal to 8 bit iCal:
+ TInt err = CnvUtfConverter::ConvertFromUnicodeToUtf8(des, aICal);
+
+ RFs& fs( CCoeEnv::Static()->FsSession() );
+
+ // ensure the path exists:
+ //<cmail> remove hard coded paths
+ //BaflUtils::EnsurePathExistsL(fs, KPath);
+ //</cmail>
+
+ // delete previous file
+ fs.Delete( aFilename );
+
+ // save the iCal to file system:
+ RFile file;
+ User::LeaveIfError(file.Create(fs, aFilename, EFileWrite));
+ CleanupClosePushL(file);
+ User::LeaveIfError(file.Write(*buffer));
+
+ // clean up:
+ CleanupStack::PopAndDestroy(2, buffer); // file, fs, buffer
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRSendMRRespFSMailTask::SetAttendeesL
+// ---------------------------------------------------------------------------
+//
+void CESMRSendMRRespFSMailTask::SetAttendeesL()
+ {
+ FUNC_LOG;
+ CCalAttendee* thisAttendee =
+ ESMRHelper::CopyAttendeeLC(
+ *(MailboxUtils().ThisAttendeeL( *iEntryToSend )) );
+
+ RPointerArray<CCalAttendee>& attendeeList = iEntryToSend->AttendeesL();
+
+ while ( attendeeList.Count() )
+ {
+ //remove attendees from entry that is to be forwarded
+ iEntryToSend->DeleteAttendeeL( 0 );
+ }
+
+ // Ownership is transferred
+ iEntryToSend->AddAttendeeL( thisAttendee );
+ CleanupStack::Pop( thisAttendee );
+ }
+
+//EOF
+