#pragma once #include #include #include #include namespace saw { template class streaming_io_peer { public: /** * Constructor with the option to provide a custom codec, in and out buffer */ streaming_io_peer( own>> feed, own stream, codec codec, BufferT in, BufferT out); /** * Constructor */ streaming_io_peer( own>> feed, own 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 send(data builder); /** * A phantom conveyor feeder. Meant for interfacing with other components */ conveyor_feeder> &feeder(); conveyor on_read_disconnected(); private: /// @unimplemented class peer_conveyor_feeder final : public conveyor_feeder> { public: peer_conveyor_feeder( streaming_io_peer &peer_) : peer_{peer_} {} void feed(data &&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 &peer_; }; private: own>> incoming_feeder_ = nullptr; own io_stream_; codec 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 std::pair>, conveyor>> new_streaming_io_peer(own stream); } // namespace saw #include "io_peer.tmpl.hpp"