diff -r 000000000000 -r 72b543305e3a mmsengine/mmsserver/inc/mmsserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsengine/mmsserver/inc/mmsserver.h Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,667 @@ +/* +* Copyright (c) 2002-2007 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: +* Server Mtm +* +*/ + + + +#ifndef MMSSERVER_H +#define MMSSERVER_H + +// INCLUDES +#include +#include +#include +#include "mmsconst.h" + +// CONSTANTS +// approximate amount of disk space needed for scheduling +// will be multiplied by the number of entries to be scheduled +const TInt KMmsTaskSpace = 80; +// c:\Private\1000484b\mmsvar +_LIT( KMmsMessageVariationDirectory, "\x43:\\Private\\1000484B\\mmsvar\\" ); + +// MACROS +// this definition allows logging of notifications +// and received messages. +//#define NOTIFICATION_LOGGING + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class CMmsServerEntry; +class CMmsSettings; +class CMmsSendOperation; +class CMmsReceiveMessage; +class CMmsForwardOperation; +class CMmsDeleteOperation; +class CMmsMmboxList; +class CMmsDecode; +class CMmsHeaders; +class CLogEvent; +class CMmsLog; +class RScheduler; +class CMmsReadReport; + +// CLASS DECLARATION + +/** +* Server Mtm for multimedia messaging subsystem. +* This component will take care of message sending and receiving +*/ +class CMmsServerMtm : public CScheduleBaseServerMtm + { + public: // Constructors and destructor + // constructor is private. + + /** + * Factory function. + * The only function exported by this polymorphic interface dll.
+ * This function is called by message server when a client asks for + * some service from this mtm type + * @param aRegisteredMtmDll Reference to Mtm Dll registry class + * @param aInitialEntry Service entry. Can be the first entry in + * CMsvSelection array in the call from the client, or if + * there is no service entry as the first item of the selection, + * this will be the default service entry for this type of mtm. + * If no default entry has been specified, and the first entry + * in the selection is not a service entry, the creation of + * server mtm will fail. + * @return Pointer to CMmsServerClass. + */ + IMPORT_C static CMmsServerMtm* NewL( + CRegisteredMtmDll& aRegisteredMtmDll, + CMsvServerEntry* aInitialEntry ); + + /** + * Destructor. + */ + ~CMmsServerMtm(); + + public: // New functions + + public: // Functions from base classes + + // Copy and move, these are actually designed for email. + // They can be used for other purposes, if seem fit + + // Miscellaneous copy, move and other entry handling functions + // are not supported in increment 1. + + /** + * From CBaseServerMtm: Copy messages from remote service to + * local folders + * @param aSelection list of TMsvIds of messages. The first is the service + * @param aDestination TMsvId of the destination folder (for example inbox) + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void CopyToLocalL( + const CMsvEntrySelection& aSelection, + TMsvId aDestination, + TRequestStatus& aStatus ); + + /** + * From CBaseServerMtm: Copy messages from local folder to + * remote service + * @param aSelection list of TMsvIds of messages. The first is the service + * @param aDestination TMsvId of the destination folder + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void CopyFromLocalL( + const CMsvEntrySelection& aSelection, + TMsvId aDestination, + TRequestStatus& aStatus ); + + /** + * From CBaseServerMtm: Copy messages + * @param aSelection list of TMsvIds of messages. The first is the service + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void CopyWithinServiceL( + const CMsvEntrySelection& aSelection, + TMsvId aDestination, + TRequestStatus& aStatus ); + + /** + * From CBaseServerMtm: Move messages from remote service to + * local folders + * @param aSelection list of TMsvIds of messages. The first is the service + * @param aDestination TMsvId of the destination folder (for example inbox) + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void MoveToLocalL( + const CMsvEntrySelection& aSelection, + TMsvId aDestination, + TRequestStatus& aStatus ); + + /** + * From CBaseServerMtm: Move messages from local folder to + * remote service + * @param aSelection list of TMsvIds of messages. The first is the service + * @param aDestination TMsvId of the destination folder + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void MoveFromLocalL( + const CMsvEntrySelection& aSelection, + TMsvId aDestination, + TRequestStatus& aStatus ); + + /** + * From CBaseServerMtm: Move messages + * @param aSelection list of TMsvIds of messages. The first is the service + * @param aDestination TMsvId of the destination folder. + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void MoveWithinServiceL( + const CMsvEntrySelection& aSelection, + TMsvId aDestination, + TRequestStatus& aStatus ); + + // Create, change, delete + + /** + * From CBaseServerMtm: delete specified entries. + * @param aSelection entries to be deleted + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void DeleteAllL( + const CMsvEntrySelection& aSelection, + TRequestStatus& aStatus ); + + /** + * From CBaseServerMtm: Create a new entry. + * @param aNewEntry Basic settings for the new entry. + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void CreateL( TMsvEntry aNewEntry, TRequestStatus& aStatus ); + + /** + * From CBaseServerMtm: Change an entry. + * @param aNewEntry New settings for the entry. + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void ChangeL( TMsvEntry aNewEntry, TRequestStatus& aStatus ); + + // command and progress + + /** + * From CBaseServerMtm: Execute any MTM specific asynchronous command. + * @param aSelection List of TMsvIds of messages. The first is the service + * @param aCommand The command to be executed + * @param aParameter Any special parameter the specified command needs + * @param aStatus the status of the active object that is using this + * function as asynchronous service provider. This status will be + * set as completed when the server mtm active object is done. + */ + void StartCommandL( + CMsvEntrySelection& aSelection, + TInt aCommand, + const TDesC8& aParameter, + TRequestStatus& aStatus ); + + /** + * From CBaseServerMtm: Before releasing the server mtm, the message + * server can query, if the mtm is expecting another command soon, + * so that unloading should be delayed. + * @return ETrue if more commands are expected, EFalse otherwise + */ + TBool CommandExpected(); + + /** + * From CBaseServerMtm: Accessor to progress of current operation. + * @return progress value + */ + const TDesC8& Progress(); + + /** + * From CScheduleBaseServerMtm: Load default resource file + */ + void LoadResourceFileL(); + + /** + * From CScheduleBaseServerMtm: Put data into schedule package + * @param aParameter + * @param aPackage + */ + void PopulateSchedulePackage(const TDesC8& aParameter, const TBool aMove, TMsvSchedulePackage& aPackage) const; + + protected: // New functions + + protected: // Functions from base classes + + /** + * From CActive: Cancel current operation. + */ + void DoCancel(); + + /** + * From CBaseServerMtm: Do work. + */ + void DoRunL(); + + /** + * From CBaseServerMtm: Complete current operation. + * @param aError Error code to be returned as final status + */ + void DoComplete( TInt aError ); + + /** + * From CScheduleBaseServerMtm: Restore scheduling settings + */ + void RestoreScheduleSettingsL(TBool aRestoreErrorsFromResource = EFalse, TInt aErrorsResourceId = 0 ); + + private: + + /** + * By default Symbian OS constructor is private. + */ + CMmsServerMtm( + CRegisteredMtmDll& aRegisteredMtmDll, + CMsvServerEntry* aInitialEntry ); + + /** + * construct function that may leave + */ + void ConstructL(); + + // By default, prohibit copy constructor + CMmsServerMtm( const CMmsServerMtm& ); + // Prohibit assigment operator + CMmsServerMtm& operator= ( const CMmsServerMtm& ); + + /** + * Loads settings (also schedule settings). + * Sets service entry. + * @return error code + */ + void LoadSettingsL( TInt aCommand ); + + /** + * Send current selection to MMSC using current service. + */ + void SendToMmscL(); + + /** + * Send current selection to MMSC using current service and + * CMmsForwardMessage operation class. + */ + void SendForwardRequestsToMmscL(); + + /** + * Fetch messages from MMSC using current service. + */ + void FetchFromMmscL(); + + /** + * Check which entries have failed an operation + * and rescedule the failed ones. + */ + void UpdateEntriesL(); + + /** + * Reschedule entries for which forward has failed + * @param aPackage schedule package needed in rescheduling + */ + void HandleFailedForwardsL( TMsvSchedulePackage& aPackage ); + + /** + * Clean schedule for successfully sent entries + */ + void HandleSuccessfulSendsL(); + + /** + * Reschedule entries for which sending has failed + * @param aPackage schedule package needed in rescheduling + */ + void HandleFailedSendsL( TMsvSchedulePackage& aPackage ); + + /** + * Cleanup after message generation. + */ + void CleanupAfterMessageGenerationL(); + + /** + * Handle entries for which receiving has failed + * @param aPackage schedule package needed in rescheduling + * @param aFatalError an error that must be returned to caller + * @return + * - ETrue if fetching must be restarted immediately + * - EFalse if normal scheduling or failing is wanted + */ + TBool HandleFailedReceivesL( TMsvSchedulePackage& aPackage, TInt& aFatalError ); + + /** + * Clean up successfully fetched entries + */ + void HandleSuccessfulReceivesL(); + + /** + * Clean up bad notification entries + */ + void HandleBadNotificationsL(); + + /** + * Reschedule unhandled delivery reports + * @param aPackage schedule package needed in rescheduling + */ + void UpdateDeliveryReportsL( TMsvSchedulePackage& aPackage ); + + /** + * Handke read reports whose sending has failed + */ + void HandleFailedReadReports(); + + + /** + * Make dates for scheduled entries identical. + * This is needed at least in debug version, because + * ScheduleL does want to assert that the dates of all + * the entries are identical.
+ * We don't care and would send anything, but Symbian OS doesn't + * allow us to. + * @param aSelection the entries to be handled + * @param aInterval the delay between NOW and the actual operation. + * Must be positive, and greater than KMmsDelayInSeconds, + * otherwise KMmsDelayInSeconds will be used, because + * the task scheduler will not handle tasks that are overdue + * @param aClearError specifies if the old error from the entry + * should be cleared. Clearing is needed to prevent + * MsgErrorWatcher from reacting to the same error twice + */ + void MakeDatesIdenticalL( CMsvEntrySelection& aSelection, + TTimeIntervalSeconds aInterval, TBool aClearError = EFalse ); + + /** + * Decode the data content of a pushed message. + * The content should be either a MMS notification or a + * delivery report. + * If the content is a MMS notification, the message must + * be scheduled for fetching. + */ + void DecodePushedMessageL(); + + /** + * Schedule fetching of message referred to by this notification. + * The decoded message is stored in iMsvSelection. + */ + void HandleNotificationL(); + + /** + * Schedule a delivery report for logging + * The decoded message is stored in iMsvSelection. + */ + void HandleDeliveryReportL(); + + /** + * Update the contents of message log from the delivery report. + * delete the handled delivery report. + */ + void LogDeliveryReportL(); + + /** + * Check if there are notifications that have identical URI. + * If yes, this is a duplicate, and should be discarded + * @param aParent folder where the notifications are stored + * @param aNotification MMS headers for the new notification for + * identity check. + * @return ETrue if the notification is a duplicate and shoud be discarded + * EFalse if a duplicate has not been found + */ + TBool PruneDuplicateNotificationsL( TMsvId aParent, CMmsHeaders& aNotification ); + + /** + * Checks the fate of existing notifications. + * Checks if the notifications have expired, and if + * they have, they are deleted. + * Also checks, if the notifications have failed the + * maximum number of times. The failed notifications + * are removed. + * @param aSelection reference to a TMSVId list. At return it + * contains any notifications that still need rescheduling. + * If the list is empty, notifications from mmsFolder are added + * and checked. + */ + void CheckNotificationsL( CMsvEntrySelection& aSelection ); + + /** + * Fake function for testing purposes. + * Creates notifications containing file paths. + */ + void CreateNotificationsL(); + + /** + * Create notification into member buffer + * Fake function for testing purposes. + * @param aUrl address of the message (path & filename) + * @param aSize size of the message (file) + */ + void CreateNotificationL( TDesC8& aUrl, TInt aSize ); + + /** + * Do the actual garbage collection + * This means: If there are entries in outbox, check if + * they have been sent. If they have, move them to sent + * folder or delete them. + * If there are entries in outbox, that have not been sent, + * schedule them for sending (unless already scheduled). + * If there are pending delivery reports, log them. + * If there are notifications, check if the correspoding + * messages have been fetched already. If they have, delete + * the notifications. + * If the messages have not been fetched, schedule them for + * fetching (unlessa already scheduled). + */ + void GarbageCollectionL(); + + /** + * Delete schedule and reset retries for all entries in list + * @param aSelection list of entries to be cleared. + */ + void CleanSchedulesL( CMsvEntrySelection& aSelection ); + + /** + * Find the folder where MMS messages are to be stored + */ + TMsvId FindMMSFolderL(); + + /* + * Check if disk space is below critical level for scheduling. + * Checks both message drive and drive C:, as scheduling data goes + * to C: drive regardless of message drive. + * Params are as for function TMmsGenUtils::DiskSpaceBelowCriticalLevelL, + * but this subroutine checks drive C: automatically in additio to + * drive specified. + * @param aFs File server session. + * @param aBytesToWrite number of bytes the caller is about to add. + * The value 0 checks if the current + * space is already below the CL. + * @param aDrive number of the drive to be checked. + * @return ETrue if storage space would go below CL after adding + * aBytesToWrite more data, EFalse otherwise. + * Leaves on error with one of system-wide error code. + * e.g. KErrNotReady if drive contains no media. + */ + TBool DiskSpaceBelowCriticalForSchedulingL( RFs* aFs, + TInt aBytesToWrite, TInt aMessageDrive); + + /* + * Helper function to schedule a selection (send or receive) + * and put the selection into "failed" state if schdeduling fails. + * iMsvSelection must contain some entries to be scheduled. + * @return error code + */ + TInt ScheduleSelectionL(); + + /** + * HandleDummyEntryL reads notification data from entry's store, + * and then deletes the entry. + */ + void HandleDummyEntryL(); + + /** + * HandleMMBoxFlagL sets the stored-in-mmbox flag in indexentry + * primarily according to notification or secondarily (if notification + * does not specify it) according to shared data. + * @param aEntry reference to indexentry into which the change is done + */ + void HandleMMBoxFlagL( TMsvEntry& aEntry ); + + /** + * Garbage collection of notification entries in Outbox. + * Currently notifications can be only forward requests + */ + void GcOutBoxNotificationsL(); + + /** + * Garbage collection of messages in outbox. + */ + void GcOutBoxMessagesL(); + + /** + * Garbage collection of notifications in MMS private folder. + */ + void GcMmsFolderNotificationsL(); + + /** + * Garbage collection of notifications in inbox. + */ + void GcInboxNotifications(); + + /** + * Garbage collection of notification entries in mmbox folder. + * Since 2.8 + */ + void GcMmboxFolderNotifications(); + + /** + * Find duplicate notification + * @param aParent entry id, under where the duplicate is searched + * @param aHeaders the original mms headers, whose duplicate is searched + * @param aDuplicate entry id of the found duplicate + */ + TInt FindDuplicateNotificationL( TMsvId aParent, + CMmsHeaders& aHeaders, TMsvId& aDuplicate ); + + /** + * Send a read report to the originator of the MMS message + */ + void SendReadReportL(); + + /** + * Log command code for debugging purposes + * @param aCommand The command code MMS Server MTM was entered with + */ + void LogCommandCode( TInt aCommand ); + + /** + * Get id of the actual MMS service. + * This is needed when MMS Server MTM is originally called using local service id + */ + void GetRealServiceId( CMsvEntrySelection& aSelection ); + + /** + * Terminate caller or loop to retry in case settings cannot be loaded + */ + void HandleLoadServiceError( TInt aError ); + + /** + * Log the parent of the first entry in the list (for debugging) + */ + void LogEntryParent(); + + /** + * Make sure outbox entries are visible and that the service id + * is restored in case of schedule deletion command + */ + void RestoreVisibilityAndService(); + + public: // Data + + protected: // Data + + private: // Data + CMsvEntrySelection* iMsvSelection; // current selection + TMsvId iServiceEntryId; // Current service id + TMsvId iNotification; // Notification entry under construction + TRequestStatus* iRequestStatus; // status of the calling program + // This class may not leave in case of out of memory state + // when sending or receiving a message + TBool iOOMState; // out of memory error indicator. + TBuf8 iProgressBuffer; + CMmsSettings* iMmsSettings; // settings corresponding to iServiceentryId + CMmsHeaders* iMmsHeaders; // just needed to stay alive for a while + TInt iCurrentMessage; + + // State machine classes for different operations + CMmsSendOperation* iSendOperation; + CMmsReceiveMessage* iReceiveMessage; + CMmsForwardOperation* iForwardOperation; + CMmsDeleteOperation* iDeleteOperation; + CMmsMmboxList* iUpdateMmboxList; + CMmsReadReport* iReadReport; + + CMmsDecode* iDecoder; // decoder for notifications and delivery reports + TInt iCommand; // command for scheduled operations (send or receive) + TInt iCurrentCommand; // The asynchronous function that was sent to us + TBufC8 iParameter; + TInt iError; // for collecting errors from different operations... + CBufFlat* iEncodeBuffer; // for decoding notifications and delivery reports + CLogClient *iLogClient; // For updating log + CLogViewEvent *iLogViewEvent; // log view + CLogEvent* iLogEvent; + TLogString iLogString; + CMmsLog* iMmsLog; + CDesCArray* iRemoteParties; // Pure addresses to log + TInt iMessageDrive; // messages are on C: drive by default, + // may be moved to other drive + CMmsServerEntry* iEntryWrapper; + TParse iParse; // member to save stack space + + TBool iDeliveryStatus; //Delivered = ETrue , Rejected = EFalse + + public: // Friend classes + protected: // Friend classes + private: // Friend classes + + }; + + +// panic function +GLREF_C void gPanic( TMmsPanic aPanic ); + +#endif // MMSSERVER_H + +// End of File