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

Committer:
AzureIoTClient
Date:
Sun Apr 24 16:40:16 2016 -0700
Revision:
39:2719651a5bee
Parent:
38:a05929a75111
Child:
40:1a94db9139ea
1.0.5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 16:deba40344375 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 16:deba40344375 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 16:deba40344375 3
AzureIoTClient 16:deba40344375 4 #include <stdlib.h>
AzureIoTClient 16:deba40344375 5 #ifdef _CRTDBG_MAP_ALLOC
AzureIoTClient 16:deba40344375 6 #include <crtdbg.h>
AzureIoTClient 16:deba40344375 7 #endif
Azure.IoT Build 38:a05929a75111 8 #include <string.h>
Azure.IoT Build 38:a05929a75111 9 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 38:a05929a75111 10 #include "azure_c_shared_utility/string_tokenizer.h"
Azure.IoT Build 38:a05929a75111 11 #include "azure_c_shared_utility/doublylinkedlist.h"
Azure.IoT Build 38:a05929a75111 12 #include "azure_c_shared_utility/iot_logging.h"
Azure.IoT Build 38:a05929a75111 13 #include "azure_c_shared_utility/tickcounter.h"
AzureIoTClient 16:deba40344375 14
AzureIoTClient 16:deba40344375 15 #include "iothub_client_ll.h"
AzureIoTClient 16:deba40344375 16 #include "iothub_client_private.h"
AzureIoTClient 33:b372b0efcd20 17 #include "iothub_client_version.h"
Azure.IoT Build 38:a05929a75111 18 #include "iothub_transport_ll.h"
Azure.IoT Build 36:67300d5a4c1f 19
AzureIoTClient 39:2719651a5bee 20 #define LOG_ERROR LogError("result = %s", ENUM_TO_STRING(IOTHUB_CLIENT_RESULT, result));
AzureIoTClient 16:deba40344375 21 #define INDEFINITE_TIME ((time_t)(-1))
AzureIoTClient 16:deba40344375 22
AzureIoTClient 16:deba40344375 23 DEFINE_ENUM_STRINGS(IOTHUB_CLIENT_RESULT, IOTHUB_CLIENT_RESULT_VALUES);
AzureIoTClient 16:deba40344375 24
AzureIoTClient 16:deba40344375 25 typedef struct IOTHUB_CLIENT_LL_HANDLE_DATA_TAG
AzureIoTClient 16:deba40344375 26 {
AzureIoTClient 16:deba40344375 27 DLIST_ENTRY waitingToSend;
Azure.IoT Build 37:18310e4d888d 28 TRANSPORT_LL_HANDLE transportHandle;
Azure.IoT Build 36:67300d5a4c1f 29 bool isSharedTransport;
Azure.IoT Build 36:67300d5a4c1f 30 IOTHUB_DEVICE_HANDLE deviceHandle;
AzureIoTClient 16:deba40344375 31 TRANSPORT_PROVIDER_FIELDS;
AzureIoTClient 16:deba40344375 32 IOTHUB_CLIENT_MESSAGE_CALLBACK_ASYNC messageCallback;
AzureIoTClient 16:deba40344375 33 void* messageUserContextCallback;
AzureIoTClient 16:deba40344375 34 time_t lastMessageReceiveTime;
Azure.IoT Build 36:67300d5a4c1f 35 TICK_COUNTER_HANDLE tickCounter; /*shared tickcounter used to track message timeouts in waitingToSend list*/
Azure.IoT Build 36:67300d5a4c1f 36 uint64_t currentMessageTimeout;
AzureIoTClient 16:deba40344375 37 }IOTHUB_CLIENT_LL_HANDLE_DATA;
AzureIoTClient 16:deba40344375 38
AzureIoTClient 16:deba40344375 39 static const char HOSTNAME_TOKEN[] = "HostName";
AzureIoTClient 16:deba40344375 40 static const char DEVICEID_TOKEN[] = "DeviceId";
AzureIoTClient 16:deba40344375 41 static const char DEVICEKEY_TOKEN[] = "SharedAccessKey";
AzureIoTClient 16:deba40344375 42 static const char PROTOCOL_GATEWAY_HOST[] = "GatewayHostName";
AzureIoTClient 16:deba40344375 43
AzureIoTClient 16:deba40344375 44 IOTHUB_CLIENT_LL_HANDLE IoTHubClient_LL_CreateFromConnectionString(const char* connectionString, IOTHUB_CLIENT_TRANSPORT_PROVIDER protocol)
AzureIoTClient 16:deba40344375 45 {
AzureIoTClient 32:6e9d81a62085 46 IOTHUB_CLIENT_LL_HANDLE result = NULL;
AzureIoTClient 16:deba40344375 47
AzureIoTClient 16:deba40344375 48 /*Codes_SRS_IOTHUBCLIENT_LL_05_001: [IoTHubClient_LL_CreateFromConnectionString shall obtain the version string by a call to IoTHubClient_GetVersionString.]*/
AzureIoTClient 16:deba40344375 49 /*Codes_SRS_IOTHUBCLIENT_LL_05_002: [IoTHubClient_LL_CreateFromConnectionString shall print the version string to standard output.]*/
AzureIoTClient 39:2719651a5bee 50 LogInfo("IoT Hub SDK for C, version %s", IoTHubClient_GetVersionString());
AzureIoTClient 16:deba40344375 51
AzureIoTClient 16:deba40344375 52 /* SRS_IOTHUBCLIENT_LL_12_003: [IoTHubClient_LL_CreateFromConnectionString shall verify the input parameter and if it is NULL then return NULL] */
AzureIoTClient 16:deba40344375 53 if (connectionString == NULL)
AzureIoTClient 16:deba40344375 54 {
AzureIoTClient 39:2719651a5bee 55 LogError("Input parameter is NULL: connectionString");
AzureIoTClient 16:deba40344375 56 }
AzureIoTClient 16:deba40344375 57 else if (protocol == NULL)
AzureIoTClient 16:deba40344375 58 {
AzureIoTClient 39:2719651a5bee 59 LogError("Input parameter is NULL: protocol");
AzureIoTClient 16:deba40344375 60 }
AzureIoTClient 16:deba40344375 61 else
AzureIoTClient 16:deba40344375 62 {
AzureIoTClient 16:deba40344375 63 /* SRS_IOTHUBCLIENT_LL_12_004: [IoTHubClient_LL_CreateFromConnectionString shall allocate IOTHUB_CLIENT_CONFIG structure] */
AzureIoTClient 16:deba40344375 64 IOTHUB_CLIENT_CONFIG* config = malloc(sizeof(IOTHUB_CLIENT_CONFIG));
AzureIoTClient 16:deba40344375 65 if (config == NULL)
AzureIoTClient 16:deba40344375 66 {
AzureIoTClient 16:deba40344375 67 /* SRS_IOTHUBCLIENT_LL_12_012: [If the allocation failed IoTHubClient_LL_CreateFromConnectionString returns NULL] */
AzureIoTClient 39:2719651a5bee 68 LogError("Malloc failed");
AzureIoTClient 16:deba40344375 69 return NULL;
AzureIoTClient 16:deba40344375 70 }
AzureIoTClient 16:deba40344375 71 else
AzureIoTClient 16:deba40344375 72 {
AzureIoTClient 16:deba40344375 73 STRING_TOKENIZER_HANDLE tokenizer1 = NULL;
AzureIoTClient 16:deba40344375 74 STRING_HANDLE connString = NULL;
AzureIoTClient 16:deba40344375 75 STRING_HANDLE tokenString = NULL;
AzureIoTClient 16:deba40344375 76 STRING_HANDLE valueString = NULL;
AzureIoTClient 16:deba40344375 77 STRING_HANDLE hostNameString = NULL;
AzureIoTClient 16:deba40344375 78 STRING_HANDLE hostSuffixString = NULL;
AzureIoTClient 16:deba40344375 79 STRING_HANDLE deviceIdString = NULL;
AzureIoTClient 16:deba40344375 80 STRING_HANDLE deviceKeyString = NULL;
AzureIoTClient 16:deba40344375 81 STRING_HANDLE protocolGateway = NULL;
AzureIoTClient 16:deba40344375 82
AzureIoTClient 16:deba40344375 83 config->protocol = protocol;
AzureIoTClient 16:deba40344375 84
AzureIoTClient 16:deba40344375 85 config->iotHubName = NULL;
AzureIoTClient 16:deba40344375 86 config->iotHubSuffix = NULL;
AzureIoTClient 16:deba40344375 87 config->deviceId = NULL;
AzureIoTClient 16:deba40344375 88 config->deviceKey = NULL;
AzureIoTClient 31:741eacddf296 89 /* Codes_SRS_IOTHUBCLIENT_LL_04_002: [If it does not, it shall pass the protocolGatewayHostName NULL.] */
AzureIoTClient 31:741eacddf296 90 config->protocolGatewayHostName = NULL;
AzureIoTClient 16:deba40344375 91
AzureIoTClient 16:deba40344375 92 if ((connString = STRING_construct(connectionString)) == NULL)
AzureIoTClient 16:deba40344375 93 {
AzureIoTClient 39:2719651a5bee 94 LogError("Error constructing connectiong String");
AzureIoTClient 16:deba40344375 95 }
AzureIoTClient 16:deba40344375 96 else if ((tokenizer1 = STRING_TOKENIZER_create(connString)) == NULL)
AzureIoTClient 16:deba40344375 97 {
AzureIoTClient 39:2719651a5bee 98 LogError("Error creating Tokenizer");
AzureIoTClient 16:deba40344375 99 }
AzureIoTClient 16:deba40344375 100 else if ((tokenString = STRING_new()) == NULL)
AzureIoTClient 16:deba40344375 101 {
AzureIoTClient 39:2719651a5bee 102 LogError("Error creating Token String");
AzureIoTClient 16:deba40344375 103 }
AzureIoTClient 16:deba40344375 104 else if ((valueString = STRING_new()) == NULL)
AzureIoTClient 16:deba40344375 105 {
AzureIoTClient 39:2719651a5bee 106 LogError("Error creating Value String");
AzureIoTClient 16:deba40344375 107 }
AzureIoTClient 16:deba40344375 108 else if ((hostNameString = STRING_new()) == NULL)
AzureIoTClient 16:deba40344375 109 {
AzureIoTClient 39:2719651a5bee 110 LogError("Error creating HostName String");
AzureIoTClient 16:deba40344375 111 }
AzureIoTClient 16:deba40344375 112 else if ((hostSuffixString = STRING_new()) == NULL)
AzureIoTClient 16:deba40344375 113 {
AzureIoTClient 39:2719651a5bee 114 LogError("Error creating HostSuffix String");
AzureIoTClient 16:deba40344375 115 }
AzureIoTClient 16:deba40344375 116 /* SRS_IOTHUBCLIENT_LL_12_005: [IoTHubClient_LL_CreateFromConnectionString shall try to parse the connectionString input parameter for the following structure: "Key1=value1;key2=value2;key3=value3..."] */
AzureIoTClient 16:deba40344375 117 /* SRS_IOTHUBCLIENT_LL_12_006: [IoTHubClient_LL_CreateFromConnectionString shall verify the existence of the following Key/Value pairs in the connection string: HostName, DeviceId, SharedAccessKey.] */
AzureIoTClient 16:deba40344375 118 else
AzureIoTClient 16:deba40344375 119 {
AzureIoTClient 16:deba40344375 120 while ((STRING_TOKENIZER_get_next_token(tokenizer1, tokenString, "=") == 0))
AzureIoTClient 16:deba40344375 121 {
AzureIoTClient 16:deba40344375 122 if (STRING_TOKENIZER_get_next_token(tokenizer1, valueString, ";") != 0)
AzureIoTClient 16:deba40344375 123 {
AzureIoTClient 39:2719651a5bee 124 LogError("Tokenizer error");
AzureIoTClient 16:deba40344375 125 break;
AzureIoTClient 16:deba40344375 126 }
AzureIoTClient 16:deba40344375 127 else
AzureIoTClient 16:deba40344375 128 {
AzureIoTClient 16:deba40344375 129 if (tokenString != NULL)
AzureIoTClient 16:deba40344375 130 {
AzureIoTClient 16:deba40344375 131 /* SRS_IOTHUBCLIENT_LL_12_010: [IoTHubClient_LL_CreateFromConnectionString shall fill up the IOTHUB_CLIENT_CONFIG structure using the following mapping: iotHubName = Name, iotHubSuffix = Suffix, deviceId = DeviceId, deviceKey = SharedAccessKey] */
AzureIoTClient 16:deba40344375 132 const char* s_token = STRING_c_str(tokenString);
AzureIoTClient 31:741eacddf296 133 if (strcmp(s_token, HOSTNAME_TOKEN) == 0)
AzureIoTClient 16:deba40344375 134 {
AzureIoTClient 16:deba40344375 135 /* SRS_IOTHUBCLIENT_LL_12_009: [IoTHubClient_LL_CreateFromConnectionString shall split the value of HostName to Name and Suffix using the first "." as a separator] */
AzureIoTClient 16:deba40344375 136 STRING_TOKENIZER_HANDLE tokenizer2 = NULL;
AzureIoTClient 16:deba40344375 137 if ((tokenizer2 = STRING_TOKENIZER_create(valueString)) == NULL)
AzureIoTClient 16:deba40344375 138 {
AzureIoTClient 39:2719651a5bee 139 LogError("Error creating Tokenizer");
AzureIoTClient 16:deba40344375 140 break;
AzureIoTClient 16:deba40344375 141 }
AzureIoTClient 16:deba40344375 142 else
AzureIoTClient 16:deba40344375 143 {
AzureIoTClient 16:deba40344375 144 /* SRS_IOTHUBCLIENT_LL_12_015: [If the string split failed, IoTHubClient_LL_CreateFromConnectionString returns NULL ] */
AzureIoTClient 16:deba40344375 145 if (STRING_TOKENIZER_get_next_token(tokenizer2, hostNameString, ".") != 0)
AzureIoTClient 16:deba40344375 146 {
AzureIoTClient 39:2719651a5bee 147 LogError("Tokenizer error");
AzureIoTClient 16:deba40344375 148 STRING_TOKENIZER_destroy(tokenizer2);
AzureIoTClient 16:deba40344375 149 break;
AzureIoTClient 16:deba40344375 150 }
AzureIoTClient 16:deba40344375 151 else
AzureIoTClient 16:deba40344375 152 {
AzureIoTClient 16:deba40344375 153 config->iotHubName = STRING_c_str(hostNameString);
AzureIoTClient 16:deba40344375 154 if (STRING_TOKENIZER_get_next_token(tokenizer2, hostSuffixString, ";") != 0)
AzureIoTClient 16:deba40344375 155 {
AzureIoTClient 39:2719651a5bee 156 LogError("Tokenizer error");
AzureIoTClient 16:deba40344375 157 STRING_TOKENIZER_destroy(tokenizer2);
AzureIoTClient 16:deba40344375 158 break;
AzureIoTClient 16:deba40344375 159 }
AzureIoTClient 16:deba40344375 160 else
AzureIoTClient 16:deba40344375 161 {
AzureIoTClient 16:deba40344375 162 config->iotHubSuffix = STRING_c_str(hostSuffixString);
AzureIoTClient 16:deba40344375 163 }
AzureIoTClient 16:deba40344375 164 }
AzureIoTClient 16:deba40344375 165 STRING_TOKENIZER_destroy(tokenizer2);
AzureIoTClient 16:deba40344375 166 }
AzureIoTClient 16:deba40344375 167 }
AzureIoTClient 16:deba40344375 168 else if (strcmp(s_token, DEVICEID_TOKEN) == 0)
AzureIoTClient 16:deba40344375 169 {
AzureIoTClient 16:deba40344375 170 deviceIdString = STRING_clone(valueString);
AzureIoTClient 16:deba40344375 171 if (deviceIdString != NULL)
AzureIoTClient 16:deba40344375 172 {
AzureIoTClient 16:deba40344375 173 config->deviceId = STRING_c_str(deviceIdString);
AzureIoTClient 16:deba40344375 174 }
AzureIoTClient 16:deba40344375 175 }
AzureIoTClient 16:deba40344375 176 else if (strcmp(s_token, DEVICEKEY_TOKEN) == 0)
AzureIoTClient 16:deba40344375 177 {
AzureIoTClient 16:deba40344375 178 deviceKeyString = STRING_clone(valueString);
AzureIoTClient 16:deba40344375 179 if (deviceKeyString != NULL)
AzureIoTClient 16:deba40344375 180 {
AzureIoTClient 16:deba40344375 181 config->deviceKey = STRING_c_str(deviceKeyString);
AzureIoTClient 16:deba40344375 182 }
AzureIoTClient 16:deba40344375 183 }
AzureIoTClient 31:741eacddf296 184 /* Codes_SRS_IOTHUBCLIENT_LL_04_001: [IoTHubClient_LL_CreateFromConnectionString shall verify the existence of key/value pair GatewayHostName. If it does exist it shall pass the value to IoTHubClient_LL_Create API.] */
AzureIoTClient 16:deba40344375 185 else if (strcmp(s_token, PROTOCOL_GATEWAY_HOST) == 0)
AzureIoTClient 16:deba40344375 186 {
AzureIoTClient 16:deba40344375 187 protocolGateway = STRING_clone(valueString);
AzureIoTClient 16:deba40344375 188 if (protocolGateway != NULL)
AzureIoTClient 16:deba40344375 189 {
AzureIoTClient 16:deba40344375 190 config->protocolGatewayHostName = STRING_c_str(protocolGateway);
AzureIoTClient 16:deba40344375 191 }
AzureIoTClient 16:deba40344375 192 }
AzureIoTClient 16:deba40344375 193 }
AzureIoTClient 16:deba40344375 194 }
AzureIoTClient 16:deba40344375 195 }
AzureIoTClient 16:deba40344375 196 /* parsing is done - check the result */
AzureIoTClient 16:deba40344375 197 if (config->iotHubName == NULL)
AzureIoTClient 16:deba40344375 198 {
AzureIoTClient 39:2719651a5bee 199 LogError("iotHubName is not found");
AzureIoTClient 16:deba40344375 200 }
AzureIoTClient 16:deba40344375 201 else if (config->iotHubSuffix == NULL)
AzureIoTClient 16:deba40344375 202 {
AzureIoTClient 39:2719651a5bee 203 LogError("iotHubSuffix is not found");
AzureIoTClient 16:deba40344375 204 }
AzureIoTClient 16:deba40344375 205 else if (config->deviceId == NULL)
AzureIoTClient 16:deba40344375 206 {
AzureIoTClient 39:2719651a5bee 207 LogError("deviceId is not found");
AzureIoTClient 16:deba40344375 208 }
AzureIoTClient 16:deba40344375 209 else if (config->deviceKey == NULL)
AzureIoTClient 16:deba40344375 210 {
AzureIoTClient 39:2719651a5bee 211 LogError("deviceId is not found");
AzureIoTClient 16:deba40344375 212 }
AzureIoTClient 16:deba40344375 213 else
AzureIoTClient 16:deba40344375 214 {
AzureIoTClient 16:deba40344375 215 /* SRS_IOTHUBCLIENT_LL_12_011: [IoTHubClient_LL_CreateFromConnectionString shall call into the IoTHubClient_LL_Create API with the current structure and returns with the return value of it] */
AzureIoTClient 16:deba40344375 216 result = IoTHubClient_LL_Create(config);
AzureIoTClient 16:deba40344375 217 if (result == NULL)
AzureIoTClient 16:deba40344375 218 {
AzureIoTClient 39:2719651a5bee 219 LogError("IoTHubClient_LL_Create failed");
AzureIoTClient 16:deba40344375 220 }
AzureIoTClient 16:deba40344375 221 }
AzureIoTClient 16:deba40344375 222 }
AzureIoTClient 16:deba40344375 223 if (deviceKeyString != NULL)
AzureIoTClient 16:deba40344375 224 STRING_delete(deviceKeyString);
AzureIoTClient 16:deba40344375 225 if (deviceIdString != NULL)
AzureIoTClient 16:deba40344375 226 STRING_delete(deviceIdString);
AzureIoTClient 16:deba40344375 227 if (hostSuffixString != NULL)
AzureIoTClient 16:deba40344375 228 STRING_delete(hostSuffixString);
AzureIoTClient 16:deba40344375 229 if (hostNameString != NULL)
AzureIoTClient 16:deba40344375 230 STRING_delete(hostNameString);
AzureIoTClient 16:deba40344375 231 if (valueString != NULL)
AzureIoTClient 16:deba40344375 232 STRING_delete(valueString);
AzureIoTClient 16:deba40344375 233 if (tokenString != NULL)
AzureIoTClient 16:deba40344375 234 STRING_delete(tokenString);
AzureIoTClient 16:deba40344375 235 if (connString != NULL)
AzureIoTClient 16:deba40344375 236 STRING_delete(connString);
AzureIoTClient 16:deba40344375 237 if (protocolGateway != NULL)
AzureIoTClient 16:deba40344375 238 STRING_delete(protocolGateway);
AzureIoTClient 16:deba40344375 239
AzureIoTClient 16:deba40344375 240 if (tokenizer1 != NULL)
AzureIoTClient 16:deba40344375 241 STRING_TOKENIZER_destroy(tokenizer1);
AzureIoTClient 16:deba40344375 242
AzureIoTClient 16:deba40344375 243 free(config);
AzureIoTClient 16:deba40344375 244 }
AzureIoTClient 16:deba40344375 245 }
AzureIoTClient 16:deba40344375 246 return result;
AzureIoTClient 16:deba40344375 247 }
AzureIoTClient 16:deba40344375 248
Azure.IoT Build 36:67300d5a4c1f 249 static void setTransportProtocol(IOTHUB_CLIENT_LL_HANDLE_DATA* handleData, TRANSPORT_PROVIDER* protocol)
Azure.IoT Build 36:67300d5a4c1f 250 {
Azure.IoT Build 36:67300d5a4c1f 251 handleData->IoTHubTransport_SetOption = protocol->IoTHubTransport_SetOption;
Azure.IoT Build 36:67300d5a4c1f 252 handleData->IoTHubTransport_Create = protocol->IoTHubTransport_Create;
Azure.IoT Build 36:67300d5a4c1f 253 handleData->IoTHubTransport_Destroy = protocol->IoTHubTransport_Destroy;
Azure.IoT Build 36:67300d5a4c1f 254 handleData->IoTHubTransport_Register = protocol->IoTHubTransport_Register;
Azure.IoT Build 36:67300d5a4c1f 255 handleData->IoTHubTransport_Unregister = protocol->IoTHubTransport_Unregister;
Azure.IoT Build 36:67300d5a4c1f 256 handleData->IoTHubTransport_Subscribe = protocol->IoTHubTransport_Subscribe;
Azure.IoT Build 36:67300d5a4c1f 257 handleData->IoTHubTransport_Unsubscribe = protocol->IoTHubTransport_Unsubscribe;
Azure.IoT Build 36:67300d5a4c1f 258 handleData->IoTHubTransport_DoWork = protocol->IoTHubTransport_DoWork;
Azure.IoT Build 36:67300d5a4c1f 259 handleData->IoTHubTransport_GetSendStatus = protocol->IoTHubTransport_GetSendStatus;
Azure.IoT Build 36:67300d5a4c1f 260
Azure.IoT Build 36:67300d5a4c1f 261 }
AzureIoTClient 16:deba40344375 262
AzureIoTClient 16:deba40344375 263 IOTHUB_CLIENT_LL_HANDLE IoTHubClient_LL_Create(const IOTHUB_CLIENT_CONFIG* config)
AzureIoTClient 16:deba40344375 264 {
AzureIoTClient 16:deba40344375 265 IOTHUB_CLIENT_LL_HANDLE result;
AzureIoTClient 16:deba40344375 266 /*Codes_SRS_IOTHUBCLIENT_LL_02_001: [IoTHubClient_LL_Create shall return NULL if config parameter is NULL or protocol field is NULL.]*/
AzureIoTClient 16:deba40344375 267 if (
AzureIoTClient 16:deba40344375 268 (config == NULL) ||
AzureIoTClient 16:deba40344375 269 (config->protocol == NULL)
AzureIoTClient 16:deba40344375 270 )
AzureIoTClient 16:deba40344375 271 {
AzureIoTClient 16:deba40344375 272 result = NULL;
AzureIoTClient 39:2719651a5bee 273 LogError("invalid configuration (NULL detected)");
AzureIoTClient 16:deba40344375 274 }
AzureIoTClient 16:deba40344375 275 else
AzureIoTClient 16:deba40344375 276 {
AzureIoTClient 16:deba40344375 277 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)malloc(sizeof(IOTHUB_CLIENT_LL_HANDLE_DATA));
AzureIoTClient 16:deba40344375 278 if (handleData == NULL)
AzureIoTClient 16:deba40344375 279 {
AzureIoTClient 39:2719651a5bee 280 LogError("malloc failed");
AzureIoTClient 16:deba40344375 281 result = NULL;
AzureIoTClient 16:deba40344375 282 }
AzureIoTClient 16:deba40344375 283 else
AzureIoTClient 16:deba40344375 284 {
Azure.IoT Build 36:67300d5a4c1f 285 if ((handleData->tickCounter = tickcounter_create()) == NULL)
Azure.IoT Build 36:67300d5a4c1f 286 {
Azure.IoT Build 36:67300d5a4c1f 287 LogError("unable to get a tickcounter");
Azure.IoT Build 36:67300d5a4c1f 288 free(handleData);
Azure.IoT Build 36:67300d5a4c1f 289 result = NULL;
Azure.IoT Build 36:67300d5a4c1f 290 }
Azure.IoT Build 36:67300d5a4c1f 291 else
Azure.IoT Build 36:67300d5a4c1f 292 {
AzureIoTClient 16:deba40344375 293 /*Codes_SRS_IOTHUBCLIENT_LL_02_004: [Otherwise IoTHubClient_LL_Create shall initialize a new DLIST (further called "waitingToSend") containing records with fields of the following types: IOTHUB_MESSAGE_HANDLE, IOTHUB_CLIENT_EVENT_CONFIRMATION_CALLBACK, void*.]*/
AzureIoTClient 16:deba40344375 294 IOTHUBTRANSPORT_CONFIG lowerLayerConfig;
AzureIoTClient 16:deba40344375 295 DList_InitializeListHead(&(handleData->waitingToSend));
Azure.IoT Build 36:67300d5a4c1f 296 setTransportProtocol(handleData, (TRANSPORT_PROVIDER*)config->protocol());
AzureIoTClient 16:deba40344375 297 handleData->messageCallback = NULL;
AzureIoTClient 16:deba40344375 298 handleData->messageUserContextCallback = NULL;
AzureIoTClient 16:deba40344375 299 handleData->lastMessageReceiveTime = INDEFINITE_TIME;
AzureIoTClient 16:deba40344375 300 /*Codes_SRS_IOTHUBCLIENT_LL_02_006: [IoTHubClient_LL_Create shall populate a structure of type IOTHUBTRANSPORT_CONFIG with the information from config parameter and the previous DLIST and shall pass that to the underlying layer _Create function.]*/
AzureIoTClient 16:deba40344375 301 lowerLayerConfig.upperConfig = config;
AzureIoTClient 16:deba40344375 302 lowerLayerConfig.waitingToSend = &(handleData->waitingToSend);
AzureIoTClient 16:deba40344375 303 /*Codes_SRS_IOTHUBCLIENT_LL_02_007: [If the underlaying layer _Create function fails them IoTHubClient_LL_Create shall fail and return NULL.] */
AzureIoTClient 16:deba40344375 304 if ((handleData->transportHandle = handleData->IoTHubTransport_Create(&lowerLayerConfig)) == NULL)
AzureIoTClient 16:deba40344375 305 {
AzureIoTClient 39:2719651a5bee 306 LogError("underlying transport failed");
Azure.IoT Build 36:67300d5a4c1f 307 tickcounter_destroy(handleData->tickCounter);
AzureIoTClient 16:deba40344375 308 free(handleData);
AzureIoTClient 16:deba40344375 309 result = NULL;
AzureIoTClient 16:deba40344375 310 }
AzureIoTClient 16:deba40344375 311 else
AzureIoTClient 16:deba40344375 312 {
Azure.IoT Build 36:67300d5a4c1f 313 /*Codes_SRS_IOTHUBCLIENT_LL_17_008: [IoTHubClient_LL_Create shall call the transport _Register function with the deviceId, DeviceKey and waitingToSend list.] */
Azure.IoT Build 36:67300d5a4c1f 314 if ((handleData->deviceHandle = handleData->IoTHubTransport_Register(handleData->transportHandle, config->deviceId, config->deviceKey, handleData, &(handleData->waitingToSend))) == NULL)
Azure.IoT Build 36:67300d5a4c1f 315 {
Azure.IoT Build 36:67300d5a4c1f 316 /*Codes_SRS_IOTHUBCLIENT_LL_17_009: [If the _Register function fails, this function shall fail and return NULL.]*/
Azure.IoT Build 36:67300d5a4c1f 317 LogError("Registering device in transport failed");
Azure.IoT Build 36:67300d5a4c1f 318 handleData->IoTHubTransport_Destroy(handleData->transportHandle);
Azure.IoT Build 36:67300d5a4c1f 319 tickcounter_destroy(handleData->tickCounter);
Azure.IoT Build 36:67300d5a4c1f 320 free(handleData);
Azure.IoT Build 36:67300d5a4c1f 321 result = NULL;
Azure.IoT Build 36:67300d5a4c1f 322 }
Azure.IoT Build 36:67300d5a4c1f 323 else
Azure.IoT Build 36:67300d5a4c1f 324 {
Azure.IoT Build 36:67300d5a4c1f 325 /*Codes_SRS_IOTHUBCLIENT_LL_02_008: [Otherwise, IoTHubClient_LL_Create shall succeed and return a non-NULL handle.] */
Azure.IoT Build 36:67300d5a4c1f 326 handleData->isSharedTransport = false;
Azure.IoT Build 36:67300d5a4c1f 327 /*Codes_SRS_IOTHUBCLIENT_LL_02_042: [ By default, messages shall not timeout. ]*/
Azure.IoT Build 36:67300d5a4c1f 328 handleData->currentMessageTimeout = 0;
Azure.IoT Build 36:67300d5a4c1f 329 result = handleData;
Azure.IoT Build 36:67300d5a4c1f 330 }
AzureIoTClient 16:deba40344375 331 }
AzureIoTClient 16:deba40344375 332 }
AzureIoTClient 16:deba40344375 333 }
Azure.IoT Build 36:67300d5a4c1f 334 }
AzureIoTClient 16:deba40344375 335
AzureIoTClient 16:deba40344375 336 return result;
AzureIoTClient 16:deba40344375 337 }
AzureIoTClient 16:deba40344375 338
Azure.IoT Build 36:67300d5a4c1f 339 IOTHUB_CLIENT_LL_HANDLE IoTHubClient_LL_CreateWithTransport(const IOTHUB_CLIENT_DEVICE_CONFIG * config)
Azure.IoT Build 36:67300d5a4c1f 340 {
Azure.IoT Build 36:67300d5a4c1f 341 IOTHUB_CLIENT_LL_HANDLE result;
Azure.IoT Build 36:67300d5a4c1f 342 /*Codes_SRS_IOTHUBCLIENT_LL_17_001: [IoTHubClient_LL_CreateWithTransport shall return NULL if config parameter is NULL, or protocol field is NULL or transportHandle is NULL.]*/
Azure.IoT Build 36:67300d5a4c1f 343 if (
Azure.IoT Build 36:67300d5a4c1f 344 (config == NULL) ||
Azure.IoT Build 36:67300d5a4c1f 345 (config->protocol == NULL) ||
Azure.IoT Build 36:67300d5a4c1f 346 (config->transportHandle == NULL)
Azure.IoT Build 36:67300d5a4c1f 347 )
Azure.IoT Build 36:67300d5a4c1f 348 {
Azure.IoT Build 36:67300d5a4c1f 349 result = NULL;
AzureIoTClient 39:2719651a5bee 350 LogError("invalid configuration (NULL detected)");
Azure.IoT Build 36:67300d5a4c1f 351 }
Azure.IoT Build 36:67300d5a4c1f 352 else
Azure.IoT Build 36:67300d5a4c1f 353 {
Azure.IoT Build 36:67300d5a4c1f 354 /*Codes_SRS_IOTHUBCLIENT_LL_17_002: [IoTHubClient_LL_CreateWithTransport shall allocate data for the IOTHUB_CLIENT_LL_HANDLE.]*/
Azure.IoT Build 36:67300d5a4c1f 355 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)malloc(sizeof(IOTHUB_CLIENT_LL_HANDLE_DATA));
Azure.IoT Build 36:67300d5a4c1f 356 if (handleData == NULL)
Azure.IoT Build 36:67300d5a4c1f 357 {
Azure.IoT Build 36:67300d5a4c1f 358 /*Codes_SRS_IOTHUBCLIENT_LL_17_003: [If allocation fails, the function shall fail and return NULL.] */
AzureIoTClient 39:2719651a5bee 359 LogError("malloc failed");
Azure.IoT Build 36:67300d5a4c1f 360 result = NULL;
Azure.IoT Build 36:67300d5a4c1f 361 }
Azure.IoT Build 36:67300d5a4c1f 362 else
Azure.IoT Build 36:67300d5a4c1f 363 {
Azure.IoT Build 36:67300d5a4c1f 364 if ((handleData->tickCounter = tickcounter_create()) == NULL)
Azure.IoT Build 36:67300d5a4c1f 365 {
Azure.IoT Build 36:67300d5a4c1f 366 LogError("unable to get a tickcounter");
Azure.IoT Build 36:67300d5a4c1f 367 free(handleData);
Azure.IoT Build 36:67300d5a4c1f 368 result = NULL;
Azure.IoT Build 36:67300d5a4c1f 369 }
Azure.IoT Build 36:67300d5a4c1f 370 else
Azure.IoT Build 36:67300d5a4c1f 371 {
Azure.IoT Build 36:67300d5a4c1f 372 /*Codes_SRS_IOTHUBCLIENT_LL_17_004: [IoTHubClient_LL_CreateWithTransport shall initialize a new DLIST (further called "waitingToSend") containing records with fields of the following types: IOTHUB_MESSAGE_HANDLE, IOTHUB_CLIENT_EVENT_CONFIRMATION_CALLBACK, void*.]*/
Azure.IoT Build 36:67300d5a4c1f 373 DList_InitializeListHead(&(handleData->waitingToSend));
Azure.IoT Build 36:67300d5a4c1f 374 setTransportProtocol(handleData, (TRANSPORT_PROVIDER*)config->protocol());
Azure.IoT Build 36:67300d5a4c1f 375 handleData->messageCallback = NULL;
Azure.IoT Build 36:67300d5a4c1f 376 handleData->messageUserContextCallback = NULL;
Azure.IoT Build 36:67300d5a4c1f 377 handleData->lastMessageReceiveTime = INDEFINITE_TIME;
Azure.IoT Build 36:67300d5a4c1f 378 handleData->transportHandle = config->transportHandle;
Azure.IoT Build 36:67300d5a4c1f 379 /*Codes_SRS_IOTHUBCLIENT_LL_17_006: [IoTHubClient_LL_CreateWithTransport shall call the transport _Register function with the deviceId, DeviceKey and waitingToSend list.]*/
Azure.IoT Build 36:67300d5a4c1f 380 if ((handleData->deviceHandle = handleData->IoTHubTransport_Register(config->transportHandle, config->deviceId, config->deviceKey, handleData, &(handleData->waitingToSend))) == NULL)
Azure.IoT Build 36:67300d5a4c1f 381 {
Azure.IoT Build 36:67300d5a4c1f 382 /*Codes_SRS_IOTHUBCLIENT_LL_17_007: [If the _Register function fails, this function shall fail and return NULL.]*/
Azure.IoT Build 36:67300d5a4c1f 383 LogError("Registering device in transport failed");
Azure.IoT Build 36:67300d5a4c1f 384 tickcounter_destroy(handleData->tickCounter);
Azure.IoT Build 36:67300d5a4c1f 385 free(handleData);
Azure.IoT Build 36:67300d5a4c1f 386 result = NULL;
Azure.IoT Build 36:67300d5a4c1f 387 }
Azure.IoT Build 36:67300d5a4c1f 388 else
Azure.IoT Build 36:67300d5a4c1f 389 {
Azure.IoT Build 36:67300d5a4c1f 390 /*Codes_SRS_IOTHUBCLIENT_LL_17_005: [IoTHubClient_LL_CreateWithTransport shall save the transport handle and mark this transport as shared.]*/
Azure.IoT Build 36:67300d5a4c1f 391 handleData->isSharedTransport = true;
Azure.IoT Build 36:67300d5a4c1f 392 /*Codes_SRS_IOTHUBCLIENT_LL_02_042: [ By default, messages shall not timeout. ]*/
Azure.IoT Build 36:67300d5a4c1f 393 handleData->currentMessageTimeout = 0;
Azure.IoT Build 36:67300d5a4c1f 394 result = handleData;
Azure.IoT Build 36:67300d5a4c1f 395 }
Azure.IoT Build 36:67300d5a4c1f 396 }
Azure.IoT Build 36:67300d5a4c1f 397 }
Azure.IoT Build 36:67300d5a4c1f 398 }
Azure.IoT Build 36:67300d5a4c1f 399
Azure.IoT Build 36:67300d5a4c1f 400 return result;
Azure.IoT Build 36:67300d5a4c1f 401 }
Azure.IoT Build 36:67300d5a4c1f 402
AzureIoTClient 16:deba40344375 403 void IoTHubClient_LL_Destroy(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle)
AzureIoTClient 16:deba40344375 404 {
AzureIoTClient 16:deba40344375 405 /*Codes_SRS_IOTHUBCLIENT_LL_02_009: [IoTHubClient_LL_Destroy shall do nothing if parameter iotHubClientHandle is NULL.]*/
AzureIoTClient 16:deba40344375 406 if (iotHubClientHandle != NULL)
AzureIoTClient 16:deba40344375 407 {
AzureIoTClient 16:deba40344375 408 PDLIST_ENTRY unsend;
Azure.IoT Build 36:67300d5a4c1f 409 /*Codes_SRS_IOTHUBCLIENT_LL_17_010: [IoTHubClient_LL_Destroy shall call the underlaying layer's _Unregister function] */
AzureIoTClient 16:deba40344375 410 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle;
Azure.IoT Build 36:67300d5a4c1f 411 handleData->IoTHubTransport_Unregister(handleData->deviceHandle);
Azure.IoT Build 36:67300d5a4c1f 412 if (handleData->isSharedTransport == false)
Azure.IoT Build 36:67300d5a4c1f 413 {
Azure.IoT Build 36:67300d5a4c1f 414 /*Codes_SRS_IOTHUBCLIENT_LL_02_010: [If iotHubClientHandle was not created by IoTHubClient_LL_CreateWithTransport, IoTHubClient_LL_Destroy shall call the underlaying layer's _Destroy function.] */
Azure.IoT Build 36:67300d5a4c1f 415 handleData->IoTHubTransport_Destroy(handleData->transportHandle);
Azure.IoT Build 36:67300d5a4c1f 416 }
AzureIoTClient 16:deba40344375 417 /*if any, remove the items currently not send*/
AzureIoTClient 16:deba40344375 418 while ((unsend = DList_RemoveHeadList(&(handleData->waitingToSend))) != &(handleData->waitingToSend))
AzureIoTClient 16:deba40344375 419 {
AzureIoTClient 16:deba40344375 420 IOTHUB_MESSAGE_LIST* temp = containingRecord(unsend, IOTHUB_MESSAGE_LIST, entry);
AzureIoTClient 16:deba40344375 421 /*Codes_SRS_IOTHUBCLIENT_LL_02_033: [Otherwise, IoTHubClient_LL_Destroy shall complete all the event message callbacks that are in the waitingToSend list with the result IOTHUB_CLIENT_CONFIRMATION_BECAUSE_DESTROY.] */
AzureIoTClient 16:deba40344375 422 if (temp->callback != NULL)
AzureIoTClient 16:deba40344375 423 {
AzureIoTClient 16:deba40344375 424 temp->callback(IOTHUB_CLIENT_CONFIRMATION_BECAUSE_DESTROY, temp->context);
AzureIoTClient 16:deba40344375 425 }
AzureIoTClient 16:deba40344375 426 IoTHubMessage_Destroy(temp->messageHandle);
AzureIoTClient 16:deba40344375 427 free(temp);
AzureIoTClient 16:deba40344375 428 }
Azure.IoT Build 36:67300d5a4c1f 429 /*Codes_SRS_IOTHUBCLIENT_LL_17_011: [IoTHubClient_LL_Destroy shall free the resources allocated by IoTHubClient (if any).] */
Azure.IoT Build 36:67300d5a4c1f 430 tickcounter_destroy(handleData->tickCounter);
AzureIoTClient 16:deba40344375 431 free(handleData);
AzureIoTClient 16:deba40344375 432 }
AzureIoTClient 16:deba40344375 433 }
AzureIoTClient 16:deba40344375 434
Azure.IoT Build 36:67300d5a4c1f 435 /*Codes_SRS_IOTHUBCLIENT_LL_02_044: [ Messages already delivered to IoTHubClient_LL shall not have their timeouts modified by a new call to IoTHubClient_LL_SetOption. ]*/
Azure.IoT Build 36:67300d5a4c1f 436 /*returns 0 on success, any other value is error*/
Azure.IoT Build 36:67300d5a4c1f 437 static int attach_ms_timesOutAfter(IOTHUB_CLIENT_LL_HANDLE_DATA* handleData, IOTHUB_MESSAGE_LIST *newEntry)
Azure.IoT Build 36:67300d5a4c1f 438 {
Azure.IoT Build 36:67300d5a4c1f 439 int result;
Azure.IoT Build 36:67300d5a4c1f 440 /*Codes_SRS_IOTHUBCLIENT_LL_02_043: [ Calling IoTHubClient_LL_SetOption with value set to "0" shall disable the timeout mechanism for all new messages. ]*/
Azure.IoT Build 36:67300d5a4c1f 441 if (handleData->currentMessageTimeout == 0)
Azure.IoT Build 36:67300d5a4c1f 442 {
Azure.IoT Build 36:67300d5a4c1f 443 newEntry->ms_timesOutAfter = 0; /*do not timeout*/
Azure.IoT Build 36:67300d5a4c1f 444 result = 0;
Azure.IoT Build 36:67300d5a4c1f 445 }
Azure.IoT Build 36:67300d5a4c1f 446 else
Azure.IoT Build 36:67300d5a4c1f 447 {
Azure.IoT Build 36:67300d5a4c1f 448 /*Codes_SRS_IOTHUBCLIENT_LL_02_039: [ "messageTimeout" - once IoTHubClient_LL_SendEventAsync is called the message shall timeout after value miliseconds. Value is a pointer to a uint64. ]*/
Azure.IoT Build 36:67300d5a4c1f 449 if (tickcounter_get_current_ms(handleData->tickCounter, &newEntry->ms_timesOutAfter) != 0)
Azure.IoT Build 36:67300d5a4c1f 450 {
Azure.IoT Build 36:67300d5a4c1f 451 result = __LINE__;
Azure.IoT Build 36:67300d5a4c1f 452 LogError("unable to get the current relative tickcount");
Azure.IoT Build 36:67300d5a4c1f 453 }
Azure.IoT Build 36:67300d5a4c1f 454 else
Azure.IoT Build 36:67300d5a4c1f 455 {
Azure.IoT Build 36:67300d5a4c1f 456 newEntry->ms_timesOutAfter += handleData->currentMessageTimeout;
Azure.IoT Build 36:67300d5a4c1f 457 result = 0;
Azure.IoT Build 36:67300d5a4c1f 458 }
Azure.IoT Build 36:67300d5a4c1f 459 }
Azure.IoT Build 36:67300d5a4c1f 460 return result;
Azure.IoT Build 36:67300d5a4c1f 461 }
Azure.IoT Build 36:67300d5a4c1f 462
AzureIoTClient 16:deba40344375 463 IOTHUB_CLIENT_RESULT IoTHubClient_LL_SendEventAsync(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, IOTHUB_MESSAGE_HANDLE eventMessageHandle, IOTHUB_CLIENT_EVENT_CONFIRMATION_CALLBACK eventConfirmationCallback, void* userContextCallback)
AzureIoTClient 16:deba40344375 464 {
AzureIoTClient 16:deba40344375 465 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 16:deba40344375 466 /*Codes_SRS_IOTHUBCLIENT_LL_02_011: [IoTHubClient_LL_SendEventAsync shall fail and return IOTHUB_CLIENT_INVALID_ARG if parameter iotHubClientHandle or eventMessageHandle is NULL.]*/
AzureIoTClient 16:deba40344375 467 if (
AzureIoTClient 16:deba40344375 468 (iotHubClientHandle == NULL) ||
AzureIoTClient 16:deba40344375 469 (eventMessageHandle == NULL) ||
AzureIoTClient 16:deba40344375 470 /*Codes_SRS_IOTHUBCLIENT_LL_02_012: [IoTHubClient_LL_SendEventAsync shall fail and return IOTHUB_CLIENT_INVALID_ARG if parameter eventConfirmationCallback is NULL and userContextCallback is not NULL.] */
AzureIoTClient 16:deba40344375 471 ((eventConfirmationCallback == NULL) && (userContextCallback != NULL))
AzureIoTClient 16:deba40344375 472 )
AzureIoTClient 16:deba40344375 473 {
AzureIoTClient 16:deba40344375 474 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 16:deba40344375 475 LOG_ERROR;
AzureIoTClient 16:deba40344375 476 }
AzureIoTClient 16:deba40344375 477 else
AzureIoTClient 16:deba40344375 478 {
AzureIoTClient 16:deba40344375 479 IOTHUB_MESSAGE_LIST *newEntry = (IOTHUB_MESSAGE_LIST*)malloc(sizeof(IOTHUB_MESSAGE_LIST));
AzureIoTClient 16:deba40344375 480 if (newEntry == NULL)
AzureIoTClient 16:deba40344375 481 {
AzureIoTClient 16:deba40344375 482 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 16:deba40344375 483 LOG_ERROR;
AzureIoTClient 16:deba40344375 484 }
AzureIoTClient 16:deba40344375 485 else
AzureIoTClient 16:deba40344375 486 {
Azure.IoT Build 36:67300d5a4c1f 487 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle;
Azure.IoT Build 36:67300d5a4c1f 488
Azure.IoT Build 36:67300d5a4c1f 489 if (attach_ms_timesOutAfter(handleData, newEntry) != 0)
Azure.IoT Build 36:67300d5a4c1f 490 {
Azure.IoT Build 36:67300d5a4c1f 491 result = IOTHUB_CLIENT_ERROR;
Azure.IoT Build 36:67300d5a4c1f 492 LOG_ERROR;
Azure.IoT Build 36:67300d5a4c1f 493 free(newEntry);
Azure.IoT Build 36:67300d5a4c1f 494 }
Azure.IoT Build 36:67300d5a4c1f 495 else
Azure.IoT Build 36:67300d5a4c1f 496 {
AzureIoTClient 16:deba40344375 497 /*Codes_SRS_IOTHUBCLIENT_LL_02_013: [IoTHubClient_SendEventAsync shall add the DLIST waitingToSend a new record cloning the information from eventMessageHandle, eventConfirmationCallback, userContextCallback.]*/
AzureIoTClient 16:deba40344375 498 if ((newEntry->messageHandle = IoTHubMessage_Clone(eventMessageHandle)) == NULL)
AzureIoTClient 16:deba40344375 499 {
AzureIoTClient 16:deba40344375 500 /*Codes_SRS_IOTHUBCLIENT_LL_02_014: [If cloning and/or adding the information fails for any reason, IoTHubClient_LL_SendEventAsync shall fail and return IOTHUB_CLIENT_ERROR.] */
AzureIoTClient 16:deba40344375 501 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 16:deba40344375 502 free(newEntry);
AzureIoTClient 16:deba40344375 503 LOG_ERROR;
AzureIoTClient 16:deba40344375 504 }
AzureIoTClient 16:deba40344375 505 else
AzureIoTClient 16:deba40344375 506 {
AzureIoTClient 16:deba40344375 507 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle;
AzureIoTClient 16:deba40344375 508 /*Codes_SRS_IOTHUBCLIENT_LL_02_013: [IoTHubClient_SendEventAsync shall add the DLIST waitingToSend a new record cloning the information from eventMessageHandle, eventConfirmationCallback, userContextCallback.]*/
AzureIoTClient 16:deba40344375 509 newEntry->callback = eventConfirmationCallback;
AzureIoTClient 16:deba40344375 510 newEntry->context = userContextCallback;
AzureIoTClient 16:deba40344375 511 DList_InsertTailList(&(handleData->waitingToSend), &(newEntry->entry));
AzureIoTClient 16:deba40344375 512 /*Codes_SRS_IOTHUBCLIENT_LL_02_015: [Otherwise IoTHubClient_LL_SendEventAsync shall succeed and return IOTHUB_CLIENT_OK.] */
AzureIoTClient 16:deba40344375 513 result = IOTHUB_CLIENT_OK;
AzureIoTClient 16:deba40344375 514 }
AzureIoTClient 16:deba40344375 515 }
AzureIoTClient 16:deba40344375 516 }
Azure.IoT Build 36:67300d5a4c1f 517 }
AzureIoTClient 16:deba40344375 518 return result;
AzureIoTClient 16:deba40344375 519 }
AzureIoTClient 16:deba40344375 520
AzureIoTClient 16:deba40344375 521 IOTHUB_CLIENT_RESULT IoTHubClient_LL_SetMessageCallback(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, IOTHUB_CLIENT_MESSAGE_CALLBACK_ASYNC messageCallback, void* userContextCallback)
AzureIoTClient 16:deba40344375 522 {
AzureIoTClient 16:deba40344375 523 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 16:deba40344375 524 /*Codes_SRS_IOTHUBCLIENT_LL_02_016: [IoTHubClient_LL_SetMessageCallback shall fail and return IOTHUB_CLIENT_INVALID_ARG if parameter iotHubClientHandle is NULL.] */
AzureIoTClient 16:deba40344375 525 if (iotHubClientHandle == NULL)
AzureIoTClient 16:deba40344375 526 {
AzureIoTClient 16:deba40344375 527 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 16:deba40344375 528 LOG_ERROR;
AzureIoTClient 16:deba40344375 529 }
AzureIoTClient 16:deba40344375 530 else
AzureIoTClient 16:deba40344375 531 {
AzureIoTClient 16:deba40344375 532 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle;
AzureIoTClient 16:deba40344375 533 if (messageCallback == NULL)
AzureIoTClient 16:deba40344375 534 {
AzureIoTClient 16:deba40344375 535 /*Codes_SRS_IOTHUBCLIENT_LL_02_019: [If parameter messageCallback is NULL then IoTHubClient_LL_SetMessageCallback shall call the underlying layer's _Unsubscribe function and return IOTHUB_CLIENT_OK.] */
Azure.IoT Build 36:67300d5a4c1f 536 handleData->IoTHubTransport_Unsubscribe(handleData->deviceHandle);
AzureIoTClient 16:deba40344375 537 handleData->messageCallback = NULL;
AzureIoTClient 16:deba40344375 538 handleData->messageUserContextCallback = NULL;
AzureIoTClient 16:deba40344375 539 result = IOTHUB_CLIENT_OK;
AzureIoTClient 16:deba40344375 540 }
AzureIoTClient 16:deba40344375 541 else
AzureIoTClient 16:deba40344375 542 {
AzureIoTClient 16:deba40344375 543 /*Codes_SRS_IOTHUBCLIENT_LL_02_017: [If parameter messageCallback is non-NULL then IoTHubClient_LL_SetMessageCallback shall call the underlying layer's _Subscribe function.]*/
Azure.IoT Build 36:67300d5a4c1f 544 if (handleData->IoTHubTransport_Subscribe(handleData->deviceHandle) == 0)
AzureIoTClient 16:deba40344375 545 {
AzureIoTClient 16:deba40344375 546 handleData->messageCallback = messageCallback;
AzureIoTClient 16:deba40344375 547 handleData->messageUserContextCallback = userContextCallback;
AzureIoTClient 16:deba40344375 548 result = IOTHUB_CLIENT_OK;
AzureIoTClient 16:deba40344375 549 }
AzureIoTClient 16:deba40344375 550 else
AzureIoTClient 16:deba40344375 551 {
AzureIoTClient 16:deba40344375 552 handleData->messageCallback = NULL;
AzureIoTClient 16:deba40344375 553 handleData->messageUserContextCallback = NULL;
AzureIoTClient 16:deba40344375 554 /*Codes_SRS_IOTHUBCLIENT_LL_02_018: [If the underlying layer's _Subscribe function fails, then IoTHubClient_LL_SetMessageCallback shall fail and return IOTHUB_CLIENT_ERROR. Otherwise IoTHubClient_LL_SetMessageCallback shall succeed and return IOTHUB_CLIENT_OK.]*/
AzureIoTClient 16:deba40344375 555 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 16:deba40344375 556 }
AzureIoTClient 16:deba40344375 557 }
AzureIoTClient 16:deba40344375 558 }
AzureIoTClient 16:deba40344375 559
AzureIoTClient 16:deba40344375 560 return result;
AzureIoTClient 16:deba40344375 561 }
AzureIoTClient 16:deba40344375 562
Azure.IoT Build 36:67300d5a4c1f 563 static void DoTimeouts(IOTHUB_CLIENT_LL_HANDLE_DATA* handleData)
Azure.IoT Build 36:67300d5a4c1f 564 {
Azure.IoT Build 36:67300d5a4c1f 565 uint64_t nowTick;
Azure.IoT Build 36:67300d5a4c1f 566 if (tickcounter_get_current_ms(handleData->tickCounter, &nowTick) != 0)
Azure.IoT Build 36:67300d5a4c1f 567 {
Azure.IoT Build 36:67300d5a4c1f 568 LogError("unable to get the current ms, timeouts will not be processed");
Azure.IoT Build 36:67300d5a4c1f 569 }
Azure.IoT Build 36:67300d5a4c1f 570 else
Azure.IoT Build 36:67300d5a4c1f 571 {
Azure.IoT Build 36:67300d5a4c1f 572 DLIST_ENTRY* currentItemInWaitingToSend = handleData->waitingToSend.Flink;
Azure.IoT Build 36:67300d5a4c1f 573 while (currentItemInWaitingToSend != &(handleData->waitingToSend)) /*while we are not at the end of the list*/
Azure.IoT Build 36:67300d5a4c1f 574 {
Azure.IoT Build 36:67300d5a4c1f 575 IOTHUB_MESSAGE_LIST* fullEntry = containingRecord(currentItemInWaitingToSend, IOTHUB_MESSAGE_LIST, entry);
Azure.IoT Build 36:67300d5a4c1f 576 /*Codes_SRS_IOTHUBCLIENT_LL_02_041: [ If more than value miliseconds have passed since the call to IoTHubClient_LL_SendEventAsync then the message callback shall be called with a status code of IOTHUB_CLIENT_CONFIRMATION_TIMEOUT. ]*/
Azure.IoT Build 36:67300d5a4c1f 577 if ((fullEntry->ms_timesOutAfter!=0) && (fullEntry->ms_timesOutAfter < nowTick))
Azure.IoT Build 36:67300d5a4c1f 578 {
Azure.IoT Build 36:67300d5a4c1f 579 PDLIST_ENTRY theNext = currentItemInWaitingToSend->Flink; /*need to save the next item, because the below operations are destructive*/
Azure.IoT Build 36:67300d5a4c1f 580 DList_RemoveEntryList(currentItemInWaitingToSend);
Azure.IoT Build 36:67300d5a4c1f 581 if (fullEntry->callback != NULL)
Azure.IoT Build 36:67300d5a4c1f 582 {
Azure.IoT Build 36:67300d5a4c1f 583 fullEntry->callback(IOTHUB_CLIENT_CONFIRMATION_MESSAGE_TIMEOUT, fullEntry->context);
Azure.IoT Build 36:67300d5a4c1f 584 }
Azure.IoT Build 36:67300d5a4c1f 585 IoTHubMessage_Destroy(fullEntry->messageHandle); /*because it has been cloned*/
Azure.IoT Build 36:67300d5a4c1f 586 free(fullEntry);
Azure.IoT Build 36:67300d5a4c1f 587 currentItemInWaitingToSend = theNext;
Azure.IoT Build 36:67300d5a4c1f 588 }
Azure.IoT Build 36:67300d5a4c1f 589 else
Azure.IoT Build 36:67300d5a4c1f 590 {
Azure.IoT Build 36:67300d5a4c1f 591 currentItemInWaitingToSend = currentItemInWaitingToSend->Flink;
Azure.IoT Build 36:67300d5a4c1f 592 }
Azure.IoT Build 36:67300d5a4c1f 593 }
Azure.IoT Build 36:67300d5a4c1f 594 }
Azure.IoT Build 36:67300d5a4c1f 595 }
Azure.IoT Build 36:67300d5a4c1f 596
AzureIoTClient 16:deba40344375 597 void IoTHubClient_LL_DoWork(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle)
AzureIoTClient 16:deba40344375 598 {
AzureIoTClient 16:deba40344375 599 /*Codes_SRS_IOTHUBCLIENT_LL_02_020: [If parameter iotHubClientHandle is NULL then IoTHubClient_LL_DoWork shall not perform any action.] */
AzureIoTClient 16:deba40344375 600 if (iotHubClientHandle != NULL)
AzureIoTClient 16:deba40344375 601 {
AzureIoTClient 16:deba40344375 602 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle;
Azure.IoT Build 36:67300d5a4c1f 603 DoTimeouts(handleData);
AzureIoTClient 16:deba40344375 604 handleData->IoTHubTransport_DoWork(handleData->transportHandle, iotHubClientHandle);
AzureIoTClient 16:deba40344375 605 }
AzureIoTClient 16:deba40344375 606 }
AzureIoTClient 16:deba40344375 607
AzureIoTClient 16:deba40344375 608 IOTHUB_CLIENT_RESULT IoTHubClient_LL_GetSendStatus(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, IOTHUB_CLIENT_STATUS *iotHubClientStatus)
AzureIoTClient 16:deba40344375 609 {
AzureIoTClient 16:deba40344375 610 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 16:deba40344375 611
AzureIoTClient 16:deba40344375 612 /* Codes_SRS_IOTHUBCLIENT_09_007: [IoTHubClient_GetSendStatus shall return IOTHUB_CLIENT_INVALID_ARG if called with NULL parameter] */
AzureIoTClient 16:deba40344375 613 if (iotHubClientHandle == NULL || iotHubClientStatus == NULL)
AzureIoTClient 16:deba40344375 614 {
AzureIoTClient 16:deba40344375 615 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 16:deba40344375 616 LOG_ERROR;
AzureIoTClient 16:deba40344375 617 }
AzureIoTClient 16:deba40344375 618 else
AzureIoTClient 16:deba40344375 619 {
AzureIoTClient 16:deba40344375 620 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle;
AzureIoTClient 16:deba40344375 621
AzureIoTClient 16:deba40344375 622 /* Codes_SRS_IOTHUBCLIENT_09_008: [IoTHubClient_GetSendStatus shall return IOTHUB_CLIENT_OK and status IOTHUB_CLIENT_SEND_STATUS_IDLE if there is currently no items to be sent] */
AzureIoTClient 16:deba40344375 623 /* Codes_SRS_IOTHUBCLIENT_09_009: [IoTHubClient_GetSendStatus shall return IOTHUB_CLIENT_OK and status IOTHUB_CLIENT_SEND_STATUS_BUSY if there are currently items to be sent] */
Azure.IoT Build 36:67300d5a4c1f 624 result = handleData->IoTHubTransport_GetSendStatus(handleData->deviceHandle, iotHubClientStatus);
AzureIoTClient 16:deba40344375 625 }
AzureIoTClient 16:deba40344375 626
AzureIoTClient 16:deba40344375 627 return result;
AzureIoTClient 16:deba40344375 628 }
AzureIoTClient 16:deba40344375 629
AzureIoTClient 16:deba40344375 630 void IoTHubClient_LL_SendComplete(IOTHUB_CLIENT_LL_HANDLE handle, PDLIST_ENTRY completed, IOTHUB_BATCHSTATE_RESULT result)
AzureIoTClient 16:deba40344375 631 {
AzureIoTClient 16:deba40344375 632 /*Codes_SRS_IOTHUBCLIENT_LL_02_022: [If parameter completed is NULL, or parameter handle is NULL then IoTHubClient_LL_SendBatch shall return.]*/
AzureIoTClient 16:deba40344375 633 if (
AzureIoTClient 16:deba40344375 634 (handle == NULL) ||
AzureIoTClient 16:deba40344375 635 (completed == NULL)
AzureIoTClient 16:deba40344375 636 )
AzureIoTClient 16:deba40344375 637 {
AzureIoTClient 16:deba40344375 638 /*"shall return"*/
AzureIoTClient 39:2719651a5bee 639 LogError("invalid arg");
AzureIoTClient 16:deba40344375 640 }
AzureIoTClient 16:deba40344375 641 else
AzureIoTClient 16:deba40344375 642 {
AzureIoTClient 16:deba40344375 643 /*Codes_SRS_IOTHUBCLIENT_LL_02_027: [If parameter result is IOTHUB_BACTHSTATE_FAILED then IoTHubClient_LL_SendComplete shall call all the non-NULL callbacks with the result parameter set to IOTHUB_CLIENT_CONFIRMATION_ERROR and the context set to the context passed originally in the SendEventAsync call.] */
AzureIoTClient 16:deba40344375 644 /*Codes_SRS_IOTHUBCLIENT_LL_02_025: [If parameter result is IOTHUB_BATCHSTATE_SUCCESS then IoTHubClient_LL_SendComplete shall call all the non-NULL callbacks with the result parameter set to IOTHUB_CLIENT_CONFIRMATION_OK and the context set to the context passed originally in the SendEventAsync call.]*/
AzureIoTClient 16:deba40344375 645 IOTHUB_CLIENT_CONFIRMATION_RESULT resultToBeCalled = (result == IOTHUB_BATCHSTATE_SUCCESS) ? IOTHUB_CLIENT_CONFIRMATION_OK : IOTHUB_CLIENT_CONFIRMATION_ERROR;
AzureIoTClient 16:deba40344375 646 PDLIST_ENTRY oldest;
AzureIoTClient 16:deba40344375 647 while((oldest= DList_RemoveHeadList(completed))!=completed)
AzureIoTClient 16:deba40344375 648 {
AzureIoTClient 16:deba40344375 649 IOTHUB_MESSAGE_LIST* messageList = (IOTHUB_MESSAGE_LIST*)containingRecord(oldest, IOTHUB_MESSAGE_LIST, entry);
AzureIoTClient 16:deba40344375 650 if (messageList->callback != NULL)
AzureIoTClient 16:deba40344375 651 {
AzureIoTClient 16:deba40344375 652 messageList->callback(resultToBeCalled, messageList->context);
AzureIoTClient 16:deba40344375 653 }
AzureIoTClient 16:deba40344375 654 IoTHubMessage_Destroy(messageList->messageHandle);
AzureIoTClient 16:deba40344375 655 free(messageList);
AzureIoTClient 16:deba40344375 656 }
AzureIoTClient 16:deba40344375 657 }
AzureIoTClient 16:deba40344375 658 }
AzureIoTClient 16:deba40344375 659
AzureIoTClient 16:deba40344375 660 IOTHUBMESSAGE_DISPOSITION_RESULT IoTHubClient_LL_MessageCallback(IOTHUB_CLIENT_LL_HANDLE handle, IOTHUB_MESSAGE_HANDLE message)
AzureIoTClient 16:deba40344375 661 {
AzureIoTClient 16:deba40344375 662 int result;
AzureIoTClient 16:deba40344375 663 /*Codes_SRS_IOTHUBCLIENT_LL_02_029: [If parameter handle is NULL then IoTHubClient_LL_MessageCallback shall return IOTHUBMESSAGE_ABANDONED.] */
AzureIoTClient 16:deba40344375 664 if (handle == NULL)
AzureIoTClient 16:deba40344375 665 {
AzureIoTClient 39:2719651a5bee 666 LogError("invalid argument");
AzureIoTClient 16:deba40344375 667 result = IOTHUBMESSAGE_ABANDONED;
AzureIoTClient 16:deba40344375 668 }
AzureIoTClient 16:deba40344375 669 else
AzureIoTClient 16:deba40344375 670 {
AzureIoTClient 16:deba40344375 671 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)handle;
AzureIoTClient 16:deba40344375 672
AzureIoTClient 16:deba40344375 673 /* Codes_SRS_IOTHUBCLIENT_LL_09_004: [IoTHubClient_LL_GetLastMessageReceiveTime shall return lastMessageReceiveTime in localtime] */
AzureIoTClient 16:deba40344375 674 handleData->lastMessageReceiveTime = get_time(NULL);
AzureIoTClient 16:deba40344375 675
AzureIoTClient 16:deba40344375 676 /*Codes_SRS_IOTHUBCLIENT_LL_02_030: [IoTHubClient_LL_MessageCallback shall invoke the last callback function (the parameter messageCallback to IoTHubClient_LL_SetMessageCallback) passing the message and the passed userContextCallback.]*/
AzureIoTClient 16:deba40344375 677 if (handleData->messageCallback != NULL)
AzureIoTClient 16:deba40344375 678 {
AzureIoTClient 16:deba40344375 679 result = handleData->messageCallback(message, handleData->messageUserContextCallback);
AzureIoTClient 16:deba40344375 680 }
AzureIoTClient 16:deba40344375 681 else
AzureIoTClient 16:deba40344375 682 {
AzureIoTClient 16:deba40344375 683 /*Codes_SRS_IOTHUBCLIENT_LL_02_032: [If the last callback function was NULL, then IoTHubClient_LL_MessageCallback shall return IOTHUBMESSAGE_ABANDONED.] */
AzureIoTClient 39:2719651a5bee 684 LogError("user callback was NULL");
AzureIoTClient 16:deba40344375 685 result = IOTHUBMESSAGE_ABANDONED;
AzureIoTClient 16:deba40344375 686 }
AzureIoTClient 16:deba40344375 687 }
AzureIoTClient 16:deba40344375 688 /*Codes_SRS_IOTHUBCLIENT_LL_02_031: [Then IoTHubClient_LL_MessageCallback shall return what the user function returns.]*/
AzureIoTClient 16:deba40344375 689 return result;
AzureIoTClient 16:deba40344375 690 }
AzureIoTClient 16:deba40344375 691
AzureIoTClient 16:deba40344375 692 IOTHUB_CLIENT_RESULT IoTHubClient_LL_GetLastMessageReceiveTime(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, time_t* lastMessageReceiveTime)
AzureIoTClient 16:deba40344375 693 {
AzureIoTClient 16:deba40344375 694 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 16:deba40344375 695 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle;
AzureIoTClient 16:deba40344375 696
AzureIoTClient 16:deba40344375 697 /* Codes_SRS_IOTHUBCLIENT_LL_09_001: [IoTHubClient_LL_GetLastMessageReceiveTime shall return IOTHUB_CLIENT_INVALID_ARG if any of the arguments is NULL] */
AzureIoTClient 16:deba40344375 698 if (handleData == NULL || lastMessageReceiveTime == NULL)
AzureIoTClient 16:deba40344375 699 {
AzureIoTClient 16:deba40344375 700 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 16:deba40344375 701 LOG_ERROR;
AzureIoTClient 16:deba40344375 702 }
AzureIoTClient 16:deba40344375 703 else
AzureIoTClient 16:deba40344375 704 {
AzureIoTClient 16:deba40344375 705 /* Codes_SRS_IOTHUBCLIENT_LL_09_002: [IoTHubClient_LL_GetLastMessageReceiveTime shall return IOTHUB_CLIENT_INDEFINITE_TIME - and not set 'lastMessageReceiveTime' - if it is unable to provide the time for the last commands] */
AzureIoTClient 16:deba40344375 706 if (handleData->lastMessageReceiveTime == INDEFINITE_TIME)
AzureIoTClient 16:deba40344375 707 {
AzureIoTClient 16:deba40344375 708 result = IOTHUB_CLIENT_INDEFINITE_TIME;
AzureIoTClient 16:deba40344375 709 LOG_ERROR;
AzureIoTClient 16:deba40344375 710 }
AzureIoTClient 16:deba40344375 711 else
AzureIoTClient 16:deba40344375 712 {
AzureIoTClient 16:deba40344375 713 /* Codes_SRS_IOTHUBCLIENT_LL_09_003: [IoTHubClient_LL_GetLastMessageReceiveTime shall return IOTHUB_CLIENT_OK if it wrote in the lastMessageReceiveTime the time when the last command was received] */
AzureIoTClient 16:deba40344375 714 /* Codes_SRS_IOTHUBCLIENT_LL_09_004: [IoTHubClient_LL_GetLastMessageReceiveTime shall return lastMessageReceiveTime in localtime] */
AzureIoTClient 16:deba40344375 715 *lastMessageReceiveTime = handleData->lastMessageReceiveTime;
AzureIoTClient 16:deba40344375 716 result = IOTHUB_CLIENT_OK;
AzureIoTClient 16:deba40344375 717 }
AzureIoTClient 16:deba40344375 718 }
AzureIoTClient 16:deba40344375 719
AzureIoTClient 16:deba40344375 720 return result;
AzureIoTClient 16:deba40344375 721 }
AzureIoTClient 16:deba40344375 722
AzureIoTClient 16:deba40344375 723 IOTHUB_CLIENT_RESULT IoTHubClient_LL_SetOption(IOTHUB_CLIENT_LL_HANDLE iotHubClientHandle, const char* optionName, const void* value)
AzureIoTClient 16:deba40344375 724 {
AzureIoTClient 16:deba40344375 725
AzureIoTClient 16:deba40344375 726 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 16:deba40344375 727 /*Codes_SRS_IOTHUBCLIENT_LL_02_034: [If iotHubClientHandle is NULL then IoTHubClient_LL_SetOption shall return IOTHUB_CLIENT_INVALID_ARG.]*/
AzureIoTClient 16:deba40344375 728 /*Codes_SRS_IOTHUBCLIENT_LL_02_035: [If optionName is NULL then IoTHubClient_LL_SetOption shall return IOTHUB_CLIENT_INVALID_ARG.] */
AzureIoTClient 16:deba40344375 729 /*Codes_SRS_IOTHUBCLIENT_LL_02_036: [If value is NULL then IoTHubClient_LL_SetOption shall return IOTHUB_CLIENT_INVALID_ARG.] */
AzureIoTClient 16:deba40344375 730 if (
AzureIoTClient 16:deba40344375 731 (iotHubClientHandle == NULL) ||
AzureIoTClient 16:deba40344375 732 (optionName == NULL) ||
AzureIoTClient 16:deba40344375 733 (value == NULL)
AzureIoTClient 16:deba40344375 734 )
AzureIoTClient 16:deba40344375 735 {
AzureIoTClient 16:deba40344375 736 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 39:2719651a5bee 737 LogError("invalid argument (NULL)");
AzureIoTClient 16:deba40344375 738 }
AzureIoTClient 16:deba40344375 739 else
AzureIoTClient 16:deba40344375 740 {
AzureIoTClient 16:deba40344375 741 IOTHUB_CLIENT_LL_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_HANDLE_DATA*)iotHubClientHandle;
AzureIoTClient 16:deba40344375 742
Azure.IoT Build 36:67300d5a4c1f 743 /*Codes_SRS_IOTHUBCLIENT_LL_02_039: [ "messageTimeout" - once IoTHubClient_LL_SendEventAsync is called the message shall timeout after value miliseconds. Value is a pointer to a uint64. ]*/
Azure.IoT Build 36:67300d5a4c1f 744 if (strcmp(optionName, "messageTimeout") == 0)
Azure.IoT Build 36:67300d5a4c1f 745 {
Azure.IoT Build 36:67300d5a4c1f 746 /*this is an option handled by IoTHubClient_LL*/
Azure.IoT Build 36:67300d5a4c1f 747 /*Codes_SRS_IOTHUBCLIENT_LL_02_043: [ Calling IoTHubClient_LL_SetOption with value set to "0" shall disable the timeout mechanism for all new messages. ]*/
Azure.IoT Build 36:67300d5a4c1f 748 handleData->currentMessageTimeout = *(const uint64_t*)value;
Azure.IoT Build 36:67300d5a4c1f 749 result = IOTHUB_CLIENT_OK;
Azure.IoT Build 36:67300d5a4c1f 750 }
Azure.IoT Build 36:67300d5a4c1f 751 else
Azure.IoT Build 36:67300d5a4c1f 752 {
AzureIoTClient 16:deba40344375 753 /*Codes_SRS_IOTHUBCLIENT_LL_02_038: [Otherwise, IoTHubClient_LL shall call the function _SetOption of the underlying transport and return what that function is returning.] */
AzureIoTClient 16:deba40344375 754 result = handleData->IoTHubTransport_SetOption(handleData->transportHandle, optionName, value);
AzureIoTClient 16:deba40344375 755
AzureIoTClient 16:deba40344375 756 if (result != IOTHUB_CLIENT_OK)
AzureIoTClient 16:deba40344375 757 {
AzureIoTClient 39:2719651a5bee 758 LogError("underlying transport failed, returned = %s", ENUM_TO_STRING(IOTHUB_CLIENT_RESULT, result));
AzureIoTClient 16:deba40344375 759 }
Azure.IoT Build 36:67300d5a4c1f 760 }
AzureIoTClient 16:deba40344375 761 }
AzureIoTClient 16:deba40344375 762 return result;
AzureIoTClient 16:deba40344375 763 }