2#include <ossia/detail/pod_vector.hpp>
3#include <ossia/network/sockets/writers.hpp>
5#include <boost/asio/buffer.hpp>
6#include <boost/asio/error.hpp>
7#include <boost/asio/read.hpp>
8#include <boost/asio/write.hpp>
13template <
typename Socket>
14struct fixed_length_decoder
17 std::size_t frame_size{64};
18 ossia::pod_vector<char> m_data;
20 explicit fixed_length_decoder(Socket& socket)
28 m_data.resize(frame_size, boost::container::default_init);
29 boost::asio::async_read(
30 socket, boost::asio::mutable_buffer(m_data.data(), frame_size),
31 boost::asio::transfer_exactly(frame_size),
32 [
this, f = std::move(f)](boost::system::error_code ec, std::size_t sz)
mutable {
33 if(!f.validate_stream(ec))
40 f((const unsigned char*)m_data.data(), sz);
47 this->receive(std::move(f));
52template <
typename Socket>
53struct fixed_length_encoder
57 void write(
const char* data, std::size_t sz)
59 this->do_write(socket, boost::asio::buffer(data, sz));
63 void do_write(T& sock,
const boost::asio::const_buffer& buf)
65 boost::asio::write(sock, buf);
69 void do_write(multi_socket_writer<T>& sock,
const boost::asio::const_buffer& buf)
75struct fixed_length_framing
77 template <
typename Socket>
78 using encoder = fixed_length_encoder<Socket>;
79 template <
typename Socket>
80 using decoder = fixed_length_decoder<Socket>;