Main Page | Class Hierarchy | Class List | Directories | File List | Class Members

ReplicaObject.h

00001 /* START_LICENSE_HEADER
00002 
00003 Copyright (C) 2000 Martin Piper, original design and program code
00004 Copyright (C) 2001-2005 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:
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     // This sets the internal debugging full name
00402     void _Internal_SetFullyQualifiedName(const char *name = 0);
00403     const char *_Internal_GetFullyQualifiedName(void);
00404     // Debugging emit functions
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;            /* ReplicaNet has direct access to ReplicaObject classes */
00416 friend class ReplicaNetPrivate;     /* ReplicaNet has direct access to ReplicaObject classes */
00417 friend struct SessionUnique;        /* ReplicaNet has direct access to ReplicaObject classes */
00418 friend class DataBlock;
00419 
00420 // Functions
00421     // Safe to call multiple times
00422     virtual void PreRegisterDataBlocks(void);   
00423     // Do not call, except from within PreRegisterDataBlocks()
00424     virtual void RegisterDataBlocks(void);  
00426     void PollInternalForDistance(const float localTime,ReplicaObject *observer,const int sessionID);
00427 
00428 // Variables
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     // These delay slots are for those pending create class or delete class messages that have not been sent yet.
00458     std::set<int> mSessionPropagationFilterDelaySlotAdd;
00459     std::set<int> mSessionPropagationFilterDelaySlotRemove;
00460 
00461     // Distance based optimisations
00462     bool mEnableDistanceBased;
00463     float mDistanceBasedPollTime;
00464     float mDistanceBasedLastTime;
00465 
00466     bool mMasterOrReplicaDataBlockPollDone;
00467 
00468     char *mFullyQualifiedName;
00469     bool mPostObjectCreateDone;
00470 };
00471 
00472 } // namespace RNReplicaNet
00473 
00474 #endif

Generated on Sun Oct 30 01:11:54 2005 for ReplicaNet by  doxygen 1.4.1