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 5400
00020
00021 #define _REPLICANET_DLLVERSIONMAJOR 9
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
00040 const int kReplicaNetUnknownUniqueID = -1;
00041 const int kReplicaNetBroadcastID = -2;
00042 const int kReplicaNetRecordID = -3;
00043
00115 class REPLICANETDLL_API ReplicaNet
00116 {
00117 public:
00121 enum Error
00122 {
00123 kReplicaNet_EOK = 0,
00124 kReplicaNet_EERROR = -1,
00125 kReplicaNet_ETRANSPORT_CLOSED = -2,
00126 kReplicaNet_ETRANSPORT_ERROR = -3,
00127 kReplicaNet_EEND_RECORDING = -4
00128 };
00129
00130 enum PacketType
00131 {
00132 kPacket_Unreliable = 0,
00133 kPacket_Reliable = 1,
00134 kPacket_Certain = 2
00135 };
00136
00140 ReplicaNet();
00141
00145 virtual ~ReplicaNet();
00146
00150 virtual void PreRegisterReplicas(void);
00151
00156 static ReplicaNet *GetCurrentReplicaNet(void);
00157
00162 static void SetCurrentReplicaNet(ReplicaNet *const replicanet);
00163
00167 int GetSessionID(void);
00168
00174 void AddObject(ReplicaObject *const object);
00175
00181 void RemoveObject(ReplicaObject *const object);
00182
00187 int GetGameChannel(void);
00188
00193 void SetGameChannel(const int channel = TransportAnyGameChannel);
00194
00199 void SessionCreate(const std::string name);
00200
00206 void SessionCreate(const std::string name,const std::string protocols);
00207
00212 std::string SessionExportURL(void);
00213
00218 void SessionJoin(const std::string url);
00219
00223 void SessionFind(void);
00224
00229 std::string SessionEnumerateFound(void);
00230
00234 void LockObjects(void);
00235
00239 void UnLockObjects(void);
00240
00245 float GetNetworkSendRate(void);
00246
00251 float GetNetworkReceiveRate(void);
00252
00257 int GetNetworkPacketsLost(void);
00258
00265 virtual float GetTime(void);
00266
00273 virtual float GetLocalTime(void);
00274
00279 void SetObserver(ReplicaObject *const object = 0);
00280
00285 ReplicaObject *GetObserver(void);
00286
00295 void Poll(void);
00296
00302 void SetPollLayerBelow(bool enable = true);
00303
00308 bool GetPollLayerBelow(void);
00309
00314 void SetPollLayerBelowForXPSession(bool enable = true);
00315
00320 bool GetPollLayerBelowForXPSession(void);
00321
00329 void SetManualPoll(void);
00330
00338 void SetAutomaticPoll(void);
00339
00343 void SetManualPollXPSession(void);
00344
00348 void SetAutomaticPollXPSession(void);
00349
00353 void SetManualPollXPURL(void);
00354
00358 void SetAutomaticPollXPURL(void);
00359
00366 void GiveOwnership(ReplicaObject *const object,const int sessionID);
00367
00373 void RequestOwnership(ReplicaObject *const object);
00374
00380 void SetCanSpider(const bool canSpider = true);
00381
00386 bool GetCanSpider(void);
00387
00392 float GetLatencyToMasterSession(void);
00393
00398 void SetLatencyRecalculationDelay(const float seconds = 1.0f);
00399
00404 bool IsStable(void);
00405
00410 bool IsMaster(void);
00411
00419 void SetCanBecomeMaster(const bool canBeMaster = true);
00420
00425 bool GetCanBecomeMaster(void);
00426
00431 Error GetStatus(void);
00432
00441 Error GetSessionErrorReason(void);
00442
00443 enum OnError
00444 {
00445 kMigrateObjects = 0,
00446 kDeleteObjects,
00447 kLeaveObjects
00448 };
00449
00459 void SetOnSessionError(const OnError whatToDo = kMigrateObjects);
00460
00465 OnError GetOnSessionErrorMigrateObjects(void);
00466
00474 void SetCanAcceptObjects(bool accept = true);
00475
00480 bool GetCanAcceptObjects(void);
00481
00486 void SetEncryption(const bool enable = false);
00487
00492 bool GetEncryption(void);
00493
00499 void SetLoadBalancing(const bool enable = false);
00500
00505 bool GetLoadBalancing(void);
00506
00513 void SetMaximumLoad(float load = 0.0f);
00514
00520 float GetMaximumLoad(int sessionID = kReplicaNetUnknownUniqueID);
00521
00527 float GetTotalLoad(int sessionID = kReplicaNetUnknownUniqueID);
00528
00532 void ObjectListBeginIterate(void);
00533
00537 void ObjectListFinishIterate(void);
00538
00543 ReplicaObject *ObjectListIterate(void);
00544
00551 virtual void JoinerSessionIDPre(const int sessionID);
00552
00559 virtual void JoinerSessionIDPost(const int sessionID);
00560
00565 virtual void LeaverSessionIDPre(const int sessionID);
00566
00571 virtual void LeaverSessionIDPost(const int sessionID);
00572
00573
00574
00579 void Disconnect(const int sessionID = kReplicaNetUnknownUniqueID);
00580
00585 bool GetPreConnectStatus(void);
00586
00597 void SetPreConnect(const bool enable = false);
00598
00603 bool GetPreConnect(void);
00604
00608 void PreConnectHasFinished(void);
00609
00614 void SetDataRetention(const bool enable = false);
00615
00620 bool GetDataRetention(void) const;
00621
00629 void DataSend(const int sessionid,const void *data,const int length,const PacketType type = kPacket_Reliable);
00630
00639 bool DataReceive(int *const fromsessionid,void *const data,int *const length,PacketType *const type = 0);
00640
00641
00647 void SetDataBlockUpdatePolicy(const bool automatic = true);
00648
00653 bool GetDataBlockUpdatePolicy(void) const;
00654
00658 void ProcessDataBlockUpdate(void);
00659
00664 void SetAutomaticPacketCompression(const bool enable = false);
00665
00670 bool GetAutomaticPacketCompression(void);
00671
00678 void GetCompressionStatistics(int *const before=0,int *const after=0,const bool reset = false);
00679
00686 void GetMergedStatistics(int *const sent=0,int *const received=0,const bool reset = false);
00687
00692 int GetMasterSessionID(void);
00693
00699 std::string GetURLFromSessionID(const int sessionID);
00700
00706 void SetClientOnly(const bool isClient = false);
00707
00712 bool GetClientOnly(void);
00713
00723 bool GetBandwidthFromSessionID(const int sessionID,Transport::Bandwidth *const bandwidth,int *const output,int *const input);
00724
00733 virtual ReplicaObject *CallBackAllocate(const int classID,const int sessionID,const int uniqueID);
00734
00740 virtual ReplicaObject *CallBackDelete(ReplicaObject *object);
00741
00748 bool BeginSessionRecord(void);
00749
00753 void StopSessionRecord(void);
00754
00761 virtual bool CallbackSessionRecord(const void *data,const int length);
00762
00767 bool GetSessionRecord(void) const;
00768
00776 bool BeginSessionPlayback(void);
00777
00781 void StopSessionPlayback(void);
00782
00787 void SetPlaybackSpeed(const float speed = 1.0f);
00788
00794 bool PlaybackAdvanceTo(const float time);
00795
00802 virtual bool CallbackSessionPlayback(void *data,const int length);
00803
00808 bool GetSessionPlayback(void) const;
00809
00816 void SetPlaybackAllowMasterReplicaObjects(const bool allow = false);
00817
00821 bool GetPlaybackAllowMasterReplicaObjects(void);
00822
00827 void SetAllowConnections(const bool allow = true);
00828
00833 bool GetAllowConnections(void);
00834
00839 void SetNodeBuffers(const bool enable = false);
00840
00845 bool GetNodeBuffers(void);
00846
00847 private:
00848 friend class ReplicaObject;
00849 friend class ReplicaNetPrivate;
00850 friend class ReplicaNetDLLRegister;
00855 bool GetMakeMaster(void);
00856
00861 int GetObjectUniqueID(void);
00862
00867 int GetMakeUniqueID(void);
00868
00873 int GetMakeSessionID(void);
00874
00875 void LoadChangedForObject(ReplicaObject *object,float previousLoad,float newLoad);
00876
00877 void HandleLoadBalancing(void);
00878
00879 void AttachSession(RNReplicaNet::XPSession *session);
00880 void DoMasterCreateClassMessage(int sessionid,ReplicaObject *object);
00881 void DoMasterTakeOverClassMessage(int sessionid,ReplicaObject *object);
00882 bool DoClassDataMessage(ReplicaObject *object,MessageHelper *message,DataBlockReason *reason);
00883 bool DoClassDataCertainMessage(ReplicaObject *object,MessageHelper *message,DataBlockReason *reason,bool append = false);
00884 bool DoClassDataReliableMessage(ReplicaObject *object,MessageHelper *message,DataBlockReason *reason,bool append = false);
00885
00886 void CheckForObjectFaultMigration(bool objectdelete,int sessionleft);
00887
00888 static ReplicaNet* mCurrentReplicaNet;
00890 ReplicaNetPrivate* mPrivateReplicaNet;
00891
00892 void AddItem(s_RO_RegistryBlock *block);
00893
00900 ReplicaObject* AllocateReplicaObject(const int class_id,const int sessionid,const int uniqueid,const int reflect = kReplicaNetUnknownUniqueID);
00901 };
00902
00906 class ReplicaNetDLLRegister
00907 {
00908 public:
00909 ReplicaNetDLLRegister(){};
00910 virtual ~ReplicaNetDLLRegister(){};
00911
00912 void Call(ReplicaNet *repNet);
00913 };
00914
00915 }
00916
00917 extern REPLICANETDLL_API void *_gReplicaNet_PreRegisterReplicasFunc;
00918 extern void _ReplicaNetPreRegisterReplicasFunc(RNReplicaNet::ReplicaNet *repNet);
00919
00920
00921 #define REPLICANET_DLLPREREGISTER() \
00922 _gReplicaNet_PreRegisterReplicasFunc = (void*) &_ReplicaNetPreRegisterReplicasFunc;
00923
00924 #endif