diff options
Diffstat (limited to 'Source/cmServerConnection.h')
-rw-r--r-- | Source/cmServerConnection.h | 106 |
1 files changed, 39 insertions, 67 deletions
diff --git a/Source/cmServerConnection.h b/Source/cmServerConnection.h index b96bf3c..a70edb4 100644 --- a/Source/cmServerConnection.h +++ b/Source/cmServerConnection.h @@ -2,94 +2,66 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once -#include "cmConfigure.h" - -#include "cm_uv.h" +#include "cmConfigure.h" // IWYU pragma: keep #include <string> -class cmFileMonitor; -class cmServer; +#include "cmConnection.h" +#include "cmPipeConnection.h" +#include "cmUVHandlePtr.h" -class cmServerConnection -{ - CM_DISABLE_COPY(cmServerConnection) +class cmServerBase; +/*** + * This connection buffer strategy accepts messages in the form of + * [== "CMake Server" ==[ +{ + ... some JSON message ... +} +]== "CMake Server" ==] + * and only passes on the core json; it discards the envelope. + */ +class cmServerBufferStrategy : public cmConnectionBufferStrategy +{ public: - cmServerConnection(); - virtual ~cmServerConnection(); - - void SetServer(cmServer* s); - - bool ProcessEvents(std::string* errorMessage); - - void ReadData(const std::string& data); - void TriggerShutdown(); - void WriteData(const std::string& data); - void ProcessNextRequest(); + std::string BufferMessage(std::string& rawBuffer) override; + std::string BufferOutMessage(const std::string& rawBuffer) const override; - virtual void Connect(uv_stream_t* server) { (void)(server); } - - cmFileMonitor* FileMonitor() const { return this->mFileMonitor; } - -protected: - virtual bool DoSetup(std::string* errorMessage) = 0; - virtual void TearDown() = 0; +private: + std::string RequestBuffer; +}; - void SendGreetings(); +/*** + * Generic connection over std io interfaces -- tty + */ +class cmStdIoConnection : public cmEventBasedConnection +{ +public: + cmStdIoConnection(cmConnectionBufferStrategy* bufferStrategy); - uv_loop_t* Loop() const { return mLoop; } + void SetServer(cmServerBase* s) override; -protected: - std::string RawReadBuffer; - std::string RequestBuffer; + bool OnConnectionShuttingDown() override; - uv_stream_t* ReadStream = nullptr; - uv_stream_t* WriteStream = nullptr; + bool OnServeStart(std::string* pString) override; private: - uv_loop_t* mLoop = nullptr; - cmFileMonitor* mFileMonitor = nullptr; - cmServer* Server = nullptr; - uv_signal_t* SIGINTHandler = nullptr; - uv_signal_t* SIGHUPHandler = nullptr; - - friend class LoopGuard; + cm::uv_stream_ptr SetupStream(int file_id); + cm::uv_stream_ptr ReadStream; }; -class cmServerStdIoConnection : public cmServerConnection +/*** + * These specific connections use the cmake server + * buffering strategy. + */ +class cmServerStdIoConnection : public cmStdIoConnection { public: cmServerStdIoConnection(); - bool DoSetup(std::string* errorMessage) override; - - void TearDown() override; - -private: - typedef union - { - uv_tty_t* tty; - uv_pipe_t* pipe; - } InOutUnion; - - bool usesTty = false; - - InOutUnion Input; - InOutUnion Output; }; -class cmServerPipeConnection : public cmServerConnection +class cmServerPipeConnection : public cmPipeConnection { public: cmServerPipeConnection(const std::string& name); - bool DoSetup(std::string* errorMessage) override; - - void TearDown() override; - - void Connect(uv_stream_t* server) override; - -private: - const std::string PipeName; - uv_pipe_t* ServerPipe = nullptr; - uv_pipe_t* ClientPipe = nullptr; }; |