ReplicaNet.h

00001 /* START_LICENSE_HEADER
00002 
00003 Copyright (C) 2000 Martin Piper, original design and program code
00004 Copyright (C) 2001 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 // This pragma disables a warning in the Microsoft compiler. This can be safely ignored. See bug ref: C4786
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 // All DLL versions with the same major version are compatible
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;     /* A ReplicaObject has direct access to ReplicaNet the class */
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 } // namespace RNReplicaNet
00955 
00956 extern REPLICANETDLL_API void *_gReplicaNet_PreRegisterReplicasFunc;
00957 extern void _ReplicaNetPreRegisterReplicasFunc(RNReplicaNet::ReplicaNet *repNet);
00958 
00959 // Calling this is guaranteed to not cause any memory allocation.
00960 #define REPLICANET_DLLPREREGISTER() \
00961     _gReplicaNet_PreRegisterReplicasFunc = (void*) &_ReplicaNetPreRegisterReplicasFunc;
00962 
00963 #endif

Generated on Sat Jun 28 22:02:16 2008 for ReplicaNet and RNLobby by  doxygen 1.5.3