From 1f9615a6bab7f0f1a947027176c68c335d406c64 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Mon, 10 Jun 2024 18:04:46 +0300 Subject: [PATCH] ... --- CMakeLists.txt | 4 +++ net/adc_netserver.h | 65 ++++++++++++++++++++++++++++++++++++++++++++ net/adc_netservice.h | 33 ++++++++++------------ 3 files changed, 83 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 58533a5..45a805d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,10 @@ option(SPDLOG_LIBRARY "Use SPDLOG library for logging" ON) if (SPDLOG_LIBRARY) find_package(spdlog REQUIRED) + set(ADC_COMMON_HEADERS ${ADC_COMMON_HEADERS} + common/adc_spdlog.h + ) + set(ADC_NETWORK_HEADERS ${ADC_NETWORK_HEADERS} net/adc_netserver_spdlog.h ) diff --git a/net/adc_netserver.h b/net/adc_netserver.h index 1383146..42c7ce5 100644 --- a/net/adc_netserver.h +++ b/net/adc_netserver.h @@ -7,6 +7,8 @@ ABSTRACT DEVICE COMPONENTS LIBRARY */ #include +#include +#include #if __has_include() // POSIX #define FORK_EXISTS 1 #include @@ -103,6 +105,15 @@ concept adc_netserver_session_c = requires { namespace traits { +template +concept adc_generic_netserver_impl_c = requires(T t, const T t_const) { + typename T::server_ident_t; + + { t_const.serverIdent() } -> std::same_as; + { t.start() } -> std::same_as; + { t.stop() } -> std::same_as; +}; + template concept adc_netserver_impl_c = requires(T t, const T t_const) { typename T::server_ident_t; @@ -110,12 +121,54 @@ concept adc_netserver_impl_c = requires(T t, const T t_const) { { t_const.serverIdent() } -> std::same_as; { t.start() } -> std::same_as; { t.stop() } -> std::same_as; + { t.daemonize() } -> std::same_as; { t.daemonizePrepare() } -> std::same_as; { t.daemonizeFinalize() } -> std::same_as; }; } // namespace traits + +/* VERY GENERIC NETWORK SERVER INTERFACE */ + +template +class AdcGenericNetServer +{ +protected: + ImplT _impl; + +public: + typedef ImplT server_impl_t; + using typename ImplT::server_ident_t; + + template + AdcGenericNetServer(ImplCtorArgTs&&... ctor_args) : _impl(std::make_unique(ctor_args)...) + { + } + + + virtual ~AdcGenericNetServer() = default; + + + virtual server_ident_t serverIdent() const + { + // + return _impl.serverIdent(); + } + + virtual void start() + { + // + _impl.start(); + }; + + virtual void stop() + { + // + _impl.stop(); + }; +}; + template class AdcNetServer { @@ -159,6 +212,7 @@ public: { daemonizePrepare(); + // reference implementation of forking for POSIX OSes #ifdef FORK_EXISTS // get TEMP directory in OS @@ -204,6 +258,17 @@ public: protected: + // started sessions waek pointers + template + static std::unordered_map> _serverSessions; + + template + void startAsyncSession(const typename SessionT::shared_ptr_t& sess_ptr) + { + _serverSessions[this].insert(sess_ptr); + sess_ptr.start(); + } + virtual void daemonizePrepare() { // diff --git a/net/adc_netservice.h b/net/adc_netservice.h index 4bcaaa9..53935a5 100644 --- a/net/adc_netservice.h +++ b/net/adc_netservice.h @@ -8,23 +8,19 @@ ABSTRACT DEVICE COMPONENTS LIBRARY #include -#include #include + namespace adc { -template -class AdcNetServiceAbstractImplementation; - - template class AdcNetService { protected: - std::unique_ptr _implUptr; + ImplT _impl; public: using typename ImplT::endpoint_t; @@ -36,9 +32,11 @@ public: static constexpr timeout_drtn_t defaultSendTimeout = std::chrono::seconds(5); static constexpr timeout_drtn_t defaultRecvTimeout = std::chrono::seconds(5); - AdcNetService(ImplT* impl) : _implUptr(impl) {} + template + AdcNetService(ImplCtorArgTs&&... ctor_args) : _impl(std::forward(ctor_args)...) + { + } - AdcNetService(std::unique_ptr impl) : _implUptr(std::move(impl)) {} virtual ~AdcNetService() = default; @@ -46,25 +44,22 @@ public: /* asynchronuos operations */ // open connection - template - auto asyncConnect(const endpoint_t& end_point, - const timeout_drtn_t& timeout = defaultConnectTimeout, - ArgTs&&... args) + auto asyncConnect(const endpoint_t& end_point, const timeout_drtn_t& timeout = defaultConnectTimeout) { - return _implUptr->asyncConnect(end_point, timeout, std::forward(args)...); + return _impl.asyncConnect(end_point, timeout); } template auto asyncSend(const NetMessageT& msg, const timeout_drtn_t& timeout = defaultSendTimeout, ArgTs&&... args) { - return _implUptr->asyncSend(msg, timeout, std::forward(args)...); + return _impl.asyncSend(msg, timeout, std::forward(args)...); } template auto asyncReceive(const timeout_drtn_t& timeout = defaultRecvTimeout, ArgTs&&... args) { - return _implUptr->asyncReceive(timeout, std::forward(args)...); + return _impl.asyncReceive(timeout, std::forward(args)...); } @@ -74,26 +69,26 @@ public: template auto connect(const endpoint_t& endpoint, const timeout_drtn_t& timeout = defaultConnectTimeout, ArgTs&&... args) { - return _implUptr->connect(endpoint, timeout, std::forward(args)...); + return _impl.connect(endpoint, timeout, std::forward(args)...); } template auto send(const NetMessageT& msg, const timeout_drtn_t& timeout = defaultSendTimeout, ArgTs&&... args) { - return _implUptr->send(msg, timeout, std::forward(args)...); + return _impl.send(msg, timeout, std::forward(args)...); } template NetMessageT receive(const timeout_drtn_t& timeout = defaultRecvTimeout, ArgTs&&... args) { - return _implUptr->receive(timeout, std::forward(args)...); + return _impl.receive(timeout, std::forward(args)...); } template auto close(ArgTs&&... args) { - return _implUptr->close(std::forward(args)...); + return _impl.close(std::forward(args)...); } };