cmServerConnection.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #pragma once
  4. #include <cmConfigure.h> // IWYU pragma: keep
  5. #include <string>
  6. #include <vector>
  7. #if defined(CMAKE_BUILD_WITH_CMAKE)
  8. #include "cm_uv.h"
  9. #endif
  10. class cmServer;
  11. class cmFileMonitor;
  12. class LoopGuard;
  13. class cmServerConnection
  14. {
  15. public:
  16. cmServerConnection();
  17. virtual ~cmServerConnection();
  18. void SetServer(cmServer* s);
  19. bool ProcessEvents(std::string* errorMessage);
  20. void ReadData(const std::string& data);
  21. void TriggerShutdown();
  22. void WriteData(const std::string& data);
  23. void ProcessNextRequest();
  24. virtual void Connect(uv_stream_t* server) { (void)(server); }
  25. cmFileMonitor* FileMonitor() const { return this->mFileMonitor; }
  26. protected:
  27. virtual bool DoSetup(std::string* errorMessage) = 0;
  28. virtual void TearDown() = 0;
  29. void SendGreetings();
  30. uv_loop_t* Loop() const { return mLoop; }
  31. protected:
  32. std::string RawReadBuffer;
  33. std::string RequestBuffer;
  34. uv_stream_t* ReadStream = nullptr;
  35. uv_stream_t* WriteStream = nullptr;
  36. private:
  37. uv_loop_t* mLoop = nullptr;
  38. cmFileMonitor* mFileMonitor = nullptr;
  39. cmServer* Server = nullptr;
  40. uv_signal_t* SIGINTHandler = nullptr;
  41. uv_signal_t* SIGHUPHandler = nullptr;
  42. friend class LoopGuard;
  43. };
  44. class cmServerStdIoConnection : public cmServerConnection
  45. {
  46. public:
  47. cmServerStdIoConnection();
  48. bool DoSetup(std::string* errorMessage) override;
  49. void TearDown() override;
  50. private:
  51. typedef union
  52. {
  53. uv_tty_t* tty;
  54. uv_pipe_t* pipe;
  55. } InOutUnion;
  56. bool usesTty = false;
  57. InOutUnion Input;
  58. InOutUnion Output;
  59. };
  60. class cmServerPipeConnection : public cmServerConnection
  61. {
  62. public:
  63. cmServerPipeConnection(const std::string& name);
  64. bool DoSetup(std::string* errorMessage) override;
  65. void TearDown() override;
  66. void Connect(uv_stream_t* server) override;
  67. private:
  68. const std::string PipeName;
  69. uv_pipe_t* ServerPipe = nullptr;
  70. uv_pipe_t* ClientPipe = nullptr;
  71. };