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

ReplicaNet.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 // 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 5400
00020 // All DLL versions with the same major version are compatible
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;     /* A ReplicaObject has direct access to ReplicaNet the class */
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 //  void                TakeOverObject(ReplicaObject *object);
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 } // namespace RNReplicaNet
00916 
00917 extern REPLICANETDLL_API void *_gReplicaNet_PreRegisterReplicasFunc;
00918 extern void _ReplicaNetPreRegisterReplicasFunc(RNReplicaNet::ReplicaNet *repNet);
00919 
00920 // Calling this is guaranteed to not cause any memory allocation.
00921 #define REPLICANET_DLLPREREGISTER() \
00922     _gReplicaNet_PreRegisterReplicasFunc = (void*) &_ReplicaNetPreRegisterReplicasFunc;
00923 
00924 #endif

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