Commit 483db298a840ce6c2061d5d94a3d2f3f20eae2dd

Authored by Wiebe Cazemier
1 parent 5fb96542

Separate QoS 2 parsing and handling

mqttpacket.cpp
... ... @@ -1223,21 +1223,29 @@ void MqttPacket::handlePubAck()
1223 1223 sender->getSession()->clearQosMessage(packet_id, true);
1224 1224 }
1225 1225  
1226   -/**
1227   - * @brief MqttPacket::handlePubRec handles QoS 2 'publish received' packets. The publisher receives these.
1228   - */
1229   -void MqttPacket::handlePubRec()
  1226 +PubRecData MqttPacket::parsePubRecData()
1230 1227 {
1231   - const uint16_t packet_id = readTwoBytesToUInt16();
1232   -
1233   - ReasonCodes reasonCode = ReasonCodes::Success; // Default when not specified, or MQTT3
  1228 + setPosToDataStart();
  1229 + this->publishData.qos = 2;
  1230 + this->packet_id = readTwoBytesToUInt16();
  1231 + PubRecData result;
1234 1232  
1235 1233 if (!atEnd())
1236 1234 {
1237   - reasonCode = static_cast<ReasonCodes>(readByte());
  1235 + result.reasonCode = static_cast<ReasonCodes>(readByte());
1238 1236 }
1239 1237  
1240   - const bool publishTerminatesHere = reasonCode >= ReasonCodes::UnspecifiedError;
  1238 + return result;
  1239 +}
  1240 +
  1241 +/**
  1242 + * @brief MqttPacket::handlePubRec handles QoS 2 'publish received' packets. The publisher receives these.
  1243 + */
  1244 +void MqttPacket::handlePubRec()
  1245 +{
  1246 + PubRecData data = parsePubRecData();
  1247 +
  1248 + const bool publishTerminatesHere = data.reasonCode >= ReasonCodes::UnspecifiedError;
1241 1249 const bool foundAndRemoved = sender->getSession()->clearQosMessage(packet_id, publishTerminatesHere);
1242 1250  
1243 1251 // "If it has sent a PUBREC with a Reason Code of 0x80 or greater, the receiver MUST treat any subsequent PUBLISH packet
... ... @@ -1254,16 +1262,24 @@ void MqttPacket::handlePubRec()
1254 1262 }
1255 1263 }
1256 1264  
  1265 +void MqttPacket::parsePubRelData()
  1266 +{
  1267 + // MQTT-3.6.1-1, but why do we care, and only care for certain control packets?
  1268 + if (first_byte & 0b1101)
  1269 + throw ProtocolError("PUBREL first byte LSB must be 0010.", ReasonCodes::MalformedPacket);
  1270 +
  1271 + setPosToDataStart();
  1272 + this->publishData.qos = 2;
  1273 + this->packet_id = readTwoBytesToUInt16();
  1274 +}
  1275 +
1257 1276 /**
1258 1277 * @brief MqttPacket::handlePubRel handles QoS 2 'publish release'. The publisher sends these.
1259 1278 */
1260 1279 void MqttPacket::handlePubRel()
1261 1280 {
1262   - // MQTT-3.6.1-1, but why do we care, and only care for certain control packets?
1263   - if (first_byte & 0b1101)
1264   - throw ProtocolError("PUBREL first byte LSB must be 0010.", ReasonCodes::MalformedPacket);
  1281 + parsePubRelData();
1265 1282  
1266   - const uint16_t packet_id = readTwoBytesToUInt16();
1267 1283 const bool foundAndRemoved = sender->getSession()->removeIncomingQoS2MessageId(packet_id);
1268 1284 const ReasonCodes reason = foundAndRemoved ? ReasonCodes::Success : ReasonCodes::PacketIdentifierNotFound;
1269 1285  
... ... @@ -1272,12 +1288,19 @@ void MqttPacket::handlePubRel()
1272 1288 sender->writeMqttPacket(response);
1273 1289 }
1274 1290  
  1291 +void MqttPacket::parsePubComp()
  1292 +{
  1293 + setPosToDataStart();
  1294 + this->publishData.qos = 2;
  1295 + this->packet_id = readTwoBytesToUInt16();
  1296 +}
  1297 +
1275 1298 /**
1276 1299 * @brief MqttPacket::handlePubComp handles QoS 2 'publish complete'. The publisher receives these.
1277 1300 */
1278 1301 void MqttPacket::handlePubComp()
1279 1302 {
1280   - const uint16_t packet_id = readTwoBytesToUInt16();
  1303 + parsePubComp();
1281 1304 sender->getSession()->removeOutgoingQoS2MessageId(packet_id);
1282 1305 }
1283 1306  
... ...
mqttpacket.h
... ... @@ -122,8 +122,11 @@ public:
122 122 void handlePublish();
123 123 void parsePubAckData();
124 124 void handlePubAck();
  125 + PubRecData parsePubRecData();
125 126 void handlePubRec();
  127 + void parsePubRelData();
126 128 void handlePubRel();
  129 + void parsePubComp();
127 130 void handlePubComp();
128 131 SubAckData parseSubAckData();
129 132  
... ...
packetdatatypes.h
... ... @@ -54,10 +54,9 @@ struct SubAckData
54 54 std::vector<uint8_t> subAckCodes;
55 55 };
56 56  
57   -struct PubAckData
  57 +struct PubRecData
58 58 {
59   - uint16_t packet_id;
  59 + ReasonCodes reasonCode = ReasonCodes::Success; // Default when not specified, or MQTT3;
60 60 };
61 61  
62   -
63 62 #endif // PACKETDATATYPES_H
... ...