mmsengine/mmsserver/inc/mmsbaseoperation.h
changeset 0 72b543305e3a
child 26 ebe688cedc25
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsengine/mmsserver/inc/mmsbaseoperation.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,527 @@
+/*
+* Copyright (c) 2004-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:   mms operation common base class
+*
+*/
+
+
+
+
+#ifndef MMSBASEOPERATION_H
+#define MMSBASEOPERATION_H
+
+//  INCLUDES
+#include <mentact.h> // base class CMsgActive
+#include <es_sock.h> // for RConnection & RSocketServ
+#include <msvstd.h>
+#include <babackup.h>
+#include <logwrap.h>
+#include <badesca.h>
+
+// CONSTANTS
+// used for recipient arrays, just increment for expanding the array.
+const TInt KMmsArrayAllocationNumber = 6;
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CMmsSettings;
+class RFs;
+class CMsvServerEntry;
+class CMmsConnectionInitiator;
+class CMmsServerEntry;
+class CMmsSession;
+class CMmsHeaders;
+class CMmsEncode;
+class CMmsDecode;
+class CMmsScheduledEntry;
+class CLogClient;
+class CLogViewEvent;
+class CLogEvent;
+class CMmsLog;
+class CMmsPhoneClient;
+
+// CLASS DECLARATION
+
+/**
+*  Base class for all MMS operations.
+*  State machine that contains basic structure for all MMS operations
+*  (send, receive, forward, etc.)
+*
+*  @lib mmssrv.lib
+*  @since 2.5
+*/
+class CMmsBaseOperation : public CMsgActive, public MBackupOperationObserver
+    {
+    public:  // Constructors and destructor
+        
+        /**
+        * Two-phased constructor.
+        * @param aFs open file system handle
+        * @param aMmsSettings pointer to Mms Settings class, values already loaded
+        */
+        static CMmsBaseOperation* NewL( RFs& aFs, CMmsSettings* aMmsSettings );
+        
+        /**
+        * Destructor.
+        */
+        virtual ~CMmsBaseOperation();
+
+    public: // New functions
+        
+        /** 
+        * Check if network operations are allowed
+        * @return ETrue if network operations are allowed
+        *         EFalse if network operations are forbidden
+        */
+        static TBool NetworkOperationsAllowed();
+        
+        /** 
+        * Allocate 64 bit TID
+        * @return TID based on current time
+        */
+        static TInt64 AllocateTID();
+        
+        /**
+        * Mark failed operation to notification entry 
+        * @param reference to the entry where the flags are to be set
+        */
+        static void MarkNotificationOperationFailed( TMsvEntry& aEntry );
+
+        /**
+        * Mark notification as deleted successfully from mmbox 
+        * @param reference to the entry where the flags are to be set
+        */
+        static void MarkNotificationDeletedFromMmbox( TMsvEntry& aEntry );
+
+        /**
+        * If a notification is in MMBox folder
+        * The corresponding duplicate in Inbox has to be marked and freed.
+        * iServerEntry must point to the original notification
+        * @param aState tells how the entry should be marked
+        *     possible values:
+        *     EMmsNotificationOperationFailed - the operation has failed
+        *     EMmsDeletedFromMmbox - the message was deleted from MMBox
+        * @param reference to a server entry pointing to the original notification
+        * Function leaves if the duplicate cannot be accessed (has disappeared already)
+        */
+        static void MarkDuplicateL( TInt aState, CMsvServerEntry& aServerEntry );
+        
+        /**
+        * Reserve the notification
+        * @param reference to the entry where the flags are to be set
+        * @param the operation that is to be ongoing
+        */
+        static void MarkNotificationOperationReserved( TMsvEntry& aEntry, const TUint32 aOperation );
+
+        /**
+        * Log date given as seconds from 1.1.1970.
+        * @param aDateInSeconds date to be logged
+        */        
+        static void LogNetworkFormatDateL( const TInt64& aDateInSeconds );
+        
+        /**
+        * Log date given as TTime.
+        * @param aDate date to be logged
+        */        
+        static void LogDateL( const TTime& aDate );
+
+        /**
+        * Check if the application is registered
+        * @param aApplicationId application id to check
+        * @return ETrue if registered, EFalse if not registered
+        */
+        static TBool RegisteredL( const TDesC& aApplicationId );
+
+        /**
+        * Start the state machine.
+        * @param aSelection list of message entry ids to be handled.
+        * @param aServerEntry CMsvServerEntry pointer from CMmsServer
+        * @param aSettings MMSC settings (entry points)
+        * @param aService current MMS service id
+        * @param aStatus TRequestStatus of the calling active object
+        */
+        void StartL(
+            CMsvEntrySelection& aSelection,
+            CMsvServerEntry& aServerEntry,
+            TMsvId aService,
+            TRequestStatus& aStatus );
+            
+        /**
+        * Check if the message contains any attachment types that must not be sent.
+        * @since 3.0
+        * @param aServerEntry CMsvServerEntry reference that points to the message
+        *     to be checked.
+        * @param aFs share protected file session
+        * @return KErrNone if the message is clear to send
+        * if the message has an attachment the type of which is on the
+        *             closed content list
+        *         EFalse if the message contains no forbidden content types.
+        */
+        static TInt CheckClosedContentL( CMsvServerEntry& aServerEntry, RFs& aFs );
+
+    public: // Functions from base classes
+
+        /**
+        * From MBackupOperationObserver
+        * Called when a backup or restore operation either starts or ends.
+    	* @param aBackupOperationAttributes Operation attributes
+        */
+	    void HandleBackupOperationEventL(const TBackupOperationAttributes& aBackupOperationAttributes);
+
+    protected:  // New functions
+        
+        /**
+        * Derived classes may call common constructor
+        * @param aMmsSettings pointer to Mms Settings class, values already loaded
+        */
+        virtual void ConstructL( CMmsSettings* aMmsSettings );
+
+        /**
+        * Select next state for state machine
+        */
+        virtual void SelectNextState();
+
+        /**
+        * Switch states
+        */
+        virtual void ChangeStateL();
+
+        /**
+        * Fall through.
+        * Base operation for all states that are no-op in some derived classes.
+        * This function just completes itself.
+        * This function should not be overridden, but should be used by all
+        * derived classes when no-op state is required.
+        */
+        void FallThrough();
+
+        // The following functions are default implementations for all states.
+        // The function names end to L to allow derived classes to 
+        // override tha default funtions with leaving functions.
+        // All default implementations do not leave.
+
+        /**
+        * Initialize common variables.
+        * @param aSelection list of message entry ids to be handled.
+        * @param aServerEntry CMsvServerEntry pointer from CMmsServer
+        * @param aSettings MMSC settings (entry points)
+        * @param aService current MMS service id
+        */
+        virtual void InitializeL(
+            CMsvEntrySelection& aSelection,
+            CMsvServerEntry& aServerEntry,
+            TMsvId aService );
+
+        /**
+        * Encode the PDU to be sent to MMSC.
+        */
+        virtual void EncodePDUL();
+
+        /**
+        * Make a network connection to gateway before attempting a transaction.
+        * This would normally connect to GPRS or CDMA or WBCDMA access point
+        */
+        virtual void ConnectToIAPL();
+
+        /**
+        * Initialize protocol session.
+        */
+        virtual void InitializeSessionL();
+
+        /**
+        * Submit a transaction (default is POST transaction).
+        */
+        virtual void SubmitTransactionL();
+
+        /**
+        * Create new entry to receive data from MMSC.
+        */
+        virtual void CreateEntryL();
+
+        /**
+        * Decode response PDU from MMSC.
+        */
+        virtual void DecodeResponseL();
+
+        /**
+        * Store response data from MMSC (if not stored during decoding).
+        * This function would store e.g. message id, error code from MMSC
+        * and response text.
+        */
+        virtual void StoreResponseL();
+
+        /**
+        * Encode acknowledgement message for MMSC (for received message).
+        */
+        virtual void EncodeAckL();
+
+        /**
+        * Send acknowledgement message for MMSC (for received message).
+        */
+        virtual void SendAckL();
+
+        /**
+        * Update the trigger entry status.
+        */
+        virtual void UpdateEntryStatusL();
+
+        /**
+        * Add MMS event to log.
+        */
+        virtual void LogL();
+
+        /**
+        * Move trigger entry after handling.
+        * (Move sent item to sent folder, delete notification, etc.)
+        */
+        virtual void MoveEntryL();
+
+        /**
+        * Disconnect and do any other finalizing steps.
+        */
+        virtual void FinalizeL();
+
+        /**
+        * Wait for backup end.
+        */
+        virtual void WaitForBackupEnd();
+
+        // Utility functions that may be used by all derived classes
+
+       /**
+        * Set sending state of scheduled entries
+        * @param aSelection entries to handle
+        */
+        virtual void SetSendMask( const CMsvEntrySelection& aSelection );
+
+        /**
+        * Reset sending state of scheduled entries
+        * @param aSelection entries to handle
+        * @param aError error code
+        */
+        virtual void UnSetSendMask( CMsvEntrySelection& aSelection, TInt aError);
+
+        /**
+        * Reset sending state of scheduled entry
+        * @param aId entry id
+        * @param aError error code
+        */
+        virtual void UnSetSendMask( const TMsvId aId, TInt aError );
+
+        /**
+        * Save error status
+        * @param aError error code
+        * @param aScheduledEntry entry to be updated
+        */
+        virtual void UpdateRecipient(
+            TInt aError,
+            CMmsScheduledEntry& aScheduledEntry );
+
+        /**
+        * Map the response status from MMSC to iError
+        * @param aResponse structure where the response code from MMSC is stored
+        */
+        virtual void MapResponseStatus( CMmsHeaders& aResponse );
+
+        /**
+        * Initialize members needed for logging.
+        * Called only when logging needed
+        * (send message, possibly receive message).
+        */
+        virtual void InitializeLoggingL();
+        
+        /**
+        * 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
+        */
+        virtual TInt FindDuplicateNotificationL( TMsvId aParent, CMmsHeaders& aHeaders, TMsvId& aDuplicate );
+
+        /**
+        * check if the notification is free to start a new operation 
+        */
+        virtual TBool FreeNotification( TMsvEntry aEntry, const TUint32 aOperation );
+        
+        /**
+        * Put recipient information and description to log event.
+        * The caller may add more information afterwards.
+        * @param aMmsHeaders reference to headers where the recipient information can be found
+        * @param aEntry reference to entry that contains id and description
+        */
+        virtual void CommonLogEventInitializationL( CMmsHeaders& aMmsHeaders, TMsvEntry& aEntry );
+        
+// start of ROAMING CHECK handling
+        /**
+        * Start the roaming check, will complete asynchronously
+        */
+        virtual void RoamingCheck();
+        
+        /**
+        * Check result of roaming state query
+        */
+        virtual void GetRoamingState();
+// end of ROAMING CHECK handling
+
+
+        
+
+    protected:  // Functions from base classes
+        
+        /**
+        * C++ default constructor.
+        */
+        CMmsBaseOperation( RFs& aFs );
+
+        /**
+        * From CMsgActive: Active object completion
+        * We must override this, because we may have a selection of
+        * entries to handle. If one entry fails, we must be able to
+        * continue to the next one ( depending on the error ). At least
+        * we must be able to check what to do next. Do some cleanup, and 
+        * maybe disconnect.
+        */
+        virtual void RunL();
+
+        /**
+        * From CMsgActive: State machine state operation
+        */
+        virtual void DoRunL();
+
+        /**
+        * From CMsgActive: Active object cancellation
+        */
+        virtual void DoCancel();
+
+        /**
+        * From CMsgActive: Complete current operation.
+        * Do whatever cleanup is possible. (Delete incomplete entry etc.)
+        * @param aError Error code received by RunL
+        */
+        virtual void DoComplete( TInt& aError );
+
+    private:
+
+        /**
+        * Check connection state after connecting to IAP
+        */
+        void CheckConnectionState();
+
+
+    public:     // Data
+        // states for the state machine
+        enum TMmsOperationStates
+            {
+            EMmsOperationIdle,
+            EMmsOperationCheckingRoaming,
+            EMmsOperationEncodingPDU,
+            EMmsOperationConnectingToIAP,
+            EMmsOperationInitializingSession,
+            EMmsOperationSubmittingTransaction,
+            EMmsOperationCreatingEntry,
+            EMmsOperationDecodingResponse,
+            EMmsOperationStoringResponseData,
+            EMmsOperationEncodingAck,
+            EMmsOperationSendingAck,
+            EMmsOperationUpdatingEntryStatus,
+            EMmsOperationLogging,
+            EMmsOperationMovingEntry,
+            EMmsOperationFinalizing,
+            EMmsOperationWaitingForBackupEnd
+            };
+            
+        enum TMmsMarkDuplicateState
+            {
+            EMmsNotificationOperationFailed,
+            EMmsDeletedFromMmbox
+            };
+    
+    protected:  // Data
+        RFs&                iFs;    // file system
+        TInt                iError;
+        TInt                iState;
+        TMsvId              iService;
+        // These three pointers come from the caller, they must not be deleted
+        // by this class or any derived class.
+        CMsvServerEntry*    iServerEntry;
+        CMsvEntrySelection* iSelection; // Array of messages to be handled
+        CMmsSettings*       iMmsSettings;
+
+        RSocketServ         iSocketServ;
+        RConnection         iConnection;
+        CMmsSession*        iMmsSession; 
+
+        // state we must retry in case of backup/restore error
+        TInt                iCriticalState;
+        // is there an open connection to MMSC
+        TBool               iConnected;
+        TInt                iCurrentMessageNo;
+        // access point array
+        CArrayFixFlat<TUint32>* iIAPArray;
+        // The number of access point used (in case there are more than one)
+        TInt                iConnectionIndex; 
+        // Home page URI corresponding to the connection made
+        HBufC*              iUri;
+        CMmsConnectionInitiator* iConnectionInitiator;
+        CMsvEntrySelection* iFailed;          // failed messages
+        CMsvEntrySelection* iSuccessful;      // successfully handled messages
+        CBufFlat*           iEncodeBuffer;
+        CMmsServerEntry*    iEntryWrapper; // entry wrapper for encode and decode
+        CMmsHeaders*        iResponse; // the response message from MMSC is decoded here
+        // When sending messages encode the outgoing message
+        // When receiving messages, encode the response to MMSC
+        CMmsEncode*         iEncoder;
+        // When sending messages, decode send confirmation from MMSC
+        // When receiving messages, decode the incoming message
+        CMmsDecode*         iDecoder;
+        TBool               iBackupStart;
+        TBool               iBackupEnd;
+        RTimer              iTimer;     // timer for backup operations - we don't wait forever
+        TBool               iHaveTimer;  // have we created the local timer
+        // we wait only once - otherwise we might run into an endless loop
+        TBool               iDoNotWaitForBackupEnd;
+        TBool               iMustWait;   // small delay
+        CLogClient*         iLogClient; // For updating log
+        CLogViewEvent*      iLogViewEvent; // log view
+        CLogEvent*          iLogEvent;
+        TLogString          iLogString;
+        CMmsLog*            iMmsLog;
+        CDesCArray*         iRemoteParties;  // Pure addresses to log
+        TInt                iNumberOfRemoteParties;
+// start of ROAMING CHECK handling
+// Roaming check variables included in base operation
+// Only those operations that actually need roaming chech implement the actual handling
+// Base class will default to "home" without actually checking anything
+        TInt                iRegistrationStatus; // 0 = home network
+        CMmsPhoneClient*    iPhone;
+// end of ROAMING CHECK handling
+
+
+        
+    private:    // Data
+         
+    public:     // Friend classes
+    protected:  // Friend classes
+    private:    // Friend classes
+
+    };
+
+#endif      // MMSBASEOPERATION
+            
+// End of File