session.h

00001 
00002 /* Copyright (c) 2005-2009, Stefan Eilemann <eile@equalizergraphics.com> 
00003  *
00004  * This library is free software; you can redistribute it and/or modify it under
00005  * the terms of the GNU Lesser General Public License version 2.1 as published
00006  * by the Free Software Foundation.
00007  *  
00008  * This library is distributed in the hope that it will be useful, but WITHOUT
00009  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00010  * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00011  * details.
00012  * 
00013  * You should have received a copy of the GNU Lesser General Public License
00014  * along with this library; if not, write to the Free Software Foundation, Inc.,
00015  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
00016  */
00017 
00018 #ifndef EQNET_SESSION_H
00019 #define EQNET_SESSION_H
00020 
00021 #include <eq/net/dispatcher.h>  // base class
00022 #include <eq/net/object.h>      // Object::VERSION_NONE enum
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 
Generated on Mon Aug 10 18:58:41 2009 for Equalizer 0.9 by  doxygen 1.5.8