in iothub_client/src/iothubtransport_mqtt_common.c [2070:2201]
static void mqttOperationCompleteCallback(MQTT_CLIENT_HANDLE handle, MQTT_CLIENT_EVENT_RESULT actionResult, const void* msgInfo, void* callbackCtx)
{
(void)handle;
if (callbackCtx != NULL)
{
PMQTTTRANSPORT_HANDLE_DATA transport_data = (PMQTTTRANSPORT_HANDLE_DATA)callbackCtx;
switch (actionResult)
{
case MQTT_CLIENT_ON_PUBLISH_ACK:
case MQTT_CLIENT_ON_PUBLISH_COMP:
{
const PUBLISH_ACK* puback = (const PUBLISH_ACK*)msgInfo;
if (puback != NULL)
{
PDLIST_ENTRY currentListEntry = transport_data->telemetry_waitingForAck.Flink;
while (currentListEntry != &transport_data->telemetry_waitingForAck)
{
MQTT_MESSAGE_DETAILS_LIST* mqttMsgEntry = containingRecord(currentListEntry, MQTT_MESSAGE_DETAILS_LIST, entry);
DLIST_ENTRY saveListEntry;
saveListEntry.Flink = currentListEntry->Flink;
if (puback->packetId == mqttMsgEntry->packet_id)
{
(void)DList_RemoveEntryList(currentListEntry); //First remove the item from Waiting for Ack List.
notifyApplicationOfSendMessageComplete(mqttMsgEntry->iotHubMessageEntry, transport_data, IOTHUB_CLIENT_CONFIRMATION_OK);
free(mqttMsgEntry);
}
currentListEntry = saveListEntry.Flink;
}
}
else
{
LogError("Failure: MQTT_CLIENT_ON_PUBLISH_ACK publish_ack structure NULL.");
}
break;
}
case MQTT_CLIENT_ON_CONNACK:
{
const CONNECT_ACK* connack = (const CONNECT_ACK*)msgInfo;
if (connack != NULL)
{
if (connack->returnCode == CONNECTION_ACCEPTED)
{
// The connect packet has been acked
transport_data->currPacketState = CONNACK_TYPE;
transport_data->isRecoverableError = true;
transport_data->mqttClientStatus = MQTT_CLIENT_STATUS_CONNECTED;
retry_control_reset(transport_data->retry_control_handle);
transport_data->transport_callbacks.connection_status_cb(IOTHUB_CLIENT_CONNECTION_AUTHENTICATED, IOTHUB_CLIENT_CONNECTION_OK, transport_data->transport_ctx);
}
else
{
if (connack->returnCode == CONN_REFUSED_SERVER_UNAVAIL)
{
transport_data->transport_callbacks.connection_status_cb(IOTHUB_CLIENT_CONNECTION_UNAUTHENTICATED, IOTHUB_CLIENT_CONNECTION_DEVICE_DISABLED, transport_data->transport_ctx);
}
else if (connack->returnCode == CONN_REFUSED_BAD_USERNAME_PASSWORD || connack->returnCode == CONN_REFUSED_ID_REJECTED)
{
transport_data->isRecoverableError = false;
transport_data->transport_callbacks.connection_status_cb(IOTHUB_CLIENT_CONNECTION_UNAUTHENTICATED, IOTHUB_CLIENT_CONNECTION_BAD_CREDENTIAL, transport_data->transport_ctx);
}
else if (connack->returnCode == CONN_REFUSED_NOT_AUTHORIZED)
{
transport_data->transport_callbacks.connection_status_cb(IOTHUB_CLIENT_CONNECTION_UNAUTHENTICATED, IOTHUB_CLIENT_CONNECTION_BAD_CREDENTIAL, transport_data->transport_ctx);
}
else if (connack->returnCode == CONN_REFUSED_UNACCEPTABLE_VERSION)
{
transport_data->isRecoverableError = false;
}
LogError("Connection Not Accepted: 0x%x: %s", connack->returnCode, retrieveMqttReturnCodes(connack->returnCode));
transport_data->mqttClientStatus = MQTT_CLIENT_STATUS_PENDING_CLOSE;
transport_data->currPacketState = PACKET_TYPE_ERROR;
}
}
else
{
LogError("MQTT_CLIENT_ON_CONNACK CONNACK parameter is NULL.");
}
break;
}
case MQTT_CLIENT_ON_SUBSCRIBE_ACK:
{
const SUBSCRIBE_ACK* suback = (const SUBSCRIBE_ACK*)msgInfo;
if (suback != NULL)
{
size_t index = 0;
for (index = 0; index < suback->qosCount; index++)
{
if (suback->qosReturn[index] == DELIVER_FAILURE)
{
LogError("Subscribe delivery failure of subscribe %lu", (unsigned long)index);
}
}
// The subscribed packet has been acked
transport_data->currPacketState = SUBACK_TYPE;
// Is this a twin message
if (suback->packetId == transport_data->twin_resp_packet_id)
{
transport_data->twin_resp_sub_recv = true;
}
}
else
{
LogError("Failure: MQTT_CLIENT_ON_SUBSCRIBE_ACK SUBSCRIBE_ACK parameter is NULL.");
}
break;
}
case MQTT_CLIENT_ON_PUBLISH_RECV:
case MQTT_CLIENT_ON_PUBLISH_REL:
{
// Currently not used
break;
}
case MQTT_CLIENT_ON_DISCONNECT:
{
// Close the client so we can reconnect again
transport_data->mqttClientStatus = MQTT_CLIENT_STATUS_NOT_CONNECTED;
break;
}
case MQTT_CLIENT_ON_UNSUBSCRIBE_ACK:
case MQTT_CLIENT_ON_PING_RESPONSE:
default:
{
break;
}
}
}
}