110 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
// RCONServer.h
 | 
						|
 | 
						|
// Declares the cRCONServer class representing the RCON server
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "OSSupport/SocketThreads.h"
 | 
						|
#include "OSSupport/ListenThread.h"
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
// fwd:
 | 
						|
class cServer;
 | 
						|
class cIniFile;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class cRCONServer :
 | 
						|
	public cListenThread::cCallback
 | 
						|
{
 | 
						|
public:
 | 
						|
	cRCONServer(cServer & a_Server);
 | 
						|
	~cRCONServer();
 | 
						|
	
 | 
						|
	void Initialize(cIniFile & a_IniFile);
 | 
						|
	
 | 
						|
protected:
 | 
						|
	friend class cRCONCommandOutput;
 | 
						|
	
 | 
						|
	class cConnection :
 | 
						|
		public cSocketThreads::cCallback
 | 
						|
	{
 | 
						|
	public:
 | 
						|
		cConnection(cRCONServer & a_RCONServer, cSocket & a_Socket);
 | 
						|
		
 | 
						|
	protected:
 | 
						|
		friend class cRCONCommandOutput;
 | 
						|
	
 | 
						|
		/// Set to true if the client has successfully authenticated
 | 
						|
		bool m_IsAuthenticated;
 | 
						|
		
 | 
						|
		/// Buffer for the incoming data
 | 
						|
		AString m_Buffer;
 | 
						|
		
 | 
						|
		/// Buffer for the outgoing data
 | 
						|
		AString m_Outgoing;
 | 
						|
		
 | 
						|
		/// Server that owns this connection and processes requests
 | 
						|
		cRCONServer & m_RCONServer;
 | 
						|
		
 | 
						|
		/// The socket belonging to the client
 | 
						|
		cSocket & m_Socket;
 | 
						|
		
 | 
						|
		/// Address of the client
 | 
						|
		AString m_IPAddress;
 | 
						|
		
 | 
						|
 | 
						|
		// cSocketThreads::cCallback overrides:
 | 
						|
		virtual void DataReceived(const char * a_Data, int a_Size) override;
 | 
						|
		virtual void GetOutgoingData(AString & a_Data) override;
 | 
						|
		virtual void SocketClosed(void) override;
 | 
						|
		
 | 
						|
		/// Processes the given packet and sends the response; returns true if successful, false if the connection is to be dropped
 | 
						|
		bool ProcessPacket(int a_RequestID, int a_PacketType, int a_PayloadLength, const char * a_Payload);
 | 
						|
		
 | 
						|
		/// Reads 4 bytes from a_Buffer and returns the int they represent
 | 
						|
		int IntFromBuffer(const char * a_Buffer);
 | 
						|
		
 | 
						|
		/// Puts 4 bytes representing the int into the buffer
 | 
						|
		void IntToBuffer(int a_Value, char * a_Buffer);
 | 
						|
		
 | 
						|
		/// Sends a RCON packet back to the client
 | 
						|
		void SendResponse(int a_RequestID, int a_PacketType, int a_PayloadLength, const char * a_Payload);
 | 
						|
	} ;
 | 
						|
	
 | 
						|
	
 | 
						|
	/// The server object that will process the commands received
 | 
						|
	cServer & m_Server;
 | 
						|
	
 | 
						|
	/// The thread(s) that take care of all the traffic on the RCON ports
 | 
						|
	cSocketThreads m_SocketThreads;
 | 
						|
	
 | 
						|
	/// The thread for accepting IPv4 RCON connections
 | 
						|
	cListenThread  m_ListenThread4;
 | 
						|
	
 | 
						|
	/// The thread for accepting IPv6 RCON connections
 | 
						|
	cListenThread  m_ListenThread6;
 | 
						|
	
 | 
						|
	/// Password for authentication
 | 
						|
	AString m_Password;
 | 
						|
 | 
						|
 | 
						|
	// cListenThread::cCallback overrides:
 | 
						|
	virtual void OnConnectionAccepted(cSocket & a_Socket) override;
 | 
						|
} ;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |