// Matrix Construct // // Copyright (C) Matrix Construct Developers, Authors & Contributors // Copyright (C) 2016-2018 Jason Volk // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice is present in all copies. The // full license for this software is available in the LICENSE file. #pragma once #define HAVE_IRCD_NET_ACCEPTOR_H // This file is not included with the IRCd standard include stack because // it requires symbols we can't forward declare without boost headers. It // is part of the stack which can be included in your // definition file if you need low level access to this acceptor API. struct ircd::net::listener::acceptor :std::enable_shared_from_this { using error_code = boost::system::error_code; static log::log log; static conf::item timeout; std::string name; size_t backlog; asio::ssl::context ssl; ip::tcp::endpoint ep; ip::tcp::acceptor a; size_t accepting {0}; size_t handshaking {0}; bool interrupting {false}; ctx::dock joining; explicit operator std::string() const; void configure(const json::object &opts); // Handshake stack void check_handshake_error(const error_code &ec, socket &); void handshake(const error_code &ec, std::shared_ptr, std::weak_ptr) noexcept; // Acceptance stack bool check_accept_error(const error_code &ec, socket &); void accept(const error_code &ec, std::shared_ptr, std::weak_ptr) noexcept; // Accept next void next(); // Acceptor shutdown bool interrupt() noexcept; void join() noexcept; acceptor(const string_view &name, const json::object &opts); ~acceptor() noexcept; };