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:
00048 ReplicaObject();
00049
00053 virtual ~ReplicaObject();
00054
00059 bool IsReplica(void) const;
00060
00065 bool IsMaster(void) const;
00066
00070 void Publish(void);
00071
00076 virtual const int GetClassID(void) = 0;
00077
00082 virtual void SetRegistered(bool flag = true) = 0;
00083
00088 virtual bool GetRegistered(void) = 0;
00089
00094 int GetUniqueID(void);
00095
00100 int GetSessionID(void);
00101
00106 ReplicaNet *GetBoundReplicaNet(void);
00107
00112 virtual bool ApproveFault(void);
00113
00118 virtual bool ApproveMigration(void);
00119
00123 virtual void OwnerChange(void);
00124
00131 void GiveOwnership(int sessionID);
00132
00138 void RequestOwnership(void);
00139
00145 virtual float CalculateDistanceToObject(ReplicaObject *object);
00146
00152 float GetDistanceToObject(ReplicaObject *object);
00153
00158 virtual void SetOpaquePointer(void *data);
00159
00165 virtual void *GetOpaquePointer(void *data = 0);
00166
00172 DataBlock *FindDataBlock(void *pdata);
00173
00179 void GiveDeltaHint(float &variable,float delta);
00180
00186 void ContinuityBreak(float &variable,unsigned char breakTypes);
00187
00193 void UpdateSetReliable(void);
00194
00200 void UpdateSetCertain(void);
00201
00207 void UpdateSetUnreliable(void);
00208
00213 bool UpdateIsReliable(void);
00214
00219 bool UpdateIsCertain(void);
00220
00225 bool UpdateIsUnreliable(void);
00226
00231 void SetLoadBalancing(const bool enable = false);
00232
00237 void SetLoadBalancingDefault(const bool defaultValue = false);
00238
00243 bool GetLoadBalancing(void);
00244
00250 void SetLoadScore(const float load = 0.0f);
00251
00257 void SetLoadScoreDefault(const float defaultLoad = 0.0f);
00258
00264 float GetLoadScore(void);
00265
00269 virtual void PostObjectCreate(void);
00270
00276 virtual void UserRegisterDataBlocks(void);
00277
00282 void AddAutoRegisterDataBlock(DataBlock *const dataBlock);
00283
00289 void SetMessageReflectionID(const int sessionID = kReplicaObjectUnknownUniqueID);
00290
00295 int GetMessageReflectionID(void) const;
00296
00307 void SetPropagateToSessionDistance(const float distance = kReplicaObject_InfiniteDistance);
00308
00314 void SetPropagateToSessionDistanceDefault(const float distance = kReplicaObject_InfiniteDistance);
00315
00321 float GetPropagateToSessionDistance(void) const;
00322
00328 void SetPropagateToSessionDistanceRecalculationDelay(const float delay = 0.1f);
00329
00334 static ReplicaObject *AllocateForReplicaNet(void);
00335
00340 static void DeleteForReplicaNet(ReplicaObject *object);
00341
00342
00350 void SetSessionPropagationFilter(const bool enable = false);
00351
00356 bool GetSessionPropagationFilter(void) const;
00357
00362 void GetSessionPropagationSet(std::set<int> &theSet);
00363
00369 bool SessionPropagationAddSession(const int sessionID);
00370
00376 bool SessionPropagationRemoveSession(const int sessionID);
00377
00382 virtual void DataBlockPacketDataReceived(const DataBlock *datablock);
00383
00389 virtual s_RO_RegistryBlock *GetRegistryBlock(void) const = 0;
00390
00391 protected:
00392 virtual void _Internal_GetUpdateType(void);
00393 virtual void _Internal_SetupLoadBalance(void);
00394 virtual void _Internal_SetupLoadBalanceScore(void);
00395 virtual void _Internal_SetupLoadBalanceDefault(void);
00396 virtual void _Internal_SetupLoadBalanceScoreDefault(void);
00397 virtual void _Internal_SetupOpaquePointer(void);
00398 virtual void _Internal_SetupPropagateDistance(void);
00399 virtual void _Internal_SetupPropagateDistanceDefault(void);
00400
00401
00402 void _Internal_SetFullyQualifiedName(const char *name = 0);
00403 const char *_Internal_GetFullyQualifiedName(void);
00404
00405 void _DebugInternal_EmitClassCreate(const int packetSize,const int toSession);
00406 void _DebugInternal_EmitClassDelete(const int packetSize,const int toSession);
00407
00412 virtual void RegisterDataBlock(DataBlock *block);
00413
00414 private:
00415 friend class ReplicaNet;
00416 friend class ReplicaNetPrivate;
00417 friend struct SessionUnique;
00418 friend class DataBlock;
00419
00420
00421
00422 virtual void PreRegisterDataBlocks(void);
00423
00424 virtual void RegisterDataBlocks(void);
00426 void PollInternalForDistance(const float localTime,ReplicaObject *observer,const int sessionID);
00427
00428
00429 bool mIsMaster;
00430 int mUniqueID;
00431 int mSessionID;
00432 ReplicaNet *mBoundReplicaNet;
00433 bool mBeingDeleted;
00434 protected:
00435 bool mDataBlocksRegistered;
00436 private:
00437 bool mFlagForLaterMigration;
00438 void *mOpaquePointer;
00439 bool mOpaquePointerSet;
00440 bool mIsReliable;
00441 bool mIsCertain;
00442 bool mPostFirstDataCallDone;
00443 int mTryingToGiveTo;
00444 bool mObjectHasBeenAdded;
00445 bool mEnableLoadBalancing;
00446 float mLoadScore;
00447 bool mEnableLoadBalancingDefault;
00448 float mLoadScoreDefault;
00449 int mReflectSessionID;
00450 float mDistanceToSessionPropagate;
00451 float mDistanceToSessionPropagateDefault;
00452 bool mSessionPropagationFilter;
00453
00454 std::vector<DataBlock *> mAutoRegister;
00455 std::vector<DataBlock *> mDataBlocks;
00456 std::set<int> mSessionPropagationFilterIDs;
00457
00458 std::set<int> mSessionPropagationFilterDelaySlotAdd;
00459 std::set<int> mSessionPropagationFilterDelaySlotRemove;
00460
00461
00462 bool mEnableDistanceBased;
00463 float mDistanceBasedPollTime;
00464 float mDistanceBasedLastTime;
00465
00466 bool mMasterOrReplicaDataBlockPollDone;
00467
00468 char *mFullyQualifiedName;
00469 bool mPostObjectCreateDone;
00470 };
00471
00472 }
00473
00474 #endif