text: 
  // RCONServer.h
  
  // Declares the cRCONServer class representing the RCON server
  
  
  
  
  
  #pragma once
  
  #include "OSSupport/Network.h"
  
  
  
  
  
  // fwd:
  class cServer;
  class cIniFile;
  
  
  
  
  
  class cRCONServer
  {
  public:
  	cRCONServer(cServer & a_Server);
  	virtual ~cRCONServer();
  	
  	void Initialize(cIniFile & a_IniFile);
  	
  protected:
  	friend class cRCONCommandOutput;
  	friend class cRCONListenCallbacks;
  	
  	class cConnection :
  		public cTCPLink::cCallbacks
  	{
  	public:
  		cConnection(cRCONServer & a_RCONServer, const AString & a_IPAddress);
  		
  	protected:
  		friend class cRCONCommandOutput;
  	
  		/** Set to true if the client has successfully authenticated */
  		bool m_IsAuthenticated;
  		
  		/** Buffer for the incoming data */
  		AString m_Buffer;
  		
  		/** Server that owns this connection and processes requests */
  		cRCONServer & m_RCONServer;
  		
  		/** The TCP link to the client */
  		cTCPLinkPtr m_Link;
  		
  		/** Address of the client */
  		AString m_IPAddress;
  		
  
  		// cTCPLink::cCallbacks overrides:
  		virtual void OnLinkCreated(cTCPLinkPtr a_Link);
  		virtual void OnReceivedData(const char * a_Data, size_t a_Length) override;
  		virtual void OnRemoteClosed(void) override;
  		virtual void OnError(int a_ErrorCode, const AString & a_ErrorMsg) override;
  		
  		/** Processes the given packet and sends the response; returns true if successful, false if the connection is to be dropped */
  		bool ProcessPacket(UInt32 a_RequestID, UInt32 a_PacketType, UInt32 a_PayloadLength, const char * a_Payload);
  		
  		/** Reads 4 bytes from a_Buffer and returns the LE UInt32 they represent */
  		UInt32 UIntFromBuffer(const char * a_Buffer);
  		
  		/** Puts 4 bytes representing the int into the buffer */
  		void UIntToBuffer(UInt32 a_Value, char * a_Buffer);
  		
  		/** Sends a RCON packet back to the client */
  		void SendResponse(UInt32 a_RequestID, UInt32 a_PacketType, UInt32 a_PayloadLength, const char * a_Payload);
  	} ;
  	
  	
  	/** The server object that will process the commands received */
  	cServer & m_Server;
  	
  	/** The sockets for accepting RCON connections (one socket per port). */
  	cServerHandlePtrs m_ListenServers;
  	
  	/** Password for authentication */
  	AString m_Password;
  } ;
  
  
  
  
  
  