2012-06-14 13:06:06 +00:00
// cServer.h
// Interfaces to the cServer object representing the network server
#pragma once
#ifndef CSERVER_H_INCLUDED
#define CSERVER_H_INCLUDED
2012-09-23 21:23:33 +00:00
#include "OSSupport/SocketThreads.h"
2012-08-30 21:06:13 +00:00
#include "CryptoPP/rsa.h"
2012-09-04 10:17:27 +00:00
#include "CryptoPP/randpool.h"
2012-06-14 13:06:06 +00:00
class cPlayer ;
class cClientHandle ;
2012-11-11 14:23:47 +00:00
class cIniFile ;
2012-06-14 13:06:06 +00:00
typedef std :: list < cClientHandle *> cClientHandleList ;
2013-01-12 04:46:01 +00:00
class cServer // tolua_export
{ // tolua_export
public : // tolua_export
2012-11-11 14:23:47 +00:00
bool InitServer ( cIniFile & a_SettingsIni );
2012-06-14 13:06:06 +00:00
int GetPort () { return m_iServerPort ; }
bool IsConnected (){ return m_bIsConnected ;} // returns connection status
void StartListenClient (); // Listen to client
2013-02-15 13:00:59 +00:00
void BroadcastChat ( const AString & a_Message , const cClientHandle * a_Exclude = NULL ); // tolua_export
2012-06-14 13:06:06 +00:00
bool Tick ( float a_Dt );
void StartListenThread ();
2012-08-18 10:38:15 +00:00
bool Command ( cClientHandle & a_Client , const AString & a_Cmd );
2013-02-15 13:00:59 +00:00
void ExecuteConsoleCommand ( const AString & a_Cmd );
/// Binds the built-in console commands with the plugin manager
static void BindBuiltInConsoleCommands ( void );
2012-06-14 13:06:06 +00:00
void Shutdown ();
2012-08-24 07:58:26 +00:00
void SendMessage ( const AString & a_Message , cPlayer * a_Player = NULL , bool a_bExclude = false ); // tolua_export
2012-06-14 13:06:06 +00:00
void KickUser ( int a_ClientID , const AString & a_Reason );
void AuthenticateUser ( int a_ClientID ); // Called by cAuthenticator to auth the specified user
static void ServerListenThread ( void * a_Args );
const AString & GetServerID ( void ) const ;
void ClientDestroying ( const cClientHandle * a_Client ); // Called by cClientHandle::Destroy(); stop m_SocketThreads from calling back into a_Client
void NotifyClientWrite ( const cClientHandle * a_Client ); // Notifies m_SocketThreads that client has something to be written
2012-09-25 08:23:19 +00:00
void WriteToClient ( const cClientHandle * a_Client , const AString & a_Data ); // Queues outgoing data for the client through m_SocketThreads
2012-06-14 13:06:06 +00:00
2012-09-25 08:23:19 +00:00
void QueueClientClose ( const cClientHandle * a_Client ); // Queues the clienthandle to close when all its outgoing data is sent
2012-06-14 13:06:06 +00:00
2012-09-25 08:23:19 +00:00
void RemoveClient ( const cClientHandle * a_Client ); // Removes the clienthandle from m_SocketThreads
2012-06-14 13:06:06 +00:00
2012-08-30 21:06:13 +00:00
CryptoPP :: RSA :: PrivateKey & GetPrivateKey ( void ) { return m_PrivateKey ; }
CryptoPP :: RSA :: PublicKey & GetPublicKey ( void ) { return m_PublicKey ; }
2012-06-14 13:06:06 +00:00
private :
friend class cRoot ; // so cRoot can create and destroy cServer
/// When NotifyClientWrite() is called, it is queued for this thread to process (to avoid deadlocks between cSocketThreads, cClientHandle and cChunkMap)
class cNotifyWriteThread :
public cIsThread
{
typedef cIsThread super ;
cEvent m_Event ; // Set when m_Clients gets appended
cServer * m_Server ;
cCriticalSection m_CS ;
cClientHandleList m_Clients ;
virtual void Execute ( void );
public :
cNotifyWriteThread ( void );
~ cNotifyWriteThread ();
bool Start ( cServer * a_Server );
void NotifyClientWrite ( const cClientHandle * a_Client );
} ;
struct sServerState ;
sServerState * m_pState ;
cNotifyWriteThread m_NotifyWriteThread ;
cCriticalSection m_CSClients ; // Locks client list
cClientHandleList m_Clients ; // Clients that are connected to the server
cSocketThreads m_SocketThreads ;
int m_ClientViewDistance ; // The default view distance for clients; settable in Settings.ini
// Time since server was started
float m_Millisecondsf ;
unsigned int m_Milliseconds ;
bool m_bIsConnected ; // true - connected false - not connected
int m_iServerPort ;
bool m_bRestarting ;
2012-08-30 21:06:13 +00:00
CryptoPP :: RSA :: PrivateKey m_PrivateKey ;
CryptoPP :: RSA :: PublicKey m_PublicKey ;
2012-06-14 13:06:06 +00:00
cServer ();
~ cServer ();
2012-08-30 21:06:13 +00:00
/// Loads, or generates, if missing, RSA keys for protocol encryption
void PrepareKeys ( void );
2013-01-12 04:46:01 +00:00
}; // tolua_export
2012-06-14 13:06:06 +00:00
#endif // CSERVER_H_INCLUDED