1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:critical reason:network-protocol
4
5#include "qmqttcontrolpacket_p.h"
6
7#include <QtCore/QtEndian>
8#include <QtCore/QLoggingCategory>
9
10QT_BEGIN_NAMESPACE
11
12QMqttControlPacket::QMqttControlPacket()
13{
14
15}
16
17QMqttControlPacket::QMqttControlPacket(quint8 header)
18 : m_header(header)
19{
20
21}
22
23QMqttControlPacket::QMqttControlPacket(quint8 header, const QByteArray &pay)
24 : m_header(header)
25 , m_payload(pay)
26{
27
28}
29
30void QMqttControlPacket::clear()
31{
32 m_header = 0;
33 m_payload.clear();
34}
35
36void QMqttControlPacket::setHeader(quint8 h)
37{
38 if (h < QMqttControlPacket::CONNECT || h > DISCONNECT || h & 0x0F)
39 m_header = QMqttControlPacket::UNKNOWN;
40 else
41 m_header = h;
42}
43
44void QMqttControlPacket::append(char value)
45{
46 m_payload.append(c: value);
47}
48
49void QMqttControlPacket::append(quint16 value)
50{
51 const quint16 msb = qToBigEndian<quint16>(source: value);
52 const char * msb_c = reinterpret_cast<const char*>(&msb);
53 m_payload.append(s: msb_c, len: 2);
54}
55
56void QMqttControlPacket::append(quint32 value)
57{
58 const quint32 msb = qToBigEndian<quint32>(source: value);
59 const char * msb_c = reinterpret_cast<const char*>(&msb);
60 m_payload.append(s: msb_c, len: 4);
61}
62
63void QMqttControlPacket::append(const QByteArray &data)
64{
65 append(value: static_cast<quint16>(data.size()));
66 m_payload.append(a: data);
67}
68
69void QMqttControlPacket::appendRaw(const QByteArray &data)
70{
71 m_payload.append(a: data);
72}
73
74void QMqttControlPacket::appendRawVariableInteger(quint32 value)
75{
76 QByteArray data;
77 // Add length
78 if (value > 268435455)
79 qCDebug(lcMqttClient) << "Attempting to write variable integer overflow.";
80 do {
81 quint8 b = value % 128;
82 value /= 128;
83 if (value > 0)
84 b |= 0x80;
85 data.append(c: char(b));
86 } while (value > 0);
87 appendRaw(data);
88}
89
90QByteArray QMqttControlPacket::serialize() const
91{
92 // Create ByteArray
93 QByteArray data;
94 // Add Header
95 data.append(c: char(m_header));
96 data.append(a: serializePayload());
97
98 return data;
99}
100
101QByteArray QMqttControlPacket::serializePayload() const
102{
103 QByteArray data;
104 // Add length
105 quint32 msgSize = quint32(m_payload.size());
106 if (msgSize > 268435455)
107 qCDebug(lcMqttClient) << "Publishing a message bigger than maximum size.";
108 do {
109 quint8 b = msgSize % 128;
110 msgSize /= 128;
111 if (msgSize > 0)
112 b |= 0x80;
113 data.append(c: char(b));
114 } while (msgSize > 0);
115 // Add payload
116 data.append(a: m_payload);
117 return data;
118}
119
120QT_END_NAMESPACE
121
122

source code of qtmqtt/src/mqtt/qmqttcontrolpacket.cpp