in src/mqtt_client.c [1317:1379]
int mqtt_client_disconnect(MQTT_CLIENT_HANDLE handle, ON_MQTT_DISCONNECTED_CALLBACK callback, void* ctx)
{
int result;
MQTT_CLIENT* mqtt_client = (MQTT_CLIENT*)handle;
if (mqtt_client == NULL)
{
/*Codes_SRS_MQTT_CLIENT_07_010: [If the parameters handle is NULL then mqtt_client_disconnect shall return a non-zero value.]*/
result = MU_FAILURE;
}
else
{
if (mqtt_client->mqtt_status & MQTT_STATUS_CLIENT_CONNECTED)
{
BUFFER_HANDLE disconnectPacket = mqtt_codec_disconnect();
if (disconnectPacket == NULL)
{
/*Codes_SRS_MQTT_CLIENT_07_011: [If any failure is encountered then mqtt_client_disconnect shall return a non-zero value.]*/
LogError("Error: mqtt_client_disconnect failed");
mqtt_client->packetState = PACKET_TYPE_ERROR;
result = MU_FAILURE;
}
else
{
/* Codes_SRS_MQTT_CLIENT_07_037: [ if callback is not NULL callback shall be called once the mqtt connection has been disconnected ] */
mqtt_client->disconnect_cb = callback;
mqtt_client->disconnect_ctx = ctx;
mqtt_client->packetState = DISCONNECT_TYPE;
size_t size = BUFFER_length(disconnectPacket);
/*Codes_SRS_MQTT_CLIENT_07_012: [On success mqtt_client_disconnect shall send the MQTT DISCONNECT packet to the endpoint.]*/
if (sendPacketItem(mqtt_client, BUFFER_u_char(disconnectPacket), size) != 0)
{
/*Codes_SRS_MQTT_CLIENT_07_011: [If any failure is encountered then mqtt_client_disconnect shall return a non-zero value.]*/
LogError("Error: mqtt_client_disconnect send failed");
result = MU_FAILURE;
}
else
{
if (is_trace_enabled(mqtt_client))
{
STRING_HANDLE trace_log = STRING_construct("DISCONNECT");
log_outgoing_trace(mqtt_client, trace_log);
STRING_delete(trace_log);
}
result = 0;
}
BUFFER_delete(disconnectPacket);
}
clear_mqtt_options(mqtt_client);
}
else
{
// If the client is not connected then just close the underlying socket
mqtt_client->disconnect_cb = callback;
mqtt_client->disconnect_ctx = ctx;
close_connection(mqtt_client);
clear_mqtt_options(mqtt_client);
result = 0;
}
}
return result;
}