A modelling and serializer library for Microsoft Azure IoTHub client applications

Dependents:   sht15_remote_monitoring f767zi_mqtt remote_monitoring simplesample_amqp ... more

This library implements a serializer library to be used in projects involving Microsoft Azure IoT Hub connectivity. The code is replicated from https://github.com/Azure/azure-iot-sdks

Committer:
AzureIoTClient
Date:
Fri Feb 24 14:01:25 2017 -0800
Revision:
23:078ea26cffcd
Parent:
22:422d94bd3c18
Child:
26:7c0e6f86d034
1.1.8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 17:fa1bba4c6053 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 17:fa1bba4c6053 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 17:fa1bba4c6053 3
AzureIoTClient 17:fa1bba4c6053 4
AzureIoTClient 17:fa1bba4c6053 5 #ifndef SERIALIZER_DEVICE_TWIN_H
AzureIoTClient 17:fa1bba4c6053 6 #define SERIALIZER_DEVICE_TWIN_H
AzureIoTClient 17:fa1bba4c6053 7
AzureIoTClient 17:fa1bba4c6053 8 #include "serializer.h"
AzureIoTClient 17:fa1bba4c6053 9
AzureIoTClient 17:fa1bba4c6053 10 #include "iothub_client.h"
AzureIoTClient 17:fa1bba4c6053 11 #include "iothub_client_ll.h"
AzureIoTClient 17:fa1bba4c6053 12 #include "parson.h"
AzureIoTClient 23:078ea26cffcd 13 #include "azure_c_shared_utility/optimize_size.h"
AzureIoTClient 22:422d94bd3c18 14 #include "azure_c_shared_utility/vector.h"
Azure.IoT.Build 18:58b667752399 15 #include "methodreturn.h"
AzureIoTClient 17:fa1bba4c6053 16
AzureIoTClient 17:fa1bba4c6053 17 static void serializer_ingest(DEVICE_TWIN_UPDATE_STATE update_state, const unsigned char* payLoad, size_t size, void* userContextCallback)
AzureIoTClient 17:fa1bba4c6053 18 {
AzureIoTClient 17:fa1bba4c6053 19 /*by convention, userContextCallback is a pointer to a model instance created with CodeFirst_CreateDevice*/
AzureIoTClient 17:fa1bba4c6053 20
AzureIoTClient 17:fa1bba4c6053 21 /*Codes_SRS_SERIALIZERDEVICETWIN_02_001: [ serializer_ingest shall clone the payload into a null terminated string. ]*/
AzureIoTClient 17:fa1bba4c6053 22 char* copyOfPayload = (char*)malloc(size + 1);
AzureIoTClient 17:fa1bba4c6053 23 if (copyOfPayload == NULL)
AzureIoTClient 17:fa1bba4c6053 24 {
AzureIoTClient 17:fa1bba4c6053 25 /*Codes_SRS_SERIALIZERDEVICETWIN_02_008: [ If any of the above operations fail, then serializer_ingest shall return. ]*/
AzureIoTClient 17:fa1bba4c6053 26 LogError("unable to malloc\n");
AzureIoTClient 17:fa1bba4c6053 27 }
AzureIoTClient 17:fa1bba4c6053 28 else
AzureIoTClient 17:fa1bba4c6053 29 {
AzureIoTClient 22:422d94bd3c18 30 (void)memcpy(copyOfPayload, payLoad, size);
AzureIoTClient 17:fa1bba4c6053 31 copyOfPayload[size] = '\0';
AzureIoTClient 17:fa1bba4c6053 32
AzureIoTClient 17:fa1bba4c6053 33 /*Codes_SRS_SERIALIZERDEVICETWIN_02_002: [ serializer_ingest shall parse the null terminated string into parson data types. ]*/
AzureIoTClient 17:fa1bba4c6053 34 JSON_Value* allJSON = json_parse_string(copyOfPayload);
AzureIoTClient 17:fa1bba4c6053 35 if (allJSON == NULL)
AzureIoTClient 17:fa1bba4c6053 36 {
AzureIoTClient 17:fa1bba4c6053 37 /*Codes_SRS_SERIALIZERDEVICETWIN_02_008: [ If any of the above operations fail, then serializer_ingest shall return. ]*/
AzureIoTClient 17:fa1bba4c6053 38 LogError("failure in json_parse_string");
AzureIoTClient 17:fa1bba4c6053 39 }
AzureIoTClient 17:fa1bba4c6053 40 else
AzureIoTClient 17:fa1bba4c6053 41 {
AzureIoTClient 17:fa1bba4c6053 42 JSON_Object *allObject = json_value_get_object(allJSON);
AzureIoTClient 17:fa1bba4c6053 43 if (allObject == NULL)
AzureIoTClient 17:fa1bba4c6053 44 {
AzureIoTClient 17:fa1bba4c6053 45 /*Codes_SRS_SERIALIZERDEVICETWIN_02_008: [ If any of the above operations fail, then serializer_ingest shall return. ]*/
AzureIoTClient 17:fa1bba4c6053 46 LogError("failure in json_value_get_object");
AzureIoTClient 17:fa1bba4c6053 47 }
AzureIoTClient 17:fa1bba4c6053 48 else
AzureIoTClient 17:fa1bba4c6053 49 {
AzureIoTClient 17:fa1bba4c6053 50 switch (update_state)
AzureIoTClient 17:fa1bba4c6053 51 {
AzureIoTClient 17:fa1bba4c6053 52 /*Codes_SRS_SERIALIZERDEVICETWIN_02_003: [ If update_state is DEVICE_TWIN_UPDATE_COMPLETE then serializer_ingest shall locate "desired" json name. ]*/
AzureIoTClient 17:fa1bba4c6053 53 case DEVICE_TWIN_UPDATE_COMPLETE:
AzureIoTClient 17:fa1bba4c6053 54 {
AzureIoTClient 17:fa1bba4c6053 55 JSON_Object* desired = json_object_get_object(allObject, "desired");
AzureIoTClient 17:fa1bba4c6053 56 if (desired == NULL)
AzureIoTClient 17:fa1bba4c6053 57 {
AzureIoTClient 17:fa1bba4c6053 58 /*Codes_SRS_SERIALIZERDEVICETWIN_02_008: [ If any of the above operations fail, then serializer_ingest shall return. ]*/
AzureIoTClient 17:fa1bba4c6053 59 LogError("failure in json_object_get_object");
AzureIoTClient 17:fa1bba4c6053 60 }
AzureIoTClient 17:fa1bba4c6053 61 else
AzureIoTClient 17:fa1bba4c6053 62 {
AzureIoTClient 17:fa1bba4c6053 63 /*Codes_SRS_SERIALIZERDEVICETWIN_02_004: [ If "desired" contains "$version" then serializer_ingest shall remove it. ]*/
AzureIoTClient 17:fa1bba4c6053 64 (void)json_object_remove(desired, "$version"); //it might not exist
AzureIoTClient 17:fa1bba4c6053 65 JSON_Value* desiredAfterRemove = json_object_get_value(allObject, "desired");
AzureIoTClient 17:fa1bba4c6053 66 if (desiredAfterRemove != NULL)
AzureIoTClient 17:fa1bba4c6053 67 {
AzureIoTClient 17:fa1bba4c6053 68 /*Codes_SRS_SERIALIZERDEVICETWIN_02_005: [ The "desired" value shall be outputed to a null terminated string and serializer_ingest shall call CodeFirst_IngestDesiredProperties. ]*/
AzureIoTClient 17:fa1bba4c6053 69 char* pretty = json_serialize_to_string(desiredAfterRemove);
AzureIoTClient 17:fa1bba4c6053 70 if (pretty == NULL)
AzureIoTClient 17:fa1bba4c6053 71 {
AzureIoTClient 17:fa1bba4c6053 72 /*Codes_SRS_SERIALIZERDEVICETWIN_02_008: [ If any of the above operations fail, then serializer_ingest shall return. ]*/
AzureIoTClient 17:fa1bba4c6053 73 LogError("failure in json_serialize_to_string\n");
AzureIoTClient 17:fa1bba4c6053 74 }
AzureIoTClient 17:fa1bba4c6053 75 else
AzureIoTClient 17:fa1bba4c6053 76 {
AzureIoTClient 17:fa1bba4c6053 77 if (CodeFirst_IngestDesiredProperties(userContextCallback, pretty) != CODEFIRST_OK)
AzureIoTClient 17:fa1bba4c6053 78 {
AzureIoTClient 17:fa1bba4c6053 79 /*Codes_SRS_SERIALIZERDEVICETWIN_02_008: [ If any of the above operations fail, then serializer_ingest shall return. ]*/
AzureIoTClient 17:fa1bba4c6053 80 LogError("failure ingesting desired properties\n");
AzureIoTClient 17:fa1bba4c6053 81 }
AzureIoTClient 17:fa1bba4c6053 82 else
AzureIoTClient 17:fa1bba4c6053 83 {
AzureIoTClient 17:fa1bba4c6053 84 /*all is fine*/
AzureIoTClient 17:fa1bba4c6053 85 }
AzureIoTClient 17:fa1bba4c6053 86 free(pretty);
AzureIoTClient 17:fa1bba4c6053 87 }
AzureIoTClient 17:fa1bba4c6053 88 }
AzureIoTClient 17:fa1bba4c6053 89 }
AzureIoTClient 17:fa1bba4c6053 90 break;
AzureIoTClient 17:fa1bba4c6053 91 }
AzureIoTClient 17:fa1bba4c6053 92 case DEVICE_TWIN_UPDATE_PARTIAL:
AzureIoTClient 17:fa1bba4c6053 93 {
AzureIoTClient 17:fa1bba4c6053 94 /*Codes_SRS_SERIALIZERDEVICETWIN_02_006: [ If update_state is DEVICE_TWIN_UPDATE_PARTIAL then serializer_ingest shall remove "$version" (if it exists). ]*/
AzureIoTClient 17:fa1bba4c6053 95 (void)json_object_remove(allObject, "$version");
AzureIoTClient 17:fa1bba4c6053 96
AzureIoTClient 17:fa1bba4c6053 97 /*Codes_SRS_SERIALIZERDEVICETWIN_02_007: [ The JSON shall be outputed to a null terminated string and serializer_ingest shall call CodeFirst_IngestDesiredProperties. ]*/
AzureIoTClient 17:fa1bba4c6053 98 char* pretty = json_serialize_to_string(allJSON);
AzureIoTClient 17:fa1bba4c6053 99 if (pretty == NULL)
AzureIoTClient 17:fa1bba4c6053 100 {
AzureIoTClient 17:fa1bba4c6053 101 /*Codes_SRS_SERIALIZERDEVICETWIN_02_008: [ If any of the above operations fail, then serializer_ingest shall return. ]*/
AzureIoTClient 17:fa1bba4c6053 102 LogError("failure in json_serialize_to_string\n");
AzureIoTClient 17:fa1bba4c6053 103 }
AzureIoTClient 17:fa1bba4c6053 104 else
AzureIoTClient 17:fa1bba4c6053 105 {
AzureIoTClient 17:fa1bba4c6053 106 if (CodeFirst_IngestDesiredProperties(userContextCallback, pretty) != CODEFIRST_OK)
AzureIoTClient 17:fa1bba4c6053 107 {
AzureIoTClient 17:fa1bba4c6053 108 /*Codes_SRS_SERIALIZERDEVICETWIN_02_008: [ If any of the above operations fail, then serializer_ingest shall return. ]*/
AzureIoTClient 17:fa1bba4c6053 109 LogError("failure ingesting desired properties\n");
AzureIoTClient 17:fa1bba4c6053 110 }
AzureIoTClient 17:fa1bba4c6053 111 else
AzureIoTClient 17:fa1bba4c6053 112 {
AzureIoTClient 17:fa1bba4c6053 113 /*all is fine*/
AzureIoTClient 17:fa1bba4c6053 114 }
AzureIoTClient 17:fa1bba4c6053 115 free(pretty);
AzureIoTClient 17:fa1bba4c6053 116 }
AzureIoTClient 17:fa1bba4c6053 117 break;
AzureIoTClient 17:fa1bba4c6053 118 }
AzureIoTClient 17:fa1bba4c6053 119 default:
AzureIoTClient 17:fa1bba4c6053 120 {
AzureIoTClient 17:fa1bba4c6053 121 LogError("INTERNAL ERROR: unexpected value for update_state=%d\n", (int)update_state);
AzureIoTClient 17:fa1bba4c6053 122 }
AzureIoTClient 17:fa1bba4c6053 123 }
AzureIoTClient 17:fa1bba4c6053 124 }
AzureIoTClient 17:fa1bba4c6053 125 json_value_free(allJSON);
AzureIoTClient 17:fa1bba4c6053 126 }
AzureIoTClient 17:fa1bba4c6053 127 free(copyOfPayload);
AzureIoTClient 17:fa1bba4c6053 128 }
AzureIoTClient 17:fa1bba4c6053 129 }
AzureIoTClient 17:fa1bba4c6053 130
Azure.IoT.Build 18:58b667752399 131 /*both LL and convenience layer can be served by the same callback*/
Azure.IoT.Build 18:58b667752399 132 static int deviceMethodCallback(const char* method_name, const unsigned char* payload, size_t size, unsigned char** response, size_t* resp_size, void* userContextCallback)
Azure.IoT.Build 18:58b667752399 133 {
Azure.IoT.Build 18:58b667752399 134 int result;
Azure.IoT.Build 18:58b667752399 135 /*Codes_SRS_SERIALIZERDEVICETWIN_02_021: [ deviceMethodCallback shall transform payload and size into a null terminated string. ]*/
Azure.IoT.Build 18:58b667752399 136 char* payloadZeroTerminated = (char*)malloc(size + 1);
Azure.IoT.Build 18:58b667752399 137 if (payloadZeroTerminated == NULL)
Azure.IoT.Build 18:58b667752399 138 {
Azure.IoT.Build 18:58b667752399 139 LogError("failure in malloc");
Azure.IoT.Build 18:58b667752399 140 /*Codes_SRS_SERIALIZERDEVICETWIN_02_026: [ If any failure occurs in the above operations, then deviceMethodCallback shall fail, return 500, set *response to NULL and '*resp_size` to 0. ]*/
Azure.IoT.Build 18:58b667752399 141 *response = NULL;
Azure.IoT.Build 18:58b667752399 142 *resp_size = 0;
Azure.IoT.Build 18:58b667752399 143 result = 500;
Azure.IoT.Build 18:58b667752399 144 }
Azure.IoT.Build 18:58b667752399 145 else
Azure.IoT.Build 18:58b667752399 146 {
AzureIoTClient 22:422d94bd3c18 147 (void)memcpy(payloadZeroTerminated, payload, size);
Azure.IoT.Build 18:58b667752399 148 payloadZeroTerminated[size] = '\0';
Azure.IoT.Build 18:58b667752399 149
Azure.IoT.Build 18:58b667752399 150 /*Codes_SRS_SERIALIZERDEVICETWIN_02_022: [ deviceMethodCallback shall call EXECUTE_METHOD passing the userContextCallback, method_name and the null terminated string build before. ]*/
Azure.IoT.Build 18:58b667752399 151 METHODRETURN_HANDLE mr = EXECUTE_METHOD(userContextCallback, method_name, payloadZeroTerminated);
Azure.IoT.Build 18:58b667752399 152
Azure.IoT.Build 18:58b667752399 153 if (mr == NULL)
Azure.IoT.Build 18:58b667752399 154 {
Azure.IoT.Build 18:58b667752399 155 LogError("failure in EXECUTE_METHOD");
Azure.IoT.Build 18:58b667752399 156 /*Codes_SRS_SERIALIZERDEVICETWIN_02_026: [ If any failure occurs in the above operations, then deviceMethodCallback shall fail, return 500, set *response to NULL and '*resp_size` to 0. ]*/
Azure.IoT.Build 18:58b667752399 157 *response = NULL;
Azure.IoT.Build 18:58b667752399 158 *resp_size = 0;
Azure.IoT.Build 18:58b667752399 159 result = 500;
Azure.IoT.Build 18:58b667752399 160 }
Azure.IoT.Build 18:58b667752399 161 else
Azure.IoT.Build 18:58b667752399 162 {
Azure.IoT.Build 18:58b667752399 163 /*Codes_SRS_SERIALIZERDEVICETWIN_02_023: [ deviceMethodCallback shall get the MethodReturn_Data and shall copy the response JSON value into a new byte array. ]*/
Azure.IoT.Build 18:58b667752399 164 const METHODRETURN_DATA* data = MethodReturn_GetReturn(mr);
Azure.IoT.Build 18:58b667752399 165
Azure.IoT.Build 18:58b667752399 166 /*Codes_SRS_SERIALIZERDEVICETWIN_02_025: [ deviceMethodCallback returns the statusCode from the user. ]*/
Azure.IoT.Build 18:58b667752399 167 result = data->statusCode;
Azure.IoT.Build 18:58b667752399 168
Azure.IoT.Build 18:58b667752399 169 if (data->jsonValue == NULL)
Azure.IoT.Build 18:58b667752399 170 {
Azure.IoT.Build 18:58b667752399 171 *resp_size = 0;
Azure.IoT.Build 18:58b667752399 172 *response = NULL;
Azure.IoT.Build 18:58b667752399 173 }
Azure.IoT.Build 18:58b667752399 174 else
Azure.IoT.Build 18:58b667752399 175 {
Azure.IoT.Build 18:58b667752399 176 *resp_size = strlen(data->jsonValue);
Azure.IoT.Build 18:58b667752399 177 *response = (unsigned char*)malloc(*resp_size);
Azure.IoT.Build 18:58b667752399 178 if (*response == NULL)
Azure.IoT.Build 18:58b667752399 179 {
Azure.IoT.Build 18:58b667752399 180 LogError("failure in malloc");
Azure.IoT.Build 18:58b667752399 181 /*Codes_SRS_SERIALIZERDEVICETWIN_02_026: [ If any failure occurs in the above operations, then deviceMethodCallback shall fail, return 500, set *response to NULL and '*resp_size` to 0. ]*/
Azure.IoT.Build 18:58b667752399 182 *response = NULL;
Azure.IoT.Build 18:58b667752399 183 *resp_size = 0;
Azure.IoT.Build 18:58b667752399 184 result = 500;
Azure.IoT.Build 18:58b667752399 185 }
Azure.IoT.Build 18:58b667752399 186 else
Azure.IoT.Build 18:58b667752399 187 {
Azure.IoT.Build 18:58b667752399 188 /*Codes_SRS_SERIALIZERDEVICETWIN_02_024: [ deviceMethodCallback shall set *response to this new byte array, *resp_size to the size of the array. ]*/
AzureIoTClient 22:422d94bd3c18 189 (void)memcpy(*response, data->jsonValue, *resp_size);
Azure.IoT.Build 18:58b667752399 190 }
Azure.IoT.Build 18:58b667752399 191 }
Azure.IoT.Build 18:58b667752399 192 MethodReturn_Destroy(mr);
Azure.IoT.Build 18:58b667752399 193 }
Azure.IoT.Build 18:58b667752399 194 free(payloadZeroTerminated);
Azure.IoT.Build 18:58b667752399 195 }
Azure.IoT.Build 18:58b667752399 196 return result;
Azure.IoT.Build 18:58b667752399 197 }
Azure.IoT.Build 18:58b667752399 198
AzureIoTClient 17:fa1bba4c6053 199 /*an enum that sets the type of the handle used to record IoTHubDeviceTwin_Create was called*/
AzureIoTClient 17:fa1bba4c6053 200 #define IOTHUB_CLIENT_HANDLE_TYPE_VALUES \
AzureIoTClient 17:fa1bba4c6053 201 IOTHUB_CLIENT_CONVENIENCE_HANDLE_TYPE, \
AzureIoTClient 17:fa1bba4c6053 202 IOTHUB_CLIENT_LL_HANDLE_TYPE
AzureIoTClient 17:fa1bba4c6053 203
AzureIoTClient 17:fa1bba4c6053 204 DEFINE_ENUM(IOTHUB_CLIENT_HANDLE_TYPE, IOTHUB_CLIENT_HANDLE_TYPE_VALUES)
AzureIoTClient 17:fa1bba4c6053 205
AzureIoTClient 17:fa1bba4c6053 206 typedef union IOTHUB_CLIENT_HANDLE_VALUE_TAG
AzureIoTClient 17:fa1bba4c6053 207 {
AzureIoTClient 17:fa1bba4c6053 208 IOTHUB_CLIENT_HANDLE iothubClientHandle;
AzureIoTClient 17:fa1bba4c6053 209 IOTHUB_CLIENT_LL_HANDLE iothubClientLLHandle;
AzureIoTClient 17:fa1bba4c6053 210 } IOTHUB_CLIENT_HANDLE_VALUE;
AzureIoTClient 17:fa1bba4c6053 211
AzureIoTClient 17:fa1bba4c6053 212 typedef struct IOTHUB_CLIENT_HANDLE_VARIANT_TAG
AzureIoTClient 17:fa1bba4c6053 213 {
AzureIoTClient 17:fa1bba4c6053 214 IOTHUB_CLIENT_HANDLE_TYPE iothubClientHandleType;
AzureIoTClient 17:fa1bba4c6053 215 IOTHUB_CLIENT_HANDLE_VALUE iothubClientHandleValue;
AzureIoTClient 17:fa1bba4c6053 216 } IOTHUB_CLIENT_HANDLE_VARIANT;
AzureIoTClient 17:fa1bba4c6053 217
AzureIoTClient 17:fa1bba4c6053 218 typedef struct SERIALIZER_DEVICETWIN_PROTOHANDLE_TAG /*it is called "PROTOHANDLE" because it is a primitive type of handle*/
AzureIoTClient 17:fa1bba4c6053 219 {
AzureIoTClient 17:fa1bba4c6053 220 IOTHUB_CLIENT_HANDLE_VARIANT iothubClientHandleVariant;
AzureIoTClient 17:fa1bba4c6053 221 void* deviceAssigned;
AzureIoTClient 17:fa1bba4c6053 222 } SERIALIZER_DEVICETWIN_PROTOHANDLE;
AzureIoTClient 17:fa1bba4c6053 223
AzureIoTClient 17:fa1bba4c6053 224 static VECTOR_HANDLE g_allProtoHandles=NULL; /*contains SERIALIZER_DEVICETWIN_PROTOHANDLE*/
AzureIoTClient 17:fa1bba4c6053 225
AzureIoTClient 17:fa1bba4c6053 226 static int lazilyAddProtohandle(const SERIALIZER_DEVICETWIN_PROTOHANDLE* protoHandle)
AzureIoTClient 17:fa1bba4c6053 227 {
AzureIoTClient 17:fa1bba4c6053 228 int result;
AzureIoTClient 17:fa1bba4c6053 229 if ((g_allProtoHandles == NULL) && ((g_allProtoHandles = VECTOR_create(sizeof(SERIALIZER_DEVICETWIN_PROTOHANDLE))) == NULL))
AzureIoTClient 17:fa1bba4c6053 230 {
AzureIoTClient 17:fa1bba4c6053 231 LogError("failure in VECTOR_create");
AzureIoTClient 23:078ea26cffcd 232 result = __FAILURE__;
AzureIoTClient 17:fa1bba4c6053 233 }
AzureIoTClient 17:fa1bba4c6053 234 else
AzureIoTClient 17:fa1bba4c6053 235 {
AzureIoTClient 17:fa1bba4c6053 236 if (VECTOR_push_back(g_allProtoHandles, protoHandle, 1) != 0)
AzureIoTClient 17:fa1bba4c6053 237 {
AzureIoTClient 17:fa1bba4c6053 238 LogError("failure in VECTOR_push_back");
AzureIoTClient 23:078ea26cffcd 239 result = __FAILURE__;
AzureIoTClient 17:fa1bba4c6053 240
AzureIoTClient 17:fa1bba4c6053 241 /*leave it as it was*/
AzureIoTClient 17:fa1bba4c6053 242
AzureIoTClient 17:fa1bba4c6053 243 if (VECTOR_size(g_allProtoHandles) == 0)
AzureIoTClient 17:fa1bba4c6053 244 {
AzureIoTClient 17:fa1bba4c6053 245 VECTOR_destroy(g_allProtoHandles);
AzureIoTClient 17:fa1bba4c6053 246 g_allProtoHandles = NULL;
AzureIoTClient 17:fa1bba4c6053 247 }
AzureIoTClient 17:fa1bba4c6053 248 }
AzureIoTClient 17:fa1bba4c6053 249 else
AzureIoTClient 17:fa1bba4c6053 250 {
AzureIoTClient 17:fa1bba4c6053 251 result = 0;
AzureIoTClient 17:fa1bba4c6053 252 }
AzureIoTClient 17:fa1bba4c6053 253 }
AzureIoTClient 17:fa1bba4c6053 254 return result;
AzureIoTClient 17:fa1bba4c6053 255 }
AzureIoTClient 17:fa1bba4c6053 256
Azure.IoT.Build 18:58b667752399 257 static IOTHUB_CLIENT_RESULT Generic_IoTHubClient_SetCallbacks(const SERIALIZER_DEVICETWIN_PROTOHANDLE* protoHandle, IOTHUB_CLIENT_DEVICE_TWIN_CALLBACK deviceTwinCallback, void* userContextCallback)
AzureIoTClient 17:fa1bba4c6053 258 {
AzureIoTClient 17:fa1bba4c6053 259 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 17:fa1bba4c6053 260 /*Codes_SRS_SERIALIZERDEVICETWIN_02_011: [ IoTHubDeviceTwinCreate_Impl shall set the device twin callback. ]*/
AzureIoTClient 17:fa1bba4c6053 261 switch (protoHandle->iothubClientHandleVariant.iothubClientHandleType)
AzureIoTClient 17:fa1bba4c6053 262 {
AzureIoTClient 17:fa1bba4c6053 263 case IOTHUB_CLIENT_CONVENIENCE_HANDLE_TYPE:
AzureIoTClient 17:fa1bba4c6053 264 {
AzureIoTClient 17:fa1bba4c6053 265 if ((result = IoTHubClient_SetDeviceTwinCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientHandle, deviceTwinCallback, userContextCallback)) != IOTHUB_CLIENT_OK)
AzureIoTClient 17:fa1bba4c6053 266 {
AzureIoTClient 17:fa1bba4c6053 267 LogError("failure in IoTHubClient_SetDeviceTwinCallback");
AzureIoTClient 17:fa1bba4c6053 268 }
Azure.IoT.Build 18:58b667752399 269 else
Azure.IoT.Build 18:58b667752399 270 {
Azure.IoT.Build 18:58b667752399 271 /*Codes_SRS_SERIALIZERDEVICETWIN_02_027: [ IoTHubDeviceTwinCreate_Impl shall set the device method callback ]*/
Azure.IoT.Build 18:58b667752399 272 if ((result = IoTHubClient_SetDeviceMethodCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientHandle, deviceMethodCallback, userContextCallback)) != IOTHUB_CLIENT_OK)
Azure.IoT.Build 18:58b667752399 273 {
Azure.IoT.Build 18:58b667752399 274 (void)IoTHubClient_SetDeviceTwinCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientHandle, NULL, NULL);
Azure.IoT.Build 18:58b667752399 275 LogError("failure in IoTHubClient_SetDeviceMethodCallback");
Azure.IoT.Build 18:58b667752399 276 }
Azure.IoT.Build 18:58b667752399 277 }
AzureIoTClient 17:fa1bba4c6053 278 break;
AzureIoTClient 17:fa1bba4c6053 279 }
AzureIoTClient 17:fa1bba4c6053 280 case IOTHUB_CLIENT_LL_HANDLE_TYPE:
AzureIoTClient 17:fa1bba4c6053 281 {
AzureIoTClient 17:fa1bba4c6053 282 if ((result =IoTHubClient_LL_SetDeviceTwinCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientLLHandle, deviceTwinCallback, userContextCallback)) != IOTHUB_CLIENT_OK)
AzureIoTClient 17:fa1bba4c6053 283 {
AzureIoTClient 17:fa1bba4c6053 284 LogError("failure in IoTHubClient_LL_SetDeviceTwinCallback");
AzureIoTClient 17:fa1bba4c6053 285 }
Azure.IoT.Build 18:58b667752399 286 else
Azure.IoT.Build 18:58b667752399 287 {
Azure.IoT.Build 18:58b667752399 288 /*Codes_SRS_SERIALIZERDEVICETWIN_02_027: [ IoTHubDeviceTwinCreate_Impl shall set the device method callback ]*/
Azure.IoT.Build 18:58b667752399 289 if ((result = IoTHubClient_LL_SetDeviceMethodCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientLLHandle, deviceMethodCallback, userContextCallback)) != IOTHUB_CLIENT_OK)
Azure.IoT.Build 18:58b667752399 290 {
Azure.IoT.Build 18:58b667752399 291 (void)IoTHubClient_LL_SetDeviceTwinCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientLLHandle, NULL, NULL);
Azure.IoT.Build 18:58b667752399 292 LogError("failure in IoTHubClient_SetDeviceMethodCallback");
Azure.IoT.Build 18:58b667752399 293 }
Azure.IoT.Build 18:58b667752399 294 }
AzureIoTClient 17:fa1bba4c6053 295 break;
AzureIoTClient 17:fa1bba4c6053 296 }
AzureIoTClient 17:fa1bba4c6053 297 default:
AzureIoTClient 17:fa1bba4c6053 298 {
AzureIoTClient 17:fa1bba4c6053 299 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 17:fa1bba4c6053 300 LogError("INTERNAL ERROR");
AzureIoTClient 17:fa1bba4c6053 301 }
AzureIoTClient 17:fa1bba4c6053 302 }/*switch*/
AzureIoTClient 17:fa1bba4c6053 303 return result;
AzureIoTClient 17:fa1bba4c6053 304 }
AzureIoTClient 17:fa1bba4c6053 305
AzureIoTClient 17:fa1bba4c6053 306 static void* IoTHubDeviceTwinCreate_Impl(const char* name, size_t sizeOfName, SERIALIZER_DEVICETWIN_PROTOHANDLE* protoHandle)
AzureIoTClient 17:fa1bba4c6053 307 {
AzureIoTClient 17:fa1bba4c6053 308 void* result;
AzureIoTClient 17:fa1bba4c6053 309 /*Codes_SRS_SERIALIZERDEVICETWIN_02_009: [ IoTHubDeviceTwinCreate_Impl shall locate the model and the metadata for name by calling Schema_GetSchemaForModel/Schema_GetMetadata/Schema_GetModelByName. ]*/
AzureIoTClient 17:fa1bba4c6053 310 SCHEMA_HANDLE h = Schema_GetSchemaForModel(name);
AzureIoTClient 17:fa1bba4c6053 311 if (h == NULL)
AzureIoTClient 17:fa1bba4c6053 312 {
AzureIoTClient 17:fa1bba4c6053 313 /*Codes_SRS_SERIALIZERDEVICETWIN_02_014: [ Otherwise, IoTHubDeviceTwinCreate_Impl shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 314 LogError("failure in Schema_GetSchemaForModel.");
AzureIoTClient 17:fa1bba4c6053 315 result = NULL;
AzureIoTClient 17:fa1bba4c6053 316 }
AzureIoTClient 17:fa1bba4c6053 317 else
AzureIoTClient 17:fa1bba4c6053 318 {
AzureIoTClient 17:fa1bba4c6053 319 void* metadata = Schema_GetMetadata(h);
AzureIoTClient 17:fa1bba4c6053 320 SCHEMA_MODEL_TYPE_HANDLE modelType = Schema_GetModelByName(h, name);
AzureIoTClient 17:fa1bba4c6053 321 if (modelType == NULL)
AzureIoTClient 17:fa1bba4c6053 322 {
AzureIoTClient 17:fa1bba4c6053 323 /*Codes_SRS_SERIALIZERDEVICETWIN_02_014: [ Otherwise, IoTHubDeviceTwinCreate_Impl shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 324 LogError("failure in Schema_GetModelByName");
AzureIoTClient 17:fa1bba4c6053 325 result = NULL;
AzureIoTClient 17:fa1bba4c6053 326 }
AzureIoTClient 17:fa1bba4c6053 327 else
AzureIoTClient 17:fa1bba4c6053 328 {
AzureIoTClient 17:fa1bba4c6053 329 /*Codes_SRS_SERIALIZERDEVICETWIN_02_010: [ IoTHubDeviceTwinCreate_Impl shall call CodeFirst_CreateDevice. ]*/
AzureIoTClient 17:fa1bba4c6053 330 result = CodeFirst_CreateDevice(modelType, (REFLECTED_DATA_FROM_DATAPROVIDER *)metadata, sizeOfName, true);
AzureIoTClient 17:fa1bba4c6053 331 if (result == NULL)
AzureIoTClient 17:fa1bba4c6053 332 {
AzureIoTClient 17:fa1bba4c6053 333 /*Codes_SRS_SERIALIZERDEVICETWIN_02_014: [ Otherwise, IoTHubDeviceTwinCreate_Impl shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 334 LogError("failure in CodeFirst_CreateDevice");
AzureIoTClient 17:fa1bba4c6053 335 /*return as is*/
AzureIoTClient 17:fa1bba4c6053 336 }
AzureIoTClient 17:fa1bba4c6053 337 else
AzureIoTClient 17:fa1bba4c6053 338 {
AzureIoTClient 17:fa1bba4c6053 339 protoHandle->deviceAssigned = result;
Azure.IoT.Build 18:58b667752399 340 if (Generic_IoTHubClient_SetCallbacks(protoHandle, serializer_ingest, result) != IOTHUB_CLIENT_OK)
AzureIoTClient 17:fa1bba4c6053 341 {
AzureIoTClient 17:fa1bba4c6053 342 /*Codes_SRS_SERIALIZERDEVICETWIN_02_014: [ Otherwise, IoTHubDeviceTwinCreate_Impl shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 343 LogError("failure in Generic_IoTHubClient_SetCallbacks");
AzureIoTClient 17:fa1bba4c6053 344 CodeFirst_DestroyDevice(result);
AzureIoTClient 17:fa1bba4c6053 345 result = NULL;
AzureIoTClient 17:fa1bba4c6053 346 }
AzureIoTClient 17:fa1bba4c6053 347 else
AzureIoTClient 17:fa1bba4c6053 348 {
AzureIoTClient 17:fa1bba4c6053 349 /*lazily add the protohandle to the array of tracking handles*/
AzureIoTClient 17:fa1bba4c6053 350
AzureIoTClient 17:fa1bba4c6053 351 /*Codes_SRS_SERIALIZERDEVICETWIN_02_012: [ IoTHubDeviceTwinCreate_Impl shall record the pair of (device, IoTHubClient(_LL)). ]*/
AzureIoTClient 17:fa1bba4c6053 352 if (lazilyAddProtohandle(protoHandle) != 0)
AzureIoTClient 17:fa1bba4c6053 353 {
AzureIoTClient 17:fa1bba4c6053 354 /*Codes_SRS_SERIALIZERDEVICETWIN_02_014: [ Otherwise, IoTHubDeviceTwinCreate_Impl shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 355 LogError("unable to add the protohandle to the collection of handles");
AzureIoTClient 17:fa1bba4c6053 356 /*unsubscribe*/
Azure.IoT.Build 18:58b667752399 357 if (Generic_IoTHubClient_SetCallbacks(protoHandle, NULL, NULL) != IOTHUB_CLIENT_OK)
AzureIoTClient 17:fa1bba4c6053 358 {
AzureIoTClient 17:fa1bba4c6053 359 /*just log the error*/
Azure.IoT.Build 18:58b667752399 360 LogError("failure in Generic_IoTHubClient_SetCallbacks");
AzureIoTClient 17:fa1bba4c6053 361 }
AzureIoTClient 17:fa1bba4c6053 362 CodeFirst_DestroyDevice(result);
AzureIoTClient 17:fa1bba4c6053 363 result = NULL;
AzureIoTClient 17:fa1bba4c6053 364 }
AzureIoTClient 17:fa1bba4c6053 365 else
AzureIoTClient 17:fa1bba4c6053 366 {
AzureIoTClient 17:fa1bba4c6053 367 /*Codes_SRS_SERIALIZERDEVICETWIN_02_013: [ If all operations complete successfully then IoTHubDeviceTwinCreate_Impl shall succeeds and return a non-NULL value. ]*/
AzureIoTClient 17:fa1bba4c6053 368 /*return as is*/
AzureIoTClient 17:fa1bba4c6053 369 }
AzureIoTClient 17:fa1bba4c6053 370 }
AzureIoTClient 17:fa1bba4c6053 371 }
AzureIoTClient 17:fa1bba4c6053 372 }
AzureIoTClient 17:fa1bba4c6053 373 }
AzureIoTClient 17:fa1bba4c6053 374 return result;
AzureIoTClient 17:fa1bba4c6053 375 }
AzureIoTClient 17:fa1bba4c6053 376
AzureIoTClient 17:fa1bba4c6053 377 static bool protoHandleHasDeviceStartAddress(const void* element, const void* value)
AzureIoTClient 17:fa1bba4c6053 378 {
AzureIoTClient 17:fa1bba4c6053 379 const SERIALIZER_DEVICETWIN_PROTOHANDLE* protoHandle = (const SERIALIZER_DEVICETWIN_PROTOHANDLE*)element;
AzureIoTClient 17:fa1bba4c6053 380 return protoHandle->deviceAssigned == value;
AzureIoTClient 17:fa1bba4c6053 381 }
AzureIoTClient 17:fa1bba4c6053 382
AzureIoTClient 17:fa1bba4c6053 383 static void IoTHubDeviceTwin_Destroy_Impl(void* model)
AzureIoTClient 17:fa1bba4c6053 384 {
AzureIoTClient 17:fa1bba4c6053 385 /*Codes_SRS_SERIALIZERDEVICETWIN_02_020: [ If model is NULL then IoTHubDeviceTwin_Destroy_Impl shall return. ]*/
AzureIoTClient 17:fa1bba4c6053 386 if (model == NULL)
AzureIoTClient 17:fa1bba4c6053 387 {
AzureIoTClient 17:fa1bba4c6053 388 LogError("invalid argument void* model=%p", model);
AzureIoTClient 17:fa1bba4c6053 389 }
AzureIoTClient 17:fa1bba4c6053 390 else
AzureIoTClient 17:fa1bba4c6053 391 {
AzureIoTClient 17:fa1bba4c6053 392 /*Codes_SRS_SERIALIZERDEVICETWIN_02_015: [ IoTHubDeviceTwin_Destroy_Impl shall locate the saved handle belonging to model. ]*/
AzureIoTClient 17:fa1bba4c6053 393 SERIALIZER_DEVICETWIN_PROTOHANDLE* protoHandle = (SERIALIZER_DEVICETWIN_PROTOHANDLE*)VECTOR_find_if(g_allProtoHandles, protoHandleHasDeviceStartAddress, model);
AzureIoTClient 17:fa1bba4c6053 394 if (protoHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 395 {
AzureIoTClient 17:fa1bba4c6053 396 LogError("failure in VECTOR_find_if [not found]");
AzureIoTClient 17:fa1bba4c6053 397 }
AzureIoTClient 17:fa1bba4c6053 398 else
AzureIoTClient 17:fa1bba4c6053 399 {
AzureIoTClient 17:fa1bba4c6053 400 /*Codes_SRS_SERIALIZERDEVICETWIN_02_016: [ IoTHubDeviceTwin_Destroy_Impl shall set the devicetwin callback to NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 401 switch (protoHandle->iothubClientHandleVariant.iothubClientHandleType)
AzureIoTClient 17:fa1bba4c6053 402 {
AzureIoTClient 17:fa1bba4c6053 403 case IOTHUB_CLIENT_CONVENIENCE_HANDLE_TYPE:
AzureIoTClient 17:fa1bba4c6053 404 {
AzureIoTClient 17:fa1bba4c6053 405 if (IoTHubClient_SetDeviceTwinCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientHandle, NULL, NULL) != IOTHUB_CLIENT_OK)
AzureIoTClient 17:fa1bba4c6053 406 {
AzureIoTClient 17:fa1bba4c6053 407 LogError("failure in IoTHubClient_SetDeviceTwinCallback");
AzureIoTClient 17:fa1bba4c6053 408 }
Azure.IoT.Build 18:58b667752399 409 /*Codes_SRS_SERIALIZERDEVICETWIN_02_028: [ IoTHubDeviceTwin_Destroy_Impl shall set the method callback to NULL. ]*/
Azure.IoT.Build 18:58b667752399 410 if (IoTHubClient_SetDeviceMethodCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientHandle, NULL, NULL) != IOTHUB_CLIENT_OK)
Azure.IoT.Build 18:58b667752399 411 {
Azure.IoT.Build 18:58b667752399 412 LogError("failure in IoTHubClient_SetDeviceMethodCallback");
Azure.IoT.Build 18:58b667752399 413 }
AzureIoTClient 17:fa1bba4c6053 414 break;
AzureIoTClient 17:fa1bba4c6053 415 }
AzureIoTClient 17:fa1bba4c6053 416 case IOTHUB_CLIENT_LL_HANDLE_TYPE:
AzureIoTClient 17:fa1bba4c6053 417 {
AzureIoTClient 17:fa1bba4c6053 418 if (IoTHubClient_LL_SetDeviceTwinCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientLLHandle, NULL, NULL) != IOTHUB_CLIENT_OK)
AzureIoTClient 17:fa1bba4c6053 419 {
AzureIoTClient 17:fa1bba4c6053 420 LogError("failure in IoTHubClient_LL_SetDeviceTwinCallback");
AzureIoTClient 17:fa1bba4c6053 421 }
Azure.IoT.Build 18:58b667752399 422 /*Codes_SRS_SERIALIZERDEVICETWIN_02_028: [ IoTHubDeviceTwin_Destroy_Impl shall set the method callback to NULL. ]*/
Azure.IoT.Build 18:58b667752399 423 if (IoTHubClient_LL_SetDeviceMethodCallback(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientLLHandle, NULL, NULL) != IOTHUB_CLIENT_OK)
Azure.IoT.Build 18:58b667752399 424 {
Azure.IoT.Build 18:58b667752399 425 LogError("failure in IoTHubClient_LL_SetDeviceMethodCallback");
Azure.IoT.Build 18:58b667752399 426 }
AzureIoTClient 17:fa1bba4c6053 427 break;
AzureIoTClient 17:fa1bba4c6053 428 }
AzureIoTClient 17:fa1bba4c6053 429 default:
AzureIoTClient 17:fa1bba4c6053 430 {
AzureIoTClient 17:fa1bba4c6053 431 LogError("INTERNAL ERROR");
AzureIoTClient 17:fa1bba4c6053 432 }
AzureIoTClient 17:fa1bba4c6053 433 }/*switch*/
AzureIoTClient 17:fa1bba4c6053 434 }
AzureIoTClient 17:fa1bba4c6053 435
AzureIoTClient 17:fa1bba4c6053 436 /*Codes_SRS_SERIALIZERDEVICETWIN_02_017: [ IoTHubDeviceTwin_Destroy_Impl shall call CodeFirst_DestroyDevice. ]*/
AzureIoTClient 17:fa1bba4c6053 437 CodeFirst_DestroyDevice(protoHandle->deviceAssigned);
AzureIoTClient 17:fa1bba4c6053 438
AzureIoTClient 17:fa1bba4c6053 439 /*Codes_SRS_SERIALIZERDEVICETWIN_02_018: [ IoTHubDeviceTwin_Destroy_Impl shall remove the IoTHubClient_Handle and the device handle from the recorded set. ]*/
AzureIoTClient 17:fa1bba4c6053 440 VECTOR_erase(g_allProtoHandles, protoHandle, 1);
AzureIoTClient 17:fa1bba4c6053 441
AzureIoTClient 17:fa1bba4c6053 442 /*Codes_SRS_SERIALIZERDEVICETWIN_02_019: [ If the recorded set of IoTHubClient handles is zero size, then the set shall be destroyed. ]*/
AzureIoTClient 17:fa1bba4c6053 443 if (VECTOR_size(g_allProtoHandles) == 0) /*lazy init means more work @ destroy time*/
AzureIoTClient 17:fa1bba4c6053 444 {
AzureIoTClient 17:fa1bba4c6053 445 VECTOR_destroy(g_allProtoHandles);
AzureIoTClient 17:fa1bba4c6053 446 g_allProtoHandles = NULL;
AzureIoTClient 17:fa1bba4c6053 447 }
AzureIoTClient 17:fa1bba4c6053 448 }
AzureIoTClient 17:fa1bba4c6053 449 }
AzureIoTClient 17:fa1bba4c6053 450
Azure.IoT.Build 18:58b667752399 451 /*the below function sends the reported state of a model previously created by IoTHubDeviceTwin_Create*/
Azure.IoT.Build 18:58b667752399 452 /*this function serves both the _LL and the convenience layer because of protohandles*/
Azure.IoT.Build 18:58b667752399 453 static IOTHUB_CLIENT_RESULT IoTHubDeviceTwin_SendReportedState_Impl(void* model, IOTHUB_CLIENT_REPORTED_STATE_CALLBACK deviceTwinCallback, void* context)
Azure.IoT.Build 18:58b667752399 454 {
Azure.IoT.Build 18:58b667752399 455 unsigned char*buffer;
Azure.IoT.Build 18:58b667752399 456 size_t bufferSize;
Azure.IoT.Build 18:58b667752399 457
Azure.IoT.Build 18:58b667752399 458 IOTHUB_CLIENT_RESULT result;
Azure.IoT.Build 18:58b667752399 459
Azure.IoT.Build 18:58b667752399 460 if (SERIALIZE_REPORTED_PROPERTIES_FROM_POINTERS(&buffer, &bufferSize, model) != CODEFIRST_OK)
Azure.IoT.Build 18:58b667752399 461 {
Azure.IoT.Build 18:58b667752399 462 LogError("Failed serializing reported state");
Azure.IoT.Build 18:58b667752399 463 result = IOTHUB_CLIENT_ERROR;
Azure.IoT.Build 18:58b667752399 464 }
Azure.IoT.Build 18:58b667752399 465 else
Azure.IoT.Build 18:58b667752399 466 {
Azure.IoT.Build 18:58b667752399 467 SERIALIZER_DEVICETWIN_PROTOHANDLE* protoHandle = (SERIALIZER_DEVICETWIN_PROTOHANDLE*)VECTOR_find_if(g_allProtoHandles, protoHandleHasDeviceStartAddress, model);
Azure.IoT.Build 18:58b667752399 468 if (protoHandle == NULL)
Azure.IoT.Build 18:58b667752399 469 {
Azure.IoT.Build 18:58b667752399 470 LogError("failure in VECTOR_find_if [not found]");
Azure.IoT.Build 18:58b667752399 471 result = IOTHUB_CLIENT_ERROR;
Azure.IoT.Build 18:58b667752399 472 }
Azure.IoT.Build 18:58b667752399 473 else
Azure.IoT.Build 18:58b667752399 474 {
Azure.IoT.Build 18:58b667752399 475 switch (protoHandle->iothubClientHandleVariant.iothubClientHandleType)
Azure.IoT.Build 18:58b667752399 476 {
Azure.IoT.Build 18:58b667752399 477 case IOTHUB_CLIENT_CONVENIENCE_HANDLE_TYPE:
Azure.IoT.Build 18:58b667752399 478 {
Azure.IoT.Build 18:58b667752399 479 if (IoTHubClient_SendReportedState(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientHandle, buffer, bufferSize, deviceTwinCallback, context) != IOTHUB_CLIENT_OK)
Azure.IoT.Build 18:58b667752399 480 {
Azure.IoT.Build 18:58b667752399 481 LogError("Failure sending data");
Azure.IoT.Build 18:58b667752399 482 result = IOTHUB_CLIENT_ERROR;
Azure.IoT.Build 18:58b667752399 483 }
Azure.IoT.Build 18:58b667752399 484 else
Azure.IoT.Build 18:58b667752399 485 {
Azure.IoT.Build 18:58b667752399 486 result = IOTHUB_CLIENT_OK;
Azure.IoT.Build 18:58b667752399 487 }
Azure.IoT.Build 18:58b667752399 488 break;
Azure.IoT.Build 18:58b667752399 489 }
Azure.IoT.Build 18:58b667752399 490 case IOTHUB_CLIENT_LL_HANDLE_TYPE:
Azure.IoT.Build 18:58b667752399 491 {
Azure.IoT.Build 18:58b667752399 492 if (IoTHubClient_LL_SendReportedState(protoHandle->iothubClientHandleVariant.iothubClientHandleValue.iothubClientLLHandle, buffer, bufferSize, deviceTwinCallback, context) != IOTHUB_CLIENT_OK)
Azure.IoT.Build 18:58b667752399 493 {
Azure.IoT.Build 18:58b667752399 494 LogError("Failure sending data");
Azure.IoT.Build 18:58b667752399 495 result = IOTHUB_CLIENT_ERROR;
Azure.IoT.Build 18:58b667752399 496 }
Azure.IoT.Build 18:58b667752399 497 else
Azure.IoT.Build 18:58b667752399 498 {
Azure.IoT.Build 18:58b667752399 499 result = IOTHUB_CLIENT_OK;
Azure.IoT.Build 18:58b667752399 500 }
Azure.IoT.Build 18:58b667752399 501 break;
Azure.IoT.Build 18:58b667752399 502 }
Azure.IoT.Build 18:58b667752399 503 default:
Azure.IoT.Build 18:58b667752399 504 {
Azure.IoT.Build 18:58b667752399 505 LogError("INTERNAL ERROR: unexpected value for enum (%d)", (int)protoHandle->iothubClientHandleVariant.iothubClientHandleType);
Azure.IoT.Build 18:58b667752399 506 result = IOTHUB_CLIENT_ERROR;
Azure.IoT.Build 18:58b667752399 507 break;
Azure.IoT.Build 18:58b667752399 508 }
Azure.IoT.Build 18:58b667752399 509 }
Azure.IoT.Build 18:58b667752399 510 }
Azure.IoT.Build 18:58b667752399 511 free(buffer);
Azure.IoT.Build 18:58b667752399 512 }
Azure.IoT.Build 18:58b667752399 513 return result;
Azure.IoT.Build 18:58b667752399 514 }
Azure.IoT.Build 18:58b667752399 515
AzureIoTClient 17:fa1bba4c6053 516 #define DECLARE_DEVICETWIN_MODEL(name, ...) \
AzureIoTClient 17:fa1bba4c6053 517 DECLARE_MODEL(name, __VA_ARGS__) \
AzureIoTClient 17:fa1bba4c6053 518 static name* C2(IoTHubDeviceTwin_Create, name)(IOTHUB_CLIENT_HANDLE iotHubClientHandle) \
AzureIoTClient 17:fa1bba4c6053 519 { \
AzureIoTClient 17:fa1bba4c6053 520 SERIALIZER_DEVICETWIN_PROTOHANDLE protoHandle; \
AzureIoTClient 17:fa1bba4c6053 521 protoHandle.iothubClientHandleVariant.iothubClientHandleType = IOTHUB_CLIENT_CONVENIENCE_HANDLE_TYPE; \
AzureIoTClient 17:fa1bba4c6053 522 protoHandle.iothubClientHandleVariant.iothubClientHandleValue.iothubClientHandle = iotHubClientHandle; \
AzureIoTClient 17:fa1bba4c6053 523 return (name*)IoTHubDeviceTwinCreate_Impl(#name, sizeof(name), &protoHandle); \
AzureIoTClient 17:fa1bba4c6053 524 } \
AzureIoTClient 17:fa1bba4c6053 525 \
AzureIoTClient 17:fa1bba4c6053 526 static void C2(IoTHubDeviceTwin_Destroy, name) (name* model) \
AzureIoTClient 17:fa1bba4c6053 527 { \
AzureIoTClient 17:fa1bba4c6053 528 IoTHubDeviceTwin_Destroy_Impl(model); \
AzureIoTClient 17:fa1bba4c6053 529 } \
AzureIoTClient 17:fa1bba4c6053 530 \
AzureIoTClient 17:fa1bba4c6053 531 static name* C2(IoTHubDeviceTwin_LL_Create, name)(IOTHUB_CLIENT_LL_HANDLE iotHubClientLLHandle) \
AzureIoTClient 17:fa1bba4c6053 532 { \
AzureIoTClient 17:fa1bba4c6053 533 SERIALIZER_DEVICETWIN_PROTOHANDLE protoHandle; \
AzureIoTClient 17:fa1bba4c6053 534 protoHandle.iothubClientHandleVariant.iothubClientHandleType = IOTHUB_CLIENT_LL_HANDLE_TYPE; \
AzureIoTClient 17:fa1bba4c6053 535 protoHandle.iothubClientHandleVariant.iothubClientHandleValue.iothubClientLLHandle = iotHubClientLLHandle; \
AzureIoTClient 17:fa1bba4c6053 536 return (name*)IoTHubDeviceTwinCreate_Impl(#name, sizeof(name), &protoHandle); \
AzureIoTClient 17:fa1bba4c6053 537 } \
AzureIoTClient 17:fa1bba4c6053 538 \
AzureIoTClient 17:fa1bba4c6053 539 static void C2(IoTHubDeviceTwin_LL_Destroy, name) (name* model) \
AzureIoTClient 17:fa1bba4c6053 540 { \
AzureIoTClient 17:fa1bba4c6053 541 IoTHubDeviceTwin_Destroy_Impl(model); \
AzureIoTClient 17:fa1bba4c6053 542 } \
Azure.IoT.Build 18:58b667752399 543 static IOTHUB_CLIENT_RESULT C2(IoTHubDeviceTwin_LL_SendReportedState, name) (name* model, IOTHUB_CLIENT_REPORTED_STATE_CALLBACK deviceTwinCallback, void* context) \
Azure.IoT.Build 18:58b667752399 544 { \
Azure.IoT.Build 18:58b667752399 545 return IoTHubDeviceTwin_SendReportedState_Impl(model, deviceTwinCallback, context); \
Azure.IoT.Build 18:58b667752399 546 } \
Azure.IoT.Build 18:58b667752399 547 static IOTHUB_CLIENT_RESULT C2(IoTHubDeviceTwin_SendReportedState, name) (name* model, IOTHUB_CLIENT_REPORTED_STATE_CALLBACK deviceTwinCallback, void* context) \
Azure.IoT.Build 18:58b667752399 548 { \
Azure.IoT.Build 18:58b667752399 549 return IoTHubDeviceTwin_SendReportedState_Impl(model, deviceTwinCallback, context); \
Azure.IoT.Build 18:58b667752399 550 } \
AzureIoTClient 17:fa1bba4c6053 551
AzureIoTClient 17:fa1bba4c6053 552 #endif /*SERIALIZER_DEVICE_TWIN_H*/
AzureIoTClient 17:fa1bba4c6053 553
AzureIoTClient 17:fa1bba4c6053 554