GizmoDistribution

gzDistSessionServer.h

Go to the documentation of this file.
00001 //*****************************************************************************
00002 // File         : gzDistSessionServer.h
00003 // Module       : gzDistribution
00004 // Description  : Internal session server definitions
00005 // Author       : Christian Andersson, Anders Sandblad
00006 // Product      : GizmoDistribution 2.1.1
00007 //
00008 // Copyright © 2004 - Saab Training Systems AB, Sweden
00009 //          
00010 // NOTE:    GizmoDistribution is a toolkit used for implementing distributed 
00011 //          objects and events in C++
00012 //
00013 //
00014 // Revision History...
00015 //
00016 // Who  Date    Description
00017 //
00018 // CAN  040217  Created file
00019 //
00020 //*****************************************************************************
00021 #ifndef __GZ_DIST_SESSION_SERVER_H__
00022 #define __GZ_DIST_SESSION_SERVER_H__
00023 
00029 // Includes
00030 #include "gzDistBase.h"
00031 #include "gzDistServer.h"
00032 #include "gzDistServerInternal.h"
00033 
00034 // Forward declarations
00035 class gzDistSessionMessage;
00036 class gzDistSessionServerEngine;
00037 class gzDistObjectAttribute;
00038 
00039 // Session message types
00040 enum gzDistSessionMessageType
00041 {
00042     GZ_DIST_SESSION_MESSAGE_TYPE_EVENT,
00043     GZ_DIST_SESSION_MESSAGE_TYPE_ADD_OBJECT,
00044     GZ_DIST_SESSION_MESSAGE_TYPE_ADD_OBJECT_REQUEST,
00045     GZ_DIST_SESSION_MESSAGE_TYPE_REMOVE_OBJECT,
00046     GZ_DIST_SESSION_MESSAGE_TYPE_REMOVE_OBJECT_REQUEST,
00047     GZ_DIST_SESSION_MESSAGE_TYPE_UPDATE_OBJECT,
00048     GZ_DIST_SESSION_MESSAGE_TYPE_UPDATE_OBJECT_REQUEST,
00049     GZ_DIST_SESSION_MESSAGE_TYPE_REMOVE_ATTRIBUTES,
00050     GZ_DIST_SESSION_MESSAGE_TYPE_REMOVE_ATTRIBUTES_REQUEST,
00051     GZ_DIST_SESSION_MESSAGE_TYPE_SYNCHRONIZE_OBJECT,
00052     GZ_DIST_SESSION_MESSAGE_TYPE_REQUEST_OWNERSHIP,
00053     GZ_DIST_SESSION_MESSAGE_TYPE_SET_OWNERSHIP,
00054     GZ_DIST_SESSION_MESSAGE_TYPE_DROP_OWNERSHIP,
00055     GZ_DIST_SESSION_MESSAGE_TYPE_PULL_OWNERSHIP,
00056     GZ_DIST_SESSION_MESSAGE_TYPE_REMOVE_INSTANCE
00057 };
00058 
00059 
00060 //----------------------- gzDistSessionServerMessage --------------------------
00061 
00062 GZ_DIST_DECLARE_MEMBASE(gzDistSessionMessage);
00063 
00064 //*****************************************************************************
00065 // Class    : gzDistSessionMessage
00066 //                                  
00067 // Purpose  : Session message class
00068 //                                  
00069 // Notes    : - 
00070 //                                  
00071 // Revision History...                          
00072 //                                  
00073 // Who  Date    Description                     
00074 //                                  
00075 // CAN  040217  Created 
00076 //                                  
00077 //*****************************************************************************
00078 // Internal messages used by the session server
00079 class gzDistSessionMessage GZ_DIST_MEMBASE_SINGLE(gzDistSessionMessage)
00080 {
00081     public:
00082 
00083         GZ_DIST_MEMBASE_IMP(gzDistSessionMessage);
00084 
00085         GZ_DIST_MEMBASE_CALL(gzDistSessionMessage);
00086     
00087         // Constructor
00088         gzDistSessionMessage(gzDistSessionMessageType type);
00089 
00090         // Destructor
00091         virtual ~gzDistSessionMessage();
00092 
00093         // Set an object name in message;
00094         gzVoid setObjectName(const gzString& name);
00095         
00096         // Get the object name in message.
00097         const gzString& getObjectName();    
00098 
00099         // Get the attribute name in message;
00100         const gzString& getAttributeName();
00101 
00102         // Set an attribute name in message;
00103         gzVoid setAttributeName(const gzString& name);  
00104 
00105         // Set an event in message.
00106         gzVoid setEvent(gzDistEvent* event);
00107 
00108         // Get event from message.
00109         gzDistEvent* getEvent();
00110 
00111         // Set an object in message.
00112         gzVoid setObject(gzDistObject* object);
00113 
00114         // Get object from message.
00115         gzDistObject* getObject();
00116 
00117         // Set client ID in message.
00118         gzVoid setClientID(const gzDistClientID& id);
00119 
00120         // Get client ID from message.
00121         const gzDistClientID& getClientID();
00122 
00123         // Get transaction from message
00124         gzDistTransaction* getTransaction();
00125 
00126         // Set transaction to message
00127         gzVoid setTransaction(gzDistTransaction* transaction);
00128 
00129         // Set prio.
00130         gzVoid setPrio(gzBool prio);
00131 
00132         gzBool getPrio();
00133 
00134     // Members:
00135 
00136         // A reference to data that will be sent (object, event etc.)
00137         gzDistThreadSafeReferencePtr reference;
00138 
00139         // A reference to a transaction or attribute.
00140         gzDistThreadSafeReferencePtr additional_ref;
00141 
00142         // The name of an object.
00143         gzString* objectName;
00144 
00145         // The name of an attribute.
00146         gzString* attributeName;
00147 
00148         // An id to a client.
00149         gzDistClientID clientID;
00150 
00151         // The type of message.
00152         gzDistSessionMessageType type;
00153 
00154         // Tells if the message has gone through its own session.
00155         gzBool m_throughSession;
00156 
00157         // Priority
00158         gzBool m_highPrio;
00159 };
00160 
00161 
00162 //------------------------- gzDistInstanceUpdate ------------------------
00163 
00164 // *****************************************************************************
00165 // Class    : gzDistInstanceUpdate
00166 //                                  
00167 // Purpose  : Session server class
00168 //                                  
00169 // Notes    : - 
00170 //                                  
00171 // Revision History...                          
00172 //                                  
00173 // Who  Date    Description                     
00174 //                                  
00175 // CAN  040406  Created 
00176 //                                  
00177 // *****************************************************************************
00178 // Internal instance update
00179 class gzDistInstanceUpdate
00180 {
00181     public:
00182         gzDistInstanceUpdate();
00183         gzDistInstanceUpdate(const gzDistInstanceID& id, gzDistServerMessageType type);
00184         ~gzDistInstanceUpdate();
00185 
00186         gzDistInstanceID m_instanceID;
00187         gzDistServerMessageType m_type;
00188 };
00189 
00190 
00191 //---------------------------- gzDistSessionServer ---------------------------
00192 
00193 //*****************************************************************************
00194 // Class    : gzDistSessionServer
00195 //                                  
00196 // Purpose  : Session server class
00197 //                                  
00198 // Notes    : - 
00199 //                                  
00200 // Revision History...                          
00201 //                                  
00202 // Who  Date    Description                     
00203 //                                  
00204 // CAN  040217  Created 
00205 //                                  
00206 //*****************************************************************************
00207 // Internal session server for global sessions
00208 class gzDistSessionServer
00209 {
00210     public:
00211         
00212         // Constructor
00213         gzDistSessionServer(gzDistSession* session, gzDistServerPriority priority);
00214     
00215         // Destructor
00216         ~gzDistSessionServer();
00217 
00218         // Get the name of the session
00219         gzString getSessionName() const;
00220 
00221         // Returns TRUE if current instance is the activeserver.
00222         gzBool isActive() const;
00223         
00224         // Is the server installed ?
00225         gzBool isInstalled() const;
00226 
00227         // Send the event on network.
00228         /* \param event     The event to send.
00229            \param clientId  The identification of the sending client.*/
00230         gzVoid sendEvent(gzDistEvent* event, const gzDistClientID& clientId);
00231 
00232         // Distribute the object globaly if server.
00233         /* If not server, ask current server to add object.
00234             \param object   The object to add.
00235             \param clientId The identification of the sending client.*/
00236         gzVoid addObject(gzDistObject* object, const gzDistClientID& clientId);
00237 
00238         // Distribute the transaction globaly if server.
00239         // If not server, ask current server to do the transaction.
00240         gzVoid updateObject(gzDistTransaction* transaction, gzDistObject* object, const gzDistClientID& clientId);
00241 
00242         // Remove object globaly if server.
00243         // If not server, ask current server to remove the object.
00244         gzVoid removeObject(gzDistObject* object, const gzDistClientID& clientId);
00245 
00246         // Remove attributes from object globaly if server.
00247         // If not server, ask current server to remove the attributes.
00248         gzVoid removeAttributes(gzDistTransaction* transaction, gzDistObject* object, const gzDistClientID& clientId);
00249 
00250         // If server, distribute the drop globaly to nextOwner.
00251         // If not server, ask current server to drop it.
00252         gzVoid dropOwnership(gzDistObjectAttribute* attribute, gzDistObject* object, const gzDistClientID& clientId);
00253 
00254         // If server, distribute the request globaly.
00255         // Note: This message must always be received and processed by itself.
00256         // If not server, ask current server to do the request globaly.
00257         gzVoid requestOwnership(gzDistObjectAttribute* attribute, gzDistObject* object, const gzDistClientID& clientId);
00258 
00259         // If server, distribute the request globaly.
00260         // Note: This message must always be received and processed by itself.
00261         // If not server, ask current server to do the pull globaly.
00262         gzVoid pullOwnership(gzDistObjectAttribute* attribute, gzDistObject* object, const gzDistClientID& clientId);
00263         
00264         // Delete all messages in list;
00265         void clearMessages(gzList<gzDistSessionMessage>* list);
00266 
00267         // Gives m_sessionSendList to caller and gets an empty list.
00268         void getReceivedData(gzList<gzDistSessionMessage>** list);
00269 
00270         gzDistSessionMessage* getPriorityMessage();
00271 
00272         // Puts a message in m_sessionReceiveList that will be processed by the gzDistSessionServer.
00273         gzVoid sendServerMessage(gzDistSessionMessage* message);
00274 
00275         // Tell the server to shut down.
00276         gzVoid shutDown();
00277 
00278         // Check if there are any messages to or from the sessionserver.
00279         gzBool hasPendingData();
00280 
00281         // Check if the session is synchronized.
00282 //      gzBool isSynchronized();
00283 
00284         //------ engine callbacks ------
00285 
00286         // Server engine install callback
00287         gzVoid onInstall();
00288 
00289         // Tick engine callback
00290         // Return TRUE if it has more data to process.
00291         gzBool onTick();
00292 
00293         // Server engine uninstall callback
00294         gzVoid onUninstall();
00295 
00296         // Remote message receive callback
00297         gzVoid onReceiveMessage(gzDistRemoteMessageSession* message);
00298 
00299     private:
00300 
00301         // Process a message from its session.
00302         // Returns TRUE if the message should be deleted.
00303         gzBool processSessionMessage(gzDistSessionMessage* message);
00304 
00305         gzVoid processServerMessage(gzDistServerMessage* serverMessage);
00306 
00307         gzVoid sendSessionMessage(gzDistSessionMessage* message);
00308 
00309         gzVoid sendObject(gzDistRemoteMessageSession* remoteMessage, gzDistSessionMessage* sessionMessage);
00310 
00311         gzVoid sendTransaction(gzDistRemoteMessageSession* remoteMessage, gzDistSessionMessage* sessionMessage);
00312 
00313         gzVoid storeSessionBodyHeader(const gzString& sessionName, const char* typeName, const gzDistClientID& id);
00314 
00315         gzVoid requestUpdate(const gzDistInstanceID& id, gzDistServerMessageType type);
00316 
00317         // Return TRUE if it has more data to process.
00318         gzBool processInstanceUpdates();
00319 
00320         gzVoid sendObject(gzDistObject* object);
00321 
00322         gzVoid sendEndDispatch();
00323 
00324         gzVoid onTransaction(gzDistSessionMessageType messageType, gzDistRemoteMessageSession* message);
00325 
00326         gzBool processReceivedMessages();
00327 
00328         gzBool processReceivedMessage(gzDistRemoteMessageSession* message);
00329 
00330         // Messages from session.
00331         gzList<gzDistSessionMessage>* m_sessionReceiveList;
00332 
00333         // List used when processing received data.
00334         gzList<gzDistSessionMessage>* m_processList;
00335 
00336         // Locker for m_sessionReceiveList
00337         gzMutex m_sessionReceiveListLocker;
00338 
00339         // Received remote messages
00340         gzRefList<gzDistRemoteMessageSession> m_receivedRemoteMessages;
00341 
00342         // Messages to session.
00343         gzList<gzDistSessionMessage>* m_sessionSendList;
00344 
00345         // Locker for m_sessionSendList
00346         gzMutex m_sessionSendListLocker;
00347 
00348         // High priority messages from session.
00349         gzList<gzDistSessionMessage> m_sessionHighPrioMessages;
00350 
00351         gzList<gzDistSessionMessage> m_receivedHighPrioMessages;
00352     
00353         // A adapter used for serializing data.
00354         gzDistSerializeAdapterMemory m_memoryAdapter;
00355 
00356         // The engine
00357         gzDistSessionServerEngine* m_serverEngine;
00358 
00359         // The name of the session
00360         gzString m_sessionName;
00361 
00362         // My session.
00363         gzDistSession* m_session;
00364         
00365         // The server part
00366         gzDistServerImpl* m_server;
00367 
00368         // Reference to current gzDistManager
00369         gzDistManagerPtr m_manager;
00370 
00371         gzList<gzDistServerMessage>* m_serverMessageList;
00372 
00373         // The id of current active server.
00374         gzDistInstanceID m_activeServerID;
00375 
00376         // Contains all instances that has requested an update or synchronization.
00377         gzList<gzDistInstanceUpdate> m_instancesToUpdate;
00378 
00379         // The instance that is updating from this process at the moment.
00380         gzDistInstanceUpdate m_updatingInstance;
00381 
00382         // This list contains object that are requested by other processes.
00383         // The list will normaly be empty i.e. when no synch or update is going on.
00384         gzRefList<gzDistObject> m_sessionObjectsToDispatch;
00385 
00386         // Is the server installed?
00387         gzBool m_installed;
00388 
00389         // Is this instance the active session server?
00390         gzBool m_active;
00391 
00392         // In the startup phase we need to wait until the server is installed.
00393         // No work will be done until this flag is set to TRUE.
00394         gzBool m_initialized;
00395 };
00396 
00397 
00398 //------------------------- gzDistSessionServerEngine ------------------------
00399 
00400 //*****************************************************************************
00401 // Class    : gzDistSessionServerEngine
00402 //                                  
00403 // Purpose  : Session server engine class
00404 //                                  
00405 // Notes    : - 
00406 //                                  
00407 // Revision History...                          
00408 //                                  
00409 // Who  Date    Description                     
00410 //                                  
00411 // XAA  040227  Created 
00412 //                                  
00413 //*****************************************************************************
00414 // Internal thread engine for the session server
00415 class gzDistSessionServerEngine : protected gzThread
00416 {
00417     public:
00418     
00419         // Create and start the singleton engine instance
00420         static gzDistSessionServerEngine* startEngine(gzDistRemoteChannelInterface* sessionChannel);
00421 
00422         // Get the singleton engine instance
00423         static gzDistSessionServerEngine* getEngine();
00424 
00425         // Trigger the engine thread.
00426         static gzVoid trigger();
00427 
00428         // Shutdown the engine
00429         gzVoid shutDown();
00430 
00431         // Install server
00432         gzBool install(gzDistSessionServer* server);
00433 
00434         // Uninstall server
00435         gzBool uninstall(gzDistSessionServer* server);
00436 
00437         // Send remote message
00438         gzBool send(gzDistRemoteMessageSession* message);
00439 
00440         // Get the size of current protocol header.
00441         gzUInt getProtocolHeaderSize();
00442 
00443         gzBool hasPendingData();
00444 
00445     public:
00446 
00447         gzDistSessionServerEngine(gzDistRemoteChannelInterface* sessionChannel);
00448 
00449         virtual ~gzDistSessionServerEngine();
00450     
00451     private:
00452     
00453         // Engine thread
00454         gzVoid process();
00455         gzVoid processServers();
00456         gzULong receiveMessages();
00457         gzVoid checkNewRemovedServers();
00458         
00459         // Remote distribution server channel
00460         gzDistRemoteChannelInterface* m_sessionChannel;
00461 
00462         // Servers to be installed
00463         gzList<gzDistSessionServer> m_installList;
00464         gzMutex m_installLocker;
00465         
00466         // Servers to be uninstalled
00467         gzList<gzDistSessionServer> m_uninstallList;
00468         gzMutex m_uninstallLocker;
00469         
00470         // Installed servers (to be ticked)
00471         gzDict<gzString, gzDistSessionServer> m_serverDict;
00472 
00473         // Singleton instance
00474         static gzDistSessionServerEngine* m_instance;
00475         static gzMutex m_instanceLocker;
00476 
00477         // Disable copy and assignment
00478         gzDistSessionServerEngine(const gzDistSessionServerEngine&);
00479         gzDistSessionServerEngine operator=(const gzDistSessionServerEngine&);
00480 
00481         // A trigger used to trigger the engine thread.
00482         gzDistTrigger m_trigger;
00483 
00484         gzBool m_hasPendingServer;
00485 };
00486 
00487 #endif

Documentation for GizmoDistribution generated at Wed Feb 20 11:59:21 2008 by   Saab Training Systems AB, ¸ (c) 2003-and beyond