OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
no_framing.hpp
1#pragma once
2#include <ossia/network/sockets/writers.hpp>
3
4#include <boost/asio/buffer.hpp>
5#include <boost/asio/error.hpp>
6#include <boost/asio/write.hpp>
7
8namespace ossia::net
9{
10
11struct no_framing
12{
13 template <typename Socket>
14 struct encoder
15 {
16 Socket& socket;
17 void write(const char* data, std::size_t sz)
18 {
19 this->write(socket, boost::asio::buffer(data, sz));
20 }
21
22 template <typename T>
23 void write(T& sock, const boost::asio::const_buffer& buf)
24 {
25 boost::asio::write(sock, buf);
26 }
27
28 template <typename T>
29 void write(multi_socket_writer<T>& sock, const boost::asio::const_buffer& buf)
30 {
31 sock.write(buf);
32 }
33 };
34
35 template <typename Socket>
36 struct decoder
37 {
38 Socket& socket;
39 alignas(64) uint8_t m_readbuf[4096];
40 lifetime_token m_lifetime;
41
42 explicit decoder(Socket& s)
43 : socket{s}
44 {
45 }
46
47 decoder() = delete;
48 decoder(const decoder&) = delete;
49 decoder(decoder&&) = delete;
50 decoder& operator=(const decoder&) = delete;
51 decoder& operator=(decoder&&) = delete;
52
53 template <typename F>
54 void receive(F f)
55 {
56 socket.async_read_some(
57 boost::asio::buffer(m_readbuf),
58 [this, alive = m_lifetime.watch(),
59 f = std::move(f)](boost::system::error_code ec, std::size_t sz) mutable {
60 // The socket may be gone since this read was armed; see lifetime_token.
61 if(alive.expired())
62 return;
63
64 if(!f.validate_stream(ec))
65 return;
66
67 f(m_readbuf, sz);
68 receive(std::move(f));
69 });
70 }
71 };
72};
73
74}