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
Abstract stream acceptor interface.
Definition: acceptor.hpp:52
Transport error.
Definition: transport_server.hpp:200
transport_error(error code) noexcept
error
Transport related errors.
Definition: transport_server.hpp:205
Abstract transport server class.
Definition: transport_server.hpp:128
transport_server(std::unique_ptr< acceptor > acceptor) noexcept
auto get_password() const noexcept -> const std::string &
std::function< void(std::error_code, std::shared_ptr< transport_client >)> accept_handler
Definition: transport_server.hpp:138
void accept(accept_handler handler)
void set_password(std::string password) noexcept
std::unordered_set< std::shared_ptr< transport_client > > client_set
Definition: transport_server.hpp:133
auto get_clients() const noexcept -> const client_set &
Main irccd namespace.
Definition: bot.hpp:41
auto make_error_code(bot_error::error e) noexcept -> std::error_code
auto transport_category() noexcept -> const std::error_category &
Parent namespace.
Definition: acceptor.hpp:43
Definition: bot.hpp:253