in src/mqtt_client.c [1381:1443]
void mqtt_client_dowork(MQTT_CLIENT_HANDLE handle)
{
MQTT_CLIENT* mqtt_client = (MQTT_CLIENT*)handle;
/*Codes_SRS_MQTT_CLIENT_18_001: [If the client is disconnected, mqtt_client_dowork shall do nothing.]*/
/*Codes_SRS_MQTT_CLIENT_07_023: [If the parameter handle is NULL then mqtt_client_dowork shall do nothing.]*/
if (mqtt_client != NULL && mqtt_client->xioHandle != NULL)
{
if (mqtt_client->mqtt_status & MQTT_STATUS_PENDING_CLOSE)
{
close_connection(mqtt_client);
// turn off pending close
mqtt_client->mqtt_status &= ~MQTT_STATUS_PENDING_CLOSE;
}
else
{
/*Codes_SRS_MQTT_CLIENT_07_024: [mqtt_client_dowork shall call the xio_dowork function to complete operations.]*/
xio_dowork(mqtt_client->xioHandle);
/*Codes_SRS_MQTT_CLIENT_07_025: [mqtt_client_dowork shall retrieve the the last packet send value and ...]*/
if (mqtt_client->mqtt_status & MQTT_STATUS_SOCKET_CONNECTED &&
mqtt_client->mqtt_status & MQTT_STATUS_CLIENT_CONNECTED &&
mqtt_client->keepAliveInterval > 0)
{
tickcounter_ms_t current_ms;
if (tickcounter_get_current_ms(mqtt_client->packetTickCntr, ¤t_ms) != 0)
{
LogError("Error: tickcounter_get_current_ms failed");
}
else
{
/* Codes_SRS_MQTT_CLIENT_07_035: [If the timeSincePing has expired past the maxPingRespTime then mqtt_client_dowork shall call the Error Callback function with the message MQTT_CLIENT_NO_PING_RESPONSE] */
if (mqtt_client->timeSincePing > 0 && ((current_ms - mqtt_client->timeSincePing)/1000) > mqtt_client->maxPingRespTime)
{
// We haven't gotten a ping response in the alloted time
set_error_callback(mqtt_client, MQTT_CLIENT_NO_PING_RESPONSE);
mqtt_client->timeSincePing = 0;
mqtt_client->packetSendTimeMs = 0;
mqtt_client->packetState = UNKNOWN_TYPE;
}
else if (((current_ms - mqtt_client->packetSendTimeMs) / 1000) >= mqtt_client->keepAliveInterval)
{
/*Codes_SRS_MQTT_CLIENT_07_026: [if keepAliveInternal is > 0 and the send time is greater than the MQTT KeepAliveInterval then it shall construct an MQTT PINGREQ packet.]*/
BUFFER_HANDLE pingPacket = mqtt_codec_ping();
if (pingPacket != NULL)
{
size_t size = BUFFER_length(pingPacket);
(void)sendPacketItem(mqtt_client, BUFFER_u_char(pingPacket), size);
BUFFER_delete(pingPacket);
(void)tickcounter_get_current_ms(mqtt_client->packetTickCntr, &mqtt_client->timeSincePing);
if (is_trace_enabled(mqtt_client))
{
STRING_HANDLE trace_log = STRING_construct("PINGREQ");
log_outgoing_trace(mqtt_client, trace_log);
STRING_delete(trace_log);
}
}
}
}
}
}
}
}