15 if (offset > len || needed > len - offset)
17 throw std::runtime_error(
"screen message buffer underflow");
21 inline void append_u32(std::vector<std::uint8_t>& out, std::uint32_t value)
23 out.push_back(
static_cast<std::uint8_t
>((value >> 24) & 0xFFu));
24 out.push_back(
static_cast<std::uint8_t
>((value >> 16) & 0xFFu));
25 out.push_back(
static_cast<std::uint8_t
>((value >> 8) & 0xFFu));
26 out.push_back(
static_cast<std::uint8_t
>(value & 0xFFu));
29 inline void append_i64(std::vector<std::uint8_t>& out, std::int64_t value)
31 const auto raw =
static_cast<std::uint64_t
>(value);
32 for (
int shift = 56; shift >= 0; shift -= 8)
34 out.push_back(
static_cast<std::uint8_t
>((raw >> shift) & 0xFFu));
38 inline std::uint32_t
read_u32(
const std::uint8_t* data, std::size_t len, std::size_t& offset)
41 const auto value = (
static_cast<std::uint32_t
>(data[offset]) << 24)
42 | (
static_cast<std::uint32_t
>(data[offset + 1]) << 16)
43 | (
static_cast<std::uint32_t
>(data[offset + 2]) << 8)
44 |
static_cast<std::uint32_t
>(data[offset + 3]);
49 inline std::int64_t
read_i64(
const std::uint8_t* data, std::size_t len, std::size_t& offset)
52 std::uint64_t raw = 0;
53 for (
int i = 0; i < 8; ++i)
55 raw = (raw << 8) | static_cast<std::uint64_t>(data[offset + i]);
58 return static_cast<std::int64_t
>(raw);
61 inline void append_string(std::vector<std::uint8_t>& out,
const std::string& value)
63 if (value.size() > 0xFFFFFFFFu)
65 throw std::runtime_error(
"screen message string too large");
67 append_u32(out,
static_cast<std::uint32_t
>(value.size()));
68 out.insert(out.end(), value.begin(), value.end());
72 const std::uint8_t* data, std::size_t len, std::size_t& offset)
74 const auto size =
read_u32(data, len, offset);
77 reinterpret_cast<const char*
>(data + offset),
78 reinterpret_cast<const char*
>(data + offset + size));
90 void encode(std::vector<std::uint8_t>& out)
const
99 std::size_t offset = 0;
106 throw std::runtime_error(
"trailing bytes after ScreenRender payload");
119 void encode(std::vector<std::uint8_t>& out)
const
129 std::size_t offset = 0;
137 throw std::runtime_error(
"trailing bytes after ScreenRenderAnswer payload");
void append_string(std::vector< std::uint8_t > &out, const std::string &value)
std::int64_t read_i64(const std::uint8_t *data, std::size_t len, std::size_t &offset)
std::uint32_t read_u32(const std::uint8_t *data, std::size_t len, std::size_t &offset)
void append_u32(std::vector< std::uint8_t > &out, std::uint32_t value)
void require_available(std::size_t offset, std::size_t needed, std::size_t len)
std::string read_string(const std::uint8_t *data, std::size_t len, std::size_t &offset)
void append_i64(std::vector< std::uint8_t > &out, std::int64_t value)
void encode(std::vector< std::uint8_t > &out) const
static ScreenRenderAnswer decode(const std::uint8_t *data, std::size_t len)
void encode(std::vector< std::uint8_t > &out) const
static ScreenRender decode(const std::uint8_t *data, std::size_t len)