A small footprint MQTT library

Dependents:   STM32F746_iothub_client_sample_mqtt FXOS8700CQ_To_Azure_IoT f767zi_mqtt FXOS8700CQ_To_Azure_IoT ... more

Revision:
13:3c202001e4ba
Parent:
12:30b08cda82fd
Child:
14:4b5b4dccfc8b
--- a/mqtt_client.c	Tue Jan 24 15:24:05 2017 -0800
+++ b/mqtt_client.c	Sat Jan 28 09:34:52 2017 -0800
@@ -350,8 +350,9 @@
             }
             else
             {
+                size_t size = BUFFER_length(connPacket);
                 /*Codes_SRS_MQTT_CLIENT_07_009: [On success mqtt_client_connect shall send the MQTT CONNECT to the endpoint.]*/
-                if (sendPacketItem(mqtt_client, BUFFER_u_char(connPacket), BUFFER_length(connPacket)) != 0)
+                if (sendPacketItem(mqtt_client, BUFFER_u_char(connPacket), size) != 0)
                 {
                     LOG(AZ_LOG_ERROR, LOG_LINE, "Error: mqtt_codec_connect failed");
                 }
@@ -615,7 +616,8 @@
                                     }
                                     if (pubRel != NULL)
                                     {
-                                        (void)sendPacketItem(mqtt_client, BUFFER_u_char(pubRel), BUFFER_length(pubRel));
+                                        size_t size = BUFFER_length(pubRel);
+                                        (void)sendPacketItem(mqtt_client, BUFFER_u_char(pubRel), size);
                                         BUFFER_delete(pubRel);
                                     }
                                 }
@@ -674,7 +676,8 @@
                         }
                         if (pubRel != NULL)
                         {
-                            (void)sendPacketItem(mqtt_client, BUFFER_u_char(pubRel), BUFFER_length(pubRel));
+                            size_t size = BUFFER_length(pubRel);
+                            (void)sendPacketItem(mqtt_client, BUFFER_u_char(pubRel), size);
                             BUFFER_delete(pubRel);
                         }
                     }
@@ -840,11 +843,6 @@
         MQTT_CLIENT* mqtt_client = (MQTT_CLIENT*)handle;
         tickcounter_destroy(mqtt_client->packetTickCntr);
         mqtt_codec_destroy(mqtt_client->codec_handle);
-        free(mqtt_client->mqttOptions.clientId);
-        free(mqtt_client->mqttOptions.willTopic);
-        free(mqtt_client->mqttOptions.willMessage);
-        free(mqtt_client->mqttOptions.username);
-        free(mqtt_client->mqttOptions.password);
         free(mqtt_client);
     }
 }
@@ -918,8 +916,12 @@
         {
             STRING_HANDLE trace_log = construct_trace_log_handle(mqtt_client);
 
-            BUFFER_HANDLE publishPacket = mqtt_codec_publish(mqttmessage_getQosType(msgHandle), mqttmessage_getIsDuplicateMsg(msgHandle),
-                mqttmessage_getIsRetained(msgHandle), mqttmessage_getPacketId(msgHandle), mqttmessage_getTopicName(msgHandle), payload->message, payload->length, trace_log);
+            QOS_VALUE qos = mqttmessage_getQosType(msgHandle);
+            bool isDuplicate = mqttmessage_getIsDuplicateMsg(msgHandle);
+            bool isRetained = mqttmessage_getIsRetained(msgHandle);
+            uint16_t packetId = mqttmessage_getPacketId(msgHandle);
+            const char* topicName = mqttmessage_getTopicName(msgHandle);
+            BUFFER_HANDLE publishPacket = mqtt_codec_publish(qos, isDuplicate, isRetained, packetId, topicName, payload->message, payload->length, trace_log);
             if (publishPacket == NULL)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_020: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.]*/
@@ -931,7 +933,8 @@
                 mqtt_client->packetState = PUBLISH_TYPE;
 
                 /*Codes_SRS_MQTT_CLIENT_07_022: [On success mqtt_client_publish shall send the MQTT SUBCRIBE packet to the endpoint.]*/
-                if (sendPacketItem(mqtt_client, BUFFER_u_char(publishPacket), BUFFER_length(publishPacket)) != 0)
+                size_t size = BUFFER_length(publishPacket);
+                if (sendPacketItem(mqtt_client, BUFFER_u_char(publishPacket), size) != 0)
                 {
                     /*Codes_SRS_MQTT_CLIENT_07_020: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.]*/
                     LOG(AZ_LOG_ERROR, LOG_LINE, "Error: mqtt_client_publish send failed");
@@ -977,8 +980,9 @@
         {
             mqtt_client->packetState = SUBSCRIBE_TYPE;
 
+            size_t size = BUFFER_length(subPacket);
             /*Codes_SRS_MQTT_CLIENT_07_015: [On success mqtt_client_subscribe shall send the MQTT SUBCRIBE packet to the endpoint.]*/
-            if (sendPacketItem(mqtt_client, BUFFER_u_char(subPacket), BUFFER_length(subPacket)) != 0)
+            if (sendPacketItem(mqtt_client, BUFFER_u_char(subPacket), size) != 0)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_014: [If any failure is encountered then mqtt_client_subscribe shall return a non-zero value.]*/
                 LOG(AZ_LOG_ERROR, LOG_LINE, "Error: mqtt_client_subscribe send failed");
@@ -1023,8 +1027,9 @@
         {
             mqtt_client->packetState = UNSUBSCRIBE_TYPE;
 
+            size_t size = BUFFER_length(unsubPacket);
             /*Codes_SRS_MQTT_CLIENT_07_018: [On success mqtt_client_unsubscribe shall send the MQTT SUBCRIBE packet to the endpoint.]*/
-            if (sendPacketItem(mqtt_client, BUFFER_u_char(unsubPacket), BUFFER_length(unsubPacket)) != 0)
+            if (sendPacketItem(mqtt_client, BUFFER_u_char(unsubPacket), size) != 0)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_017: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.].]*/
                 LOG(AZ_LOG_ERROR, LOG_LINE, "Error: mqtt_client_unsubscribe send failed");
@@ -1068,8 +1073,9 @@
         {
             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), BUFFER_length(disconnectPacket)) != 0)
+            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.]*/
                 LOG(AZ_LOG_ERROR, LOG_LINE, "Error: mqtt_client_disconnect send failed");
@@ -1086,6 +1092,11 @@
                 result = 0;
             }
             BUFFER_delete(disconnectPacket);
+            free(mqtt_client->mqttOptions.clientId);
+            free(mqtt_client->mqttOptions.willTopic);
+            free(mqtt_client->mqttOptions.willMessage);
+            free(mqtt_client->mqttOptions.username);
+            free(mqtt_client->mqttOptions.password);
         }
     }
     return result;
@@ -1125,7 +1136,8 @@
                     BUFFER_HANDLE pingPacket = mqtt_codec_ping();
                     if (pingPacket != NULL)
                     {
-                        (void)sendPacketItem(mqtt_client, BUFFER_u_char(pingPacket), BUFFER_length(pingPacket));
+                        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);