in source/core_mqtt_serializer.c [2278:2351]
MQTTStatus_t MQTT_DeserializeAck( const MQTTPacketInfo_t * pIncomingPacket,
uint16_t * pPacketId,
bool * pSessionPresent )
{
MQTTStatus_t status = MQTTSuccess;
if( pIncomingPacket == NULL )
{
LogError( ( "pIncomingPacket cannot be NULL." ) );
status = MQTTBadParameter;
}
/* Pointer for packet identifier cannot be NULL for packets other than
* CONNACK and PINGRESP. */
else if( ( pPacketId == NULL ) &&
( ( pIncomingPacket->type != MQTT_PACKET_TYPE_CONNACK ) &&
( pIncomingPacket->type != MQTT_PACKET_TYPE_PINGRESP ) ) )
{
LogError( ( "pPacketId cannot be NULL for packet type %02x.",
( unsigned int ) pIncomingPacket->type ) );
status = MQTTBadParameter;
}
/* Pointer for session present cannot be NULL for CONNACK. */
else if( ( pSessionPresent == NULL ) &&
( pIncomingPacket->type == MQTT_PACKET_TYPE_CONNACK ) )
{
LogError( ( "pSessionPresent cannot be NULL for CONNACK packet." ) );
status = MQTTBadParameter;
}
/* Pointer for remaining data cannot be NULL for packets other
* than PINGRESP. */
else if( ( pIncomingPacket->pRemainingData == NULL ) &&
( pIncomingPacket->type != MQTT_PACKET_TYPE_PINGRESP ) )
{
LogError( ( "Remaining data of incoming packet is NULL." ) );
status = MQTTBadParameter;
}
else
{
/* Make sure response packet is a valid ack. */
switch( pIncomingPacket->type )
{
case MQTT_PACKET_TYPE_CONNACK:
status = deserializeConnack( pIncomingPacket, pSessionPresent );
break;
case MQTT_PACKET_TYPE_SUBACK:
status = deserializeSuback( pIncomingPacket, pPacketId );
break;
case MQTT_PACKET_TYPE_PINGRESP:
status = deserializePingresp( pIncomingPacket );
break;
case MQTT_PACKET_TYPE_UNSUBACK:
case MQTT_PACKET_TYPE_PUBACK:
case MQTT_PACKET_TYPE_PUBREC:
case MQTT_PACKET_TYPE_PUBREL:
case MQTT_PACKET_TYPE_PUBCOMP:
status = deserializeSimpleAck( pIncomingPacket, pPacketId );
break;
/* Any other packet type is invalid. */
default:
LogError( ( "IotMqtt_DeserializeResponse() called with unknown packet type:(%02x).",
( unsigned int ) pIncomingPacket->type ) );
status = MQTTBadResponse;
break;
}
}
return status;
}