ReplicaObject.h

00001 /* START_LICENSE_HEADER
00002 
00003 Copyright (C) 2000 Martin Piper, original design and program code
00004 Copyright (C) 2001 Replica Software
00005 
00006 This program file is copyright (C) Replica Software and can only be used under license.
00007 For more information visit: http://www.replicanet.com/
00008 Or email: info@replicanet.com
00009 
00010 END_LICENSE_HEADER */
00011 #ifndef __REPLICAOBJECT_H__
00012 #define __REPLICAOBJECT_H__
00013 #include "RNPlatform/Inc/DLLExportAPI.h"
00014 
00015 #include <vector>
00016 #include <list>
00017 #include <set>
00018 
00019 #include "RNPlatform/Inc/ThreadClass.h"
00020 
00021 namespace RNReplicaNet
00022 {
00023 
00024 class ReplicaNet;
00025 class ReplicaNetPrivate;
00026 class DataBlock;
00027 struct s_RO_RegistryBlock;
00028 
00029 const float kReplicaObject_InfiniteDistance = -1.0f;    
00030 const int kReplicaObjectUnknownUniqueID = -1;
00031 
00042 class REPLICANETDLL_API ReplicaObject : private MutexClass
00043 {
00044 public:
00045     enum PacketType
00046     {
00047         kPacket_Unreliable = 0,
00048         kPacket_Reliable = 1,
00049         kPacket_Certain = 2
00050     };
00051 
00055     ReplicaObject();
00056 
00060     virtual ~ReplicaObject();
00061 
00066     bool IsReplica(void) const;
00067 
00072     bool IsMaster(void) const;
00073 
00078     bool IsPublished(void) const;
00079 
00084     void Publish(void);
00085 
00091     void Unpublish(void);
00092 
00097     virtual const int GetClassID(void) = 0;
00098 
00103     virtual void SetRegistered(bool flag = true) = 0;
00104 
00109     virtual bool GetRegistered(void) = 0;
00110 
00115     int GetUniqueID(void);
00116 
00121     int GetSessionID(void);
00122 
00127     ReplicaNet *GetBoundReplicaNet(void);
00128 
00133     virtual bool ApproveFault(void);
00134 
00139     virtual bool ApproveMigration(void);
00140 
00144     virtual void OwnerChange(void);
00145 
00152     void GiveOwnership(int sessionID);
00153 
00159     void RequestOwnership(void);
00160 
00166     virtual float CalculateDistanceToObject(ReplicaObject *object);
00167 
00173     float GetDistanceToObject(ReplicaObject *object);
00174 
00179     virtual void SetOpaquePointer(void *data);
00180 
00186     virtual void *GetOpaquePointer(void *data = 0);
00187 
00193     DataBlock *FindDataBlock(void *pdata);
00194 
00200     void GiveDeltaHint(float &variable,float delta);
00201 
00207     void ContinuityBreak(float &variable,unsigned char breakTypes);
00208 
00214     void UpdateSetReliable(void);
00215 
00221     void UpdateSetCertain(void);
00222 
00228     void UpdateSetUnreliable(void);
00229 
00234     bool UpdateIsReliable(void);
00235 
00240     bool UpdateIsCertain(void);
00241 
00246     bool UpdateIsUnreliable(void);
00247 
00252     void SetLoadBalancing(const bool enable = false);
00253 
00258     void SetLoadBalancingDefault(const bool defaultValue = false);
00259 
00264     bool GetLoadBalancing(void);
00265 
00271     void SetLoadScore(const float load = 0.0f);
00272 
00278     void SetLoadScoreDefault(const float defaultLoad = 0.0f);
00279 
00285     float GetLoadScore(void);
00286 
00290     virtual void PostObjectCreate(void);
00291 
00297     virtual void UserRegisterDataBlocks(void);
00298 
00303     void AddAutoRegisterDataBlock(DataBlock *const dataBlock);
00304 
00310     void SetMessageReflectionID(const int sessionID = kReplicaObjectUnknownUniqueID);
00311 
00316     int GetMessageReflectionID(void) const;
00317 
00328     void SetPropagateToSessionDistance(const float distance = kReplicaObject_InfiniteDistance);
00329 
00335     void SetPropagateToSessionDistanceDefault(const float distance = kReplicaObject_InfiniteDistance);
00336 
00342     float GetPropagateToSessionDistance(void) const;
00343 
00349     void SetPropagateToSessionDistanceRecalculationDelay(const float delay = 0.1f);
00350 
00355     static ReplicaObject *AllocateForReplicaNet(void);
00356 
00361     static void DeleteForReplicaNet(ReplicaObject *object);
00362 
00363 
00371     void SetSessionPropagationFilter(const bool enable = false);
00372 
00377     bool GetSessionPropagationFilter(void) const;
00378 
00383     void GetSessionPropagationSet(std::set<int> &theSet);
00384 
00390     bool SessionPropagationAddSession(const int sessionID);
00391 
00397     bool SessionPropagationRemoveSession(const int sessionID);
00398 
00403     virtual void DataBlockPacketDataReceived(const DataBlock *datablock);
00404 
00409     virtual void DataBlockPacketDataReceivedPost(const DataBlock *datablock);
00410 
00416     virtual s_RO_RegistryBlock *GetRegistryBlock(void) const = 0;
00417 
00426     void DataSend(const int sessionid,const void *data,const int length,const PacketType type = kPacket_Reliable,const unsigned int band = 0);
00427 
00436     virtual void CallBackDataReceive(const int fromsessionid,const void *data,const int length,const PacketType type);
00437 
00443     int GetProcessingDataBlocksFromSessionID(void);
00444 
00449     virtual void CallbackObjectUnpublishPre(void);
00450 
00455     virtual void CallbackObjectUnpublishPost(void);
00456 
00461     bool GetNewSessionIDAndUniqueID(void);
00462 
00467     void DelayedDelete(const float delaySeconds = 0.0f);
00468 
00472     void DelayedDeleteCancel(void);
00473 
00477     bool GetDelayedDelete(void);
00478 
00482     bool GetDelayedDelete(float &delaySeconds);
00483 
00487     void UpdateSendDormant(const bool dormant = false);
00488 
00492     bool GetUpdateSendDormant(void) const;
00493 
00498     void UpdateSendDormantDelay(const bool dormant = false,const float delaySeconds = 0.0f);
00499 
00503     void UpdateSendDormantDelayCancel(void);
00504 
00509     bool GetUpdateSendDormantDelay(bool &dormant,float &delaySeconds) const;
00510 
00514     virtual void UpdateSendDormantDelayStateChange(const bool dormant);
00515 
00520     void SetBand(const unsigned int band = 0);
00521 
00526     unsigned int GetBand(void) const;
00527 
00528 protected:
00529     virtual void _Internal_GetUpdateType(void);
00530     virtual void _Internal_SetupLoadBalance(void);
00531     virtual void _Internal_SetupLoadBalanceScore(void);
00532     virtual void _Internal_SetupLoadBalanceDefault(void);
00533     virtual void _Internal_SetupLoadBalanceScoreDefault(void);
00534     virtual void _Internal_SetupOpaquePointer(void);
00535     virtual void _Internal_SetupPropagateDistance(void);
00536     virtual void _Internal_SetupPropagateDistanceDefault(void);
00537     virtual void _Internal_SetupBand(void);
00538 
00539     // This sets the internal debugging full name
00540     void _Internal_SetFullyQualifiedName(const char *name = 0);
00541     const char *_Internal_GetFullyQualifiedName(void);
00542     // Debugging emit functions
00543     void _DebugInternal_EmitClassCreate(const int packetSize,const int toSession);
00544     void _DebugInternal_EmitClassDelete(const int packetSize,const int toSession);
00545     void _DebugInternal_EmitClassUnpublish(const int packetSize,const int toSession);
00546 
00551     virtual void RegisterDataBlock(DataBlock *block);
00552 
00553 private:
00554 friend class ReplicaNet;            /* ReplicaNet has direct access to ReplicaObject classes */
00555 friend class ReplicaNetPrivate;     /* ReplicaNet has direct access to ReplicaObject classes */
00556 friend struct SessionUnique;        /* ReplicaNet has direct access to ReplicaObject classes */
00557 friend class DataBlock;
00558 
00559 // Functions
00560     // Safe to call multiple times
00561     virtual void PreRegisterDataBlocks(void);   
00562     // Do not call, except from within PreRegisterDataBlocks()
00563     virtual void RegisterDataBlocks(void);  
00565     void PollInternalForDistance(const float localTime,ReplicaObject *observer,const int sessionID);
00566 
00567 // Variables
00568     bool mIsMaster;     
00569     int mUniqueID;      
00570     int mSessionID;     
00571     ReplicaNet *mBoundReplicaNet;   
00572     bool mBeingDeleted;
00573 protected:
00574     bool mDataBlocksRegistered;
00575 private:
00576     bool mFlagForLaterMigration;    
00577     void *mOpaquePointer;
00578     bool mOpaquePointerSet;
00579     bool mIsReliable;
00580     bool mIsCertain;
00581     int mTryingToGiveTo;
00582     bool mObjectHasBeenAdded;   
00583     bool mEnableLoadBalancing;
00584     float mLoadScore;
00585     bool mEnableLoadBalancingDefault;
00586     float mLoadScoreDefault;
00587     int mReflectSessionID;      
00588     float mDistanceToSessionPropagate;
00589     float mDistanceToSessionPropagateDefault;
00590     bool mSessionPropagationFilter;
00591 
00592     std::vector<DataBlock *> mAutoRegister;
00593     // std::vector is used for mDataBlocks to allow fast constant time lookups by index.
00594     std::vector<DataBlock *> mDataBlocks;   
00595     std::set<int> mSessionPropagationFilterIDs;
00596     // These delay slots are for those pending create class or delete class messages that have not been sent yet.
00597     std::set<int> mSessionPropagationFilterDelaySlotAdd;
00598     std::set<int> mSessionPropagationFilterDelaySlotRemove;
00599 
00600     // Distance based optimisations
00601     bool mEnableDistanceBased;
00602     float mDistanceBasedPollTime;
00603     float mDistanceBasedLastTime;
00604 
00605     bool mMasterOrReplicaDataBlockPollDone;
00606 
00607     char *mFullyQualifiedName;
00608     bool mPostObjectCreateDone;
00609     
00610     std::set<int> mObserverFor;     // The session IDs that are using this object as an observer
00611 
00612     int mProcessingDataBlocksFromSessionID;
00613     bool mDelayDelete;
00614     float mDelayDeleteSeconds;
00615     float mDelayDeleteTime; // The local time to do the delete
00616     bool mUpdateSendDormant;
00617 
00618     bool mDormantDelayActive;
00619     bool mDormantDelayState;
00620     float mDormantDelaySeconds;
00621     float mDormantDelayTime;
00622 
00623     unsigned int mBand;
00624 };
00625 
00626 } // namespace RNReplicaNet
00627 
00628 #endif

Generated on Sat Jun 28 22:02:16 2008 for ReplicaNet and RNLobby by  doxygen 1.5.3