ReplicaNet and RNLobby  1
ReplicaNet.h
1 /* START_LICENSE_HEADER
2 
3 Copyright (C) 2000 Martin Piper, original design and program code
4 Copyright (C) 2001 Replica Software
5 
6 This program file is copyright (C) Replica Software and can only be used under license.
7 For more information visit: http://www.replicanet.com/
8 Or email: info@replicanet.com
9 
10 END_LICENSE_HEADER */
11 #include "RNPlatform/Inc/MemoryTracking.h"
12 #ifndef __REPLICANET_H__
13 #define __REPLICANET_H__
14 
15 #define _REPLICANET_VERSION 7300
16 
17 #include <string>
18 
19 #include "RNXPURL/Inc/Transport.h"
20 #include "RNPlatform/Inc/SysTime.h"
21 
22 namespace RNReplicaNet
23 {
24 
25 class ReplicaObject;
26 class ReplicaNetPrivate;
27 struct s_RO_RegistryBlock;
28 struct DataBlockReason;
29 
30 class XPSession;
31 class MessageHelper;
32 class DynamicMessageHelper;
33 
34 const int kReplicaNetUnknownUniqueID = -1;
35 const int kReplicaNetBroadcastID = -2;
36 const int kReplicaNetRecordID = -3;
37 
111 {
112 public:
116  enum Error
117  {
120  kReplicaNet_ETRANSPORT_CLOSED = -2,
121  kReplicaNet_ETRANSPORT_ERROR = -3,
122  kReplicaNet_EEND_RECORDING = -4
123  };
124 
125  enum PacketType
126  {
127  kPacket_Unreliable = 0,
128  kPacket_Reliable = 1,
129  kPacket_Certain = 2,
130  kPacket_Ordered = 3
131  };
132 
136  ReplicaNet();
137 
141  virtual ~ReplicaNet();
142 
146  virtual void PreRegisterReplicas(void);
147 
152  static ReplicaNet *GetCurrentReplicaNet(void);
153 
158  static void SetCurrentReplicaNet(ReplicaNet *const replicanet);
159 
163  int GetSessionID(void);
164 
169  int GetGameChannel(void);
170 
175  void SetGameChannel(const int channel = TransportAnyGameChannel);
176 
182  void SessionCreate(const std::string name);
183 
190  void SessionCreate(const std::string name,const std::string protocols);
191 
196  std::string SessionExportURL(void);
197 
203  void SessionJoin(const std::string url);
204 
208  void SessionFind(void);
209 
214  void SessionFind(const std::string protocols);
215 
220  std::string SessionEnumerateFound(void);
221 
225  void LockObjects(void);
226 
230  void UnLockObjects(void);
231 
236  float GetNetworkSendRate(void);
237 
242  float GetNetworkReceiveRate(void);
243 
248  int GetNetworkPacketsLost(void);
249 
254  int GetNetworkPacketsRejected(void);
255 
262  virtual SysTimeType GetTime(void);
263 
270  virtual SysTimeType GetLocalTime(void);
271 
276  void SetObserver(ReplicaObject *const object = 0);
277 
282  ReplicaObject *GetObserver(void);
283 
292  void Poll(void);
293 
299  void SetPollLayerBelow(bool enable = true);
300 
305  bool GetPollLayerBelow(void);
306 
311  void SetPollLayerBelowForXPSession(bool enable = true);
312 
318 
326  void SetManualPoll(void);
327 
335  void SetAutomaticPoll(void);
336 
340  void SetManualPollXPSession(void);
341 
345  void SetAutomaticPollXPSession(void);
346 
350  void SetManualPollXPURL(void);
351 
355  void SetAutomaticPollXPURL(void);
356 
363  void GiveOwnership(ReplicaObject *const object,const int sessionID);
364 
370  void RequestOwnership(ReplicaObject *const object);
371 
377  void SetCanSpider(const bool canSpider = true);
378 
383  bool GetCanSpider(void);
384 
389  float GetLatencyToMasterSession(void);
390 
395  float GetLatencyToSessionID(const int sessionID);
396 
401  void SetLatencyRecalculationDelay(const float seconds = 1.0f);
402 
407  bool IsStable(void);
408 
413  bool IsMaster(void);
414 
422  void SetCanBecomeMaster(const bool canBeMaster = true);
423 
428  bool GetCanBecomeMaster(void);
429 
434  Error GetStatus(void);
435 
445 
446  enum OnError
447  {
448  kMigrateObjects = 0,
449  kDeleteObjects,
450  kLeaveObjects,
451  kMigrateObjectsToNewMaster
452  };
453 
464  void SetOnSessionError(const OnError whatToDo = kMigrateObjects);
465 
470  OnError GetOnSessionErrorMigrateObjects(void);
471 
479  void SetCanAcceptObjects(bool accept = true);
480 
485  bool GetCanAcceptObjects(void);
486 
491  void SetEncryption(const bool enable = false);
492 
497  bool GetEncryption(void);
498 
504  void SetLoadBalancing(const bool enable = false);
505 
510  bool GetLoadBalancing(void);
511 
518  void SetMaximumLoad(float load = 0.0f);
519 
525  float GetMaximumLoad(int sessionID = kReplicaNetUnknownUniqueID);
526 
532  float GetTotalLoad(int sessionID = kReplicaNetUnknownUniqueID);
533 
537  void ObjectListBeginIterate(void);
538 
542  void ObjectListFinishIterate(void);
543 
548  ReplicaObject *ObjectListIterate(void);
549 
554  ReplicaObject *ObjectListFind(const int sessionID,const int uniqueID);
555 
562  virtual void JoinerSessionIDPre(const int sessionID);
563 
570  virtual void JoinerSessionIDPost(const int sessionID);
571 
576  virtual void LeaverSessionIDPre(const int sessionID);
577 
582  virtual void LeaverSessionIDPost(const int sessionID);
583 
584 
585 
590  void Disconnect(const int sessionID = kReplicaNetUnknownUniqueID);
591 
596  bool GetPreConnectStatus(void);
597 
608  void SetPreConnect(const bool enable = false);
609 
614  bool GetPreConnect(void);
615 
619  void PreConnectHasFinished(void);
620 
625  void SetDataRetention(const bool enable = false);
626 
631  bool GetDataRetention(void) const;
632 
643  void DataSend(const int sessionid,const void *data,const int length,const PacketType type = kPacket_Reliable,const unsigned int band = 0);
644 
653  bool DataReceive(int *const fromsessionid,void *const data,int *const length,PacketType *const type = 0);
654 
662  bool DataReceivePeek(int *const fromsessionid,int *const length,PacketType *const type = 0);
663 
664 
670  void SetDataBlockUpdatePolicy(const bool automatic = true);
671 
676  bool GetDataBlockUpdatePolicy(void) const;
677 
681  void ProcessDataBlockUpdate(void);
682 
687  void SetAutomaticPacketCompression(const bool enable = false);
688 
694 
701  void GetCompressionStatistics(int *const before=0,int *const after=0,const bool reset = false);
702 
709  void GetMergedStatistics(int *const sent=0,int *const received=0,const bool reset = false);
710 
715  int GetMasterSessionID(void);
716 
722  std::string GetURLFromSessionID(const int sessionID);
723 
729  void SetClientOnly(const bool isClient = false);
730 
735  bool GetClientOnly(void);
736 
746  bool GetBandwidthFromSessionID(const int sessionID,Transport::Bandwidth *const bandwidth,int *const output,int *const input);
747 
757  virtual ReplicaObject *CallBackAllocate(const int classID,const int sessionID,const int uniqueID);
758 
764  virtual ReplicaObject *CallBackDelete(ReplicaObject *object);
765 
772  bool BeginSessionRecord(void);
773 
777  void StopSessionRecord(void);
778 
785  virtual bool CallbackSessionRecord(const void *data,const int length);
786 
791  bool GetSessionRecord(void) const;
792 
800  bool BeginSessionPlayback(void);
801 
805  void StopSessionPlayback(void);
806 
811  void SetPlaybackSpeed(const float speed = 1.0f);
812 
818  bool PlaybackAdvanceTo(const SysTimeType time);
819 
823  virtual void CallbackPlaybackAdvanceToFinished(void);
824 
831  virtual bool CallbackSessionPlayback(void *data,const int length);
832 
837  bool GetSessionPlayback(void) const;
838 
845  void SetPlaybackAllowMasterReplicaObjects(const bool allow = false);
846 
851 
856  void SetAllowConnections(const bool allow = true);
857 
862  bool GetAllowConnections(void);
863 
868  void SetNodeBuffers(const bool enable = false);
869 
874  bool GetNodeBuffers(void);
875 
879  virtual void CallbackMasterSessionIDChanged(const int previousSessionID);
880 
884  void SetSessionIDCallback(const bool enable = false);
885 
891  virtual int CallbackGetSessionID(void);
892 
899  virtual int CallbackGetObjectUniqueID(ReplicaObject *object);
900 
905  void SetMaximumDataSize(const int bytes = 64*1024);
906  int GetMaximumDataSize(void) const;
907 
911  void SetPacketCompressionLevel(const int level = 10);
915  void SetLargePacketCompressionLevel(const int level = 5);
916 
917  int GetPacketCompressionLevel(void);
918  int GetLargePacketCompressionLevel(void);
919 
926  void SetTransparentPacketCompression(const int level = 0);
927 
933 
934 private:
935 friend class ReplicaObject; /* A ReplicaObject has direct access to ReplicaNet the class */
936 friend class ReplicaNetPrivate;
937 friend class ReplicaNetDLLRegister;
943  void AddObject(ReplicaObject *const object);
944 
952  void RemoveObject(ReplicaObject *const object,const bool sendDelete = true);
953 
958  bool GetMakeMaster(void);
959 
964  int GetMakeUniqueID(void);
965 
970  int GetMakeSessionID(void);
971 
972  void LoadChangedForObject(ReplicaObject *object,float previousLoad,float newLoad);
973 
974  static ReplicaNet* mCurrentReplicaNet;
976  ReplicaNetPrivate* mPrivateReplicaNet;
977 
978  void AddItem(s_RO_RegistryBlock *block);
979 
986  ReplicaObject* AllocateReplicaObject(const int class_id,const int sessionid,const int uniqueid,const int reflect = kReplicaNetUnknownUniqueID);
987 
988  void ReplicaObjectDataSend(const int sessionid,const void *data,const int length,const ReplicaNet::PacketType type = ReplicaNet::kPacket_Reliable,ReplicaObject *source = 0,const unsigned int band = 0);
989 };
990 
995 {
996 public:
998  virtual ~ReplicaNetDLLRegister(){};
999 
1000  void Call(ReplicaNet *repNet);
1001 };
1002 
1003 } // namespace RNReplicaNet
1004 
1005 extern void *_gReplicaNet_PreRegisterReplicasFunc;
1006 // This function is created when parsing an ROL file containing ReplicaObject definitions. Or it can contain user generated code.
1007 extern void _ReplicaNetPreRegisterReplicasFunc(RNReplicaNet::ReplicaNet *repNet);
1008 
1009 #endif
void SetOnSessionError(const OnError whatToDo=kMigrateObjects)
void ObjectListBeginIterate(void)
void GetCompressionStatistics(int *const before=0, int *const after=0, const bool reset=false)
void SetSessionIDCallback(const bool enable=false)
virtual void JoinerSessionIDPost(const int sessionID)
virtual ReplicaObject * CallBackAllocate(const int classID, const int sessionID, const int uniqueID)
void RequestOwnership(ReplicaObject *const object)
Definition: ReplicaNet.h:994
void SetMaximumLoad(float load=0.0f)
void SessionJoin(const std::string url)
void GetMergedStatistics(int *const sent=0, int *const received=0, const bool reset=false)
float GetTotalLoad(int sessionID=kReplicaNetUnknownUniqueID)
virtual void CallbackMasterSessionIDChanged(const int previousSessionID)
Error
Definition: ReplicaNet.h:116
virtual void JoinerSessionIDPre(const int sessionID)
void SetPlaybackSpeed(const float speed=1.0f)
void SetAutomaticPollXPURL(void)
void SetMaximumDataSize(const int bytes=64 *1024)
virtual int CallbackGetSessionID(void)
static void SetCurrentReplicaNet(ReplicaNet *const replicanet)
void SessionCreate(const std::string name)
std::string GetURLFromSessionID(const int sessionID)
void SetObserver(ReplicaObject *const object=0)
void SetClientOnly(const bool isClient=false)
void StopSessionPlayback(void)
bool PlaybackAdvanceTo(const SysTimeType time)
float GetLatencyToSessionID(const int sessionID)
virtual ReplicaObject * CallBackDelete(ReplicaObject *object)
ReplicaObject * GetObserver(void)
bool GetPollLayerBelowForXPSession(void)
std::string SessionEnumerateFound(void)
void ObjectListFinishIterate(void)
virtual void PreRegisterReplicas(void)
float GetLatencyToMasterSession(void)
float GetNetworkReceiveRate(void)
bool GetSessionRecord(void) const
int GetNetworkPacketsRejected(void)
void SetPreConnect(const bool enable=false)
void SetCanAcceptObjects(bool accept=true)
bool DataReceive(int *const fromsessionid, void *const data, int *const length, PacketType *const type=0)
bool GetAllowConnections(void)
ReplicaObject * ObjectListFind(const int sessionID, const int uniqueID)
virtual void CallbackPlaybackAdvanceToFinished(void)
virtual void LeaverSessionIDPost(const int sessionID)
float GetMaximumLoad(int sessionID=kReplicaNetUnknownUniqueID)
void SetPacketCompressionLevel(const int level=10)
bool GetPreConnectStatus(void)
bool GetAutomaticPacketCompression(void)
Definition: ReplicaNet.h:118
Error GetSessionErrorReason(void)
static ReplicaNet * GetCurrentReplicaNet(void)
void SetGameChannel(const int channel=TransportAnyGameChannel)
bool GetBandwidthFromSessionID(const int sessionID, Transport::Bandwidth *const bandwidth, int *const output, int *const input)
void SetPollLayerBelow(bool enable=true)
bool DataReceivePeek(int *const fromsessionid, int *const length, PacketType *const type=0)
void SetDataBlockUpdatePolicy(const bool automatic=true)
bool GetDataRetention(void) const
void SetTransparentPacketCompression(const int level=0)
void SetManualPollXPSession(void)
Definition: ReplicaNet.h:110
virtual SysTimeType GetTime(void)
void SetLatencyRecalculationDelay(const float seconds=1.0f)
void ProcessDataBlockUpdate(void)
void SetEncryption(const bool enable=false)
virtual bool CallbackSessionRecord(const void *data, const int length)
void SetLoadBalancing(const bool enable=false)
virtual SysTimeType GetLocalTime(void)
bool GetCanAcceptObjects(void)
virtual bool CallbackSessionPlayback(void *data, const int length)
void DataSend(const int sessionid, const void *data, const int length, const PacketType type=kPacket_Reliable, const unsigned int band=0)
virtual void LeaverSessionIDPre(const int sessionID)
void SetCanSpider(const bool canSpider=true)
virtual int CallbackGetObjectUniqueID(ReplicaObject *object)
void SetPlaybackAllowMasterReplicaObjects(const bool allow=false)
bool GetPlaybackAllowMasterReplicaObjects(void)
void SetDataRetention(const bool enable=false)
int GetTransparentPacketCompression(void)
void SetAutomaticPollXPSession(void)
bool GetSessionPlayback(void) const
ReplicaObject * ObjectListIterate(void)
void SetLargePacketCompressionLevel(const int level=5)
bool BeginSessionPlayback(void)
void SetAllowConnections(const bool allow=true)
bool GetDataBlockUpdatePolicy(void) const
void GiveOwnership(ReplicaObject *const object, const int sessionID)
void PreConnectHasFinished(void)
float GetNetworkSendRate(void)
void SetPollLayerBelowForXPSession(bool enable=true)
std::string SessionExportURL(void)
void Disconnect(const int sessionID=kReplicaNetUnknownUniqueID)
void SetNodeBuffers(const bool enable=false)
void SetAutomaticPacketCompression(const bool enable=false)
OnError GetOnSessionErrorMigrateObjects(void)
void SetCanBecomeMaster(const bool canBeMaster=true)