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
Diff: iothub_client.c
- Revision:
- 78:74a8d3068204
- Parent:
- 76:943524fee0b7
- Child:
- 80:db5f5237bc95
diff -r e4e36df9caee -r 74a8d3068204 iothub_client.c --- a/iothub_client.c Sat Oct 21 20:11:49 2017 +0000 +++ b/iothub_client.c Fri Nov 03 13:18:25 2017 -0700 @@ -18,6 +18,9 @@ #include "azure_c_shared_utility/xlogging.h" #include "azure_c_shared_utility/singlylinkedlist.h" #include "azure_c_shared_utility/vector.h" +#ifdef USE_PROV_MODULE +#include "iothub_client_hsm_ll.h" +#endif struct IOTHUB_QUEUE_CONTEXT_TAG; @@ -637,10 +640,12 @@ return result; } -static IOTHUB_CLIENT_INSTANCE* create_iothub_instance(const IOTHUB_CLIENT_CONFIG* config, TRANSPORT_HANDLE transportHandle, const char* connectionString, IOTHUB_CLIENT_TRANSPORT_PROVIDER protocol) +static IOTHUB_CLIENT_INSTANCE* create_iothub_instance(const IOTHUB_CLIENT_CONFIG* config, TRANSPORT_HANDLE transportHandle, const char* connectionString, IOTHUB_CLIENT_TRANSPORT_PROVIDER protocol, const char* iothub_uri, const char* device_id) { + /* Codes_SRS_IOTHUBCLIENT_12_020: [** `IoTHubClient_CreateFromDeviceAuth` shall allocate a new `IoTHubClient` instance. **] */ IOTHUB_CLIENT_INSTANCE* result = (IOTHUB_CLIENT_INSTANCE*)malloc(sizeof(IOTHUB_CLIENT_INSTANCE)); + /* Codes_SRS_IOTHUBCLIENT_12_021: [** If allocating memory for the new `IoTHubClient` instance fails, then `IoTHubClient_CreateFromDeviceAuth` shall return `NULL`. **] */ /* Codes_SRS_IOTHUBCLIENT_01_004: [If allocating memory for the new IoTHubClient instance fails, then IoTHubClient_Create shall return NULL.] */ if (result != NULL) { @@ -732,6 +737,28 @@ } } } + else if (iothub_uri != NULL) + { +#ifdef USE_PROV_MODULE + /* Codes_SRS_IOTHUBCLIENT_12_022: [** `IoTHubClient_CreateFromDeviceAuth` shall create a lock object to be used later for serializing IoTHubClient calls. **] */ + result->LockHandle = Lock_Init(); + if (result->LockHandle == NULL) + { + /* Codes_SRS_IOTHUBCLIENT_12_023: [** If creating the lock fails, then IoTHubClient_CreateFromDeviceAuth shall return NULL. **] */ + LogError("Failure creating Lock object"); + result->IoTHubClientLLHandle = NULL; + } + else + { + /* Codes_SRS_IOTHUBCLIENT_12_025: [** `IoTHubClient_CreateFromDeviceAuth` shall instantiate a new `IoTHubClient_LL` instance by calling `IoTHubClient_LL_CreateFromDeviceAuth` and passing iothub_uri, device_id and protocol argument. **] */ + result->IoTHubClientLLHandle = IoTHubClient_LL_CreateFromDeviceAuth(iothub_uri, device_id, protocol); + } +#else + (void)device_id; + LogError("Provisioning is not enabled for the build"); + result->IoTHubClientLLHandle = NULL; +#endif + } else { result->LockHandle = Lock_Init(); @@ -802,7 +829,7 @@ } else { - result = create_iothub_instance(NULL, NULL, connectionString, protocol); + result = create_iothub_instance(NULL, NULL, connectionString, protocol, NULL, NULL); } return result; } @@ -817,7 +844,7 @@ } else { - result = create_iothub_instance(config, NULL, NULL, NULL); + result = create_iothub_instance(config, NULL, NULL, NULL, NULL, NULL); } return result; } @@ -834,7 +861,40 @@ } else { - result = create_iothub_instance(config, transportHandle, NULL, NULL); + result = create_iothub_instance(config, transportHandle, NULL, NULL, NULL, NULL); + } + return result; +} + +IOTHUB_CLIENT_HANDLE IoTHubClient_CreateFromDeviceAuth(const char* iothub_uri, const char* device_id, IOTHUB_CLIENT_TRANSPORT_PROVIDER protocol) +{ + IOTHUB_CLIENT_INSTANCE* result; + + /* Codes_SRS_IOTHUBCLIENT_12_019: [** `IoTHubClient_CreateFromDeviceAuth` shall verify the input parameters and if any of them `NULL` then return `NULL`. **] */ + if (iothub_uri == NULL) + { + LogError("Input parameter is NULL: iothub_uri"); + result = NULL; + } + else if (device_id == NULL) + { + LogError("Input parameter is NULL: device_id"); + result = NULL; + } + else if (protocol == NULL) + { + LogError("Input parameter is NULL: protocol"); + result = NULL; + } + else + { + /* Codes_SRS_IOTHUBCLIENT_12_020: [** `IoTHubClient_CreateFromDeviceAuth` shall allocate a new `IoTHubClient` instance. **] */ + /* Codes_SRS_IOTHUBCLIENT_12_021: [** If allocating memory for the new `IoTHubClient` instance fails, then `IoTHubClient_CreateFromDeviceAuth` shall return `NULL`. **] */ + /* Codes_SRS_IOTHUBCLIENT_12_022: [** `IoTHubClient_CreateFromDeviceAuth` shall create a lock object to be used later for serializing IoTHubClient calls. **] */ + /* Codes_SRS_IOTHUBCLIENT_12_023: [** If creating the lock fails, then IoTHubClient_CreateFromDeviceAuth shall return NULL. **] */ + /* Codes_SRS_IOTHUBCLIENT_12_024: [** If IoTHubClient_CreateFromDeviceAuth fails, all resources allocated by it shall be freed. **] */ + /* Codes_SRS_IOTHUBCLIENT_12_025: [** `IoTHubClient_CreateFromDeviceAuth` shall instantiate a new `IoTHubClient_LL` instance by calling `IoTHubClient_LL_CreateFromDeviceAuth` and passing iothub_uri, device_id and protocol argument. **] */ + result = create_iothub_instance(NULL, NULL, NULL, protocol, iothub_uri, device_id); } return result; } @@ -845,7 +905,8 @@ /* Codes_SRS_IOTHUBCLIENT_01_008: [IoTHubClient_Destroy shall do nothing if parameter iotHubClientHandle is NULL.] */ if (iotHubClientHandle != NULL) { - bool okToJoin; + bool joinClientThread; + bool joinTransportThread; size_t vector_size; IOTHUB_CLIENT_INSTANCE* iotHubClientInstance = (IOTHUB_CLIENT_INSTANCE*)iotHubClientHandle; @@ -853,7 +914,11 @@ if (iotHubClientInstance->TransportHandle != NULL) { /*Codes_SRS_IOTHUBCLIENT_01_007: [ The thread created as part of executing IoTHubClient_SendEventAsync or IoTHubClient_SetNotificationMessageCallback shall be joined. ]*/ - okToJoin = IoTHubTransport_SignalEndWorkerThread(iotHubClientInstance->TransportHandle, iotHubClientHandle); + joinTransportThread = IoTHubTransport_SignalEndWorkerThread(iotHubClientInstance->TransportHandle, iotHubClientHandle); + } + else + { + joinTransportThread = false; } /*Codes_SRS_IOTHUBCLIENT_02_043: [ IoTHubClient_Destroy shall lock the serializing lock and signal the worker thread (if any) to end ]*/ @@ -865,11 +930,11 @@ if (iotHubClientInstance->ThreadHandle != NULL) { iotHubClientInstance->StopThread = 1; - okToJoin = true; + joinClientThread = true; } else { - okToJoin = false; + joinClientThread = false; } /*Codes_SRS_IOTHUBCLIENT_02_045: [ IoTHubClient_Destroy shall unlock the serializing lock. ]*/ @@ -878,25 +943,21 @@ LogError("unable to Unlock"); } - if (okToJoin == true) + if (joinClientThread == true) { - if (iotHubClientInstance->ThreadHandle != NULL) + int res; + /*Codes_SRS_IOTHUBCLIENT_01_007: [ The thread created as part of executing IoTHubClient_SendEventAsync or IoTHubClient_SetNotificationMessageCallback shall be joined. ]*/ + if (ThreadAPI_Join(iotHubClientInstance->ThreadHandle, &res) != THREADAPI_OK) { - int res; - /*Codes_SRS_IOTHUBCLIENT_01_007: [ The thread created as part of executing IoTHubClient_SendEventAsync or IoTHubClient_SetNotificationMessageCallback shall be joined. ]*/ - if (ThreadAPI_Join(iotHubClientInstance->ThreadHandle, &res) != THREADAPI_OK) - { - LogError("ThreadAPI_Join failed"); - } - } - - if (iotHubClientInstance->TransportHandle != NULL) - { - /*Codes_SRS_IOTHUBCLIENT_01_007: [ The thread created as part of executing IoTHubClient_SendEventAsync or IoTHubClient_SetNotificationMessageCallback shall be joined. ]*/ - IoTHubTransport_JoinWorkerThread(iotHubClientInstance->TransportHandle, iotHubClientHandle); + LogError("ThreadAPI_Join failed"); } } + if (joinTransportThread == true) + { + /*Codes_SRS_IOTHUBCLIENT_01_007: [ The thread created as part of executing IoTHubClient_SendEventAsync or IoTHubClient_SetNotificationMessageCallback shall be joined. ]*/ + IoTHubTransport_JoinWorkerThread(iotHubClientInstance->TransportHandle, iotHubClientHandle); + } if (Lock(iotHubClientInstance->LockHandle) != LOCK_OK) {