mediator/inc/Server/MediatorServerSession.h
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mediator/inc/Server/MediatorServerSession.h	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,740 @@
+/*
+* Copyright (c) 2005-2008 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:  Session class for Mediator Server
+*
+*/
+
+
+#ifndef MEDIATORSERVERSESSION_H
+#define MEDIATORSERVERSESSION_H
+
+
+// INCLUDES
+#include <e32base.h>
+
+#include "MediatorCommon.h"
+#include "MediatorServerEventHandler.h"
+#include "MediatorServerCommandHandler.h"
+#include "MediatorServerObjectHandler.h"
+#include "MediatorServerObjects.h"
+
+
+// FORWARD DECLARATIONS
+class CMediatorServer;
+class CMediatorQueItem;
+
+// CLASS DECLARATION
+
+/**
+*  Session class for Mediator Server.
+*
+*  @lib MediatorServer
+*  @since S60 3.1
+*/
+class CMediatorServerSession : public CSession2, 
+                               public MMediatorServerEventObserver,
+                               public MMediatorServerNotificationObserver,
+                               public MMediatorCommandObserver,
+                               public MMediatorCommandResponseObserver
+	{
+    public: // Construction and destruction
+        /**
+        * Destructor.
+        */
+        ~CMediatorServerSession();
+
+        /**
+        * Two-phased constructor.
+        */
+    	static CMediatorServerSession* NewL();
+
+    public: // from CSession2
+    
+        /**
+        * Handles the servicing of a client request that has been passed
+        * to the server.
+        * @since S60 3.1
+        * @param aMessage   message to be served
+        * @return None.
+        */
+    	void ServiceL( const RMessage2& aMessage );
+    	
+    	/**
+        * Reports error thas has occurred during service.
+        * 
+        * @since S60 3.1
+        * @param aMessage   message that was served
+        * @param aError     error code of service error
+        * @return None.
+        */
+        
+    	void ServiceError(const RMessage2& aMessage,TInt aError);
+    
+    public: // from MMediatorCommandObserver
+    
+        /**
+        * A Mediator Service command.
+        *
+        * @since S60 3.1     
+        * @param aDomain    The identifier of the domain         
+        * @param aCategory  The identifier of the category.
+        * @param aCommandId The identifier of the command.
+        * @param aVersion   The version information of the command.
+        * @param aData      The parameters of the command.
+        * @return None.
+        */
+        void MediatorCommandL( TUid aDomain,
+                               TUid aCategory, 
+                               TInt aCommandId,
+                               TVersion aVersion, 
+                               const TDesC8& aData );
+
+        /**
+        * Cancel a Mediator Service command.
+        *
+        * @since S60 3.1        
+        * @param aDomain    The identifier of the domain      
+        * @param aCategory  The identifier of the category.
+        * @param aCommandId The identifier of the command.        
+        * @return None.
+        */
+        void CancelMediatorCommandL( TUid aDomain,
+                                     TUid aCategory, 
+                                     TInt aCommandId );
+                                     
+        /**
+        * Mediator command timeout has occurred
+        *
+        * @since S60 3.1        
+        * @param aDomain    The identifier of the domain      
+        * @param aCategory  The identifier of the category.
+        * @param aCommandId The identifier of the command.        
+        * @return None.
+        */
+        void MediatorCommandTimeoutL( TUid aDomain,
+                                      TUid aCategory, 
+                                      TInt aCommandId );                                      
+    public:
+    
+        /**
+        * A response to a Mediator Service command.
+        *
+        * @since S60 3.1
+        * @param aDomain    The identifier of the domain          
+        * @param aCategory  The identifier of the category.
+        * @param aCommandId The identifier of the command.
+        * @param aStatus    Standard Symbian error code indicating the
+        *                   success of the command.
+        * @param aData      The parameters of the response.
+        * @return None.
+        */
+        void CommandResponseL( TUid aDomain,
+                               TUid aCategory, 
+                               TInt aCommandId,
+                               TInt aStatus, 
+                               const TDesC8& aData );                                    
+    
+    public: // from MMediatorServerEventObserver
+        
+        /**
+        * A Mediator Service event.
+        *
+        * @since S60 3.1        
+        * @param aDomain    The identifier of the domain.
+        * @param aCategory  The identifier of the category.
+        * @param aEventId   The identifier of the event.
+        * @param aData      The parameters of the event.
+        * @return None.
+        */
+        void MediatorEventL( TUid aDomain,
+                             TUid aCategory, 
+                             TInt aEventId, 
+                             const TDesC8& aData );
+                             
+    public:  // from MMediatorServerNotificationObserver
+
+       /**
+        * Events have been registered. The events can now be subscribed.
+        * The list can contain 1-n new events into the category.
+        *
+        * @since S60 3.1
+        * @param aDomain    The identifier of the domain.
+        * @param aCategory  The identifier of the category.
+        * @param aEvents    The list of events that have been registered.
+        * @return None.
+        */
+        void MediatorEventsAddedL( TUid aDomain, 
+                                   TUid aCategory, 
+                                   const REventList& aEvents );
+
+        /**
+        * New commands have been registered. The commands can now be subscribed.
+        * The list can contain 1-n new commands into the category.
+        *
+        * @since S60 3.1
+        * @param aDomain    The identifier of the domain.
+        * @param aCategory  The identifier of the category.
+        * @param aCommands  List of commands that have been registered.
+        * @return None.
+        */
+        void MediatorCommandsAddedL( TUid aDomain, 
+                                     TUid aCategory,
+                                     const RCommandList& aCommands );
+         
+        /**
+        * A category has been removed. All subscriptions are cancelled.
+        *
+        * @since S60 3.1
+        * @param aDomain    The identifier of the domain.
+        * @param aCategory  The identifier of the category.        
+        * @return None.
+        */
+        void MediatorCategoryRemovedL( TUid aDomain, TUid aCategory );
+
+        /**
+        * List of events has been removed. All subscriptions are cancelled.
+        * List can contain 1-n events from the specified category.
+        *
+        * @since S60 3.1
+        * @param aDomain    The identifier of the domain.
+        * @param aCategory  The identifier of the category.
+        * @param aEvents    The list of events removed.
+        * @return None.
+        */
+        void MediatorEventsRemovedL( TUid aDomain, 
+                                     TUid aCategory,
+                                     const REventList& aEvents );
+                                             
+        /**
+        * List of commands have been removed. All subscriptions are cancelled.
+        * List can contain 1-n commands from the specified category.
+        *
+        * @since S60 3.1
+        * @param aDomain    The identifier of the domain.
+        * @param aCategory  The identifier of the category.
+        * @param aCommands  The list of commands removed
+        * @return None.
+        */
+        void MediatorCommandsRemovedL( TUid aDomain, 
+                                       TUid aCategory,
+                                       const RCommandList& aCommands );
+    private: // new functions
+        
+        /**
+        * Server returns the server reference.
+        * @since S60 3.1
+        * @param void
+        * @return Mediator Server reference
+        */      
+        CMediatorServer& Server();
+        
+        /**
+        * Reads category (and domain) information from message.
+        * @since S60 3.1
+        * @param aMessage reference to message
+        * @param aMessageSlot where category information can be found
+        * @return TMediatorCategory information
+        */      
+        TMediatorCategory ReadCategoryL( const RMessage2& aMessage,
+                                         const TInt aMessageSlot );
+                                         
+        /**
+        * Writes category (and domain) information to message.
+        * @since S60 3.1
+        * @param aDomain UID of the domain
+        * @param aCategory UID of the category
+        * @param aMessage reference to target message
+        * @param aMessageSlot where information is written
+        * @return none
+        */      
+        void WriteCategoryL( TUid aDomain,
+                             TUid aCategory,
+                             const RMessage2& aMessage,
+                             const TInt aMessageSlot );      
+        
+        /**
+        * Reads event from message
+        * @since S60 3.1
+        * @param aMessage reference to message
+        * @param aMessageSlot where event information can be found
+        * @return MediatorService::TEvent information
+        */      
+        MediatorService::TEvent ReadEventL( const RMessage2& aMessage,
+                                            const TInt aMessageSlot );
+        
+        /**
+        * Reads command from message
+        * @since S60 3.1
+        * @param aMessage reference to message
+        * @param aMessageSlot where event information can be found
+        * @return MediatorService::TCommand information
+        */      
+        MediatorService::TCommand ReadCommandL( const RMessage2& aMessage,
+                                                const TInt aMessageSlot );
+        
+        /**
+        * Writes event to message.
+        * @since S60 3.1
+        * @param aEventId id of the event
+        * @param aMessage reference to target message
+        * @param aMessageSlot wwhere information is written
+        * @return none
+        */      
+        void WriteEventL( TInt aEventId,
+                          const RMessage2& aMessage,
+                          const TInt aMessageSlot );   
+
+        /**
+        * Writes command to message.
+        * @since S60 3.1
+        * @param aCommandId id of the command
+        * @param aVersion version of the command
+        * @param aMessage reference to target message
+        * @param aMessageSlot wwhere information is written
+        * @return none
+        */      
+        void WriteCommandL( TInt aCommandId,
+                            TVersion aVersion,
+                            const RMessage2& aMessage,
+                            const TInt aMessageSlot );                                 
+        
+        /**
+        * Reads event list from message.
+        * @since S60 3.1
+        * @param aMessage reference to target message
+        * @param aMessageSlot where information is written
+        * @return REventList list of read events
+        */      
+        REventList ReadEventListL( const RMessage2& aMessage,
+                                   const TInt aMessageSlot );   
+                             
+        /**
+        * Writes event list to message.
+        * @since S60 3.1
+        * @param aEvents list of events
+        * @param aMessage reference to target message
+        * @param aMessageSlot where information is written
+        * @return none
+        */      
+        void WriteEventListL( const REventList& aEvents,
+                              const RMessage2& aMessage,
+                              const TInt aMessageSlot );   
+        
+        /**
+        * Writes event list to message.
+        * @since S60 5.1
+        * @param aEvents list of events        
+        * @return none
+        */      
+        void WriteEventListToBufferL( const REventList& aEvents );
+
+        /**
+        * Reads command list from message.
+        * @since S60 3.1
+        * @param aMessage reference to target message
+        * @param aMessageSlot where information is written
+        * @return RCommandList list of read commands
+        */      
+        RCommandList ReadCommandListL( const RMessage2& aMessage,
+                                       const TInt aMessageSlot );  
+                                                         
+        /**
+        * Writes command list to message.
+        * @since S60 3.1
+        * @param aEvents list of events
+        * @param aMessage reference to target message
+        * @param aMessageSlot where information is written
+        * @return none
+        */      
+        void WriteCommandListL( const RCommandList& aCommands,
+                                const RMessage2& aMessage,
+                                const TInt aMessageSlot );     
+                                                              
+        /**
+        * Reads data from message.
+        * Note that leaves the pointer to cleanup stack.
+        * @since S60 3.1
+        * @param aMessage reference to target message
+        * @param aMessageSlot where information is read
+        * @return HBufC8 pointer to data buffer
+        */      
+        HBufC8* ReadDataLC( const RMessage2& aMessage,
+                            const TInt aMessageSlot );      
+                                               
+        /**
+        * Writes data to message.
+        * @since S60 3.1
+        * @param aData reference to data buffer
+        * @param aMessage reference to target message
+        * @param aMessageSlot where category information can be found
+        * @return none
+        */      
+        void WriteDataL( const TDesC8& aData,
+                         const RMessage2& aMessage,
+                         const TInt aMessageSlot );                                                                                                       
+                                         
+                                                 
+        
+        /**
+        * Dispatches incoming client-server request
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void DispatchMessageL( const RMessage2& aMessage );
+        
+        /**
+        * Registers list of events to Event Handler
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void RegisterEventListL( const RMessage2& aMessage );
+        
+        /**
+        * Registers list of commands to Command Handler
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void RegisterCommandListL( const RMessage2& aMessage );
+        
+        /**
+        * Unregisters event(s)
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void UnregisterEventListL( const RMessage2& aMessage );
+        
+         /**
+        * Unregisters command(s)
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void UnregisterCommandListL( const RMessage2& aMessage );
+        
+        /**
+        * Subscribes to event(s)
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void SubscribeEventListL( const RMessage2& aMessage );
+        
+        
+        /**
+        * Ubsubscribes to event(s)
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void UnsubscribeEventListL( const RMessage2& aMessage );
+        
+        /**
+        * Handles incoming event notification request
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void RaiseEventL( const RMessage2& aMessage );
+        
+        /**
+        * Handles incoming command request
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void IssueCommandL( const RMessage2& aMessage );
+        
+        /**
+        * Cancels ongoing command process
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void CancelCommandL( const RMessage2& aMessage );
+        
+        /**
+        * Handles incoming command response
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void IssueResponseL( const RMessage2& aMessage );
+        
+        /**
+        * Gets registered domains
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void GetDomainsL( const RMessage2& aMessage );
+        
+        /**
+        * Gets registered categories
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void GetCategoriesL( const RMessage2& aMessage );
+        
+        /**
+        * Gets registered commands
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void GetCommandsL( const RMessage2& aMessage );
+        
+        /**
+        * Gets registered events
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void GetEventsL( const RMessage2& aMessage );
+     
+    private:    // For async notifications
+    
+        /**
+        * Turn on async waiting for events
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void WaitForEventsL( const RMessage2& aMessage );
+        
+        /**
+        * Turn on async waiting for commands
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void WaitForCommandsL( const RMessage2& aMessage );
+    
+        /**
+        * Turn on async waiting for events/command registrations changes
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void WaitForNotificationsL( const RMessage2& aMessage );
+        
+        /**
+        * Turn off async waiting for events/command registrations changes
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void CancelNotificationsL( const RMessage2& aMessage );
+        
+        /**
+        * Turn on async waiting for command responses
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void WaitForCommandResponseL( const RMessage2& aMessage );
+        
+        /**
+        * Fetch method to get full amount of parameter data
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void FetchParameterDataL( const RMessage2& aMessage );
+        
+        /**
+        * Fetch method to get full event list
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void FetchNotificationEventListL( const RMessage2& aMessage );
+        
+        /**
+        * Fetch method to get full command list
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void FetchNotificationCommandListL( const RMessage2& aMessage );
+        
+        /**
+        * Cancels all async operations
+        * 
+        * @since S60 3.1
+        * @param aMessage message to be handled
+        * @return None.
+        */
+        void CancelAll( const RMessage2& aMessage );
+        
+        /**
+        * Cancels all async operations
+        * 
+        * @since S60 3.1
+        * @param aError error code causing cancelation
+        * @return None.
+        */
+        void CancelAll( TInt aError );
+        
+        /**
+        * Returns whether event list can be passed with provided client message.
+        */
+        TBool EventListFitsToClientMemory( const REventList& aEvents,
+                                           const RMessage2& aMessage,
+                                           const TInt aMessageSlot );
+        
+        /**
+        * Returns whether command list can be passed with provided client message.
+        */
+        TBool CommandListFitsToClientMemory( const RCommandList& aCommands,
+                                             const RMessage2& aMessage,
+                                             const TInt aMessageSlot );
+        
+        
+        /**
+        * Handles an event registration status change (events either added or removed). 
+        * Events are buffered to nofication queue if they cannot be passed to the client
+        * with the current request.  
+        */
+        void HandleMediatorEventsChangedL( TMediatorNotificationType aNotificationType,
+                                           const TUid& aDomain, 
+                                           const TUid& aCategory, 
+                                           const REventList& aEvents );
+        
+        /**
+        * Completes the current notification request due to events registration status change.
+        * 
+        * @param[out] aEventsPassedToClient if ETrue, the provided event list was passed to client
+        *                                   with the current request.
+        */
+        void DoMediatorEventsChangedL( TMediatorNotificationType aNotificationType, 
+                                       const TUid& aDomain, 
+                                       const TUid& aCategory, 
+                                       const REventList& aEvents,
+                                       TBool& aEventsPassedToClient );
+        
+        /**
+        * Completes the current notification request due to removal of a category.
+        */
+        void DoMediatorCategoryRemovedL( const TUid& aDomain, const TUid& aCategory );
+        
+        /**
+        * Handles a command registrations status change (commands either added or removed). 
+        * Commands are buffered to nofication queue if they cannot be passed to 
+        * the client with the current request.  
+        */
+        void HandleMediatorCommandsChangedL( TMediatorNotificationType aNotificationType,
+                                                 const TUid& aDomain, 
+                                                 const TUid& aCategory, 
+                                                 const RCommandList& aCommands );
+        
+        /**
+        * Completes the current notification request due to commands registration status change.
+        * 
+        * @param[out] aCommandsPassedToClient if ETrue, the provided command list was passed to client
+        *                                   with the current request.
+        */
+        void DoMediatorCommandsChangedL( TMediatorNotificationType aNotificationType, 
+                                         const TUid& aDomain, 
+                                         const TUid& aCategory, 
+                                         const RCommandList& aCommands,
+                                         TBool& aCommandsPassedToClient );
+
+        /**
+        * Empties the notification queue.
+        */
+        void CleanNotificationQueue();
+        
+        /**
+        * Completes the current notification request with the next notification in queue,
+        * if any.
+        */
+        void PurgeNextBufferedNotificationL();
+        
+    private:
+    
+    	/**
+        * Constructor.
+        */
+        CMediatorServerSession();
+    
+    
+    private:    // data
+        
+        friend class RMediatorDebug;
+        // For async event notification
+        RMessage2       iEventNotificationMessage;
+        
+        // For async notification
+        RMessage2       iNotificationMessage;
+        
+        // For async command initiations
+        RMessage2       iCommandInitMessage;
+        
+        // For async command responses
+        RMessage2       iCommandResponseMessage;
+        
+        // Status if notifications are registered
+        TBool           iNotificationsRegistered;
+        
+        // Event service buffer
+        RPointerArray<CEvent>  iEventServiceList;
+        
+        // Command service buffer
+        RPointerArray<CCommand>  iCommandServiceList;
+        
+        /**
+        * Reserve buffer for big amount of data
+        * Own.
+        */
+        HBufC8* iDataBuffer;
+        
+        /**
+        * Queue for buffering notifications. 
+        */
+        TSglQue<CMediatorQueItem> iNotificationQueue;
+    
+	};
+
+
+#endif  // MEDIATORSERVERSESSION_H
+
+// End of File