net/object.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef EQNET_OBJECT_H
00019 #define EQNET_OBJECT_H
00020
00021 #include <eq/net/dispatcher.h>
00022 #include <eq/net/node.h>
00023 #include <eq/net/types.h>
00024
00025 namespace eq
00026 {
00027 namespace net
00028 {
00029 class DataIStream;
00030 class DataOStream;
00031 class Node;
00032 class ObjectCM;
00033 class Session;
00034 struct ObjectPacket;
00035
00043 class Object : public Dispatcher
00044 {
00045 public:
00049 enum ObsoleteFlags
00050 {
00051 AUTO_OBSOLETE_COUNT_VERSIONS = 0,
00052 AUTO_OBSOLETE_COUNT_COMMITS = 1
00053 };
00054
00056 enum Version
00057 {
00058 VERSION_NONE = 0,
00059 VERSION_INVALID = 0xfffffffeu,
00060 VERSION_OLDEST = VERSION_INVALID,
00061 VERSION_HEAD = 0xffffffffu
00062 };
00063
00065 enum ChangeType
00066 {
00067 STATIC,
00068 INSTANCE,
00069 DELTA,
00070 UNBUFFERED,
00071 #ifdef EQ_USE_DEPRECATED
00072 DELTA_UNBUFFERED = UNBUFFERED
00073 #endif
00074 };
00075
00077 EQ_EXPORT Object();
00078
00080 EQ_EXPORT virtual ~Object();
00081
00083 EQ_EXPORT virtual void attachToSession( const uint32_t id,
00084 const uint32_t instanceID,
00085 Session* session );
00086
00088 EQ_EXPORT virtual void detachFromSession();
00089
00097 EQ_EXPORT virtual void makeThreadSafe();
00098
00100 bool isThreadSafe() const { return _threadSafe; }
00101
00106 NodePtr getLocalNode();
00107
00112 const Session* getSession() const { return _session; }
00113
00118 Session* getSession() { return _session; }
00119
00121 uint32_t getID() const { return _id; }
00122
00124 uint32_t getInstanceID() const { return _instanceID; }
00125
00129 EQ_EXPORT bool isMaster() const;
00130
00136 virtual ChangeType getChangeType() const { return STATIC; }
00137
00148 void becomeMaster();
00149
00163 virtual bool isDirty() const { return true; }
00164
00175 EQ_EXPORT virtual uint32_t commit();
00176
00186 EQ_EXPORT uint32_t commitNB();
00187
00194 EQ_EXPORT uint32_t commitSync( const uint32_t commitID );
00195
00203 EQ_EXPORT void obsolete( const uint32_t version );
00204
00220 EQ_EXPORT void setAutoObsolete( const uint32_t count,
00221 const uint32_t flags = AUTO_OBSOLETE_COUNT_VERSIONS );
00222
00224 EQ_EXPORT uint32_t getAutoObsoleteCount() const;
00225
00236 EQ_EXPORT uint32_t sync( const uint32_t version = VERSION_HEAD );
00237
00239 EQ_EXPORT uint32_t getHeadVersion() const;
00240
00242 EQ_EXPORT uint32_t getVersion() const;
00243
00245 EQ_EXPORT uint32_t getOldestVersion() const;
00246
00258 virtual void notifyNewHeadVersion( const uint32_t version )
00259 { EQASSERT( getVersion()==VERSION_NONE||version<getVersion()+100 );}
00261
00272 void setupChangeManager( const Object::ChangeType type,
00273 const bool master,
00274 const uint32_t masterInstanceID = EQ_ID_INVALID );
00276
00277 protected:
00279 EQ_EXPORT Object( const Object& );
00280
00282 EQ_EXPORT const Object& operator = ( const Object& ) { return *this; }
00283
00295 virtual void getInstanceData( DataOStream& os ) = 0;
00296
00306 virtual void applyInstanceData( DataIStream& is ) = 0;
00307
00317 virtual void pack( DataOStream& os ) { getInstanceData( os ); }
00318
00327 virtual void unpack( DataIStream& is ) { applyInstanceData( is ); }
00329
00331 EQ_EXPORT uint32_t getMasterInstanceID() const;
00332
00340 EQ_EXPORT void addSlave( NodePtr node, const uint32_t instanceID,
00341 const uint32_t version );
00342
00348 EQ_EXPORT void removeSlave( NodePtr node );
00349
00353 bool send( NodePtr node, ObjectPacket& packet );
00354
00356 bool send( NodePtr node, ObjectPacket& packet,
00357 const std::string& string );
00358
00360 bool send( NodePtr node, ObjectPacket& packet,
00361 const void* data, const uint64_t size );
00363
00364 private:
00366 Session* _session;
00367 friend class Session;
00368
00369 friend class DeltaMasterCM;
00370 friend class DeltaSlaveCM;
00371 friend class FullMasterCM;
00372 friend class FullSlaveCM;
00373 friend class StaticMasterCM;
00374 friend class StaticSlaveCM;
00375 friend class UnbufferedMasterCM;
00376
00378 uint32_t _id;
00379
00381 uint32_t _instanceID;
00382
00384 ObjectCM* _cm;
00385
00387 bool _threadSafe;
00388
00389 void _setChangeManager( ObjectCM* cm );
00390
00391
00392 CommandResult _cmdForward( Command& command );
00393 CommandResult _cmdNewMaster( Command& command );
00394
00395 CHECK_THREAD_DECLARE( _thread );
00396 };
00397 }
00398 }
00399
00400 #endif // EQNET_OBJECT_H