#pragma once #include "../common/adc_utils.h" #include "adc_net_concepts.h" #include "adc_netserver.h" namespace adc { /* */ template > class AdcGenericNetClient : public LoggerT, public AdcNetSessionManager { public: typedef IdentT client_ident_t; typedef LoggerT logger_t; template AdcGenericNetClient(const IdentT& ident, LoggerCtorArgTs&&... args) : _clientIdent(ident), LoggerT(std::forward(args)...) { } virtual ~AdcGenericNetClient() { stopAllSessions(); } template void asyncConnect(const SessionT::netservice_t::endpoint_t& endpoint, SessionT::netsession_ident_t id, SessionT::netsession_ctx_t sess_ctx, NetServiceCtorArgTs&&... ctor_args) { auto srv_sptr = std::make_shared(std::forward(ctor_args)...); srv_sptr->asyncConnect( endpoint, [id = std::move(id), sess_ctx = std::move(sess_ctx), srv_sptr, this](auto ec) { if (ec) { this->logError("Cannot connect to server: {}", SessionT::netservice_t::formattableError(ec)); } else { auto sess = std::make_shared(id, std::move(*srv_sptr), sess_ctx); startSession(sess); } }, _connectTimeout); } template void connect(const SessionT::netservice_t::endpoint_t& endpoint, SessionT::netsession_ident_t id, SessionT::netsession_ctx_t sess_ctx, NetServiceCtorArgTs&&... ctor_args) { typename SessionT::netservice_t srv(std::forward(ctor_args)...); srv.connect(endpoint, _connectTimeout); auto sess = std::make_shared(std::move(id), std::move(srv), std::move(sess_ctx)); startSession(sess); } template void setConnectTimeout(const DT& timeout) { _connectTimeout = std::chrono::duration_cast(timeout); } auto getConnectionTimeout() const { return _connectTimeout; } protected: client_ident_t _clientIdent; std::chrono::milliseconds _connectTimeout = std::chrono::milliseconds(5000); }; } // namespace adc