in src/mqtt/Packet.cpp [72:150]
ResponseCode PacketFixedHeader::Initialize(MessageTypes message_type, bool is_duplicate, QoS qos,
bool is_retained, size_t rem_len) {
if (MAX_MQTT_PACKET_REM_LEN_BYTES < rem_len) {
return ResponseCode::FAILURE;
}
this->is_valid_ = true;
this->remaining_length_ = rem_len;
this->message_type_ = message_type;
// Set all bits to zero
fixed_header_byte_ = 0;
switch (message_type) {
case MessageTypes::CONNECT:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_CONNECT;
break;
case MessageTypes::CONNACK:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_CONNACK;
break;
case MessageTypes::PUBLISH:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_PUBLISH;
switch (qos) {
case QoS::QOS0:
fixed_header_byte_ |= 0x00;
break;
case QoS::QOS1:
fixed_header_byte_ |= 0x02;
break;
// Strongly typed enum, no default required
}
fixed_header_byte_ |= (is_duplicate ? 0x08 : 0x00);
fixed_header_byte_ |= (is_retained ? 0x01 : 0x00);
break;
case MessageTypes::PUBACK:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_PUBACK;
break;
case MessageTypes::PUBREC:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_PUBREC;
break;
case MessageTypes::PUBREL:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_PUBREL;
break;
case MessageTypes::PUBCOMP:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_PUBCOMP;
break;
case MessageTypes::SUBSCRIBE:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_SUBSCRIBE;
break;
case MessageTypes::SUBACK:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_SUBACK;
break;
case MessageTypes::UNSUBSCRIBE:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_UNSUBSCRIBE;
break;
case MessageTypes::UNSUBACK:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_UNSUBACK;
break;
case MessageTypes::PINGREQ:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_PINGREQ;
break;
case MessageTypes::PINGRESP:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_PINGRESP;
break;
case MessageTypes::DISCONNECT:
fixed_header_byte_ = MQTT_FIXED_HEADER_BYTE_DISCONNECT;
break;
default:
// Possible invalid packet type values while packet serialization/deserialization are 0000 and 1111
is_valid_ = false;
}
if (!is_valid_) {
return ResponseCode::FAILURE;
}
return ResponseCode::SUCCESS;
}