Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 5 #include <ctype.h>
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/optimize_size.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/crt_abstractions.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_c_shared_utility/string_tokenizer.h"
XinZhangMS 0:f7f1f0d76dd6 10 #include "azure_c_shared_utility/singlylinkedlist.h"
XinZhangMS 0:f7f1f0d76dd6 11 #include "azure_c_shared_utility/buffer_.h"
XinZhangMS 0:f7f1f0d76dd6 12 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 13 #include "azure_c_shared_utility/httpapiex.h"
XinZhangMS 0:f7f1f0d76dd6 14 #include "azure_c_shared_utility/httpapiexsas.h"
XinZhangMS 0:f7f1f0d76dd6 15 #include "azure_c_shared_utility/base64.h"
XinZhangMS 0:f7f1f0d76dd6 16 #include "azure_c_shared_utility/uniqueid.h"
XinZhangMS 0:f7f1f0d76dd6 17 #include "azure_c_shared_utility/connection_string_parser.h"
XinZhangMS 0:f7f1f0d76dd6 18
XinZhangMS 0:f7f1f0d76dd6 19 #include "parson.h"
XinZhangMS 0:f7f1f0d76dd6 20 #include "iothub_deviceconfiguration.h"
XinZhangMS 0:f7f1f0d76dd6 21 #include "iothub_sc_version.h"
XinZhangMS 0:f7f1f0d76dd6 22
XinZhangMS 0:f7f1f0d76dd6 23 DEFINE_ENUM_STRINGS(IOTHUB_DEVICE_CONFIGURATION_RESULT, IOTHUB_DEVICE_CONFIGURATION_RESULT_VALUES);
XinZhangMS 0:f7f1f0d76dd6 24
XinZhangMS 0:f7f1f0d76dd6 25 #define UID_LENGTH 37
XinZhangMS 0:f7f1f0d76dd6 26 #define IOTHUB_DEVICE_CONFIGURATIONS_MAX_REQUEST 20
XinZhangMS 0:f7f1f0d76dd6 27 static const char* HTTP_HEADER_KEY_AUTHORIZATION = "Authorization";
XinZhangMS 0:f7f1f0d76dd6 28 static const char* HTTP_HEADER_VAL_AUTHORIZATION = " ";
XinZhangMS 0:f7f1f0d76dd6 29 static const char* HTTP_HEADER_KEY_REQUEST_ID = "Request-Id";
XinZhangMS 0:f7f1f0d76dd6 30 static const char* HTTP_HEADER_KEY_USER_AGENT = "User-Agent";
XinZhangMS 0:f7f1f0d76dd6 31 static const char* HTTP_HEADER_VAL_USER_AGENT = IOTHUB_SERVICE_CLIENT_TYPE_PREFIX IOTHUB_SERVICE_CLIENT_BACKSLASH IOTHUB_SERVICE_CLIENT_VERSION;
XinZhangMS 0:f7f1f0d76dd6 32 static const char* HTTP_HEADER_KEY_ACCEPT = "Accept";
XinZhangMS 0:f7f1f0d76dd6 33 static const char* HTTP_HEADER_VAL_ACCEPT = "application/json";
XinZhangMS 0:f7f1f0d76dd6 34 static const char* HTTP_HEADER_KEY_CONTENT_TYPE = "Content-Type";
XinZhangMS 0:f7f1f0d76dd6 35 static const char* HTTP_HEADER_VAL_CONTENT_TYPE = "application/json; charset=utf-8";
XinZhangMS 0:f7f1f0d76dd6 36 static const char* HTTP_HEADER_KEY_IFMATCH = "If-Match";
XinZhangMS 0:f7f1f0d76dd6 37 static const char* HTTP_HEADER_VAL_IFMATCH = "*";
XinZhangMS 0:f7f1f0d76dd6 38
XinZhangMS 0:f7f1f0d76dd6 39 #define CONFIGURATION_JSON_KEY_CONTENT "content"
XinZhangMS 0:f7f1f0d76dd6 40 #define CONFIGURATION_JSON_KEY_DEVICE_CONTENT "deviceContent"
XinZhangMS 0:f7f1f0d76dd6 41 #define CONFIGURATION_JSON_KEY_MODULES_CONTENT "modulesContent"
XinZhangMS 0:f7f1f0d76dd6 42 #define CONFIGURATION_JSON_KEY_SYSTEM_METRICS "systemMetrics"
XinZhangMS 0:f7f1f0d76dd6 43 #define CONFIGURATION_JSON_KEY_CUSTOM_METRICS "metrics"
XinZhangMS 0:f7f1f0d76dd6 44 #define CONFIGURATION_JSON_KEY_METRICS_RESULTS "results"
XinZhangMS 0:f7f1f0d76dd6 45 #define CONFIGURATION_JSON_KEY_METRICS_QUERIES "queries"
XinZhangMS 0:f7f1f0d76dd6 46 #define CONFIGURATION_JSON_DOT_SEPARATOR "."
XinZhangMS 0:f7f1f0d76dd6 47
XinZhangMS 0:f7f1f0d76dd6 48 static const char* CONFIGURATION_JSON_KEY_CONFIGURATION_ID = "id";
XinZhangMS 0:f7f1f0d76dd6 49 static const char* CONFIGURATION_JSON_KEY_SCHEMA_VERSION = "schemaVersion";
XinZhangMS 0:f7f1f0d76dd6 50 static const char* CONFIGURATION_JSON_KEY_TARGET_CONDITION = "targetCondition";
XinZhangMS 0:f7f1f0d76dd6 51 static const char* CONFIGURATION_JSON_KEY_CREATED_TIME = "createdTimeUtc";
XinZhangMS 0:f7f1f0d76dd6 52 static const char* CONFIGURATION_JSON_KEY_LAST_UPDATED_TIME = "lastUpdatedTimeUtc";
XinZhangMS 0:f7f1f0d76dd6 53 static const char* CONFIGURATION_JSON_KEY_PRIORITY = "priority";
XinZhangMS 0:f7f1f0d76dd6 54 static const char* CONFIGURATION_JSON_KEY_ETAG = "etag";
XinZhangMS 0:f7f1f0d76dd6 55 static const char* CONFIGURATION_JSON_KEY_LABELS = "labels";
XinZhangMS 0:f7f1f0d76dd6 56
XinZhangMS 0:f7f1f0d76dd6 57 static const char* CONFIGURATION_DEVICE_CONTENT_NODE_NAME = CONFIGURATION_JSON_KEY_CONTENT CONFIGURATION_JSON_DOT_SEPARATOR CONFIGURATION_JSON_KEY_DEVICE_CONTENT;
XinZhangMS 0:f7f1f0d76dd6 58 static const char* CONFIGURATION_MODULES_CONTENT_NODE_NAME = CONFIGURATION_JSON_KEY_CONTENT CONFIGURATION_JSON_DOT_SEPARATOR CONFIGURATION_JSON_KEY_MODULES_CONTENT;
XinZhangMS 0:f7f1f0d76dd6 59 static const char* CONFIGURATION_SYSTEM_METRICS_RESULTS_NODE_NAME = CONFIGURATION_JSON_KEY_SYSTEM_METRICS CONFIGURATION_JSON_DOT_SEPARATOR CONFIGURATION_JSON_KEY_METRICS_RESULTS;
XinZhangMS 0:f7f1f0d76dd6 60 static const char* CONFIGURATION_SYSTEM_METRICS_QUERIES_NODE_NAME = CONFIGURATION_JSON_KEY_SYSTEM_METRICS CONFIGURATION_JSON_DOT_SEPARATOR CONFIGURATION_JSON_KEY_METRICS_QUERIES;
XinZhangMS 0:f7f1f0d76dd6 61 static const char* CONFIGURATION_CUSTOM_METRICS_RESULTS_NODE_NAME = CONFIGURATION_JSON_KEY_CUSTOM_METRICS CONFIGURATION_JSON_DOT_SEPARATOR CONFIGURATION_JSON_KEY_METRICS_RESULTS;
XinZhangMS 0:f7f1f0d76dd6 62 static const char* CONFIGURATION_CUSTOM_METRICS_QUERIES_NODE_NAME = CONFIGURATION_JSON_KEY_CUSTOM_METRICS CONFIGURATION_JSON_DOT_SEPARATOR CONFIGURATION_JSON_KEY_METRICS_QUERIES;
XinZhangMS 0:f7f1f0d76dd6 63
XinZhangMS 0:f7f1f0d76dd6 64 static const char* const URL_API_VERSION = "api-version=2018-03-01-preview";
XinZhangMS 0:f7f1f0d76dd6 65
XinZhangMS 0:f7f1f0d76dd6 66 static const char* const RELATIVE_PATH_FMT_DEVICECONFIGURATION = "/configurations/%s?%s";
XinZhangMS 0:f7f1f0d76dd6 67 static const char* const RELATIVE_PATH_FMT_DEVICECONFIGURATIONS = "/configurations/?top=%d&%s";
XinZhangMS 0:f7f1f0d76dd6 68 static const char* const RELATIVE_PATH_FMT_APPLYCONFIGURATIONCONTENT = "/devices/%s/applyConfigurationContent?%s";
XinZhangMS 0:f7f1f0d76dd6 69
XinZhangMS 0:f7f1f0d76dd6 70 static const char* const CONFIGURATION_DEFAULT_SCHEMA_VERSION = "1.0";
XinZhangMS 0:f7f1f0d76dd6 71 static const char* const CONFIGURATION_DEFAULT_ETAG = "MQ==";
XinZhangMS 0:f7f1f0d76dd6 72
XinZhangMS 0:f7f1f0d76dd6 73 typedef struct IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_TAG
XinZhangMS 0:f7f1f0d76dd6 74 {
XinZhangMS 0:f7f1f0d76dd6 75 char* hostname;
XinZhangMS 0:f7f1f0d76dd6 76 char* sharedAccessKey;
XinZhangMS 0:f7f1f0d76dd6 77 char* keyName;
XinZhangMS 0:f7f1f0d76dd6 78 } IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION;
XinZhangMS 0:f7f1f0d76dd6 79
XinZhangMS 0:f7f1f0d76dd6 80 static const char* generateGuid(void)
XinZhangMS 0:f7f1f0d76dd6 81 {
XinZhangMS 0:f7f1f0d76dd6 82 char* result;
XinZhangMS 0:f7f1f0d76dd6 83
XinZhangMS 0:f7f1f0d76dd6 84 if ((result = malloc(UID_LENGTH)) != NULL)
XinZhangMS 0:f7f1f0d76dd6 85 {
XinZhangMS 0:f7f1f0d76dd6 86 result[0] = '\0';
XinZhangMS 0:f7f1f0d76dd6 87 if (UniqueId_Generate(result, UID_LENGTH) != UNIQUEID_OK)
XinZhangMS 0:f7f1f0d76dd6 88 {
XinZhangMS 0:f7f1f0d76dd6 89 LogError("UniqueId_Generate failed");
XinZhangMS 0:f7f1f0d76dd6 90 free((void*)result);
XinZhangMS 0:f7f1f0d76dd6 91 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 92 }
XinZhangMS 0:f7f1f0d76dd6 93 }
XinZhangMS 0:f7f1f0d76dd6 94 return (const char*)result;
XinZhangMS 0:f7f1f0d76dd6 95 }
XinZhangMS 0:f7f1f0d76dd6 96
XinZhangMS 0:f7f1f0d76dd6 97 static STRING_HANDLE createRelativePath(IOTHUB_DEVICECONFIGURATION_REQUEST_MODE iotHubDeviceConfigurationRequestMode, const char* id, size_t numberOfConfigurations)
XinZhangMS 0:f7f1f0d76dd6 98 {
XinZhangMS 0:f7f1f0d76dd6 99 //IOTHUB_DEVICECONFIGURATION_REQUEST_GET GET {iot hub}/configurations/{configuration id} // Get single device configuration
XinZhangMS 0:f7f1f0d76dd6 100 //IOTHUB_DEVICECONFIGURATION_REQUEST_ADD PUT {iot hub}/configurations/{configuration id} // Add device configuration
XinZhangMS 0:f7f1f0d76dd6 101 //IOTHUB_DEVICECONFIGURATION_REQUEST_UPDATE PUT {iot hub}/configurations/{configuration id} // Update device configuration
XinZhangMS 0:f7f1f0d76dd6 102 //IOTHUB_DEVICECONFIGURATION_REQUEST_DELETE DELETE {iot hub}/configurations/{configuration id} // Delete device configuration
XinZhangMS 0:f7f1f0d76dd6 103 //IOTHUB_DEVICECONFIGURATION_REQUEST_GET_LIST GET {iot hub}/configurations // Get multiple configurations
XinZhangMS 0:f7f1f0d76dd6 104 //IOTHUB_DEVICECONFIGURATION_REQUEST_APPLY_CONFIGURATION_CONTENT POST {iot hub}/devices/{deviceOrModule id}/applyConfigurationContent // Apply device configuration to device or module
XinZhangMS 0:f7f1f0d76dd6 105
XinZhangMS 0:f7f1f0d76dd6 106 STRING_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 107
XinZhangMS 0:f7f1f0d76dd6 108 if (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_GET_LIST)
XinZhangMS 0:f7f1f0d76dd6 109 {
XinZhangMS 0:f7f1f0d76dd6 110 result = STRING_construct_sprintf(RELATIVE_PATH_FMT_DEVICECONFIGURATIONS, numberOfConfigurations, URL_API_VERSION);
XinZhangMS 0:f7f1f0d76dd6 111 }
XinZhangMS 0:f7f1f0d76dd6 112 else if ((iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_ADD) || (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_UPDATE) || (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_GET) || (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_DELETE))
XinZhangMS 0:f7f1f0d76dd6 113 {
XinZhangMS 0:f7f1f0d76dd6 114 result = STRING_construct_sprintf(RELATIVE_PATH_FMT_DEVICECONFIGURATION, id, URL_API_VERSION);
XinZhangMS 0:f7f1f0d76dd6 115 }
XinZhangMS 0:f7f1f0d76dd6 116 else if (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_APPLY_CONFIGURATION_CONTENT)
XinZhangMS 0:f7f1f0d76dd6 117 {
XinZhangMS 0:f7f1f0d76dd6 118 result = STRING_construct_sprintf(RELATIVE_PATH_FMT_APPLYCONFIGURATIONCONTENT, id, URL_API_VERSION);
XinZhangMS 0:f7f1f0d76dd6 119 }
XinZhangMS 0:f7f1f0d76dd6 120 else
XinZhangMS 0:f7f1f0d76dd6 121 {
XinZhangMS 0:f7f1f0d76dd6 122 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 123 }
XinZhangMS 0:f7f1f0d76dd6 124 return result;
XinZhangMS 0:f7f1f0d76dd6 125 }
XinZhangMS 0:f7f1f0d76dd6 126
XinZhangMS 0:f7f1f0d76dd6 127 static HTTP_HEADERS_HANDLE createHttpHeader(IOTHUB_DEVICECONFIGURATION_REQUEST_MODE iotHubDeviceConfigurationRequestMode)
XinZhangMS 0:f7f1f0d76dd6 128 {
XinZhangMS 0:f7f1f0d76dd6 129 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_020: [ IoTHubDeviceConfiguration_GetConfiguration shall add the following headers to the created HTTP GET request: authorization=sasToken,Request-Id=<generatedGuid>,Accept=application/json,Content-Type=application/json,charset=utf-8 ]*/
XinZhangMS 0:f7f1f0d76dd6 130 HTTP_HEADERS_HANDLE httpHeader;
XinZhangMS 0:f7f1f0d76dd6 131 const char* guid = NULL;
XinZhangMS 0:f7f1f0d76dd6 132
XinZhangMS 0:f7f1f0d76dd6 133 if ((httpHeader = HTTPHeaders_Alloc()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 134 {
XinZhangMS 0:f7f1f0d76dd6 135 LogError("HTTPHeaders_Alloc failed");
XinZhangMS 0:f7f1f0d76dd6 136 }
XinZhangMS 0:f7f1f0d76dd6 137 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_AUTHORIZATION, HTTP_HEADER_VAL_AUTHORIZATION) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 138 {
XinZhangMS 0:f7f1f0d76dd6 139 LogError("HTTPHeaders_AddHeaderNameValuePair failed for Authorization header");
XinZhangMS 0:f7f1f0d76dd6 140 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 141 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 142 }
XinZhangMS 0:f7f1f0d76dd6 143 else if ((guid = generateGuid()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 144 {
XinZhangMS 0:f7f1f0d76dd6 145 LogError("GUID creation failed");
XinZhangMS 0:f7f1f0d76dd6 146 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 147 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 148 }
XinZhangMS 0:f7f1f0d76dd6 149 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_REQUEST_ID, guid) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 150 {
XinZhangMS 0:f7f1f0d76dd6 151 LogError("HTTPHeaders_AddHeaderNameValuePair failed for RequestId header");
XinZhangMS 0:f7f1f0d76dd6 152 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 153 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 154 }
XinZhangMS 0:f7f1f0d76dd6 155 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_USER_AGENT, HTTP_HEADER_VAL_USER_AGENT) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 156 {
XinZhangMS 0:f7f1f0d76dd6 157 LogError("HTTPHeaders_AddHeaderNameValuePair failed for User-Agent header");
XinZhangMS 0:f7f1f0d76dd6 158 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 159 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 160 }
XinZhangMS 0:f7f1f0d76dd6 161 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_ACCEPT, HTTP_HEADER_VAL_ACCEPT) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 162 {
XinZhangMS 0:f7f1f0d76dd6 163 LogError("HTTPHeaders_AddHeaderNameValuePair failed for Accept header");
XinZhangMS 0:f7f1f0d76dd6 164 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 165 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 166 }
XinZhangMS 0:f7f1f0d76dd6 167 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_CONTENT_TYPE, HTTP_HEADER_VAL_CONTENT_TYPE) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 168 {
XinZhangMS 0:f7f1f0d76dd6 169 LogError("HTTPHeaders_AddHeaderNameValuePair failed for Content-Type header");
XinZhangMS 0:f7f1f0d76dd6 170 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 171 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 172 }
XinZhangMS 0:f7f1f0d76dd6 173 else if ((iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_UPDATE) || (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_DELETE))
XinZhangMS 0:f7f1f0d76dd6 174 {
XinZhangMS 0:f7f1f0d76dd6 175 if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_IFMATCH, HTTP_HEADER_VAL_IFMATCH) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 176 {
XinZhangMS 0:f7f1f0d76dd6 177 LogError("HTTPHeaders_AddHeaderNameValuePair failed for If-Match header");
XinZhangMS 0:f7f1f0d76dd6 178 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 179 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 180 }
XinZhangMS 0:f7f1f0d76dd6 181 }
XinZhangMS 0:f7f1f0d76dd6 182 free((void*)guid);
XinZhangMS 0:f7f1f0d76dd6 183
XinZhangMS 0:f7f1f0d76dd6 184 return httpHeader;
XinZhangMS 0:f7f1f0d76dd6 185 }
XinZhangMS 0:f7f1f0d76dd6 186
XinZhangMS 0:f7f1f0d76dd6 187 static IOTHUB_DEVICE_CONFIGURATION_RESULT sendHttpRequestDeviceConfiguration(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, IOTHUB_DEVICECONFIGURATION_REQUEST_MODE iotHubDeviceConfigurationRequestMode, const char* id, BUFFER_HANDLE json, size_t maxConfigurationsCount, BUFFER_HANDLE responseBuffer)
XinZhangMS 0:f7f1f0d76dd6 188 {
XinZhangMS 0:f7f1f0d76dd6 189 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 190
XinZhangMS 0:f7f1f0d76dd6 191 STRING_HANDLE uriResource = NULL;
XinZhangMS 0:f7f1f0d76dd6 192 STRING_HANDLE accessKey = NULL;
XinZhangMS 0:f7f1f0d76dd6 193 STRING_HANDLE keyName = NULL;
XinZhangMS 0:f7f1f0d76dd6 194 HTTPAPIEX_SAS_HANDLE httpExApiSasHandle;
XinZhangMS 0:f7f1f0d76dd6 195 HTTPAPIEX_HANDLE httpExApiHandle;
XinZhangMS 0:f7f1f0d76dd6 196 HTTP_HEADERS_HANDLE httpHeader;
XinZhangMS 0:f7f1f0d76dd6 197
XinZhangMS 0:f7f1f0d76dd6 198 if ((uriResource = STRING_construct(serviceClientDeviceConfigurationHandle->hostname)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 199 {
XinZhangMS 0:f7f1f0d76dd6 200 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_024: [ If any of the HTTPAPI call fails IoTHubDeviceConfiguration_GetConfiguration shall fail and return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 201 LogError("STRING_construct failed for uriResource");
XinZhangMS 0:f7f1f0d76dd6 202 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 203 }
XinZhangMS 0:f7f1f0d76dd6 204 else if ((accessKey = STRING_construct(serviceClientDeviceConfigurationHandle->sharedAccessKey)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 205 {
XinZhangMS 0:f7f1f0d76dd6 206 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_024: [ If any of the call fails during the HTTP creation IoTHubDeviceConfiguration_GetConfiguration shall fail and return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 207 LogError("STRING_construct failed for accessKey");
XinZhangMS 0:f7f1f0d76dd6 208 STRING_delete(uriResource);
XinZhangMS 0:f7f1f0d76dd6 209 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 210 }
XinZhangMS 0:f7f1f0d76dd6 211 else if ((keyName = STRING_construct(serviceClientDeviceConfigurationHandle->keyName)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 212 {
XinZhangMS 0:f7f1f0d76dd6 213 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_024: [ If any of the call fails during the HTTP creation IoTHubDeviceConfiguration_GetConfiguration shall fail and return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 214 LogError("STRING_construct failed for keyName");
XinZhangMS 0:f7f1f0d76dd6 215 STRING_delete(accessKey);
XinZhangMS 0:f7f1f0d76dd6 216 STRING_delete(uriResource);
XinZhangMS 0:f7f1f0d76dd6 217 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 218 }
XinZhangMS 0:f7f1f0d76dd6 219 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_020: [ IoTHubDeviceConfiguration_GetConfiguration shall add the following headers to the created HTTP GET request: authorization=sasToken,Request-Id=<generatedGuid>,Accept=application/json,Content-Type=application/json,charset=utf-8 ]*/
XinZhangMS 0:f7f1f0d76dd6 220 else if ((httpHeader = createHttpHeader(iotHubDeviceConfigurationRequestMode)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 221 {
XinZhangMS 0:f7f1f0d76dd6 222 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_024: [ If any of the call fails during the HTTP creation IoTHubDeviceConfiguration_GetConfiguration shall fail and return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 223 LogError("HttpHeader creation failed");
XinZhangMS 0:f7f1f0d76dd6 224 STRING_delete(keyName);
XinZhangMS 0:f7f1f0d76dd6 225 STRING_delete(accessKey);
XinZhangMS 0:f7f1f0d76dd6 226 STRING_delete(uriResource);
XinZhangMS 0:f7f1f0d76dd6 227 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 228 }
XinZhangMS 0:f7f1f0d76dd6 229 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_021: [ IoTHubDeviceConfiguration_GetConfiguration shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ]*/
XinZhangMS 0:f7f1f0d76dd6 230 else if ((httpExApiSasHandle = HTTPAPIEX_SAS_Create(accessKey, uriResource, keyName)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 231 {
XinZhangMS 0:f7f1f0d76dd6 232 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_025: [ If any of the HTTPAPI call fails IoTHubDeviceConfiguration_GetConfiguration shall fail and return IOTHUB_DEVICE_CONFIGURATION_HTTPAPI_ERROR ]*/
XinZhangMS 0:f7f1f0d76dd6 233 LogError("HTTPAPIEX_SAS_Create failed");
XinZhangMS 0:f7f1f0d76dd6 234 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 235 STRING_delete(keyName);
XinZhangMS 0:f7f1f0d76dd6 236 STRING_delete(accessKey);
XinZhangMS 0:f7f1f0d76dd6 237 STRING_delete(uriResource);
XinZhangMS 0:f7f1f0d76dd6 238 result = IOTHUB_DEVICE_CONFIGURATION_HTTPAPI_ERROR;
XinZhangMS 0:f7f1f0d76dd6 239 }
XinZhangMS 0:f7f1f0d76dd6 240 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_022: [ IoTHubDeviceConfiguration_GetConfiguration shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ]*/
XinZhangMS 0:f7f1f0d76dd6 241 else if ((httpExApiHandle = HTTPAPIEX_Create(serviceClientDeviceConfigurationHandle->hostname)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 242 {
XinZhangMS 0:f7f1f0d76dd6 243 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_025: [ If any of the HTTPAPI call fails IoTHubDeviceConfiguration_GetConfiguration shall fail and return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 244 LogError("HTTPAPIEX_Create failed");
XinZhangMS 0:f7f1f0d76dd6 245 HTTPAPIEX_SAS_Destroy(httpExApiSasHandle);
XinZhangMS 0:f7f1f0d76dd6 246 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 247 STRING_delete(keyName);
XinZhangMS 0:f7f1f0d76dd6 248 STRING_delete(accessKey);
XinZhangMS 0:f7f1f0d76dd6 249 STRING_delete(uriResource);
XinZhangMS 0:f7f1f0d76dd6 250 result = IOTHUB_DEVICE_CONFIGURATION_HTTPAPI_ERROR;
XinZhangMS 0:f7f1f0d76dd6 251 }
XinZhangMS 0:f7f1f0d76dd6 252 else
XinZhangMS 0:f7f1f0d76dd6 253 {
XinZhangMS 0:f7f1f0d76dd6 254 HTTPAPI_REQUEST_TYPE httpApiRequestType = HTTPAPI_REQUEST_GET;
XinZhangMS 0:f7f1f0d76dd6 255 STRING_HANDLE relativePath;
XinZhangMS 0:f7f1f0d76dd6 256 unsigned int statusCode = 0;
XinZhangMS 0:f7f1f0d76dd6 257 unsigned char is_error = 0;
XinZhangMS 0:f7f1f0d76dd6 258
XinZhangMS 0:f7f1f0d76dd6 259 if ((iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_ADD) || (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_UPDATE))
XinZhangMS 0:f7f1f0d76dd6 260 {
XinZhangMS 0:f7f1f0d76dd6 261 httpApiRequestType = HTTPAPI_REQUEST_PUT;
XinZhangMS 0:f7f1f0d76dd6 262 }
XinZhangMS 0:f7f1f0d76dd6 263 else if ((iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_GET) || (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_GET_LIST))
XinZhangMS 0:f7f1f0d76dd6 264 {
XinZhangMS 0:f7f1f0d76dd6 265 httpApiRequestType = HTTPAPI_REQUEST_GET;
XinZhangMS 0:f7f1f0d76dd6 266 }
XinZhangMS 0:f7f1f0d76dd6 267 else if (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_DELETE)
XinZhangMS 0:f7f1f0d76dd6 268 {
XinZhangMS 0:f7f1f0d76dd6 269 httpApiRequestType = HTTPAPI_REQUEST_DELETE;
XinZhangMS 0:f7f1f0d76dd6 270 }
XinZhangMS 0:f7f1f0d76dd6 271 else if (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_APPLY_CONFIGURATION_CONTENT)
XinZhangMS 0:f7f1f0d76dd6 272 {
XinZhangMS 0:f7f1f0d76dd6 273 httpApiRequestType = HTTPAPI_REQUEST_POST;
XinZhangMS 0:f7f1f0d76dd6 274 }
XinZhangMS 0:f7f1f0d76dd6 275 else
XinZhangMS 0:f7f1f0d76dd6 276 {
XinZhangMS 0:f7f1f0d76dd6 277 is_error = 1;
XinZhangMS 0:f7f1f0d76dd6 278 }
XinZhangMS 0:f7f1f0d76dd6 279
XinZhangMS 0:f7f1f0d76dd6 280 if (is_error)
XinZhangMS 0:f7f1f0d76dd6 281 {
XinZhangMS 0:f7f1f0d76dd6 282 LogError("Invalid request type");
XinZhangMS 0:f7f1f0d76dd6 283 result = IOTHUB_DEVICE_CONFIGURATION_HTTPAPI_ERROR;
XinZhangMS 0:f7f1f0d76dd6 284 }
XinZhangMS 0:f7f1f0d76dd6 285 else
XinZhangMS 0:f7f1f0d76dd6 286 {
XinZhangMS 0:f7f1f0d76dd6 287 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_019: [ IoTHubDeviceConfiguration_GetConfiguration shall create HTTP GET request URL using the given configurationId using the following format: url/configurations/[configurationId] ]*/
XinZhangMS 0:f7f1f0d76dd6 288 if ((relativePath = createRelativePath(iotHubDeviceConfigurationRequestMode, id, maxConfigurationsCount)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 289 {
XinZhangMS 0:f7f1f0d76dd6 290 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_024: [ If any of the call fails during the HTTP creation IoTHubDeviceConfiguration_GetConfiguration shall fail and return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 291 LogError("Failure creating relative path");
XinZhangMS 0:f7f1f0d76dd6 292 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 293 }
XinZhangMS 0:f7f1f0d76dd6 294 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_023: [ IoTHubDeviceConfiguration_GetConfiguration shall execute the HTTP GET request by calling HTTPAPIEX_ExecuteRequest ]*/
XinZhangMS 0:f7f1f0d76dd6 295 else if (HTTPAPIEX_SAS_ExecuteRequest(httpExApiSasHandle, httpExApiHandle, httpApiRequestType, STRING_c_str(relativePath), httpHeader, json, &statusCode, NULL, responseBuffer) != HTTPAPIEX_OK)
XinZhangMS 0:f7f1f0d76dd6 296 {
XinZhangMS 0:f7f1f0d76dd6 297 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_025: [ If any of the HTTPAPI call fails IoTHubDeviceConfiguration_GetConfiguration shall fail and return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 298 LogError("HTTPAPIEX_SAS_ExecuteRequest failed");
XinZhangMS 0:f7f1f0d76dd6 299 STRING_delete(relativePath);
XinZhangMS 0:f7f1f0d76dd6 300 result = IOTHUB_DEVICE_CONFIGURATION_HTTPAPI_ERROR;
XinZhangMS 0:f7f1f0d76dd6 301 }
XinZhangMS 0:f7f1f0d76dd6 302 else
XinZhangMS 0:f7f1f0d76dd6 303 {
XinZhangMS 0:f7f1f0d76dd6 304 STRING_delete(relativePath);
XinZhangMS 0:f7f1f0d76dd6 305 if ((((iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_ADD) ||
XinZhangMS 0:f7f1f0d76dd6 306 (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_GET) ||
XinZhangMS 0:f7f1f0d76dd6 307 (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_GET_LIST) ||
XinZhangMS 0:f7f1f0d76dd6 308 (iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_UPDATE)) && (statusCode == 200)) ||
XinZhangMS 0:f7f1f0d76dd6 309 ((iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_DELETE) && (statusCode == 204)) ||
XinZhangMS 0:f7f1f0d76dd6 310 ((iotHubDeviceConfigurationRequestMode == IOTHUB_DEVICECONFIGURATION_REQUEST_APPLY_CONFIGURATION_CONTENT) && ((statusCode == 200) || (statusCode == 204)))
XinZhangMS 0:f7f1f0d76dd6 311 )
XinZhangMS 0:f7f1f0d76dd6 312 {
XinZhangMS 0:f7f1f0d76dd6 313 /*CodesSRS_IOTHUBDEVICECONFIGURATION_38_030: [ Otherwise IoTHubDeviceConfiguration_GetConfiguration shall save the received deviceConfiguration to the out parameter and return with it ]*/
XinZhangMS 0:f7f1f0d76dd6 314 result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 315 }
XinZhangMS 0:f7f1f0d76dd6 316 else
XinZhangMS 0:f7f1f0d76dd6 317 {
XinZhangMS 0:f7f1f0d76dd6 318 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_026: [ IoTHubDeviceConfiguration_GetConfiguration shall verify the received HTTP status code and if it is not equal to 200 then return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 319 LogError("Http Failure status code %d.", statusCode);
XinZhangMS 0:f7f1f0d76dd6 320 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 321 }
XinZhangMS 0:f7f1f0d76dd6 322 }
XinZhangMS 0:f7f1f0d76dd6 323 }
XinZhangMS 0:f7f1f0d76dd6 324 HTTPAPIEX_Destroy(httpExApiHandle);
XinZhangMS 0:f7f1f0d76dd6 325 HTTPAPIEX_SAS_Destroy(httpExApiSasHandle);
XinZhangMS 0:f7f1f0d76dd6 326 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 327 STRING_delete(keyName);
XinZhangMS 0:f7f1f0d76dd6 328 STRING_delete(accessKey);
XinZhangMS 0:f7f1f0d76dd6 329 STRING_delete(uriResource);
XinZhangMS 0:f7f1f0d76dd6 330 }
XinZhangMS 0:f7f1f0d76dd6 331 return result;
XinZhangMS 0:f7f1f0d76dd6 332 }
XinZhangMS 0:f7f1f0d76dd6 333
XinZhangMS 0:f7f1f0d76dd6 334 static JSON_Value* createConfigurationContentPayload(const IOTHUB_DEVICE_CONFIGURATION_CONTENT* configurationContent)
XinZhangMS 0:f7f1f0d76dd6 335 {
XinZhangMS 0:f7f1f0d76dd6 336 JSON_Value* result = NULL;
XinZhangMS 0:f7f1f0d76dd6 337 JSON_Object* root_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 338
XinZhangMS 0:f7f1f0d76dd6 339 if (configurationContent == NULL)
XinZhangMS 0:f7f1f0d76dd6 340 {
XinZhangMS 0:f7f1f0d76dd6 341 LogError("configuration cannot be null");
XinZhangMS 0:f7f1f0d76dd6 342 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 343 }
XinZhangMS 0:f7f1f0d76dd6 344 else if (((configurationContent->deviceContent == NULL) && (configurationContent->modulesContent == NULL)) ||
XinZhangMS 0:f7f1f0d76dd6 345 ((configurationContent->deviceContent != NULL && strlen(configurationContent->deviceContent) == 0) && (configurationContent->modulesContent != NULL && strlen(configurationContent->modulesContent) == 0)))
XinZhangMS 0:f7f1f0d76dd6 346 {
XinZhangMS 0:f7f1f0d76dd6 347 LogError("both deviceContent and modulesContent cannot be NULL or empty");
XinZhangMS 0:f7f1f0d76dd6 348 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 349 }
XinZhangMS 0:f7f1f0d76dd6 350 if ((result = json_value_init_object()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 351 {
XinZhangMS 0:f7f1f0d76dd6 352 LogError("json_value_init_object failed");
XinZhangMS 0:f7f1f0d76dd6 353 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 354 }
XinZhangMS 0:f7f1f0d76dd6 355 else if ((root_object = json_value_get_object(result)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 356 {
XinZhangMS 0:f7f1f0d76dd6 357 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 358 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 359 }
XinZhangMS 0:f7f1f0d76dd6 360 else if ((configurationContent->deviceContent != NULL) && (strlen(configurationContent->deviceContent) > 0) && (json_object_set_value(root_object, CONFIGURATION_JSON_KEY_DEVICE_CONTENT, json_parse_string(configurationContent->deviceContent))) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 361 {
XinZhangMS 0:f7f1f0d76dd6 362 LogError("json_object_set_string failed for deviceContent");
XinZhangMS 0:f7f1f0d76dd6 363 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 364 }
XinZhangMS 0:f7f1f0d76dd6 365 else if ((configurationContent->modulesContent != NULL) && (strlen(configurationContent->modulesContent) > 0) && (json_object_set_value(root_object, CONFIGURATION_JSON_KEY_MODULES_CONTENT, json_parse_string(configurationContent->modulesContent))) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 366 {
XinZhangMS 0:f7f1f0d76dd6 367 LogError("json_object_set_string failed for modulesContent");
XinZhangMS 0:f7f1f0d76dd6 368 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 369 }
XinZhangMS 0:f7f1f0d76dd6 370
XinZhangMS 0:f7f1f0d76dd6 371 return result;
XinZhangMS 0:f7f1f0d76dd6 372 }
XinZhangMS 0:f7f1f0d76dd6 373
XinZhangMS 0:f7f1f0d76dd6 374 static JSON_Value* createConfigurationMetricsQueriesPayload(const IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION* configurationMetricsDefinition)
XinZhangMS 0:f7f1f0d76dd6 375 {
XinZhangMS 0:f7f1f0d76dd6 376 JSON_Value* result = NULL;
XinZhangMS 0:f7f1f0d76dd6 377 JSON_Value* new_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 378 JSON_Object* root_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 379 JSON_Object* new_value_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 380
XinZhangMS 0:f7f1f0d76dd6 381 if (configurationMetricsDefinition == NULL)
XinZhangMS 0:f7f1f0d76dd6 382 {
XinZhangMS 0:f7f1f0d76dd6 383 LogError("configuration cannot be null");
XinZhangMS 0:f7f1f0d76dd6 384 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 385 }
XinZhangMS 0:f7f1f0d76dd6 386 else if ((result = json_value_init_object()) == NULL || (new_value = json_value_init_object()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 387 {
XinZhangMS 0:f7f1f0d76dd6 388 LogError("json_value_init_object failed");
XinZhangMS 0:f7f1f0d76dd6 389 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 390 }
XinZhangMS 0:f7f1f0d76dd6 391 else if ((root_object = json_value_get_object(result)) == NULL || (new_value_object = json_value_get_object(new_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 392 {
XinZhangMS 0:f7f1f0d76dd6 393 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 394 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 395 }
XinZhangMS 0:f7f1f0d76dd6 396 else if (json_object_set_value(root_object, CONFIGURATION_JSON_KEY_METRICS_QUERIES, new_value) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 397 {
XinZhangMS 0:f7f1f0d76dd6 398 LogError("json_object_set_value failed for deviceContent");
XinZhangMS 0:f7f1f0d76dd6 399 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 400 }
XinZhangMS 0:f7f1f0d76dd6 401 else
XinZhangMS 0:f7f1f0d76dd6 402 {
XinZhangMS 0:f7f1f0d76dd6 403 for (size_t i = 0; i < configurationMetricsDefinition->numQueries; i++)
XinZhangMS 0:f7f1f0d76dd6 404 {
XinZhangMS 0:f7f1f0d76dd6 405 if (json_object_set_string(new_value_object, (const char*)configurationMetricsDefinition->queryNames[i], configurationMetricsDefinition->queryStrings[i]) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 406 {
XinZhangMS 0:f7f1f0d76dd6 407 LogError("json_object_set_string failed");
XinZhangMS 0:f7f1f0d76dd6 408 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 409 break;
XinZhangMS 0:f7f1f0d76dd6 410 }
XinZhangMS 0:f7f1f0d76dd6 411 }
XinZhangMS 0:f7f1f0d76dd6 412 }
XinZhangMS 0:f7f1f0d76dd6 413
XinZhangMS 0:f7f1f0d76dd6 414 return result;
XinZhangMS 0:f7f1f0d76dd6 415 }
XinZhangMS 0:f7f1f0d76dd6 416
XinZhangMS 0:f7f1f0d76dd6 417 static JSON_Value* createConfigurationLabelsPayload(const IOTHUB_DEVICE_CONFIGURATION_LABELS* configurationLabels)
XinZhangMS 0:f7f1f0d76dd6 418 {
XinZhangMS 0:f7f1f0d76dd6 419 JSON_Value* result = NULL;
XinZhangMS 0:f7f1f0d76dd6 420 JSON_Object* root_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 421
XinZhangMS 0:f7f1f0d76dd6 422 if (configurationLabels == NULL)
XinZhangMS 0:f7f1f0d76dd6 423 {
XinZhangMS 0:f7f1f0d76dd6 424 LogError("configurationLabels cannot be null");
XinZhangMS 0:f7f1f0d76dd6 425 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 426 }
XinZhangMS 0:f7f1f0d76dd6 427 else if (configurationLabels->numLabels == 0)
XinZhangMS 0:f7f1f0d76dd6 428 {
XinZhangMS 0:f7f1f0d76dd6 429 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_010: [ IoTHubDeviceConfiguration_AddConfiguration shall return NULL for labels, when device configuration label list is empty ] */
XinZhangMS 0:f7f1f0d76dd6 430 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 431 }
XinZhangMS 0:f7f1f0d76dd6 432 else if ((result = json_value_init_object()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 433 {
XinZhangMS 0:f7f1f0d76dd6 434 LogError("json_value_init_object failed");
XinZhangMS 0:f7f1f0d76dd6 435 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 436 }
XinZhangMS 0:f7f1f0d76dd6 437 else if ((root_object = json_value_get_object(result)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 438 {
XinZhangMS 0:f7f1f0d76dd6 439 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 440 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 441 }
XinZhangMS 0:f7f1f0d76dd6 442 else
XinZhangMS 0:f7f1f0d76dd6 443 {
XinZhangMS 0:f7f1f0d76dd6 444 for (size_t i = 0; i < configurationLabels->numLabels; i++)
XinZhangMS 0:f7f1f0d76dd6 445 {
XinZhangMS 0:f7f1f0d76dd6 446 if (json_object_set_string(root_object, (const char*)configurationLabels->labelNames[i], configurationLabels->labelValues[i]) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 447 {
XinZhangMS 0:f7f1f0d76dd6 448 LogError("json_object_set_value failed");
XinZhangMS 0:f7f1f0d76dd6 449 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 450 break;
XinZhangMS 0:f7f1f0d76dd6 451 }
XinZhangMS 0:f7f1f0d76dd6 452 }
XinZhangMS 0:f7f1f0d76dd6 453 }
XinZhangMS 0:f7f1f0d76dd6 454
XinZhangMS 0:f7f1f0d76dd6 455 return result;
XinZhangMS 0:f7f1f0d76dd6 456 }
XinZhangMS 0:f7f1f0d76dd6 457
XinZhangMS 0:f7f1f0d76dd6 458 static BUFFER_HANDLE createConfigurationPayloadJson(const IOTHUB_DEVICE_CONFIGURATION* configuration)
XinZhangMS 0:f7f1f0d76dd6 459 {
XinZhangMS 0:f7f1f0d76dd6 460 BUFFER_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 461
XinZhangMS 0:f7f1f0d76dd6 462 JSON_Value* root_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 463 JSON_Object* root_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 464 JSON_Value* configurationContentJson;
XinZhangMS 0:f7f1f0d76dd6 465 JSON_Value* configurationLabelsJson;
XinZhangMS 0:f7f1f0d76dd6 466 JSON_Value* metricsQueriesJson;
XinZhangMS 0:f7f1f0d76dd6 467 JSON_Value* systemMetricsQueriesJson;
XinZhangMS 0:f7f1f0d76dd6 468
XinZhangMS 0:f7f1f0d76dd6 469 if (configuration == NULL)
XinZhangMS 0:f7f1f0d76dd6 470 {
XinZhangMS 0:f7f1f0d76dd6 471 LogError("configuration cannot be null");
XinZhangMS 0:f7f1f0d76dd6 472 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 473 }
XinZhangMS 0:f7f1f0d76dd6 474 else if (configuration->configurationId == NULL)
XinZhangMS 0:f7f1f0d76dd6 475 {
XinZhangMS 0:f7f1f0d76dd6 476 LogError("Configuration id cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 477 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 478 }
XinZhangMS 0:f7f1f0d76dd6 479 else if (((configuration->content).deviceContent == NULL) && (((configuration->content).modulesContent) == NULL))
XinZhangMS 0:f7f1f0d76dd6 480 {
XinZhangMS 0:f7f1f0d76dd6 481 LogError("deviceContent and modulesContent both cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 482 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 483 }
XinZhangMS 0:f7f1f0d76dd6 484 else if ((root_value = json_value_init_object()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 485 {
XinZhangMS 0:f7f1f0d76dd6 486 LogError("json_value_init_object failed");
XinZhangMS 0:f7f1f0d76dd6 487 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 488 }
XinZhangMS 0:f7f1f0d76dd6 489 else if ((root_object = json_value_get_object(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 490 {
XinZhangMS 0:f7f1f0d76dd6 491 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 492 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 493 }
XinZhangMS 0:f7f1f0d76dd6 494 else if ((json_object_set_string(root_object, CONFIGURATION_JSON_KEY_CONFIGURATION_ID, configuration->configurationId)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 495 {
XinZhangMS 0:f7f1f0d76dd6 496 LogError("json_object_set_string failed for configurationId");
XinZhangMS 0:f7f1f0d76dd6 497 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 498 }
XinZhangMS 0:f7f1f0d76dd6 499 else if ((json_object_set_string(root_object, CONFIGURATION_JSON_KEY_SCHEMA_VERSION, configuration->schemaVersion)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 500 {
XinZhangMS 0:f7f1f0d76dd6 501 LogError("json_object_set_string failed for schemaVersion");
XinZhangMS 0:f7f1f0d76dd6 502 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 503 }
XinZhangMS 0:f7f1f0d76dd6 504 else if ((json_object_set_string(root_object, CONFIGURATION_JSON_KEY_TARGET_CONDITION, configuration->targetCondition)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 505 {
XinZhangMS 0:f7f1f0d76dd6 506 LogError("json_object_set_string failed for targetCondition");
XinZhangMS 0:f7f1f0d76dd6 507 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 508 }
XinZhangMS 0:f7f1f0d76dd6 509 else if ((json_object_set_number(root_object, CONFIGURATION_JSON_KEY_PRIORITY, configuration->priority)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 510 {
XinZhangMS 0:f7f1f0d76dd6 511 LogError("json_object_set_string failed for priority");
XinZhangMS 0:f7f1f0d76dd6 512 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 513 }
XinZhangMS 0:f7f1f0d76dd6 514 else if ((json_object_set_string(root_object, CONFIGURATION_JSON_KEY_ETAG, configuration->eTag)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 515 {
XinZhangMS 0:f7f1f0d76dd6 516 LogError("json_object_set_string failed for eTag");
XinZhangMS 0:f7f1f0d76dd6 517 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 518 }
XinZhangMS 0:f7f1f0d76dd6 519 else if (((configuration->createdTimeUtc != NULL) && json_object_set_string(root_object, CONFIGURATION_JSON_KEY_CREATED_TIME, configuration->createdTimeUtc)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 520 {
XinZhangMS 0:f7f1f0d76dd6 521 LogError("json_object_set_string failed for createdTimeUtc");
XinZhangMS 0:f7f1f0d76dd6 522 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 523 }
XinZhangMS 0:f7f1f0d76dd6 524 else if (((configuration->lastUpdatedTimeUtc != NULL) && json_object_set_string(root_object, CONFIGURATION_JSON_KEY_CREATED_TIME, configuration->lastUpdatedTimeUtc)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 525 {
XinZhangMS 0:f7f1f0d76dd6 526 LogError("json_object_set_string failed for lastUpdatedTimeUtc");
XinZhangMS 0:f7f1f0d76dd6 527 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 528 }
XinZhangMS 0:f7f1f0d76dd6 529 else if (((configurationLabelsJson = createConfigurationLabelsPayload(&configuration->labels)) != NULL) && ((json_object_set_value(root_object, CONFIGURATION_JSON_KEY_LABELS, configurationLabelsJson)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 530 {
XinZhangMS 0:f7f1f0d76dd6 531 LogError("json_object_set_string failed for configurationLabelsJson");
XinZhangMS 0:f7f1f0d76dd6 532 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 533 }
XinZhangMS 0:f7f1f0d76dd6 534 else if ((((configurationContentJson = createConfigurationContentPayload(&configuration->content)) != NULL) && ((json_object_set_value(root_object, CONFIGURATION_JSON_KEY_CONTENT, configurationContentJson)) != JSONSuccess)))
XinZhangMS 0:f7f1f0d76dd6 535 {
XinZhangMS 0:f7f1f0d76dd6 536 LogError("json_object_set_string failed for configurationContentJson");
XinZhangMS 0:f7f1f0d76dd6 537 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 538 }
XinZhangMS 0:f7f1f0d76dd6 539 else if (((metricsQueriesJson = createConfigurationMetricsQueriesPayload(&configuration->metricsDefinition)) != NULL) && ((json_object_set_value(root_object, CONFIGURATION_JSON_KEY_CUSTOM_METRICS, metricsQueriesJson)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 540 {
XinZhangMS 0:f7f1f0d76dd6 541 LogError("json_object_set_string failed for metricsQueriesJson");
XinZhangMS 0:f7f1f0d76dd6 542 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 543 }
XinZhangMS 0:f7f1f0d76dd6 544 else if (((systemMetricsQueriesJson = createConfigurationMetricsQueriesPayload(&configuration->systemMetricsDefinition)) != NULL) && ((json_object_set_value(root_object, CONFIGURATION_JSON_KEY_SYSTEM_METRICS, systemMetricsQueriesJson)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 545 {
XinZhangMS 0:f7f1f0d76dd6 546 LogError("json_object_set_string failed for systemMetricsQueriesJson");
XinZhangMS 0:f7f1f0d76dd6 547 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 548 }
XinZhangMS 0:f7f1f0d76dd6 549 else
XinZhangMS 0:f7f1f0d76dd6 550 {
XinZhangMS 0:f7f1f0d76dd6 551 char* serialized_string;
XinZhangMS 0:f7f1f0d76dd6 552 if ((serialized_string = json_serialize_to_string(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 553 {
XinZhangMS 0:f7f1f0d76dd6 554 LogError("json_serialize_to_string failed");
XinZhangMS 0:f7f1f0d76dd6 555 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 556 }
XinZhangMS 0:f7f1f0d76dd6 557 else
XinZhangMS 0:f7f1f0d76dd6 558 {
XinZhangMS 0:f7f1f0d76dd6 559 if ((result = BUFFER_create((const unsigned char*)serialized_string, strlen(serialized_string))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 560 {
XinZhangMS 0:f7f1f0d76dd6 561 LogError("Buffer_Create failed");
XinZhangMS 0:f7f1f0d76dd6 562 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 563 }
XinZhangMS 0:f7f1f0d76dd6 564 json_free_serialized_string(serialized_string);
XinZhangMS 0:f7f1f0d76dd6 565 }
XinZhangMS 0:f7f1f0d76dd6 566 }
XinZhangMS 0:f7f1f0d76dd6 567
XinZhangMS 0:f7f1f0d76dd6 568 json_object_clear(root_object);
XinZhangMS 0:f7f1f0d76dd6 569
XinZhangMS 0:f7f1f0d76dd6 570 if (root_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 571 json_value_free(root_value);
XinZhangMS 0:f7f1f0d76dd6 572
XinZhangMS 0:f7f1f0d76dd6 573 return result;
XinZhangMS 0:f7f1f0d76dd6 574 }
XinZhangMS 0:f7f1f0d76dd6 575
XinZhangMS 0:f7f1f0d76dd6 576 static IOTHUB_DEVICE_CONFIGURATION_RESULT parseDeviceConfigurationLabelsJsonObject(const JSON_Object* labelsJson, IOTHUB_DEVICE_CONFIGURATION_LABELS* labels)
XinZhangMS 0:f7f1f0d76dd6 577 {
XinZhangMS 0:f7f1f0d76dd6 578 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 579 STRING_HANDLE tempLabelsName = NULL;
XinZhangMS 0:f7f1f0d76dd6 580 STRING_HANDLE tempLabelsValue = NULL;
XinZhangMS 0:f7f1f0d76dd6 581
XinZhangMS 0:f7f1f0d76dd6 582 if (labels == NULL)
XinZhangMS 0:f7f1f0d76dd6 583 {
XinZhangMS 0:f7f1f0d76dd6 584 LogError("labels cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 585 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 586 }
XinZhangMS 0:f7f1f0d76dd6 587 else if (labelsJson == NULL)
XinZhangMS 0:f7f1f0d76dd6 588 {
XinZhangMS 0:f7f1f0d76dd6 589 labels->numLabels = 0;
XinZhangMS 0:f7f1f0d76dd6 590 result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 591 }
XinZhangMS 0:f7f1f0d76dd6 592 else
XinZhangMS 0:f7f1f0d76dd6 593 {
XinZhangMS 0:f7f1f0d76dd6 594 result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 595
XinZhangMS 0:f7f1f0d76dd6 596 size_t labelsCount = json_object_get_count(labelsJson);
XinZhangMS 0:f7f1f0d76dd6 597
XinZhangMS 0:f7f1f0d76dd6 598 labels->numLabels = labelsCount;
XinZhangMS 0:f7f1f0d76dd6 599 if (labelsCount > 0)
XinZhangMS 0:f7f1f0d76dd6 600 {
XinZhangMS 0:f7f1f0d76dd6 601 if ((labels->labelNames = malloc(sizeof(const char*) * labelsCount)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 602 {
XinZhangMS 0:f7f1f0d76dd6 603 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT labelNames");
XinZhangMS 0:f7f1f0d76dd6 604 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 605 }
XinZhangMS 0:f7f1f0d76dd6 606 else if ((labels->labelValues = malloc(sizeof(const char*) * labelsCount)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 607 {
XinZhangMS 0:f7f1f0d76dd6 608 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT results");
XinZhangMS 0:f7f1f0d76dd6 609 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 610 }
XinZhangMS 0:f7f1f0d76dd6 611 else
XinZhangMS 0:f7f1f0d76dd6 612 {
XinZhangMS 0:f7f1f0d76dd6 613 for (size_t i = 0; i < labelsCount; i++)
XinZhangMS 0:f7f1f0d76dd6 614 {
XinZhangMS 0:f7f1f0d76dd6 615 if ((tempLabelsName = STRING_construct(json_object_get_name(labelsJson, i))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 616 {
XinZhangMS 0:f7f1f0d76dd6 617 LogError("STRING_construct failed for tempLabelsName");
XinZhangMS 0:f7f1f0d76dd6 618 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 619 }
XinZhangMS 0:f7f1f0d76dd6 620 else if (!json_object_has_value(labelsJson, STRING_c_str(tempLabelsName)))
XinZhangMS 0:f7f1f0d76dd6 621 {
XinZhangMS 0:f7f1f0d76dd6 622 LogError("missing result for label %s", tempLabelsName);
XinZhangMS 0:f7f1f0d76dd6 623 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 624 }
XinZhangMS 0:f7f1f0d76dd6 625 else if (mallocAndStrcpy_s((char**)&(labels->labelNames[i]), STRING_c_str(tempLabelsName)) != 0)
XinZhangMS 0:f7f1f0d76dd6 626 {
XinZhangMS 0:f7f1f0d76dd6 627 LogError("mallocAndStrcpy_s failed for results tempLabelsName");
XinZhangMS 0:f7f1f0d76dd6 628 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 629 }
XinZhangMS 0:f7f1f0d76dd6 630 else if ((tempLabelsValue = STRING_construct(json_value_get_string(json_object_get_value_at(labelsJson, i)))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 631 {
XinZhangMS 0:f7f1f0d76dd6 632 LogError("STRING_construct failed for tempMetricQueryString");
XinZhangMS 0:f7f1f0d76dd6 633 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 634 }
XinZhangMS 0:f7f1f0d76dd6 635 else if (mallocAndStrcpy_s((char**)&(labels->labelValues[i]), STRING_c_str(tempLabelsValue)) != 0)
XinZhangMS 0:f7f1f0d76dd6 636 {
XinZhangMS 0:f7f1f0d76dd6 637 LogError("mallocAndStrcpy_s failed for tempMetricQueryString");
XinZhangMS 0:f7f1f0d76dd6 638 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 639 }
XinZhangMS 0:f7f1f0d76dd6 640 }
XinZhangMS 0:f7f1f0d76dd6 641 }
XinZhangMS 0:f7f1f0d76dd6 642 }
XinZhangMS 0:f7f1f0d76dd6 643 }
XinZhangMS 0:f7f1f0d76dd6 644
XinZhangMS 0:f7f1f0d76dd6 645 STRING_delete(tempLabelsName);
XinZhangMS 0:f7f1f0d76dd6 646 STRING_delete(tempLabelsValue);
XinZhangMS 0:f7f1f0d76dd6 647
XinZhangMS 0:f7f1f0d76dd6 648 return result;
XinZhangMS 0:f7f1f0d76dd6 649 }
XinZhangMS 0:f7f1f0d76dd6 650
XinZhangMS 0:f7f1f0d76dd6 651 static IOTHUB_DEVICE_CONFIGURATION_RESULT parseDeviceConfigurationMetricsJsonObject(const JSON_Object* metricResults, const JSON_Object* metricQueries, IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT* results, IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION* queries)
XinZhangMS 0:f7f1f0d76dd6 652 {
XinZhangMS 0:f7f1f0d76dd6 653 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 654 size_t metricResultsCount = json_object_get_count(metricResults);
XinZhangMS 0:f7f1f0d76dd6 655 size_t metricQueriesCount = json_object_get_count(metricQueries);
XinZhangMS 0:f7f1f0d76dd6 656 const char* tempMetricQueryName = NULL;
XinZhangMS 0:f7f1f0d76dd6 657 const char* tempMetricQueryString = NULL;
XinZhangMS 0:f7f1f0d76dd6 658
XinZhangMS 0:f7f1f0d76dd6 659 if (metricResults == NULL || metricQueries == NULL || results == NULL || queries == NULL)
XinZhangMS 0:f7f1f0d76dd6 660 {
XinZhangMS 0:f7f1f0d76dd6 661 LogError("metricResults, metricQueries, results or queries cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 662 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 663 }
XinZhangMS 0:f7f1f0d76dd6 664 else
XinZhangMS 0:f7f1f0d76dd6 665 {
XinZhangMS 0:f7f1f0d76dd6 666 result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 667
XinZhangMS 0:f7f1f0d76dd6 668 results->numQueries = metricResultsCount;
XinZhangMS 0:f7f1f0d76dd6 669 if (metricResultsCount > 0)
XinZhangMS 0:f7f1f0d76dd6 670 {
XinZhangMS 0:f7f1f0d76dd6 671 if ((results->queryNames = calloc(metricResultsCount, sizeof(const char*))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 672 {
XinZhangMS 0:f7f1f0d76dd6 673 LogError("Calloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT queryNames");
XinZhangMS 0:f7f1f0d76dd6 674 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 675 }
XinZhangMS 0:f7f1f0d76dd6 676 else if ((results->results = calloc(metricResultsCount, sizeof(double))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 677 {
XinZhangMS 0:f7f1f0d76dd6 678 LogError("Calloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT results");
XinZhangMS 0:f7f1f0d76dd6 679 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 680 }
XinZhangMS 0:f7f1f0d76dd6 681 else
XinZhangMS 0:f7f1f0d76dd6 682 {
XinZhangMS 0:f7f1f0d76dd6 683 for (size_t i = 0; i < metricResultsCount; i++)
XinZhangMS 0:f7f1f0d76dd6 684 {
XinZhangMS 0:f7f1f0d76dd6 685 if ((tempMetricQueryName = json_object_get_name(metricResults, i)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 686 {
XinZhangMS 0:f7f1f0d76dd6 687 LogError("STRING_construct failed for tempMetricQueryName");
XinZhangMS 0:f7f1f0d76dd6 688 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 689 }
XinZhangMS 0:f7f1f0d76dd6 690 else if (mallocAndStrcpy_s((char**)&(results->queryNames[i]), tempMetricQueryName) != 0)
XinZhangMS 0:f7f1f0d76dd6 691 {
XinZhangMS 0:f7f1f0d76dd6 692 LogError("mallocAndStrcpy_s failed for queries tempMetricQueryName");
XinZhangMS 0:f7f1f0d76dd6 693 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 694 }
XinZhangMS 0:f7f1f0d76dd6 695 else
XinZhangMS 0:f7f1f0d76dd6 696 {
XinZhangMS 0:f7f1f0d76dd6 697 results->results[i] = json_object_dotget_number(metricResults, tempMetricQueryName);
XinZhangMS 0:f7f1f0d76dd6 698 }
XinZhangMS 0:f7f1f0d76dd6 699 }
XinZhangMS 0:f7f1f0d76dd6 700 }
XinZhangMS 0:f7f1f0d76dd6 701 }
XinZhangMS 0:f7f1f0d76dd6 702
XinZhangMS 0:f7f1f0d76dd6 703 queries->numQueries = metricQueriesCount;
XinZhangMS 0:f7f1f0d76dd6 704 if (metricQueriesCount > 0)
XinZhangMS 0:f7f1f0d76dd6 705 {
XinZhangMS 0:f7f1f0d76dd6 706 if ((queries->queryNames = calloc(metricQueriesCount, sizeof(const char*))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 707 {
XinZhangMS 0:f7f1f0d76dd6 708 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION queryNames");
XinZhangMS 0:f7f1f0d76dd6 709 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 710 }
XinZhangMS 0:f7f1f0d76dd6 711 else if ((queries->queryStrings = calloc(metricQueriesCount, sizeof(const char*))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 712 {
XinZhangMS 0:f7f1f0d76dd6 713 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION queryStrings");
XinZhangMS 0:f7f1f0d76dd6 714 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 715 }
XinZhangMS 0:f7f1f0d76dd6 716 for (size_t i = 0; i < metricQueriesCount; i++)
XinZhangMS 0:f7f1f0d76dd6 717 {
XinZhangMS 0:f7f1f0d76dd6 718 if ((tempMetricQueryName = json_object_get_name(metricQueries, i)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 719 {
XinZhangMS 0:f7f1f0d76dd6 720 LogError("STRING_construct failed for tempMetricQueryName");
XinZhangMS 0:f7f1f0d76dd6 721 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 722 }
XinZhangMS 0:f7f1f0d76dd6 723 else if (mallocAndStrcpy_s((char**)&(queries->queryNames[i]), tempMetricQueryName) != 0)
XinZhangMS 0:f7f1f0d76dd6 724 {
XinZhangMS 0:f7f1f0d76dd6 725 LogError("mallocAndStrcpy_s failed for queries tempMetricQueryName");
XinZhangMS 0:f7f1f0d76dd6 726 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 727 }
XinZhangMS 0:f7f1f0d76dd6 728 else if ((tempMetricQueryString = json_value_get_string(json_object_get_value_at(metricQueries, i))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 729 {
XinZhangMS 0:f7f1f0d76dd6 730 LogError("STRING_construct failed for tempMetricQueryString");
XinZhangMS 0:f7f1f0d76dd6 731 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 732 }
XinZhangMS 0:f7f1f0d76dd6 733 else if (mallocAndStrcpy_s((char**)&(queries->queryStrings[i]), tempMetricQueryString) != 0)
XinZhangMS 0:f7f1f0d76dd6 734 {
XinZhangMS 0:f7f1f0d76dd6 735 LogError("mallocAndStrcpy_s failed for tempMetricQueryString");
XinZhangMS 0:f7f1f0d76dd6 736 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 737 }
XinZhangMS 0:f7f1f0d76dd6 738 }
XinZhangMS 0:f7f1f0d76dd6 739 }
XinZhangMS 0:f7f1f0d76dd6 740 }
XinZhangMS 0:f7f1f0d76dd6 741
XinZhangMS 0:f7f1f0d76dd6 742 return result;
XinZhangMS 0:f7f1f0d76dd6 743 }
XinZhangMS 0:f7f1f0d76dd6 744
XinZhangMS 0:f7f1f0d76dd6 745 static IOTHUB_DEVICE_CONFIGURATION_RESULT parseDeviceConfigurationJsonObject(JSON_Object* root_object, IOTHUB_DEVICE_CONFIGURATION* configuration)
XinZhangMS 0:f7f1f0d76dd6 746 {
XinZhangMS 0:f7f1f0d76dd6 747 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 748
XinZhangMS 0:f7f1f0d76dd6 749 const char* configurationId = json_object_get_string(root_object, CONFIGURATION_JSON_KEY_CONFIGURATION_ID);
XinZhangMS 0:f7f1f0d76dd6 750 const char* schemaVersion = json_object_get_string(root_object, CONFIGURATION_JSON_KEY_SCHEMA_VERSION);
XinZhangMS 0:f7f1f0d76dd6 751 const char* deviceContent = json_serialize_to_string(json_object_dotget_value(root_object, CONFIGURATION_DEVICE_CONTENT_NODE_NAME));
XinZhangMS 0:f7f1f0d76dd6 752 const char* modulesContent = json_serialize_to_string(json_object_dotget_value(root_object, CONFIGURATION_MODULES_CONTENT_NODE_NAME));
XinZhangMS 0:f7f1f0d76dd6 753 const char* targetCondition = json_object_get_string(root_object, CONFIGURATION_JSON_KEY_TARGET_CONDITION);
XinZhangMS 0:f7f1f0d76dd6 754 const char* createdTime = json_object_get_string(root_object, CONFIGURATION_JSON_KEY_CREATED_TIME);
XinZhangMS 0:f7f1f0d76dd6 755 const char* lastUpdatedTime = json_object_get_string(root_object, CONFIGURATION_JSON_KEY_LAST_UPDATED_TIME);
XinZhangMS 0:f7f1f0d76dd6 756 const char* priority = json_object_get_string(root_object, CONFIGURATION_JSON_KEY_PRIORITY);
XinZhangMS 0:f7f1f0d76dd6 757 const char* eTag = json_object_get_string(root_object, CONFIGURATION_JSON_KEY_ETAG);
XinZhangMS 0:f7f1f0d76dd6 758
XinZhangMS 0:f7f1f0d76dd6 759 JSON_Object* systemMetricsResults = json_object_dotget_object(root_object, CONFIGURATION_SYSTEM_METRICS_RESULTS_NODE_NAME);
XinZhangMS 0:f7f1f0d76dd6 760 JSON_Object* systemMetricsQueries = json_object_dotget_object(root_object, CONFIGURATION_SYSTEM_METRICS_QUERIES_NODE_NAME);
XinZhangMS 0:f7f1f0d76dd6 761 JSON_Object* customMetricsResults = json_object_dotget_object(root_object, CONFIGURATION_CUSTOM_METRICS_RESULTS_NODE_NAME);
XinZhangMS 0:f7f1f0d76dd6 762 JSON_Object* customMetricsQueries = json_object_dotget_object(root_object, CONFIGURATION_CUSTOM_METRICS_QUERIES_NODE_NAME);
XinZhangMS 0:f7f1f0d76dd6 763
XinZhangMS 0:f7f1f0d76dd6 764 JSON_Object* labels = json_object_dotget_object(root_object, CONFIGURATION_JSON_KEY_LABELS);
XinZhangMS 0:f7f1f0d76dd6 765
XinZhangMS 0:f7f1f0d76dd6 766 if ((configurationId != NULL) && (mallocAndStrcpy_s((char**)&(configuration->configurationId), configurationId) != 0))
XinZhangMS 0:f7f1f0d76dd6 767 {
XinZhangMS 0:f7f1f0d76dd6 768 LogError("mallocAndStrcpy_s failed for configurationId");
XinZhangMS 0:f7f1f0d76dd6 769 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 770 }
XinZhangMS 0:f7f1f0d76dd6 771 else if ((schemaVersion != NULL) && (mallocAndStrcpy_s((char**)&(configuration->schemaVersion), schemaVersion) != 0))
XinZhangMS 0:f7f1f0d76dd6 772 {
XinZhangMS 0:f7f1f0d76dd6 773 LogError("mallocAndStrcpy_s failed for schemaVersion");
XinZhangMS 0:f7f1f0d76dd6 774 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 775 }
XinZhangMS 0:f7f1f0d76dd6 776 else if ((deviceContent != NULL) && (mallocAndStrcpy_s((char**)&configuration->content.deviceContent, deviceContent) != 0))
XinZhangMS 0:f7f1f0d76dd6 777 {
XinZhangMS 0:f7f1f0d76dd6 778 LogError("mallocAndStrcpy_s failed for content.deviceContent");
XinZhangMS 0:f7f1f0d76dd6 779 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 780 }
XinZhangMS 0:f7f1f0d76dd6 781 else if ((modulesContent != NULL) && (mallocAndStrcpy_s((char**)&configuration->content.modulesContent, modulesContent) != 0))
XinZhangMS 0:f7f1f0d76dd6 782 {
XinZhangMS 0:f7f1f0d76dd6 783 LogError("mallocAndStrcpy_s failed for content.modulesContent");
XinZhangMS 0:f7f1f0d76dd6 784 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 785 }
XinZhangMS 0:f7f1f0d76dd6 786 else if ((eTag != NULL) && (mallocAndStrcpy_s((char**)&configuration->eTag, eTag) != 0))
XinZhangMS 0:f7f1f0d76dd6 787 {
XinZhangMS 0:f7f1f0d76dd6 788 LogError("mallocAndStrcpy_s failed for eTag");
XinZhangMS 0:f7f1f0d76dd6 789 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 790 }
XinZhangMS 0:f7f1f0d76dd6 791 else if ((targetCondition != NULL) && (mallocAndStrcpy_s((char**)&configuration->targetCondition, targetCondition) != 0))
XinZhangMS 0:f7f1f0d76dd6 792 {
XinZhangMS 0:f7f1f0d76dd6 793 LogError("mallocAndStrcpy_s failed for targetCondition");
XinZhangMS 0:f7f1f0d76dd6 794 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 795 }
XinZhangMS 0:f7f1f0d76dd6 796 else if ((createdTime != NULL) && (mallocAndStrcpy_s((char**)&configuration->createdTimeUtc, createdTime) != 0))
XinZhangMS 0:f7f1f0d76dd6 797 {
XinZhangMS 0:f7f1f0d76dd6 798 LogError("mallocAndStrcpy_s failed for createdTimeUtc");
XinZhangMS 0:f7f1f0d76dd6 799 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 800 }
XinZhangMS 0:f7f1f0d76dd6 801 else if ((lastUpdatedTime != NULL) && (mallocAndStrcpy_s((char**)&configuration->lastUpdatedTimeUtc, lastUpdatedTime) != 0))
XinZhangMS 0:f7f1f0d76dd6 802 {
XinZhangMS 0:f7f1f0d76dd6 803 LogError("mallocAndStrcpy_s failed for lastUpdatedTimeUtc");
XinZhangMS 0:f7f1f0d76dd6 804 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 805 }
XinZhangMS 0:f7f1f0d76dd6 806 else
XinZhangMS 0:f7f1f0d76dd6 807 {
XinZhangMS 0:f7f1f0d76dd6 808 if (priority != NULL)
XinZhangMS 0:f7f1f0d76dd6 809 {
XinZhangMS 0:f7f1f0d76dd6 810 configuration->priority = (int)json_object_get_number(root_object, priority);
XinZhangMS 0:f7f1f0d76dd6 811 }
XinZhangMS 0:f7f1f0d76dd6 812
XinZhangMS 0:f7f1f0d76dd6 813 if ((result = parseDeviceConfigurationMetricsJsonObject(systemMetricsResults, systemMetricsQueries, &(configuration->systemMetricsResult), &(configuration->systemMetricsDefinition))) != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 814 {
XinZhangMS 0:f7f1f0d76dd6 815 LogError("parseDeviceConfigurationMetricsJsonObject failed for systemMetrics");
XinZhangMS 0:f7f1f0d76dd6 816 }
XinZhangMS 0:f7f1f0d76dd6 817 else if ((result = parseDeviceConfigurationMetricsJsonObject(customMetricsResults, customMetricsQueries, &(configuration->metricResult), &(configuration->metricsDefinition))) != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 818 {
XinZhangMS 0:f7f1f0d76dd6 819 LogError("parseDeviceConfigurationMetricsJsonObject failed for systemMetrics");
XinZhangMS 0:f7f1f0d76dd6 820 }
XinZhangMS 0:f7f1f0d76dd6 821 else if ((result = parseDeviceConfigurationLabelsJsonObject(labels, &(configuration->labels))) != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 822 {
XinZhangMS 0:f7f1f0d76dd6 823 LogError("parseDeviceConfigurationLabelsJsonObject failed for systemMetrics");
XinZhangMS 0:f7f1f0d76dd6 824 }
XinZhangMS 0:f7f1f0d76dd6 825 }
XinZhangMS 0:f7f1f0d76dd6 826
XinZhangMS 0:f7f1f0d76dd6 827 return result;
XinZhangMS 0:f7f1f0d76dd6 828 }
XinZhangMS 0:f7f1f0d76dd6 829
XinZhangMS 0:f7f1f0d76dd6 830 void IoTHubDeviceConfiguration_FreeConfigurationMembers(IOTHUB_DEVICE_CONFIGURATION* configuration)
XinZhangMS 0:f7f1f0d76dd6 831 {
XinZhangMS 0:f7f1f0d76dd6 832 free((void *)configuration->configurationId);
XinZhangMS 0:f7f1f0d76dd6 833 free((char *)configuration->schemaVersion);
XinZhangMS 0:f7f1f0d76dd6 834 free((char *)configuration->targetCondition);
XinZhangMS 0:f7f1f0d76dd6 835 free((char *)configuration->eTag);
XinZhangMS 0:f7f1f0d76dd6 836 free((char *)configuration->createdTimeUtc);
XinZhangMS 0:f7f1f0d76dd6 837 free((char *)configuration->lastUpdatedTimeUtc);
XinZhangMS 0:f7f1f0d76dd6 838
XinZhangMS 0:f7f1f0d76dd6 839 if (configuration->content.deviceContent != NULL) free((char *)configuration->content.deviceContent);
XinZhangMS 0:f7f1f0d76dd6 840 if (configuration->content.modulesContent != NULL) free((char *)configuration->content.modulesContent);
XinZhangMS 0:f7f1f0d76dd6 841
XinZhangMS 0:f7f1f0d76dd6 842 if (configuration->labels.numLabels > 0)
XinZhangMS 0:f7f1f0d76dd6 843 {
XinZhangMS 0:f7f1f0d76dd6 844 for (size_t i = 0; i < configuration->labels.numLabels; i++)
XinZhangMS 0:f7f1f0d76dd6 845 {
XinZhangMS 0:f7f1f0d76dd6 846 free((void *)(configuration->labels.labelNames[i]));
XinZhangMS 0:f7f1f0d76dd6 847 free((void *)(configuration->labels.labelValues[i]));
XinZhangMS 0:f7f1f0d76dd6 848 }
XinZhangMS 0:f7f1f0d76dd6 849
XinZhangMS 0:f7f1f0d76dd6 850 free((void *)configuration->labels.labelNames);
XinZhangMS 0:f7f1f0d76dd6 851 free((void *)configuration->labels.labelValues);
XinZhangMS 0:f7f1f0d76dd6 852 }
XinZhangMS 0:f7f1f0d76dd6 853
XinZhangMS 0:f7f1f0d76dd6 854 if (configuration->metricsDefinition.numQueries > 0)
XinZhangMS 0:f7f1f0d76dd6 855 {
XinZhangMS 0:f7f1f0d76dd6 856 for (size_t i = 0; i < configuration->metricsDefinition.numQueries; i++)
XinZhangMS 0:f7f1f0d76dd6 857 {
XinZhangMS 0:f7f1f0d76dd6 858 free((void *)(configuration->metricsDefinition.queryNames[i]));
XinZhangMS 0:f7f1f0d76dd6 859 free((void *)(configuration->metricsDefinition.queryStrings[i]));
XinZhangMS 0:f7f1f0d76dd6 860 }
XinZhangMS 0:f7f1f0d76dd6 861
XinZhangMS 0:f7f1f0d76dd6 862 free((void *)configuration->metricsDefinition.queryNames);
XinZhangMS 0:f7f1f0d76dd6 863 free((void *)configuration->metricsDefinition.queryStrings);
XinZhangMS 0:f7f1f0d76dd6 864 }
XinZhangMS 0:f7f1f0d76dd6 865
XinZhangMS 0:f7f1f0d76dd6 866
XinZhangMS 0:f7f1f0d76dd6 867 if (configuration->metricResult.numQueries > 0)
XinZhangMS 0:f7f1f0d76dd6 868 {
XinZhangMS 0:f7f1f0d76dd6 869 for (size_t i = 0; i < configuration->metricResult.numQueries; i++)
XinZhangMS 0:f7f1f0d76dd6 870 {
XinZhangMS 0:f7f1f0d76dd6 871 free((void *)(configuration->metricResult.queryNames[i]));
XinZhangMS 0:f7f1f0d76dd6 872 }
XinZhangMS 0:f7f1f0d76dd6 873
XinZhangMS 0:f7f1f0d76dd6 874 free((void *)configuration->metricResult.queryNames);
XinZhangMS 0:f7f1f0d76dd6 875 free((void *)configuration->metricResult.results);
XinZhangMS 0:f7f1f0d76dd6 876 }
XinZhangMS 0:f7f1f0d76dd6 877
XinZhangMS 0:f7f1f0d76dd6 878
XinZhangMS 0:f7f1f0d76dd6 879 if (configuration->systemMetricsDefinition.numQueries > 0)
XinZhangMS 0:f7f1f0d76dd6 880 {
XinZhangMS 0:f7f1f0d76dd6 881 for (size_t i = 0; i < configuration->systemMetricsDefinition.numQueries; i++)
XinZhangMS 0:f7f1f0d76dd6 882 {
XinZhangMS 0:f7f1f0d76dd6 883 free((void *)(configuration->systemMetricsDefinition.queryNames[i]));
XinZhangMS 0:f7f1f0d76dd6 884 free((void *)(configuration->systemMetricsDefinition.queryStrings[i]));
XinZhangMS 0:f7f1f0d76dd6 885 }
XinZhangMS 0:f7f1f0d76dd6 886
XinZhangMS 0:f7f1f0d76dd6 887 free((void *)configuration->systemMetricsDefinition.queryNames);
XinZhangMS 0:f7f1f0d76dd6 888 free((void *)configuration->systemMetricsDefinition.queryStrings);
XinZhangMS 0:f7f1f0d76dd6 889 }
XinZhangMS 0:f7f1f0d76dd6 890
XinZhangMS 0:f7f1f0d76dd6 891 if (configuration->systemMetricsResult.numQueries > 0)
XinZhangMS 0:f7f1f0d76dd6 892 {
XinZhangMS 0:f7f1f0d76dd6 893 for (size_t i = 0; i < configuration->systemMetricsResult.numQueries; i++)
XinZhangMS 0:f7f1f0d76dd6 894 {
XinZhangMS 0:f7f1f0d76dd6 895 free((void *)(configuration->systemMetricsResult.queryNames[i]));
XinZhangMS 0:f7f1f0d76dd6 896 }
XinZhangMS 0:f7f1f0d76dd6 897
XinZhangMS 0:f7f1f0d76dd6 898 free((void *)configuration->systemMetricsResult.queryNames);
XinZhangMS 0:f7f1f0d76dd6 899 free((void *)configuration->systemMetricsResult.results);
XinZhangMS 0:f7f1f0d76dd6 900 }
XinZhangMS 0:f7f1f0d76dd6 901
XinZhangMS 0:f7f1f0d76dd6 902 memset(configuration, 0, sizeof(*configuration));
XinZhangMS 0:f7f1f0d76dd6 903 }
XinZhangMS 0:f7f1f0d76dd6 904
XinZhangMS 0:f7f1f0d76dd6 905 static IOTHUB_DEVICE_CONFIGURATION_RESULT parseDeviceConfigurationJson(BUFFER_HANDLE jsonBuffer, IOTHUB_DEVICE_CONFIGURATION* configuration)
XinZhangMS 0:f7f1f0d76dd6 906 {
XinZhangMS 0:f7f1f0d76dd6 907 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 908
XinZhangMS 0:f7f1f0d76dd6 909 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_024: [ If the configuration out parameter is not NULL IoTHubDeviceConfiguration_AddConfiguration shall save the received configuration to the out parameter and return IOTHUB_DEVICE_CONFIGURATION_OK ] */
XinZhangMS 0:f7f1f0d76dd6 910 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_033: [ IoTHubDeviceConfiguration_GetConfiguration shall verify the received HTTP status code and if it is less or equal than 300 then try to parse the response JSON to configuration for configuration properties ] */
XinZhangMS 0:f7f1f0d76dd6 911 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_034: [ If any of the property field above missing from the JSON the property value will not be populated ] */
XinZhangMS 0:f7f1f0d76dd6 912 if (jsonBuffer == NULL)
XinZhangMS 0:f7f1f0d76dd6 913 {
XinZhangMS 0:f7f1f0d76dd6 914 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_023: [ If the JSON parsing failed, IoTHubDeviceConfiguration_AddConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 915 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_035: [ If the JSON parsing failed, IoTHubDeviceConfiguration_GetConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 916 LogError("jsonBuffer cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 917 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 918 }
XinZhangMS 0:f7f1f0d76dd6 919 else if (configuration == NULL)
XinZhangMS 0:f7f1f0d76dd6 920 {
XinZhangMS 0:f7f1f0d76dd6 921 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_023: [ If the JSON parsing failed, IoTHubDeviceConfiguration_AddConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 922 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_035: [ If the JSON parsing failed, IoTHubDeviceConfiguration_GetConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 923 LogError("configuration cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 924 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 925 }
XinZhangMS 0:f7f1f0d76dd6 926 else
XinZhangMS 0:f7f1f0d76dd6 927 {
XinZhangMS 0:f7f1f0d76dd6 928 const char* bufferStr = NULL;
XinZhangMS 0:f7f1f0d76dd6 929 JSON_Value* root_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 930 JSON_Object* root_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 931
XinZhangMS 0:f7f1f0d76dd6 932 if ((bufferStr = (const char*)BUFFER_u_char(jsonBuffer)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 933 {
XinZhangMS 0:f7f1f0d76dd6 934 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_023: [ If the JSON parsing failed, IoTHubDeviceConfiguration_AddConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 935 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_035: [ If the JSON parsing failed, IoTHubDeviceConfiguration_GetConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 936 LogError("BUFFER_u_char failed");
XinZhangMS 0:f7f1f0d76dd6 937 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 938 }
XinZhangMS 0:f7f1f0d76dd6 939 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_036: [ If the received JSON is empty, IoTHubDeviceConfiguration_GetConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_CONFIGURATION_NOT_EXIST ] */
XinZhangMS 0:f7f1f0d76dd6 940 else if (strlen(bufferStr) == 0)
XinZhangMS 0:f7f1f0d76dd6 941 {
XinZhangMS 0:f7f1f0d76dd6 942 LogError("Returned JSON cannot be empty");
XinZhangMS 0:f7f1f0d76dd6 943 result = IOTHUB_DEVICE_CONFIGURATION_CONFIGURATION_NOT_EXIST;
XinZhangMS 0:f7f1f0d76dd6 944 }
XinZhangMS 0:f7f1f0d76dd6 945 else if ((root_value = json_parse_string(bufferStr)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 946 {
XinZhangMS 0:f7f1f0d76dd6 947 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_023: [ If the JSON parsing failed, IoTHubDeviceConfiguration_AddConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 948 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_035: [ If the JSON parsing failed, IoTHubDeviceConfiguration_GetConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 949 LogError("json_parse_string failed");
XinZhangMS 0:f7f1f0d76dd6 950 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 951 }
XinZhangMS 0:f7f1f0d76dd6 952 else if ((root_object = json_value_get_object(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 953 {
XinZhangMS 0:f7f1f0d76dd6 954 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_023: [ If the JSON parsing failed, IoTHubDeviceConfiguration_AddConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 955 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_035: [ If the JSON parsing failed, IoTHubDeviceConfiguration_GetConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 956 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 957 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 958 }
XinZhangMS 0:f7f1f0d76dd6 959 else
XinZhangMS 0:f7f1f0d76dd6 960 {
XinZhangMS 0:f7f1f0d76dd6 961 result = parseDeviceConfigurationJsonObject(root_object, configuration);
XinZhangMS 0:f7f1f0d76dd6 962 }
XinZhangMS 0:f7f1f0d76dd6 963
XinZhangMS 0:f7f1f0d76dd6 964 json_object_clear(root_object);
XinZhangMS 0:f7f1f0d76dd6 965 json_value_free(root_value);
XinZhangMS 0:f7f1f0d76dd6 966 }
XinZhangMS 0:f7f1f0d76dd6 967 return result;
XinZhangMS 0:f7f1f0d76dd6 968 }
XinZhangMS 0:f7f1f0d76dd6 969
XinZhangMS 0:f7f1f0d76dd6 970 static void free_deviceConfiguration_handle(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION* deviceConfiguration)
XinZhangMS 0:f7f1f0d76dd6 971 {
XinZhangMS 0:f7f1f0d76dd6 972 free(deviceConfiguration->hostname);
XinZhangMS 0:f7f1f0d76dd6 973 free(deviceConfiguration->sharedAccessKey);
XinZhangMS 0:f7f1f0d76dd6 974 free(deviceConfiguration->keyName);
XinZhangMS 0:f7f1f0d76dd6 975 free(deviceConfiguration);
XinZhangMS 0:f7f1f0d76dd6 976 }
XinZhangMS 0:f7f1f0d76dd6 977
XinZhangMS 0:f7f1f0d76dd6 978 IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE IoTHubDeviceConfiguration_Create(IOTHUB_SERVICE_CLIENT_AUTH_HANDLE serviceClientHandle)
XinZhangMS 0:f7f1f0d76dd6 979 {
XinZhangMS 0:f7f1f0d76dd6 980 IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 981
XinZhangMS 0:f7f1f0d76dd6 982 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_001: [ If the serviceClientHandle input parameter is NULL IoTHubDeviceConfiguration_Create shall return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 983 if (serviceClientHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 984 {
XinZhangMS 0:f7f1f0d76dd6 985 LogError("IotHubDeviceConfiguration_Create: serviceClientHandle is null");
XinZhangMS 0:f7f1f0d76dd6 986 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 987 }
XinZhangMS 0:f7f1f0d76dd6 988 else
XinZhangMS 0:f7f1f0d76dd6 989 {
XinZhangMS 0:f7f1f0d76dd6 990 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_002: [ If any member of the serviceClientHandle input parameter is NULL IoTHubDeviceConfiguration_Create shall return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 991 IOTHUB_SERVICE_CLIENT_AUTH* serviceClientAuth = (IOTHUB_SERVICE_CLIENT_AUTH*)serviceClientHandle;
XinZhangMS 0:f7f1f0d76dd6 992
XinZhangMS 0:f7f1f0d76dd6 993 if (serviceClientAuth->hostname == NULL)
XinZhangMS 0:f7f1f0d76dd6 994 {
XinZhangMS 0:f7f1f0d76dd6 995 LogError("authInfo->hostName input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 996 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 997 }
XinZhangMS 0:f7f1f0d76dd6 998 else if (serviceClientAuth->iothubName == NULL)
XinZhangMS 0:f7f1f0d76dd6 999 {
XinZhangMS 0:f7f1f0d76dd6 1000 LogError("authInfo->iothubName input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1001 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1002 }
XinZhangMS 0:f7f1f0d76dd6 1003 else if (serviceClientAuth->iothubSuffix == NULL)
XinZhangMS 0:f7f1f0d76dd6 1004 {
XinZhangMS 0:f7f1f0d76dd6 1005 LogError("authInfo->iothubSuffix input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1006 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1007 }
XinZhangMS 0:f7f1f0d76dd6 1008 else if (serviceClientAuth->keyName == NULL)
XinZhangMS 0:f7f1f0d76dd6 1009 {
XinZhangMS 0:f7f1f0d76dd6 1010 LogError("authInfo->keyName input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1011 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1012 }
XinZhangMS 0:f7f1f0d76dd6 1013 else if (serviceClientAuth->sharedAccessKey == NULL)
XinZhangMS 0:f7f1f0d76dd6 1014 {
XinZhangMS 0:f7f1f0d76dd6 1015 LogError("authInfo->sharedAccessKey input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1016 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1017 }
XinZhangMS 0:f7f1f0d76dd6 1018 else
XinZhangMS 0:f7f1f0d76dd6 1019 {
XinZhangMS 0:f7f1f0d76dd6 1020 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_003: [ IoTHubDeviceMethod_Create shall allocate memory for a new IOTHUB_SERVICE_CLIENT_DEVICE_METHOD_HANDLE instance ]*/
XinZhangMS 0:f7f1f0d76dd6 1021 result = malloc(sizeof(IOTHUB_DEVICE_CONFIGURATION));
XinZhangMS 0:f7f1f0d76dd6 1022 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 1023 {
XinZhangMS 0:f7f1f0d76dd6 1024 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_002: [ If the allocation failed, IoTHubDeviceConfiguration_Create shall return NULL ]*/
XinZhangMS 0:f7f1f0d76dd6 1025 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION");
XinZhangMS 0:f7f1f0d76dd6 1026 }
XinZhangMS 0:f7f1f0d76dd6 1027 else
XinZhangMS 0:f7f1f0d76dd6 1028 {
XinZhangMS 0:f7f1f0d76dd6 1029 memset(result, 0, sizeof(IOTHUB_DEVICE_CONFIGURATION));
XinZhangMS 0:f7f1f0d76dd6 1030
XinZhangMS 0:f7f1f0d76dd6 1031 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_005: [ If the allocation successful, IoTHubDeviceConfiguration_Create shall create a IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE from the given IOTHUB_SERVICE_CLIENT_AUTH_HANDLE and return with it ]*/
XinZhangMS 0:f7f1f0d76dd6 1032 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_006: [ IoTHubDeviceConfiguration_Create shall allocate memory and copy hostName to result->hostName by calling mallocAndStrcpy_s. ]*/
XinZhangMS 0:f7f1f0d76dd6 1033 if (mallocAndStrcpy_s(&result->hostname, serviceClientAuth->hostname) != 0)
XinZhangMS 0:f7f1f0d76dd6 1034 {
XinZhangMS 0:f7f1f0d76dd6 1035 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_007: [ If the mallocAndStrcpy_s fails, IoTHubDeviceConfiguration_Create shall do clean up and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 1036 LogError("mallocAndStrcpy_s failed for hostName");
XinZhangMS 0:f7f1f0d76dd6 1037 free_deviceConfiguration_handle(result);
XinZhangMS 0:f7f1f0d76dd6 1038 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1039 }
XinZhangMS 0:f7f1f0d76dd6 1040 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_012: [ IoTHubDeviceConfiguration_Create shall allocate memory and copy sharedAccessKey to result->sharedAccessKey by calling mallocAndStrcpy_s. ]*/
XinZhangMS 0:f7f1f0d76dd6 1041 else if (mallocAndStrcpy_s(&result->sharedAccessKey, serviceClientAuth->sharedAccessKey) != 0)
XinZhangMS 0:f7f1f0d76dd6 1042 {
XinZhangMS 0:f7f1f0d76dd6 1043 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_013: [ If the mallocAndStrcpy_s fails, IoTHubDeviceConfiguration_Create shall do clean up and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 1044 LogError("mallocAndStrcpy_s failed for sharedAccessKey");
XinZhangMS 0:f7f1f0d76dd6 1045 free_deviceConfiguration_handle(result);
XinZhangMS 0:f7f1f0d76dd6 1046 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1047 }
XinZhangMS 0:f7f1f0d76dd6 1048 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_014: [ IoTHubDeviceConfiguration_Create shall allocate memory and copy keyName to result->keyName by calling mallocAndStrcpy_s. ]*/
XinZhangMS 0:f7f1f0d76dd6 1049 else if (mallocAndStrcpy_s(&result->keyName, serviceClientAuth->keyName) != 0)
XinZhangMS 0:f7f1f0d76dd6 1050 {
XinZhangMS 0:f7f1f0d76dd6 1051 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_015: [ If the mallocAndStrcpy_s fails, IoTHubDeviceConfiguration_Create shall do clean up and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 1052 LogError("mallocAndStrcpy_s failed for keyName");
XinZhangMS 0:f7f1f0d76dd6 1053 free_deviceConfiguration_handle(result);
XinZhangMS 0:f7f1f0d76dd6 1054 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1055 }
XinZhangMS 0:f7f1f0d76dd6 1056 }
XinZhangMS 0:f7f1f0d76dd6 1057 }
XinZhangMS 0:f7f1f0d76dd6 1058 }
XinZhangMS 0:f7f1f0d76dd6 1059
XinZhangMS 0:f7f1f0d76dd6 1060 return result;
XinZhangMS 0:f7f1f0d76dd6 1061 }
XinZhangMS 0:f7f1f0d76dd6 1062
XinZhangMS 0:f7f1f0d76dd6 1063 void IoTHubDeviceConfiguration_Destroy(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle)
XinZhangMS 0:f7f1f0d76dd6 1064 {
XinZhangMS 0:f7f1f0d76dd6 1065 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_016: [ If the serviceClientDeviceConfigurationHandle input parameter is NULL IoTHubDeviceConfiguration_Destroy shall return ]*/
XinZhangMS 0:f7f1f0d76dd6 1066 if (serviceClientDeviceConfigurationHandle != NULL)
XinZhangMS 0:f7f1f0d76dd6 1067 {
XinZhangMS 0:f7f1f0d76dd6 1068 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_17: [ If the serviceClientDeviceConfigurationHandle input parameter is not NULL IoTHubDeviceConfiguration_Destroy shall free the memory of it and return ]*/
XinZhangMS 0:f7f1f0d76dd6 1069 free_deviceConfiguration_handle((IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION*)serviceClientDeviceConfigurationHandle);
XinZhangMS 0:f7f1f0d76dd6 1070 }
XinZhangMS 0:f7f1f0d76dd6 1071 }
XinZhangMS 0:f7f1f0d76dd6 1072
XinZhangMS 0:f7f1f0d76dd6 1073 static IOTHUB_DEVICE_CONFIGURATION_RESULT cloneNameValueArrays_labels(IOTHUB_DEVICE_CONFIGURATION_LABELS *source, IOTHUB_DEVICE_CONFIGURATION_LABELS *target)
XinZhangMS 0:f7f1f0d76dd6 1074 {
XinZhangMS 0:f7f1f0d76dd6 1075 IOTHUB_DEVICE_CONFIGURATION_RESULT result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 1076
XinZhangMS 0:f7f1f0d76dd6 1077 target->numLabels = source->numLabels;
XinZhangMS 0:f7f1f0d76dd6 1078 if (target->numLabels > 0)
XinZhangMS 0:f7f1f0d76dd6 1079 {
XinZhangMS 0:f7f1f0d76dd6 1080 if ((target->labelNames = malloc(sizeof(const char*) * target->numLabels)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1081 {
XinZhangMS 0:f7f1f0d76dd6 1082 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION labelNames");
XinZhangMS 0:f7f1f0d76dd6 1083 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1084 }
XinZhangMS 0:f7f1f0d76dd6 1085 else if ((target->labelValues = malloc(sizeof(const char*) * target->numLabels)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1086 {
XinZhangMS 0:f7f1f0d76dd6 1087 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION labelValues");
XinZhangMS 0:f7f1f0d76dd6 1088 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1089 }
XinZhangMS 0:f7f1f0d76dd6 1090 for (size_t i = 0; i < target->numLabels; i++)
XinZhangMS 0:f7f1f0d76dd6 1091 {
XinZhangMS 0:f7f1f0d76dd6 1092 if (mallocAndStrcpy_s((char**)&(target->labelNames[i]), source->labelNames[i]) != 0)
XinZhangMS 0:f7f1f0d76dd6 1093 {
XinZhangMS 0:f7f1f0d76dd6 1094 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION labelNames");
XinZhangMS 0:f7f1f0d76dd6 1095 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1096 }
XinZhangMS 0:f7f1f0d76dd6 1097 else if (mallocAndStrcpy_s((char**)&(target->labelValues[i]), source->labelValues[i]) != 0)
XinZhangMS 0:f7f1f0d76dd6 1098 {
XinZhangMS 0:f7f1f0d76dd6 1099 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION labelValues");
XinZhangMS 0:f7f1f0d76dd6 1100 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1101 }
XinZhangMS 0:f7f1f0d76dd6 1102 }
XinZhangMS 0:f7f1f0d76dd6 1103 }
XinZhangMS 0:f7f1f0d76dd6 1104
XinZhangMS 0:f7f1f0d76dd6 1105 return result;
XinZhangMS 0:f7f1f0d76dd6 1106 }
XinZhangMS 0:f7f1f0d76dd6 1107
XinZhangMS 0:f7f1f0d76dd6 1108 static IOTHUB_DEVICE_CONFIGURATION_RESULT cloneNameValueArrays_definitions(IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION *source, IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION *target)
XinZhangMS 0:f7f1f0d76dd6 1109 {
XinZhangMS 0:f7f1f0d76dd6 1110 IOTHUB_DEVICE_CONFIGURATION_RESULT result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 1111
XinZhangMS 0:f7f1f0d76dd6 1112 target->numQueries = source->numQueries;
XinZhangMS 0:f7f1f0d76dd6 1113 if (target->numQueries > 0)
XinZhangMS 0:f7f1f0d76dd6 1114 {
XinZhangMS 0:f7f1f0d76dd6 1115 if ((target->queryNames = malloc(sizeof(const char*) * target->numQueries)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1116 {
XinZhangMS 0:f7f1f0d76dd6 1117 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION queryNames");
XinZhangMS 0:f7f1f0d76dd6 1118 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1119 }
XinZhangMS 0:f7f1f0d76dd6 1120 else if ((target->queryStrings = malloc(sizeof(const char*) * target->numQueries)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1121 {
XinZhangMS 0:f7f1f0d76dd6 1122 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION queryStrings");
XinZhangMS 0:f7f1f0d76dd6 1123 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1124 }
XinZhangMS 0:f7f1f0d76dd6 1125 for (size_t i = 0; i < target->numQueries; i++)
XinZhangMS 0:f7f1f0d76dd6 1126 {
XinZhangMS 0:f7f1f0d76dd6 1127 if (mallocAndStrcpy_s((char**)&(target->queryNames[i]), source->queryNames[i]) != 0)
XinZhangMS 0:f7f1f0d76dd6 1128 {
XinZhangMS 0:f7f1f0d76dd6 1129 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION queryNames");
XinZhangMS 0:f7f1f0d76dd6 1130 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1131 }
XinZhangMS 0:f7f1f0d76dd6 1132 else if (mallocAndStrcpy_s((char**)&(target->queryStrings[i]), source->queryStrings[i]) != 0)
XinZhangMS 0:f7f1f0d76dd6 1133 {
XinZhangMS 0:f7f1f0d76dd6 1134 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION queryStrings");
XinZhangMS 0:f7f1f0d76dd6 1135 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1136 }
XinZhangMS 0:f7f1f0d76dd6 1137 }
XinZhangMS 0:f7f1f0d76dd6 1138 }
XinZhangMS 0:f7f1f0d76dd6 1139
XinZhangMS 0:f7f1f0d76dd6 1140 return result;
XinZhangMS 0:f7f1f0d76dd6 1141 }
XinZhangMS 0:f7f1f0d76dd6 1142
XinZhangMS 0:f7f1f0d76dd6 1143 static IOTHUB_DEVICE_CONFIGURATION_RESULT cloneNameValueArrays_results(IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT *source, IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT *target)
XinZhangMS 0:f7f1f0d76dd6 1144 {
XinZhangMS 0:f7f1f0d76dd6 1145 IOTHUB_DEVICE_CONFIGURATION_RESULT result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 1146
XinZhangMS 0:f7f1f0d76dd6 1147 target->numQueries = source->numQueries;
XinZhangMS 0:f7f1f0d76dd6 1148 if (target->numQueries > 0)
XinZhangMS 0:f7f1f0d76dd6 1149 {
XinZhangMS 0:f7f1f0d76dd6 1150 if ((target->queryNames = malloc(sizeof(const char*) * target->numQueries)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1151 {
XinZhangMS 0:f7f1f0d76dd6 1152 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT queryNames");
XinZhangMS 0:f7f1f0d76dd6 1153 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1154 }
XinZhangMS 0:f7f1f0d76dd6 1155 else if ((target->results = malloc(sizeof(double) * target->numQueries)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1156 {
XinZhangMS 0:f7f1f0d76dd6 1157 LogError("Malloc failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT results");
XinZhangMS 0:f7f1f0d76dd6 1158 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1159 }
XinZhangMS 0:f7f1f0d76dd6 1160 else
XinZhangMS 0:f7f1f0d76dd6 1161 {
XinZhangMS 0:f7f1f0d76dd6 1162 for (size_t i = 0; i < target->numQueries; i++)
XinZhangMS 0:f7f1f0d76dd6 1163 {
XinZhangMS 0:f7f1f0d76dd6 1164 if (mallocAndStrcpy_s((char**)&(target->queryNames[i]), source->queryNames[i]) != 0)
XinZhangMS 0:f7f1f0d76dd6 1165 {
XinZhangMS 0:f7f1f0d76dd6 1166 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT queryNames");
XinZhangMS 0:f7f1f0d76dd6 1167 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1168 }
XinZhangMS 0:f7f1f0d76dd6 1169 else
XinZhangMS 0:f7f1f0d76dd6 1170 {
XinZhangMS 0:f7f1f0d76dd6 1171 target->results[i] = source->results[i];
XinZhangMS 0:f7f1f0d76dd6 1172 }
XinZhangMS 0:f7f1f0d76dd6 1173 }
XinZhangMS 0:f7f1f0d76dd6 1174 }
XinZhangMS 0:f7f1f0d76dd6 1175 }
XinZhangMS 0:f7f1f0d76dd6 1176
XinZhangMS 0:f7f1f0d76dd6 1177 return result;
XinZhangMS 0:f7f1f0d76dd6 1178 }
XinZhangMS 0:f7f1f0d76dd6 1179
XinZhangMS 0:f7f1f0d76dd6 1180 static IOTHUB_DEVICE_CONFIGURATION_RESULT clone_deviceConfiguration(IOTHUB_DEVICE_CONFIGURATION* source, IOTHUB_DEVICE_CONFIGURATION* target)
XinZhangMS 0:f7f1f0d76dd6 1181 {
XinZhangMS 0:f7f1f0d76dd6 1182 IOTHUB_DEVICE_CONFIGURATION_RESULT result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 1183
XinZhangMS 0:f7f1f0d76dd6 1184 if ((source != NULL) && (target != NULL))
XinZhangMS 0:f7f1f0d76dd6 1185 {
XinZhangMS 0:f7f1f0d76dd6 1186 target->version = source->version;
XinZhangMS 0:f7f1f0d76dd6 1187 target->priority = source->priority;
XinZhangMS 0:f7f1f0d76dd6 1188 target->content.deviceContent = NULL;
XinZhangMS 0:f7f1f0d76dd6 1189 target->content.modulesContent = NULL;
XinZhangMS 0:f7f1f0d76dd6 1190
XinZhangMS 0:f7f1f0d76dd6 1191 if (source->configurationId != NULL && mallocAndStrcpy_s((char**)&(target->configurationId), source->configurationId) != 0)
XinZhangMS 0:f7f1f0d76dd6 1192 {
XinZhangMS 0:f7f1f0d76dd6 1193 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION configurationId");
XinZhangMS 0:f7f1f0d76dd6 1194 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1195 }
XinZhangMS 0:f7f1f0d76dd6 1196 else if (source->schemaVersion != NULL && mallocAndStrcpy_s((char**)&(target->schemaVersion), source->schemaVersion) != 0)
XinZhangMS 0:f7f1f0d76dd6 1197 {
XinZhangMS 0:f7f1f0d76dd6 1198 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION schemaVersion");
XinZhangMS 0:f7f1f0d76dd6 1199 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1200 }
XinZhangMS 0:f7f1f0d76dd6 1201 else if (source->targetCondition != NULL && mallocAndStrcpy_s((char**)&(target->targetCondition), source->targetCondition) != 0)
XinZhangMS 0:f7f1f0d76dd6 1202 {
XinZhangMS 0:f7f1f0d76dd6 1203 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION targetCondition");
XinZhangMS 0:f7f1f0d76dd6 1204 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1205 }
XinZhangMS 0:f7f1f0d76dd6 1206 else if (source->eTag != NULL && mallocAndStrcpy_s((char**)&(target->eTag), source->eTag) != 0)
XinZhangMS 0:f7f1f0d76dd6 1207 {
XinZhangMS 0:f7f1f0d76dd6 1208 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION eTag");
XinZhangMS 0:f7f1f0d76dd6 1209 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1210 }
XinZhangMS 0:f7f1f0d76dd6 1211 else if (source->createdTimeUtc != NULL && mallocAndStrcpy_s((char**)&(target->createdTimeUtc), source->createdTimeUtc) != 0)
XinZhangMS 0:f7f1f0d76dd6 1212 {
XinZhangMS 0:f7f1f0d76dd6 1213 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION createdTimeUtc");
XinZhangMS 0:f7f1f0d76dd6 1214 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1215 }
XinZhangMS 0:f7f1f0d76dd6 1216 else if (source->lastUpdatedTimeUtc != NULL && mallocAndStrcpy_s((char**)&(target->lastUpdatedTimeUtc), source->lastUpdatedTimeUtc) != 0)
XinZhangMS 0:f7f1f0d76dd6 1217 {
XinZhangMS 0:f7f1f0d76dd6 1218 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION lastUpdatedTimeUtc");
XinZhangMS 0:f7f1f0d76dd6 1219 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1220 }
XinZhangMS 0:f7f1f0d76dd6 1221 else if (source->content.deviceContent != NULL && mallocAndStrcpy_s((char**)&(target->content.deviceContent), source->content.deviceContent) != 0)
XinZhangMS 0:f7f1f0d76dd6 1222 {
XinZhangMS 0:f7f1f0d76dd6 1223 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION_CONTENT deviceContent");
XinZhangMS 0:f7f1f0d76dd6 1224 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1225 }
XinZhangMS 0:f7f1f0d76dd6 1226 else if (source->content.modulesContent != NULL && mallocAndStrcpy_s((char**)&(target->content.modulesContent), source->content.modulesContent) != 0)
XinZhangMS 0:f7f1f0d76dd6 1227 {
XinZhangMS 0:f7f1f0d76dd6 1228 LogError("mallocAndStrcpy_s failed for IOTHUB_DEVICE_CONFIGURATION_CONTENT modulesContent");
XinZhangMS 0:f7f1f0d76dd6 1229 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1230 }
XinZhangMS 0:f7f1f0d76dd6 1231 else
XinZhangMS 0:f7f1f0d76dd6 1232 {
XinZhangMS 0:f7f1f0d76dd6 1233 if (cloneNameValueArrays_results(&(source->metricResult), &(target->metricResult)) != IOTHUB_DEVICE_CONFIGURATION_OK || cloneNameValueArrays_results(&(source->systemMetricsResult), &(target->systemMetricsResult)) != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1234 {
XinZhangMS 0:f7f1f0d76dd6 1235 LogError("Cloning failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_RESULT structures");
XinZhangMS 0:f7f1f0d76dd6 1236 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1237 }
XinZhangMS 0:f7f1f0d76dd6 1238
XinZhangMS 0:f7f1f0d76dd6 1239 if (cloneNameValueArrays_definitions(&(source->metricsDefinition), &(target->metricsDefinition)) != IOTHUB_DEVICE_CONFIGURATION_OK || cloneNameValueArrays_definitions(&(source->systemMetricsDefinition), &(target->systemMetricsDefinition)) != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1240 {
XinZhangMS 0:f7f1f0d76dd6 1241 LogError("Cloning failed for IOTHUB_DEVICE_CONFIGURATION_METRICS_DEFINITION structures");
XinZhangMS 0:f7f1f0d76dd6 1242 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1243 }
XinZhangMS 0:f7f1f0d76dd6 1244
XinZhangMS 0:f7f1f0d76dd6 1245 if (cloneNameValueArrays_labels(&(source->labels), &(target->labels)) != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1246 {
XinZhangMS 0:f7f1f0d76dd6 1247 LogError("Cloning failed for IOTHUB_DEVICE_CONFIGURATION_LABELS structures");
XinZhangMS 0:f7f1f0d76dd6 1248 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1249 }
XinZhangMS 0:f7f1f0d76dd6 1250 }
XinZhangMS 0:f7f1f0d76dd6 1251 }
XinZhangMS 0:f7f1f0d76dd6 1252 return result;
XinZhangMS 0:f7f1f0d76dd6 1253 }
XinZhangMS 0:f7f1f0d76dd6 1254
XinZhangMS 0:f7f1f0d76dd6 1255 static IOTHUB_DEVICE_CONFIGURATION_RESULT addDeviceConfigurationToLinkedList(IOTHUB_DEVICE_CONFIGURATION* iothubDeviceConfiguration, SINGLYLINKEDLIST_HANDLE deviceConfigurationList)
XinZhangMS 0:f7f1f0d76dd6 1256 {
XinZhangMS 0:f7f1f0d76dd6 1257 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1258 IOTHUB_DEVICE_CONFIGURATION* deviceConfiguration = NULL;
XinZhangMS 0:f7f1f0d76dd6 1259
XinZhangMS 0:f7f1f0d76dd6 1260 if ((deviceConfiguration = (IOTHUB_DEVICE_CONFIGURATION*)calloc(1, sizeof(IOTHUB_DEVICE_CONFIGURATION))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1261 {
XinZhangMS 0:f7f1f0d76dd6 1262 LogError("Malloc failed for deviceConfiguration");
XinZhangMS 0:f7f1f0d76dd6 1263 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1264 }
XinZhangMS 0:f7f1f0d76dd6 1265 else
XinZhangMS 0:f7f1f0d76dd6 1266 {
XinZhangMS 0:f7f1f0d76dd6 1267 if (clone_deviceConfiguration(iothubDeviceConfiguration, deviceConfiguration) != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1268 {
XinZhangMS 0:f7f1f0d76dd6 1269 LogError("clone_deviceConfiguration failed for deviceConfiguration");
XinZhangMS 0:f7f1f0d76dd6 1270 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1271 }
XinZhangMS 0:f7f1f0d76dd6 1272 else if ((singlylinkedlist_add(deviceConfigurationList, deviceConfiguration)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1273 {
XinZhangMS 0:f7f1f0d76dd6 1274 LogError("singlylinkedlist_add deviceConfiguration failed");
XinZhangMS 0:f7f1f0d76dd6 1275 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1276 }
XinZhangMS 0:f7f1f0d76dd6 1277 else
XinZhangMS 0:f7f1f0d76dd6 1278 {
XinZhangMS 0:f7f1f0d76dd6 1279 result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 1280 }
XinZhangMS 0:f7f1f0d76dd6 1281
XinZhangMS 0:f7f1f0d76dd6 1282 if (result != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1283 {
XinZhangMS 0:f7f1f0d76dd6 1284 IoTHubDeviceConfiguration_FreeConfigurationMembers(deviceConfiguration);
XinZhangMS 0:f7f1f0d76dd6 1285 free(deviceConfiguration);
XinZhangMS 0:f7f1f0d76dd6 1286 }
XinZhangMS 0:f7f1f0d76dd6 1287 }
XinZhangMS 0:f7f1f0d76dd6 1288
XinZhangMS 0:f7f1f0d76dd6 1289 return result;
XinZhangMS 0:f7f1f0d76dd6 1290 }
XinZhangMS 0:f7f1f0d76dd6 1291
XinZhangMS 0:f7f1f0d76dd6 1292 static void initializeDeviceConfigurationMembers(IOTHUB_DEVICE_CONFIGURATION * configuration)
XinZhangMS 0:f7f1f0d76dd6 1293 {
XinZhangMS 0:f7f1f0d76dd6 1294 if (NULL != configuration)
XinZhangMS 0:f7f1f0d76dd6 1295 {
XinZhangMS 0:f7f1f0d76dd6 1296 memset(configuration, 0, sizeof(IOTHUB_DEVICE_CONFIGURATION));
XinZhangMS 0:f7f1f0d76dd6 1297 }
XinZhangMS 0:f7f1f0d76dd6 1298 }
XinZhangMS 0:f7f1f0d76dd6 1299
XinZhangMS 0:f7f1f0d76dd6 1300 static IOTHUB_DEVICE_CONFIGURATION_RESULT parseDeviceConfigurationListJson(BUFFER_HANDLE jsonBuffer, SINGLYLINKEDLIST_HANDLE configurationList)
XinZhangMS 0:f7f1f0d76dd6 1301 {
XinZhangMS 0:f7f1f0d76dd6 1302 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1303
XinZhangMS 0:f7f1f0d76dd6 1304 const char* bufferStr = NULL;
XinZhangMS 0:f7f1f0d76dd6 1305 JSON_Value* root_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 1306 JSON_Array* device_configuration_array = NULL;
XinZhangMS 0:f7f1f0d76dd6 1307 JSON_Status jsonStatus = JSONFailure;
XinZhangMS 0:f7f1f0d76dd6 1308
XinZhangMS 0:f7f1f0d76dd6 1309 if (jsonBuffer == NULL)
XinZhangMS 0:f7f1f0d76dd6 1310 {
XinZhangMS 0:f7f1f0d76dd6 1311 LogError("jsonBuffer cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1312 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1313 }
XinZhangMS 0:f7f1f0d76dd6 1314 else if (configurationList == NULL)
XinZhangMS 0:f7f1f0d76dd6 1315 {
XinZhangMS 0:f7f1f0d76dd6 1316 LogError("configurationList cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1317 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1318 }
XinZhangMS 0:f7f1f0d76dd6 1319 else
XinZhangMS 0:f7f1f0d76dd6 1320 {
XinZhangMS 0:f7f1f0d76dd6 1321 if ((bufferStr = (const char*)BUFFER_u_char(jsonBuffer)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1322 {
XinZhangMS 0:f7f1f0d76dd6 1323 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_072: [** If populating the deviceList parameter fails IoTHubDeviceConfiguration_GetConfigurations shall return IOTHUB_DEVICE_CONFIGURATION_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 1324 LogError("BUFFER_u_char failed");
XinZhangMS 0:f7f1f0d76dd6 1325 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1326 }
XinZhangMS 0:f7f1f0d76dd6 1327 else if ((root_value = json_parse_string(bufferStr)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1328 {
XinZhangMS 0:f7f1f0d76dd6 1329 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_070: [** If any of the parson API fails, IoTHubDeviceConfiguration_GetConfigurations shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 1330 LogError("json_parse_string failed");
XinZhangMS 0:f7f1f0d76dd6 1331 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1332 }
XinZhangMS 0:f7f1f0d76dd6 1333 else if ((device_configuration_array = json_value_get_array(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1334 {
XinZhangMS 0:f7f1f0d76dd6 1335 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_070: [** If any of the parson API fails, IoTHubDeviceConfiguration_GetConfigurations shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 1336 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 1337 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1338 }
XinZhangMS 0:f7f1f0d76dd6 1339 else
XinZhangMS 0:f7f1f0d76dd6 1340 {
XinZhangMS 0:f7f1f0d76dd6 1341 result = IOTHUB_DEVICE_CONFIGURATION_OK;
XinZhangMS 0:f7f1f0d76dd6 1342
XinZhangMS 0:f7f1f0d76dd6 1343 size_t array_count = json_array_get_count(device_configuration_array);
XinZhangMS 0:f7f1f0d76dd6 1344 for (size_t i = 0; i < array_count; i++)
XinZhangMS 0:f7f1f0d76dd6 1345 {
XinZhangMS 0:f7f1f0d76dd6 1346 JSON_Object* device_configuration_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 1347 IOTHUB_DEVICE_CONFIGURATION iotHubDeviceConfiguration;
XinZhangMS 0:f7f1f0d76dd6 1348
XinZhangMS 0:f7f1f0d76dd6 1349 if ((device_configuration_object = json_array_get_object(device_configuration_array, i)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1350 {
XinZhangMS 0:f7f1f0d76dd6 1351 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_070: [** If any of the parson API fails, IoTHubDeviceConfiguration_GetConfigurations shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 1352 LogError("json_array_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 1353 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1354 }
XinZhangMS 0:f7f1f0d76dd6 1355 else
XinZhangMS 0:f7f1f0d76dd6 1356 {
XinZhangMS 0:f7f1f0d76dd6 1357 initializeDeviceConfigurationMembers(&iotHubDeviceConfiguration);
XinZhangMS 0:f7f1f0d76dd6 1358
XinZhangMS 0:f7f1f0d76dd6 1359 result = parseDeviceConfigurationJsonObject(device_configuration_object, &iotHubDeviceConfiguration);
XinZhangMS 0:f7f1f0d76dd6 1360 if (result != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1361 {
XinZhangMS 0:f7f1f0d76dd6 1362 LogError("parseDeviceConfigurationJsonObject failed");
XinZhangMS 0:f7f1f0d76dd6 1363 }
XinZhangMS 0:f7f1f0d76dd6 1364 else
XinZhangMS 0:f7f1f0d76dd6 1365 {
XinZhangMS 0:f7f1f0d76dd6 1366 result = addDeviceConfigurationToLinkedList(&iotHubDeviceConfiguration, configurationList);
XinZhangMS 0:f7f1f0d76dd6 1367 if (result != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1368 {
XinZhangMS 0:f7f1f0d76dd6 1369 LogError("addDeviceConfigurationToLinkedList failed");
XinZhangMS 0:f7f1f0d76dd6 1370 }
XinZhangMS 0:f7f1f0d76dd6 1371 }
XinZhangMS 0:f7f1f0d76dd6 1372 }
XinZhangMS 0:f7f1f0d76dd6 1373
XinZhangMS 0:f7f1f0d76dd6 1374 json_object_clear(device_configuration_object);
XinZhangMS 0:f7f1f0d76dd6 1375 IoTHubDeviceConfiguration_FreeConfigurationMembers(&iotHubDeviceConfiguration);
XinZhangMS 0:f7f1f0d76dd6 1376
XinZhangMS 0:f7f1f0d76dd6 1377 if (result != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1378 {
XinZhangMS 0:f7f1f0d76dd6 1379 break;
XinZhangMS 0:f7f1f0d76dd6 1380 }
XinZhangMS 0:f7f1f0d76dd6 1381 }
XinZhangMS 0:f7f1f0d76dd6 1382 }
XinZhangMS 0:f7f1f0d76dd6 1383 }
XinZhangMS 0:f7f1f0d76dd6 1384 if (device_configuration_array != NULL)
XinZhangMS 0:f7f1f0d76dd6 1385 {
XinZhangMS 0:f7f1f0d76dd6 1386 if ((jsonStatus = json_array_clear(device_configuration_array)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 1387 {
XinZhangMS 0:f7f1f0d76dd6 1388 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_070: [** If any of the parson API fails, IoTHubDeviceConfiguration_GetConfigurations shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 1389 LogError("json_array_clear failed");
XinZhangMS 0:f7f1f0d76dd6 1390 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1391 }
XinZhangMS 0:f7f1f0d76dd6 1392 }
XinZhangMS 0:f7f1f0d76dd6 1393
XinZhangMS 0:f7f1f0d76dd6 1394 if (root_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 1395 {
XinZhangMS 0:f7f1f0d76dd6 1396 json_value_free(root_value);
XinZhangMS 0:f7f1f0d76dd6 1397 }
XinZhangMS 0:f7f1f0d76dd6 1398
XinZhangMS 0:f7f1f0d76dd6 1399 if (result != IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1400 {
XinZhangMS 0:f7f1f0d76dd6 1401 if (configurationList != NULL)
XinZhangMS 0:f7f1f0d76dd6 1402 {
XinZhangMS 0:f7f1f0d76dd6 1403 LIST_ITEM_HANDLE itemHandle = singlylinkedlist_get_head_item(configurationList);
XinZhangMS 0:f7f1f0d76dd6 1404 while (itemHandle != NULL)
XinZhangMS 0:f7f1f0d76dd6 1405 {
XinZhangMS 0:f7f1f0d76dd6 1406 IOTHUB_DEVICE_CONFIGURATION* curr_item = (IOTHUB_DEVICE_CONFIGURATION *)singlylinkedlist_item_get_value(itemHandle);
XinZhangMS 0:f7f1f0d76dd6 1407 IoTHubDeviceConfiguration_FreeConfigurationMembers(curr_item);
XinZhangMS 0:f7f1f0d76dd6 1408 free(curr_item);
XinZhangMS 0:f7f1f0d76dd6 1409
XinZhangMS 0:f7f1f0d76dd6 1410 LIST_ITEM_HANDLE lastHandle = itemHandle;
XinZhangMS 0:f7f1f0d76dd6 1411 itemHandle = singlylinkedlist_get_next_item(itemHandle);
XinZhangMS 0:f7f1f0d76dd6 1412 singlylinkedlist_remove(configurationList, lastHandle);
XinZhangMS 0:f7f1f0d76dd6 1413 }
XinZhangMS 0:f7f1f0d76dd6 1414 }
XinZhangMS 0:f7f1f0d76dd6 1415 }
XinZhangMS 0:f7f1f0d76dd6 1416 return result;
XinZhangMS 0:f7f1f0d76dd6 1417 }
XinZhangMS 0:f7f1f0d76dd6 1418
XinZhangMS 0:f7f1f0d76dd6 1419 IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, size_t maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations)
XinZhangMS 0:f7f1f0d76dd6 1420 {
XinZhangMS 0:f7f1f0d76dd6 1421 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1422
XinZhangMS 0:f7f1f0d76dd6 1423 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_060: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall verify the input parameters and if any of them are NULL then return IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1424 if ((serviceClientDeviceConfigurationHandle == NULL) || (configurations == NULL))
XinZhangMS 0:f7f1f0d76dd6 1425 {
XinZhangMS 0:f7f1f0d76dd6 1426 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1427 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1428 }
XinZhangMS 0:f7f1f0d76dd6 1429 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_061: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall verify if the numberOfDevices input parameter is between 1 and 20 and if it is not then return IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1430 else if ((maxConfigurationsCount == 0) || (maxConfigurationsCount > IOTHUB_DEVICE_CONFIGURATIONS_MAX_REQUEST))
XinZhangMS 0:f7f1f0d76dd6 1431 {
XinZhangMS 0:f7f1f0d76dd6 1432 LogError("numberOfDevices has to be between 1 and %d", IOTHUB_DEVICE_CONFIGURATIONS_MAX_REQUEST);
XinZhangMS 0:f7f1f0d76dd6 1433 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1434 }
XinZhangMS 0:f7f1f0d76dd6 1435 else
XinZhangMS 0:f7f1f0d76dd6 1436 {
XinZhangMS 0:f7f1f0d76dd6 1437 BUFFER_HANDLE responseBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1438
XinZhangMS 0:f7f1f0d76dd6 1439 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_109: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall allocate memory for response buffer by calling BUFFER_new ] */
XinZhangMS 0:f7f1f0d76dd6 1440 if ((responseBuffer = BUFFER_new()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1441 {
XinZhangMS 0:f7f1f0d76dd6 1442 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_110: [ If the BUFFER_new fails, IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall do clean up and return NULL ] */
XinZhangMS 0:f7f1f0d76dd6 1443 LogError("BUFFER_new failed for responseBuffer");
XinZhangMS 0:f7f1f0d76dd6 1444 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1445 }
XinZhangMS 0:f7f1f0d76dd6 1446 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_062: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall create HTTP GET request for numberOfDevices using the follwoing format: url/devices/?top=[numberOfDevices]&api-version ] */
XinZhangMS 0:f7f1f0d76dd6 1447 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_063: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall add the following headers to the created HTTP GET request: authorization=sasToken,Request-Id=<generatedGuid>,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1448 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_064: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1449 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_065: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1450 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_066: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall execute the HTTP GET request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1451 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_067: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1452 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_068: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall verify the received HTTP status code and if it is less or equal than 300 then try to parse the response JSON to deviceList ] */
XinZhangMS 0:f7f1f0d76dd6 1453 else if ((result = sendHttpRequestDeviceConfiguration(serviceClientDeviceConfigurationHandle, IOTHUB_DEVICECONFIGURATION_REQUEST_GET_LIST, NULL, NULL, maxConfigurationsCount, responseBuffer)) == IOTHUB_DEVICE_CONFIGURATION_ERROR)
XinZhangMS 0:f7f1f0d76dd6 1454 {
XinZhangMS 0:f7f1f0d76dd6 1455 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_115: [ If any of the HTTPAPI call fails IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall fail and return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1456 LogError("Failure sending HTTP request for get configuration list");
XinZhangMS 0:f7f1f0d76dd6 1457 }
XinZhangMS 0:f7f1f0d76dd6 1458 else if (result == IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1459 {
XinZhangMS 0:f7f1f0d76dd6 1460 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_069: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall use the parson APIs to parse the response JSON ] */
XinZhangMS 0:f7f1f0d76dd6 1461 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_070: [ If any of the parson API fails, IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1462 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_071: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall populate the deviceList parameter with structures of type "IOTHUB_DEVICE_CONFIGURATION" ] */
XinZhangMS 0:f7f1f0d76dd6 1463 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_072: [ If populating the deviceList parameter fails IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1464 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_073: [ If populating the deviceList parameter successful IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall return IOTHUB_DEVICE_CONFIGURATION_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1465 result = parseDeviceConfigurationListJson(responseBuffer, configurations);
XinZhangMS 0:f7f1f0d76dd6 1466 }
XinZhangMS 0:f7f1f0d76dd6 1467
XinZhangMS 0:f7f1f0d76dd6 1468 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_111: [ IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfigurations(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const int maxConfigurationsCount, SINGLYLINKEDLIST_HANDLE configurations) shall do clean up before return ] */
XinZhangMS 0:f7f1f0d76dd6 1469 if (responseBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 1470 {
XinZhangMS 0:f7f1f0d76dd6 1471 BUFFER_delete(responseBuffer);
XinZhangMS 0:f7f1f0d76dd6 1472 }
XinZhangMS 0:f7f1f0d76dd6 1473 }
XinZhangMS 0:f7f1f0d76dd6 1474 return result;
XinZhangMS 0:f7f1f0d76dd6 1475 }
XinZhangMS 0:f7f1f0d76dd6 1476
XinZhangMS 0:f7f1f0d76dd6 1477 IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_GetConfiguration(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const char* configurationId, IOTHUB_DEVICE_CONFIGURATION* configuration)
XinZhangMS 0:f7f1f0d76dd6 1478 {
XinZhangMS 0:f7f1f0d76dd6 1479 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1480
XinZhangMS 0:f7f1f0d76dd6 1481 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_18: [ IoTHubDeviceConfiguration_GetConfiguration shall verify the input parameters and if any of them are NULL then return IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG ]*/
XinZhangMS 0:f7f1f0d76dd6 1482 if ((serviceClientDeviceConfigurationHandle == NULL) || (configurationId == NULL))
XinZhangMS 0:f7f1f0d76dd6 1483 {
XinZhangMS 0:f7f1f0d76dd6 1484 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1485 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1486 }
XinZhangMS 0:f7f1f0d76dd6 1487 else
XinZhangMS 0:f7f1f0d76dd6 1488 {
XinZhangMS 0:f7f1f0d76dd6 1489 initializeDeviceConfigurationMembers(configuration);
XinZhangMS 0:f7f1f0d76dd6 1490
XinZhangMS 0:f7f1f0d76dd6 1491 BUFFER_HANDLE responseBuffer;
XinZhangMS 0:f7f1f0d76dd6 1492
XinZhangMS 0:f7f1f0d76dd6 1493 if ((responseBuffer = BUFFER_new()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1494 {
XinZhangMS 0:f7f1f0d76dd6 1495 LogError("BUFFER_new failed for responseBuffer");
XinZhangMS 0:f7f1f0d76dd6 1496 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1497 }
XinZhangMS 0:f7f1f0d76dd6 1498 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_026: [ IoTHubDeviceConfiguration_GetConfiguration shall create HTTP GET request URL using the given configurationId using the following format: url/devices/[configurationId]?[apiVersion] ] */
XinZhangMS 0:f7f1f0d76dd6 1499 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_027: [ IoTHubDeviceConfiguration_GetConfiguration shall add the following headers to the created HTTP GET request: authorization=sasToken,Request-Id=<generatedGuid>,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1500 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_028: [ IoTHubDeviceConfiguration_GetConfiguration shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1501 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_029: [ IoTHubDeviceConfiguration_GetConfiguration shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1502 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_030: [ IoTHubDeviceConfiguration_GetConfiguration shall execute the HTTP GET request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1503 else if ((result = sendHttpRequestDeviceConfiguration(serviceClientDeviceConfigurationHandle, IOTHUB_DEVICECONFIGURATION_REQUEST_GET, configurationId, NULL, (size_t)0, responseBuffer)) == IOTHUB_DEVICE_CONFIGURATION_ERROR)
XinZhangMS 0:f7f1f0d76dd6 1504 {
XinZhangMS 0:f7f1f0d76dd6 1505 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_031: [ If any of the HTTPAPI call fails IoTHubDeviceConfiguration_GetConfiguration shall fail and return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1506 LogError("Failure sending HTTP request for get device configuration");
XinZhangMS 0:f7f1f0d76dd6 1507 }
XinZhangMS 0:f7f1f0d76dd6 1508 else if (result == IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1509 {
XinZhangMS 0:f7f1f0d76dd6 1510 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_033: [ IoTHubDeviceConfiguration_GetConfiguration shall verify the received HTTP status code and if it is less or equal than 300 then try to parse the response JSON to configuration for the configuration properties] */
XinZhangMS 0:f7f1f0d76dd6 1511 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_034: [ If any of the property field above missing from the JSON the property value will not be populated ] */
XinZhangMS 0:f7f1f0d76dd6 1512 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_035: [ If the JSON parsing failed, IoTHubDeviceConfiguration_GetConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1513 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_036: [ If the received JSON is empty, IoTHubDeviceConfiguration_GetConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_DEVICE_NOT_EXIST ] */
XinZhangMS 0:f7f1f0d76dd6 1514 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_037: [ If the configuration out parameter if not NULL IoTHubDeviceConfiguration_GetConfiguration shall save the received configuration to the out parameter and return IOTHUB_DEVICE_CONFIGURATION_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1515 result = parseDeviceConfigurationJson(responseBuffer, configuration);
XinZhangMS 0:f7f1f0d76dd6 1516 }
XinZhangMS 0:f7f1f0d76dd6 1517
XinZhangMS 0:f7f1f0d76dd6 1518 BUFFER_delete(responseBuffer);
XinZhangMS 0:f7f1f0d76dd6 1519 }
XinZhangMS 0:f7f1f0d76dd6 1520
XinZhangMS 0:f7f1f0d76dd6 1521 return result;
XinZhangMS 0:f7f1f0d76dd6 1522 }
XinZhangMS 0:f7f1f0d76dd6 1523
XinZhangMS 0:f7f1f0d76dd6 1524 IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_AddConfiguration(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const IOTHUB_DEVICE_CONFIGURATION_ADD* configurationCreate, IOTHUB_DEVICE_CONFIGURATION* configuration)
XinZhangMS 0:f7f1f0d76dd6 1525 {
XinZhangMS 0:f7f1f0d76dd6 1526 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1527
XinZhangMS 0:f7f1f0d76dd6 1528 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_007: [ IoTHubDeviceConfiguration_AddConfiguration shall verify the input parameters and if any of them are NULL then return IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1529 if ((serviceClientDeviceConfigurationHandle == NULL) || (configurationCreate == NULL) || (configuration == NULL))
XinZhangMS 0:f7f1f0d76dd6 1530 {
XinZhangMS 0:f7f1f0d76dd6 1531 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1532 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1533 }
XinZhangMS 0:f7f1f0d76dd6 1534 else
XinZhangMS 0:f7f1f0d76dd6 1535 {
XinZhangMS 0:f7f1f0d76dd6 1536 initializeDeviceConfigurationMembers(configuration);
XinZhangMS 0:f7f1f0d76dd6 1537
XinZhangMS 0:f7f1f0d76dd6 1538 if (configurationCreate->configurationId == NULL)
XinZhangMS 0:f7f1f0d76dd6 1539 {
XinZhangMS 0:f7f1f0d76dd6 1540 LogError("configurationId cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1541 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1542 }
XinZhangMS 0:f7f1f0d76dd6 1543 else
XinZhangMS 0:f7f1f0d76dd6 1544 {
XinZhangMS 0:f7f1f0d76dd6 1545 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_095: [ IoTHubDeviceConfiguration_AddConfiguration shall allocate memory for device info structure by calling malloc ] */
XinZhangMS 0:f7f1f0d76dd6 1546 IOTHUB_DEVICE_CONFIGURATION* tempConfigurationInfo;
XinZhangMS 0:f7f1f0d76dd6 1547 if ((tempConfigurationInfo = malloc(sizeof(IOTHUB_DEVICE_CONFIGURATION))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1548 {
XinZhangMS 0:f7f1f0d76dd6 1549 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_096 : [ If the malloc fails, IoTHubDeviceConfiguration_AddConfiguration shall do clean up and return IOTHUB_DEVICE_CONFIGURATION_ERROR. ] */
XinZhangMS 0:f7f1f0d76dd6 1550 LogError("Malloc failed for tempconfiguration");
XinZhangMS 0:f7f1f0d76dd6 1551 result = IOTHUB_DEVICE_CONFIGURATION_OUT_OF_MEMORY_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1552 }
XinZhangMS 0:f7f1f0d76dd6 1553 else
XinZhangMS 0:f7f1f0d76dd6 1554 {
XinZhangMS 0:f7f1f0d76dd6 1555 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_011: [ IoTHubDeviceConfiguration_AddConfiguration shall set the "configurationId" value to the configurationCreate->configurationId ] */
XinZhangMS 0:f7f1f0d76dd6 1556 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_011: [ IoTHubDeviceConfiguration_AddConfiguration shall set the "targetCondition" value to the configurationCreate->targetCondition ] */
XinZhangMS 0:f7f1f0d76dd6 1557 memset(tempConfigurationInfo, 0, sizeof(*tempConfigurationInfo));
XinZhangMS 0:f7f1f0d76dd6 1558 tempConfigurationInfo->configurationId = configurationCreate->configurationId;
XinZhangMS 0:f7f1f0d76dd6 1559 tempConfigurationInfo->targetCondition = configurationCreate->targetCondition;
XinZhangMS 0:f7f1f0d76dd6 1560 tempConfigurationInfo->content = configurationCreate->content;
XinZhangMS 0:f7f1f0d76dd6 1561 tempConfigurationInfo->labels = configurationCreate->labels;
XinZhangMS 0:f7f1f0d76dd6 1562 tempConfigurationInfo->metricsDefinition = configurationCreate->metrics;
XinZhangMS 0:f7f1f0d76dd6 1563 tempConfigurationInfo->priority = configurationCreate->priority;
XinZhangMS 0:f7f1f0d76dd6 1564
XinZhangMS 0:f7f1f0d76dd6 1565 tempConfigurationInfo->schemaVersion = CONFIGURATION_DEFAULT_SCHEMA_VERSION;
XinZhangMS 0:f7f1f0d76dd6 1566 tempConfigurationInfo->eTag = CONFIGURATION_DEFAULT_ETAG;
XinZhangMS 0:f7f1f0d76dd6 1567
XinZhangMS 0:f7f1f0d76dd6 1568 BUFFER_HANDLE configurationJsonBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1569 BUFFER_HANDLE responseBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1570
XinZhangMS 0:f7f1f0d76dd6 1571 if (((tempConfigurationInfo->content).deviceContent == NULL || strlen((tempConfigurationInfo->content).deviceContent) == 0) &&
XinZhangMS 0:f7f1f0d76dd6 1572 ((tempConfigurationInfo->content).modulesContent == NULL || strlen((tempConfigurationInfo->content).modulesContent) == 0))
XinZhangMS 0:f7f1f0d76dd6 1573 {
XinZhangMS 0:f7f1f0d76dd6 1574 LogError("both deviceContent and modulesContent cannot be null");
XinZhangMS 0:f7f1f0d76dd6 1575 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1576 }
XinZhangMS 0:f7f1f0d76dd6 1577 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_010: [ IoTHubDeviceConfiguration_AddConfiguration shall create a flat "key1:value2,key2:value2..." JSON representation from the given deviceOrModuleCreateInfo parameter using parson APIs ] */
XinZhangMS 0:f7f1f0d76dd6 1578 else if ((configurationJsonBuffer = createConfigurationPayloadJson(tempConfigurationInfo)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1579 {
XinZhangMS 0:f7f1f0d76dd6 1580 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_013: [ IoTHubDeviceConfiguration_AddConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 1581 LogError("Json creation failed");
XinZhangMS 0:f7f1f0d76dd6 1582 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1583 }
XinZhangMS 0:f7f1f0d76dd6 1584 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_097: [ IoTHubDeviceConfiguration_AddConfiguration shall allocate memory for response buffer by calling BUFFER_new ] */
XinZhangMS 0:f7f1f0d76dd6 1585 else if ((responseBuffer = BUFFER_new()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1586 {
XinZhangMS 0:f7f1f0d76dd6 1587 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_098 : [ If the BUFFER_new fails, IoTHubDeviceConfiguration_AddConfiguration shall do clean up and return IOTHUB_DEVICE_CONFIGURATION_ERROR. ] */
XinZhangMS 0:f7f1f0d76dd6 1588 LogError("BUFFER_new failed for responseBuffer");
XinZhangMS 0:f7f1f0d76dd6 1589 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1590 }
XinZhangMS 0:f7f1f0d76dd6 1591 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_014: [ IoTHubDeviceConfiguration_AddConfiguration shall create an HTTP PUT request using the created JSON ] */
XinZhangMS 0:f7f1f0d76dd6 1592 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_015: [ IoTHubDeviceConfiguration_AddConfiguration shall create an HTTP PUT request using the following HTTP headers: authorization=sasToken,Request-Id=<generatedGuid>,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1593 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_016: [ IoTHubDeviceConfiguration_AddConfiguration shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1594 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_017: [ IoTHubDeviceConfiguration_AddConfiguration shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1595 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_018: [ IoTHubDeviceConfiguration_AddConfiguration shall execute the HTTP PUT request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1596 else if ((result = sendHttpRequestDeviceConfiguration(serviceClientDeviceConfigurationHandle, IOTHUB_DEVICECONFIGURATION_REQUEST_ADD, tempConfigurationInfo->configurationId, configurationJsonBuffer, (size_t)0, responseBuffer)) == IOTHUB_DEVICE_CONFIGURATION_ERROR)
XinZhangMS 0:f7f1f0d76dd6 1597 {
XinZhangMS 0:f7f1f0d76dd6 1598 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_019: [ If any of the HTTPAPI call fails IoTHubDeviceConfiguration_AddConfiguration shall fail and return IOTHUB_DEVICE_CONFIGURATION_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1599 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_099: [ If any of the call fails during the HTTP creation IoTHubDeviceConfiguration_AddConfiguration shall fail and return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1600 LogError("Failure sending HTTP request for create device");
XinZhangMS 0:f7f1f0d76dd6 1601 }
XinZhangMS 0:f7f1f0d76dd6 1602 else if (result == IOTHUB_DEVICE_CONFIGURATION_OK)
XinZhangMS 0:f7f1f0d76dd6 1603 {
XinZhangMS 0:f7f1f0d76dd6 1604 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_022: [ IoTHubDeviceConfiguration_AddConfiguration shall verify the received HTTP status code and if it is less or equal than 300 then try to parse the response JSON to configuration ] */
XinZhangMS 0:f7f1f0d76dd6 1605 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_023: [ If the JSON parsing failed, IoTHubDeviceConfiguration_AddConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1606 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_024: [ If the configuration out parameter is not NULL IoTHubDeviceConfiguration_AddConfiguration shall save the received configuration to the out parameter and return IOTHUB_DEVICE_CONFIGURATION_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1607 result = parseDeviceConfigurationJson(responseBuffer, configuration);
XinZhangMS 0:f7f1f0d76dd6 1608 }
XinZhangMS 0:f7f1f0d76dd6 1609 else
XinZhangMS 0:f7f1f0d76dd6 1610 {
XinZhangMS 0:f7f1f0d76dd6 1611 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_020: [ IoTHubDeviceConfiguration_AddConfiguration shall verify the received HTTP status code and if it is 409 then return IOTHUB_DEVICE_CONFIGURATION_DEVICE_EXIST ] */
XinZhangMS 0:f7f1f0d76dd6 1612 }
XinZhangMS 0:f7f1f0d76dd6 1613
XinZhangMS 0:f7f1f0d76dd6 1614 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_100: [ IoTHubDeviceConfiguration_AddConfiguration shall do clean up before return ] */
XinZhangMS 0:f7f1f0d76dd6 1615 if (responseBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 1616 {
XinZhangMS 0:f7f1f0d76dd6 1617 BUFFER_delete(responseBuffer);
XinZhangMS 0:f7f1f0d76dd6 1618 }
XinZhangMS 0:f7f1f0d76dd6 1619 if (configurationJsonBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 1620 {
XinZhangMS 0:f7f1f0d76dd6 1621 BUFFER_delete(configurationJsonBuffer);
XinZhangMS 0:f7f1f0d76dd6 1622 }
XinZhangMS 0:f7f1f0d76dd6 1623 }
XinZhangMS 0:f7f1f0d76dd6 1624 free(tempConfigurationInfo);
XinZhangMS 0:f7f1f0d76dd6 1625 }
XinZhangMS 0:f7f1f0d76dd6 1626 }
XinZhangMS 0:f7f1f0d76dd6 1627
XinZhangMS 0:f7f1f0d76dd6 1628 return result;
XinZhangMS 0:f7f1f0d76dd6 1629 }
XinZhangMS 0:f7f1f0d76dd6 1630
XinZhangMS 0:f7f1f0d76dd6 1631 IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_UpdateConfiguration(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const IOTHUB_DEVICE_CONFIGURATION* configuration)
XinZhangMS 0:f7f1f0d76dd6 1632 {
XinZhangMS 0:f7f1f0d76dd6 1633 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1634
XinZhangMS 0:f7f1f0d76dd6 1635 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_007: [ IoTHubDeviceConfiguration_UpdateConfiguration shall verify the input parameters and if any of them are NULL then return IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1636 if ((serviceClientDeviceConfigurationHandle == NULL) || (configuration == NULL))
XinZhangMS 0:f7f1f0d76dd6 1637 {
XinZhangMS 0:f7f1f0d76dd6 1638 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1639 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1640 }
XinZhangMS 0:f7f1f0d76dd6 1641 else
XinZhangMS 0:f7f1f0d76dd6 1642 {
XinZhangMS 0:f7f1f0d76dd6 1643 if (configuration->configurationId == NULL)
XinZhangMS 0:f7f1f0d76dd6 1644 {
XinZhangMS 0:f7f1f0d76dd6 1645 LogError("configurationId cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1646 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1647 }
XinZhangMS 0:f7f1f0d76dd6 1648 else
XinZhangMS 0:f7f1f0d76dd6 1649 {
XinZhangMS 0:f7f1f0d76dd6 1650 BUFFER_HANDLE configurationJsonBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1651 BUFFER_HANDLE responseBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1652
XinZhangMS 0:f7f1f0d76dd6 1653 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_010: [ IoTHubDeviceConfiguration_UpdateConfiguration shall create a flat "key1:value2,key2:value2..." JSON representation from the given configuration parameter using the parson APIs ] */
XinZhangMS 0:f7f1f0d76dd6 1654 if ((configurationJsonBuffer = createConfigurationPayloadJson(configuration)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1655 {
XinZhangMS 0:f7f1f0d76dd6 1656 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_013: [ IoTHubDeviceConfiguration_UpdateConfiguration shall return IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 1657 LogError("Json creation failed");
XinZhangMS 0:f7f1f0d76dd6 1658 result = IOTHUB_DEVICE_CONFIGURATION_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1659 }
XinZhangMS 0:f7f1f0d76dd6 1660 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_097: [ IoTHubDeviceConfiguration_UpdateConfiguration shall allocate memory for response buffer by calling BUFFER_new ] */
XinZhangMS 0:f7f1f0d76dd6 1661 else if ((responseBuffer = BUFFER_new()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1662 {
XinZhangMS 0:f7f1f0d76dd6 1663 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_098 : [ If the BUFFER_new fails, IoTHubDeviceConfiguration_UpdateConfiguration shall do clean up and return IOTHUB_DEVICE_CONFIGURATION_ERROR. ] */
XinZhangMS 0:f7f1f0d76dd6 1664 LogError("BUFFER_new failed for responseBuffer");
XinZhangMS 0:f7f1f0d76dd6 1665 result = IOTHUB_DEVICE_CONFIGURATION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1666 }
XinZhangMS 0:f7f1f0d76dd6 1667 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_014: [ IoTHubDeviceConfiguration_UpdateConfiguration shall create an HTTP PUT request using the created JSON ] */
XinZhangMS 0:f7f1f0d76dd6 1668 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_015: [ IoTHubDeviceConfiguration_UpdateConfiguration shall create an HTTP PUT request using the following HTTP headers: authorization=sasToken,Request-Id=<generatedGuid>,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1669 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_016: [ IoTHubDeviceConfiguration_UpdateConfiguration shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1670 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_017: [ IoTHubDeviceConfiguration_UpdateConfiguration shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1671 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_018: [ IoTHubDeviceConfiguration_UpdateConfiguration shall execute the HTTP PUT request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1672 else if ((result = sendHttpRequestDeviceConfiguration(serviceClientDeviceConfigurationHandle, IOTHUB_DEVICECONFIGURATION_REQUEST_UPDATE, configuration->configurationId, configurationJsonBuffer, (size_t)0, responseBuffer)) == IOTHUB_DEVICE_CONFIGURATION_ERROR)
XinZhangMS 0:f7f1f0d76dd6 1673 {
XinZhangMS 0:f7f1f0d76dd6 1674 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_019: [ If any of the HTTPAPI call fails IoTHubDeviceConfiguration_UpdateConfiguration shall fail and return IOTHUB_DEVICE_CONFIGURATION_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1675 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_099: [ If any of the call fails during the HTTP creation IoTHubDeviceConfiguration_UpdateConfiguration shall fail and return IOTHUB_DEVICE_CONFIGURATION_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1676 LogError("Failure sending HTTP request for update device configuration");
XinZhangMS 0:f7f1f0d76dd6 1677 }
XinZhangMS 0:f7f1f0d76dd6 1678 else
XinZhangMS 0:f7f1f0d76dd6 1679 {
XinZhangMS 0:f7f1f0d76dd6 1680 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_020: [ IoTHubDeviceConfiguration_UpdateConfiguration shall verify the received HTTP status code and if it is 409 then return IOTHUB_DEVICE_CONFIGURATION_DEVICE_EXIST ] */
XinZhangMS 0:f7f1f0d76dd6 1681 }
XinZhangMS 0:f7f1f0d76dd6 1682
XinZhangMS 0:f7f1f0d76dd6 1683 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_100: [ IoTHubDeviceConfiguration_UpdateConfiguration shall do clean up before return ] */
XinZhangMS 0:f7f1f0d76dd6 1684 if (responseBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 1685 {
XinZhangMS 0:f7f1f0d76dd6 1686 BUFFER_delete(responseBuffer);
XinZhangMS 0:f7f1f0d76dd6 1687 }
XinZhangMS 0:f7f1f0d76dd6 1688 if (configurationJsonBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 1689 {
XinZhangMS 0:f7f1f0d76dd6 1690 BUFFER_delete(configurationJsonBuffer);
XinZhangMS 0:f7f1f0d76dd6 1691 }
XinZhangMS 0:f7f1f0d76dd6 1692 }
XinZhangMS 0:f7f1f0d76dd6 1693 }
XinZhangMS 0:f7f1f0d76dd6 1694
XinZhangMS 0:f7f1f0d76dd6 1695 return result;
XinZhangMS 0:f7f1f0d76dd6 1696 }
XinZhangMS 0:f7f1f0d76dd6 1697
XinZhangMS 0:f7f1f0d76dd6 1698 IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_DeleteConfiguration(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const char* configurationId)
XinZhangMS 0:f7f1f0d76dd6 1699 {
XinZhangMS 0:f7f1f0d76dd6 1700 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1701
XinZhangMS 0:f7f1f0d76dd6 1702 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_052: [ IoTHubDeviceConfiguration_DeleteConfiguration shall verify the input parameters and if any of them are NULL then return IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG ]*/
XinZhangMS 0:f7f1f0d76dd6 1703 if ((serviceClientDeviceConfigurationHandle == NULL) || (configurationId == NULL))
XinZhangMS 0:f7f1f0d76dd6 1704 {
XinZhangMS 0:f7f1f0d76dd6 1705 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1706 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1707 }
XinZhangMS 0:f7f1f0d76dd6 1708 else
XinZhangMS 0:f7f1f0d76dd6 1709 {
XinZhangMS 0:f7f1f0d76dd6 1710 /*SRS_IOTHUBDEVICECONFIGURATION_38_053: [ IoTHubDeviceConfiguration_DeleteConfiguration shall create HTTP DELETE request URL using the given configurationId using the following format : url/configurations/[configurationId]?api-version ] */
XinZhangMS 0:f7f1f0d76dd6 1711 /*SRS_IOTHUBDEVICECONFIGURATION_38_054: [ IoTHubDeviceConfiguration_DeleteConfiguration shall add the following headers to the created HTTP GET request : authorization=sasToken,Request-Id=<generatedGuid>,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1712 /*SRS_IOTHUBDEVICECONFIGURATION_38_055: [ IoTHubDeviceConfiguration_DeleteConfiguration shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1713 /*SRS_IOTHUBDEVICECONFIGURATION_38_056: [ IoTHubDeviceConfiguration_DeleteConfiguration shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1714 /*SRS_IOTHUBDEVICECONFIGURATION_38_057: [ IoTHubDeviceConfiguration_DeleteConfiguration shall execute the HTTP DELETE request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1715 /*SRS_IOTHUBDEVICECONFIGURATION_38_058: [ IoTHubDeviceConfiguration_DeleteConfiguration shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_DEVICE_CONFIGURATION_HTTP_STATUS_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1716 /*SRS_IOTHUBDEVICECONFIGURATION_38_059: [ IoTHubDeviceConfiguration_DeleteConfiguration shall verify the received HTTP status code and if it is less or equal than 300 then return IOTHUB_DEVICE_CONFIGURATION_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1717 result = sendHttpRequestDeviceConfiguration(serviceClientDeviceConfigurationHandle, IOTHUB_DEVICECONFIGURATION_REQUEST_DELETE, configurationId, NULL, (size_t)0, NULL);
XinZhangMS 0:f7f1f0d76dd6 1718 }
XinZhangMS 0:f7f1f0d76dd6 1719
XinZhangMS 0:f7f1f0d76dd6 1720 return result;
XinZhangMS 0:f7f1f0d76dd6 1721 }
XinZhangMS 0:f7f1f0d76dd6 1722
XinZhangMS 0:f7f1f0d76dd6 1723 IOTHUB_DEVICE_CONFIGURATION_RESULT IoTHubDeviceConfiguration_ApplyConfigurationContentToDeviceOrModule(IOTHUB_SERVICE_CLIENT_DEVICE_CONFIGURATION_HANDLE serviceClientDeviceConfigurationHandle, const char* deviceOrModuleId, const IOTHUB_DEVICE_CONFIGURATION_CONTENT* configurationContent)
XinZhangMS 0:f7f1f0d76dd6 1724 {
XinZhangMS 0:f7f1f0d76dd6 1725 IOTHUB_DEVICE_CONFIGURATION_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1726
XinZhangMS 0:f7f1f0d76dd6 1727 /*Codes_SRS_IOTHUBDEVICECONFIGURATION_38_052: [ IoTHubDeviceConfiguration_ApplyConfigurationContentToDeviceOrModule shall verify the input parameters and if any of them are NULL then return IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG ]*/
XinZhangMS 0:f7f1f0d76dd6 1728 if ((serviceClientDeviceConfigurationHandle == NULL) || (deviceOrModuleId == NULL) || (configurationContent == NULL))
XinZhangMS 0:f7f1f0d76dd6 1729 {
XinZhangMS 0:f7f1f0d76dd6 1730 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1731 result = IOTHUB_DEVICE_CONFIGURATION_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1732 }
XinZhangMS 0:f7f1f0d76dd6 1733 else
XinZhangMS 0:f7f1f0d76dd6 1734 {
XinZhangMS 0:f7f1f0d76dd6 1735 BUFFER_HANDLE configurationJsonBuffer;
XinZhangMS 0:f7f1f0d76dd6 1736
XinZhangMS 0:f7f1f0d76dd6 1737 JSON_Value* root_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 1738 JSON_Object* root_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 1739 JSON_Value* configurationContentJson;
XinZhangMS 0:f7f1f0d76dd6 1740
XinZhangMS 0:f7f1f0d76dd6 1741 if ((configurationContent->deviceContent == NULL) && ((configurationContent->modulesContent) == NULL))
XinZhangMS 0:f7f1f0d76dd6 1742 {
XinZhangMS 0:f7f1f0d76dd6 1743 LogError("deviceContent and modulesContent both cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1744 configurationJsonBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1745 }
XinZhangMS 0:f7f1f0d76dd6 1746 else if ((root_value = json_value_init_object()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1747 {
XinZhangMS 0:f7f1f0d76dd6 1748 LogError("json_value_init_object failed");
XinZhangMS 0:f7f1f0d76dd6 1749 configurationJsonBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1750 }
XinZhangMS 0:f7f1f0d76dd6 1751 else if ((root_object = json_value_get_object(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1752 {
XinZhangMS 0:f7f1f0d76dd6 1753 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 1754 configurationJsonBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1755 }
XinZhangMS 0:f7f1f0d76dd6 1756 else if ((((configurationContentJson = createConfigurationContentPayload(configurationContent)) != NULL) && ((json_object_set_value(root_object, CONFIGURATION_JSON_KEY_CONTENT, configurationContentJson)) != JSONSuccess)))
XinZhangMS 0:f7f1f0d76dd6 1757 {
XinZhangMS 0:f7f1f0d76dd6 1758 LogError("json_object_set_string failed for configurationContentJson");
XinZhangMS 0:f7f1f0d76dd6 1759 configurationJsonBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1760 }
XinZhangMS 0:f7f1f0d76dd6 1761 else
XinZhangMS 0:f7f1f0d76dd6 1762 {
XinZhangMS 0:f7f1f0d76dd6 1763 char* serialized_string;
XinZhangMS 0:f7f1f0d76dd6 1764 if ((serialized_string = json_serialize_to_string(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1765 {
XinZhangMS 0:f7f1f0d76dd6 1766 LogError("json_serialize_to_string failed");
XinZhangMS 0:f7f1f0d76dd6 1767 configurationJsonBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1768 }
XinZhangMS 0:f7f1f0d76dd6 1769 else
XinZhangMS 0:f7f1f0d76dd6 1770 {
XinZhangMS 0:f7f1f0d76dd6 1771 if ((configurationJsonBuffer = BUFFER_create((const unsigned char*)serialized_string, strlen(serialized_string))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1772 {
XinZhangMS 0:f7f1f0d76dd6 1773 LogError("Buffer_Create failed");
XinZhangMS 0:f7f1f0d76dd6 1774 }
XinZhangMS 0:f7f1f0d76dd6 1775 json_free_serialized_string(serialized_string);
XinZhangMS 0:f7f1f0d76dd6 1776 }
XinZhangMS 0:f7f1f0d76dd6 1777 }
XinZhangMS 0:f7f1f0d76dd6 1778
XinZhangMS 0:f7f1f0d76dd6 1779 json_object_clear(root_object);
XinZhangMS 0:f7f1f0d76dd6 1780
XinZhangMS 0:f7f1f0d76dd6 1781 if (root_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 1782 json_value_free(root_value);
XinZhangMS 0:f7f1f0d76dd6 1783
XinZhangMS 0:f7f1f0d76dd6 1784 /*SRS_IOTHUBDEVICECONFIGURATION_38_053: [ IoTHubDeviceConfiguration_ApplyConfigurationContentToDeviceOrModule shall create HTTP POST request URL using the given deviceOrModuleId using the following format : url/devices/[deviceOrModuleId]?api-version ] */
XinZhangMS 0:f7f1f0d76dd6 1785 /*SRS_IOTHUBDEVICECONFIGURATION_38_054: [ IoTHubDeviceConfiguration_ApplyConfigurationContentToDeviceOrModule shall add the following headers to the created HTTP POST request : authorization=sasToken,Request-Id=<generatedGuid>,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1786 /*SRS_IOTHUBDEVICECONFIGURATION_38_055: [ IoTHubDeviceConfiguration_ApplyConfigurationContentToDeviceOrModule shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1787 /*SRS_IOTHUBDEVICECONFIGURATION_38_056: [ IoTHubDeviceConfiguration_ApplyConfigurationContentToDeviceOrModule shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1788 /*SRS_IOTHUBDEVICECONFIGURATION_38_057: [ IoTHubDeviceConfiguration_ApplyConfigurationContentToDeviceOrModule shall execute the HTTP POST request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1789 /*SRS_IOTHUBDEVICECONFIGURATION_38_058: [ IoTHubDeviceConfiguration_ApplyConfigurationContentToDeviceOrModule shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_DEVICE_CONFIGURATION_HTTP_STATUS_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1790 /*SRS_IOTHUBDEVICECONFIGURATION_38_059: [ IoTHubDeviceConfiguration_ApplyConfigurationContentToDeviceOrModule shall verify the received HTTP status code and if it is equal to 200 or 204 then return IOTHUB_DEVICE_CONFIGURATION_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1791 result = sendHttpRequestDeviceConfiguration(serviceClientDeviceConfigurationHandle, IOTHUB_DEVICECONFIGURATION_REQUEST_APPLY_CONFIGURATION_CONTENT, deviceOrModuleId, configurationJsonBuffer, (size_t)0, NULL);
XinZhangMS 0:f7f1f0d76dd6 1792 }
XinZhangMS 0:f7f1f0d76dd6 1793
XinZhangMS 0:f7f1f0d76dd6 1794 return result;
XinZhangMS 0:f7f1f0d76dd6 1795 }