/** ****************************************************************************** @file /net/server.h @brief Trida server @author Vta @version 1.0 ******************************************************************************/ #ifndef _SERVER_ #define _SERVER_ #include "net/comm.h" #include "net/client.h" namespace net { /** Funkce bezici ve vlastnim vlakne prijimajici "sitove" klienty */ int accept_thread(void * data); /** Funkce bezici ve vlastnim vlakne prijimajici zpravy od "sitovych" klientu */ int recvServer_thread(void * data); /** Vlakno na oznamovani sitove hry */ int announceGame_thread(void * data); /** Vlakno na oznamovani LAN hry */ int announceGameLAN_thread(void * data); /** Funkce spoustena ve vlastnim vlakne odesilajici ping */ int pingServer_thread(void * data); /// Trida sitoveho serveru class TServer:public TComm { public: /** Konstruktor. @param maxClients udava kolik hracu se bude moci pripojit @param localGame rovno 1 signalizuje, ze jde jen o lokalni hru @param port cislo portu, po kterem se bude komunikovat @param reconnect zda povolit znovu pripojeni hracu */ TServer(int maxClients,int localGame,int port, int reconnect); /** Destruktur, ceka az jeho vsechna vlakna skonci */ ~TServer(); /** Zahaji vlastni cinnost */ int prepare(); /** Prida jednoho localniho hrace */ int addLocalClient(char profilename[K8_MAX_NAME_LEN]); /** Oznami serveru, ze hra zacala, vraci 0 uspech, -1 neuspech */ int startGame(); /** Oznameni serveru, ze hra skoncila */ void endGame(); /** Pripravi data k odeslani (zaradi do fronty), vrati kolik je zprav pred touto */ int sendMessage(TXMLdata * data); /** Vraci, zda player na pozici id je lokalni nebo ne */ int isLocal(int id); /** Odhlaseni klienta */ void clientDisconnected(int id); /** Pokus o znovu prihlaseni klienta. Vraci nove umisteni v poli clients */ int reconnectClient(int from,char * name); /** Zaznamenani serveru u klienta s clientid id jeho jmeno. Vraci 0 v pripade, ze jiz takove jmeno existuje, jinak jeho clientid */ int noteClientProfileName(int id,char * name); /** Zpristupni informace o klientech */ void showMeClientsInfo(DA** clients); /** Zacne odesilat ping na daneho klienta */ void startPing(int cid); /** Upravi cas posledniho prichodu ping u klienta s id cid */ void setPing(int cid); /** If all players have already reconnected, stop annoucing free slots */ void stopAnnouncingMissingPlayers(); /** Set description of the game */ void changeDescription(char * description); private: /** Vrati misto v poli klientu, kam se naalokuje novy klient */ TNodeInfo ** getFreeClient(); /** Returns clientid of the first free client. This function has to be called immediatelly after getFreeClient before any allocation of TNodeInfo in clients array is done*/ int getFreeClientId(); /** Vrati zbyvajici pocet volnych pripojeni klientu */ int getFreeClientCount(); /** Uklidi misto, ktere slouzi jen na prijem a nasledne odmitnuti klienti, kteri jiz nemaji narok se pripojit ke hre */ int FreeExtraClient(int clientid); /** Zacne naslouchat */ int install(); /** User defined description of the game */ char description[50]; /** Alokuje port */ int allocatePort(); /** If it is necessary to announce the game to the web immediately (cannot wait for the timeout), e.g. change of decription, set it to 1 */ int announce_right_now; /** Pole informaci o klientech. Prvni klient ma id=1 */ DA* clients; /** Pocet klientu kteri se pripojili a jsou ve hre. Tj. i ty kteri se po zahajeni hry docasne odpoji */ int clientsConnected; /** Maximalni pocet klientu, kteri se mohou pripojit */ int maxClients; /** Zda se ma oznamovat sitova hra */ int announce; /** Zapamatovani si nastaveni oznamovani */ int announceold; /** Id vlakna, ktere prijima klienty */ SDL_Thread * acceptThread; /** Id vlakna, ktere prijima data od klientu */ SDL_Thread * recvThread; /** Id vlakna, ktere prijima data od klientu */ SDL_Thread * announceThread; /** Id vlakna, ktere odesila ping */ SDL_Thread * pingThread; /** Fuknce v nize se provadi accept */ friend int accept_thread(void * data); /** Fununkce v niz se prijimaji zpravy od klientu */ friend int recvServer_thread(void * data); /** Oznamovani o nove hre */ friend int announceGame_thread(void * data); /** Oznamovani o nove hre */ friend int announceGameLAN_thread(void * data); /** Odesilani pingu */ friend int pingServer_thread(void * data); /** Zda povolit znovu pripojeni hracu */ int reconnection; }; } #endif