SNode.C
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
FixedHeader.cpp
Go to the documentation of this file.
1/*
2 * SNode.C - A Slim Toolkit for Network Communication
3 * Copyright (C) Volker Christian <me@vchrist.at>
4 * 2020, 2021, 2022, 2023, 2024, 2025
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20/*
21 * MIT License
22 *
23 * Permission is hereby granted, free of charge, to any person obtaining a copy
24 * of this software and associated documentation files (the "Software"), to deal
25 * in the Software without restriction, including without limitation the rights
26 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
27 * copies of the Software, and to permit persons to whom the Software is
28 * furnished to do so, subject to the following conditions:
29 *
30 * The above copyright notice and this permission notice shall be included in
31 * all copies or substantial portions of the Software.
32 *
33 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
39 * THE SOFTWARE.
40 */
41
42#include "iot/mqtt/FixedHeader.h"
43
44#ifndef DOXYGEN_SHOULD_SKIP_THIS
45
46#endif // DOXYGEN_SHOULD_SKIP_THIS
47
48namespace iot::mqtt {
49
52
53 FixedHeader::FixedHeader(uint8_t type, uint8_t flags, uint32_t remainingLength) {
54 this->typeFlags = static_cast<uint8_t>((type << 4) | (flags & 0x0F));
55 this->remainingLength = remainingLength;
56 }
57
60
61 std::size_t FixedHeader::deserialize(MqttContext* mqttContext) {
62 std::size_t consumed = 0;
63
64 switch (state) {
65 case 0:
66 consumed += typeFlags.deserialize(mqttContext);
67
68 if (!typeFlags.isComplete()) {
69 break;
70 }
71 state++;
72 [[fallthrough]];
73 case 1:
74 consumed += remainingLength.deserialize(mqttContext);
75
76 complete = remainingLength.isComplete();
77 error = remainingLength.isError();
78
79 break;
80 }
81
82 return consumed;
83 }
84
85 uint8_t FixedHeader::getType() const {
86 return static_cast<uint8_t>(typeFlags >> 0x04);
87 }
88
89 uint8_t FixedHeader::getFlags() const {
90 return static_cast<uint8_t>(typeFlags & 0x0F);
91 }
92
93 void FixedHeader::setRemainingLength(uint32_t remainingLength) {
94 this->remainingLength = remainingLength;
95 }
96
97 uint32_t FixedHeader::getRemainingLength() const {
98 return remainingLength;
99 }
100
101 bool FixedHeader::isComplete() const {
102 return complete;
103 }
104
105 bool FixedHeader::isError() const {
106 return error;
107 }
108
109 std::vector<char> FixedHeader::serialize() const {
110 std::vector<char> packet = typeFlags.serialize();
111
112 std::vector<char> tmpVector = remainingLength.serialize();
113 packet.insert(packet.end(), tmpVector.begin(), tmpVector.end());
114
115 return packet;
116 }
117
119 typeFlags.reset();
120 remainingLength.reset();
121
122 complete = false;
123 error = false;
124
125 state = 0;
126 }
127
128} // namespace iot::mqtt
uint8_t getType() const
FixedHeader(uint8_t type, uint8_t flags, uint32_t remainingLength=0)
uint32_t getRemainingLength() const
uint8_t getFlags() const
void setRemainingLength(uint32_t remainingLength)
std::vector< char > serialize() const
std::size_t deserialize(iot::mqtt::MqttContext *mqttContext)