00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __GZ_DIST_SESSION_SERVER_H__
00022 #define __GZ_DIST_SESSION_SERVER_H__
00023
00029
00030 #include "gzDistBase.h"
00031 #include "gzDistServer.h"
00032 #include "gzDistServerInternal.h"
00033
00034
00035 class gzDistSessionMessage;
00036 class gzDistSessionServerEngine;
00037 class gzDistObjectAttribute;
00038
00039
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
00061
00062 GZ_DIST_DECLARE_MEMBASE(gzDistSessionMessage);
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
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
00088 gzDistSessionMessage(gzDistSessionMessageType type);
00089
00090
00091 virtual ~gzDistSessionMessage();
00092
00093
00094 gzVoid setObjectName(const gzString& name);
00095
00096
00097 const gzString& getObjectName();
00098
00099
00100 const gzString& getAttributeName();
00101
00102
00103 gzVoid setAttributeName(const gzString& name);
00104
00105
00106 gzVoid setEvent(gzDistEvent* event);
00107
00108
00109 gzDistEvent* getEvent();
00110
00111
00112 gzVoid setObject(gzDistObject* object);
00113
00114
00115 gzDistObject* getObject();
00116
00117
00118 gzVoid setClientID(const gzDistClientID& id);
00119
00120
00121 const gzDistClientID& getClientID();
00122
00123
00124 gzDistTransaction* getTransaction();
00125
00126
00127 gzVoid setTransaction(gzDistTransaction* transaction);
00128
00129
00130 gzVoid setPrio(gzBool prio);
00131
00132 gzBool getPrio();
00133
00134
00135
00136
00137 gzDistThreadSafeReferencePtr reference;
00138
00139
00140 gzDistThreadSafeReferencePtr additional_ref;
00141
00142
00143 gzString* objectName;
00144
00145
00146 gzString* attributeName;
00147
00148
00149 gzDistClientID clientID;
00150
00151
00152 gzDistSessionMessageType type;
00153
00154
00155 gzBool m_throughSession;
00156
00157
00158 gzBool m_highPrio;
00159 };
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
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
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 class gzDistSessionServer
00209 {
00210 public:
00211
00212
00213 gzDistSessionServer(gzDistSession* session, gzDistServerPriority priority);
00214
00215
00216 ~gzDistSessionServer();
00217
00218
00219 gzString getSessionName() const;
00220
00221
00222 gzBool isActive() const;
00223
00224
00225 gzBool isInstalled() const;
00226
00227
00228
00229
00230 gzVoid sendEvent(gzDistEvent* event, const gzDistClientID& clientId);
00231
00232
00233
00234
00235
00236 gzVoid addObject(gzDistObject* object, const gzDistClientID& clientId);
00237
00238
00239
00240 gzVoid updateObject(gzDistTransaction* transaction, gzDistObject* object, const gzDistClientID& clientId);
00241
00242
00243
00244 gzVoid removeObject(gzDistObject* object, const gzDistClientID& clientId);
00245
00246
00247
00248 gzVoid removeAttributes(gzDistTransaction* transaction, gzDistObject* object, const gzDistClientID& clientId);
00249
00250
00251
00252 gzVoid dropOwnership(gzDistObjectAttribute* attribute, gzDistObject* object, const gzDistClientID& clientId);
00253
00254
00255
00256
00257 gzVoid requestOwnership(gzDistObjectAttribute* attribute, gzDistObject* object, const gzDistClientID& clientId);
00258
00259
00260
00261
00262 gzVoid pullOwnership(gzDistObjectAttribute* attribute, gzDistObject* object, const gzDistClientID& clientId);
00263
00264
00265 void clearMessages(gzList<gzDistSessionMessage>* list);
00266
00267
00268 void getReceivedData(gzList<gzDistSessionMessage>** list);
00269
00270 gzDistSessionMessage* getPriorityMessage();
00271
00272
00273 gzVoid sendServerMessage(gzDistSessionMessage* message);
00274
00275
00276 gzVoid shutDown();
00277
00278
00279 gzBool hasPendingData();
00280
00281
00282
00283
00284
00285
00286
00287 gzVoid onInstall();
00288
00289
00290
00291 gzBool onTick();
00292
00293
00294 gzVoid onUninstall();
00295
00296
00297 gzVoid onReceiveMessage(gzDistRemoteMessageSession* message);
00298
00299 private:
00300
00301
00302
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
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
00331 gzList<gzDistSessionMessage>* m_sessionReceiveList;
00332
00333
00334 gzList<gzDistSessionMessage>* m_processList;
00335
00336
00337 gzMutex m_sessionReceiveListLocker;
00338
00339
00340 gzRefList<gzDistRemoteMessageSession> m_receivedRemoteMessages;
00341
00342
00343 gzList<gzDistSessionMessage>* m_sessionSendList;
00344
00345
00346 gzMutex m_sessionSendListLocker;
00347
00348
00349 gzList<gzDistSessionMessage> m_sessionHighPrioMessages;
00350
00351 gzList<gzDistSessionMessage> m_receivedHighPrioMessages;
00352
00353
00354 gzDistSerializeAdapterMemory m_memoryAdapter;
00355
00356
00357 gzDistSessionServerEngine* m_serverEngine;
00358
00359
00360 gzString m_sessionName;
00361
00362
00363 gzDistSession* m_session;
00364
00365
00366 gzDistServerImpl* m_server;
00367
00368
00369 gzDistManagerPtr m_manager;
00370
00371 gzList<gzDistServerMessage>* m_serverMessageList;
00372
00373
00374 gzDistInstanceID m_activeServerID;
00375
00376
00377 gzList<gzDistInstanceUpdate> m_instancesToUpdate;
00378
00379
00380 gzDistInstanceUpdate m_updatingInstance;
00381
00382
00383
00384 gzRefList<gzDistObject> m_sessionObjectsToDispatch;
00385
00386
00387 gzBool m_installed;
00388
00389
00390 gzBool m_active;
00391
00392
00393
00394 gzBool m_initialized;
00395 };
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415 class gzDistSessionServerEngine : protected gzThread
00416 {
00417 public:
00418
00419
00420 static gzDistSessionServerEngine* startEngine(gzDistRemoteChannelInterface* sessionChannel);
00421
00422
00423 static gzDistSessionServerEngine* getEngine();
00424
00425
00426 static gzVoid trigger();
00427
00428
00429 gzVoid shutDown();
00430
00431
00432 gzBool install(gzDistSessionServer* server);
00433
00434
00435 gzBool uninstall(gzDistSessionServer* server);
00436
00437
00438 gzBool send(gzDistRemoteMessageSession* message);
00439
00440
00441 gzUInt getProtocolHeaderSize();
00442
00443 gzBool hasPendingData();
00444
00445 public:
00446
00447 gzDistSessionServerEngine(gzDistRemoteChannelInterface* sessionChannel);
00448
00449 virtual ~gzDistSessionServerEngine();
00450
00451 private:
00452
00453
00454 gzVoid process();
00455 gzVoid processServers();
00456 gzULong receiveMessages();
00457 gzVoid checkNewRemovedServers();
00458
00459
00460 gzDistRemoteChannelInterface* m_sessionChannel;
00461
00462
00463 gzList<gzDistSessionServer> m_installList;
00464 gzMutex m_installLocker;
00465
00466
00467 gzList<gzDistSessionServer> m_uninstallList;
00468 gzMutex m_uninstallLocker;
00469
00470
00471 gzDict<gzString, gzDistSessionServer> m_serverDict;
00472
00473
00474 static gzDistSessionServerEngine* m_instance;
00475 static gzMutex m_instanceLocker;
00476
00477
00478 gzDistSessionServerEngine(const gzDistSessionServerEngine&);
00479 gzDistSessionServerEngine operator=(const gzDistSessionServerEngine&);
00480
00481
00482 gzDistTrigger m_trigger;
00483
00484 gzBool m_hasPendingServer;
00485 };
00486
00487 #endif