#pragma once #include #include #include #include namespace saw { namespace net { template struct Tls {}; } class tls; /** * tls context class. * Provides tls network class which ensures the usage of tls encrypted connections */ class tls { private: class impl; own impl_; public: tls(); ~tls(); struct version { struct tls_1_0{}; struct tls_1_1{}; struct tls_1_2{}; }; struct options { public: version version; }; impl &get_impl(); private: options options_; }; template class network_address> final { private: own> internal_; public: network_address(own> internal__): internal_{std::move(internal__)} {} network_address& get_handle() { return *internal_; } }; template class network> { public: virtual ~network() = default; /** * Resolve the provided string and uint16 to the preferred storage method */ virtual conveyor>>> resolve_address(const std::string &addr, uint16_t port_hint = 0) = 0; /** * Parse the provided string and uint16 to the preferred storage method * Since no dns request is made here, no async conveyors have to be used. */ virtual error_or>>> parse_address(const std::string &addr, uint16_t port_hint = 0) = 0; /** * Set up a listener on this address */ virtual error_or>>> listen(network_address> &bind_addr, const std::string& key_file) = 0; /** * Connect to a remote address */ virtual conveyor>>> connect(network_address> &address) = 0; }; template error_or>>> setup_tls_network(network &network); } // namespace saw #include "tls.tmpl.hpp"