Microsoft Azure IoTHub client MQTT transport

Dependents:   STM32F746_iothub_client_sample_mqtt FXOS8700CQ_To_Azure_IoT f767zi_mqtt FXOS8700CQ_To_Azure_IoT ... more

Revision:
33:b7dfb208ef0a
Parent:
32:103a46ed8822
Child:
34:9363cf585ef3
--- a/iothubtransport_mqtt_common.c	Fri Dec 15 14:08:57 2017 -0800
+++ b/iothubtransport_mqtt_common.c	Wed Jan 17 08:56:02 2018 -0800
@@ -129,7 +129,8 @@
 {
     MQTT_CLIENT_STATUS_NOT_CONNECTED,
     MQTT_CLIENT_STATUS_CONNECTING,
-    MQTT_CLIENT_STATUS_CONNECTED
+    MQTT_CLIENT_STATUS_CONNECTED,
+    MQTT_CLIENT_STATUS_PENDING_CLOSE
 } MQTT_CLIENT_STATUS;
 
 typedef struct MQTTTRANSPORT_HANDLE_DATA_TAG
@@ -1352,8 +1353,7 @@
                             transport_data->isRecoverableError = false;
                         }
                         LogError("Connection Not Accepted: 0x%x: %s", connack->returnCode, retrieve_mqtt_return_codes(connack->returnCode) );
-                        (void)mqtt_client_disconnect(transport_data->mqttClient, NULL, NULL);
-                        transport_data->mqttClientStatus = MQTT_CLIENT_STATUS_NOT_CONNECTED;
+                        transport_data->mqttClientStatus = MQTT_CLIENT_STATUS_PENDING_CLOSE;
                         transport_data->currPacketState = PACKET_TYPE_ERROR;
                     }
                 }
@@ -1410,9 +1410,11 @@
 
 static void DisconnectFromClient(PMQTTTRANSPORT_HANDLE_DATA transport_data)
 {
-    OPTIONHANDLER_HANDLE options = xio_retrieveoptions(transport_data->xioTransport);
-    set_saved_tls_options(transport_data, options);
-
+    if (!transport_data->isDestroyCalled)
+    {
+        OPTIONHANDLER_HANDLE options = xio_retrieveoptions(transport_data->xioTransport);
+        set_saved_tls_options(transport_data, options);
+    }
     (void)mqtt_client_disconnect(transport_data->mqttClient, NULL, NULL);
     xio_destroy(transport_data->xioTransport);
     transport_data->xioTransport = NULL;
@@ -1453,7 +1455,10 @@
                 break;
             }
         }
-        transport_data->mqttClientStatus = MQTT_CLIENT_STATUS_NOT_CONNECTED;
+        if (transport_data->mqttClientStatus != MQTT_CLIENT_STATUS_PENDING_CLOSE)
+        {
+            transport_data->mqttClientStatus = MQTT_CLIENT_STATUS_NOT_CONNECTED;
+        }
         transport_data->currPacketState = PACKET_TYPE_ERROR;
         transport_data->device_twin_get_sent = false;
         if (transport_data->topic_MqttMessage != NULL)
@@ -2471,7 +2476,12 @@
         }
         else
         {
-            if (transport_data->currPacketState == CONNACK_TYPE || transport_data->currPacketState == SUBSCRIBE_TYPE)
+            if (transport_data->mqttClientStatus == MQTT_CLIENT_STATUS_PENDING_CLOSE)
+            {
+                mqtt_client_disconnect(transport_data->mqttClient, NULL, NULL);
+                transport_data->mqttClientStatus = MQTT_CLIENT_STATUS_NOT_CONNECTED;
+            }
+            else if (transport_data->currPacketState == CONNACK_TYPE || transport_data->currPacketState == SUBSCRIBE_TYPE)
             {
                 SubscribeToMqttProtocol(transport_data);
             }