Packet.h
2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* Copyright (c) TrueBrain
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <cstdint>
#include <vector>
class Packet
{
public:
enum class PacketType
{
CONNECT = 1,
CONNACK = 2,
PUBLISH = 3,
PUBACK = 4,
PUBREC = 5,
PUBREL = 6,
PUBCOMP = 7,
SUBSCRIBE = 8,
SUBACK = 9,
UNSUBSCRIBE = 10,
UNSUBACK = 11,
PINGREQ = 12,
PINGRESP = 13,
DISCONNECT = 14,
};
Packet(PacketType packet_type, uint8_t flags)
: m_packet_type(packet_type),
m_flags(flags)
{
// Reserve space for the header.
m_buffer.push_back(0); // Packet type and flags.
m_buffer.push_back(0); // Remaining length (at most 4 bytes).
m_buffer.push_back(0);
m_buffer.push_back(0);
m_buffer.push_back(0);
}
Packet(PacketType packet_type, uint8_t flags, std::vector<uint8_t> data)
: m_buffer(std::move(data)),
m_packet_type(packet_type),
m_flags(flags)
{
}
void write_uint8(uint8_t value)
{
m_buffer.push_back(value);
}
void write_uint16(uint16_t value)
{
m_buffer.push_back(value >> 8);
m_buffer.push_back(value & 0xFF);
}
void write(const char *data, size_t length)
{
m_buffer.insert(m_buffer.end(), data, data + length);
}
void write_string(const std::string_view str)
{
write_uint16(static_cast<uint16_t>(str.size()));
write(str.data(), str.size());
}
bool read_uint8(uint8_t &value)
{
if (m_buffer.size() < m_read_offset + 1)
{
return false;
}
value = m_buffer[m_read_offset++];
return true;
}
bool read_uint16(uint16_t &value)
{
if (m_buffer.size() < m_read_offset + 2)
{
return false;
}
value = m_buffer[m_read_offset++] << 8;
value |= m_buffer[m_read_offset++];
return true;
}
bool read_string(std::string_view &str)
{
uint16_t length;
if (!read_uint16(length))
{
return false;
}
if (m_buffer.size() < m_read_offset + length)
{
return false;
}
str = std::string_view(reinterpret_cast<const char *>(m_buffer.data() + m_read_offset), length);
m_read_offset += length;
return true;
}
void read_remaining(std::string_view &str)
{
str = std::string_view(reinterpret_cast<const char *>(m_buffer.data() + m_read_offset), m_buffer.size() - m_read_offset);
m_read_offset = m_buffer.size();
}
std::vector<uint8_t> m_buffer;
size_t m_read_offset = 0;
size_t m_write_offset = 0;
PacketType m_packet_type;
uint8_t m_flags;
};