forstio/source/forstio/io_peer.h

105 lines
2.6 KiB
C++

#pragma once
#include "async.h"
#include "buffer.h"
#include "io.h"
#include "message.h"
namespace saw {
template <typename Codec, typename Incoming, typename Outgoing,
typename InContainer = message_container<Incoming>,
typename OutContainer = message_container<Outgoing>,
typename BufferT = ring_buffer>
class streaming_io_peer {
public:
/**
*
*/
streaming_io_peer(
own<conveyor_feeder<HeapMessageRoot<Incoming, InContainer>>> feed,
own<async_io_stream> stream, Codec codec, BufferT in, BufferT out);
/**
*
*/
streaming_io_peer(
own<conveyor_feeder<HeapMessageRoot<Incoming, InContainer>>> 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 send(HeapMessageRoot<Outgoing, OutContainer> builder);
/**
* A phantom conveyor feeder. Meant for interfacing with other components
*/
conveyor_feeder<HeapMessageRoot<Outgoing, OutContainer>> &feeder();
conveyor<void> on_read_disconnected();
private:
/// @unimplemented
class peer_conveyor_feeder final
: public conveyor_feeder<HeapMessageRoot<Outgoing, OutContainer>> {
public:
peer_conveyor_feeder(
streaming_io_peer<Codec, Incoming, Outgoing, InContainer,
OutContainer, BufferT> &peer_)
: peer_{peer_} {}
void feed(HeapMessageRoot<Outgoing, OutContainer> &&data) override {
(void)data;
}
void fail(error &&error) override { (void)error; }
size_t space() const override { return 0; }
size_t queued() const override { return 0; }
private:
streaming_io_peer<Codec, Incoming, Outgoing, InContainer, OutContainer,
BufferT> &peer_;
};
private:
own<conveyor_feeder<HeapMessageRoot<Incoming, InContainer>>>
incoming_feeder_ = nullptr;
own<async_io_stream> 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 <typename Codec, typename Incoming, typename Outgoing,
typename InContainer = message_container<Incoming>,
typename OutContainer = message_container<Outgoing>,
typename BufferT = ring_buffer>
std::pair<own<streaming_io_peer<Codec, Incoming, Outgoing, InContainer,
OutContainer, BufferT>>,
conveyor<HeapMessageRoot<Incoming, InContainer>>>
newStreamingIoPeer(own<async_io_stream> stream);
} // namespace saw
#include "io_peer.tmpl.h"