00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
00540 void _Internal_SetFullyQualifiedName(const char *name = 0);
00541 const char *_Internal_GetFullyQualifiedName(void);
00542
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;
00555 friend class ReplicaNetPrivate;
00556 friend struct SessionUnique;
00557 friend class DataBlock;
00558
00559
00560
00561 virtual void PreRegisterDataBlocks(void);
00562
00563 virtual void RegisterDataBlocks(void);
00565 void PollInternalForDistance(const float localTime,ReplicaObject *observer,const int sessionID);
00566
00567
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
00594 std::vector<DataBlock *> mDataBlocks;
00595 std::set<int> mSessionPropagationFilterIDs;
00596
00597 std::set<int> mSessionPropagationFilterDelaySlotAdd;
00598 std::set<int> mSessionPropagationFilterDelaySlotRemove;
00599
00600
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;
00611
00612 int mProcessingDataBlocksFromSessionID;
00613 bool mDelayDelete;
00614 float mDelayDeleteSeconds;
00615 float mDelayDeleteTime;
00616 bool mUpdateSendDormant;
00617
00618 bool mDormantDelayActive;
00619 bool mDormantDelayState;
00620 float mDormantDelaySeconds;
00621 float mDormantDelayTime;
00622
00623 unsigned int mBand;
00624 };
00625
00626 }
00627
00628 #endif