in source/core_mqtt_state.c [854:924]
MQTTStatus_t MQTT_UpdateStatePublish( MQTTContext_t * pMqttContext,
uint16_t packetId,
MQTTStateOperation_t opType,
MQTTQoS_t qos,
MQTTPublishState_t * pNewState )
{
MQTTPublishState_t newState = MQTTStateNull;
MQTTPublishState_t currentState = MQTTStateNull;
MQTTStatus_t mqttStatus = MQTTSuccess;
size_t recordIndex = MQTT_STATE_ARRAY_MAX_COUNT;
MQTTQoS_t foundQoS = MQTTQoS0;
if( ( pMqttContext == NULL ) || ( pNewState == NULL ) )
{
LogError( ( "Argument cannot be NULL: pMqttContext=%p, pNewState=%p",
( void * ) pMqttContext,
( void * ) pNewState ) );
mqttStatus = MQTTBadParameter;
}
else if( qos == MQTTQoS0 )
{
/* QoS 0 publish. Do nothing. */
*pNewState = MQTTPublishDone;
}
else if( packetId == MQTT_PACKET_ID_INVALID )
{
/* Publishes > QoS 0 need a valid packet ID. */
mqttStatus = MQTTBadParameter;
}
else if( opType == MQTT_SEND )
{
/* Search record for entry so we can check QoS. */
recordIndex = findInRecord( pMqttContext->outgoingPublishRecords,
MQTT_STATE_ARRAY_MAX_COUNT,
packetId,
&foundQoS,
¤tState );
if( ( recordIndex == MQTT_STATE_ARRAY_MAX_COUNT ) || ( foundQoS != qos ) )
{
/* Entry should match with supplied QoS. */
mqttStatus = MQTTBadParameter;
}
}
else
{
/* QoS 1 or 2 receive. Nothing to be done. */
}
if( ( qos != MQTTQoS0 ) && ( mqttStatus == MQTTSuccess ) )
{
newState = MQTT_CalculateStatePublish( opType, qos );
/* Validate state transition and update state records. */
mqttStatus = updateStatePublish( pMqttContext,
recordIndex,
packetId,
opType,
qos,
currentState,
newState );
/* Update output parameter on success. */
if( mqttStatus == MQTTSuccess )
{
*pNewState = newState;
}
}
return mqttStatus;
}