CVCMIServer.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * CVCMIServer.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include <boost/program_options.hpp>
  12. class CMapInfo;
  13. class CConnection;
  14. struct CPackForSelectionScreen;
  15. class CGameHandler;
  16. struct SharedMemory;
  17. namespace boost
  18. {
  19. namespace asio
  20. {
  21. namespace ip
  22. {
  23. class tcp;
  24. }
  25. class io_service;
  26. template<typename Protocol> class stream_socket_service;
  27. template<typename Protocol, typename StreamSocketService>
  28. class basic_stream_socket;
  29. template<typename Protocol> class socket_acceptor_service;
  30. template<typename Protocol, typename SocketAcceptorService>
  31. class basic_socket_acceptor;
  32. }
  33. };
  34. typedef boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp>> TAcceptor;
  35. typedef boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp>> TSocket;
  36. class CVCMIServer
  37. {
  38. ui16 port;
  39. boost::asio::io_service * io;
  40. TAcceptor * acceptor;
  41. SharedMemory * shared;
  42. CConnection * firstConnection;
  43. public:
  44. CVCMIServer();
  45. ~CVCMIServer();
  46. void start();
  47. CGameHandler * initGhFromHostingConnection(CConnection & c);
  48. void newGame();
  49. void loadGame();
  50. void newPregame();
  51. #ifdef VCMI_ANDROID
  52. static void create();
  53. #endif
  54. };
  55. struct StartInfo;
  56. class CPregameServer
  57. {
  58. public:
  59. CConnection * host;
  60. int listeningThreads;
  61. std::set<CConnection *> connections;
  62. std::list<CPackForSelectionScreen *> toAnnounce;
  63. boost::recursive_mutex mx;
  64. TAcceptor * acceptor;
  65. TSocket * upcomingConnection;
  66. const CMapInfo * curmap;
  67. StartInfo * curStartInfo;
  68. CPregameServer(CConnection * Host, TAcceptor * Acceptor = nullptr);
  69. ~CPregameServer();
  70. void run();
  71. void processPack(CPackForSelectionScreen * pack);
  72. void handleConnection(CConnection * cpc);
  73. void connectionAccepted(const boost::system::error_code & ec);
  74. void initConnection(CConnection * c);
  75. void start_async_accept();
  76. enum
  77. {
  78. INVALID,
  79. RUNNING,
  80. ENDING_WITHOUT_START,
  81. ENDING_AND_STARTING_GAME
  82. } state;
  83. void announceTxt(const std::string & txt, const std::string & playerName = "system");
  84. void announcePack(const CPackForSelectionScreen & pack);
  85. void sendPack(CConnection * pc, const CPackForSelectionScreen & pack);
  86. void startListeningThread(CConnection * pc);
  87. };
  88. extern boost::program_options::variables_map cmdLineOptions;