ADC/net/adc_netsession_asio.h
2024-06-17 13:38:01 +03:00

90 lines
2.0 KiB
C++

#pragma once
/*
ABSTRACT DEVICE COMPONENTS LIBRARY
ASIO-library implementation of network server session
*/
#ifdef USE_ASIO_LIBRARY
#include "adc_netservice_asio.h"
// #ifdef USE_SPDLOG_LIBRARY
// #include "adc_netserver_spdlog.h"
// #endif // USE_SPDLOG_LIBRARY
namespace adc::impl
{
template <traits::adc_netservice_asio_c NetServiceT, typename ContextT = std::nullptr_t>
class AdcNetServerSessionASIO
{
public:
typedef std::string_view session_ident_t;
typedef NetServiceT netservice_t;
typedef ContextT context_t;
typedef std::chrono::duration<double, std::milli> timeout_t;
static constexpr timeout_t defaultSendTimeout = std::chrono::milliseconds(5000);
static constexpr timeout_t defaultRecvTimeout = std::chrono::milliseconds(5000);
template <traits::adc_input_char_range R>
AdcNetServerSessionASIO(netservice_t::socket_t&& sock, const R& sess_ident, ContextT&& context = nullptr)
: _socket(std::move(sock)),
_netService(_socket),
_sessionIdent(sess_ident.begin(), sess_ident.end()),
_context(context),
_sendTimeout(defaultSendTimeout),
_recvTimeout(defaultRecvTimeout)
{
}
virtual ~AdcNetServerSessionASIO()
{
_netService.close();
}
template <traits::adc_time_duration_c TimeoutT>
AdcNetServerSessionASIO& setDefaultTimeouts(const TimeoutT& send_timeout = defaultSendTimeout,
const TimeoutT& recv_timeout = defaultRecvTimeout)
{
_sendTimeout = send_timeout;
_recvTimeout = recv_timeout;
return *this;
}
session_ident_t sessionIdent() const
{
return {_sessionIdent.begin(), _sessionIdent.end()};
}
virtual void start() {}
virtual void stop() {}
protected:
netservice_t::socket_t _socket;
netservice_t _netService;
std::string _sessionIdent;
ContextT _context;
timeout_t _sendTimeout, _recvTimeout;
};
} // namespace adc::impl
#endif // USE_ASIO_LIBRARY