//
//  gensio - A library for abstracting stream I/O
//  Copyright (C) 2021  Corey Minyard <minyard@acm.org>
//
//  SPDX-License-Identifier: LGPL-2.1-only

#ifndef GENSIO_CLASSES_CPP_INCLUDE
#define GENSIO_CLASSES_CPP_INCLUDE

#include <gensio/gensio>

namespace gensio {
    // Subclasses of Gensio.  This allows direct allocation of a
    // gensio.

    class GENSIOCPP_DLL_PUBLIC Tcp: public Gensio {
    public:
	Tcp(const Addr &addr, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Tcp &operator=(const Gensio&) = delete;
    private:
	virtual ~Tcp() { }
	Tcp(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_tcp_class(Os_Funcs &o,
				       struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Udp: public Gensio {
    public:
	Udp(const Addr &addr, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Udp &operator=(const Gensio&) = delete;
    private:
	virtual ~Udp() { }
	Udp(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_udp_class(Os_Funcs &o,
				       struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Unix: public Gensio {
    public:
	Unix(const Addr &addr, const char * const args[],
	     Os_Funcs &o, Event *cb);

	Unix &operator=(const Gensio&) = delete;
    private:
	virtual ~Unix() { }
	Unix(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_unix_class(Os_Funcs &o,
					struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Sctp: public Gensio {
    public:
	Sctp(const Addr &addr, const char * const args[],
	     Os_Funcs &o, Event *cb);

	Sctp &operator=(const Gensio&) = delete;
    private:
	virtual ~Sctp() { }
	Sctp(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_sctp_class(Os_Funcs &o,
					struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Stdio: public Gensio {
    public:
	Stdio(const char *const argv[], const char * const args[],
	      Os_Funcs &o, Event *cb);

	Stdio &operator=(const Gensio&) = delete;
    private:
	virtual ~Stdio() { }
	Stdio(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_stdio_class(Os_Funcs &o,
					 struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Pty: public Gensio {
    public:
	Pty(const char *const argv[], const char * const args[],
	    Os_Funcs &o, Event *cb);

	Pty &operator=(const Gensio&) = delete;
    private:
	virtual ~Pty() { }
	Pty(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_pty_class(Os_Funcs &o,
				       struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Echo: public Gensio {
    public:
	Echo(const char * const args[],
	     Os_Funcs &o, Event *cb);

	Echo &operator=(const Gensio&) = delete;
    private:
	virtual ~Echo() { }
	Echo(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_echo_class(Os_Funcs &o,
					struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC File: public Gensio {
    public:
	File(const char * const args[],
	     Os_Funcs &o, Event *cb);

	File &operator=(const Gensio&) = delete;
    private:
	virtual ~File() { }
	File(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_file_class(Os_Funcs &o,
					struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Mdns: public Gensio {
    public:
	Mdns(const char *str, const char * const args[],
	     Os_Funcs &o, Event *cb);

	Mdns &operator=(const Gensio&) = delete;
    private:
	virtual ~Mdns() { }
	Mdns(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_mdns_class(Os_Funcs &o,
					struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Ssl: public Gensio {
    public:
	Ssl(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Ssl &operator=(const Gensio&) = delete;
    private:
	virtual ~Ssl() { }
	Ssl(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_ssl_class(Os_Funcs &o,
				       struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Mux: public Gensio {
    public:
	Mux(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Mux &operator=(const Gensio&) = delete;
    private:
	virtual ~Mux() { }
	Mux(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_mux_class(Os_Funcs &o,
				       struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Certauth: public Gensio {
    public:
	Certauth(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Certauth &operator=(const Gensio&) = delete;
    private:
	virtual ~Certauth() { }
	Certauth(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_certauth_class(Os_Funcs &o,
					    struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Telnet: public Gensio {
    public:
	Telnet(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Telnet &operator=(const Gensio&) = delete;
    private:
	virtual ~Telnet() { }
	Telnet(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_telnet_class(Os_Funcs &o,
					  struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Msgdelim: public Gensio {
    public:
	Msgdelim(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Msgdelim &operator=(const Gensio&) = delete;
    private:
	virtual ~Msgdelim() { }
	Msgdelim(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_msgdelim_class(Os_Funcs &o,
					    struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Relpkt: public Gensio {
    public:
	Relpkt(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Relpkt &operator=(const Gensio&) = delete;
    private:
	virtual ~Relpkt() { }
	Relpkt(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_relpkt_class(Os_Funcs &o,
					  struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Trace: public Gensio {
    public:
	Trace(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Trace &operator=(const Gensio&) = delete;
    private:
	virtual ~Trace() { }
	Trace(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_trace_class(Os_Funcs &o,
					 struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Perf: public Gensio {
    public:
	Perf(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Perf &operator=(const Gensio&) = delete;
    private:
	virtual ~Perf() { }
	Perf(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_perf_class(Os_Funcs &o,
					struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Kiss: public Gensio {
    public:
	Kiss(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	Kiss &operator=(const Gensio&) = delete;
    private:
	virtual ~Kiss() { }
	Kiss(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_kiss_class(Os_Funcs &o,
					struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC AX25: public Gensio {
    public:
	AX25(Gensio *child, const char * const args[],
	    Os_Funcs &o, Event *cb);

	AX25 &operator=(const Gensio&) = delete;
    private:
	virtual ~AX25() { }
	AX25(Os_Funcs &o) : Gensio(o, NULL) { }
	friend Gensio *alloc_ax25_class(Os_Funcs &o,
					struct gensio *io);
    };

    // Subclasses of Accepter.  These allow you to directly allocate
    // an Accepter, stack new accepters on top of old ones, etc.

    class GENSIOCPP_DLL_PUBLIC Tcp_Accepter : public Accepter {
    public:
	Tcp_Accepter(const Addr &addr, const char * const args[],
		     Os_Funcs &o, Accepter_Event *cb);
	Tcp_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Tcp_Accepter() { }
	Tcp_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_tcp_accepter_class(Os_Funcs &o,
						  struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Udp_Accepter : public Accepter {
    public:
	Udp_Accepter(const Addr &addr, const char * const args[],
		     Os_Funcs &o, Accepter_Event *cb);
	Udp_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Udp_Accepter() { }
	Udp_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_udp_accepter_class(Os_Funcs &o,
						  struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Unix_Accepter : public Accepter {
    public:
	Unix_Accepter(const Addr &addr, const char * const args[],
		      Os_Funcs &o, Accepter_Event *cb);
	Unix_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Unix_Accepter() { }
	Unix_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_unix_accepter_class(Os_Funcs &o,
						   struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Sctp_Accepter : public Accepter {
    public:
	Sctp_Accepter(const Addr &addr, const char * const args[],
		     Os_Funcs &o, Accepter_Event *cb);
	Sctp_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Sctp_Accepter() { }
	Sctp_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_sctp_accepter_class(Os_Funcs &o,
						   struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Stdio_Accepter : public Accepter {
    public:
	Stdio_Accepter(const char * const args[],
		       Os_Funcs &o, Accepter_Event *cb);
	Stdio_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Stdio_Accepter() { }
	Stdio_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_stdio_accepter_class(Os_Funcs &o,
						    struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Dummy_Accepter : public Accepter {
    public:
	Dummy_Accepter(const char * const args[],
		       Os_Funcs &o, Accepter_Event *cb);
	Dummy_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Dummy_Accepter() { }
	Dummy_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_dummy_accepter_class(Os_Funcs &o,
						    struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Conacc_Accepter : public Accepter {
    public:
	Conacc_Accepter(const char *str, const char * const args[],
		       Os_Funcs &o, Accepter_Event *cb);
	Conacc_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Conacc_Accepter() { }
	Conacc_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_conacc_accepter_class(Os_Funcs &o,
						     struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Ssl_Accepter : public Accepter {
    public:
	Ssl_Accepter(Accepter *child, const char * const args[],
		     Os_Funcs &o, Accepter_Event *cb);
	Ssl_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Ssl_Accepter() { }
	Ssl_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_ssl_accepter_class(Os_Funcs &o,
						  struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Mux_Accepter : public Accepter {
    public:
	Mux_Accepter(Accepter *child, const char * const args[],
		     Os_Funcs &o, Accepter_Event *cb);
	Mux_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Mux_Accepter() { }
	Mux_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_mux_accepter_class(Os_Funcs &o,
						  struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Certauth_Accepter : public Accepter {
    public:
	Certauth_Accepter(Accepter *child, const char * const args[],
			  Os_Funcs &o, Accepter_Event *cb);
	Certauth_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Certauth_Accepter() { }
	Certauth_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_certauth_accepter_class(
				Os_Funcs &o,
				struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Telnet_Accepter : public Accepter {
    public:
	Telnet_Accepter(Accepter *child, const char * const args[],
			Os_Funcs &o, Accepter_Event *cb);
	Telnet_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Telnet_Accepter() { }
	Telnet_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_telnet_accepter_class(
				Os_Funcs &o,
				struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Msgdelim_Accepter : public Accepter {
    public:
	Msgdelim_Accepter(Accepter *child, const char * const args[],
			  Os_Funcs &o, Accepter_Event *cb);
	Msgdelim_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Msgdelim_Accepter() { }
	Msgdelim_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_msgdelim_accepter_class(
				Os_Funcs &o,
				struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Relpkt_Accepter : public Accepter {
    public:
	Relpkt_Accepter(Accepter *child, const char * const args[],
			Os_Funcs &o, Accepter_Event *cb);
	Relpkt_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Relpkt_Accepter() { }
	Relpkt_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_relpkt_accepter_class(
				Os_Funcs &o,
				struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Trace_Accepter : public Accepter {
    public:
	Trace_Accepter(Accepter *child, const char * const args[],
		       Os_Funcs &o, Accepter_Event *cb);
	Trace_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Trace_Accepter() { }
	Trace_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_trace_accepter_class(
				Os_Funcs &o,
				struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Perf_Accepter : public Accepter {
    public:
	Perf_Accepter(Accepter *child, const char * const args[],
		      Os_Funcs &o, Accepter_Event *cb);
	Perf_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Perf_Accepter() { }
	Perf_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_perf_accepter_class(
				Os_Funcs &o,
				struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC Kiss_Accepter : public Accepter {
    public:
	Kiss_Accepter(Accepter *child, const char * const args[],
		      Os_Funcs &o, Accepter_Event *cb);
	Kiss_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~Kiss_Accepter() { }
	Kiss_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_kiss_accepter_class(
				Os_Funcs &o,
				struct gensio_accepter *a);
    };

    class GENSIOCPP_DLL_PUBLIC AX25_Accepter : public Accepter {
    public:
	AX25_Accepter(Accepter *child, const char * const args[],
		      Os_Funcs &o, Accepter_Event *cb);
	AX25_Accepter &operator=(const Gensio&) = delete;
    private:
	virtual ~AX25_Accepter() { }
	AX25_Accepter(Os_Funcs &o) : Accepter(o, NULL) { }
	friend Accepter *alloc_ax25_accepter_class(
				Os_Funcs &o,
				struct gensio_accepter *a);
    };

    // Subclasses of Serial_Gensio.  This allows direct allocation of
    // a serial gensio.

    class GENSIOCPP_DLL_PUBLIC Serialdev: public Serial_Gensio {
    public:
	Serialdev(const char *devname, const char * const args[],
		  Os_Funcs &o, Event *cb);

	Serialdev &operator=(const Gensio&) = delete;
    private:
	virtual ~Serialdev() { };
	Serialdev(Os_Funcs &o) : Serial_Gensio(o, NULL) { }
	friend Gensio *alloc_serialdev_class(Os_Funcs &o,
					     struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Serial_Telnet: public Serial_Gensio {
    public:
	Serial_Telnet(Gensio *child, const char * const args[],
		Os_Funcs &o, Event *cb);

	Serial_Telnet &operator=(const Gensio&) = delete;
    private:
	virtual ~Serial_Telnet() { }
	Serial_Telnet(Os_Funcs &o) : Serial_Gensio(o, NULL) { }
	friend Gensio *alloc_telnet_class(Os_Funcs &o,
					  struct gensio *io);
    };

    class GENSIOCPP_DLL_PUBLIC Ipmisol: public Serial_Gensio {
    public:
	Ipmisol(const char *devname, const char * const args[],
		Os_Funcs &o, Event *cb);

	Ipmisol &operator=(const Gensio&) = delete;
    private:
	virtual ~Ipmisol() { }
	Ipmisol(Os_Funcs &o) : Serial_Gensio(o, NULL) { }
	friend Gensio *alloc_ipmisol_class(Os_Funcs &o,
					   struct gensio *io);
    };

}
#endif /* GENSIO_CLASSES_CPP_INCLUDE */
