irccd  3.0.3
transport_server.hpp
1 /*
2  * transport_server.hpp -- server side transports
3  *
4  * Copyright (c) 2013-2019 David Demelier <markand@malikania.fr>
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef IRCCD_DAEMON_TRANSPORT_SERVER_HPP
20 #define IRCCD_DAEMON_TRANSPORT_SERVER_HPP
21 
27 #include <irccd/sysconfig.hpp>
28 
29 #include <functional>
30 #include <memory>
31 #include <unordered_set>
32 #include <type_traits>
33 
34 #include <irccd/acceptor.hpp>
35 
36 namespace irccd::daemon {
37 
38 class transport_client;
39 
128 class transport_server : public std::enable_shared_from_this<transport_server> {
129 public:
133  using client_set = std::unordered_set<std::shared_ptr<transport_client>>;
134 
138  using accept_handler = std::function<void (std::error_code, std::shared_ptr<transport_client>)>;
139 
140 private:
141  client_set clients_;
142  std::unique_ptr<acceptor> acceptor_;
143  std::string password_;
144 
145  void do_auth(std::shared_ptr<transport_client>, accept_handler);
146  void do_greetings(std::shared_ptr<transport_client>, accept_handler);
147 
148 public:
155  transport_server(std::unique_ptr<acceptor> acceptor) noexcept;
156 
162  auto get_clients() const noexcept -> const client_set&;
163 
169  auto get_clients() noexcept -> client_set&;
170 
176  auto get_password() const noexcept -> const std::string&;
177 
183  void set_password(std::string password) noexcept;
184 
194  void accept(accept_handler handler);
195 };
196 
200 class transport_error : public std::system_error {
201 public:
205  enum error {
207  no_error = 0,
208 
210  auth_required,
211 
213  invalid_auth,
214 
216  invalid_port,
217 
219  invalid_address,
220 
222  invalid_hostname,
223 
225  invalid_path,
226 
228  invalid_family,
229 
231  invalid_certificate,
232 
234  invalid_private_key,
235 
237  ssl_disabled,
238 
240  not_supported
241  };
242 
248  transport_error(error code) noexcept;
249 };
250 
256 auto transport_category() noexcept -> const std::error_category&;
257 
264 auto make_error_code(transport_error::error e) noexcept -> std::error_code;
265 
266 } // !irccd::daemon
267 
272 namespace std {
273 
274 template <>
275 struct is_error_code_enum<irccd::daemon::transport_error::error> : public std::true_type {
276 };
277 
278 } // !std
279 
284 #endif // !IRCCD_DAEMON_TRANSPORT_SERVER_HPP
irccd::daemon::transport_server::set_password
void set_password(std::string password) noexcept
irccd::daemon::transport_server::accept
void accept(accept_handler handler)
irccd::daemon::transport_error::error
error
Transport related errors.
Definition: transport_server.hpp:205
irccd::daemon::transport_server::get_clients
auto get_clients() const noexcept -> const client_set &
irccd::daemon::make_error_code
auto make_error_code(bot_error::error e) noexcept -> std::error_code
irccd::acceptor
Abstract stream acceptor interface.
Definition: acceptor.hpp:52
irccd::daemon::transport_category
auto transport_category() noexcept -> const std::error_category &
irccd::daemon::transport_error
Transport error.
Definition: transport_server.hpp:200
irccd::daemon::transport_error::transport_error
transport_error(error code) noexcept
irccd::daemon::transport_server
Abstract transport server class.
Definition: transport_server.hpp:128
irccd::daemon::transport_server::get_password
auto get_password() const noexcept -> const std::string &
irccd
Parent namespace.
Definition: acceptor.hpp:43
std
Definition: bot.hpp:253
irccd::daemon::transport_server::accept_handler
std::function< void(std::error_code, std::shared_ptr< transport_client >)> accept_handler
Definition: transport_server.hpp:138
irccd::daemon
Main irccd namespace.
Definition: bot.hpp:41
irccd::daemon::transport_server::transport_server
transport_server(std::unique_ptr< acceptor > acceptor) noexcept
irccd::daemon::transport_server::client_set
std::unordered_set< std::shared_ptr< transport_client > > client_set
Definition: transport_server.hpp:133