ResponseCode PacketFixedHeader::Initialize()

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;
        }