williamr@2: // Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #ifndef __MSVSCHEDULESEND_H__ williamr@2: #define __MSVSCHEDULESEND_H__ williamr@2: williamr@2: #ifdef _DEBUG williamr@2: #undef _MSG_NO_LOGGING williamr@2: #endif williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: class CMsvEntrySelection; williamr@2: class TMsvSchedulePackage; williamr@2: class TMsvSendErrorAction; williamr@2: class CMsvStore; williamr@2: class TMsvEntry; williamr@2: class CMsvOffPeakTimes; williamr@2: class CMsvScheduleSettings; williamr@2: class CMsvSendErrorActions; williamr@2: class CMsvSysAgentActions; williamr@2: class TMsvSchedulePackage; williamr@2: class TMsvEntryScheduleData; williamr@2: class CMsvServerEntry; williamr@2: class CRepository; williamr@2: williamr@2: const TUid KUidMsvScheduledSendingDLL = {0x100056A0}; williamr@2: const TInt KMsvSchsendArrayGrowth = 10; williamr@2: williamr@2: #ifdef _MSG_NO_LOGGING williamr@2: #define SCHSENDLOG(a) williamr@2: #else williamr@2: _LIT(KSchSendLogDir, "schsend"); williamr@2: _LIT(KSchSendLogFile,"SchSend.txt"); williamr@2: #define SCHSENDLOG(a) a williamr@2: #endif williamr@2: williamr@2: /** williamr@2: Provides a Server MTM's interface to the Task Scheduler for messaging williamr@2: scheduling. williamr@2: williamr@2: Server MTM's must provide a derived class that implements GetMessageL() to williamr@2: provide a factory for MTM-specific scheduling CMsvScheduledEntry-based objects. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CMsvScheduleSend : public CBase williamr@2: { williamr@2: public: williamr@2: IMPORT_C ~CMsvScheduleSend(); williamr@2: williamr@2: IMPORT_C void ScheduleL(const CMsvEntrySelection& aSelection, const TMsvSchedulePackage& aPackage); williamr@2: williamr@2: IMPORT_C void ReScheduleL(const CMsvEntrySelection& aSelection, const TMsvSchedulePackage& aPackage, const TMsvSendErrorAction* aErrorAction = NULL); williamr@2: williamr@2: IMPORT_C void CheckScheduleL(const CMsvEntrySelection& aSelection); williamr@2: IMPORT_C void DeleteScheduleL(const CMsvEntrySelection& aSelection); williamr@2: williamr@2: IMPORT_C void SendingCompleteL(TMsvEntry& aEntry, const TBool aChangeEntry = EFalse); williamr@2: IMPORT_C void SendingCompleteL(const CMsvEntrySelection& aSelection); williamr@2: williamr@2: williamr@2: inline CMsvOffPeakTimes& OffPeakTimes() const; williamr@2: inline CMsvScheduleSettings& ScheduleSettings() const; williamr@2: inline CMsvSendErrorActions& SendErrorActions() const; williamr@2: inline CMsvSysAgentActions& AgentActions() const; williamr@2: williamr@2: IMPORT_C static void CreateScheduleL(RScheduler& aScheduler, const CMsvScheduleSettings& aSettings, const TTime& aStartTime, const TTimeIntervalMinutes& aValidityPeriod, TSchedulerItemRef& aRef); williamr@2: IMPORT_C static void CreateScheduleL(RScheduler& aScheduler, const CArrayFixFlat& aConditions, const TTime& aTimeout, TSchedulerItemRef& aRef); williamr@2: IMPORT_C static void FindScheduleL(RScheduler& aScheduler, const TTime& aStartTime, TSchedulerItemRef& aRef); williamr@2: IMPORT_C static void FindScheduleL(RScheduler& aScheduler, const CArrayFixFlat& aConditions, const TTime& aTimeout, TSchedulerItemRef& aRef); williamr@2: IMPORT_C static void RoundUpToMinute(TTime& aTime); williamr@2: IMPORT_C static void ScheduleEntryL(RScheduler& aScheduler, const TSchedulerItemRef& aRef, const TMsvSchedulePackage& aPackage, TTaskInfo& aInfo); williamr@2: IMPORT_C static void UpdateEntryAfterSchedule(const TSchedulerItemRef& aRef, const TTaskInfo& aInfo, const TTime& aTime, TInt aFinalState, TMsvEntry& aEntry, TMsvEntryScheduleData& aData); williamr@2: IMPORT_C static void ConnectAndRegisterL(RScheduler& aScheduler, const CMsvScheduleSettings& aSettings); williamr@2: williamr@2: IMPORT_C void LoadScheduleSettingsL(CRepository& aRepository); williamr@2: williamr@2: protected: williamr@2: williamr@2: IMPORT_C CMsvScheduleSend(CMsvServerEntry& aServerEntry); williamr@2: IMPORT_C virtual void ConstructL(); williamr@2: williamr@2: /** williamr@2: Gets the schedule data and recipients of a message. williamr@2: williamr@2: Recipient information is MTM-specific, so the server MTM must provide a williamr@2: derived class that implements CMsvScheduledEntry, and return objects of williamr@2: that type from this function. williamr@2: williamr@2: @param aId williamr@2: The message ID. williamr@2: williamr@2: @return williamr@2: The message's schedule data. williamr@2: */ williamr@2: virtual CMsvScheduledEntry* GetMessageL(const TMsvId aId) const = 0; williamr@2: williamr@2: private: williamr@2: williamr@2: enum williamr@2: { williamr@2: EDefaultTaskPriority = 1, //used when scheduling a task in the task scheduler williamr@2: EDefaultTaskRepeat = 0 //used when scheduling a task in the task scheduler williamr@2: }; williamr@2: williamr@2: void SendingCompleteL(CMsvScheduledEntry& aScheduledEntry, const TBool aChangeEntry); williamr@2: williamr@2: TBool GetNextRetry(CMsvScheduledEntry& aMessage, const TMsvSendErrorAction& aErrorAction, TTimeIntervalSeconds& aInterval) const; williamr@2: williamr@2: void DoScheduleL(CMsvScheduledEntries& aSchEntries, const TInt aFinalState, const TTime& aTime, TBool aPendingConditions); williamr@2: void DoReScheduleL(CMsvScheduledEntries& aSchEntries); williamr@2: williamr@2: void GetMessagesL(const CMsvEntrySelection& aSelection); williamr@2: williamr@2: void ConnectAndRegisterL(); williamr@2: williamr@2: void ScheduleEntryL(CMsvScheduledEntry& aMessage, const TInt aFinalState, const TTime& aStartTime, const TSchedulerItemRef& aRef, TBool aPendingConditions); williamr@2: williamr@2: void GetOffPeakL(TTime aFromTime, TTime& aStartTime, TTimeIntervalMinutes& aValidityPeriod) const; williamr@2: williamr@2: void DeleteScheduleForEntryL(CMsvScheduledEntry& aMessage); williamr@2: void ResetScheduleInfoForEntryL(CMsvScheduledEntry& aMessage, const TBool aChangeEntry); williamr@2: void SortByDateAndPendingConditionsL(CMsvScheduledEntries& aScheduledEntries); williamr@2: void CreateScheduleL(const TTime& aStartTime, const TTimeIntervalMinutes& aValidityPeriod, const CArrayFixFlat& aSchConditions, TBool aPendingConditions, TSchedulerItemRef& aRef); williamr@2: void FindScheduleL(const TTime& aTime, const CArrayFixFlat& aSchConditions, TBool aPendingConditions, TSchedulerItemRef& aRef); williamr@2: williamr@2: void PopulateScheduleConditionsL(CArrayFixFlat& aSchConditions); williamr@2: TBool SetMessageStartTime(CMsvScheduledEntry& aMessage, const TTime& aFromTime, const TMsvSendErrorAction* aErrorAction = NULL); williamr@2: williamr@2: TBool TaskAndMessageMatchL(const CMsvScheduledEntry& aMessage); williamr@2: TMsvId GetMessageIdForTaskL(TInt aTaskId); williamr@2: #ifndef _MSG_NO_LOGGING williamr@2: void FLog(TRefByValue aFormat, ...); williamr@2: void FLog(TRefByValue aFormat, ...); williamr@2: #endif williamr@2: williamr@2: protected: williamr@2: williamr@2: /** The Server MTM specific scheduled message sending settings. */ williamr@2: CMsvScheduleSettings* iSettings; williamr@2: /** The Server MTM specific off peak time periods. */ williamr@2: CMsvOffPeakTimes* iOffPeakTimes; williamr@2: /** The Server MTM specific actions to take when particular errors occur during williamr@2: message sending. */ williamr@2: CMsvSendErrorActions* iErrorActions; williamr@2: /** The System Agent conditions that must be satisfied before a sending attempt. */ williamr@2: CMsvSysAgentActions* iAgentActions; williamr@2: williamr@2: /** Indicates if this has been registered with the Task Scheduler. williamr@2: williamr@2: Initially set to EFalse. */ williamr@2: TBool iRegistered; williamr@2: /** Provides an interface to the Task Scheduler. */ williamr@2: RScheduler iScheduler; williamr@2: /** The CMsvServerEntry of the server MTM. */ williamr@2: CMsvServerEntry& iServerEntry; williamr@2: /** Scheduling options. */ williamr@2: TMsvSchedulePackage iPackage; williamr@2: williamr@2: /** Array of message schedule data. */ williamr@2: CMsvScheduledEntries* iSchEntries; williamr@2: williamr@2: /** Array of schedule entry data. */ williamr@2: CArrayFixFlat* iSchEntryInfo; williamr@2: /** Array of schedule task data. */ williamr@2: CArrayFixFlat* iSchTaskInfo; williamr@2: }; williamr@2: williamr@2: #include williamr@2: williamr@2: #endif