CVCMIServer.h 2.7 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. #if BOOST_VERSION >= 106600 // Boost version >= 1.66
  26. class io_context;
  27. typedef io_context io_service;
  28. #else
  29. class io_service;
  30. #endif
  31. template <typename Protocol> class stream_socket_service;
  32. template <typename Protocol,typename StreamSocketService>
  33. class basic_stream_socket;
  34. template <typename Protocol> class socket_acceptor_service;
  35. template <typename Protocol,typename SocketAcceptorService>
  36. class basic_socket_acceptor;
  37. }
  38. };
  39. typedef boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > TAcceptor;
  40. typedef boost::asio::basic_stream_socket < boost::asio::ip::tcp , boost::asio::stream_socket_service<boost::asio::ip::tcp> > TSocket;
  41. class CVCMIServer
  42. {
  43. ui16 port;
  44. boost::asio::io_service *io;
  45. TAcceptor * acceptor;
  46. SharedMemory * shared;
  47. CConnection *firstConnection;
  48. public:
  49. CVCMIServer();
  50. ~CVCMIServer();
  51. void start();
  52. std::shared_ptr<CGameHandler> initGhFromHostingConnection(CConnection &c);
  53. void newGame();
  54. void loadGame();
  55. void newPregame();
  56. #ifdef VCMI_ANDROID
  57. static void create();
  58. #endif
  59. };
  60. struct StartInfo;
  61. class CPregameServer
  62. {
  63. public:
  64. CConnection *host;
  65. int listeningThreads;
  66. std::set<CConnection *> connections;
  67. std::list<CPackForSelectionScreen*> toAnnounce;
  68. boost::recursive_mutex mx;
  69. TAcceptor *acceptor;
  70. TSocket *upcomingConnection;
  71. const CMapInfo *curmap;
  72. StartInfo *curStartInfo;
  73. CPregameServer(CConnection *Host, TAcceptor *Acceptor = nullptr);
  74. ~CPregameServer();
  75. void run();
  76. void processPack(CPackForSelectionScreen * pack);
  77. void handleConnection(CConnection *cpc);
  78. void connectionAccepted(const boost::system::error_code& ec);
  79. void initConnection(CConnection *c);
  80. void start_async_accept();
  81. enum { INVALID, RUNNING, ENDING_WITHOUT_START, 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;