...
This commit is contained in:
@@ -7,6 +7,8 @@ ABSTRACT DEVICE COMPONENTS LIBRARY
|
||||
*/
|
||||
|
||||
#include <filesystem>
|
||||
#include <set>
|
||||
#include <unordered_map>
|
||||
#if __has_include(<unistd.h>) // POSIX
|
||||
#define FORK_EXISTS 1
|
||||
#include <sys/stat.h>
|
||||
@@ -103,6 +105,15 @@ concept adc_netserver_session_c = requires {
|
||||
namespace traits
|
||||
{
|
||||
|
||||
template <typename T>
|
||||
concept adc_generic_netserver_impl_c = requires(T t, const T t_const) {
|
||||
typename T::server_ident_t;
|
||||
|
||||
{ t_const.serverIdent() } -> std::same_as<typename T::server_ident_t>;
|
||||
{ t.start() } -> std::same_as<void>;
|
||||
{ t.stop() } -> std::same_as<void>;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
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<typename T::server_ident_t>;
|
||||
{ t.start() } -> std::same_as<void>;
|
||||
{ t.stop() } -> std::same_as<void>;
|
||||
{ t.daemonize() } -> std::same_as<void>;
|
||||
{ t.daemonizePrepare() } -> std::same_as<void>;
|
||||
{ t.daemonizeFinalize() } -> std::same_as<void>;
|
||||
};
|
||||
|
||||
} // namespace traits
|
||||
|
||||
|
||||
/* VERY GENERIC NETWORK SERVER INTERFACE */
|
||||
|
||||
template <traits::adc_generic_netserver_impl_c ImplT>
|
||||
class AdcGenericNetServer
|
||||
{
|
||||
protected:
|
||||
ImplT _impl;
|
||||
|
||||
public:
|
||||
typedef ImplT server_impl_t;
|
||||
using typename ImplT::server_ident_t;
|
||||
|
||||
template <typename... ImplCtorArgTs>
|
||||
AdcGenericNetServer(ImplCtorArgTs&&... ctor_args) : _impl(std::make_unique<ImplT>(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 <traits::adc_netserver_impl_c ImplT>
|
||||
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 <traits::adc_netserver_session_c SessionT>
|
||||
static std::unordered_map<const AdcNetServer*, std::set<typename SessionT::weak_ptr_t>> _serverSessions;
|
||||
|
||||
template <traits::adc_netserver_session_c SessionT>
|
||||
void startAsyncSession(const typename SessionT::shared_ptr_t& sess_ptr)
|
||||
{
|
||||
_serverSessions<SessionT>[this].insert(sess_ptr);
|
||||
sess_ptr.start();
|
||||
}
|
||||
|
||||
virtual void daemonizePrepare()
|
||||
{
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user