#pragma once #include "adc_netservice_asio.h" namespace adc::impl { class AdcNetSessionASIO { public: typedef std::string netsession_ident_t; template SESSION_PROTOT, traits::adc_output_char_range RMSGT = std::vector, traits::adc_is_callable RECV_MSG_TOKENT> AdcNetSessionASIO(const R& id, std::shared_ptr> netservice, RECV_MSG_TOKENT&& recv_msg_token) : _ident(id.begin(), id.end()) { // check receive message completion token signature and deduce message type if constexpr (!adc_asio_special_comp_token_c) { static_assert(traits::adc_func_traits::arity == 2, "INVALID COMPLETION TOKEN SIGNATURE!"); static_assert( std::is_same_v>, std::error_code>, "INVALID COMPLETION TOKEN SIGNATURE!"); static_assert(traits::adc_output_char_range< std::tuple_element_t<1, typename traits::adc_func_traits::args_t>>, "INVALID COMPLETION TOKEN SIGNATURE!"); } using msg_t = std::conditional_t< adc_asio_special_comp_token_c, RMSGT, std::remove_cvref_t::args_t>>>; _startFunc = [netservice, wrapper = traits::adc_pf_wrapper(std::forward(recv_msg_token)), this]() { // netservice->asyncReceive(std::get<0>(wrapper), _recvTimeout); }; _stopFunc = [netservice]() { // stop netservice->close(); }; } template SESSION_PROTOT, traits::adc_output_char_range RMSGT = std::vector, traits::adc_is_callable RECV_MSG_TOKENT> AdcNetSessionASIO(std::shared_ptr> netservice, RECV_MSG_TOKENT&& recv_msg_token) : AdcNetSessionASIO(std::derived_from ? "TCP SESSION" : std::derived_from ? "UDP SESSION" : std::derived_from ? "UNIX SEQPACKET SESSION" : std::derived_from ? "UNIX STREAM SESSION" : "UNKNOWN", std::move(netservice), std::forward(recv_msg_token)) { } virtual ~AdcNetSessionASIO() { stop(); } netsession_ident_t ident() const { return _ident; } void start() { _startFunc(); } void stop() { _stopFunc(); } template AdcNetSessionASIO& setDefaultTimeouts(const TimeoutT& send_timeout, const TimeoutT& recv_timeout) { _sendTimeout = send_timeout; _recvTimeout = recv_timeout; return *this; } protected: netsession_ident_t _ident; std::function _startFunc; std::function _stopFunc; std::chrono::duration _recvTimeout = std::chrono::seconds::max(); std::chrono::duration _sendTimeout = std::chrono::seconds(5); }; } // namespace adc::impl