in src/mqtt_client.c [1138:1200]
int mqtt_client_publish(MQTT_CLIENT_HANDLE handle, MQTT_MESSAGE_HANDLE msgHandle)
{
int result;
MQTT_CLIENT* mqtt_client = (MQTT_CLIENT*)handle;
if (mqtt_client == NULL || msgHandle == NULL)
{
/*Codes_SRS_MQTT_CLIENT_07_019: [If one of the parameters handle or msgHandle is NULL then mqtt_client_publish shall return a non-zero value.]*/
LogError("Invalid parameter specified mqtt_client: %p, msgHandle: %p", mqtt_client, msgHandle);
result = MU_FAILURE;
}
else
{
/*Codes_SRS_MQTT_CLIENT_07_021: [mqtt_client_publish shall get the message information from the MQTT_MESSAGE_HANDLE.]*/
const APP_PAYLOAD* payload = mqttmessage_getApplicationMsg(msgHandle);
if (payload == NULL)
{
/*Codes_SRS_MQTT_CLIENT_07_020: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.]*/
LogError("Error: mqttmessage_getApplicationMsg failed");
result = MU_FAILURE;
}
else
{
STRING_HANDLE trace_log = construct_trace_log_handle(mqtt_client);
QOS_VALUE qos = mqttmessage_getQosType(msgHandle);
bool isDuplicate = mqttmessage_getIsDuplicateMsg(msgHandle);
bool isRetained = mqttmessage_getIsRetained(msgHandle);
uint16_t packetId = mqttmessage_getPacketId(msgHandle);
const char* topicName = mqttmessage_getTopicName(msgHandle);
BUFFER_HANDLE publishPacket = mqtt_codec_publish(qos, isDuplicate, isRetained, packetId, topicName, payload->message, payload->length, trace_log);
if (publishPacket == NULL)
{
/*Codes_SRS_MQTT_CLIENT_07_020: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.]*/
LogError("Error: mqtt_codec_publish failed");
result = MU_FAILURE;
}
else
{
mqtt_client->packetState = PUBLISH_TYPE;
/*Codes_SRS_MQTT_CLIENT_07_022: [On success mqtt_client_publish shall send the MQTT SUBCRIBE packet to the endpoint.]*/
size_t size = BUFFER_length(publishPacket);
if (sendPacketItem(mqtt_client, BUFFER_u_char(publishPacket), size) != 0)
{
/*Codes_SRS_MQTT_CLIENT_07_020: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.]*/
LogError("Error: mqtt_client_publish send failed");
result = MU_FAILURE;
}
else
{
log_outgoing_trace(mqtt_client, trace_log);
result = 0;
}
BUFFER_delete(publishPacket);
}
if (trace_log != NULL)
{
STRING_delete(trace_log);
}
}
}
return result;
}