CVCMIServer.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 { INVALID, RUNNING, ENDING_WITHOUT_START, ENDING_AND_STARTING_GAME
  77. } state;
  78. void announceTxt(const std::string &txt, const std::string &playerName = "system");
  79. void announcePack(const CPackForSelectionScreen &pack);
  80. void sendPack(CConnection * pc, const CPackForSelectionScreen & pack);
  81. void startListeningThread(CConnection * pc);
  82. };
  83. extern boost::program_options::variables_map cmdLineOptions;