mmsengine/mmsserver/inc/mmsserver.h
changeset 0 72b543305e3a
child 26 ebe688cedc25
--- /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 <mtsr.h>
+#include <msvipc.h>
+#include <schedulebaseservermtm.h>
+#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.<br>
+        * 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. <br>
+        * 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<KMsvProgressBufferLength> 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<KMaxParameterLength> 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