From 0b3e80261be598325efb3ed2441d07f7aec35cce Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Fri, 18 Oct 2024 23:56:23 +0300 Subject: [PATCH] ... --- net/adc_device_netserver.h | 88 ++++++++++++++++++++++++++++++++++++-- net/adc_netserver.h | 35 ++++++++++----- 2 files changed, 109 insertions(+), 14 deletions(-) diff --git a/net/adc_device_netserver.h b/net/adc_device_netserver.h index 82a7ef3..065f279 100644 --- a/net/adc_device_netserver.h +++ b/net/adc_device_netserver.h @@ -1,5 +1,6 @@ #pragma once +#include "adc_device_netmsg.h" #include "adc_netserver.h" namespace adc @@ -9,13 +10,94 @@ namespace adc class AdcDeviceNetServer : public AdcGenericNetServer { public: - class Session + template + class Session : std::enable_shared_from_this> { public: - void start() {} - void stop() {} + typedef std::string netsession_ident_t; + typedef NetServiceT netservice_t; + typedef AdcDeviceNetServer* netsession_ctx_t; + + template + Session(R&& id, netservice_t srv, netsession_ctx_t ctx) : _ident(), _netService(std::move(srv)), _context(ctx) + { + if constexpr (std::is_array_v>) { + _ident = id; + } else { + _ident = netsession_ident_t(id.begin(), id.end()); + } + } + + netsession_ident_t ident() const + { + return _ident; + } + + void start() + { + _netService.asyncReceive( + [this](std::error_code ec, std::vector msg) { + if (ec) { + stop(); + } else { + auto msg_sptr = std::make_shared>(std::move(msg)); + + AdcDeviceProtoMessage dev_msg(*msg_sptr); + + handleMessage(dev_msg); + + _netService.asyncSend( + *msg_sptr, + [msg_sptr, this](std::error_code ec) { + if (ec) { + stop(); + } else { + start(); + } + }, + _sendTimeout); + } + }, + _recvTimeout); + } + + void stop() + { + _netService.close(); + } + + protected: + netsession_ident_t _ident; + netservice_t _netService; + netsession_ctx_t _context; + + std::chrono::duration _recvTimeout = std::chrono::seconds(3600); + std::chrono::duration _sendTimeout = std::chrono::seconds(5); + + void handleMessage(auto& msg) + { + if (msg.isACK()) { + msg.ack(); + } else if (msg.isNAMES()) { + } else if (msg.isHELLO()) { + } else if (msg.isGET()) { + } else if (msg.isSET()) { + } else if (msg.isCMD()) { + msg.ack(); + } else { + msg.err(std::error_code{}); // !!!!!!!!!!!! + } + } }; + + using AdcGenericNetServer::AdcGenericNetServer; + + template + AdcDeviceNetServer& addDevice(DeviceT* dev_ptr) + { + } + protected: }; diff --git a/net/adc_netserver.h b/net/adc_netserver.h index b4ac0df..d9de1d5 100644 --- a/net/adc_netserver.h +++ b/net/adc_netserver.h @@ -176,6 +176,15 @@ protected: public: typedef std::string server_ident_t; + template + AdcGenericNetServer(R&& id) : _serverIdent() + { + if constexpr (std::is_array_v>) { + _serverIdent = id; + } else { + _serverIdent = server_ident_t{id.begin(), id.end()}; + } + } virtual ~AdcGenericNetServer() = default; @@ -192,7 +201,7 @@ public: const typename SessionT::netsession_ctx_t& sess_ctx, AcceptorCtorArgTs&&... ctor_args) { - if (!_isListening[this]) { + if (!_isListening[this][id]) { auto acceptor = std::make_shared( std::forward(ctor_args)...); @@ -259,29 +268,33 @@ protected: }; -template +template class AdcAbstractNetServer { public: - struct ServerControls { - std::function onOpen; - std::function onClose; - std::function)> onData; - std::function onError; + struct ServerEvents { + std::function onOpen; + std::function onClose; + std::function)> onData; + std::function onError; }; - AdcAbstractNetServer(ServerControls&& ctls) : _serverControls(std::move(ctls)) {} + AdcAbstractNetServer(ServerEvents&& events) : _serverEvents(std::move(events)) {} - template - void listen(const EnptT& endpoint) + template + void listen(const typename NetServiceT::endpoint_t& endpoint, AcceptorCtorArgTs&&... ctor_args) { + auto acceptor = + std::make_shared(endpoint, std::forward(ctor_args)...); } void stop() {} protected: - ServerControls _serverControls; + ServerEvents _serverEvents; + + typename NetServiceT::acceptor_t _acceptor; };