static void SendMessageAck()

in src/mqtt_client.c [640:688]


static void SendMessageAck(MQTT_CLIENT* mqtt_client, uint16_t packetId, QOS_VALUE qosValue)
{
    CONTROL_PACKET_TYPE response_packet_type = UNKNOWN_TYPE;
    BUFFER_HANDLE pubRel = NULL;
    if (qosValue == DELIVER_EXACTLY_ONCE)
    {
        pubRel = mqtt_codec_publishReceived(packetId);
        if (pubRel == NULL)
        {
            LogError("Failed to allocate publish receive message.");
            set_error_callback(mqtt_client, MQTT_CLIENT_MEMORY_ERROR);
        }

        response_packet_type = PUBREC_TYPE;
    }
    else if (qosValue == DELIVER_AT_LEAST_ONCE)
    {
        pubRel = mqtt_codec_publishAck(packetId);
        if (pubRel == NULL)
        {
            LogError("Failed to allocate publish ack message.");
            set_error_callback(mqtt_client, MQTT_CLIENT_MEMORY_ERROR);
        }

        response_packet_type = PUBACK_TYPE;
    }

    if (pubRel != NULL)
    {
        size_t size = BUFFER_length(pubRel);
        if (sendPacketItem(mqtt_client, BUFFER_u_char(pubRel), size) != 0)
        {
            LogError("Failed sending publish reply.");
            set_error_callback(mqtt_client, MQTT_CLIENT_COMMUNICATION_ERROR);
        }
#ifndef NO_LOGGING
        else if (is_trace_enabled(mqtt_client))
        {
            STRING_HANDLE ack_trace_log = STRING_construct_sprintf("%s | PACKET_ID: %"PRIu16, 
                response_packet_type == PUBACK_TYPE ? "PUBACK" : ((response_packet_type == PUBREC_TYPE) ? "PUBREC" : "UNDEFINED"),
                packetId);

            log_outgoing_trace(mqtt_client, ack_trace_log);
            STRING_delete(ack_trace_log);
        }
#endif
        BUFFER_delete(pubRel);
    }
}