Microsoft Azure IoTHub client libraries

Dependents:   sht15_remote_monitoring RobotArmDemo iothub_client_sample_amqp f767zi_mqtt ... more

This library implements the Microsoft Azure IoTHub client library. The code is replicated from https://github.com/Azure/azure-iot-sdks

Revision:
86:a1352899ea45
Parent:
85:de16c0a8a196
Child:
88:248736be106e
--- a/iothub_client_ll.c	Tue Mar 20 10:29:00 2018 -0700
+++ b/iothub_client_ll.c	Mon Apr 16 14:25:56 2018 -0700
@@ -44,7 +44,9 @@
 DEFINE_ENUM_STRINGS(IOTHUB_CLIENT_CONNECTION_STATUS_REASON, IOTHUB_CLIENT_CONNECTION_STATUS_REASON_VALUES);
 DEFINE_ENUM_STRINGS(TRANSPORT_TYPE, TRANSPORT_TYPE_VALUES);
 DEFINE_ENUM_STRINGS(DEVICE_TWIN_UPDATE_STATE, DEVICE_TWIN_UPDATE_STATE_VALUES);
+#ifndef DONT_USE_UPLOADTOBLOB
 DEFINE_ENUM_STRINGS(IOTHUB_CLIENT_FILE_UPLOAD_GET_DATA_RESULT, IOTHUB_CLIENT_FILE_UPLOAD_GET_DATA_RESULT_VALUES);
+#endif // DONT_USE_UPLOADTOBLOB
 
 #define CALLBACK_TYPE_VALUES \
     CALLBACK_TYPE_NONE,      \
@@ -1760,39 +1762,40 @@
                 result = IOTHUB_CLIENT_OK;
             }
         }
-        else
+        else if (strcmp(optionName, OPTION_BLOB_UPLOAD_TIMEOUT_SECS) == 0)
         {
-
-            /*Codes_SRS_IOTHUBCLIENT_LL_02_099: [ IoTHubClient_LL_SetOption shall return according to the table below ]*/
-            IOTHUB_CLIENT_RESULT uploadToBlob_result; 
 #ifndef DONT_USE_UPLOADTOBLOB
-            uploadToBlob_result = IoTHubClient_LL_UploadToBlob_SetOption(handleData->uploadToBlobHandle, optionName, value);
-            if(uploadToBlob_result == IOTHUB_CLIENT_ERROR)
+            // This option just gets passed down into IoTHubClient_LL_UploadToBlob
+            /*Codes_SRS_IOTHUBCLIENT_LL_30_010: [ blob_xfr_timeout - IoTHubClient_LL_SetOption shall pass this option to IoTHubClient_UploadToBlob_SetOption and return its result. ]*/
+            result = IoTHubClient_LL_UploadToBlob_SetOption(handleData->uploadToBlobHandle, optionName, value);
+            if(result != IOTHUB_CLIENT_OK)
             {
                 LogError("unable to IoTHubClient_LL_UploadToBlob_SetOption");
-                result = IOTHUB_CLIENT_ERROR;
             }
 #else
-            uploadToBlob_result = IOTHUB_CLIENT_INVALID_ARG; /*harmless value (IOTHUB_CLIENT_INVALID_ARG)in the case when uploadtoblob is not compiled in, otherwise whatever IoTHubClient_LL_UploadToBlob_SetOption returned*/
+            LogError("OPTION_BLOB_TRANSFER_TIMEOUT option being set with DONT_USE_UPLOADTOBLOB compiler switch");
+            result = IOTHUB_CLIENT_ERROR;
 #endif /*DONT_USE_UPLOADTOBLOB*/
-
-            /*Codes_SRS_IOTHUBCLIENT_LL_12_023: [** `svc2cl_keep_alive_timeout_secs` - shall set the cloud to device keep alive frequency(in seconds) for the connection. Zero means keep alive will not be sent. ]*/
-            result =
-                /*based on uploadToBlob_result value this is what happens:*/
-                /*IOTHUB_CLIENT_INVALID_ARG always returns what IoTHubTransport_SetOption returns*/
-                /*IOTHUB_CLIENT_ERROR always returns IOTHUB_CLIENT_ERROR */
-                /*IOTHUB_CLIENT_OK returns OK
-                    IOTHUB_CLIENT_OK if IoTHubTransport_SetOption returns OK or INVALID_ARG
-                    IOTHUB_CLIENT_ERROR if IoTHubTransport_SetOption returns ERROR*/
-
-                (uploadToBlob_result == IOTHUB_CLIENT_INVALID_ARG) ? handleData->IoTHubTransport_SetOption(handleData->transportHandle, optionName, value) :
-                (uploadToBlob_result == IOTHUB_CLIENT_ERROR) ? IOTHUB_CLIENT_ERROR :
-                (handleData->IoTHubTransport_SetOption(handleData->transportHandle, optionName, value) == IOTHUB_CLIENT_ERROR) ? IOTHUB_CLIENT_ERROR : IOTHUB_CLIENT_OK;
-
-            if (result != IOTHUB_CLIENT_OK)
+        }
+        else
+        {
+            // This section is unusual for SetOption calls because it attempts to pass unhandled options
+            // to two downstream targets (IoTHubTransport_SetOption and IoTHubClient_LL_UploadToBlob_SetOption) instead of one.
+            
+            /*Codes_SRS_IOTHUBCLIENT_LL_30_011: [ IoTHubClient_LL_SetOption shall always pass unhandled options to Transport_SetOption. ]*/
+            /*Codes_SRS_IOTHUBCLIENT_LL_30_012: [ If Transport_SetOption fails, IoTHubClient_LL_SetOption shall return that failure code. ]*/
+            result = handleData->IoTHubTransport_SetOption(handleData->transportHandle, optionName, value);
+            if(result != IOTHUB_CLIENT_OK)
             {
-                LogError("underlying transport failed, returned = %s", ENUM_TO_STRING(IOTHUB_CLIENT_RESULT, result));
+                LogError("unable to IoTHubTransport_SetOption");
             }
+#ifndef DONT_USE_UPLOADTOBLOB
+            else
+            {
+                /*Codes_SRS_IOTHUBCLIENT_LL_30_013: [ If the DONT_USE_UPLOADTOBLOB compiler switch is undefined, IoTHubClient_LL_SetOption shall pass unhandled options to IoTHubClient_UploadToBlob_SetOption and ignore the result. ]*/
+                (void)IoTHubClient_LL_UploadToBlob_SetOption(handleData->uploadToBlobHandle, optionName, value);
+            }
+#endif /*DONT_USE_UPLOADTOBLOB*/
         }
     }
     return result;