diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrtasks/src/cesmrtaskfactory.cpp --- a/meetingrequest/mrtasks/src/cesmrtaskfactory.cpp Mon Mar 15 12:39:10 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,685 +0,0 @@ -/* -* 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 ESMR task factory -* -*/ - -#include "emailtrace.h" -#include "cesmrtaskfactory.h" - -#include "cesmrcombinedtask.h" -#include "cesmrstoremrtask.h" -#include "cesmrsendmrrespmailtask.h" -#include "cesmrdeletefromdbmrtask.h" -#include "cesmrsendmrrespfsmailtask.h" -#include "cesmrsendmrfsmailtask.h" -#include "cesmrforwardasfsmailtask.h" -#include "cesmrsendmrfsmailreplytask.h" - -#include "mesmrmeetingrequestentry.h" -#include "cesmrconfirmationquery.h" -#include "cesmrlistquery.h" -#include "cesmrresponsedialog.h" -#include "tesmrinputparams.h" -#include "esmrconfig.hrh" - -// -#include "cfsmailcommon.h" -#include "cfsmailclient.h" -#include "cfsmailmessage.h" -#include "cfsmailbox.h" -// - -namespace { - -#ifdef _DEBUG - -// Panic literal for ESMRTaskFactory -_LIT( KESMRTaskFactoryPanicTxt, "ESMRTaskFactory" ); - -/** Panic code definitions */ -enum TESMRTaskFactoryPanic - { - EESMRTaskFactoryInvalidTask // Trying to create invalid task - }; - - -// --------------------------------------------------------------------------- -// Panic wrapper method -// --------------------------------------------------------------------------- -// -void Panic( TESMRTaskFactoryPanic aPanic ) - { - - User::Panic( KESMRTaskFactoryPanicTxt, aPanic ); - } - -#endif // _DEBUG - -/** - * Checks whether reply mail is required by the plug-in or not. - * @param aEntry Regerence to MR entry - */ -TBool ReplyMailRequiredL( - MESMRMeetingRequestEntry& aEntry ) - { - TBool replyNeeded( EFalse ); - - TESMRInputParams esmrParams; - if ( aEntry.IsOpenedFromMail() && - aEntry.StartupParameters(esmrParams) ) - { - TFSMailMsgId mailboxId( - esmrParams.iMailMessage->GetMailBoxId() ); - - CFSMailBox* mailbox = - esmrParams.iMailClient->GetMailBoxByUidL( mailboxId ); - CleanupStack::PushL( mailbox ); - - if ( mailbox->HasCapability(EFSMBoxCapaMRRequiresReplyEmail ) ) - { - replyNeeded = ETrue; - } - CleanupStack::PopAndDestroy( mailbox ); - mailbox = NULL; - } - - return replyNeeded; - } - -// --------------------------------------------------------------------------- -// Queries response query from user. -// --------------------------------------------------------------------------- -// -HBufC* QuerySendResponseQueryFromUserLC( - TESMRCommand aCommand, - TESMRResponseType& aResponseType, - MESMRMeetingRequestEntry& aEntry ) - { - HBufC* responseMessage = NULL; - TInt ret = EESMRResponsePlain; - - TESMRAttendeeStatus status( - EESMRAttendeeStatusDecline ); - - // convert the command to status: - switch ( aCommand ) - { - case EESMRCmdAcceptMR: - { - status = EESMRAttendeeStatusAccept; - break; - } - case EESMRCmdTentativeMR: - { - status = EESMRAttendeeStatusTentative; - break; - } - case EESMRCmdDeclineMR: - { - status = EESMRAttendeeStatusDecline; - break; - } - default: - { - // never should come here. - User::Leave(KErrGeneral); - break; - } - } - - TBool replyRequired( ReplyMailRequiredL(aEntry) ); - - if ( replyRequired ) - { - ret = CESMRListQuery::ExecuteEditBeforeSendWithSendOptOnlyL( status ); - } - else - { - ret = CESMRListQuery::ExecuteEditBeforeSendL( status ); - } - - // User has selected cancel from dialog. Interrupt task execution, - // leave will be trapped in cesmecontroller (esmrviewer module) - if ( ret == KErrCancel ) - { - User::Leave( KErrCancel ); - } - - aResponseType = static_cast(ret); - - // set the response status to cal entry: - aEntry.ConstructReplyL(status); - - if ( EESMRResponseMessage == aResponseType ) - { - CESMRResponseDialog* respDlg = - CESMRResponseDialog::NewL( responseMessage ); - CleanupStack::PushL( respDlg ); - - TBool dialogRetValue( respDlg->ExecuteDlgLD() ); - // Dialog has deleted itself --> Only pop from cleanup stack - CleanupStack::Pop( respDlg ); - - if ( !dialogRetValue ) - { - User::Leave( KErrCancel ); - } - } - if ( responseMessage ) - { - CleanupStack::PushL( responseMessage ); - } - else - { - responseMessage = KNullDesC().AllocLC(); - } - return responseMessage; - } - -} // namespace - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CESMRTaskFactory -// --------------------------------------------------------------------------- -// -inline CESMRTaskFactory::CESMRTaskFactory( - MESMRCalDbMgr& aCalDbMgr, - CMRMailboxUtils& aMRMailboxUtils ) -: iCalDbMgr( aCalDbMgr ), - iMRMailboxUtils(aMRMailboxUtils) - { - FUNC_LOG; - - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::~CESMRTaskFactory -// --------------------------------------------------------------------------- -// -CESMRTaskFactory::~CESMRTaskFactory() - { - FUNC_LOG; - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::TaskFactory -// --------------------------------------------------------------------------- -// -EXPORT_C CESMRTaskFactory* CESMRTaskFactory::NewL( - MESMRCalDbMgr& aCalDbMgr, - CMRMailboxUtils& aMRMailboxUtils ) - { - FUNC_LOG; - - CESMRTaskFactory* self = - new (ELeave) CESMRTaskFactory(aCalDbMgr, aMRMailboxUtils ); - - - return self; - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateTaskL -// --------------------------------------------------------------------------- -// -MESMRTask* CESMRTaskFactory::CreateTaskL( - TESMRCommand aCommand, - MESMRMeetingRequestEntry& aEntry ) - { - FUNC_LOG; - - MESMRTask* task = NULL; - - switch (aCommand) - { - case EESMRCmdAcceptMR: - case EESMRCmdTentativeMR: - case EESMRCmdDeclineMR: - task = CreateSendMRResponseViaMailTaskL( aCommand, aEntry ); - break; - - case EESMRCmdSendMR: - case EESMRCmdSendMRUpdate: - task = CreateSendMRTaskL( aCommand, aEntry ); - break; - - case EESMRCmdDeleteMR: - case EESMRCmdRemoveFromCalendar: - case EESMRCmdMailDelete: - task = CreateDeleteMRTaskL( aCommand, aEntry ); - break; - - case EESMRCmdSaveMR: - task = CreateStoreMRToLocalDBTaskL( aCommand, aEntry ); - break; - - case EESMRCmdForwardAsMeeting: - task = CreateForwardAsMeetingTaskL( aCommand, aEntry ); - break; - - case EESMRCmdForwardAsMail: - task = CreateForwardAsMailTaskL( aEntry ); - break; - case EESMRCmdReplyAll: - task = CreateReplyAsMailTaskL( aEntry, ETrue ); - break; - - case EESMRCmdReply: - task = CreateReplyAsMailTaskL( aEntry, EFalse ); - break; - - default: - __ASSERT_DEBUG(EFalse, Panic(EESMRTaskFactoryInvalidTask) ); - User::Leave( KErrNotSupported ); - break; - } - - - return task; - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateSendMRResponseViaMailTask -// --------------------------------------------------------------------------- -// -MESMRTask* CESMRTaskFactory::CreateSendMRResponseViaMailTaskL( - TESMRCommand aCommand, - MESMRMeetingRequestEntry& aEntry ) - { - FUNC_LOG; - - CESMRCombinedTask* task = NULL; - TESMRRole role = aEntry.RoleL(); - - TBool syncObjectPresent( aEntry.IsSyncObjectPresent() ); - TBool isStored( aEntry.IsStoredL() ); - - if ( EESMRRoleRequiredAttendee == role || - EESMRRoleOptionalAttendee == role || - EESMRRoleNonParticipant == role ) - { - task = CESMRCombinedTask::NewL - ( iCalDbMgr, - aEntry, - iMRMailboxUtils, - CESMRCombinedTask::EESMRTrap ); - - CleanupStack::PushL( task ); - - TESMRResponseType responseType( EESMRResponsePlain ); - HBufC* responseMessage = QuerySendResponseQueryFromUserLC( - aCommand, - responseType, - aEntry ); - - if ( !syncObjectPresent && EESMRCmdDeclineMR != aCommand) - { - // Entry is stored or deleted from calendar DB if - // sync object is not present - // Store MR task - task->AppendTaskL( - CESMRStoreMRTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils ) ); - } - - if ( EESMRResponseDontSend != responseType || - aEntry.IsSyncObjectPresent() ) - { - // Send MR response via mail freestyle task - task->AppendTaskL( - CESMRSendMRRespFSMailTask::NewL( - aCommand, - iCalDbMgr, - aEntry, - iMRMailboxUtils, - responseType, - *responseMessage ) ); - } - CleanupStack::PopAndDestroy( responseMessage ); - - if ( !syncObjectPresent && EESMRCmdDeclineMR == aCommand && - isStored ) - { - // Entry is deleted from calendar DB if - // sync object is not present and entry exits in database - // Declined --> Delete MR from cal DB task - task->AppendTaskL( - CESMRDeleteMRFromDbTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils ) ); - } - - CleanupStack::Pop( task ); - } - else - { - // Only (opt-)attendees and non-participants can send - // responses - User::Leave( KErrNotSupported ); - } - - - return task; - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateSendMRTask -// --------------------------------------------------------------------------- -// - -MESMRTask* CESMRTaskFactory::CreateSendMRTaskL( - TESMRCommand aCommand, - MESMRMeetingRequestEntry& aEntry ) - { - FUNC_LOG; - - CESMRCombinedTask* task = CESMRCombinedTask::NewL - ( iCalDbMgr, - aEntry, - iMRMailboxUtils ); - - CleanupStack::PushL( task ); - - if ( !aEntry.IsForwardedL() ) - { - // Store MR task - task->AppendTaskL( - CESMRStoreMRTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils ) ); - } - - // Note: forwarding is allowed also for entries that occurred in past - if ( aEntry.IsForwardedL() || !aEntry.OccursInPastL() ) - { - if ( aCommand == EESMRCmdSendMR || - aCommand == EESMRCmdSendMRUpdate ) - { - // Send MR response via mail task - task->AppendTaskL( - CESMRSendMRFSMailTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils, - aCommand ) ); - } - } - - CleanupStack::Pop( task ); - - - return task; - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateDeleteMRTask -// --------------------------------------------------------------------------- -// -MESMRTask* CESMRTaskFactory::CreateDeleteMRTaskL( - TESMRCommand aCommand, - MESMRMeetingRequestEntry& aEntry ) - { - FUNC_LOG; - - MESMRTask* task = NULL; - - if ( EESMRRoleOrganizer == aEntry.RoleL() ) - { - task = CreateOrganizerDeleteMRTaskL( aCommand, aEntry ); - } - else - { - task = CreateAttendeeDeleteMRTaskL( aCommand, aEntry ); - } - - - return task; - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateStoreMRToLocalDBTaskL -// --------------------------------------------------------------------------- -// -MESMRTask* CESMRTaskFactory::CreateStoreMRToLocalDBTaskL( - TESMRCommand /*aCommand*/, - MESMRMeetingRequestEntry& aEntry ) - { - FUNC_LOG; - return CESMRStoreMRTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils ); - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateForwardAsMeetingTaskL -// --------------------------------------------------------------------------- -// -MESMRTask* CESMRTaskFactory::CreateForwardAsMeetingTaskL( - TESMRCommand aCommand, - MESMRMeetingRequestEntry& aEntry ) - { - FUNC_LOG; - MESMRTask* task = NULL; - - // Send MR response via mail task is used for forwarding as meeting request - - if ( aCommand == EESMRCmdForwardAsMeeting ) - { - task = CESMRSendMRFSMailTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils, - aCommand ); - } - return task; - } - - - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateForwardAsMeetingTaskL -// --------------------------------------------------------------------------- -// -MESMRTask* CESMRTaskFactory::CreateForwardAsMailTaskL( - MESMRMeetingRequestEntry& aEntry ) - { - FUNC_LOG; - // Send MR response via mail task - return CESMRForwardAsFSMailTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils ); - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateReplyAsMailTaskL -// --------------------------------------------------------------------------- -// -MESMRTask* CESMRTaskFactory::CreateReplyAsMailTaskL( - MESMRMeetingRequestEntry& aEntry, TBool aReplyAll ) - { - FUNC_LOG; - // Send MR reply via mail task - return CESMRSendMRFSMailReplyTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils, - aReplyAll); - - } - - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateOrganizerDeleteMRTaskL -// --------------------------------------------------------------------------- -// -MESMRTask* CESMRTaskFactory::CreateOrganizerDeleteMRTaskL( - TESMRCommand aCommand, - MESMRMeetingRequestEntry& aEntry ) - { - FUNC_LOG; - - CESMRCombinedTask* task = CESMRCombinedTask::NewL - ( iCalDbMgr, - aEntry, - iMRMailboxUtils, - CESMRCombinedTask::EESMRTrap ); - - CleanupStack::PushL( task ); - - if ( EESMRCmdDeleteMR == aCommand ) - { - // SYNC_SOLUTION requires the modified entry to be stored into - // calendar db for deletion purposes. - task->AppendTaskL( - CESMRStoreMRTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils ) ); - - TUint attendeeFlags( - EESMRRoleRequiredAttendee | EESMRRoleOptionalAttendee); - if ( aEntry.AttendeeCountL( attendeeFlags ) && aEntry.IsSentL() - && !aEntry.OccursInPastL() ) - { - // Meeting request contains attendees --> Cancellation message - // needs to be sent - if ( CESMRConfirmationQuery::ExecuteL( - CESMRConfirmationQuery::EESMRSendCancellationInfoToParticipants) ) - { - task->AppendTaskL( - CESMRSendMRFSMailTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils, - aCommand ) ); - } - } - } - - // Delete MR from cal DB task - task->AppendTaskL( - CESMRDeleteMRFromDbTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils ) ); - - CleanupStack::Pop( task ); - - - return task; - } - -// --------------------------------------------------------------------------- -// CESMRTaskFactory::CreateAttendeeDeleteMRTaskL -// --------------------------------------------------------------------------- -// -MESMRTask* CESMRTaskFactory::CreateAttendeeDeleteMRTaskL( - TESMRCommand aCommand, - MESMRMeetingRequestEntry& aEntry ) - { - FUNC_LOG; - - TBool pluginRequiresReplyMail( ReplyMailRequiredL(aEntry) ); - - TBool deleteTaskCreated(EFalse); - - CESMRCombinedTask* task = CESMRCombinedTask::NewL - ( iCalDbMgr, - aEntry, - iMRMailboxUtils, - CESMRCombinedTask::EESMRTrap ); - - CleanupStack::PushL( task ); - - if ( !aEntry.IsOpenedFromMail() && !aEntry.IsSyncObjectPresent() ) - { - // When deleting from the calendar --> Store first modifying entry - // And then delete that from calendar DB. - // - // When opened from mail --> We do not need to store - // modifying entry into calendar database. - // - task->AppendTaskL( - CESMRStoreMRTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils ) ); - } - - - if ( EESMRCmdDeleteMR == aCommand || - EESMRCmdMailDelete == aCommand || - (pluginRequiresReplyMail && EESMRCmdRemoveFromCalendar == aCommand ) ) - { - TBool sendDecline(EFalse); - - if ( pluginRequiresReplyMail ) - { - sendDecline = ETrue; - } - else - { - sendDecline = CESMRConfirmationQuery::ExecuteL( - CESMRConfirmationQuery::EESMRSendDecline ); - } - - if( sendDecline ) - { - // Send MR response via mail task. No response message is appended - // to sent email - - TESMRCommand command( EESMRCmdDeclineMR ); - if ( pluginRequiresReplyMail && EESMRCmdRemoveFromCalendar == aCommand ) - { - command = EESMRCmdRemoveFromCalendar; - } - - task->AppendTaskL( - CESMRSendMRRespFSMailTask::NewL( - command, - iCalDbMgr, - aEntry, - iMRMailboxUtils, - EESMRResponsePlain, - KNullDesC()) ); - } - } - - // Delete MR from cal DB task if plugin does not handle it - if ( !pluginRequiresReplyMail && !deleteTaskCreated) - { - task->AppendTaskL( - CESMRDeleteMRFromDbTask::NewL( - iCalDbMgr, - aEntry, - iMRMailboxUtils ) ); - } - - CleanupStack::Pop( task ); - - - return task; - } - -// EOF -