diff --git a/mqttpacket.cpp b/mqttpacket.cpp index 635dd5f..c11cb99 100644 --- a/mqttpacket.cpp +++ b/mqttpacket.cpp @@ -63,6 +63,11 @@ MqttPacket::MqttPacket(const SubAck &subAck) : first_byte = static_cast(packetType) << 4; writeUint16(subAck.packet_id); + if (subAck.protocol_version >= ProtocolVersion::Mqtt5) + { + writeProperties(subAck.propertyBuilder); + } + std::vector returnList; for (SubAckReturnCodes code : subAck.responses) { @@ -665,7 +670,7 @@ void MqttPacket::handleSubscribe() throw ProtocolError("No topics specified to subscribe to."); } - SubAck subAck(packet_id, subs_reponse_codes); + SubAck subAck(this->protocolVersion, packet_id, subs_reponse_codes); MqttPacket response(subAck); sender->writeMqttPacket(response); } diff --git a/types.cpp b/types.cpp index b4ea0a0..0b46019 100644 --- a/types.cpp +++ b/types.cpp @@ -82,7 +82,8 @@ size_t ConnAck::getLengthWithoutFixedHeader() const return result; } -SubAck::SubAck(uint16_t packet_id, const std::list &subs_qos_reponses) : +SubAck::SubAck(const ProtocolVersion protVersion, uint16_t packet_id, const std::list &subs_qos_reponses) : + protocol_version(protVersion), packet_id(packet_id) { assert(!subs_qos_reponses.empty()); @@ -97,6 +98,12 @@ size_t SubAck::getLengthWithoutFixedHeader() const { size_t result = responses.size(); result += 2; // Packet ID + + if (this->protocol_version >= ProtocolVersion::Mqtt5) + { + const size_t proplen = propertyBuilder ? propertyBuilder->getLength() : 1; + result += proplen; + } return result; } diff --git a/types.h b/types.h index 6875c55..4cf71ac 100644 --- a/types.h +++ b/types.h @@ -175,9 +175,12 @@ enum class SubAckReturnCodes class SubAck { public: + const ProtocolVersion protocol_version; uint16_t packet_id; std::list responses; - SubAck(uint16_t packet_id, const std::list &subs_qos_reponses); + std::shared_ptr propertyBuilder; + + SubAck(const ProtocolVersion protVersion, uint16_t packet_id, const std::list &subs_qos_reponses); size_t getLengthWithoutFixedHeader() const; };