2012-06-14 09:06:06 -04: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 17:23:33 -04:00
# include "OSSupport/SocketThreads.h"
2012-08-30 17:06:13 -04:00
# include "CryptoPP/rsa.h"
2012-09-04 06:17:27 -04:00
# include "CryptoPP/randpool.h"
2012-06-14 09:06:06 -04:00
class cPlayer ;
class cClientHandle ;
typedef std : : list < cClientHandle * > cClientHandleList ;
class cServer //tolua_export
{ //tolua_export
public : //tolua_export
static cServer * GetServer ( ) ; //tolua_export
bool InitServer ( int a_Port = 25565 ) ;
int GetPort ( ) { return m_iServerPort ; }
bool IsConnected ( ) { return m_bIsConnected ; } // returns connection status
void StartListenClient ( ) ; // Listen to client
2012-08-24 03:58:26 -04:00
void BroadcastChat ( const AString & a_Message , const cClientHandle * a_Exclude = NULL ) ;
2012-06-14 09:06:06 -04:00
bool Tick ( float a_Dt ) ;
void StartListenThread ( ) ;
2012-08-18 06:38:15 -04:00
bool Command ( cClientHandle & a_Client , const AString & a_Cmd ) ;
void ServerCommand ( const AString & a_Cmd ) ; //tolua_export
2012-06-14 09:06:06 -04:00
void Shutdown ( ) ;
2012-08-24 03:58:26 -04:00
void SendMessage ( const AString & a_Message , cPlayer * a_Player = NULL , bool a_bExclude = false ) ; // tolua_export
2012-06-14 09:06:06 -04: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
void WriteToClient ( const cSocket * a_Socket , const AString & a_Data ) ; // Queues outgoing data for the socket through m_SocketThreads
void QueueClientClose ( const cSocket * a_Socket ) ; // Queues the socket to close when all its outgoing data is sent
void RemoveClient ( const cSocket * a_Socket ) ; // Removes the socket from m_SocketThreads
2012-08-30 17:06:13 -04:00
CryptoPP : : RSA : : PrivateKey & GetPrivateKey ( void ) { return m_PrivateKey ; }
CryptoPP : : RSA : : PublicKey & GetPublicKey ( void ) { return m_PublicKey ; }
2012-06-14 09:06:06 -04: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 17:06:13 -04:00
CryptoPP : : RSA : : PrivateKey m_PrivateKey ;
CryptoPP : : RSA : : PublicKey m_PublicKey ;
2012-06-14 09:06:06 -04:00
cServer ( ) ;
~ cServer ( ) ;
2012-08-30 17:06:13 -04:00
/// Loads, or generates, if missing, RSA keys for protocol encryption
void PrepareKeys ( void ) ;
2012-06-14 09:06:06 -04:00
} ; //tolua_export
# endif // CSERVER_H_INCLUDED