summaryrefslogtreecommitdiff
path: root/modules/io_codec/c++/io_peer.hpp
blob: 8ba6ee1d9b8bb083511a361ae9785adfd4f377a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#pragma once

#include <forstio/async/async.hpp>
#include <forstio/buffer.hpp>
#include <forstio/io/io.hpp>
#include <forstio/codec/data.hpp>

namespace saw {

template <typename Incoming, typename Outgoing,
		  typename Encoding,
		  typename BufferT = ring_buffer>
class streaming_io_peer {
public:
	/**
	 * Constructor with the option to provide a custom codec, in and out buffer
	 */
	streaming_io_peer(
		own<conveyor_feeder<data<Incoming, Encoding>>> feed,
		own<async_io_stream> stream, codec<Encoding> codec, BufferT in, BufferT out);

	/**
	 * Constructor
	 */
	streaming_io_peer(
		own<conveyor_feeder<data<Incoming, Encoding>>> feed,
		own<async_io_stream> stream);

	/**
	 * Deleted copy and move constructors
	 */
	SAW_FORBID_COPY(streaming_io_peer);
	SAW_FORBID_MOVE(streaming_io_peer);

	/**
	 * Send a message to the remote peer
	 */
	error_or<void> send(data<Outgoing, Encoding> builder);

	/**
	 * A phantom conveyor feeder. Meant for interfacing with other components
	 */
	conveyor_feeder<data<Outgoing, Encoding>> &feeder();

	conveyor<void> on_read_disconnected();

private:
	/// @unimplemented
	class peer_conveyor_feeder final
		: public conveyor_feeder<data<Outgoing, Encoding>> {
	public:
		peer_conveyor_feeder(
			streaming_io_peer<Incoming, Outgoing, Encoding, BufferT> &peer_)
			: peer_{peer_} {}

		void feed(data<Outgoing, Encoding> &&data_) override {
			(void)data_;
		}

		void fail(error &&err) override { (void)err; }

		size_t space() const override { return 0; }

		size_t queued() const override { return 0; }

	private:
		streaming_io_peer<Incoming, Outgoing, Encoding,
						  BufferT> &peer_;
	};

private:
	own<conveyor_feeder<data<Incoming, Encoding>>>
		incoming_feeder_ = nullptr;

	own<async_io_stream> io_stream_;

	codec<Encoding> codec_;

	BufferT in_buffer_;
	BufferT out_buffer_;

	conveyor_sink sink_read_;
	conveyor_sink sink_write_;

	peer_conveyor_feeder conveyor_feeder_;
};

/**
 * Setup new streaming io peer with the provided network protocols.
 * This is a convenience wrapper intended for a faster setup of this class
 */
template <typename Incoming, typename Outgoing,
		  typename Encoding,
		  typename BufferT = ring_buffer>
std::pair<own<streaming_io_peer<Incoming, Outgoing, Encoding, BufferT>>,
		  conveyor<data<Incoming, Encoding>>>
new_streaming_io_peer(own<async_io_stream> stream);

} // namespace saw

#include "io_peer.tmpl.hpp"