00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #if defined(_WIN32)
00013 #pragma warning(disable : 4786)
00014 #endif
00015 #ifndef __REPLICANET_H__
00016 #define __REPLICANET_H__
00017 #include "RNPlatform/Inc/DLLExportAPI.h"
00018
00019 #define _REPLICANET_VERSION 6000
00020
00021 #define _REPLICANET_DLLVERSIONMAJOR 17
00022 #define _REPLICANET_DLLVERSIONMINOR 0
00023
00024 #include <string>
00025
00026 #include "RNXPURL/Inc/Transport.h"
00027
00028
00029 namespace RNReplicaNet
00030 {
00031
00032 class ReplicaObject;
00033 class ReplicaNetPrivate;
00034 struct s_RO_RegistryBlock;
00035 struct DataBlockReason;
00036
00037 class XPSession;
00038 class MessageHelper;
00039 class DynamicMessageHelper;
00040
00041 const int kReplicaNetUnknownUniqueID = -1;
00042 const int kReplicaNetBroadcastID = -2;
00043 const int kReplicaNetRecordID = -3;
00044
00116 class REPLICANETDLL_API ReplicaNet
00117 {
00118 public:
00122 enum Error
00123 {
00124 kReplicaNet_EOK = 0,
00125 kReplicaNet_EERROR = -1,
00126 kReplicaNet_ETRANSPORT_CLOSED = -2,
00127 kReplicaNet_ETRANSPORT_ERROR = -3,
00128 kReplicaNet_EEND_RECORDING = -4
00129 };
00130
00131 enum PacketType
00132 {
00133 kPacket_Unreliable = 0,
00134 kPacket_Reliable = 1,
00135 kPacket_Certain = 2
00136 };
00137
00141 ReplicaNet();
00142
00146 virtual ~ReplicaNet();
00147
00151 virtual void PreRegisterReplicas(void);
00152
00157 static ReplicaNet *GetCurrentReplicaNet(void);
00158
00163 static void SetCurrentReplicaNet(ReplicaNet *const replicanet);
00164
00168 int GetSessionID(void);
00169
00174 int GetGameChannel(void);
00175
00180 void SetGameChannel(const int channel = TransportAnyGameChannel);
00181
00187 void SessionCreate(const std::string name);
00188
00195 void SessionCreate(const std::string name,const std::string protocols);
00196
00201 std::string SessionExportURL(void);
00202
00208 void SessionJoin(const std::string url);
00209
00213 void SessionFind(void);
00214
00219 void SessionFind(const std::string protocols);
00220
00225 std::string SessionEnumerateFound(void);
00226
00230 void LockObjects(void);
00231
00235 void UnLockObjects(void);
00236
00241 float GetNetworkSendRate(void);
00242
00247 float GetNetworkReceiveRate(void);
00248
00253 int GetNetworkPacketsLost(void);
00254
00261 virtual float GetTime(void);
00262
00269 virtual float GetLocalTime(void);
00270
00275 void SetObserver(ReplicaObject *const object = 0);
00276
00281 ReplicaObject *GetObserver(void);
00282
00291 void Poll(void);
00292
00298 void SetPollLayerBelow(bool enable = true);
00299
00304 bool GetPollLayerBelow(void);
00305
00310 void SetPollLayerBelowForXPSession(bool enable = true);
00311
00316 bool GetPollLayerBelowForXPSession(void);
00317
00325 void SetManualPoll(void);
00326
00334 void SetAutomaticPoll(void);
00335
00339 void SetManualPollXPSession(void);
00340
00344 void SetAutomaticPollXPSession(void);
00345
00349 void SetManualPollXPURL(void);
00350
00354 void SetAutomaticPollXPURL(void);
00355
00362 void GiveOwnership(ReplicaObject *const object,const int sessionID);
00363
00369 void RequestOwnership(ReplicaObject *const object);
00370
00376 void SetCanSpider(const bool canSpider = true);
00377
00382 bool GetCanSpider(void);
00383
00388 float GetLatencyToMasterSession(void);
00389
00394 float GetLatencyToSessionID(const int sessionID);
00395
00400 void SetLatencyRecalculationDelay(const float seconds = 1.0f);
00401
00406 bool IsStable(void);
00407
00412 bool IsMaster(void);
00413
00421 void SetCanBecomeMaster(const bool canBeMaster = true);
00422
00427 bool GetCanBecomeMaster(void);
00428
00433 Error GetStatus(void);
00434
00443 Error GetSessionErrorReason(void);
00444
00445 enum OnError
00446 {
00447 kMigrateObjects = 0,
00448 kDeleteObjects,
00449 kLeaveObjects,
00450 kMigrateObjectsToNewMaster
00451 };
00452
00463 void SetOnSessionError(const OnError whatToDo = kMigrateObjects);
00464
00469 OnError GetOnSessionErrorMigrateObjects(void);
00470
00478 void SetCanAcceptObjects(bool accept = true);
00479
00484 bool GetCanAcceptObjects(void);
00485
00490 void SetEncryption(const bool enable = false);
00491
00496 bool GetEncryption(void);
00497
00503 void SetLoadBalancing(const bool enable = false);
00504
00509 bool GetLoadBalancing(void);
00510
00517 void SetMaximumLoad(float load = 0.0f);
00518
00524 float GetMaximumLoad(int sessionID = kReplicaNetUnknownUniqueID);
00525
00531 float GetTotalLoad(int sessionID = kReplicaNetUnknownUniqueID);
00532
00536 void ObjectListBeginIterate(void);
00537
00541 void ObjectListFinishIterate(void);
00542
00547 ReplicaObject *ObjectListIterate(void);
00548
00553 ReplicaObject *ObjectListFind(const int sessionID,const int uniqueID);
00554
00561 virtual void JoinerSessionIDPre(const int sessionID);
00562
00569 virtual void JoinerSessionIDPost(const int sessionID);
00570
00575 virtual void LeaverSessionIDPre(const int sessionID);
00576
00581 virtual void LeaverSessionIDPost(const int sessionID);
00582
00583
00584
00589 void Disconnect(const int sessionID = kReplicaNetUnknownUniqueID);
00590
00595 bool GetPreConnectStatus(void);
00596
00607 void SetPreConnect(const bool enable = false);
00608
00613 bool GetPreConnect(void);
00614
00618 void PreConnectHasFinished(void);
00619
00624 void SetDataRetention(const bool enable = false);
00625
00630 bool GetDataRetention(void) const;
00631
00642 void DataSend(const int sessionid,const void *data,const int length,const PacketType type = kPacket_Reliable,const unsigned int band = 0);
00643
00652 bool DataReceive(int *const fromsessionid,void *const data,int *const length,PacketType *const type = 0);
00653
00661 bool DataReceivePeek(int *const fromsessionid,int *const length,PacketType *const type = 0);
00662
00663
00669 void SetDataBlockUpdatePolicy(const bool automatic = true);
00670
00675 bool GetDataBlockUpdatePolicy(void) const;
00676
00680 void ProcessDataBlockUpdate(void);
00681
00686 void SetAutomaticPacketCompression(const bool enable = false);
00687
00692 bool GetAutomaticPacketCompression(void);
00693
00700 void GetCompressionStatistics(int *const before=0,int *const after=0,const bool reset = false);
00701
00708 void GetMergedStatistics(int *const sent=0,int *const received=0,const bool reset = false);
00709
00714 int GetMasterSessionID(void);
00715
00721 std::string GetURLFromSessionID(const int sessionID);
00722
00728 void SetClientOnly(const bool isClient = false);
00729
00734 bool GetClientOnly(void);
00735
00745 bool GetBandwidthFromSessionID(const int sessionID,Transport::Bandwidth *const bandwidth,int *const output,int *const input);
00746
00755 virtual ReplicaObject *CallBackAllocate(const int classID,const int sessionID,const int uniqueID);
00756
00762 virtual ReplicaObject *CallBackDelete(ReplicaObject *object);
00763
00770 bool BeginSessionRecord(void);
00771
00775 void StopSessionRecord(void);
00776
00783 virtual bool CallbackSessionRecord(const void *data,const int length);
00784
00789 bool GetSessionRecord(void) const;
00790
00798 bool BeginSessionPlayback(void);
00799
00803 void StopSessionPlayback(void);
00804
00809 void SetPlaybackSpeed(const float speed = 1.0f);
00810
00816 bool PlaybackAdvanceTo(const float time);
00817
00821 virtual void CallbackPlaybackAdvanceToFinished(void);
00822
00829 virtual bool CallbackSessionPlayback(void *data,const int length);
00830
00835 bool GetSessionPlayback(void) const;
00836
00843 void SetPlaybackAllowMasterReplicaObjects(const bool allow = false);
00844
00848 bool GetPlaybackAllowMasterReplicaObjects(void);
00849
00854 void SetAllowConnections(const bool allow = true);
00855
00860 bool GetAllowConnections(void);
00861
00866 void SetNodeBuffers(const bool enable = false);
00867
00872 bool GetNodeBuffers(void);
00873
00877 virtual void CallbackMasterSessionIDChanged(const int previousSessionID);
00878
00879 private:
00880 friend class ReplicaObject;
00881 friend class ReplicaNetPrivate;
00882 friend class ReplicaNetDLLRegister;
00888 void AddObject(ReplicaObject *const object);
00889
00897 void RemoveObject(ReplicaObject *const object,const bool sendDelete = true);
00898
00903 bool GetMakeMaster(void);
00904
00909 int GetObjectUniqueID(void);
00910
00915 int GetMakeUniqueID(void);
00916
00921 int GetMakeSessionID(void);
00922
00923 void LoadChangedForObject(ReplicaObject *object,float previousLoad,float newLoad);
00924
00925 static ReplicaNet* mCurrentReplicaNet;
00927 ReplicaNetPrivate* mPrivateReplicaNet;
00928
00929 void AddItem(s_RO_RegistryBlock *block);
00930
00937 ReplicaObject* AllocateReplicaObject(const int class_id,const int sessionid,const int uniqueid,const int reflect = kReplicaNetUnknownUniqueID);
00938
00939 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);
00940 };
00941
00945 class ReplicaNetDLLRegister
00946 {
00947 public:
00948 ReplicaNetDLLRegister(){};
00949 virtual ~ReplicaNetDLLRegister(){};
00950
00951 void Call(ReplicaNet *repNet);
00952 };
00953
00954 }
00955
00956 extern REPLICANETDLL_API void *_gReplicaNet_PreRegisterReplicasFunc;
00957 extern void _ReplicaNetPreRegisterReplicasFunc(RNReplicaNet::ReplicaNet *repNet);
00958
00959
00960 #define REPLICANET_DLLPREREGISTER() \
00961 _gReplicaNet_PreRegisterReplicasFunc = (void*) &_ReplicaNetPreRegisterReplicasFunc;
00962
00963 #endif