2009-04-15 14:03:31 +00:00
|
|
|
/*
|
|
|
|
* CVCMIServer.h, part of VCMI engine
|
|
|
|
*
|
|
|
|
* Authors: listed in file AUTHORS in main folder
|
|
|
|
*
|
|
|
|
* License: GNU General Public License v2.0 or later
|
|
|
|
* Full text of license available in license.txt file, in main folder
|
|
|
|
*
|
2009-04-16 11:14:13 +00:00
|
|
|
*/
|
2017-07-13 11:26:03 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <boost/program_options.hpp>
|
2009-04-16 11:14:13 +00:00
|
|
|
|
2010-10-24 11:35:14 +00:00
|
|
|
class CMapInfo;
|
|
|
|
|
2009-04-16 11:14:13 +00:00
|
|
|
class CConnection;
|
2010-10-30 21:53:41 +00:00
|
|
|
struct CPackForSelectionScreen;
|
2010-10-24 11:35:14 +00:00
|
|
|
class CGameHandler;
|
2017-06-04 15:59:11 +03:00
|
|
|
struct SharedMemory;
|
2010-10-24 11:35:14 +00:00
|
|
|
|
2009-04-16 11:14:13 +00:00
|
|
|
namespace boost
|
|
|
|
{
|
2017-07-20 02:50:47 +03:00
|
|
|
namespace asio
|
|
|
|
{
|
|
|
|
namespace ip
|
|
|
|
{
|
|
|
|
class tcp;
|
|
|
|
}
|
|
|
|
class io_service;
|
|
|
|
|
|
|
|
template<typename Protocol> class stream_socket_service;
|
|
|
|
template<typename Protocol, typename StreamSocketService>
|
|
|
|
class basic_stream_socket;
|
|
|
|
|
|
|
|
template<typename Protocol> class socket_acceptor_service;
|
|
|
|
template<typename Protocol, typename SocketAcceptorService>
|
|
|
|
class basic_socket_acceptor;
|
|
|
|
}
|
2009-04-16 11:14:13 +00:00
|
|
|
};
|
|
|
|
|
2017-07-20 02:50:47 +03:00
|
|
|
typedef boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp>> TAcceptor;
|
|
|
|
typedef boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp>> TSocket;
|
2010-10-24 11:35:14 +00:00
|
|
|
|
2009-04-16 11:14:13 +00:00
|
|
|
class CVCMIServer
|
|
|
|
{
|
2016-12-04 12:54:26 +03:00
|
|
|
ui16 port;
|
2017-07-20 02:50:47 +03:00
|
|
|
boost::asio::io_service * io;
|
2010-10-24 11:35:14 +00:00
|
|
|
TAcceptor * acceptor;
|
2017-06-04 15:59:11 +03:00
|
|
|
SharedMemory * shared;
|
2010-10-24 11:35:14 +00:00
|
|
|
|
2017-07-20 02:50:47 +03:00
|
|
|
CConnection * firstConnection;
|
|
|
|
|
2009-04-16 11:14:13 +00:00
|
|
|
public:
|
2017-07-18 00:04:00 +03:00
|
|
|
CVCMIServer();
|
|
|
|
~CVCMIServer();
|
2010-10-24 11:35:14 +00:00
|
|
|
|
2009-04-16 11:14:13 +00:00
|
|
|
void start();
|
2017-07-20 02:50:47 +03:00
|
|
|
CGameHandler * initGhFromHostingConnection(CConnection & c);
|
2010-10-24 11:35:14 +00:00
|
|
|
|
|
|
|
void newGame();
|
|
|
|
void loadGame();
|
|
|
|
void newPregame();
|
2017-05-25 19:57:20 +02:00
|
|
|
|
|
|
|
#ifdef VCMI_ANDROID
|
2017-07-20 02:50:47 +03:00
|
|
|
static void create();
|
2017-05-25 19:57:20 +02:00
|
|
|
#endif
|
2009-04-16 11:14:13 +00:00
|
|
|
};
|
2010-10-24 11:35:14 +00:00
|
|
|
|
2017-05-25 19:57:20 +02:00
|
|
|
struct StartInfo;
|
2010-10-24 11:35:14 +00:00
|
|
|
class CPregameServer
|
|
|
|
{
|
|
|
|
public:
|
2017-07-20 02:50:47 +03:00
|
|
|
CConnection * host;
|
2010-10-24 11:35:14 +00:00
|
|
|
int listeningThreads;
|
|
|
|
std::set<CConnection *> connections;
|
2017-07-20 02:50:47 +03:00
|
|
|
std::list<CPackForSelectionScreen *> toAnnounce;
|
2010-10-24 11:35:14 +00:00
|
|
|
boost::recursive_mutex mx;
|
|
|
|
|
2017-07-20 02:50:47 +03:00
|
|
|
TAcceptor * acceptor;
|
|
|
|
TSocket * upcomingConnection;
|
2010-10-24 11:35:14 +00:00
|
|
|
|
2017-07-20 02:50:47 +03:00
|
|
|
const CMapInfo * curmap;
|
|
|
|
StartInfo * curStartInfo;
|
2010-10-24 11:35:14 +00:00
|
|
|
|
2017-07-20 02:50:47 +03:00
|
|
|
CPregameServer(CConnection * Host, TAcceptor * Acceptor = nullptr);
|
2010-10-24 11:35:14 +00:00
|
|
|
~CPregameServer();
|
|
|
|
|
|
|
|
void run();
|
|
|
|
|
|
|
|
void processPack(CPackForSelectionScreen * pack);
|
2017-07-20 02:50:47 +03:00
|
|
|
void handleConnection(CConnection * cpc);
|
|
|
|
void connectionAccepted(const boost::system::error_code & ec);
|
|
|
|
void initConnection(CConnection * c);
|
2010-10-24 11:35:14 +00:00
|
|
|
|
|
|
|
void start_async_accept();
|
|
|
|
|
2017-07-20 02:50:47 +03:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
INVALID,
|
|
|
|
RUNNING,
|
|
|
|
ENDING_WITHOUT_START,
|
|
|
|
ENDING_AND_STARTING_GAME
|
2010-10-24 11:35:14 +00:00
|
|
|
} state;
|
|
|
|
|
2017-07-20 02:50:47 +03:00
|
|
|
void announceTxt(const std::string & txt, const std::string & playerName = "system");
|
|
|
|
void announcePack(const CPackForSelectionScreen & pack);
|
2010-10-24 11:35:14 +00:00
|
|
|
|
|
|
|
void sendPack(CConnection * pc, const CPackForSelectionScreen & pack);
|
|
|
|
void startListeningThread(CConnection * pc);
|
|
|
|
};
|
2013-06-21 20:59:32 +00:00
|
|
|
|
2016-11-28 21:00:56 +03:00
|
|
|
extern boost::program_options::variables_map cmdLineOptions;
|