session.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef EQNET_SESSION_H
00019 #define EQNET_SESSION_H
00020
00021 #include <eq/net/dispatcher.h>
00022 #include <eq/net/object.h>
00023
00024 #include <eq/base/base.h>
00025 #include <eq/base/idPool.h>
00026 #include <eq/base/requestHandler.h>
00027
00028 namespace eq
00029 {
00030 namespace net
00031 {
00043 class Session : public Dispatcher
00044 {
00045 public:
00047 EQ_EXPORT Session();
00048
00050 EQ_EXPORT virtual ~Session();
00051
00055 uint32_t getID() const { return _id; }
00056
00061 NodePtr getLocalNode(){ return _localNode; }
00062
00067 EQ_EXPORT CommandQueue* getCommandThreadQueue();
00068
00071 NodePtr getServer(){ return _server; }
00073
00074
00077
00088 EQ_EXPORT virtual bool dispatchCommand( Command& packet );
00089
00100 EQ_EXPORT virtual CommandResult invokeCommand( Command& packet );
00102
00103
00126 EQ_EXPORT uint32_t genIDs( const uint32_t range );
00127
00137 EQ_EXPORT void freeIDs( const uint32_t start, const uint32_t range );
00138
00153 EQ_EXPORT void setIDMaster( const uint32_t id, const NodeID& master );
00154
00160 EQ_EXPORT void unsetIDMaster( const uint32_t id );
00161
00169 EQ_EXPORT const NodeID& getIDMaster( const uint32_t id );
00171
00172
00189 EQ_EXPORT bool registerObject( Object* object );
00190
00196 EQ_EXPORT void deregisterObject( Object* object );
00197
00229 EQ_EXPORT bool mapObject( Object* object, const uint32_t id,
00230 const uint32_t version = Object::VERSION_OLDEST );
00231
00233 EQ_EXPORT uint32_t mapObjectNB( Object* object, const uint32_t id,
00234 const uint32_t version = Object::VERSION_OLDEST );
00236 EQ_EXPORT bool mapObjectSync( const uint32_t requestID );
00237
00243 EQ_EXPORT void unmapObject( Object* object );
00244
00257 EQ_EXPORT void attachObject( Object* object, const uint32_t id,
00258 const uint32_t instanceID );
00259
00265 EQ_EXPORT void detachObject( Object* object );
00267
00268
00279 EQ_EXPORT virtual void notifyMapped( NodePtr node );
00281
00282 protected:
00292 void send( NodePtr node, SessionPacket& packet )
00293 {
00294 packet.sessionID = _id;
00295 node->send( packet );
00296 }
00297
00303 void send( SessionPacket& packet )
00304 {
00305 packet.sessionID = _id;
00306 _server->send( packet );
00307 }
00308
00315 template< typename T >
00316 void send( SessionPacket& packet, const std::vector<T>& data )
00317 {
00318 packet.sessionID = _id;
00319 _server->send( packet, data );
00320 }
00321
00322
00331 void send( NodePtr node, SessionPacket& packet,
00332 const std::string& text )
00333 {
00334 packet.sessionID = _id;
00335 node->send( packet, text );
00336 }
00337
00346 void send( NodePtr node, SessionPacket& packet,
00347 const void* data, const uint64_t size )
00348 {
00349 packet.sessionID = _id;
00350 node->send( packet, data, size );
00351 }
00352
00354 base::RequestHandler _requestHandler;
00356
00357 private:
00359 void _setLocalNode( NodePtr node );
00360
00361 friend class Node;
00363 NodePtr _localNode;
00364
00366 NodePtr _server;
00367
00369 uint32_t _id;
00370
00372 bool _isMaster;
00373
00375 base::IDPool _idPool;
00376
00378 uint32_t _instanceIDs;
00379
00380 typedef stde::hash_map< uint32_t, NodeID > NodeIDHash;
00382 NodeIDHash _idMasters;
00383 base::Lock _idMasterMutex;
00384
00386 ObjectVectorHash _objects;
00387 base::Lock _objectsMutex;
00388
00389 const NodeID& _pollIDMaster( const uint32_t id ) const;
00390 NodePtr _pollIDMasterNode( const uint32_t id ) const;
00391
00392 void _registerThreadObject( Object* object, const uint32_t id );
00393
00395 void _sendLocal( SessionPacket& packet )
00396 {
00397 packet.sessionID = _id;
00398 _localNode->send( packet );
00399 }
00400
00401 CommandResult _invokeObjectCommand( Command& packet );
00402 void _attachObject( Object* object, const uint32_t id,
00403 const uint32_t instanceID );
00404 void _detachObject( Object* object );
00405
00406 uint32_t _setIDMasterNB( const uint32_t id, const NodeID& master );
00407 void _setIDMasterSync( const uint32_t requestID );
00408
00409
00411 CommandResult _cmdAckRequest( Command& packet );
00412 CommandResult _cmdGenIDs( Command& packet );
00413 CommandResult _cmdGenIDsReply( Command& packet );
00414 CommandResult _cmdSetIDMaster( Command& packet );
00415 CommandResult _cmdGetIDMaster( Command& packet );
00416 CommandResult _cmdGetIDMasterReply( Command& packet );
00417 CommandResult _cmdAttachObject( Command& command );
00418 CommandResult _cmdDetachObject( Command& command );
00419 CommandResult _cmdMapObject( Command& command );
00420 CommandResult _cmdSubscribeObject( Command& command );
00421 CommandResult _cmdSubscribeObjectSuccess( Command& command );
00422 CommandResult _cmdSubscribeObjectReply( Command& command );
00423 CommandResult _cmdUnsubscribeObject( Command& command );
00424
00425 CHECK_THREAD_DECLARE( _receiverThread );
00426 CHECK_THREAD_DECLARE( _commandThread );
00427 };
00428
00429 std::ostream& operator << ( std::ostream& os, Session* session );
00430 }
00431 }
00432 #endif // EQNET_SESSION_H
00433