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 #include <eq/net/version.h>
00025
00026 namespace eq
00027 {
00028 namespace net
00029 {
00030 class DataIStream;
00031 class DataOStream;
00032 class Node;
00033 class ObjectCM;
00034 class Session;
00035 struct ObjectPacket;
00036
00044 class Object : public Dispatcher
00045 {
00046 public:
00048 enum ChangeType
00049 {
00050 STATIC,
00051 INSTANCE,
00052 DELTA,
00053 UNBUFFERED,
00054 #ifdef EQ_USE_DEPRECATED
00055 DELTA_UNBUFFERED = UNBUFFERED
00056 #endif
00057 };
00058
00060 EQ_EXPORT Object();
00061
00063 EQ_EXPORT virtual ~Object();
00064
00072 EQ_EXPORT virtual void makeThreadSafe();
00073
00075 EQ_EXPORT virtual bool dispatchCommand( Command& command );
00076
00080 bool isThreadSafe() const { return _threadSafe; }
00081
00083 bool isAttached() const { return getID() <= EQ_ID_MAX; }
00084
00089 EQ_EXPORT NodePtr getLocalNode();
00090
00095 const Session* getSession() const { return _session; }
00096
00101 Session* getSession() { return _session; }
00102
00104 uint32_t getID() const { return _id; }
00105
00107 uint32_t getInstanceID() const { return _instanceID; }
00108
00110 EQ_EXPORT uint32_t getMasterInstanceID() const;
00111
00115 EQ_EXPORT bool isMaster() const;
00117
00121 virtual ChangeType getChangeType() const { return STATIC; }
00122
00134 virtual bool isDirty() const { return true; }
00135
00151 EQ_EXPORT uint32_t commit();
00152
00162 EQ_EXPORT virtual uint32_t commitNB();
00163
00170 EQ_EXPORT virtual uint32_t commitSync( const uint32_t commitID );
00171
00179 EQ_EXPORT void obsolete( const uint32_t version );
00180
00191 EQ_EXPORT void setAutoObsolete( const uint32_t count );
00192
00194 EQ_EXPORT uint32_t getAutoObsoleteCount() const;
00195
00211 EQ_EXPORT uint32_t sync( const uint32_t version = VERSION_HEAD );
00212
00214 EQ_EXPORT uint32_t getHeadVersion() const;
00215
00217 EQ_EXPORT uint32_t getVersion() const;
00218
00220 EQ_EXPORT uint32_t getOldestVersion() const;
00221
00233 virtual void notifyNewHeadVersion( const uint32_t version )
00234 { EQASSERT( getVersion()==VERSION_NONE||version<getVersion()+100 );}
00235
00240 virtual void notifyNewVersion() {}
00242
00250 virtual void getInstanceData( DataOStream& os ) = 0;
00251
00260 virtual void applyInstanceData( DataIStream& is ) = 0;
00261
00270 virtual void pack( DataOStream& os ) { getInstanceData( os ); }
00271
00277 virtual void unpack( DataIStream& is ) { applyInstanceData( is ); }
00279
00283 EQ_EXPORT bool send( NodePtr node, ObjectPacket& packet );
00284
00286 EQ_EXPORT bool send( NodePtr node, ObjectPacket& packet,
00287 const std::string& string );
00288
00290 EQ_EXPORT bool send( NodePtr node, ObjectPacket& packet,
00291 const void* data, const uint64_t size );
00293
00302 virtual void notifyAttached() {};
00303
00311 virtual void notifyDetach() {};
00313
00314 protected:
00316 EQ_EXPORT Object( const Object& );
00317
00319 EQ_EXPORT const Object& operator = ( const Object& ) { return *this; }
00320
00330 void setupChangeManager( const Object::ChangeType type,
00331 const bool master,
00332 const uint32_t masterInstanceID = EQ_ID_INVALID );
00333
00338 EQ_EXPORT virtual void attachToSession( const uint32_t id,
00339 const uint32_t instanceID,
00340 Session* session );
00341
00346 EQ_EXPORT virtual void detachFromSession();
00347
00348 private:
00350 Session* _session;
00351 friend class Session;
00352
00353 friend class DeltaMasterCM;
00354 friend class FullMasterCM;
00355 friend class MasterCM;
00356 friend class StaticMasterCM;
00357 friend class StaticSlaveCM;
00358 friend class UnbufferedMasterCM;
00359 friend class VersionedSlaveCM;
00360
00362 uint32_t _id;
00363
00365 uint32_t _instanceID;
00366
00368 ObjectCM* _cm;
00369
00371 bool _threadSafe;
00372
00373 void _setChangeManager( ObjectCM* cm );
00374 const Nodes* _getSlaveNodes() const;
00375
00376
00377 bool _cmdForward( Command& command );
00378
00379 EQ_TS_VAR( _thread );
00380 };
00381 EQ_EXPORT std::ostream& operator << ( std::ostream&, const Object& );
00382 }
00383 }
00384
00385 #endif // EQNET_OBJECT_H