ReplicaNet and RNLobby  1
XPSession.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 __XPSESSION_H__
13 #define __XPSESSION_H__
14 
15 #define _XPSESSION_VERSION 7200
16 
17 #include <string>
18 #include <vector>
19 #include <list>
20 #include <map>
21 #include "RNXPSession/Inc/XPSession.h"
22 #include "RNXPURL/Inc/XPURL.h"
23 #include "RNXPURL/Inc/Transport.h"
24 #include "RNPlatform/Inc/MessageHelper.h"
25 #include "RNPlatform/Inc/ThreadClass.h"
26 #include "RNPlatform/Inc/SysTime.h"
27 
28 namespace RNReplicaNet
29 {
30 
31 const int kPingHistorySize = 5;
32 
33 class Thread;
34 
39 {
42  unsigned char mPacketTypeAndChecksum;
43  /* The top 4 bits are a checksum produced from the data in the packet */
44 };
45 
47 {
48 public:
49  XPSessionInternalBufferedPacket(const int sessionid,const char *data,const int length,const bool reliable,const bool certain,const bool ordered,const unsigned int band);
51 
52  int mSessionID;
53  char *mData;
54  int mLength;
55  bool mReliable;
56  bool mCertain;
57  bool mOrdered;
58  unsigned int mBand;
59 };
60 
61 const int kXPSessionUnknownID = -1;
62 const int kXPSessionBroadcastID = -2;
63 
64 /* These are the internal message types for session messages */
65 const unsigned char kXPSessionPacketType_Unreliable = 0;
66 const unsigned char kXPSessionPacketType_Reliable = 1;
67 const unsigned char kXPSessionPacketType_Certain = 2;
68 const unsigned char kXPSessionPacketType_Ordered = 3;
69 
83 class XPSession : public XPURL , public MessageHelper, public ThreadClass , private SysTime
84 {
85 public:
86 
90  enum Error
91  {
94  kXPSession_ETRANSPORT_CLOSED = -2,
95  kXPSession_ETRANSPORT_ERROR = -3
96  };
97 
101  XPSession();
102 
107  virtual ~XPSession();
108 
113  static XPSession *Allocate(void);
114 
120  void Create(const std::string name);
121 
128  void Create(const std::string name,const std::string protocols);
129 
141  std::string ExportURL(const bool shortAddress = true);
142 
148  void Join(const std::string url);
149 
153  void Find(void);
154 
159  void Find(const std::string protocols);
160 
165  std::string EnumerateFound(void);
166 
171  int GetGameChannel(void);
172 
177  void SetGameChannel(const int channel = TransportAnyGameChannel);
178 
183  int GetSessionID(void);
184 
189  bool IsStable(void);
190 
196  Error GetStatus(void);
197 
207 
222  void DataSendToSession(const int sessionid,const char *data,const int length,const bool reliable = true,const bool certain = false,const bool ordered = false,const unsigned int band = 0);
223 
230  void DataSendToSessionUnreliable(const int sessionid,const char *data,const int length);
231 
239  void DataSendToSessionOrdered(const int sessionid,const char *data,const int length,const unsigned int band = 0);
240 
248  void DataSendToSessionReliable(const int sessionid,const char *data,const int length,const unsigned int band = 0);
249 
256  void DataSendToSessionCertain(const int sessionid,const char *data,const int length);
257 
265  bool DataReceivePeek(int *const fromsessionid,int *const length,unsigned char *const type = 0);
266 
275  bool DataReceive(int *const fromsessionid,char *const data,int *const length,unsigned char *const type = 0);
276 
281  bool IsMaster(void);
282 
287  int GetJoiner(void);
288 
293  int GetLeaver(void);
294 
299  SysTimeType GetTime(void);
300 
305  SysTimeType GetLocalTime(void);
306 
311  float GetNetworkSendRate(void);
312 
317  float GetNetworkReceiveRate(void);
318 
323  int GetNetworkPacketsLost(void);
324 
329  int GetNetworkPacketsRejected(void);
330 
338  void Poll(void);
339 
345  void SetPollLayerBelow(bool enable = true);
346 
351  bool GetPollLayerBelow(void);
352 
359  void SetManualPoll(void);
360 
368  void SetAutomaticPoll(void);
369 
373  void SetManualPollXPURL(void);
374 
378  void SetAutomaticPollXPURL(void);
379 
380 
386  void SetCanSpider(const bool canSpider = true);
387 
392  bool GetCanSpider(void);
393 
400  void SetCanBecomeMaster(const bool canBeMaster = true);
401 
406  bool GetCanBecomeMaster(void);
407 
412  float GetLatencyToMasterSession(void);
413 
418  float GetLatencyToSessionID(const int sessionID);
419 
424  void SetLatencyRecalculationDelay(const float seconds = 1.0f);
425 
430  void SetEncryption(const bool enable = false);
431 
435  bool GetEncryption(void);
436 
437 
442  void Disconnect(const int sessionID = kXPSessionUnknownID);
443 
448  bool GetPreConnectStatus(void);
449 
460  void SetPreConnect(const bool enable = false);
461 
466  bool GetPreConnect(void);
467 
471  void PreConnectHasFinished(void);
472 
477  void SetAutomaticPacketCompression(const bool enable = false);
478 
484 
491  void GetCompressionStatistics(int *const before=0,int *const after=0,const bool reset = false);
492 
500  void GetMergedStatistics(int *const sent=0,int *const received=0,const bool reset = false);
501 
506  int GetMasterSessionID(void);
507 
514  std::string GetURLFromSessionID(const int sessionID);
515 
521  void SetClientOnly(const bool isClient = false);
522 
527  bool GetClientOnly(void);
528 
539  bool GetBandwidthFromSessionID(const int sessionID,Transport::Bandwidth *const bandwidth,int *const output,int *const input);
540 
545  void SetAllowConnections(const bool allow = true);
546 
551  bool GetAllowConnections(void);
552 
557  void SetNodeBuffers(const bool enable = false);
558 
563  bool GetNodeBuffers(void);
564 
565  typedef int GetSessionIDCallback(void *context);
566 
571  void RegisterSessionIDCallback(GetSessionIDCallback *callback = 0,void *context=0);
572 
573 
574  void SetProxyMode(const bool enable = false);
575 
576  bool GetProxyMode(void);
577 
582  void SetMaximumDataSize(const int bytes = 64*1024);
583  int GetMaximumDataSize(void) const;
584 
588  void SetPacketCompressionLevel(const int level = 10);
592  void SetLargePacketCompressionLevel(const int level = 5);
593 
594  int GetPacketCompressionLevel(void) const;
595  int GetLargePacketCompressionLevel(void) const;
596 
602  void SetTransparentPacketCompression(const int level = 0);
603 
609 
610 private:
611 struct Route;
612 friend struct Route;
613 // Variables in initialiser
614  int mGameChannel;
615  int mSessionID;
616  Error mStatus;
617  bool mIsMaster;
618  int mMasterSessionID;
619  Thread *mThread;
620  int mBufferLen;
621  char *mMessageBufferIn;
622  char *mMessageBufferOut;
623  float mCurrentSendRate;
624  float mCurrentRecvRate;
625  SysTimeType mLastRateCalcTime;
626  bool mCanSpider;
627  bool mCanBeMaster;
628  bool mCompletelyStable;
629  bool mTryingJoin;
630  SysTimeType startPollTime;
631  SysTimeType mLocalTimeStartPollTime;
632  int mPotentialMasterSessionID;
633  int mNoticedHighestSessionID;
634  bool mManualPoll;
635  bool mEncryptionOn;
636  bool mPollLayerBelow;
637  bool mEnablePreConnect;
638 
639 
640 // End of initialiser variables
641  std::vector<Transport *> mMasterListens;
642  std::vector<Transport *> mListens;
643  std::list<Route *> mConnections;
644  std::multimap<int,Route *> mConnectionsBySessionID;
645  std::vector<Transport *> mFindTransports;
647  std::string mSessionName;
648 
649  int mNextSessionID;
653  struct WaitingPacket
654  {
655  WaitingPacket()
656  {
657  mFromSession = kXPSessionUnknownID;
658  mPacket = 0;
659  mSize = 0;
660  mPacketType = kXPSessionPacketType_Unreliable;
661  }
662 
663  virtual ~WaitingPacket()
664  {
665  if (mPacket)
666  {
667  free (mPacket);
668  mPacket = 0;
669  }
670  }
671 
672  int mFromSession;
673  int mSize;
674  char *mPacket;
675  unsigned char mPacketType;
676  };
677 
678  std::list<WaitingPacket *> mWaitingPackets;
679 
680  std::list<int> mJoiners;
681  std::list<int> mLeavers;
682 
683  // When the session master disconnects then any routes that have errors are pushed on to the potential leaver list
684  std::list<int> mPotentialLeavers;
685 
686 
687  SysTimeType mZeroTime;
688  float mZeroTimeDelta;
689  SysTimeType mLastTimeCorrectionTime;
690  SysTimeType mTargetZeroTime;
691 
692 
693  bool mBreakoutDone;
694  bool mDontDoBreakOut;
695 
696  float mLatencyRecalculationDelay;
697 
698  bool mInPreConnect;
699  bool mPreConnectSignalDone;
700  int mPreConnectSendToID;
701 
702  bool mCreateOrJoinDone;
703 
704  bool mEnableAutomaticCompression;
705  int mCompressionBefore;
706  int mCompressionAfter;
707 
708  bool mIsClientOnly;
709  bool mTransportDisconnected;
710  bool mTransportError;
711 
712  bool mAllowConnections;
713 
714  int mNetworkPacketsLost;
715  int mNetworkPacketsRejected;
716 
717  bool mEnableExtraBuffering;
718  void HandleWaitingToSendPackets(void);
719  MutexClass mMutexSentPackets;
720  int mNumWaitingToSend;
721  std::list<XPSessionInternalBufferedPacket*> mWaitingToSend;
722  MutexClass mMutexRecvPackets;
723  MutexClass mMutexJoinerList;
724  MutexClass mMutexLeaverList;
725  // A mutex for locking misc values that are buffered below
726  MutexClass mMutexMiscValues;
727 
728  // Return values that are locked against mMutexMiscValues
729  std::string mReturnExportURLTrue;
730  std::string mReturnExportURLFalse;
731  std::map<int,std::string> mBufferedURLsBySessionID;
732  std::map<int,float> mBufferedLatencyBySessionID;
733 
734  XPSession::GetSessionIDCallback *mGetSessionIDCallback;
735  void *mGetSessionIDCallbackContext;
736 
737  bool mProxyMode;
738  bool mMasterIsProxyMode;
739 
740  // Private functions that mutex lock the main class
741  std::string BufferedExportURL(const bool shortAddress);
742  int BufferedGetNetworkPacketsLost(void);
743 
744  void MutateToMaster(const int nextsessionid,const Route *route);
745 
746  // This just exports the transport URLs and not the session name. Used by the spider to code.
747  std::string ExportURLInternal(const bool ShortAddress = true);
748 
749  std::string GetSessionString(void);
750 
751  Route *FindRouteForSessionIDFromMap(const int sessionID);
752 
757  bool Initialise(void);
758 
759 
760  void DataSendToSessionPrivate(const int sessionid,const char *data,const int length,const bool reliable = true,const bool certain = false,const bool ordered = false,const unsigned int band = 0);
761  void DataPacketSendPrivate(const int finalDestID,const char *data,const int length,const bool reliable,const bool certain,const bool ordered,const unsigned int band,Route *route);
762 
763  void InternalSendMessage(Route *routed, const SessionPacket_Header &message,const int length);
764  bool ParsePacket(Route *const route,int length);
765 
766  std::string AppendSessionInfo(std::string instr);
767 
768 
769  void HandleTransportDiscovery(Transport *const trans);
770  int ThreadEntry(void);
771 
772  // Compress and encrypt session packets are two very similar functions.
773  // They both act on the current message buffer only and modify the message header.
774  void CompressSessionPacket(SessionPacket_Header &message);
775  void EncryptSessionPacket(SessionPacket_Header &message);
776 
777  void AddJoiner(const int sessionid);
778  void AddLeaver(const int sessionid);
779 
780  void CreateBufferedURL(void);
781 
782  int mMaximumDataSize;
783  int mPacketCompressionLevel;
784  int mLargePacketCompressionLevel;
785 
786  int mTransparentPacketCompression;
787 };
788 
789 } // namespace RNReplicaNet
790 
791 #endif
void SetClientOnly(const bool isClient=false)
void SetMaximumDataSize(const int bytes=64 *1024)
void SetCanSpider(const bool canSpider=true)
float GetNetworkReceiveRate(void)
void PreConnectHasFinished(void)
bool GetBandwidthFromSessionID(const int sessionID, Transport::Bandwidth *const bandwidth, int *const output, int *const input)
void Disconnect(const int sessionID=kXPSessionUnknownID)
std::string GetURLFromSessionID(const int sessionID)
void SetEncryption(const bool enable=false)
bool GetPreConnectStatus(void)
bool GetPollLayerBelow(void)
void GetCompressionStatistics(int *const before=0, int *const after=0, const bool reset=false)
SysTimeType GetTime(void)
float GetLatencyToMasterSession(void)
unsigned char mPacketTypeAndChecksum
Definition: XPSession.h:42
void Join(const std::string url)
void GetMergedStatistics(int *const sent=0, int *const received=0, const bool reset=false)
bool GetAutomaticPacketCompression(void)
Definition: MessageHelper.h:35
void DataSendToSessionReliable(const int sessionid, const char *data, const int length, const unsigned int band=0)
bool GetCanBecomeMaster(void)
void DataSendToSession(const int sessionid, const char *data, const int length, const bool reliable=true, const bool certain=false, const bool ordered=false, const unsigned int band=0)
float GetNetworkSendRate(void)
int GetNetworkPacketsLost(void)
bool GetAllowConnections(void)
void SetLargePacketCompressionLevel(const int level=5)
Definition: SysTime.h:55
Definition: XPURL.h:29
void SetPollLayerBelow(bool enable=true)
void SetManualPollXPURL(void)
int GetTransparentPacketCompression(void)
void SetPreConnect(const bool enable=false)
short mDestinationSession
Definition: XPSession.h:40
void SetGameChannel(const int channel=TransportAnyGameChannel)
void Create(const std::string name)
Definition: XPSession.h:38
Error GetSessionErrorReason(void)
int GetNetworkPacketsRejected(void)
void SetPacketCompressionLevel(const int level=10)
void SetCanBecomeMaster(const bool canBeMaster=true)
SysTimeType GetLocalTime(void)
std::string EnumerateFound(void)
float GetLatencyToSessionID(const int sessionID)
Definition: XPSession.h:83
void SetNodeBuffers(const bool enable=false)
std::string ExportURL(const bool shortAddress=true)
void SetAllowConnections(const bool allow=true)
void SetAutomaticPollXPURL(void)
Definition: XPSession.h:92
void RegisterSessionIDCallback(GetSessionIDCallback *callback=0, void *context=0)
bool DataReceive(int *const fromsessionid, char *const data, int *const length, unsigned char *const type=0)
void SetLatencyRecalculationDelay(const float seconds=1.0f)
bool DataReceivePeek(int *const fromsessionid, int *const length, unsigned char *const type=0)
void DataSendToSessionUnreliable(const int sessionid, const char *data, const int length)
void SetTransparentPacketCompression(const int level=0)
short mSourceSession
Definition: XPSession.h:41
static XPSession * Allocate(void)
void DataSendToSessionCertain(const int sessionid, const char *data, const int length)
void DataSendToSessionOrdered(const int sessionid, const char *data, const int length, const unsigned int band=0)
void SetAutomaticPacketCompression(const bool enable=false)
Definition: ThreadClass.h:96
Definition: Thread.h:29
Error
Definition: XPSession.h:90