Line data Source code
1 : #ifndef THINGER_ASIO_UNIX_SOCKET_HPP
2 : #define THINGER_ASIO_UNIX_SOCKET_HPP
3 :
4 : #include "socket.hpp"
5 : #include <boost/asio/local/stream_protocol.hpp>
6 : #include <boost/asio/steady_timer.hpp>
7 : #include <string_view>
8 :
9 : namespace thinger::asio {
10 :
11 : class unix_socket : public socket {
12 :
13 : public:
14 : // constructors and destructors
15 : unix_socket(const std::string &context, boost::asio::io_context &io_context);
16 : unix_socket(const std::string &context, boost::asio::local::stream_protocol::socket&& socket);
17 : ~unix_socket() override;
18 :
19 : // socket control
20 : awaitable<boost::system::error_code> connect(
21 : const std::string &host,
22 : const std::string &port,
23 : std::chrono::seconds timeout) override;
24 : awaitable<boost::system::error_code> connect(const std::string &path, std::chrono::seconds timeout);
25 : void close() override;
26 : void cancel() override;
27 : // Stop sending, reading on: the half-close of a graceful close. False if it failed
28 : bool shutdown_send();
29 :
30 : // read operations
31 : awaitable<io_result> read_some(uint8_t buffer[], size_t max_size) override;
32 : awaitable<io_result> read_some_cancellable(uint8_t buffer[], size_t max_size,
33 : boost::asio::cancellation_slot slot) override;
34 : awaitable<io_result> read(uint8_t buffer[], size_t size) override;
35 : awaitable<io_result> read(boost::asio::streambuf &buffer, size_t size) override;
36 : awaitable<io_result> read_until(boost::asio::streambuf &buffer, std::string_view delim) override;
37 :
38 : // write operations
39 : awaitable<io_result> write(const uint8_t buffer[], size_t size) override;
40 : awaitable<io_result> write(std::string_view str) override;
41 : awaitable<io_result> write(const std::vector<boost::asio::const_buffer> &buffers) override;
42 12176 : size_t write_now(const std::vector<boost::asio::const_buffer> &buffers, boost::system::error_code &ec) override {
43 12176 : return send_now(socket_.native_handle(), buffers, ec);
44 : }
45 :
46 : // wait
47 : awaitable<boost::system::error_code> wait(boost::asio::socket_base::wait_type type) override;
48 : awaitable<boost::system::error_code> peer_closed() override;
49 :
50 : // some getters to check the state
51 : bool is_open() const override;
52 : bool is_secure() const override;
53 : size_t available() const override;
54 : size_t send_backlog() const override;
55 : bool readable_now() const override;
56 : std::string get_remote_ip() const override;
57 : std::string get_local_port() const override;
58 : std::string get_remote_port() const override;
59 :
60 : private:
61 : boost::asio::local::stream_protocol::socket socket_;
62 : };
63 :
64 : }
65 :
66 : #endif
|