#pragma once #include "../main/Noncopyable.h" #include namespace http { namespace server { class CProxyClient; } // namespace server } // namespace http namespace tcp { namespace server { class CTCPServerIntBase; class CTCPClientBase : private domoticz::noncopyable { public: explicit CTCPClientBase(CTCPServerIntBase *pManager); ~CTCPClientBase(); virtual void start() = 0; virtual void stop() = 0; virtual void write(const char *pData, size_t Length) = 0; std::string m_username; std::string m_endpoint; bool m_bIsLoggedIn; // usual tcp parameters boost::asio::ip::tcp::socket *socket() { return socket_; } protected: /// The manager for this connection. CTCPServerIntBase *pConnectionManager; // usual tcp parameters boost::asio::ip::tcp::socket *socket_; }; class CTCPClient : public CTCPClientBase, public std::enable_shared_from_this { public: CTCPClient(boost::asio::io_service& ios, CTCPServerIntBase *pManager); ~CTCPClient() = default; void start() override; void stop() override; void write(const char *pData, size_t Length) override; private: void handleRead(const boost::system::error_code& error, size_t length); void handleWrite(const boost::system::error_code& error); /// Buffer for incoming data. std::array buffer_; }; #ifndef NOCLOUD class CSharedClient : public CTCPClientBase, public std::enable_shared_from_this { public: CSharedClient(CTCPServerIntBase *pManager, http::server::CProxyClient *proxy, const std::string &token, const std::string &username); ~CSharedClient() = default; void start() override; void stop() override; void write(const char *pData, size_t Length) override; void OnIncomingData(const unsigned char *data, size_t bytes_transferred); bool CompareToken(const std::string &token); private: http::server::CProxyClient *m_pProxyClient; std::string m_token; }; #endif typedef std::shared_ptr CTCPClient_ptr; } // namespace server } // namespace tcp