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/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/crt_abstractions.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/string_tokenizer.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_c_shared_utility/singlylinkedlist.h"
XinZhangMS 0:f7f1f0d76dd6 10 #include "azure_c_shared_utility/buffer_.h"
XinZhangMS 0:f7f1f0d76dd6 11 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 12 #include "azure_c_shared_utility/httpapiex.h"
XinZhangMS 0:f7f1f0d76dd6 13 #include "azure_c_shared_utility/httpapiexsas.h"
XinZhangMS 0:f7f1f0d76dd6 14 #include "azure_c_shared_utility/connection_string_parser.h"
XinZhangMS 0:f7f1f0d76dd6 15
XinZhangMS 0:f7f1f0d76dd6 16 #include "parson.h"
XinZhangMS 0:f7f1f0d76dd6 17 #include "iothub_registrymanager.h"
XinZhangMS 0:f7f1f0d76dd6 18 #include "iothub_sc_version.h"
XinZhangMS 0:f7f1f0d76dd6 19
XinZhangMS 0:f7f1f0d76dd6 20 #define IOTHUB_DEVICE_EX_VERSION_LATEST IOTHUB_DEVICE_EX_VERSION_1
XinZhangMS 0:f7f1f0d76dd6 21 #define IOTHUB_REGISTRY_DEVICE_CREATE_EX_VERSION_LATEST IOTHUB_REGISTRY_DEVICE_CREATE_EX_VERSION_1
XinZhangMS 0:f7f1f0d76dd6 22 #define IOTHUB_REGISTRY_DEVICE_UPDATE_EX_VERSION_LATEST IOTHUB_REGISTRY_DEVICE_CREATE_EX_VERSION_1
XinZhangMS 0:f7f1f0d76dd6 23 #define IOTHUB_MODULE_VERSION_LATEST IOTHUB_MODULE_VERSION_1
XinZhangMS 0:f7f1f0d76dd6 24 #define IOTHUB_REGISTRY_MODULE_CREATE_VERSION_LATEST IOTHUB_REGISTRY_MODULE_CREATE_VERSION_1
XinZhangMS 0:f7f1f0d76dd6 25 #define IOTHUB_REGISTRY_MODULE_UPDATE_VERSION_LATEST IOTHUB_REGISTRY_MODULE_UPDATE_VERSION_1
XinZhangMS 0:f7f1f0d76dd6 26
XinZhangMS 0:f7f1f0d76dd6 27
XinZhangMS 0:f7f1f0d76dd6 28 #define IOTHUB_REQUEST_MODE_VALUES \
XinZhangMS 0:f7f1f0d76dd6 29 IOTHUB_REQUEST_CREATE, \
XinZhangMS 0:f7f1f0d76dd6 30 IOTHUB_REQUEST_GET, \
XinZhangMS 0:f7f1f0d76dd6 31 IOTHUB_REQUEST_UPDATE, \
XinZhangMS 0:f7f1f0d76dd6 32 IOTHUB_REQUEST_DELETE, \
XinZhangMS 0:f7f1f0d76dd6 33 IOTHUB_REQUEST_GET_DEVICE_LIST, \
XinZhangMS 0:f7f1f0d76dd6 34 IOTHUB_REQUEST_GET_STATISTICS \
XinZhangMS 0:f7f1f0d76dd6 35
XinZhangMS 0:f7f1f0d76dd6 36 DEFINE_ENUM(IOTHUB_REQUEST_MODE, IOTHUB_REQUEST_MODE_VALUES);
XinZhangMS 0:f7f1f0d76dd6 37
XinZhangMS 0:f7f1f0d76dd6 38 DEFINE_ENUM_STRINGS(IOTHUB_REGISTRYMANAGER_RESULT, IOTHUB_REGISTRYMANAGER_RESULT_VALUES);
XinZhangMS 0:f7f1f0d76dd6 39 DEFINE_ENUM_STRINGS(IOTHUB_REGISTRYMANAGER_AUTH_METHOD, IOTHUB_REGISTRYMANAGER_AUTH_METHOD_VALUES);
XinZhangMS 0:f7f1f0d76dd6 40
XinZhangMS 0:f7f1f0d76dd6 41 #define HTTP_HEADER_KEY_AUTHORIZATION "Authorization"
XinZhangMS 0:f7f1f0d76dd6 42 #define HTTP_HEADER_VAL_AUTHORIZATION " "
XinZhangMS 0:f7f1f0d76dd6 43 #define HTTP_HEADER_KEY_REQUEST_ID "Request-Id"
XinZhangMS 0:f7f1f0d76dd6 44 #define HTTP_HEADER_VAL_REQUEST_ID "1001"
XinZhangMS 0:f7f1f0d76dd6 45 #define HTTP_HEADER_KEY_USER_AGENT "User-Agent"
XinZhangMS 0:f7f1f0d76dd6 46 #define HTTP_HEADER_VAL_USER_AGENT IOTHUB_SERVICE_CLIENT_TYPE_PREFIX IOTHUB_SERVICE_CLIENT_BACKSLASH IOTHUB_SERVICE_CLIENT_VERSION
XinZhangMS 0:f7f1f0d76dd6 47 #define HTTP_HEADER_KEY_ACCEPT "Accept"
XinZhangMS 0:f7f1f0d76dd6 48 #define HTTP_HEADER_VAL_ACCEPT "application/json"
XinZhangMS 0:f7f1f0d76dd6 49 #define HTTP_HEADER_KEY_CONTENT_TYPE "Content-Type"
XinZhangMS 0:f7f1f0d76dd6 50 #define HTTP_HEADER_VAL_CONTENT_TYPE "application/json; charset=utf-8"
XinZhangMS 0:f7f1f0d76dd6 51 #define HTTP_HEADER_KEY_IFMATCH "If-Match"
XinZhangMS 0:f7f1f0d76dd6 52 #define HTTP_HEADER_VAL_IFMATCH "*"
XinZhangMS 0:f7f1f0d76dd6 53
XinZhangMS 0:f7f1f0d76dd6 54 static size_t IOTHUB_DEVICES_MAX_REQUEST = 1000;
XinZhangMS 0:f7f1f0d76dd6 55
XinZhangMS 0:f7f1f0d76dd6 56 static const char* DEVICE_JSON_KEY_DEVICE_NAME = "deviceId";
XinZhangMS 0:f7f1f0d76dd6 57 static const char* DEVICE_JSON_KEY_MODULE_NAME = "moduleId";
XinZhangMS 0:f7f1f0d76dd6 58 static const char* DEVICE_JSON_KEY_DEVICE_AUTH_TYPE = "authentication.type";
XinZhangMS 0:f7f1f0d76dd6 59 static const char* DEVICE_JSON_KEY_DEVICE_AUTH_SAS = "sas";
XinZhangMS 0:f7f1f0d76dd6 60 static const char* DEVICE_JSON_KEY_DEVICE_AUTH_SELF_SIGNED = "selfSigned";
XinZhangMS 0:f7f1f0d76dd6 61 static const char* DEVICE_JSON_KEY_DEVICE_AUTH_CERTIFICATE_AUTHORITY = "certificateAuthority";
XinZhangMS 0:f7f1f0d76dd6 62 static const char* DEVICE_JSON_KEY_DEVICE_AUTH_NONE = "none";
XinZhangMS 0:f7f1f0d76dd6 63 static const char* DEVICE_JSON_KEY_DEVICE_PRIMARY_KEY = "authentication.symmetricKey.primaryKey";
XinZhangMS 0:f7f1f0d76dd6 64 static const char* DEVICE_JSON_KEY_DEVICE_SECONDARY_KEY = "authentication.symmetricKey.secondaryKey";
XinZhangMS 0:f7f1f0d76dd6 65 static const char* DEVICE_JSON_KEY_DEVICE_PRIMARY_THUMBPRINT = "authentication.x509Thumbprint.primaryThumbprint";
XinZhangMS 0:f7f1f0d76dd6 66 static const char* DEVICE_JSON_KEY_DEVICE_SECONDARY_THUMBPRINT = "authentication.x509Thumbprint.secondaryThumbprint";
XinZhangMS 0:f7f1f0d76dd6 67 static const char* DEVICE_JSON_KEY_CAPABILITIES_IOTEDGE = "capabilities.iotEdge";
XinZhangMS 0:f7f1f0d76dd6 68
XinZhangMS 0:f7f1f0d76dd6 69 static const char* DEVICE_JSON_KEY_DEVICE_GENERATION_ID = "generationId";
XinZhangMS 0:f7f1f0d76dd6 70 static const char* DEVICE_JSON_KEY_DEVICE_ETAG = "etag";
XinZhangMS 0:f7f1f0d76dd6 71
XinZhangMS 0:f7f1f0d76dd6 72 static const char* DEVICE_JSON_KEY_DEVICE_CONNECTIONSTATE = "connectionState";
XinZhangMS 0:f7f1f0d76dd6 73 static const char* DEVICE_JSON_KEY_DEVICE_CONNECTIONSTATEUPDATEDTIME = "connectionStateUpdatedTime";
XinZhangMS 0:f7f1f0d76dd6 74
XinZhangMS 0:f7f1f0d76dd6 75 static const char* DEVICE_JSON_KEY_DEVICE_STATUS = "status";
XinZhangMS 0:f7f1f0d76dd6 76 static const char* DEVICE_JSON_KEY_DEVICE_STATUSREASON = "statusReason";
XinZhangMS 0:f7f1f0d76dd6 77 static const char* DEVICE_JSON_KEY_DEVICE_STATUSUPDATEDTIME = "statusUpdatedTime";
XinZhangMS 0:f7f1f0d76dd6 78
XinZhangMS 0:f7f1f0d76dd6 79 static const char* DEVICE_JSON_KEY_DEVICE_LASTACTIVITYTIME = "lastActivityTime";
XinZhangMS 0:f7f1f0d76dd6 80 static const char* DEVICE_JSON_KEY_DEVICE_CLOUDTODEVICEMESSAGECOUNT = "cloudToDeviceMessageCount";
XinZhangMS 0:f7f1f0d76dd6 81
XinZhangMS 0:f7f1f0d76dd6 82 static const char* DEVICE_JSON_KEY_DEVICE_ISMANAGED = "isManaged";
XinZhangMS 0:f7f1f0d76dd6 83 static const char* DEVICE_JSON_KEY_DEVICE_CONFIGURATION = "configuration";
XinZhangMS 0:f7f1f0d76dd6 84 static const char* DEVICE_JSON_KEY_DEVICE_DEVICEROPERTIES = "deviceProperties";
XinZhangMS 0:f7f1f0d76dd6 85 static const char* DEVICE_JSON_KEY_DEVICE_SERVICEPROPERTIES = "serviceProperties";
XinZhangMS 0:f7f1f0d76dd6 86 static const char* DEVICE_JSON_KEY_MANAGED_BY = "managedBy";
XinZhangMS 0:f7f1f0d76dd6 87
XinZhangMS 0:f7f1f0d76dd6 88 static const char* DEVICE_JSON_KEY_TOTAL_DEVICECOUNT = "totalDeviceCount";
XinZhangMS 0:f7f1f0d76dd6 89 static const char* DEVICE_JSON_KEY_ENABLED_DEVICECCOUNT = "enabledDeviceCount";
XinZhangMS 0:f7f1f0d76dd6 90 static const char* DEVICE_JSON_KEY_DISABLED_DEVICECOUNT = "disabledDeviceCount";
XinZhangMS 0:f7f1f0d76dd6 91
XinZhangMS 0:f7f1f0d76dd6 92 static const char* DEVICE_JSON_DEFAULT_VALUE_ENABLED = "enabled";
XinZhangMS 0:f7f1f0d76dd6 93 static const char* DEVICE_JSON_DEFAULT_VALUE_DISABLED = "disabled";
XinZhangMS 0:f7f1f0d76dd6 94 static const char* DEVICE_JSON_DEFAULT_VALUE_CONNECTED = "Connected";
XinZhangMS 0:f7f1f0d76dd6 95 static const char* DEVICE_JSON_DEFAULT_VALUE_TRUE = "true";
XinZhangMS 0:f7f1f0d76dd6 96
XinZhangMS 0:f7f1f0d76dd6 97 static const char* URL_API_VERSION = "api-version=2017-11-08-preview";
XinZhangMS 0:f7f1f0d76dd6 98
XinZhangMS 0:f7f1f0d76dd6 99 static const char* RELATIVE_PATH_FMT_CRUD = "/devices/%s?%s";
XinZhangMS 0:f7f1f0d76dd6 100 static const char* RELATIVE_PATH_MODULE_FMT_CRUD = "/devices/%s/modules/%s?%s";
XinZhangMS 0:f7f1f0d76dd6 101 static const char* RELATIVE_PATH_FMT_LIST = "/devices/?top=%s&%s";
XinZhangMS 0:f7f1f0d76dd6 102 static const char* RELATIVE_PATH_FMT_STAT = "/statistics/devices?%s";
XinZhangMS 0:f7f1f0d76dd6 103 static const char* RELATIVE_PATH_FMT_MODULE_LIST = "/devices/%s/modules?%s";
XinZhangMS 0:f7f1f0d76dd6 104
XinZhangMS 0:f7f1f0d76dd6 105 typedef enum {IOTHUB_REGISTRYMANAGER_MODEL_TYPE_DEVICE, IOTHUB_REGISTRYMANAGER_MODEL_TYPE_MODULE} IOTHUB_REGISTRYMANAGER_MODEL_TYPE;
XinZhangMS 0:f7f1f0d76dd6 106
XinZhangMS 0:f7f1f0d76dd6 107 typedef struct IOTHUB_DEVICE_OR_MODULE_TAG
XinZhangMS 0:f7f1f0d76dd6 108 {
XinZhangMS 0:f7f1f0d76dd6 109 IOTHUB_REGISTRYMANAGER_MODEL_TYPE type;
XinZhangMS 0:f7f1f0d76dd6 110
XinZhangMS 0:f7f1f0d76dd6 111 const char* deviceId;
XinZhangMS 0:f7f1f0d76dd6 112 const char* primaryKey;
XinZhangMS 0:f7f1f0d76dd6 113 const char* secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 114 const char* generationId;
XinZhangMS 0:f7f1f0d76dd6 115 const char* eTag;
XinZhangMS 0:f7f1f0d76dd6 116 IOTHUB_DEVICE_CONNECTION_STATE connectionState;
XinZhangMS 0:f7f1f0d76dd6 117 const char* connectionStateUpdatedTime;
XinZhangMS 0:f7f1f0d76dd6 118 IOTHUB_DEVICE_STATUS status;
XinZhangMS 0:f7f1f0d76dd6 119 const char* statusReason;
XinZhangMS 0:f7f1f0d76dd6 120 const char* statusUpdatedTime;
XinZhangMS 0:f7f1f0d76dd6 121 const char* lastActivityTime;
XinZhangMS 0:f7f1f0d76dd6 122 size_t cloudToDeviceMessageCount;
XinZhangMS 0:f7f1f0d76dd6 123
XinZhangMS 0:f7f1f0d76dd6 124 bool isManaged;
XinZhangMS 0:f7f1f0d76dd6 125 const char* configuration;
XinZhangMS 0:f7f1f0d76dd6 126 const char* deviceProperties;
XinZhangMS 0:f7f1f0d76dd6 127 const char* serviceProperties;
XinZhangMS 0:f7f1f0d76dd6 128 IOTHUB_REGISTRYMANAGER_AUTH_METHOD authMethod;
XinZhangMS 0:f7f1f0d76dd6 129
XinZhangMS 0:f7f1f0d76dd6 130 //Device exclusive fields
XinZhangMS 0:f7f1f0d76dd6 131 bool iotEdge_capable;
XinZhangMS 0:f7f1f0d76dd6 132
XinZhangMS 0:f7f1f0d76dd6 133 //Module exclusive fields
XinZhangMS 0:f7f1f0d76dd6 134 const char* moduleId;
XinZhangMS 0:f7f1f0d76dd6 135 const char* managedBy;
XinZhangMS 0:f7f1f0d76dd6 136 } IOTHUB_DEVICE_OR_MODULE;
XinZhangMS 0:f7f1f0d76dd6 137
XinZhangMS 0:f7f1f0d76dd6 138 typedef struct IOTHUB_REGISTRY_DEVICE_OR_MODULE_CREATE_TAG
XinZhangMS 0:f7f1f0d76dd6 139 {
XinZhangMS 0:f7f1f0d76dd6 140 IOTHUB_REGISTRYMANAGER_MODEL_TYPE type;
XinZhangMS 0:f7f1f0d76dd6 141 const char* deviceId;
XinZhangMS 0:f7f1f0d76dd6 142 const char* primaryKey;
XinZhangMS 0:f7f1f0d76dd6 143 const char* secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 144 IOTHUB_REGISTRYMANAGER_AUTH_METHOD authMethod;
XinZhangMS 0:f7f1f0d76dd6 145 //Device exclusive fields
XinZhangMS 0:f7f1f0d76dd6 146 bool iotEdge_capable;
XinZhangMS 0:f7f1f0d76dd6 147 //Module exclusive fields
XinZhangMS 0:f7f1f0d76dd6 148 const char* moduleId;
XinZhangMS 0:f7f1f0d76dd6 149 const char* managedBy;
XinZhangMS 0:f7f1f0d76dd6 150 } IOTHUB_REGISTRY_DEVICE_OR_MODULE_CREATE;
XinZhangMS 0:f7f1f0d76dd6 151
XinZhangMS 0:f7f1f0d76dd6 152 typedef struct IOTHUB_REGISTRY_DEVICE_OR_MODULE_UPDATE_TAG
XinZhangMS 0:f7f1f0d76dd6 153 {
XinZhangMS 0:f7f1f0d76dd6 154 IOTHUB_REGISTRYMANAGER_MODEL_TYPE type;
XinZhangMS 0:f7f1f0d76dd6 155 const char* deviceId;
XinZhangMS 0:f7f1f0d76dd6 156 const char* primaryKey;
XinZhangMS 0:f7f1f0d76dd6 157 const char* secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 158 IOTHUB_DEVICE_STATUS status;
XinZhangMS 0:f7f1f0d76dd6 159 IOTHUB_REGISTRYMANAGER_AUTH_METHOD authMethod;
XinZhangMS 0:f7f1f0d76dd6 160 //Device exclusive fields
XinZhangMS 0:f7f1f0d76dd6 161 bool iotEdge_capable;
XinZhangMS 0:f7f1f0d76dd6 162 //Module exclusive fields
XinZhangMS 0:f7f1f0d76dd6 163 const char* moduleId;
XinZhangMS 0:f7f1f0d76dd6 164 const char* managedBy;
XinZhangMS 0:f7f1f0d76dd6 165 } IOTHUB_REGISTRY_DEVICE_OR_MODULE_UPDATE;
XinZhangMS 0:f7f1f0d76dd6 166
XinZhangMS 0:f7f1f0d76dd6 167 static void initializeDeviceOrModuleInfoMembers(IOTHUB_DEVICE_OR_MODULE* deviceOrModuleInfo)
XinZhangMS 0:f7f1f0d76dd6 168 {
XinZhangMS 0:f7f1f0d76dd6 169 if (NULL != deviceOrModuleInfo)
XinZhangMS 0:f7f1f0d76dd6 170 {
XinZhangMS 0:f7f1f0d76dd6 171 memset(deviceOrModuleInfo, 0, sizeof(IOTHUB_DEVICE_OR_MODULE));
XinZhangMS 0:f7f1f0d76dd6 172 deviceOrModuleInfo->connectionState = IOTHUB_DEVICE_CONNECTION_STATE_DISCONNECTED;
XinZhangMS 0:f7f1f0d76dd6 173 deviceOrModuleInfo->status = IOTHUB_DEVICE_STATUS_DISABLED;
XinZhangMS 0:f7f1f0d76dd6 174 }
XinZhangMS 0:f7f1f0d76dd6 175 }
XinZhangMS 0:f7f1f0d76dd6 176
XinZhangMS 0:f7f1f0d76dd6 177 void IoTHubRegistryManager_FreeDeviceExMembers(IOTHUB_DEVICE_EX* deviceInfo)
XinZhangMS 0:f7f1f0d76dd6 178 {
XinZhangMS 0:f7f1f0d76dd6 179 free((void*)deviceInfo->deviceId);
XinZhangMS 0:f7f1f0d76dd6 180 free((void*)deviceInfo->primaryKey);
XinZhangMS 0:f7f1f0d76dd6 181 free((void*)deviceInfo->secondaryKey);
XinZhangMS 0:f7f1f0d76dd6 182 free((void*)deviceInfo->generationId);
XinZhangMS 0:f7f1f0d76dd6 183 free((void*)deviceInfo->eTag);
XinZhangMS 0:f7f1f0d76dd6 184 free((void*)deviceInfo->connectionStateUpdatedTime);
XinZhangMS 0:f7f1f0d76dd6 185 free((void*)deviceInfo->statusReason);
XinZhangMS 0:f7f1f0d76dd6 186 free((void*)deviceInfo->statusUpdatedTime);
XinZhangMS 0:f7f1f0d76dd6 187 free((void*)deviceInfo->lastActivityTime);
XinZhangMS 0:f7f1f0d76dd6 188 free((void*)deviceInfo->configuration);
XinZhangMS 0:f7f1f0d76dd6 189 free((void*)deviceInfo->deviceProperties);
XinZhangMS 0:f7f1f0d76dd6 190 free((void*)deviceInfo->serviceProperties);
XinZhangMS 0:f7f1f0d76dd6 191 memset(deviceInfo, 0, sizeof(*deviceInfo));
XinZhangMS 0:f7f1f0d76dd6 192 }
XinZhangMS 0:f7f1f0d76dd6 193
XinZhangMS 0:f7f1f0d76dd6 194 void IoTHubRegistryManager_FreeModuleMembers(IOTHUB_MODULE* moduleInfo)
XinZhangMS 0:f7f1f0d76dd6 195 {
XinZhangMS 0:f7f1f0d76dd6 196 free((void*)moduleInfo->deviceId);
XinZhangMS 0:f7f1f0d76dd6 197 free((void*)moduleInfo->primaryKey);
XinZhangMS 0:f7f1f0d76dd6 198 free((void*)moduleInfo->secondaryKey);
XinZhangMS 0:f7f1f0d76dd6 199 free((void*)moduleInfo->generationId);
XinZhangMS 0:f7f1f0d76dd6 200 free((void*)moduleInfo->eTag);
XinZhangMS 0:f7f1f0d76dd6 201 free((void*)moduleInfo->connectionStateUpdatedTime);
XinZhangMS 0:f7f1f0d76dd6 202 free((void*)moduleInfo->statusReason);
XinZhangMS 0:f7f1f0d76dd6 203 free((void*)moduleInfo->statusUpdatedTime);
XinZhangMS 0:f7f1f0d76dd6 204 free((void*)moduleInfo->lastActivityTime);
XinZhangMS 0:f7f1f0d76dd6 205 free((void*)moduleInfo->configuration);
XinZhangMS 0:f7f1f0d76dd6 206 free((void*)moduleInfo->deviceProperties);
XinZhangMS 0:f7f1f0d76dd6 207 free((void*)moduleInfo->serviceProperties);
XinZhangMS 0:f7f1f0d76dd6 208 free((void*)moduleInfo->moduleId);
XinZhangMS 0:f7f1f0d76dd6 209 free((void*)moduleInfo->managedBy);
XinZhangMS 0:f7f1f0d76dd6 210 memset(moduleInfo, 0, sizeof(*moduleInfo));
XinZhangMS 0:f7f1f0d76dd6 211 }
XinZhangMS 0:f7f1f0d76dd6 212
XinZhangMS 0:f7f1f0d76dd6 213 // Frees memory allocated building up deviceInfo, but *NOT* deviceInfo itself as we don't own this
XinZhangMS 0:f7f1f0d76dd6 214 static void free_deviceOrModule_members(IOTHUB_DEVICE_OR_MODULE* deviceInfo)
XinZhangMS 0:f7f1f0d76dd6 215 {
XinZhangMS 0:f7f1f0d76dd6 216 free((void*)deviceInfo->deviceId);
XinZhangMS 0:f7f1f0d76dd6 217 free((void*)deviceInfo->primaryKey);
XinZhangMS 0:f7f1f0d76dd6 218 free((void*)deviceInfo->secondaryKey);
XinZhangMS 0:f7f1f0d76dd6 219 free((void*)deviceInfo->generationId);
XinZhangMS 0:f7f1f0d76dd6 220 free((void*)deviceInfo->eTag);
XinZhangMS 0:f7f1f0d76dd6 221 free((void*)deviceInfo->connectionStateUpdatedTime);
XinZhangMS 0:f7f1f0d76dd6 222 free((void*)deviceInfo->statusReason);
XinZhangMS 0:f7f1f0d76dd6 223 free((void*)deviceInfo->statusUpdatedTime);
XinZhangMS 0:f7f1f0d76dd6 224 free((void*)deviceInfo->lastActivityTime);
XinZhangMS 0:f7f1f0d76dd6 225 free((void*)deviceInfo->configuration);
XinZhangMS 0:f7f1f0d76dd6 226 free((void*)deviceInfo->deviceProperties);
XinZhangMS 0:f7f1f0d76dd6 227 free((void*)deviceInfo->serviceProperties);
XinZhangMS 0:f7f1f0d76dd6 228 free((void*)deviceInfo->moduleId);
XinZhangMS 0:f7f1f0d76dd6 229 free((void*)deviceInfo->managedBy);
XinZhangMS 0:f7f1f0d76dd6 230 memset(deviceInfo, 0, sizeof(*deviceInfo));
XinZhangMS 0:f7f1f0d76dd6 231 }
XinZhangMS 0:f7f1f0d76dd6 232
XinZhangMS 0:f7f1f0d76dd6 233 static void free_device_members(IOTHUB_DEVICE* deviceInfo)
XinZhangMS 0:f7f1f0d76dd6 234 {
XinZhangMS 0:f7f1f0d76dd6 235 free((void*)deviceInfo->deviceId);
XinZhangMS 0:f7f1f0d76dd6 236 free((void*)deviceInfo->primaryKey);
XinZhangMS 0:f7f1f0d76dd6 237 free((void*)deviceInfo->secondaryKey);
XinZhangMS 0:f7f1f0d76dd6 238 free((void*)deviceInfo->generationId);
XinZhangMS 0:f7f1f0d76dd6 239 free((void*)deviceInfo->eTag);
XinZhangMS 0:f7f1f0d76dd6 240 free((void*)deviceInfo->connectionStateUpdatedTime);
XinZhangMS 0:f7f1f0d76dd6 241 free((void*)deviceInfo->statusReason);
XinZhangMS 0:f7f1f0d76dd6 242 free((void*)deviceInfo->statusUpdatedTime);
XinZhangMS 0:f7f1f0d76dd6 243 free((void*)deviceInfo->lastActivityTime);
XinZhangMS 0:f7f1f0d76dd6 244 free((void*)deviceInfo->configuration);
XinZhangMS 0:f7f1f0d76dd6 245 free((void*)deviceInfo->deviceProperties);
XinZhangMS 0:f7f1f0d76dd6 246 free((void*)deviceInfo->serviceProperties);
XinZhangMS 0:f7f1f0d76dd6 247 memset(deviceInfo, 0, sizeof(*deviceInfo));
XinZhangMS 0:f7f1f0d76dd6 248 }
XinZhangMS 0:f7f1f0d76dd6 249
XinZhangMS 0:f7f1f0d76dd6 250 static void move_deviceOrModule_members_to_device(IOTHUB_DEVICE_OR_MODULE* deviceOrModule, IOTHUB_DEVICE* device)
XinZhangMS 0:f7f1f0d76dd6 251 {
XinZhangMS 0:f7f1f0d76dd6 252 if ((deviceOrModule != NULL) && (device != NULL))
XinZhangMS 0:f7f1f0d76dd6 253 {
XinZhangMS 0:f7f1f0d76dd6 254 device->deviceId = deviceOrModule->deviceId;
XinZhangMS 0:f7f1f0d76dd6 255 device->primaryKey = deviceOrModule->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 256 device->secondaryKey = deviceOrModule->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 257 device->generationId = deviceOrModule->generationId;
XinZhangMS 0:f7f1f0d76dd6 258 device->eTag = deviceOrModule->eTag;
XinZhangMS 0:f7f1f0d76dd6 259 device->connectionState = deviceOrModule->connectionState;
XinZhangMS 0:f7f1f0d76dd6 260 device->connectionStateUpdatedTime = deviceOrModule->connectionStateUpdatedTime;
XinZhangMS 0:f7f1f0d76dd6 261 device->status = deviceOrModule->status;
XinZhangMS 0:f7f1f0d76dd6 262 device->statusReason = deviceOrModule->statusReason;
XinZhangMS 0:f7f1f0d76dd6 263 device->statusUpdatedTime = deviceOrModule->statusUpdatedTime;
XinZhangMS 0:f7f1f0d76dd6 264 device->lastActivityTime = deviceOrModule->lastActivityTime;
XinZhangMS 0:f7f1f0d76dd6 265 device->cloudToDeviceMessageCount = deviceOrModule->cloudToDeviceMessageCount;
XinZhangMS 0:f7f1f0d76dd6 266 device->isManaged = deviceOrModule->isManaged;
XinZhangMS 0:f7f1f0d76dd6 267 device->configuration = deviceOrModule->configuration;
XinZhangMS 0:f7f1f0d76dd6 268 device->deviceProperties = deviceOrModule->deviceProperties;
XinZhangMS 0:f7f1f0d76dd6 269 device->serviceProperties = deviceOrModule->serviceProperties;
XinZhangMS 0:f7f1f0d76dd6 270 device->authMethod = deviceOrModule->authMethod;
XinZhangMS 0:f7f1f0d76dd6 271 }
XinZhangMS 0:f7f1f0d76dd6 272 }
XinZhangMS 0:f7f1f0d76dd6 273
XinZhangMS 0:f7f1f0d76dd6 274 static void free_nonDevice_members_from_deviceOrModule(IOTHUB_DEVICE_OR_MODULE* deviceOrModule)
XinZhangMS 0:f7f1f0d76dd6 275 {
XinZhangMS 0:f7f1f0d76dd6 276 if (deviceOrModule != NULL)
XinZhangMS 0:f7f1f0d76dd6 277 {
XinZhangMS 0:f7f1f0d76dd6 278 //free module exclusive fields
XinZhangMS 0:f7f1f0d76dd6 279 free((void*)deviceOrModule->moduleId);
XinZhangMS 0:f7f1f0d76dd6 280 deviceOrModule->moduleId = NULL;
XinZhangMS 0:f7f1f0d76dd6 281 free((void*)deviceOrModule->managedBy);
XinZhangMS 0:f7f1f0d76dd6 282 deviceOrModule->managedBy = NULL;
XinZhangMS 0:f7f1f0d76dd6 283 //free device_ex exclusive fields (none currently require deallocation)
XinZhangMS 0:f7f1f0d76dd6 284 }
XinZhangMS 0:f7f1f0d76dd6 285 }
XinZhangMS 0:f7f1f0d76dd6 286
XinZhangMS 0:f7f1f0d76dd6 287 static void move_deviceOrModule_members_to_deviceEx(IOTHUB_DEVICE_OR_MODULE* deviceOrModule, IOTHUB_DEVICE_EX* device)
XinZhangMS 0:f7f1f0d76dd6 288 {
XinZhangMS 0:f7f1f0d76dd6 289 if ((deviceOrModule != NULL) && (device != NULL))
XinZhangMS 0:f7f1f0d76dd6 290 {
XinZhangMS 0:f7f1f0d76dd6 291 if (device->version >= IOTHUB_DEVICE_EX_VERSION_1)
XinZhangMS 0:f7f1f0d76dd6 292 {
XinZhangMS 0:f7f1f0d76dd6 293 device->deviceId = deviceOrModule->deviceId;
XinZhangMS 0:f7f1f0d76dd6 294 device->primaryKey = deviceOrModule->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 295 device->secondaryKey = deviceOrModule->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 296 device->generationId = deviceOrModule->generationId;
XinZhangMS 0:f7f1f0d76dd6 297 device->eTag = deviceOrModule->eTag;
XinZhangMS 0:f7f1f0d76dd6 298 device->connectionState = deviceOrModule->connectionState;
XinZhangMS 0:f7f1f0d76dd6 299 device->connectionStateUpdatedTime = deviceOrModule->connectionStateUpdatedTime;
XinZhangMS 0:f7f1f0d76dd6 300 device->status = deviceOrModule->status;
XinZhangMS 0:f7f1f0d76dd6 301 device->statusReason = deviceOrModule->statusReason;
XinZhangMS 0:f7f1f0d76dd6 302 device->statusUpdatedTime = deviceOrModule->statusUpdatedTime;
XinZhangMS 0:f7f1f0d76dd6 303 device->lastActivityTime = deviceOrModule->lastActivityTime;
XinZhangMS 0:f7f1f0d76dd6 304 device->cloudToDeviceMessageCount = deviceOrModule->cloudToDeviceMessageCount;
XinZhangMS 0:f7f1f0d76dd6 305 device->isManaged = deviceOrModule->isManaged;
XinZhangMS 0:f7f1f0d76dd6 306 device->configuration = deviceOrModule->configuration;
XinZhangMS 0:f7f1f0d76dd6 307 device->deviceProperties = deviceOrModule->deviceProperties;
XinZhangMS 0:f7f1f0d76dd6 308 device->serviceProperties = deviceOrModule->serviceProperties;
XinZhangMS 0:f7f1f0d76dd6 309 device->authMethod = deviceOrModule->authMethod;
XinZhangMS 0:f7f1f0d76dd6 310 device->iotEdge_capable = deviceOrModule->iotEdge_capable;
XinZhangMS 0:f7f1f0d76dd6 311 }
XinZhangMS 0:f7f1f0d76dd6 312 }
XinZhangMS 0:f7f1f0d76dd6 313 }
XinZhangMS 0:f7f1f0d76dd6 314
XinZhangMS 0:f7f1f0d76dd6 315 static void free_nonDeviceEx_members_from_deviceOrModule(IOTHUB_DEVICE_OR_MODULE* deviceOrModule)
XinZhangMS 0:f7f1f0d76dd6 316 {
XinZhangMS 0:f7f1f0d76dd6 317 if (deviceOrModule != NULL)
XinZhangMS 0:f7f1f0d76dd6 318 {
XinZhangMS 0:f7f1f0d76dd6 319 //free module exclusive fields
XinZhangMS 0:f7f1f0d76dd6 320 free((void*)deviceOrModule->moduleId);
XinZhangMS 0:f7f1f0d76dd6 321 deviceOrModule->moduleId = NULL;
XinZhangMS 0:f7f1f0d76dd6 322 free((void*)deviceOrModule->managedBy);
XinZhangMS 0:f7f1f0d76dd6 323 deviceOrModule->managedBy = NULL;
XinZhangMS 0:f7f1f0d76dd6 324 }
XinZhangMS 0:f7f1f0d76dd6 325 }
XinZhangMS 0:f7f1f0d76dd6 326
XinZhangMS 0:f7f1f0d76dd6 327 static void move_deviceOrModule_members_to_module(IOTHUB_DEVICE_OR_MODULE* deviceOrModule, IOTHUB_MODULE* module)
XinZhangMS 0:f7f1f0d76dd6 328 {
XinZhangMS 0:f7f1f0d76dd6 329 if ((deviceOrModule != NULL) && (module != NULL))
XinZhangMS 0:f7f1f0d76dd6 330 {
XinZhangMS 0:f7f1f0d76dd6 331 if (module->version >= IOTHUB_MODULE_VERSION_1)
XinZhangMS 0:f7f1f0d76dd6 332 {
XinZhangMS 0:f7f1f0d76dd6 333 module->deviceId = deviceOrModule->deviceId;
XinZhangMS 0:f7f1f0d76dd6 334 module->primaryKey = deviceOrModule->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 335 module->secondaryKey = deviceOrModule->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 336 module->generationId = deviceOrModule->generationId;
XinZhangMS 0:f7f1f0d76dd6 337 module->eTag = deviceOrModule->eTag;
XinZhangMS 0:f7f1f0d76dd6 338 module->connectionState = deviceOrModule->connectionState;
XinZhangMS 0:f7f1f0d76dd6 339 module->connectionStateUpdatedTime = deviceOrModule->connectionStateUpdatedTime;
XinZhangMS 0:f7f1f0d76dd6 340 module->status = deviceOrModule->status;
XinZhangMS 0:f7f1f0d76dd6 341 module->statusReason = deviceOrModule->statusReason;
XinZhangMS 0:f7f1f0d76dd6 342 module->statusUpdatedTime = deviceOrModule->statusUpdatedTime;
XinZhangMS 0:f7f1f0d76dd6 343 module->lastActivityTime = deviceOrModule->lastActivityTime;
XinZhangMS 0:f7f1f0d76dd6 344 module->cloudToDeviceMessageCount = deviceOrModule->cloudToDeviceMessageCount;
XinZhangMS 0:f7f1f0d76dd6 345 module->isManaged = deviceOrModule->isManaged;
XinZhangMS 0:f7f1f0d76dd6 346 module->configuration = deviceOrModule->configuration;
XinZhangMS 0:f7f1f0d76dd6 347 module->deviceProperties = deviceOrModule->deviceProperties;
XinZhangMS 0:f7f1f0d76dd6 348 module->serviceProperties = deviceOrModule->serviceProperties;
XinZhangMS 0:f7f1f0d76dd6 349 module->authMethod = deviceOrModule->authMethod;
XinZhangMS 0:f7f1f0d76dd6 350 module->moduleId = deviceOrModule->moduleId;
XinZhangMS 0:f7f1f0d76dd6 351 module->managedBy = deviceOrModule->managedBy;
XinZhangMS 0:f7f1f0d76dd6 352 }
XinZhangMS 0:f7f1f0d76dd6 353 }
XinZhangMS 0:f7f1f0d76dd6 354 }
XinZhangMS 0:f7f1f0d76dd6 355
XinZhangMS 0:f7f1f0d76dd6 356 static bool isAuthTypeAllowed(IOTHUB_REGISTRYMANAGER_AUTH_METHOD authMethod)
XinZhangMS 0:f7f1f0d76dd6 357 {
XinZhangMS 0:f7f1f0d76dd6 358 bool result;
XinZhangMS 0:f7f1f0d76dd6 359 switch (authMethod)
XinZhangMS 0:f7f1f0d76dd6 360 {
XinZhangMS 0:f7f1f0d76dd6 361 case IOTHUB_REGISTRYMANAGER_AUTH_SPK:
XinZhangMS 0:f7f1f0d76dd6 362 case IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT:
XinZhangMS 0:f7f1f0d76dd6 363 case IOTHUB_REGISTRYMANAGER_AUTH_X509_CERTIFICATE_AUTHORITY:
XinZhangMS 0:f7f1f0d76dd6 364 case IOTHUB_REGISTRYMANAGER_AUTH_NONE:
XinZhangMS 0:f7f1f0d76dd6 365 result = true;
XinZhangMS 0:f7f1f0d76dd6 366 break;
XinZhangMS 0:f7f1f0d76dd6 367
XinZhangMS 0:f7f1f0d76dd6 368 default:
XinZhangMS 0:f7f1f0d76dd6 369 result = false;
XinZhangMS 0:f7f1f0d76dd6 370 break;
XinZhangMS 0:f7f1f0d76dd6 371 }
XinZhangMS 0:f7f1f0d76dd6 372
XinZhangMS 0:f7f1f0d76dd6 373 return result;
XinZhangMS 0:f7f1f0d76dd6 374 }
XinZhangMS 0:f7f1f0d76dd6 375
XinZhangMS 0:f7f1f0d76dd6 376 static int strHasNoWhitespace(const char* s)
XinZhangMS 0:f7f1f0d76dd6 377 {
XinZhangMS 0:f7f1f0d76dd6 378 while (*s)
XinZhangMS 0:f7f1f0d76dd6 379 {
XinZhangMS 0:f7f1f0d76dd6 380 if (isspace(*s) != 0)
XinZhangMS 0:f7f1f0d76dd6 381 return 1;
XinZhangMS 0:f7f1f0d76dd6 382 s++;
XinZhangMS 0:f7f1f0d76dd6 383 }
XinZhangMS 0:f7f1f0d76dd6 384 return 0;
XinZhangMS 0:f7f1f0d76dd6 385 }
XinZhangMS 0:f7f1f0d76dd6 386
XinZhangMS 0:f7f1f0d76dd6 387 static const char *getStatusStringForJson(IOTHUB_DEVICE_STATUS status)
XinZhangMS 0:f7f1f0d76dd6 388 {
XinZhangMS 0:f7f1f0d76dd6 389 const char *statusForJson;
XinZhangMS 0:f7f1f0d76dd6 390
XinZhangMS 0:f7f1f0d76dd6 391 if (IOTHUB_DEVICE_STATUS_DISABLED == status)
XinZhangMS 0:f7f1f0d76dd6 392 {
XinZhangMS 0:f7f1f0d76dd6 393 statusForJson = DEVICE_JSON_DEFAULT_VALUE_DISABLED;
XinZhangMS 0:f7f1f0d76dd6 394 }
XinZhangMS 0:f7f1f0d76dd6 395 else
XinZhangMS 0:f7f1f0d76dd6 396 {
XinZhangMS 0:f7f1f0d76dd6 397 statusForJson = DEVICE_JSON_DEFAULT_VALUE_ENABLED;
XinZhangMS 0:f7f1f0d76dd6 398 }
XinZhangMS 0:f7f1f0d76dd6 399
XinZhangMS 0:f7f1f0d76dd6 400 return statusForJson;
XinZhangMS 0:f7f1f0d76dd6 401 }
XinZhangMS 0:f7f1f0d76dd6 402
XinZhangMS 0:f7f1f0d76dd6 403 static const char *getAuthTypeStringForJson(IOTHUB_REGISTRYMANAGER_AUTH_METHOD authMethod)
XinZhangMS 0:f7f1f0d76dd6 404 {
XinZhangMS 0:f7f1f0d76dd6 405 const char *authTypeForJson;
XinZhangMS 0:f7f1f0d76dd6 406
XinZhangMS 0:f7f1f0d76dd6 407 if (IOTHUB_REGISTRYMANAGER_AUTH_SPK == authMethod)
XinZhangMS 0:f7f1f0d76dd6 408 {
XinZhangMS 0:f7f1f0d76dd6 409 authTypeForJson = DEVICE_JSON_KEY_DEVICE_AUTH_SAS;
XinZhangMS 0:f7f1f0d76dd6 410 }
XinZhangMS 0:f7f1f0d76dd6 411 else if (IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT == authMethod)
XinZhangMS 0:f7f1f0d76dd6 412 {
XinZhangMS 0:f7f1f0d76dd6 413 authTypeForJson = DEVICE_JSON_KEY_DEVICE_AUTH_SELF_SIGNED;
XinZhangMS 0:f7f1f0d76dd6 414 }
XinZhangMS 0:f7f1f0d76dd6 415 else if (IOTHUB_REGISTRYMANAGER_AUTH_X509_CERTIFICATE_AUTHORITY == authMethod)
XinZhangMS 0:f7f1f0d76dd6 416 {
XinZhangMS 0:f7f1f0d76dd6 417 authTypeForJson = DEVICE_JSON_KEY_DEVICE_AUTH_CERTIFICATE_AUTHORITY;
XinZhangMS 0:f7f1f0d76dd6 418 }
XinZhangMS 0:f7f1f0d76dd6 419 else if (IOTHUB_REGISTRYMANAGER_AUTH_NONE == authMethod)
XinZhangMS 0:f7f1f0d76dd6 420 {
XinZhangMS 0:f7f1f0d76dd6 421 authTypeForJson = DEVICE_JSON_KEY_DEVICE_AUTH_NONE;
XinZhangMS 0:f7f1f0d76dd6 422 }
XinZhangMS 0:f7f1f0d76dd6 423 else
XinZhangMS 0:f7f1f0d76dd6 424 {
XinZhangMS 0:f7f1f0d76dd6 425 LogError("Cannot map <%d> to auth type for JSON string", authMethod);
XinZhangMS 0:f7f1f0d76dd6 426 authTypeForJson = NULL;
XinZhangMS 0:f7f1f0d76dd6 427 }
XinZhangMS 0:f7f1f0d76dd6 428
XinZhangMS 0:f7f1f0d76dd6 429 return authTypeForJson;
XinZhangMS 0:f7f1f0d76dd6 430 }
XinZhangMS 0:f7f1f0d76dd6 431
XinZhangMS 0:f7f1f0d76dd6 432 static BUFFER_HANDLE constructDeviceOrModuleJson(const IOTHUB_DEVICE_OR_MODULE* deviceOrModuleInfo)
XinZhangMS 0:f7f1f0d76dd6 433 {
XinZhangMS 0:f7f1f0d76dd6 434 BUFFER_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 435
XinZhangMS 0:f7f1f0d76dd6 436 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_010: [ IoTHubRegistryManager_CreateDevice shall create a flat "key1:value2,key2:value2..." JSON representation from the given deviceCreateInfo parameter using the following parson APIs: json_value_init_object, json_value_get_object, json_object_set_string, json_object_dotset_string ] */
XinZhangMS 0:f7f1f0d76dd6 437 JSON_Value* root_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 438 JSON_Object* root_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 439 JSON_Status jsonStatus;
XinZhangMS 0:f7f1f0d76dd6 440
XinZhangMS 0:f7f1f0d76dd6 441 const char *authTypeForJson;
XinZhangMS 0:f7f1f0d76dd6 442
XinZhangMS 0:f7f1f0d76dd6 443 int iotEdge_capable = (deviceOrModuleInfo->iotEdge_capable == true) ? 1 : 0;
XinZhangMS 0:f7f1f0d76dd6 444
XinZhangMS 0:f7f1f0d76dd6 445 if (deviceOrModuleInfo == NULL)
XinZhangMS 0:f7f1f0d76dd6 446 {
XinZhangMS 0:f7f1f0d76dd6 447 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 448 LogError("deviceOrModuleInfo cannot be null");
XinZhangMS 0:f7f1f0d76dd6 449 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 450 }
XinZhangMS 0:f7f1f0d76dd6 451 else if (deviceOrModuleInfo->deviceId == NULL)
XinZhangMS 0:f7f1f0d76dd6 452 {
XinZhangMS 0:f7f1f0d76dd6 453 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 454 LogError("Device id cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 455 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 456 }
XinZhangMS 0:f7f1f0d76dd6 457 if ((root_value = json_value_init_object()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 458 {
XinZhangMS 0:f7f1f0d76dd6 459 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 460 LogError("json_value_init_object failed");
XinZhangMS 0:f7f1f0d76dd6 461 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 462 }
XinZhangMS 0:f7f1f0d76dd6 463 else if ((root_object = json_value_get_object(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 464 {
XinZhangMS 0:f7f1f0d76dd6 465 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 466 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 467 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 468 }
XinZhangMS 0:f7f1f0d76dd6 469 else if ((json_object_set_string(root_object, DEVICE_JSON_KEY_DEVICE_NAME, deviceOrModuleInfo->deviceId)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 470 {
XinZhangMS 0:f7f1f0d76dd6 471 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 472 LogError("json_object_set_string failed for deviceId");
XinZhangMS 0:f7f1f0d76dd6 473 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 474 }
XinZhangMS 0:f7f1f0d76dd6 475 else if ((deviceOrModuleInfo->moduleId != NULL) && ((json_object_set_string(root_object, DEVICE_JSON_KEY_MODULE_NAME, deviceOrModuleInfo->moduleId)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 476 {
XinZhangMS 0:f7f1f0d76dd6 477 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 478 LogError("json_object_set_string failed for moduleId");
XinZhangMS 0:f7f1f0d76dd6 479 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 480 }
XinZhangMS 0:f7f1f0d76dd6 481 else if ((deviceOrModuleInfo->managedBy != NULL) && ((json_object_set_string(root_object, DEVICE_JSON_KEY_MANAGED_BY, deviceOrModuleInfo->managedBy)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 482 {
XinZhangMS 0:f7f1f0d76dd6 483 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_ERROR_CREATING_JSON if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 484 LogError("json_object_set_string failed for managedBy");
XinZhangMS 0:f7f1f0d76dd6 485 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 486 }
XinZhangMS 0:f7f1f0d76dd6 487 else if (json_object_dotset_string(root_object, DEVICE_JSON_KEY_DEVICE_STATUS, getStatusStringForJson(deviceOrModuleInfo->status)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 488 {
XinZhangMS 0:f7f1f0d76dd6 489 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 490 LogError("json_object_dotset_string failed for status");
XinZhangMS 0:f7f1f0d76dd6 491 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 492 }
XinZhangMS 0:f7f1f0d76dd6 493 /*Codes_SRS_IOTHUBREGISTRYMANAGER_31_001: [** IoTHubRegistryManager_CreateDevice shall set 'type' to "sas"/"selfSigned"/"certificateAuthority" based on deviceOrModuleInfo->authMethod IOTHUB_REGISTRYMANAGER_AUTH_SPK/IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT/IOTHUB_REGISTRYMANAGER_AUTH_X509_CERTIFICATE_AUTHORITY **]** */
XinZhangMS 0:f7f1f0d76dd6 494 /*Codes_SRS_IOTHUBREGISTRYMANAGER_31_002: [** IoTHubRegistryManager_UpdateDevice shall set 'type' to "sas"/"selfSigned"/"certificateAuthority" based on deviceOrModuleInfo->authMethod IOTHUB_REGISTRYMANAGER_AUTH_SPK/IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT/IOTHUB_REGISTRYMANAGER_AUTH_X509_CERTIFICATE_AUTHORITY **]** */
XinZhangMS 0:f7f1f0d76dd6 495 else if ((NULL == (authTypeForJson = getAuthTypeStringForJson(deviceOrModuleInfo->authMethod))) || ((json_object_dotset_string(root_object, DEVICE_JSON_KEY_DEVICE_AUTH_TYPE, authTypeForJson)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 496 {
XinZhangMS 0:f7f1f0d76dd6 497 LogError("json_object_dotset_string failed for authType");
XinZhangMS 0:f7f1f0d76dd6 498 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 499 }
XinZhangMS 0:f7f1f0d76dd6 500 //
XinZhangMS 0:f7f1f0d76dd6 501 // Static function here. We make the assumption that the auth method has been validated by the caller of this function.
XinZhangMS 0:f7f1f0d76dd6 502 //
XinZhangMS 0:f7f1f0d76dd6 503 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_002: [ IoTHubRegistryManager_CreateDevice shall, if deviceCreateInfo->authMethod is equal to "IOTHUB_REGISTRYMANAGER_AUTH_SPK", set "authorization.symmetricKey.primaryKey" to deviceCreateInfo->primaryKey and "authorization.symmetricKey.secondaryKey" to deviceCreateInfo->secondaryKey ] */
XinZhangMS 0:f7f1f0d76dd6 504 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_004: [ IoTHubRegistryManager_UpdateDevice shall, if deviceUpdate->authMethod is equal to "IOTHUB_REGISTRYMANAGER_AUTH_SPK", set "authorization.symmetricKey.primaryKey" to deviceCreateInfo->primaryKey and "authorization.symmetricKey.secondaryKey" to deviceCreateInfo->secondaryKey ] */
XinZhangMS 0:f7f1f0d76dd6 505 else if ((deviceOrModuleInfo->authMethod == IOTHUB_REGISTRYMANAGER_AUTH_SPK) && ((json_object_dotset_string(root_object, DEVICE_JSON_KEY_DEVICE_PRIMARY_KEY, deviceOrModuleInfo->primaryKey)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 506 {
XinZhangMS 0:f7f1f0d76dd6 507 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 508 LogError("json_object_dotset_string failed for primarykey");
XinZhangMS 0:f7f1f0d76dd6 509 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 510 }
XinZhangMS 0:f7f1f0d76dd6 511 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_002: [ IoTHubRegistryManager_CreateDevice shall, if deviceCreateInfo->authMethod is equal to "IOTHUB_REGISTRYMANAGER_AUTH_SPK", set "authorization.symmetricKey.primaryKey" to deviceCreateInfo->primaryKey and "authorization.symmetricKey.secondaryKey" to deviceCreateInfo->secondaryKey ] */
XinZhangMS 0:f7f1f0d76dd6 512 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_004: [ IoTHubRegistryManager_UpdateDevice shall, if deviceUpdate->authMethod is equal to "IOTHUB_REGISTRYMANAGER_AUTH_SPK", set "authorization.symmetricKey.primaryKey" to deviceCreateInfo->primaryKey and "authorization.symmetricKey.secondaryKey" to deviceCreateInfo->secondaryKey ] */
XinZhangMS 0:f7f1f0d76dd6 513 else if ((deviceOrModuleInfo->authMethod == IOTHUB_REGISTRYMANAGER_AUTH_SPK) && ((json_object_dotset_string(root_object, DEVICE_JSON_KEY_DEVICE_SECONDARY_KEY, deviceOrModuleInfo->secondaryKey)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 514 {
XinZhangMS 0:f7f1f0d76dd6 515 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 516 LogError("json_object_dotset_string failed for secondaryKey");
XinZhangMS 0:f7f1f0d76dd6 517 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 518 }
XinZhangMS 0:f7f1f0d76dd6 519 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_001: [ IoTHubRegistryManager_CreateDevice shall, if deviceCreateInfo->authMethod is equal to "IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT", set "authorization.x509Thumbprint.primaryThumbprint" to deviceCreateInfo->primaryKey and "authorization.x509Thumbprint.secondaryThumbprint" to deviceCreateInfo->secondaryKey ] */
XinZhangMS 0:f7f1f0d76dd6 520 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_003: [ IoTHubRegistryManager_UpdateDevice shall, if deviceUpdate->authMethod is equal to "IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT", set "authorization.x509Thumbprint.primaryThumbprint" to deviceCreateInfo->primaryKey and "authorization.x509Thumbprint.secondaryThumbprint" to deviceCreateInfo->secondaryKey ] */
XinZhangMS 0:f7f1f0d76dd6 521 else if ((deviceOrModuleInfo->authMethod == IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT) && ((json_object_dotset_string(root_object, DEVICE_JSON_KEY_DEVICE_PRIMARY_THUMBPRINT, deviceOrModuleInfo->primaryKey)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 522 {
XinZhangMS 0:f7f1f0d76dd6 523 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 524 LogError("json_object_dotset_string failed for primaryThumbprint");
XinZhangMS 0:f7f1f0d76dd6 525 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 526 }
XinZhangMS 0:f7f1f0d76dd6 527 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_001: [ IoTHubRegistryManager_CreateDevice shall, if deviceCreateInfo->authMethod is equal to "IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT", set "authorization.x509Thumbprint.primaryThumbprint" to deviceCreateInfo->primaryKey and "authorization.x509Thumbprint.secondaryThumbprint" to deviceCreateInfo->secondaryKey ] */
XinZhangMS 0:f7f1f0d76dd6 528 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_003: [ IoTHubRegistryManager_UpdateDevice shall, if deviceUpdate->authMethod is equal to "IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT", set "authorization.x509Thumbprint.primaryThumbprint" to deviceCreateInfo->primaryKey and "authorization.x509Thumbprint.secondaryThumbprint" to deviceCreateInfo->secondaryKey ] */
XinZhangMS 0:f7f1f0d76dd6 529 else if ((deviceOrModuleInfo->authMethod == IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT) && ((json_object_dotset_string(root_object, DEVICE_JSON_KEY_DEVICE_SECONDARY_THUMBPRINT, deviceOrModuleInfo->secondaryKey)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 530 {
XinZhangMS 0:f7f1f0d76dd6 531 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 532 LogError("json_object_dotset_string failed for secondaryThumbprint");
XinZhangMS 0:f7f1f0d76dd6 533 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 534 }
XinZhangMS 0:f7f1f0d76dd6 535 else if ((deviceOrModuleInfo->moduleId == NULL) && (json_object_dotset_boolean(root_object, DEVICE_JSON_KEY_CAPABILITIES_IOTEDGE, iotEdge_capable)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 536 {
XinZhangMS 0:f7f1f0d76dd6 537 LogError("json_object_dotset_string failed for iotEdge capable");
XinZhangMS 0:f7f1f0d76dd6 538 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 539 }
XinZhangMS 0:f7f1f0d76dd6 540 else
XinZhangMS 0:f7f1f0d76dd6 541 {
XinZhangMS 0:f7f1f0d76dd6 542 char* serialized_string;
XinZhangMS 0:f7f1f0d76dd6 543 if ((serialized_string = json_serialize_to_string(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 544 {
XinZhangMS 0:f7f1f0d76dd6 545 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 546 LogError("json_serialize_to_string failed");
XinZhangMS 0:f7f1f0d76dd6 547 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 548 }
XinZhangMS 0:f7f1f0d76dd6 549 else
XinZhangMS 0:f7f1f0d76dd6 550 {
XinZhangMS 0:f7f1f0d76dd6 551 if ((result = BUFFER_create((const unsigned char*)serialized_string, strlen(serialized_string))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 552 {
XinZhangMS 0:f7f1f0d76dd6 553 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 554 LogError("Buffer_Create failed");
XinZhangMS 0:f7f1f0d76dd6 555 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 556 }
XinZhangMS 0:f7f1f0d76dd6 557 json_free_serialized_string(serialized_string);
XinZhangMS 0:f7f1f0d76dd6 558 }
XinZhangMS 0:f7f1f0d76dd6 559 }
XinZhangMS 0:f7f1f0d76dd6 560
XinZhangMS 0:f7f1f0d76dd6 561 if ((jsonStatus = json_object_clear(root_object)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 562 {
XinZhangMS 0:f7f1f0d76dd6 563 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 564 LogError("json_object_clear failed");
XinZhangMS 0:f7f1f0d76dd6 565 BUFFER_delete(result);
XinZhangMS 0:f7f1f0d76dd6 566 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 567 }
XinZhangMS 0:f7f1f0d76dd6 568 if(root_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 569 json_value_free(root_value);
XinZhangMS 0:f7f1f0d76dd6 570
XinZhangMS 0:f7f1f0d76dd6 571 return result;
XinZhangMS 0:f7f1f0d76dd6 572 }
XinZhangMS 0:f7f1f0d76dd6 573
XinZhangMS 0:f7f1f0d76dd6 574 static IOTHUB_REGISTRYMANAGER_RESULT parseDeviceOrModuleJsonObject(JSON_Object* root_object, IOTHUB_DEVICE_OR_MODULE* deviceOrModuleInfo)
XinZhangMS 0:f7f1f0d76dd6 575 {
XinZhangMS 0:f7f1f0d76dd6 576 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 577
XinZhangMS 0:f7f1f0d76dd6 578 const char* deviceId = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_NAME);
XinZhangMS 0:f7f1f0d76dd6 579 const char* moduleId = json_object_get_string(root_object, DEVICE_JSON_KEY_MODULE_NAME);
XinZhangMS 0:f7f1f0d76dd6 580 const char* managedBy = json_object_get_string(root_object, DEVICE_JSON_KEY_MANAGED_BY);
XinZhangMS 0:f7f1f0d76dd6 581 const char* primaryKey = NULL;
XinZhangMS 0:f7f1f0d76dd6 582 const char* secondaryKey = NULL;
XinZhangMS 0:f7f1f0d76dd6 583 const char* authType = json_object_dotget_string(root_object, DEVICE_JSON_KEY_DEVICE_AUTH_TYPE);
XinZhangMS 0:f7f1f0d76dd6 584 const char* generationId = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_GENERATION_ID);
XinZhangMS 0:f7f1f0d76dd6 585 const char* eTag = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_ETAG);
XinZhangMS 0:f7f1f0d76dd6 586 const char* connectionState = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_CONNECTIONSTATE);
XinZhangMS 0:f7f1f0d76dd6 587 const char* connectionStateUpdatedTime = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_CONNECTIONSTATEUPDATEDTIME);
XinZhangMS 0:f7f1f0d76dd6 588 const char* status = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_STATUS);
XinZhangMS 0:f7f1f0d76dd6 589 const char* statusReason = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_STATUSREASON);
XinZhangMS 0:f7f1f0d76dd6 590 const char* statusUpdatedTime = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_STATUSUPDATEDTIME);
XinZhangMS 0:f7f1f0d76dd6 591 const char* lastActivityTime = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_LASTACTIVITYTIME);
XinZhangMS 0:f7f1f0d76dd6 592 const char* cloudToDeviceMessageCount = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_CLOUDTODEVICEMESSAGECOUNT);
XinZhangMS 0:f7f1f0d76dd6 593 const char* isManaged = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_ISMANAGED);
XinZhangMS 0:f7f1f0d76dd6 594 const char* configuration = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_CONFIGURATION);
XinZhangMS 0:f7f1f0d76dd6 595 const char* deviceProperties = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_DEVICEROPERTIES);
XinZhangMS 0:f7f1f0d76dd6 596 const char* serviceProperties = json_object_get_string(root_object, DEVICE_JSON_KEY_DEVICE_SERVICEPROPERTIES);
XinZhangMS 0:f7f1f0d76dd6 597 int iotEdge_capable = json_object_dotget_boolean(root_object, DEVICE_JSON_KEY_CAPABILITIES_IOTEDGE);
XinZhangMS 0:f7f1f0d76dd6 598
XinZhangMS 0:f7f1f0d76dd6 599 if (NULL != authType)
XinZhangMS 0:f7f1f0d76dd6 600 {
XinZhangMS 0:f7f1f0d76dd6 601 if (0 == strcmp(authType, DEVICE_JSON_KEY_DEVICE_AUTH_SAS))
XinZhangMS 0:f7f1f0d76dd6 602 {
XinZhangMS 0:f7f1f0d76dd6 603 primaryKey = (char*)json_object_dotget_string(root_object, DEVICE_JSON_KEY_DEVICE_PRIMARY_KEY);
XinZhangMS 0:f7f1f0d76dd6 604 secondaryKey = (char*)json_object_dotget_string(root_object, DEVICE_JSON_KEY_DEVICE_SECONDARY_KEY);
XinZhangMS 0:f7f1f0d76dd6 605 deviceOrModuleInfo->authMethod = IOTHUB_REGISTRYMANAGER_AUTH_SPK;
XinZhangMS 0:f7f1f0d76dd6 606 }
XinZhangMS 0:f7f1f0d76dd6 607 else if (0 == strcmp(authType, DEVICE_JSON_KEY_DEVICE_AUTH_SELF_SIGNED))
XinZhangMS 0:f7f1f0d76dd6 608 {
XinZhangMS 0:f7f1f0d76dd6 609 primaryKey = (char*)json_object_dotget_string(root_object, DEVICE_JSON_KEY_DEVICE_PRIMARY_THUMBPRINT);
XinZhangMS 0:f7f1f0d76dd6 610 secondaryKey = (char*)json_object_dotget_string(root_object, DEVICE_JSON_KEY_DEVICE_SECONDARY_THUMBPRINT);
XinZhangMS 0:f7f1f0d76dd6 611 deviceOrModuleInfo->authMethod = IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT;
XinZhangMS 0:f7f1f0d76dd6 612 }
XinZhangMS 0:f7f1f0d76dd6 613 else if (0 == strcmp(authType, DEVICE_JSON_KEY_DEVICE_AUTH_CERTIFICATE_AUTHORITY))
XinZhangMS 0:f7f1f0d76dd6 614 {
XinZhangMS 0:f7f1f0d76dd6 615 deviceOrModuleInfo->authMethod = IOTHUB_REGISTRYMANAGER_AUTH_X509_CERTIFICATE_AUTHORITY;
XinZhangMS 0:f7f1f0d76dd6 616 }
XinZhangMS 0:f7f1f0d76dd6 617 else if (0 == strcmp(authType, DEVICE_JSON_KEY_DEVICE_AUTH_NONE))
XinZhangMS 0:f7f1f0d76dd6 618 {
XinZhangMS 0:f7f1f0d76dd6 619 deviceOrModuleInfo->authMethod = IOTHUB_REGISTRYMANAGER_AUTH_NONE;
XinZhangMS 0:f7f1f0d76dd6 620 }
XinZhangMS 0:f7f1f0d76dd6 621 else
XinZhangMS 0:f7f1f0d76dd6 622 {
XinZhangMS 0:f7f1f0d76dd6 623 deviceOrModuleInfo->authMethod = IOTHUB_REGISTRYMANAGER_AUTH_UNKNOWN;
XinZhangMS 0:f7f1f0d76dd6 624 }
XinZhangMS 0:f7f1f0d76dd6 625 }
XinZhangMS 0:f7f1f0d76dd6 626 else
XinZhangMS 0:f7f1f0d76dd6 627 {
XinZhangMS 0:f7f1f0d76dd6 628 deviceOrModuleInfo->authMethod = IOTHUB_REGISTRYMANAGER_AUTH_UNKNOWN;
XinZhangMS 0:f7f1f0d76dd6 629 }
XinZhangMS 0:f7f1f0d76dd6 630
XinZhangMS 0:f7f1f0d76dd6 631 if ((deviceId != NULL) && (mallocAndStrcpy_s((char**)&(deviceOrModuleInfo->deviceId), deviceId) != 0))
XinZhangMS 0:f7f1f0d76dd6 632 {
XinZhangMS 0:f7f1f0d76dd6 633 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 634 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 635 LogError("mallocAndStrcpy_s failed for deviceId");
XinZhangMS 0:f7f1f0d76dd6 636 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 637 }
XinZhangMS 0:f7f1f0d76dd6 638 else if ((moduleId != NULL) && (mallocAndStrcpy_s((char**)&(deviceOrModuleInfo->moduleId), moduleId) != 0))
XinZhangMS 0:f7f1f0d76dd6 639 {
XinZhangMS 0:f7f1f0d76dd6 640 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 641 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 642 LogError("mallocAndStrcpy_s failed for moduleId");
XinZhangMS 0:f7f1f0d76dd6 643 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 644 }
XinZhangMS 0:f7f1f0d76dd6 645 else if ((primaryKey != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->primaryKey, primaryKey) != 0))
XinZhangMS 0:f7f1f0d76dd6 646 {
XinZhangMS 0:f7f1f0d76dd6 647 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 648 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 649 LogError("mallocAndStrcpy_s failed for primaryKey");
XinZhangMS 0:f7f1f0d76dd6 650 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 651 }
XinZhangMS 0:f7f1f0d76dd6 652 else if ((secondaryKey != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->secondaryKey, secondaryKey) != 0))
XinZhangMS 0:f7f1f0d76dd6 653 {
XinZhangMS 0:f7f1f0d76dd6 654 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 655 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 656 LogError("mallocAndStrcpy_s failed for secondaryKey");
XinZhangMS 0:f7f1f0d76dd6 657 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 658 }
XinZhangMS 0:f7f1f0d76dd6 659 else if ((generationId != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->generationId, generationId) != 0))
XinZhangMS 0:f7f1f0d76dd6 660 {
XinZhangMS 0:f7f1f0d76dd6 661 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 662 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 663 LogError("mallocAndStrcpy_s failed for generationId");
XinZhangMS 0:f7f1f0d76dd6 664 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 665 }
XinZhangMS 0:f7f1f0d76dd6 666 else if ((eTag != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->eTag, eTag) != 0))
XinZhangMS 0:f7f1f0d76dd6 667 {
XinZhangMS 0:f7f1f0d76dd6 668 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 669 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 670 LogError("mallocAndStrcpy_s failed for eTag");
XinZhangMS 0:f7f1f0d76dd6 671 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 672 }
XinZhangMS 0:f7f1f0d76dd6 673 else if ((connectionStateUpdatedTime != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->connectionStateUpdatedTime, connectionStateUpdatedTime) != 0))
XinZhangMS 0:f7f1f0d76dd6 674 {
XinZhangMS 0:f7f1f0d76dd6 675 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 676 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 677 LogError("mallocAndStrcpy_s failed for connectionStateUpdatedTime");
XinZhangMS 0:f7f1f0d76dd6 678 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 679 }
XinZhangMS 0:f7f1f0d76dd6 680 else if ((statusReason != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->statusReason, statusReason) != 0))
XinZhangMS 0:f7f1f0d76dd6 681 {
XinZhangMS 0:f7f1f0d76dd6 682 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 683 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 684 LogError("mallocAndStrcpy_s failed for statusReason");
XinZhangMS 0:f7f1f0d76dd6 685 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 686 }
XinZhangMS 0:f7f1f0d76dd6 687 else if ((statusUpdatedTime != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->statusUpdatedTime, statusUpdatedTime) != 0))
XinZhangMS 0:f7f1f0d76dd6 688 {
XinZhangMS 0:f7f1f0d76dd6 689 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 690 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 691 LogError("mallocAndStrcpy_s failed for statusUpdatedTime");
XinZhangMS 0:f7f1f0d76dd6 692 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 693 }
XinZhangMS 0:f7f1f0d76dd6 694 else if ((lastActivityTime != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->lastActivityTime, lastActivityTime) != 0))
XinZhangMS 0:f7f1f0d76dd6 695 {
XinZhangMS 0:f7f1f0d76dd6 696 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 697 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 698 LogError("mallocAndStrcpy_s failed for lastActivityTime");
XinZhangMS 0:f7f1f0d76dd6 699 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 700 }
XinZhangMS 0:f7f1f0d76dd6 701 else if ((configuration != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->configuration, configuration) != 0))
XinZhangMS 0:f7f1f0d76dd6 702 {
XinZhangMS 0:f7f1f0d76dd6 703 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 704 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 705 LogError("mallocAndStrcpy_s failed for configuration");
XinZhangMS 0:f7f1f0d76dd6 706 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 707 }
XinZhangMS 0:f7f1f0d76dd6 708 else if ((deviceProperties != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->deviceProperties, deviceProperties) != 0))
XinZhangMS 0:f7f1f0d76dd6 709 {
XinZhangMS 0:f7f1f0d76dd6 710 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 711 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 712 LogError("mallocAndStrcpy_s failed for deviceProperties");
XinZhangMS 0:f7f1f0d76dd6 713 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 714 }
XinZhangMS 0:f7f1f0d76dd6 715 else if ((serviceProperties != NULL) && (mallocAndStrcpy_s((char**)&deviceOrModuleInfo->serviceProperties, serviceProperties) != 0))
XinZhangMS 0:f7f1f0d76dd6 716 {
XinZhangMS 0:f7f1f0d76dd6 717 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 718 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 719 LogError("mallocAndStrcpy_s failed for serviceProperties");
XinZhangMS 0:f7f1f0d76dd6 720 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 721 }
XinZhangMS 0:f7f1f0d76dd6 722 else if ((managedBy != NULL) && (mallocAndStrcpy_s((char**)&(deviceOrModuleInfo->managedBy), managedBy) != 0))
XinZhangMS 0:f7f1f0d76dd6 723 {
XinZhangMS 0:f7f1f0d76dd6 724 LogError("mallocAndStrcpy_s failed for managedBy");
XinZhangMS 0:f7f1f0d76dd6 725 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 726 }
XinZhangMS 0:f7f1f0d76dd6 727 else
XinZhangMS 0:f7f1f0d76dd6 728 {
XinZhangMS 0:f7f1f0d76dd6 729 if ((connectionState != NULL) && (strcmp(connectionState, DEVICE_JSON_DEFAULT_VALUE_CONNECTED) == 0))
XinZhangMS 0:f7f1f0d76dd6 730 {
XinZhangMS 0:f7f1f0d76dd6 731 deviceOrModuleInfo->connectionState = IOTHUB_DEVICE_CONNECTION_STATE_CONNECTED;
XinZhangMS 0:f7f1f0d76dd6 732 }
XinZhangMS 0:f7f1f0d76dd6 733 if ((status != NULL) && (strcmp(status, DEVICE_JSON_DEFAULT_VALUE_ENABLED) == 0))
XinZhangMS 0:f7f1f0d76dd6 734 {
XinZhangMS 0:f7f1f0d76dd6 735 deviceOrModuleInfo->status = IOTHUB_DEVICE_STATUS_ENABLED;
XinZhangMS 0:f7f1f0d76dd6 736 }
XinZhangMS 0:f7f1f0d76dd6 737 if (cloudToDeviceMessageCount != NULL)
XinZhangMS 0:f7f1f0d76dd6 738 {
XinZhangMS 0:f7f1f0d76dd6 739 deviceOrModuleInfo->cloudToDeviceMessageCount = atoi(cloudToDeviceMessageCount);
XinZhangMS 0:f7f1f0d76dd6 740 }
XinZhangMS 0:f7f1f0d76dd6 741 if ((isManaged != NULL) && (strcmp(isManaged, DEVICE_JSON_DEFAULT_VALUE_TRUE) == 0))
XinZhangMS 0:f7f1f0d76dd6 742 {
XinZhangMS 0:f7f1f0d76dd6 743 deviceOrModuleInfo->isManaged = true;
XinZhangMS 0:f7f1f0d76dd6 744 }
XinZhangMS 0:f7f1f0d76dd6 745 if ((iotEdge_capable == -1) || (iotEdge_capable == 0))
XinZhangMS 0:f7f1f0d76dd6 746 {
XinZhangMS 0:f7f1f0d76dd6 747 deviceOrModuleInfo->iotEdge_capable = false;
XinZhangMS 0:f7f1f0d76dd6 748 }
XinZhangMS 0:f7f1f0d76dd6 749 else
XinZhangMS 0:f7f1f0d76dd6 750 {
XinZhangMS 0:f7f1f0d76dd6 751 deviceOrModuleInfo->iotEdge_capable = true;
XinZhangMS 0:f7f1f0d76dd6 752 }
XinZhangMS 0:f7f1f0d76dd6 753 result = IOTHUB_REGISTRYMANAGER_OK;
XinZhangMS 0:f7f1f0d76dd6 754 }
XinZhangMS 0:f7f1f0d76dd6 755
XinZhangMS 0:f7f1f0d76dd6 756 return result;
XinZhangMS 0:f7f1f0d76dd6 757 }
XinZhangMS 0:f7f1f0d76dd6 758
XinZhangMS 0:f7f1f0d76dd6 759 static IOTHUB_REGISTRYMANAGER_RESULT parseDeviceOrModuleJson(BUFFER_HANDLE jsonBuffer, IOTHUB_DEVICE_OR_MODULE* deviceOrModuleInfo)
XinZhangMS 0:f7f1f0d76dd6 760 {
XinZhangMS 0:f7f1f0d76dd6 761 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 762
XinZhangMS 0:f7f1f0d76dd6 763 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_024: [ If the deviceOrModuleInfo out parameter is not NULL IoTHubRegistryManager_CreateDevice shall save the received deviceOrModuleInfo to the out parameter and return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 764 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_033: [ IoTHubRegistryManager_GetDevice shall verify the received HTTP status code and if it is less or equal than 300 then try to parse the response JSON to deviceOrModuleInfo for the following properties: deviceId, primaryKey, secondaryKey, generationId, eTag, connectionState, connectionstateUpdatedTime, status, statusReason, statusUpdatedTime, lastActivityTime, cloudToDeviceMessageCount ] */
XinZhangMS 0:f7f1f0d76dd6 765 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_034: [ If any of the property field above missing from the JSON the property value will not be populated ] */
XinZhangMS 0:f7f1f0d76dd6 766 if (jsonBuffer == NULL)
XinZhangMS 0:f7f1f0d76dd6 767 {
XinZhangMS 0:f7f1f0d76dd6 768 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 769 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 770 LogError("jsonBuffer cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 771 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 772 }
XinZhangMS 0:f7f1f0d76dd6 773 else if (deviceOrModuleInfo == NULL)
XinZhangMS 0:f7f1f0d76dd6 774 {
XinZhangMS 0:f7f1f0d76dd6 775 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 776 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 777 LogError("deviceOrModuleInfo cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 778 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 779 }
XinZhangMS 0:f7f1f0d76dd6 780 else
XinZhangMS 0:f7f1f0d76dd6 781 {
XinZhangMS 0:f7f1f0d76dd6 782 const char* bufferStr = NULL;
XinZhangMS 0:f7f1f0d76dd6 783 JSON_Value* root_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 784 JSON_Object* root_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 785 JSON_Status jsonStatus;
XinZhangMS 0:f7f1f0d76dd6 786
XinZhangMS 0:f7f1f0d76dd6 787 if ((bufferStr = (const char*)BUFFER_u_char(jsonBuffer)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 788 {
XinZhangMS 0:f7f1f0d76dd6 789 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 790 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 791 LogError("BUFFER_u_char failed");
XinZhangMS 0:f7f1f0d76dd6 792 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 793 }
XinZhangMS 0:f7f1f0d76dd6 794 else if ((root_value = json_parse_string(bufferStr)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 795 {
XinZhangMS 0:f7f1f0d76dd6 796 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 797 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 798 LogError("json_parse_string failed");
XinZhangMS 0:f7f1f0d76dd6 799 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 800 }
XinZhangMS 0:f7f1f0d76dd6 801 else if ((root_object = json_value_get_object(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 802 {
XinZhangMS 0:f7f1f0d76dd6 803 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 804 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 805 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 806 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 807 }
XinZhangMS 0:f7f1f0d76dd6 808 else
XinZhangMS 0:f7f1f0d76dd6 809 {
XinZhangMS 0:f7f1f0d76dd6 810 result = parseDeviceOrModuleJsonObject(root_object, deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 811 }
XinZhangMS 0:f7f1f0d76dd6 812
XinZhangMS 0:f7f1f0d76dd6 813 if ((jsonStatus = json_object_clear(root_object)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 814 {
XinZhangMS 0:f7f1f0d76dd6 815 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 816 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 817 LogError("json_object_clear failed");
XinZhangMS 0:f7f1f0d76dd6 818 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 819 }
XinZhangMS 0:f7f1f0d76dd6 820
XinZhangMS 0:f7f1f0d76dd6 821 json_value_free(root_value);
XinZhangMS 0:f7f1f0d76dd6 822
XinZhangMS 0:f7f1f0d76dd6 823 if (result != IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 824 {
XinZhangMS 0:f7f1f0d76dd6 825 free_deviceOrModule_members(deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 826 }
XinZhangMS 0:f7f1f0d76dd6 827 }
XinZhangMS 0:f7f1f0d76dd6 828 return result;
XinZhangMS 0:f7f1f0d76dd6 829 }
XinZhangMS 0:f7f1f0d76dd6 830
XinZhangMS 0:f7f1f0d76dd6 831 static int addDeviceOrModuleToLinkedListAsDevice(IOTHUB_DEVICE_OR_MODULE* iothubDeviceOrModule, SINGLYLINKEDLIST_HANDLE deviceOrModuleList)
XinZhangMS 0:f7f1f0d76dd6 832 {
XinZhangMS 0:f7f1f0d76dd6 833 int result;
XinZhangMS 0:f7f1f0d76dd6 834 IOTHUB_DEVICE* device = NULL;
XinZhangMS 0:f7f1f0d76dd6 835
XinZhangMS 0:f7f1f0d76dd6 836 if ((device = (IOTHUB_DEVICE*)malloc(sizeof(IOTHUB_DEVICE))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 837 {
XinZhangMS 0:f7f1f0d76dd6 838 LogError("Malloc failed for device");
XinZhangMS 0:f7f1f0d76dd6 839 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 840 }
XinZhangMS 0:f7f1f0d76dd6 841 else
XinZhangMS 0:f7f1f0d76dd6 842 {
XinZhangMS 0:f7f1f0d76dd6 843 //Convert to a Device struct
XinZhangMS 0:f7f1f0d76dd6 844 move_deviceOrModule_members_to_device(iothubDeviceOrModule, device);
XinZhangMS 0:f7f1f0d76dd6 845
XinZhangMS 0:f7f1f0d76dd6 846 if ((singlylinkedlist_add(deviceOrModuleList, device)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 847 {
XinZhangMS 0:f7f1f0d76dd6 848 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_072: [** If populating the deviceList parameter fails IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 849 LogError("singlylinkedlist_add failed");
XinZhangMS 0:f7f1f0d76dd6 850 free(device); //only free structure. Because members are still referenced by iothubDeviceOrModule we will free them after
XinZhangMS 0:f7f1f0d76dd6 851 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 852 }
XinZhangMS 0:f7f1f0d76dd6 853 else
XinZhangMS 0:f7f1f0d76dd6 854 {
XinZhangMS 0:f7f1f0d76dd6 855 result = IOTHUB_REGISTRYMANAGER_OK;
XinZhangMS 0:f7f1f0d76dd6 856 }
XinZhangMS 0:f7f1f0d76dd6 857 }
XinZhangMS 0:f7f1f0d76dd6 858
XinZhangMS 0:f7f1f0d76dd6 859 return result;
XinZhangMS 0:f7f1f0d76dd6 860 }
XinZhangMS 0:f7f1f0d76dd6 861
XinZhangMS 0:f7f1f0d76dd6 862 static int addDeviceOrModuleToLinkedListAsModule(IOTHUB_DEVICE_OR_MODULE* iothubDeviceOrModule, SINGLYLINKEDLIST_HANDLE deviceOrModuleList, int version)
XinZhangMS 0:f7f1f0d76dd6 863 {
XinZhangMS 0:f7f1f0d76dd6 864 int result;
XinZhangMS 0:f7f1f0d76dd6 865 IOTHUB_MODULE* module = NULL;
XinZhangMS 0:f7f1f0d76dd6 866
XinZhangMS 0:f7f1f0d76dd6 867 if ((module = (IOTHUB_MODULE*)malloc(sizeof(IOTHUB_MODULE))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 868 {
XinZhangMS 0:f7f1f0d76dd6 869 LogError("Malloc failed for module");
XinZhangMS 0:f7f1f0d76dd6 870 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 871 }
XinZhangMS 0:f7f1f0d76dd6 872 else
XinZhangMS 0:f7f1f0d76dd6 873 {
XinZhangMS 0:f7f1f0d76dd6 874 //Convert to a Module struct
XinZhangMS 0:f7f1f0d76dd6 875 module->version = version;
XinZhangMS 0:f7f1f0d76dd6 876 move_deviceOrModule_members_to_module(iothubDeviceOrModule, module);
XinZhangMS 0:f7f1f0d76dd6 877
XinZhangMS 0:f7f1f0d76dd6 878 if ((singlylinkedlist_add(deviceOrModuleList, module)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 879 {
XinZhangMS 0:f7f1f0d76dd6 880 LogError("singlylinkedlist_add failed");
XinZhangMS 0:f7f1f0d76dd6 881 free(module); //only free structure. Because members are still referenced by iothubDeviceOrModule we will free them after
XinZhangMS 0:f7f1f0d76dd6 882 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 883 }
XinZhangMS 0:f7f1f0d76dd6 884 else
XinZhangMS 0:f7f1f0d76dd6 885 {
XinZhangMS 0:f7f1f0d76dd6 886 result = IOTHUB_REGISTRYMANAGER_OK;
XinZhangMS 0:f7f1f0d76dd6 887 }
XinZhangMS 0:f7f1f0d76dd6 888 }
XinZhangMS 0:f7f1f0d76dd6 889
XinZhangMS 0:f7f1f0d76dd6 890 return result;
XinZhangMS 0:f7f1f0d76dd6 891 }
XinZhangMS 0:f7f1f0d76dd6 892
XinZhangMS 0:f7f1f0d76dd6 893 static IOTHUB_REGISTRYMANAGER_RESULT parseDeviceOrModuleListJson(BUFFER_HANDLE jsonBuffer, SINGLYLINKEDLIST_HANDLE deviceOrModuleList, IOTHUB_REGISTRYMANAGER_MODEL_TYPE struct_type, int struct_version)
XinZhangMS 0:f7f1f0d76dd6 894 {
XinZhangMS 0:f7f1f0d76dd6 895 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 896
XinZhangMS 0:f7f1f0d76dd6 897 const char* bufferStr = NULL;
XinZhangMS 0:f7f1f0d76dd6 898 JSON_Value* root_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 899 JSON_Array* device_or_module_array = NULL;
XinZhangMS 0:f7f1f0d76dd6 900 JSON_Status jsonStatus = JSONFailure;
XinZhangMS 0:f7f1f0d76dd6 901
XinZhangMS 0:f7f1f0d76dd6 902 if (jsonBuffer == NULL)
XinZhangMS 0:f7f1f0d76dd6 903 {
XinZhangMS 0:f7f1f0d76dd6 904 LogError("jsonBuffer cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 905 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 906 }
XinZhangMS 0:f7f1f0d76dd6 907 else if (deviceOrModuleList == NULL)
XinZhangMS 0:f7f1f0d76dd6 908 {
XinZhangMS 0:f7f1f0d76dd6 909 LogError("deviceOrModuleList cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 910 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 911 }
XinZhangMS 0:f7f1f0d76dd6 912 else
XinZhangMS 0:f7f1f0d76dd6 913 {
XinZhangMS 0:f7f1f0d76dd6 914 if ((bufferStr = (const char*)BUFFER_u_char(jsonBuffer)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 915 {
XinZhangMS 0:f7f1f0d76dd6 916 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_072: [** If populating the deviceList parameter fails IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 917 LogError("BUFFER_u_char failed");
XinZhangMS 0:f7f1f0d76dd6 918 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 919 }
XinZhangMS 0:f7f1f0d76dd6 920 else if ((root_value = json_parse_string(bufferStr)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 921 {
XinZhangMS 0:f7f1f0d76dd6 922 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_070: [** If any of the parson API fails, IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 923 LogError("json_parse_string failed");
XinZhangMS 0:f7f1f0d76dd6 924 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 925 }
XinZhangMS 0:f7f1f0d76dd6 926 else if ((device_or_module_array = json_value_get_array(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 927 {
XinZhangMS 0:f7f1f0d76dd6 928 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_070: [** If any of the parson API fails, IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 929 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 930 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 931 }
XinZhangMS 0:f7f1f0d76dd6 932 else
XinZhangMS 0:f7f1f0d76dd6 933 {
XinZhangMS 0:f7f1f0d76dd6 934 result = IOTHUB_REGISTRYMANAGER_OK;
XinZhangMS 0:f7f1f0d76dd6 935
XinZhangMS 0:f7f1f0d76dd6 936 size_t array_count = json_array_get_count(device_or_module_array);
XinZhangMS 0:f7f1f0d76dd6 937 for (size_t i = 0; i < array_count; i++)
XinZhangMS 0:f7f1f0d76dd6 938 {
XinZhangMS 0:f7f1f0d76dd6 939 JSON_Object* device_or_module_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 940 IOTHUB_DEVICE_OR_MODULE iothubDeviceOrModule;
XinZhangMS 0:f7f1f0d76dd6 941
XinZhangMS 0:f7f1f0d76dd6 942 if ((device_or_module_object = json_array_get_object(device_or_module_array, i)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 943 {
XinZhangMS 0:f7f1f0d76dd6 944 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_070: [** If any of the parson API fails, IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 945 LogError("json_array_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 946 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 947 }
XinZhangMS 0:f7f1f0d76dd6 948 else
XinZhangMS 0:f7f1f0d76dd6 949 {
XinZhangMS 0:f7f1f0d76dd6 950 initializeDeviceOrModuleInfoMembers(&iothubDeviceOrModule);
XinZhangMS 0:f7f1f0d76dd6 951
XinZhangMS 0:f7f1f0d76dd6 952 result = parseDeviceOrModuleJsonObject(device_or_module_object, &iothubDeviceOrModule);
XinZhangMS 0:f7f1f0d76dd6 953 if (IOTHUB_REGISTRYMANAGER_OK != result)
XinZhangMS 0:f7f1f0d76dd6 954 {
XinZhangMS 0:f7f1f0d76dd6 955 free_deviceOrModule_members(&iothubDeviceOrModule);
XinZhangMS 0:f7f1f0d76dd6 956 }
XinZhangMS 0:f7f1f0d76dd6 957 else
XinZhangMS 0:f7f1f0d76dd6 958 {
XinZhangMS 0:f7f1f0d76dd6 959 if (struct_type == IOTHUB_REGISTRYMANAGER_MODEL_TYPE_DEVICE)
XinZhangMS 0:f7f1f0d76dd6 960 {
XinZhangMS 0:f7f1f0d76dd6 961 result = addDeviceOrModuleToLinkedListAsDevice(&iothubDeviceOrModule, deviceOrModuleList);
XinZhangMS 0:f7f1f0d76dd6 962 if (result == IOTHUB_REGISTRYMANAGER_OK) //only free these if we pass, if we fail, will deal with below
XinZhangMS 0:f7f1f0d76dd6 963 {
XinZhangMS 0:f7f1f0d76dd6 964 free_nonDevice_members_from_deviceOrModule(&iothubDeviceOrModule);
XinZhangMS 0:f7f1f0d76dd6 965 }
XinZhangMS 0:f7f1f0d76dd6 966 }
XinZhangMS 0:f7f1f0d76dd6 967 else //IOTHUB_REGISTRYMANAGER_MODEL_TYPE_MODULE
XinZhangMS 0:f7f1f0d76dd6 968 {
XinZhangMS 0:f7f1f0d76dd6 969 result = addDeviceOrModuleToLinkedListAsModule(&iothubDeviceOrModule, deviceOrModuleList, struct_version);
XinZhangMS 0:f7f1f0d76dd6 970 //no nonModule members to free... yet
XinZhangMS 0:f7f1f0d76dd6 971 }
XinZhangMS 0:f7f1f0d76dd6 972
XinZhangMS 0:f7f1f0d76dd6 973 if (result != IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 974 {
XinZhangMS 0:f7f1f0d76dd6 975 free_deviceOrModule_members(&iothubDeviceOrModule);
XinZhangMS 0:f7f1f0d76dd6 976 }
XinZhangMS 0:f7f1f0d76dd6 977 }
XinZhangMS 0:f7f1f0d76dd6 978 }
XinZhangMS 0:f7f1f0d76dd6 979
XinZhangMS 0:f7f1f0d76dd6 980 if ((device_or_module_object != NULL) && ((jsonStatus = json_object_clear(device_or_module_object)) != JSONSuccess))
XinZhangMS 0:f7f1f0d76dd6 981 {
XinZhangMS 0:f7f1f0d76dd6 982 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_070: [** If any of the parson API fails, IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 983 LogError("json_object_clear failed");
XinZhangMS 0:f7f1f0d76dd6 984 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 985 }
XinZhangMS 0:f7f1f0d76dd6 986 if (result != IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 987 {
XinZhangMS 0:f7f1f0d76dd6 988 break;
XinZhangMS 0:f7f1f0d76dd6 989 }
XinZhangMS 0:f7f1f0d76dd6 990 }
XinZhangMS 0:f7f1f0d76dd6 991 }
XinZhangMS 0:f7f1f0d76dd6 992 }
XinZhangMS 0:f7f1f0d76dd6 993 if (device_or_module_array != NULL)
XinZhangMS 0:f7f1f0d76dd6 994 {
XinZhangMS 0:f7f1f0d76dd6 995 if ((jsonStatus = json_array_clear(device_or_module_array)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 996 {
XinZhangMS 0:f7f1f0d76dd6 997 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_070: [** If any of the parson API fails, IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR **] */
XinZhangMS 0:f7f1f0d76dd6 998 LogError("json_array_clear failed");
XinZhangMS 0:f7f1f0d76dd6 999 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1000 }
XinZhangMS 0:f7f1f0d76dd6 1001 }
XinZhangMS 0:f7f1f0d76dd6 1002
XinZhangMS 0:f7f1f0d76dd6 1003 if (root_value != NULL)
XinZhangMS 0:f7f1f0d76dd6 1004 {
XinZhangMS 0:f7f1f0d76dd6 1005 json_value_free(root_value);
XinZhangMS 0:f7f1f0d76dd6 1006 }
XinZhangMS 0:f7f1f0d76dd6 1007
XinZhangMS 0:f7f1f0d76dd6 1008 if (result != IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 1009 {
XinZhangMS 0:f7f1f0d76dd6 1010 if (deviceOrModuleList != NULL)
XinZhangMS 0:f7f1f0d76dd6 1011 {
XinZhangMS 0:f7f1f0d76dd6 1012 LIST_ITEM_HANDLE itemHandle = singlylinkedlist_get_head_item(deviceOrModuleList);
XinZhangMS 0:f7f1f0d76dd6 1013 while (itemHandle != NULL)
XinZhangMS 0:f7f1f0d76dd6 1014 {
XinZhangMS 0:f7f1f0d76dd6 1015 const void* curr_item = singlylinkedlist_item_get_value(itemHandle);
XinZhangMS 0:f7f1f0d76dd6 1016 if (struct_type == IOTHUB_REGISTRYMANAGER_MODEL_TYPE_DEVICE)
XinZhangMS 0:f7f1f0d76dd6 1017 {
XinZhangMS 0:f7f1f0d76dd6 1018 IOTHUB_DEVICE* deviceInfo = (IOTHUB_DEVICE*)curr_item;
XinZhangMS 0:f7f1f0d76dd6 1019 free_device_members(deviceInfo);
XinZhangMS 0:f7f1f0d76dd6 1020 free(deviceInfo);
XinZhangMS 0:f7f1f0d76dd6 1021 }
XinZhangMS 0:f7f1f0d76dd6 1022 else //IOTHUB_REGISTRYMANAGER_MODEL_TYPE_MODULE
XinZhangMS 0:f7f1f0d76dd6 1023 {
XinZhangMS 0:f7f1f0d76dd6 1024 IOTHUB_MODULE* moduleInfo = (IOTHUB_MODULE*)curr_item;
XinZhangMS 0:f7f1f0d76dd6 1025 IoTHubRegistryManager_FreeModuleMembers(moduleInfo);
XinZhangMS 0:f7f1f0d76dd6 1026 free(moduleInfo);
XinZhangMS 0:f7f1f0d76dd6 1027 }
XinZhangMS 0:f7f1f0d76dd6 1028
XinZhangMS 0:f7f1f0d76dd6 1029 LIST_ITEM_HANDLE lastHandle = itemHandle;
XinZhangMS 0:f7f1f0d76dd6 1030 itemHandle = singlylinkedlist_get_next_item(itemHandle);
XinZhangMS 0:f7f1f0d76dd6 1031 singlylinkedlist_remove(deviceOrModuleList, lastHandle);
XinZhangMS 0:f7f1f0d76dd6 1032 }
XinZhangMS 0:f7f1f0d76dd6 1033 }
XinZhangMS 0:f7f1f0d76dd6 1034 }
XinZhangMS 0:f7f1f0d76dd6 1035 return result;
XinZhangMS 0:f7f1f0d76dd6 1036 }
XinZhangMS 0:f7f1f0d76dd6 1037
XinZhangMS 0:f7f1f0d76dd6 1038 static IOTHUB_REGISTRYMANAGER_RESULT parseStatisticsJson(BUFFER_HANDLE jsonBuffer, IOTHUB_REGISTRY_STATISTICS* registryStatistics)
XinZhangMS 0:f7f1f0d76dd6 1039 {
XinZhangMS 0:f7f1f0d76dd6 1040 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1041
XinZhangMS 0:f7f1f0d76dd6 1042 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_083: [ IoTHubRegistryManager_GetStatistics shall save the registry statistics to the out value and return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1043 if (jsonBuffer == NULL)
XinZhangMS 0:f7f1f0d76dd6 1044 {
XinZhangMS 0:f7f1f0d76dd6 1045 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_082: [ If the parsing failed, IoTHubRegistryManager_GetStatistics shall return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1046 LogError("jsonBuffer cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1047 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1048 }
XinZhangMS 0:f7f1f0d76dd6 1049 else if (registryStatistics == NULL)
XinZhangMS 0:f7f1f0d76dd6 1050 {
XinZhangMS 0:f7f1f0d76dd6 1051 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_082: [ If the parsing failed, IoTHubRegistryManager_GetStatistics shall return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1052 LogError("registryStatistics cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1053 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1054 }
XinZhangMS 0:f7f1f0d76dd6 1055 else
XinZhangMS 0:f7f1f0d76dd6 1056 {
XinZhangMS 0:f7f1f0d76dd6 1057 const char* bufferStr = NULL;
XinZhangMS 0:f7f1f0d76dd6 1058 JSON_Value* root_value = NULL;
XinZhangMS 0:f7f1f0d76dd6 1059 JSON_Object* root_object = NULL;
XinZhangMS 0:f7f1f0d76dd6 1060 JSON_Status jsonStatus;
XinZhangMS 0:f7f1f0d76dd6 1061
XinZhangMS 0:f7f1f0d76dd6 1062 if ((bufferStr = (const char*)BUFFER_u_char(jsonBuffer)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1063 {
XinZhangMS 0:f7f1f0d76dd6 1064 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_082: [ If the parsing failed, IoTHubRegistryManager_GetStatistics shall return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1065 LogError("BUFFER_u_char failed");
XinZhangMS 0:f7f1f0d76dd6 1066 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1067 }
XinZhangMS 0:f7f1f0d76dd6 1068 else if ((root_value = json_parse_string(bufferStr)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1069 {
XinZhangMS 0:f7f1f0d76dd6 1070 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_082: [ If the parsing failed, IoTHubRegistryManager_GetStatistics shall return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1071 LogError("json_parse_string failed");
XinZhangMS 0:f7f1f0d76dd6 1072 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1073 }
XinZhangMS 0:f7f1f0d76dd6 1074 else if ((root_object = json_value_get_object(root_value)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1075 {
XinZhangMS 0:f7f1f0d76dd6 1076 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_082: [ If the parsing failed, IoTHubRegistryManager_GetStatistics shall return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1077 LogError("json_value_get_object failed");
XinZhangMS 0:f7f1f0d76dd6 1078 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1079 }
XinZhangMS 0:f7f1f0d76dd6 1080 else
XinZhangMS 0:f7f1f0d76dd6 1081 {
XinZhangMS 0:f7f1f0d76dd6 1082 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_083: [ IoTHubRegistryManager_GetStatistics shall save the registry statistics to the out value and return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1083 registryStatistics->totalDeviceCount = (size_t)json_object_get_number(root_object, DEVICE_JSON_KEY_TOTAL_DEVICECOUNT);
XinZhangMS 0:f7f1f0d76dd6 1084 registryStatistics->enabledDeviceCount = (size_t)json_object_get_number(root_object, DEVICE_JSON_KEY_ENABLED_DEVICECCOUNT);
XinZhangMS 0:f7f1f0d76dd6 1085 registryStatistics->disabledDeviceCount = (size_t)json_object_get_number(root_object, DEVICE_JSON_KEY_DISABLED_DEVICECOUNT);
XinZhangMS 0:f7f1f0d76dd6 1086
XinZhangMS 0:f7f1f0d76dd6 1087 result = IOTHUB_REGISTRYMANAGER_OK;
XinZhangMS 0:f7f1f0d76dd6 1088 }
XinZhangMS 0:f7f1f0d76dd6 1089
XinZhangMS 0:f7f1f0d76dd6 1090 if ((jsonStatus = json_object_clear(root_object)) != JSONSuccess)
XinZhangMS 0:f7f1f0d76dd6 1091 {
XinZhangMS 0:f7f1f0d76dd6 1092 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_082: [ If the parsing failed, IoTHubRegistryManager_GetStatistics shall return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1093 LogError("json_object_clear failed");
XinZhangMS 0:f7f1f0d76dd6 1094 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1095 }
XinZhangMS 0:f7f1f0d76dd6 1096 json_value_free(root_value);
XinZhangMS 0:f7f1f0d76dd6 1097 }
XinZhangMS 0:f7f1f0d76dd6 1098 return result;
XinZhangMS 0:f7f1f0d76dd6 1099 }
XinZhangMS 0:f7f1f0d76dd6 1100
XinZhangMS 0:f7f1f0d76dd6 1101 static IOTHUB_REGISTRYMANAGER_RESULT createRelativePath(IOTHUB_REQUEST_MODE iotHubRequestMode, const char* deviceName, const char* moduleId, size_t numberOfDevices, char* relativePath)
XinZhangMS 0:f7f1f0d76dd6 1102 {
XinZhangMS 0:f7f1f0d76dd6 1103 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1104
XinZhangMS 0:f7f1f0d76dd6 1105 if ((iotHubRequestMode == IOTHUB_REQUEST_GET_DEVICE_LIST) && (deviceName == NULL))
XinZhangMS 0:f7f1f0d76dd6 1106 {
XinZhangMS 0:f7f1f0d76dd6 1107 if ((numberOfDevices <= 0) || (numberOfDevices > IOTHUB_DEVICES_MAX_REQUEST))
XinZhangMS 0:f7f1f0d76dd6 1108 {
XinZhangMS 0:f7f1f0d76dd6 1109 numberOfDevices = IOTHUB_DEVICES_MAX_REQUEST;
XinZhangMS 0:f7f1f0d76dd6 1110 }
XinZhangMS 0:f7f1f0d76dd6 1111
XinZhangMS 0:f7f1f0d76dd6 1112 char numberStr[256];
XinZhangMS 0:f7f1f0d76dd6 1113 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1114 if (snprintf(numberStr, 256, "%lu", numberOfDevices) > 0)
XinZhangMS 0:f7f1f0d76dd6 1115 {
XinZhangMS 0:f7f1f0d76dd6 1116 if (snprintf(relativePath, 256, RELATIVE_PATH_FMT_LIST, numberStr, URL_API_VERSION) > 0)
XinZhangMS 0:f7f1f0d76dd6 1117 {
XinZhangMS 0:f7f1f0d76dd6 1118 result = IOTHUB_REGISTRYMANAGER_OK;
XinZhangMS 0:f7f1f0d76dd6 1119 }
XinZhangMS 0:f7f1f0d76dd6 1120 else
XinZhangMS 0:f7f1f0d76dd6 1121 {
XinZhangMS 0:f7f1f0d76dd6 1122 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1123 }
XinZhangMS 0:f7f1f0d76dd6 1124 }
XinZhangMS 0:f7f1f0d76dd6 1125 else
XinZhangMS 0:f7f1f0d76dd6 1126 {
XinZhangMS 0:f7f1f0d76dd6 1127 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1128 }
XinZhangMS 0:f7f1f0d76dd6 1129 }
XinZhangMS 0:f7f1f0d76dd6 1130 else if ((iotHubRequestMode == IOTHUB_REQUEST_GET_DEVICE_LIST) && (deviceName != NULL))
XinZhangMS 0:f7f1f0d76dd6 1131 {
XinZhangMS 0:f7f1f0d76dd6 1132 if (snprintf(relativePath, 256, RELATIVE_PATH_FMT_MODULE_LIST, deviceName, URL_API_VERSION))
XinZhangMS 0:f7f1f0d76dd6 1133 {
XinZhangMS 0:f7f1f0d76dd6 1134 result = IOTHUB_REGISTRYMANAGER_OK;
XinZhangMS 0:f7f1f0d76dd6 1135 }
XinZhangMS 0:f7f1f0d76dd6 1136 else
XinZhangMS 0:f7f1f0d76dd6 1137 {
XinZhangMS 0:f7f1f0d76dd6 1138 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1139 }
XinZhangMS 0:f7f1f0d76dd6 1140 }
XinZhangMS 0:f7f1f0d76dd6 1141 else if (iotHubRequestMode == IOTHUB_REQUEST_GET_STATISTICS)
XinZhangMS 0:f7f1f0d76dd6 1142 {
XinZhangMS 0:f7f1f0d76dd6 1143 if (snprintf(relativePath, 256, RELATIVE_PATH_FMT_STAT, URL_API_VERSION) > 0)
XinZhangMS 0:f7f1f0d76dd6 1144 {
XinZhangMS 0:f7f1f0d76dd6 1145 result = IOTHUB_REGISTRYMANAGER_OK;
XinZhangMS 0:f7f1f0d76dd6 1146 }
XinZhangMS 0:f7f1f0d76dd6 1147 else
XinZhangMS 0:f7f1f0d76dd6 1148 {
XinZhangMS 0:f7f1f0d76dd6 1149 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1150 }
XinZhangMS 0:f7f1f0d76dd6 1151 }
XinZhangMS 0:f7f1f0d76dd6 1152 else
XinZhangMS 0:f7f1f0d76dd6 1153 {
XinZhangMS 0:f7f1f0d76dd6 1154 if (moduleId != NULL)
XinZhangMS 0:f7f1f0d76dd6 1155 {
XinZhangMS 0:f7f1f0d76dd6 1156 result = (snprintf(relativePath, 256, RELATIVE_PATH_MODULE_FMT_CRUD, deviceName, moduleId, URL_API_VERSION)) > 0 ? IOTHUB_REGISTRYMANAGER_OK : IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1157 }
XinZhangMS 0:f7f1f0d76dd6 1158 else
XinZhangMS 0:f7f1f0d76dd6 1159 {
XinZhangMS 0:f7f1f0d76dd6 1160 result = (snprintf(relativePath, 256, RELATIVE_PATH_FMT_CRUD, deviceName, URL_API_VERSION) > 0) ? IOTHUB_REGISTRYMANAGER_OK : IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1161 }
XinZhangMS 0:f7f1f0d76dd6 1162 }
XinZhangMS 0:f7f1f0d76dd6 1163
XinZhangMS 0:f7f1f0d76dd6 1164 return result;
XinZhangMS 0:f7f1f0d76dd6 1165 }
XinZhangMS 0:f7f1f0d76dd6 1166
XinZhangMS 0:f7f1f0d76dd6 1167 static HTTP_HEADERS_HANDLE createHttpHeader(IOTHUB_REQUEST_MODE iotHubRequestMode)
XinZhangMS 0:f7f1f0d76dd6 1168 {
XinZhangMS 0:f7f1f0d76dd6 1169 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_015: [ IoTHubRegistryManager_CreateDevice shall create an HTTP PUT request using the following HTTP headers: authorization=sasToken,Request-Id=1001,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1170 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_027: [ IoTHubRegistryManager_GetDevice shall add the following headers to the created HTTP GET request: authorization=sasToken,Request-Id=1001,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1171 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_054: [ IoTHubRegistryManager_DeleteDevice shall add the following headers to the created HTTP GET request : authorization = sasToken, Request - Id = 1001, Accept = application / json, Content - Type = application / json, charset = utf - 8 ] */
XinZhangMS 0:f7f1f0d76dd6 1172 HTTP_HEADERS_HANDLE httpHeader;
XinZhangMS 0:f7f1f0d76dd6 1173
XinZhangMS 0:f7f1f0d76dd6 1174 if ((httpHeader = HTTPHeaders_Alloc()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1175 {
XinZhangMS 0:f7f1f0d76dd6 1176 LogError("HTTPHeaders_Alloc failed");
XinZhangMS 0:f7f1f0d76dd6 1177 }
XinZhangMS 0:f7f1f0d76dd6 1178 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_AUTHORIZATION, HTTP_HEADER_VAL_AUTHORIZATION) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 1179 {
XinZhangMS 0:f7f1f0d76dd6 1180 LogError("HTTPHeaders_AddHeaderNameValuePair failed for Authorization header");
XinZhangMS 0:f7f1f0d76dd6 1181 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 1182 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 1183 }
XinZhangMS 0:f7f1f0d76dd6 1184 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_REQUEST_ID, HTTP_HEADER_VAL_REQUEST_ID) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 1185 {
XinZhangMS 0:f7f1f0d76dd6 1186 LogError("HTTPHeaders_AddHeaderNameValuePair failed for RequestId header");
XinZhangMS 0:f7f1f0d76dd6 1187 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 1188 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 1189 }
XinZhangMS 0:f7f1f0d76dd6 1190 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_USER_AGENT, HTTP_HEADER_VAL_USER_AGENT) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 1191 {
XinZhangMS 0:f7f1f0d76dd6 1192 LogError("HTTPHeaders_AddHeaderNameValuePair failed for User-Agent header");
XinZhangMS 0:f7f1f0d76dd6 1193 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 1194 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 1195 }
XinZhangMS 0:f7f1f0d76dd6 1196 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_ACCEPT, HTTP_HEADER_VAL_ACCEPT) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 1197 {
XinZhangMS 0:f7f1f0d76dd6 1198 LogError("HTTPHeaders_AddHeaderNameValuePair failed for Accept header");
XinZhangMS 0:f7f1f0d76dd6 1199 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 1200 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 1201 }
XinZhangMS 0:f7f1f0d76dd6 1202 else if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_CONTENT_TYPE, HTTP_HEADER_VAL_CONTENT_TYPE) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 1203 {
XinZhangMS 0:f7f1f0d76dd6 1204 LogError("HTTPHeaders_AddHeaderNameValuePair failed for Content-Type header");
XinZhangMS 0:f7f1f0d76dd6 1205 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 1206 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 1207 }
XinZhangMS 0:f7f1f0d76dd6 1208
XinZhangMS 0:f7f1f0d76dd6 1209 if ((iotHubRequestMode == IOTHUB_REQUEST_DELETE) || (iotHubRequestMode == IOTHUB_REQUEST_UPDATE))
XinZhangMS 0:f7f1f0d76dd6 1210 {
XinZhangMS 0:f7f1f0d76dd6 1211 if (HTTPHeaders_AddHeaderNameValuePair(httpHeader, HTTP_HEADER_KEY_IFMATCH, HTTP_HEADER_VAL_IFMATCH) != HTTP_HEADERS_OK)
XinZhangMS 0:f7f1f0d76dd6 1212 {
XinZhangMS 0:f7f1f0d76dd6 1213 LogError("HTTPHeaders_AddHeaderNameValuePair failed for If-Match header");
XinZhangMS 0:f7f1f0d76dd6 1214 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 1215 httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 1216 }
XinZhangMS 0:f7f1f0d76dd6 1217
XinZhangMS 0:f7f1f0d76dd6 1218 }
XinZhangMS 0:f7f1f0d76dd6 1219 return httpHeader;
XinZhangMS 0:f7f1f0d76dd6 1220 }
XinZhangMS 0:f7f1f0d76dd6 1221
XinZhangMS 0:f7f1f0d76dd6 1222 static STRING_HANDLE createUriPath(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle)
XinZhangMS 0:f7f1f0d76dd6 1223 {
XinZhangMS 0:f7f1f0d76dd6 1224 if (registryManagerHandle->deviceId != NULL)
XinZhangMS 0:f7f1f0d76dd6 1225 {
XinZhangMS 0:f7f1f0d76dd6 1226 return STRING_construct_sprintf("%s%%2Fdevices%%2F%s", registryManagerHandle->hostname, registryManagerHandle->deviceId);
XinZhangMS 0:f7f1f0d76dd6 1227 }
XinZhangMS 0:f7f1f0d76dd6 1228 else
XinZhangMS 0:f7f1f0d76dd6 1229 {
XinZhangMS 0:f7f1f0d76dd6 1230 return STRING_construct(registryManagerHandle->hostname);
XinZhangMS 0:f7f1f0d76dd6 1231 }
XinZhangMS 0:f7f1f0d76dd6 1232 }
XinZhangMS 0:f7f1f0d76dd6 1233
XinZhangMS 0:f7f1f0d76dd6 1234 static IOTHUB_REGISTRYMANAGER_RESULT sendHttpRequestCRUD(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, IOTHUB_REQUEST_MODE iotHubRequestMode, const char* deviceName, const char* moduleId, BUFFER_HANDLE deviceJsonBuffer, size_t numberOfDevices, BUFFER_HANDLE responseBuffer)
XinZhangMS 0:f7f1f0d76dd6 1235 {
XinZhangMS 0:f7f1f0d76dd6 1236 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1237
XinZhangMS 0:f7f1f0d76dd6 1238 STRING_HANDLE uriResource = NULL;
XinZhangMS 0:f7f1f0d76dd6 1239 STRING_HANDLE accessKey = NULL;
XinZhangMS 0:f7f1f0d76dd6 1240 STRING_HANDLE keyName = NULL;
XinZhangMS 0:f7f1f0d76dd6 1241 HTTPAPIEX_SAS_HANDLE httpExApiSasHandle = NULL;
XinZhangMS 0:f7f1f0d76dd6 1242 HTTPAPIEX_HANDLE httpExApiHandle = NULL;
XinZhangMS 0:f7f1f0d76dd6 1243 HTTP_HEADERS_HANDLE httpHeader = NULL;
XinZhangMS 0:f7f1f0d76dd6 1244
XinZhangMS 0:f7f1f0d76dd6 1245 if ((uriResource = createUriPath(registryManagerHandle)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1246 {
XinZhangMS 0:f7f1f0d76dd6 1247 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_099: [ If any of the call fails during the HTTP creation IoTHubRegistryManager_CreateDevice shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1248 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_103: [ If any of the call fails during the HTTP creation IoTHubRegistryManager_UpdateDevice shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1249 LogError("STRING_construct failed for uriResource");
XinZhangMS 0:f7f1f0d76dd6 1250 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1251 }
XinZhangMS 0:f7f1f0d76dd6 1252 else if ((accessKey = STRING_construct(registryManagerHandle->sharedAccessKey)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1253 {
XinZhangMS 0:f7f1f0d76dd6 1254 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_099: [ If any of the call fails during the HTTP creation IoTHubRegistryManager_CreateDevice shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1255 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_103: [ If any of the call fails during the HTTP creation IoTHubRegistryManager_UpdateDevice shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1256 LogError("STRING_construct failed for accessKey");
XinZhangMS 0:f7f1f0d76dd6 1257 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1258 }
XinZhangMS 0:f7f1f0d76dd6 1259 else if ((registryManagerHandle->keyName != NULL) && ((keyName = STRING_construct(registryManagerHandle->keyName)) == NULL))
XinZhangMS 0:f7f1f0d76dd6 1260 {
XinZhangMS 0:f7f1f0d76dd6 1261 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_099: [ If any of the call fails during the HTTP creation IoTHubRegistryManager_CreateDevice shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1262 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_103: [ If any of the call fails during the HTTP creation IoTHubRegistryManager_UpdateDevice shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1263 LogError("STRING_construct failed for keyName");
XinZhangMS 0:f7f1f0d76dd6 1264 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1265 }
XinZhangMS 0:f7f1f0d76dd6 1266 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_015: [ IoTHubRegistryManager_CreateDevice shall create an HTTP PUT request using the following HTTP headers: authorization=sasToken,Request-Id=1001,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1267 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_027: [ IoTHubRegistryManager_GetDevice shall add the following headers to the created HTTP GET request: authorization=sasToken,Request-Id=1001,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1268 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_043: [ IoTHubRegistryManager_UpdateDevice shall create an HTTP PUT request using the created JSON ] */
XinZhangMS 0:f7f1f0d76dd6 1269 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_044: [ IoTHubRegistryManager_UpdateDevice shall create an HTTP PUT request using the createdfollowing HTTP headers : authorization = sasToken, Request - Id = 1001, Accept = application / json, Content - Type = application / json, charset = utf - 8 ] */
XinZhangMS 0:f7f1f0d76dd6 1270 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_054: [ IoTHubRegistryManager_DeleteDevice shall add the following headers to the created HTTP GET request : authorization=sasToken, Request-Id=1001, Accept=application/json, Content-Type=application/json, charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1271 else if ((httpHeader = createHttpHeader(iotHubRequestMode)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1272 {
XinZhangMS 0:f7f1f0d76dd6 1273 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_019: [ If any of the HTTPAPI call fails IoTHubRegistryManager_CreateDevice shall fail and return IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1274 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_104: [ If any of the HTTPAPI call fails IoTHubRegistryManager_UpdateDevice shall fail and return IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1275 LogError("HttpHeader creation failed");
XinZhangMS 0:f7f1f0d76dd6 1276 result = IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1277 }
XinZhangMS 0:f7f1f0d76dd6 1278 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_016: [ IoTHubRegistryManager_CreateDevice shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1279 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_028: [ IoTHubRegistryManager_GetDevice shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1280 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_045: [ IoTHubRegistryManager_UpdateDevice shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1281 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_055: [ IoTHubRegistryManager_DeleteDevice shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1282 else if ((httpExApiSasHandle = HTTPAPIEX_SAS_Create(accessKey, uriResource, keyName)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1283 {
XinZhangMS 0:f7f1f0d76dd6 1284 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_019: [ If any of the HTTPAPI call fails IoTHubRegistryManager_CreateDevice shall fail and return IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1285 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_104: [ If any of the HTTPAPI call fails IoTHubRegistryManager_UpdateDevice shall fail and return IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1286 LogError("HTTPAPIEX_SAS_Create failed");
XinZhangMS 0:f7f1f0d76dd6 1287 result = IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1288 }
XinZhangMS 0:f7f1f0d76dd6 1289 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_017: [ IoTHubRegistryManager_CreateDevice shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1290 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_029: [ IoTHubRegistryManager_GetDevice shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1291 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_046: [ IoTHubRegistryManager_UpdateDevice shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1292 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_056: [ IoTHubRegistryManager_DeleteDevice shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1293 else if ((httpExApiHandle = HTTPAPIEX_Create(registryManagerHandle->hostname)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1294 {
XinZhangMS 0:f7f1f0d76dd6 1295 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_019: [ If any of the HTTPAPI call fails IoTHubRegistryManager_CreateDevice shall fail and return IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1296 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_104: [ If any of the HTTPAPI call fails IoTHubRegistryManager_UpdateDevice shall fail and return IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1297 LogError("HTTPAPIEX_Create failed");
XinZhangMS 0:f7f1f0d76dd6 1298 result = IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1299 }
XinZhangMS 0:f7f1f0d76dd6 1300 else
XinZhangMS 0:f7f1f0d76dd6 1301 {
XinZhangMS 0:f7f1f0d76dd6 1302 HTTPAPI_REQUEST_TYPE httpApiRequestType = HTTPAPI_REQUEST_GET;
XinZhangMS 0:f7f1f0d76dd6 1303 char relativePath[256];
XinZhangMS 0:f7f1f0d76dd6 1304 unsigned int statusCode;
XinZhangMS 0:f7f1f0d76dd6 1305 unsigned char is_error = 0;
XinZhangMS 0:f7f1f0d76dd6 1306
XinZhangMS 0:f7f1f0d76dd6 1307 if ((iotHubRequestMode == IOTHUB_REQUEST_CREATE) || (iotHubRequestMode == IOTHUB_REQUEST_UPDATE))
XinZhangMS 0:f7f1f0d76dd6 1308 {
XinZhangMS 0:f7f1f0d76dd6 1309 httpApiRequestType = HTTPAPI_REQUEST_PUT;
XinZhangMS 0:f7f1f0d76dd6 1310 }
XinZhangMS 0:f7f1f0d76dd6 1311 else if (iotHubRequestMode == IOTHUB_REQUEST_DELETE)
XinZhangMS 0:f7f1f0d76dd6 1312 {
XinZhangMS 0:f7f1f0d76dd6 1313 httpApiRequestType = HTTPAPI_REQUEST_DELETE;
XinZhangMS 0:f7f1f0d76dd6 1314 }
XinZhangMS 0:f7f1f0d76dd6 1315 else if ((iotHubRequestMode == IOTHUB_REQUEST_GET) || (iotHubRequestMode == IOTHUB_REQUEST_GET_DEVICE_LIST) || (iotHubRequestMode == IOTHUB_REQUEST_GET_STATISTICS))
XinZhangMS 0:f7f1f0d76dd6 1316 {
XinZhangMS 0:f7f1f0d76dd6 1317 httpApiRequestType = HTTPAPI_REQUEST_GET;
XinZhangMS 0:f7f1f0d76dd6 1318 }
XinZhangMS 0:f7f1f0d76dd6 1319 else
XinZhangMS 0:f7f1f0d76dd6 1320 {
XinZhangMS 0:f7f1f0d76dd6 1321 is_error = 1;
XinZhangMS 0:f7f1f0d76dd6 1322 }
XinZhangMS 0:f7f1f0d76dd6 1323
XinZhangMS 0:f7f1f0d76dd6 1324 if (is_error)
XinZhangMS 0:f7f1f0d76dd6 1325 {
XinZhangMS 0:f7f1f0d76dd6 1326 LogError("Invalid request type");
XinZhangMS 0:f7f1f0d76dd6 1327 result = IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1328 }
XinZhangMS 0:f7f1f0d76dd6 1329 else
XinZhangMS 0:f7f1f0d76dd6 1330 {
XinZhangMS 0:f7f1f0d76dd6 1331 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_026: [ IoTHubRegistryManager_GetDevice shall create HTTP GET request URL using the given deviceId using the following format: url/devices/[deviceId]?api-version=2017-06-30 ] */
XinZhangMS 0:f7f1f0d76dd6 1332 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_053: [ IoTHubRegistryManager_DeleteDevice shall create HTTP DELETE request URL using the given deviceId using the following format : url/devices/[deviceId]?api-version ] */
XinZhangMS 0:f7f1f0d76dd6 1333 if (createRelativePath(iotHubRequestMode, deviceName, moduleId, numberOfDevices, relativePath) != IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 1334 {
XinZhangMS 0:f7f1f0d76dd6 1335 LogError("Failure creating relative path");
XinZhangMS 0:f7f1f0d76dd6 1336 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1337 }
XinZhangMS 0:f7f1f0d76dd6 1338 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_014: [ IoTHubRegistryManager_CreateDevice shall create an HTTP PUT request using the created JSON ] */
XinZhangMS 0:f7f1f0d76dd6 1339 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_018: [ IoTHubRegistryManager_CreateDevice shall execute the HTTP PUT request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1340 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_030: [ IoTHubRegistryManager_GetDevice shall execute the HTTP GET request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1341 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_047: [ IoTHubRegistryManager_UpdateDevice shall execute the HTTP PUT request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1342 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_057: [ IoTHubRegistryManager_DeleteDevice shall execute the HTTP DELETE request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1343 else if (HTTPAPIEX_SAS_ExecuteRequest(httpExApiSasHandle, httpExApiHandle, httpApiRequestType, relativePath, httpHeader, deviceJsonBuffer, &statusCode, NULL, responseBuffer) != HTTPAPIEX_OK)
XinZhangMS 0:f7f1f0d76dd6 1344 {
XinZhangMS 0:f7f1f0d76dd6 1345 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_019: [ If any of the HTTPAPI call fails IoTHubRegistryManager_CreateDevice shall fail and return IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1346 LogError("HTTPAPIEX_SAS_ExecuteRequest failed");
XinZhangMS 0:f7f1f0d76dd6 1347 result = IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1348 }
XinZhangMS 0:f7f1f0d76dd6 1349 else
XinZhangMS 0:f7f1f0d76dd6 1350 {
XinZhangMS 0:f7f1f0d76dd6 1351 if (statusCode > 300)
XinZhangMS 0:f7f1f0d76dd6 1352 {
XinZhangMS 0:f7f1f0d76dd6 1353 if ((iotHubRequestMode == IOTHUB_REQUEST_CREATE) && (statusCode == 409))
XinZhangMS 0:f7f1f0d76dd6 1354 {
XinZhangMS 0:f7f1f0d76dd6 1355 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_020: [ IoTHubRegistryManager_CreateDevice shall verify the received HTTP status code and if it is 409 then return IOTHUB_REGISTRYMANAGER_DEVICE_EXIST ] */
XinZhangMS 0:f7f1f0d76dd6 1356 result = IOTHUB_REGISTRYMANAGER_DEVICE_EXIST;
XinZhangMS 0:f7f1f0d76dd6 1357 }
XinZhangMS 0:f7f1f0d76dd6 1358 else if ((iotHubRequestMode == IOTHUB_REQUEST_GET) && (statusCode == 404))
XinZhangMS 0:f7f1f0d76dd6 1359 {
XinZhangMS 0:f7f1f0d76dd6 1360 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_020: [ IoTHubRegistryManager_CreateDevice shall verify the received HTTP status code and if it is 404 then return IOTHUB_REGISTRYMANAGER_DEVICE_NOT_EXIST ] */
XinZhangMS 0:f7f1f0d76dd6 1361 result = IOTHUB_REGISTRYMANAGER_DEVICE_NOT_EXIST;
XinZhangMS 0:f7f1f0d76dd6 1362 }
XinZhangMS 0:f7f1f0d76dd6 1363 else
XinZhangMS 0:f7f1f0d76dd6 1364 {
XinZhangMS 0:f7f1f0d76dd6 1365 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_021: [ IoTHubRegistryManager_CreateDevice shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_REGISTRYMANAGER_HTTP_STATUS_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1366 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_032: [ IoTHubRegistryManager_GetDevice shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1367 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_058: [ IoTHubRegistryManager_DeleteDevice shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_REGISTRYMANAGER_HTTP_STATUS_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1368 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_048: [ IoTHubRegistryManager_UpdateDevice shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1369 LogError("Http Failure status code %d.", statusCode);
XinZhangMS 0:f7f1f0d76dd6 1370 result = IOTHUB_REGISTRYMANAGER_HTTP_STATUS_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1371 }
XinZhangMS 0:f7f1f0d76dd6 1372 }
XinZhangMS 0:f7f1f0d76dd6 1373 else
XinZhangMS 0:f7f1f0d76dd6 1374 {
XinZhangMS 0:f7f1f0d76dd6 1375 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_022: [ IoTHubRegistryManager_CreateDevice shall verify the received HTTP status code and if it is less or equal than 300 then try to parse the response JSON to deviceInfo ] */
XinZhangMS 0:f7f1f0d76dd6 1376 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_059: [ IoTHubRegistryManager_DeleteDevice shall verify the received HTTP status code and if it is less or equal than 300 then return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1377 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_049: [ IoTHubRegistryManager_UpdateDevice shall verify the received HTTP status code and if it is less or equal than 300 then return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1378 result = IOTHUB_REGISTRYMANAGER_OK;
XinZhangMS 0:f7f1f0d76dd6 1379 }
XinZhangMS 0:f7f1f0d76dd6 1380 }
XinZhangMS 0:f7f1f0d76dd6 1381 }
XinZhangMS 0:f7f1f0d76dd6 1382 }
XinZhangMS 0:f7f1f0d76dd6 1383
XinZhangMS 0:f7f1f0d76dd6 1384 HTTPHeaders_Free(httpHeader);
XinZhangMS 0:f7f1f0d76dd6 1385 HTTPAPIEX_Destroy(httpExApiHandle);
XinZhangMS 0:f7f1f0d76dd6 1386 HTTPAPIEX_SAS_Destroy(httpExApiSasHandle);
XinZhangMS 0:f7f1f0d76dd6 1387 STRING_delete(keyName);
XinZhangMS 0:f7f1f0d76dd6 1388 STRING_delete(accessKey);
XinZhangMS 0:f7f1f0d76dd6 1389 STRING_delete(uriResource);
XinZhangMS 0:f7f1f0d76dd6 1390 return result;
XinZhangMS 0:f7f1f0d76dd6 1391 }
XinZhangMS 0:f7f1f0d76dd6 1392
XinZhangMS 0:f7f1f0d76dd6 1393 static void free_registrymanager_handle(IOTHUB_REGISTRYMANAGER *registryManager)
XinZhangMS 0:f7f1f0d76dd6 1394 {
XinZhangMS 0:f7f1f0d76dd6 1395 free(registryManager->hostname);
XinZhangMS 0:f7f1f0d76dd6 1396 free(registryManager->iothubName);
XinZhangMS 0:f7f1f0d76dd6 1397 free(registryManager->iothubSuffix);
XinZhangMS 0:f7f1f0d76dd6 1398 free(registryManager->sharedAccessKey);
XinZhangMS 0:f7f1f0d76dd6 1399 free(registryManager->deviceId);
XinZhangMS 0:f7f1f0d76dd6 1400 free(registryManager);
XinZhangMS 0:f7f1f0d76dd6 1401 }
XinZhangMS 0:f7f1f0d76dd6 1402
XinZhangMS 0:f7f1f0d76dd6 1403 IOTHUB_REGISTRYMANAGER_HANDLE IoTHubRegistryManager_Create(IOTHUB_SERVICE_CLIENT_AUTH_HANDLE serviceClientHandle)
XinZhangMS 0:f7f1f0d76dd6 1404 {
XinZhangMS 0:f7f1f0d76dd6 1405 IOTHUB_REGISTRYMANAGER_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 1406
XinZhangMS 0:f7f1f0d76dd6 1407 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_001: [ If the serviceClientHandle input parameter is NULL IoTHubRegistryManager_Create shall return NULL ] */
XinZhangMS 0:f7f1f0d76dd6 1408 if (serviceClientHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 1409 {
XinZhangMS 0:f7f1f0d76dd6 1410 LogError("serviceClientHandle input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1411 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1412 }
XinZhangMS 0:f7f1f0d76dd6 1413 else
XinZhangMS 0:f7f1f0d76dd6 1414 {
XinZhangMS 0:f7f1f0d76dd6 1415 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_084: [ If any member of the serviceClientHandle input parameter is NULL IoTHubRegistryManager_Create shall return NULL ] */
XinZhangMS 0:f7f1f0d76dd6 1416 IOTHUB_SERVICE_CLIENT_AUTH* serviceClientAuth = (IOTHUB_SERVICE_CLIENT_AUTH*)serviceClientHandle;
XinZhangMS 0:f7f1f0d76dd6 1417
XinZhangMS 0:f7f1f0d76dd6 1418 if (serviceClientAuth->hostname == NULL)
XinZhangMS 0:f7f1f0d76dd6 1419 {
XinZhangMS 0:f7f1f0d76dd6 1420 LogError("authInfo->hostName input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1421 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1422 }
XinZhangMS 0:f7f1f0d76dd6 1423 else if (serviceClientAuth->iothubName == NULL)
XinZhangMS 0:f7f1f0d76dd6 1424 {
XinZhangMS 0:f7f1f0d76dd6 1425 LogError("authInfo->iothubName input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1426 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1427 }
XinZhangMS 0:f7f1f0d76dd6 1428 else if (serviceClientAuth->iothubSuffix == NULL)
XinZhangMS 0:f7f1f0d76dd6 1429 {
XinZhangMS 0:f7f1f0d76dd6 1430 LogError("authInfo->iothubSuffix input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1431 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1432 }
XinZhangMS 0:f7f1f0d76dd6 1433 else if ((serviceClientAuth->keyName == NULL) && (serviceClientAuth->deviceId == NULL))
XinZhangMS 0:f7f1f0d76dd6 1434 {
XinZhangMS 0:f7f1f0d76dd6 1435 LogError("authInfo->keyName and authInfo->deviceId input parameter cannot both be NULL");
XinZhangMS 0:f7f1f0d76dd6 1436 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1437 }
XinZhangMS 0:f7f1f0d76dd6 1438 else if (serviceClientAuth->sharedAccessKey == NULL)
XinZhangMS 0:f7f1f0d76dd6 1439 {
XinZhangMS 0:f7f1f0d76dd6 1440 LogError("authInfo->sharedAccessKey input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1441 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1442 }
XinZhangMS 0:f7f1f0d76dd6 1443 else
XinZhangMS 0:f7f1f0d76dd6 1444 {
XinZhangMS 0:f7f1f0d76dd6 1445 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_002: [ IoTHubRegistryManager_Create shall allocate memory for a new registry manager instance ] */
XinZhangMS 0:f7f1f0d76dd6 1446 result = malloc(sizeof(IOTHUB_REGISTRYMANAGER));
XinZhangMS 0:f7f1f0d76dd6 1447 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 1448 {
XinZhangMS 0:f7f1f0d76dd6 1449 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_003: [ If the allocation failed, IoTHubRegistryManager_Create shall return NULL ] */
XinZhangMS 0:f7f1f0d76dd6 1450 LogError("Malloc failed for IOTHUB_REGISTRYMANAGER");
XinZhangMS 0:f7f1f0d76dd6 1451 }
XinZhangMS 0:f7f1f0d76dd6 1452 else
XinZhangMS 0:f7f1f0d76dd6 1453 {
XinZhangMS 0:f7f1f0d76dd6 1454 memset(result, 0, sizeof(IOTHUB_REGISTRYMANAGER));
XinZhangMS 0:f7f1f0d76dd6 1455
XinZhangMS 0:f7f1f0d76dd6 1456 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_004: [ If the allocation successful, IoTHubRegistryManager_Create shall create a IOTHUB_REGISTRYMANAGER_HANDLE from the given IOTHUB_REGISTRYMANAGER_AUTH_HANDLE and return with it ] */
XinZhangMS 0:f7f1f0d76dd6 1457 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_085: [ IoTHubRegistryManager_Create shall allocate memory and copy hostName to result->hostName by calling mallocAndStrcpy_s. ] */
XinZhangMS 0:f7f1f0d76dd6 1458 if (mallocAndStrcpy_s(&result->hostname, serviceClientAuth->hostname) != 0)
XinZhangMS 0:f7f1f0d76dd6 1459 {
XinZhangMS 0:f7f1f0d76dd6 1460 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_086: [ If the mallocAndStrcpy_s fails, IoTHubRegistryManager_Create shall do clean up and return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 1461 LogError("mallocAndStrcpy_s failed for hostName");
XinZhangMS 0:f7f1f0d76dd6 1462 free_registrymanager_handle(result);
XinZhangMS 0:f7f1f0d76dd6 1463 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1464 }
XinZhangMS 0:f7f1f0d76dd6 1465 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_087: [ IoTHubRegistryManager_Create shall allocate memory and copy iothubName to result->iothubName by calling mallocAndStrcpy_s. ] */
XinZhangMS 0:f7f1f0d76dd6 1466 else if (mallocAndStrcpy_s(&result->iothubName, serviceClientAuth->iothubName) != 0)
XinZhangMS 0:f7f1f0d76dd6 1467 {
XinZhangMS 0:f7f1f0d76dd6 1468 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_088: [ If the mallocAndStrcpy_s fails, IoTHubRegistryManager_Create shall do clean up and return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 1469 LogError("mallocAndStrcpy_s failed for iothubName");
XinZhangMS 0:f7f1f0d76dd6 1470 free_registrymanager_handle(result);
XinZhangMS 0:f7f1f0d76dd6 1471 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1472 }
XinZhangMS 0:f7f1f0d76dd6 1473 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_089: [ IoTHubRegistryManager_Create shall allocate memory and copy iothubSuffix to result->iothubSuffix by calling mallocAndStrcpy_s. ] */
XinZhangMS 0:f7f1f0d76dd6 1474 else if (mallocAndStrcpy_s(&result->iothubSuffix, serviceClientAuth->iothubSuffix) != 0)
XinZhangMS 0:f7f1f0d76dd6 1475 {
XinZhangMS 0:f7f1f0d76dd6 1476 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_090: [ If the mallocAndStrcpy_s fails, IoTHubRegistryManager_Create shall do clean up and return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 1477 LogError("mallocAndStrcpy_s failed for iothubSuffix");
XinZhangMS 0:f7f1f0d76dd6 1478 free_registrymanager_handle(result);
XinZhangMS 0:f7f1f0d76dd6 1479 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1480 }
XinZhangMS 0:f7f1f0d76dd6 1481 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_091: [ IoTHubRegistryManager_Create shall allocate memory and copy sharedAccessKey to result->sharedAccessKey by calling mallocAndStrcpy_s. ] */
XinZhangMS 0:f7f1f0d76dd6 1482 else if (mallocAndStrcpy_s(&result->sharedAccessKey, serviceClientAuth->sharedAccessKey) != 0)
XinZhangMS 0:f7f1f0d76dd6 1483 {
XinZhangMS 0:f7f1f0d76dd6 1484 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_092: [ If the mallocAndStrcpy_s fails, IoTHubRegistryManager_Create shall do clean up and return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 1485 LogError("mallocAndStrcpy_s failed for sharedAccessKey");
XinZhangMS 0:f7f1f0d76dd6 1486 free_registrymanager_handle(result);
XinZhangMS 0:f7f1f0d76dd6 1487 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1488 }
XinZhangMS 0:f7f1f0d76dd6 1489 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_093: [ IoTHubRegistryManager_Create shall allocate memory and copy keyName to result->keyName by calling mallocAndStrcpy_s. ] */
XinZhangMS 0:f7f1f0d76dd6 1490 else if ((serviceClientAuth->keyName != NULL) && (mallocAndStrcpy_s(&result->keyName, serviceClientAuth->keyName) != 0))
XinZhangMS 0:f7f1f0d76dd6 1491 {
XinZhangMS 0:f7f1f0d76dd6 1492 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_094: [ If the mallocAndStrcpy_s fails, IoTHubRegistryManager_Create shall do clean up and return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 1493 LogError("mallocAndStrcpy_s failed for keyName");
XinZhangMS 0:f7f1f0d76dd6 1494 free_registrymanager_handle(result);
XinZhangMS 0:f7f1f0d76dd6 1495 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1496 }
XinZhangMS 0:f7f1f0d76dd6 1497 else if ((serviceClientAuth->deviceId != NULL) && (mallocAndStrcpy_s(&result->deviceId, serviceClientAuth->deviceId) != 0))
XinZhangMS 0:f7f1f0d76dd6 1498 {
XinZhangMS 0:f7f1f0d76dd6 1499 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_094: [ If the mallocAndStrcpy_s fails, IoTHubRegistryManager_Create shall do clean up and return NULL. ] */
XinZhangMS 0:f7f1f0d76dd6 1500 LogError("mallocAndStrcpy_s failed for deviceId");
XinZhangMS 0:f7f1f0d76dd6 1501 free_registrymanager_handle(result);
XinZhangMS 0:f7f1f0d76dd6 1502 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 1503 }
XinZhangMS 0:f7f1f0d76dd6 1504 }
XinZhangMS 0:f7f1f0d76dd6 1505 }
XinZhangMS 0:f7f1f0d76dd6 1506 }
XinZhangMS 0:f7f1f0d76dd6 1507 return result;
XinZhangMS 0:f7f1f0d76dd6 1508 }
XinZhangMS 0:f7f1f0d76dd6 1509
XinZhangMS 0:f7f1f0d76dd6 1510 void IoTHubRegistryManager_Destroy(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle)
XinZhangMS 0:f7f1f0d76dd6 1511 {
XinZhangMS 0:f7f1f0d76dd6 1512 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_005: [ If the registryManagerHandle input parameter is NULL IoTHubRegistryManager_Destroy shall return ] */
XinZhangMS 0:f7f1f0d76dd6 1513 if (registryManagerHandle != NULL)
XinZhangMS 0:f7f1f0d76dd6 1514 {
XinZhangMS 0:f7f1f0d76dd6 1515 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_006 : [ If the registryManagerHandle input parameter is not NULL IoTHubRegistryManager_Destroy shall free the memory of it and return ] */
XinZhangMS 0:f7f1f0d76dd6 1516 IOTHUB_REGISTRYMANAGER* regManHandle = (IOTHUB_REGISTRYMANAGER*)registryManagerHandle;
XinZhangMS 0:f7f1f0d76dd6 1517
XinZhangMS 0:f7f1f0d76dd6 1518 free(regManHandle->hostname);
XinZhangMS 0:f7f1f0d76dd6 1519 free(regManHandle->iothubName);
XinZhangMS 0:f7f1f0d76dd6 1520 free(regManHandle->iothubSuffix);
XinZhangMS 0:f7f1f0d76dd6 1521 free(regManHandle->sharedAccessKey);
XinZhangMS 0:f7f1f0d76dd6 1522 free(regManHandle->keyName);
XinZhangMS 0:f7f1f0d76dd6 1523 free(regManHandle->deviceId);
XinZhangMS 0:f7f1f0d76dd6 1524 free(regManHandle);
XinZhangMS 0:f7f1f0d76dd6 1525 }
XinZhangMS 0:f7f1f0d76dd6 1526 }
XinZhangMS 0:f7f1f0d76dd6 1527
XinZhangMS 0:f7f1f0d76dd6 1528 static IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_CreateDeviceOrModule(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const IOTHUB_REGISTRY_DEVICE_OR_MODULE_CREATE* deviceOrModuleCreateInfo, IOTHUB_DEVICE_OR_MODULE* deviceOrModuleInfo)
XinZhangMS 0:f7f1f0d76dd6 1529 {
XinZhangMS 0:f7f1f0d76dd6 1530 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1531
XinZhangMS 0:f7f1f0d76dd6 1532 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_007: [ IoTHubRegistryManager_CreateDevice shall verify the input parameters and if any of them are NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1533 if ((registryManagerHandle == NULL) || (deviceOrModuleCreateInfo == NULL) || (deviceOrModuleInfo == NULL))
XinZhangMS 0:f7f1f0d76dd6 1534 {
XinZhangMS 0:f7f1f0d76dd6 1535 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1536 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1537 }
XinZhangMS 0:f7f1f0d76dd6 1538 else
XinZhangMS 0:f7f1f0d76dd6 1539 {
XinZhangMS 0:f7f1f0d76dd6 1540 initializeDeviceOrModuleInfoMembers(deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1541
XinZhangMS 0:f7f1f0d76dd6 1542 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_008: [ IoTHubRegistryManager_CreateDevice shall verify the deviceOrModuleCreateInfo->deviceId input parameter and if it is NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1543 if (deviceOrModuleCreateInfo->deviceId == NULL)
XinZhangMS 0:f7f1f0d76dd6 1544 {
XinZhangMS 0:f7f1f0d76dd6 1545 LogError("deviceId cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1546 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1547 }
XinZhangMS 0:f7f1f0d76dd6 1548 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_009: [ IoTHubRegistryManager_CreateDevice shall verify the deviceOrModuleCreateInfo->deviceId input parameter and if it contains space(s) then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1549 else if ((strHasNoWhitespace(deviceOrModuleCreateInfo->deviceId)) != 0)
XinZhangMS 0:f7f1f0d76dd6 1550 {
XinZhangMS 0:f7f1f0d76dd6 1551 LogError("deviceId cannot contain spaces");
XinZhangMS 0:f7f1f0d76dd6 1552 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1553 }
XinZhangMS 0:f7f1f0d76dd6 1554 else if (isAuthTypeAllowed(deviceOrModuleCreateInfo->authMethod) == false)
XinZhangMS 0:f7f1f0d76dd6 1555 {
XinZhangMS 0:f7f1f0d76dd6 1556 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_006: [ IoTHubRegistryManager_CreateDevice shall cleanup and return IOTHUB_REGISTRYMANAGER_INVALID_ARG if deviceUpdate->authMethod is not "IOTHUB_REGISTRYMANAGER_AUTH_SPK" or "IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT" ] */
XinZhangMS 0:f7f1f0d76dd6 1557 LogError("Invalid authorization type specified");
XinZhangMS 0:f7f1f0d76dd6 1558 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1559 }
XinZhangMS 0:f7f1f0d76dd6 1560 else
XinZhangMS 0:f7f1f0d76dd6 1561 {
XinZhangMS 0:f7f1f0d76dd6 1562 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_095: [ IoTHubRegistryManager_CreateDevice shall allocate memory for device info structure by calling malloc ] */
XinZhangMS 0:f7f1f0d76dd6 1563 IOTHUB_DEVICE_OR_MODULE* tempDeviceOrModuleInfo;
XinZhangMS 0:f7f1f0d76dd6 1564 if ((tempDeviceOrModuleInfo = malloc(sizeof(IOTHUB_DEVICE_OR_MODULE))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1565 {
XinZhangMS 0:f7f1f0d76dd6 1566 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_096 : [ If the malloc fails, IoTHubRegistryManager_Create shall do clean up and return IOTHUB_REGISTRYMANAGER_ERROR. ] */
XinZhangMS 0:f7f1f0d76dd6 1567 LogError("Malloc failed for tempDeviceOrModuleInfo");
XinZhangMS 0:f7f1f0d76dd6 1568 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1569 }
XinZhangMS 0:f7f1f0d76dd6 1570 else
XinZhangMS 0:f7f1f0d76dd6 1571 {
XinZhangMS 0:f7f1f0d76dd6 1572 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_011: [ IoTHubRegistryManager_CreateDevice shall set the "deviceId" value to the deviceOrModuleCreateInfo->deviceId ] */
XinZhangMS 0:f7f1f0d76dd6 1573 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_012: [ IoTHubRegistryManager_CreateDevice shall set the "symmetricKey" value to deviceOrModuleCreateInfo->primaryKey and deviceOrModuleCreateInfo->secondaryKey ] */
XinZhangMS 0:f7f1f0d76dd6 1574 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_117: [ IoTHubRegistryManager_CreateDevice shall set the "status" value to the IOTHUB_DEVICE_STATUS_ENABLED ] */
XinZhangMS 0:f7f1f0d76dd6 1575 memset(tempDeviceOrModuleInfo, 0, sizeof(*tempDeviceOrModuleInfo));
XinZhangMS 0:f7f1f0d76dd6 1576 tempDeviceOrModuleInfo->deviceId = deviceOrModuleCreateInfo->deviceId;
XinZhangMS 0:f7f1f0d76dd6 1577 tempDeviceOrModuleInfo->moduleId = deviceOrModuleCreateInfo->moduleId;
XinZhangMS 0:f7f1f0d76dd6 1578 tempDeviceOrModuleInfo->primaryKey = deviceOrModuleCreateInfo->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 1579 tempDeviceOrModuleInfo->secondaryKey = deviceOrModuleCreateInfo->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 1580 tempDeviceOrModuleInfo->authMethod = deviceOrModuleCreateInfo->authMethod;
XinZhangMS 0:f7f1f0d76dd6 1581 tempDeviceOrModuleInfo->status = IOTHUB_DEVICE_STATUS_ENABLED;
XinZhangMS 0:f7f1f0d76dd6 1582 tempDeviceOrModuleInfo->iotEdge_capable = deviceOrModuleCreateInfo->iotEdge_capable;
XinZhangMS 0:f7f1f0d76dd6 1583 tempDeviceOrModuleInfo->managedBy = deviceOrModuleCreateInfo->managedBy;
XinZhangMS 0:f7f1f0d76dd6 1584
XinZhangMS 0:f7f1f0d76dd6 1585 BUFFER_HANDLE deviceJsonBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1586 BUFFER_HANDLE responseBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1587
XinZhangMS 0:f7f1f0d76dd6 1588 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_010: [ IoTHubRegistryManager_CreateDevice shall create a flat "key1:value2,key2:value2..." JSON representation from the given deviceOrModuleCreateInfo parameter using the following parson APIs: json_value_init_object, json_value_get_object, json_object_set_string, json_object_dotset_string ] */
XinZhangMS 0:f7f1f0d76dd6 1589 if ((deviceJsonBuffer = constructDeviceOrModuleJson(tempDeviceOrModuleInfo)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1590 {
XinZhangMS 0:f7f1f0d76dd6 1591 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_013: [ IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 1592 LogError("Json creation failed");
XinZhangMS 0:f7f1f0d76dd6 1593 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1594 }
XinZhangMS 0:f7f1f0d76dd6 1595 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_097: [ IoTHubRegistryManager_CreateDevice shall allocate memory for response buffer by calling BUFFER_new ] */
XinZhangMS 0:f7f1f0d76dd6 1596 else if ((responseBuffer = BUFFER_new()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1597 {
XinZhangMS 0:f7f1f0d76dd6 1598 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_098 : [ If the BUFFER_new fails, IoTHubRegistryManager_CreateDevice shall do clean up and return IOTHUB_REGISTRYMANAGER_ERROR. ] */
XinZhangMS 0:f7f1f0d76dd6 1599 LogError("BUFFER_new failed for responseBuffer");
XinZhangMS 0:f7f1f0d76dd6 1600 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1601 }
XinZhangMS 0:f7f1f0d76dd6 1602 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_014: [ IoTHubRegistryManager_CreateDevice shall create an HTTP PUT request using the created JSON ] */
XinZhangMS 0:f7f1f0d76dd6 1603 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_015: [ IoTHubRegistryManager_CreateDevice shall create an HTTP PUT request using the following HTTP headers: authorization=sasToken,Request-Id=1001,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1604 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_016: [ IoTHubRegistryManager_CreateDevice shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1605 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_017: [ IoTHubRegistryManager_CreateDevice shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1606 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_018: [ IoTHubRegistryManager_CreateDevice shall execute the HTTP PUT request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1607 else if ((result = sendHttpRequestCRUD(registryManagerHandle, IOTHUB_REQUEST_CREATE, deviceOrModuleCreateInfo->deviceId, deviceOrModuleCreateInfo->moduleId, deviceJsonBuffer, 0, responseBuffer)) == IOTHUB_REGISTRYMANAGER_ERROR)
XinZhangMS 0:f7f1f0d76dd6 1608 {
XinZhangMS 0:f7f1f0d76dd6 1609 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_019: [ If any of the HTTPAPI call fails IoTHubRegistryManager_CreateDevice shall fail and return IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1610 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_099: [ If any of the call fails during the HTTP creation IoTHubRegistryManager_CreateDevice shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1611 LogError("Failure sending HTTP request for create device");
XinZhangMS 0:f7f1f0d76dd6 1612 }
XinZhangMS 0:f7f1f0d76dd6 1613 else if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 1614 {
XinZhangMS 0:f7f1f0d76dd6 1615 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_022: [ IoTHubRegistryManager_CreateDevice shall verify the received HTTP status code and if it is less or equal than 300 then try to parse the response JSON to deviceOrModuleInfo ] */
XinZhangMS 0:f7f1f0d76dd6 1616 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_023: [ If the JSON parsing failed, IoTHubRegistryManager_CreateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1617 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_024: [ If the deviceOrModuleInfo out parameter is not NULL IoTHubRegistryManager_CreateDevice shall save the received deviceOrModuleInfo to the out parameter and return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1618 result = parseDeviceOrModuleJson(responseBuffer, deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1619 }
XinZhangMS 0:f7f1f0d76dd6 1620 else
XinZhangMS 0:f7f1f0d76dd6 1621 {
XinZhangMS 0:f7f1f0d76dd6 1622 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_020: [ IoTHubRegistryManager_CreateDevice shall verify the received HTTP status code and if it is 409 then return IOTHUB_REGISTRYMANAGER_DEVICE_EXIST ] */
XinZhangMS 0:f7f1f0d76dd6 1623 }
XinZhangMS 0:f7f1f0d76dd6 1624
XinZhangMS 0:f7f1f0d76dd6 1625 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_100: [ IoTHubRegistryManager_CreateDevice shall do clean up before return ] */
XinZhangMS 0:f7f1f0d76dd6 1626 if (responseBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 1627 {
XinZhangMS 0:f7f1f0d76dd6 1628 BUFFER_delete(responseBuffer);
XinZhangMS 0:f7f1f0d76dd6 1629 }
XinZhangMS 0:f7f1f0d76dd6 1630 if (deviceJsonBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 1631 {
XinZhangMS 0:f7f1f0d76dd6 1632 BUFFER_delete(deviceJsonBuffer);
XinZhangMS 0:f7f1f0d76dd6 1633 }
XinZhangMS 0:f7f1f0d76dd6 1634 }
XinZhangMS 0:f7f1f0d76dd6 1635 free(tempDeviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1636 }
XinZhangMS 0:f7f1f0d76dd6 1637 }
XinZhangMS 0:f7f1f0d76dd6 1638 return result;
XinZhangMS 0:f7f1f0d76dd6 1639 }
XinZhangMS 0:f7f1f0d76dd6 1640
XinZhangMS 0:f7f1f0d76dd6 1641 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_CreateDevice(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const IOTHUB_REGISTRY_DEVICE_CREATE* deviceCreateInfo, IOTHUB_DEVICE* deviceInfo)
XinZhangMS 0:f7f1f0d76dd6 1642 {
XinZhangMS 0:f7f1f0d76dd6 1643 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1644
XinZhangMS 0:f7f1f0d76dd6 1645 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_007: [ IoTHubRegistryManager_CreateDevice shall verify the input parameters and if any of them are NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1646 if ((registryManagerHandle == NULL) || (deviceCreateInfo == NULL) || (deviceInfo == NULL))
XinZhangMS 0:f7f1f0d76dd6 1647 {
XinZhangMS 0:f7f1f0d76dd6 1648 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1649 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1650 }
XinZhangMS 0:f7f1f0d76dd6 1651 else
XinZhangMS 0:f7f1f0d76dd6 1652 {
XinZhangMS 0:f7f1f0d76dd6 1653 IOTHUB_REGISTRY_DEVICE_OR_MODULE_CREATE deviceOrModuleCreateInfo;
XinZhangMS 0:f7f1f0d76dd6 1654 IOTHUB_DEVICE_OR_MODULE deviceOrModuleInfo;
XinZhangMS 0:f7f1f0d76dd6 1655
XinZhangMS 0:f7f1f0d76dd6 1656 memset(&deviceOrModuleInfo, 0, sizeof(deviceOrModuleInfo));
XinZhangMS 0:f7f1f0d76dd6 1657 memset(&deviceOrModuleCreateInfo, 0, sizeof(deviceOrModuleCreateInfo));
XinZhangMS 0:f7f1f0d76dd6 1658 deviceOrModuleCreateInfo.type = IOTHUB_REGISTRYMANAGER_MODEL_TYPE_DEVICE;
XinZhangMS 0:f7f1f0d76dd6 1659 deviceOrModuleCreateInfo.deviceId = deviceCreateInfo->deviceId;
XinZhangMS 0:f7f1f0d76dd6 1660 deviceOrModuleCreateInfo.primaryKey = deviceCreateInfo->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 1661 deviceOrModuleCreateInfo.secondaryKey = deviceCreateInfo->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 1662 deviceOrModuleCreateInfo.authMethod = deviceCreateInfo->authMethod;
XinZhangMS 0:f7f1f0d76dd6 1663 deviceOrModuleCreateInfo.iotEdge_capable = false; //IOTHUB_DEVICE does not have this field, so set it to disabled
XinZhangMS 0:f7f1f0d76dd6 1664
XinZhangMS 0:f7f1f0d76dd6 1665 result = IoTHubRegistryManager_CreateDeviceOrModule(registryManagerHandle, &deviceOrModuleCreateInfo, &deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1666 if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 1667 {
XinZhangMS 0:f7f1f0d76dd6 1668 move_deviceOrModule_members_to_device(&deviceOrModuleInfo, deviceInfo);
XinZhangMS 0:f7f1f0d76dd6 1669 free_nonDevice_members_from_deviceOrModule(&deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1670 }
XinZhangMS 0:f7f1f0d76dd6 1671 }
XinZhangMS 0:f7f1f0d76dd6 1672
XinZhangMS 0:f7f1f0d76dd6 1673 return result;
XinZhangMS 0:f7f1f0d76dd6 1674 }
XinZhangMS 0:f7f1f0d76dd6 1675
XinZhangMS 0:f7f1f0d76dd6 1676 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_CreateDevice_Ex(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const IOTHUB_REGISTRY_DEVICE_CREATE_EX* deviceCreateInfo, IOTHUB_DEVICE_EX* deviceInfo)
XinZhangMS 0:f7f1f0d76dd6 1677 {
XinZhangMS 0:f7f1f0d76dd6 1678 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1679
XinZhangMS 0:f7f1f0d76dd6 1680 if ((registryManagerHandle == NULL) || (deviceCreateInfo == NULL) || (deviceInfo == NULL))
XinZhangMS 0:f7f1f0d76dd6 1681 {
XinZhangMS 0:f7f1f0d76dd6 1682 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1683 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1684 }
XinZhangMS 0:f7f1f0d76dd6 1685 else if ((deviceCreateInfo->version < IOTHUB_REGISTRY_DEVICE_CREATE_EX_VERSION_1) ||
XinZhangMS 0:f7f1f0d76dd6 1686 (deviceCreateInfo->version > IOTHUB_REGISTRY_DEVICE_CREATE_EX_VERSION_LATEST))
XinZhangMS 0:f7f1f0d76dd6 1687 {
XinZhangMS 0:f7f1f0d76dd6 1688 LogError("deviceCreateInfo must have a valid version");
XinZhangMS 0:f7f1f0d76dd6 1689 result = IOTHUB_REGISTRYMANAGER_INVALID_VERSION;
XinZhangMS 0:f7f1f0d76dd6 1690 }
XinZhangMS 0:f7f1f0d76dd6 1691 else if ((deviceInfo->version < IOTHUB_DEVICE_EX_VERSION_1) ||
XinZhangMS 0:f7f1f0d76dd6 1692 (deviceInfo->version > IOTHUB_DEVICE_EX_VERSION_LATEST))
XinZhangMS 0:f7f1f0d76dd6 1693 {
XinZhangMS 0:f7f1f0d76dd6 1694 LogError("deviceInfo must have a valid version");
XinZhangMS 0:f7f1f0d76dd6 1695 result = IOTHUB_REGISTRYMANAGER_INVALID_VERSION;
XinZhangMS 0:f7f1f0d76dd6 1696 }
XinZhangMS 0:f7f1f0d76dd6 1697 else
XinZhangMS 0:f7f1f0d76dd6 1698 {
XinZhangMS 0:f7f1f0d76dd6 1699 IOTHUB_REGISTRY_DEVICE_OR_MODULE_CREATE deviceOrModuleCreateInfo;
XinZhangMS 0:f7f1f0d76dd6 1700 IOTHUB_DEVICE_OR_MODULE deviceOrModuleInfo;
XinZhangMS 0:f7f1f0d76dd6 1701
XinZhangMS 0:f7f1f0d76dd6 1702 memset(&deviceOrModuleInfo, 0, sizeof(deviceOrModuleInfo));
XinZhangMS 0:f7f1f0d76dd6 1703 memset(&deviceOrModuleCreateInfo, 0, sizeof(deviceOrModuleCreateInfo));
XinZhangMS 0:f7f1f0d76dd6 1704 deviceOrModuleCreateInfo.type = IOTHUB_REGISTRYMANAGER_MODEL_TYPE_DEVICE;
XinZhangMS 0:f7f1f0d76dd6 1705
XinZhangMS 0:f7f1f0d76dd6 1706 if (deviceCreateInfo->version >= IOTHUB_REGISTRY_DEVICE_CREATE_EX_VERSION_1)
XinZhangMS 0:f7f1f0d76dd6 1707 {
XinZhangMS 0:f7f1f0d76dd6 1708 deviceOrModuleCreateInfo.deviceId = deviceCreateInfo->deviceId;
XinZhangMS 0:f7f1f0d76dd6 1709 deviceOrModuleCreateInfo.primaryKey = deviceCreateInfo->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 1710 deviceOrModuleCreateInfo.secondaryKey = deviceCreateInfo->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 1711 deviceOrModuleCreateInfo.authMethod = deviceCreateInfo->authMethod;
XinZhangMS 0:f7f1f0d76dd6 1712 deviceOrModuleCreateInfo.iotEdge_capable = deviceCreateInfo->iotEdge_capable;
XinZhangMS 0:f7f1f0d76dd6 1713 }
XinZhangMS 0:f7f1f0d76dd6 1714
XinZhangMS 0:f7f1f0d76dd6 1715 result = IoTHubRegistryManager_CreateDeviceOrModule(registryManagerHandle, &deviceOrModuleCreateInfo, &deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1716 if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 1717 {
XinZhangMS 0:f7f1f0d76dd6 1718 move_deviceOrModule_members_to_deviceEx(&deviceOrModuleInfo, deviceInfo);
XinZhangMS 0:f7f1f0d76dd6 1719 free_nonDeviceEx_members_from_deviceOrModule(&deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1720 }
XinZhangMS 0:f7f1f0d76dd6 1721 }
XinZhangMS 0:f7f1f0d76dd6 1722
XinZhangMS 0:f7f1f0d76dd6 1723 return result;
XinZhangMS 0:f7f1f0d76dd6 1724 }
XinZhangMS 0:f7f1f0d76dd6 1725
XinZhangMS 0:f7f1f0d76dd6 1726 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_GetDeviceOrModule(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const char* deviceId, const char* moduleId, IOTHUB_DEVICE_OR_MODULE* deviceOrModuleInfo)
XinZhangMS 0:f7f1f0d76dd6 1727 {
XinZhangMS 0:f7f1f0d76dd6 1728 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1729
XinZhangMS 0:f7f1f0d76dd6 1730 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_025: [ IoTHubRegistryManager_GetDevice shall verify the registryManagerHandle and deviceId input parameters and if any of them are NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1731 if ((registryManagerHandle == NULL) || (deviceId == NULL))
XinZhangMS 0:f7f1f0d76dd6 1732 {
XinZhangMS 0:f7f1f0d76dd6 1733 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1734 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1735 }
XinZhangMS 0:f7f1f0d76dd6 1736 else
XinZhangMS 0:f7f1f0d76dd6 1737 {
XinZhangMS 0:f7f1f0d76dd6 1738 BUFFER_HANDLE responseBuffer;
XinZhangMS 0:f7f1f0d76dd6 1739 initializeDeviceOrModuleInfoMembers(deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1740
XinZhangMS 0:f7f1f0d76dd6 1741 if ((responseBuffer = BUFFER_new()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1742 {
XinZhangMS 0:f7f1f0d76dd6 1743 LogError("BUFFER_new failed for responseBuffer");
XinZhangMS 0:f7f1f0d76dd6 1744 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1745 }
XinZhangMS 0:f7f1f0d76dd6 1746 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_026: [ IoTHubRegistryManager_GetDevice shall create HTTP GET request URL using the given deviceId using the following format: url/devices/[deviceId]?api-version=2017-06-30 ] */
XinZhangMS 0:f7f1f0d76dd6 1747 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_027: [ IoTHubRegistryManager_GetDevice shall add the following headers to the created HTTP GET request: authorization=sasToken,Request-Id=1001,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 1748 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_028: [ IoTHubRegistryManager_GetDevice shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1749 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_029: [ IoTHubRegistryManager_GetDevice shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1750 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_030: [ IoTHubRegistryManager_GetDevice shall execute the HTTP GET request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1751 else if ((result = sendHttpRequestCRUD(registryManagerHandle, IOTHUB_REQUEST_GET, deviceId, moduleId, NULL, 0, responseBuffer)) == IOTHUB_REGISTRYMANAGER_ERROR)
XinZhangMS 0:f7f1f0d76dd6 1752 {
XinZhangMS 0:f7f1f0d76dd6 1753 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_031: [ If any of the HTTPAPI call fails IoTHubRegistryManager_GetDevice shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1754 LogError("Failure sending HTTP request for create device");
XinZhangMS 0:f7f1f0d76dd6 1755 }
XinZhangMS 0:f7f1f0d76dd6 1756 else if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 1757 {
XinZhangMS 0:f7f1f0d76dd6 1758 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_033: [ IoTHubRegistryManager_GetDevice shall verify the received HTTP status code and if it is less or equal than 300 then try to parse the response JSON to deviceInfo for the following properties: deviceId, primaryKey, secondaryKey, generationId, eTag, connectionState, connectionstateUpdatedTime, status, statusReason, statusUpdatedTime, lastActivityTime, cloudToDeviceMessageCount ] */
XinZhangMS 0:f7f1f0d76dd6 1759 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_034: [ If any of the property field above missing from the JSON the property value will not be populated ] */
XinZhangMS 0:f7f1f0d76dd6 1760 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_035: [ If the JSON parsing failed, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1761 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_036: [ If the received JSON is empty, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_DEVICE_NOT_EXIST ] */
XinZhangMS 0:f7f1f0d76dd6 1762 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_037: [ If the deviceInfo out parameter if not NULL IoTHubRegistryManager_GetDevice shall save the received deviceInfo to the out parameter and return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 1763 if ((result = parseDeviceOrModuleJson(responseBuffer, deviceOrModuleInfo)) == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 1764 {
XinZhangMS 0:f7f1f0d76dd6 1765 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_036: [ If the received JSON is empty, IoTHubRegistryManager_GetDevice shall return IOTHUB_REGISTRYMANAGER_DEVICE_NOT_EXIST ] */
XinZhangMS 0:f7f1f0d76dd6 1766 if (deviceOrModuleInfo->deviceId == NULL)
XinZhangMS 0:f7f1f0d76dd6 1767 {
XinZhangMS 0:f7f1f0d76dd6 1768 free_deviceOrModule_members(deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1769 result = IOTHUB_REGISTRYMANAGER_DEVICE_NOT_EXIST;
XinZhangMS 0:f7f1f0d76dd6 1770 }
XinZhangMS 0:f7f1f0d76dd6 1771 }
XinZhangMS 0:f7f1f0d76dd6 1772 }
XinZhangMS 0:f7f1f0d76dd6 1773
XinZhangMS 0:f7f1f0d76dd6 1774 BUFFER_delete(responseBuffer);
XinZhangMS 0:f7f1f0d76dd6 1775 }
XinZhangMS 0:f7f1f0d76dd6 1776 return result;
XinZhangMS 0:f7f1f0d76dd6 1777
XinZhangMS 0:f7f1f0d76dd6 1778 }
XinZhangMS 0:f7f1f0d76dd6 1779
XinZhangMS 0:f7f1f0d76dd6 1780 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_GetDevice(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const char* deviceId, IOTHUB_DEVICE* deviceInfo)
XinZhangMS 0:f7f1f0d76dd6 1781 {
XinZhangMS 0:f7f1f0d76dd6 1782 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1783
XinZhangMS 0:f7f1f0d76dd6 1784 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_007: [ IoTHubRegistryManager_CreateDevice shall verify the input parameters and if any of them are NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1785 if ((registryManagerHandle == NULL) || (deviceId == NULL) || (deviceInfo == NULL))
XinZhangMS 0:f7f1f0d76dd6 1786 {
XinZhangMS 0:f7f1f0d76dd6 1787 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1788 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1789 }
XinZhangMS 0:f7f1f0d76dd6 1790 else
XinZhangMS 0:f7f1f0d76dd6 1791 {
XinZhangMS 0:f7f1f0d76dd6 1792 IOTHUB_DEVICE_OR_MODULE deviceOrModuleInfo;
XinZhangMS 0:f7f1f0d76dd6 1793 memset(&deviceOrModuleInfo, 0, sizeof(deviceOrModuleInfo));
XinZhangMS 0:f7f1f0d76dd6 1794
XinZhangMS 0:f7f1f0d76dd6 1795 result = IoTHubRegistryManager_GetDeviceOrModule(registryManagerHandle, deviceId, NULL, &deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1796 if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 1797 {
XinZhangMS 0:f7f1f0d76dd6 1798 move_deviceOrModule_members_to_device(&deviceOrModuleInfo, deviceInfo);
XinZhangMS 0:f7f1f0d76dd6 1799 free_nonDevice_members_from_deviceOrModule(&deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1800 }
XinZhangMS 0:f7f1f0d76dd6 1801 }
XinZhangMS 0:f7f1f0d76dd6 1802
XinZhangMS 0:f7f1f0d76dd6 1803 return result;
XinZhangMS 0:f7f1f0d76dd6 1804 }
XinZhangMS 0:f7f1f0d76dd6 1805
XinZhangMS 0:f7f1f0d76dd6 1806 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_GetDevice_Ex(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const char* deviceId, IOTHUB_DEVICE_EX* deviceInfo)
XinZhangMS 0:f7f1f0d76dd6 1807 {
XinZhangMS 0:f7f1f0d76dd6 1808 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1809
XinZhangMS 0:f7f1f0d76dd6 1810 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_007: [ IoTHubRegistryManager_CreateDevice shall verify the input parameters and if any of them are NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1811 if ((registryManagerHandle == NULL) || (deviceId == NULL) || (deviceInfo == NULL))
XinZhangMS 0:f7f1f0d76dd6 1812 {
XinZhangMS 0:f7f1f0d76dd6 1813 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1814 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1815 }
XinZhangMS 0:f7f1f0d76dd6 1816 else if ((deviceInfo->version < IOTHUB_DEVICE_EX_VERSION_1) ||
XinZhangMS 0:f7f1f0d76dd6 1817 (deviceInfo->version > IOTHUB_DEVICE_EX_VERSION_LATEST))
XinZhangMS 0:f7f1f0d76dd6 1818 {
XinZhangMS 0:f7f1f0d76dd6 1819 LogError("deviceInfo must have a valid version");
XinZhangMS 0:f7f1f0d76dd6 1820 result = IOTHUB_REGISTRYMANAGER_INVALID_VERSION;
XinZhangMS 0:f7f1f0d76dd6 1821 }
XinZhangMS 0:f7f1f0d76dd6 1822 else
XinZhangMS 0:f7f1f0d76dd6 1823 {
XinZhangMS 0:f7f1f0d76dd6 1824 IOTHUB_DEVICE_OR_MODULE deviceOrModuleInfo;
XinZhangMS 0:f7f1f0d76dd6 1825 memset(&deviceOrModuleInfo, 0, sizeof(deviceOrModuleInfo));
XinZhangMS 0:f7f1f0d76dd6 1826
XinZhangMS 0:f7f1f0d76dd6 1827 result = IoTHubRegistryManager_GetDeviceOrModule(registryManagerHandle, deviceId, NULL, &deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1828 if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 1829 {
XinZhangMS 0:f7f1f0d76dd6 1830 move_deviceOrModule_members_to_deviceEx(&deviceOrModuleInfo, deviceInfo);
XinZhangMS 0:f7f1f0d76dd6 1831 free_nonDeviceEx_members_from_deviceOrModule(&deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1832 }
XinZhangMS 0:f7f1f0d76dd6 1833 }
XinZhangMS 0:f7f1f0d76dd6 1834
XinZhangMS 0:f7f1f0d76dd6 1835 return result;
XinZhangMS 0:f7f1f0d76dd6 1836 }
XinZhangMS 0:f7f1f0d76dd6 1837
XinZhangMS 0:f7f1f0d76dd6 1838 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_UpdateDeviceOrModule(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, IOTHUB_REGISTRY_DEVICE_OR_MODULE_UPDATE* deviceOrModuleUpdate)
XinZhangMS 0:f7f1f0d76dd6 1839 {
XinZhangMS 0:f7f1f0d76dd6 1840 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1841
XinZhangMS 0:f7f1f0d76dd6 1842 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_038: [ IoTHubRegistryManager_UpdateDevice shall verify the input parameters and if any of them are NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1843 if ((registryManagerHandle == NULL) || (deviceOrModuleUpdate == NULL))
XinZhangMS 0:f7f1f0d76dd6 1844 {
XinZhangMS 0:f7f1f0d76dd6 1845 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1846 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1847 }
XinZhangMS 0:f7f1f0d76dd6 1848 else
XinZhangMS 0:f7f1f0d76dd6 1849 {
XinZhangMS 0:f7f1f0d76dd6 1850 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_039: [ IoTHubRegistryManager_UpdateDevice shall verify the deviceCreateInfo->deviceId input parameter and if it is NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 1851 if (deviceOrModuleUpdate->deviceId == NULL)
XinZhangMS 0:f7f1f0d76dd6 1852 {
XinZhangMS 0:f7f1f0d76dd6 1853 LogError("deviceId cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1854 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1855 }
XinZhangMS 0:f7f1f0d76dd6 1856 else if (isAuthTypeAllowed(deviceOrModuleUpdate->authMethod) == false)
XinZhangMS 0:f7f1f0d76dd6 1857 {
XinZhangMS 0:f7f1f0d76dd6 1858 /*Codes_SRS_IOTHUBREGISTRYMANAGER_06_005: [ IoTHubRegistryManager_UpdateDevice shall clean up and return IOTHUB_REGISTRYMANAGER_INVALID_ARG if deviceUpdate->authMethod is not "IOTHUB_REGISTRYMANAGER_AUTH_SPK" or "IOTHUB_REGISTRYMANAGER_AUTH_X509_THUMBPRINT" ] */
XinZhangMS 0:f7f1f0d76dd6 1859 LogError("Invalid authorization type specified");
XinZhangMS 0:f7f1f0d76dd6 1860 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1861 }
XinZhangMS 0:f7f1f0d76dd6 1862 else
XinZhangMS 0:f7f1f0d76dd6 1863 {
XinZhangMS 0:f7f1f0d76dd6 1864 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_106: [ IoTHubRegistryManager_UpdateDevice shall allocate memory for device info structure by calling malloc ] */
XinZhangMS 0:f7f1f0d76dd6 1865 IOTHUB_DEVICE_OR_MODULE* tempDeviceOrModuleInfo;
XinZhangMS 0:f7f1f0d76dd6 1866 if ((tempDeviceOrModuleInfo = malloc(sizeof(IOTHUB_DEVICE_OR_MODULE))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1867 {
XinZhangMS 0:f7f1f0d76dd6 1868 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_108: [ If the malloc fails, IoTHubRegistryManager_UpdateDevice shall do clean up and return NULL ] */
XinZhangMS 0:f7f1f0d76dd6 1869 LogError("Malloc failed for tempDeviceOrModuleInfo");
XinZhangMS 0:f7f1f0d76dd6 1870 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1871 }
XinZhangMS 0:f7f1f0d76dd6 1872 else
XinZhangMS 0:f7f1f0d76dd6 1873 {
XinZhangMS 0:f7f1f0d76dd6 1874 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_118: [ IoTHubRegistryManager_CreateDevice shall set the "status" value to the deviceCreateInfo->status ] */
XinZhangMS 0:f7f1f0d76dd6 1875 (void)memset(tempDeviceOrModuleInfo, 0, sizeof(IOTHUB_DEVICE_OR_MODULE));
XinZhangMS 0:f7f1f0d76dd6 1876 tempDeviceOrModuleInfo->deviceId = deviceOrModuleUpdate->deviceId;
XinZhangMS 0:f7f1f0d76dd6 1877 tempDeviceOrModuleInfo->primaryKey = deviceOrModuleUpdate->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 1878 tempDeviceOrModuleInfo->secondaryKey = deviceOrModuleUpdate->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 1879 tempDeviceOrModuleInfo->authMethod = deviceOrModuleUpdate->authMethod;
XinZhangMS 0:f7f1f0d76dd6 1880 tempDeviceOrModuleInfo->status = deviceOrModuleUpdate->status;
XinZhangMS 0:f7f1f0d76dd6 1881 tempDeviceOrModuleInfo->moduleId = deviceOrModuleUpdate->moduleId;
XinZhangMS 0:f7f1f0d76dd6 1882 tempDeviceOrModuleInfo->iotEdge_capable = deviceOrModuleUpdate->iotEdge_capable;
XinZhangMS 0:f7f1f0d76dd6 1883 tempDeviceOrModuleInfo->managedBy = deviceOrModuleUpdate->managedBy;
XinZhangMS 0:f7f1f0d76dd6 1884
XinZhangMS 0:f7f1f0d76dd6 1885 BUFFER_HANDLE deviceJsonBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1886 BUFFER_HANDLE responseBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 1887
XinZhangMS 0:f7f1f0d76dd6 1888 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_041: [ IoTHubRegistryManager_UpdateDevice shall create a flat "key1:value2,key2:value2..." JSON representation from the given deviceCreateInfo parameter using the following parson APIs : json_value_init_object, json_value_get_object, json_object_set_string, json_object_dotset_string ] */
XinZhangMS 0:f7f1f0d76dd6 1889 if ((deviceJsonBuffer = constructDeviceOrModuleJson(tempDeviceOrModuleInfo)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1890 {
XinZhangMS 0:f7f1f0d76dd6 1891 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_042: [ IoTHubRegistryManager_UpdateDevice shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR if the JSON creation failed ] */
XinZhangMS 0:f7f1f0d76dd6 1892 LogError("Json creation failed");
XinZhangMS 0:f7f1f0d76dd6 1893 result = IOTHUB_REGISTRYMANAGER_JSON_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1894 }
XinZhangMS 0:f7f1f0d76dd6 1895 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_101: [ IoTHubRegistryManager_UpdateDevice shall allocate memory for response buffer by calling BUFFER_new ] */
XinZhangMS 0:f7f1f0d76dd6 1896 else if ((responseBuffer = BUFFER_new()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 1897 {
XinZhangMS 0:f7f1f0d76dd6 1898 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_102: [ If the BUFFER_new fails, IoTHubRegistryManager_UpdateDevice shall do clean up and return IOTHUB_REGISTRYMANAGER_ERROR. ] */
XinZhangMS 0:f7f1f0d76dd6 1899 LogError("BUFFER_new failed for responseBuffer");
XinZhangMS 0:f7f1f0d76dd6 1900 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 1901 }
XinZhangMS 0:f7f1f0d76dd6 1902 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_043: [ IoTHubRegistryManager_UpdateDevice shall create an HTTP PUT request using the created JSON ] */
XinZhangMS 0:f7f1f0d76dd6 1903 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_044: [ IoTHubRegistryManager_UpdateDevice shall create an HTTP PUT request using the createdfollowing HTTP headers : authorization = sasToken, Request - Id = 1001, Accept = application / json, Content - Type = application / json, charset = utf - 8 ] */
XinZhangMS 0:f7f1f0d76dd6 1904 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_045: [ IoTHubRegistryManager_UpdateDevice shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1905 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_046: [ IoTHubRegistryManager_UpdateDevice shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 1906 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_047: [ IoTHubRegistryManager_UpdateDevice shall execute the HTTP PUT request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 1907 else if ((result = sendHttpRequestCRUD(registryManagerHandle, IOTHUB_REQUEST_UPDATE, deviceOrModuleUpdate->deviceId, deviceOrModuleUpdate->moduleId, deviceJsonBuffer, 0, responseBuffer)) == IOTHUB_REGISTRYMANAGER_ERROR)
XinZhangMS 0:f7f1f0d76dd6 1908 {
XinZhangMS 0:f7f1f0d76dd6 1909 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_103: [ If any of the call fails during the HTTP creation IoTHubRegistryManager_UpdateDevice shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1910 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_104: [ If any of the HTTPAPI call fails IoTHubRegistryManager_UpdateDevice shall fail and return IOTHUB_REGISTRYMANAGER_HTTPAPI_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 1911 LogError("Failure sending HTTP request for update device");
XinZhangMS 0:f7f1f0d76dd6 1912 }
XinZhangMS 0:f7f1f0d76dd6 1913
XinZhangMS 0:f7f1f0d76dd6 1914 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_105: [ IoTHubRegistryManager_UpdateDevice shall do clean up before return ] */
XinZhangMS 0:f7f1f0d76dd6 1915 if (deviceJsonBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 1916 {
XinZhangMS 0:f7f1f0d76dd6 1917 BUFFER_delete(deviceJsonBuffer);
XinZhangMS 0:f7f1f0d76dd6 1918 }
XinZhangMS 0:f7f1f0d76dd6 1919 if (responseBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 1920 {
XinZhangMS 0:f7f1f0d76dd6 1921 BUFFER_delete(responseBuffer);
XinZhangMS 0:f7f1f0d76dd6 1922 }
XinZhangMS 0:f7f1f0d76dd6 1923 }
XinZhangMS 0:f7f1f0d76dd6 1924 free(tempDeviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 1925 }
XinZhangMS 0:f7f1f0d76dd6 1926 }
XinZhangMS 0:f7f1f0d76dd6 1927 return result;
XinZhangMS 0:f7f1f0d76dd6 1928
XinZhangMS 0:f7f1f0d76dd6 1929 }
XinZhangMS 0:f7f1f0d76dd6 1930
XinZhangMS 0:f7f1f0d76dd6 1931 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_UpdateDevice(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, IOTHUB_REGISTRY_DEVICE_UPDATE* deviceUpdate)
XinZhangMS 0:f7f1f0d76dd6 1932 {
XinZhangMS 0:f7f1f0d76dd6 1933 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1934
XinZhangMS 0:f7f1f0d76dd6 1935 if (registryManagerHandle == NULL || deviceUpdate == NULL)
XinZhangMS 0:f7f1f0d76dd6 1936 {
XinZhangMS 0:f7f1f0d76dd6 1937 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1938 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1939 }
XinZhangMS 0:f7f1f0d76dd6 1940 else
XinZhangMS 0:f7f1f0d76dd6 1941 {
XinZhangMS 0:f7f1f0d76dd6 1942 IOTHUB_REGISTRY_DEVICE_OR_MODULE_UPDATE deviceOrModuleUpdate;
XinZhangMS 0:f7f1f0d76dd6 1943 memset(&deviceOrModuleUpdate, 0, sizeof(deviceOrModuleUpdate));
XinZhangMS 0:f7f1f0d76dd6 1944
XinZhangMS 0:f7f1f0d76dd6 1945 //Convert to generic update struct
XinZhangMS 0:f7f1f0d76dd6 1946 deviceOrModuleUpdate.type = IOTHUB_REGISTRYMANAGER_MODEL_TYPE_DEVICE;
XinZhangMS 0:f7f1f0d76dd6 1947 deviceOrModuleUpdate.deviceId = deviceUpdate->deviceId;
XinZhangMS 0:f7f1f0d76dd6 1948 deviceOrModuleUpdate.primaryKey = deviceUpdate->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 1949 deviceOrModuleUpdate.secondaryKey = deviceUpdate->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 1950 deviceOrModuleUpdate.status = deviceUpdate->status;
XinZhangMS 0:f7f1f0d76dd6 1951 deviceOrModuleUpdate.authMethod = deviceUpdate->authMethod;
XinZhangMS 0:f7f1f0d76dd6 1952 deviceOrModuleUpdate.iotEdge_capable = false; //IOTHUB_REGISTRY_DEVICE_UPDATE does not have this field, so set false
XinZhangMS 0:f7f1f0d76dd6 1953
XinZhangMS 0:f7f1f0d76dd6 1954 result = IoTHubRegistryManager_UpdateDeviceOrModule(registryManagerHandle, &deviceOrModuleUpdate);
XinZhangMS 0:f7f1f0d76dd6 1955 }
XinZhangMS 0:f7f1f0d76dd6 1956
XinZhangMS 0:f7f1f0d76dd6 1957 return result;
XinZhangMS 0:f7f1f0d76dd6 1958 }
XinZhangMS 0:f7f1f0d76dd6 1959
XinZhangMS 0:f7f1f0d76dd6 1960 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_UpdateDevice_Ex(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, IOTHUB_REGISTRY_DEVICE_UPDATE_EX* deviceUpdate)
XinZhangMS 0:f7f1f0d76dd6 1961 {
XinZhangMS 0:f7f1f0d76dd6 1962 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 1963
XinZhangMS 0:f7f1f0d76dd6 1964 if (registryManagerHandle == NULL || deviceUpdate == NULL)
XinZhangMS 0:f7f1f0d76dd6 1965 {
XinZhangMS 0:f7f1f0d76dd6 1966 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 1967 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 1968 }
XinZhangMS 0:f7f1f0d76dd6 1969 else if (deviceUpdate->version < IOTHUB_REGISTRY_DEVICE_UPDATE_EX_VERSION_1 || deviceUpdate->version > IOTHUB_REGISTRY_DEVICE_UPDATE_EX_VERSION_LATEST)
XinZhangMS 0:f7f1f0d76dd6 1970 {
XinZhangMS 0:f7f1f0d76dd6 1971 LogError("deviceUpdate must have valid version");
XinZhangMS 0:f7f1f0d76dd6 1972 result = IOTHUB_REGISTRYMANAGER_INVALID_VERSION;
XinZhangMS 0:f7f1f0d76dd6 1973 }
XinZhangMS 0:f7f1f0d76dd6 1974 else
XinZhangMS 0:f7f1f0d76dd6 1975 {
XinZhangMS 0:f7f1f0d76dd6 1976 IOTHUB_REGISTRY_DEVICE_OR_MODULE_UPDATE deviceOrModuleUpdate;
XinZhangMS 0:f7f1f0d76dd6 1977 memset(&deviceOrModuleUpdate, 0, sizeof(deviceOrModuleUpdate));
XinZhangMS 0:f7f1f0d76dd6 1978
XinZhangMS 0:f7f1f0d76dd6 1979 //Convert to generic update struct
XinZhangMS 0:f7f1f0d76dd6 1980 deviceOrModuleUpdate.type = IOTHUB_REGISTRYMANAGER_MODEL_TYPE_DEVICE;
XinZhangMS 0:f7f1f0d76dd6 1981
XinZhangMS 0:f7f1f0d76dd6 1982 if (deviceUpdate->version >= IOTHUB_REGISTRY_DEVICE_UPDATE_EX_VERSION_1)
XinZhangMS 0:f7f1f0d76dd6 1983 {
XinZhangMS 0:f7f1f0d76dd6 1984 deviceOrModuleUpdate.deviceId = deviceUpdate->deviceId;
XinZhangMS 0:f7f1f0d76dd6 1985 deviceOrModuleUpdate.primaryKey = deviceUpdate->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 1986 deviceOrModuleUpdate.secondaryKey = deviceUpdate->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 1987 deviceOrModuleUpdate.status = deviceUpdate->status;
XinZhangMS 0:f7f1f0d76dd6 1988 deviceOrModuleUpdate.authMethod = deviceUpdate->authMethod;
XinZhangMS 0:f7f1f0d76dd6 1989 deviceOrModuleUpdate.iotEdge_capable = deviceUpdate->iotEdge_capable;
XinZhangMS 0:f7f1f0d76dd6 1990 }
XinZhangMS 0:f7f1f0d76dd6 1991
XinZhangMS 0:f7f1f0d76dd6 1992 result = IoTHubRegistryManager_UpdateDeviceOrModule(registryManagerHandle, &deviceOrModuleUpdate);
XinZhangMS 0:f7f1f0d76dd6 1993 }
XinZhangMS 0:f7f1f0d76dd6 1994
XinZhangMS 0:f7f1f0d76dd6 1995 return result;
XinZhangMS 0:f7f1f0d76dd6 1996 }
XinZhangMS 0:f7f1f0d76dd6 1997
XinZhangMS 0:f7f1f0d76dd6 1998 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_DeleteDevice(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const char* deviceId)
XinZhangMS 0:f7f1f0d76dd6 1999 {
XinZhangMS 0:f7f1f0d76dd6 2000 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 2001
XinZhangMS 0:f7f1f0d76dd6 2002 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_052: [ IoTHubRegistryManager_DeleteDevice shall verify the input parameters and if any of them are NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 2003 if ((registryManagerHandle == NULL) || (deviceId == NULL))
XinZhangMS 0:f7f1f0d76dd6 2004 {
XinZhangMS 0:f7f1f0d76dd6 2005 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 2006 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2007 }
XinZhangMS 0:f7f1f0d76dd6 2008 else
XinZhangMS 0:f7f1f0d76dd6 2009 {
XinZhangMS 0:f7f1f0d76dd6 2010 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_053: [ IoTHubRegistryManager_DeleteDevice shall create HTTP DELETE request URL using the given deviceId using the following format : url / devices / [deviceId] ? api - version ] */
XinZhangMS 0:f7f1f0d76dd6 2011 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_054: [ IoTHubRegistryManager_DeleteDevice shall add the following headers to the created HTTP GET request : authorization = sasToken, Request - Id = 1001, Accept = application / json, Content - Type = application / json, charset = utf - 8 ] */
XinZhangMS 0:f7f1f0d76dd6 2012 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_055: [ IoTHubRegistryManager_DeleteDevice shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 2013 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_056: [ IoTHubRegistryManager_DeleteDevice shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 2014 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_057: [ IoTHubRegistryManager_DeleteDevice shall execute the HTTP DELETE request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 2015 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_058: [ IoTHubRegistryManager_DeleteDevice shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_REGISTRYMANAGER_HTTP_STATUS_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 2016 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_059: [ IoTHubRegistryManager_DeleteDevice shall verify the received HTTP status code and if it is less or equal than 300 then return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 2017 result = sendHttpRequestCRUD(registryManagerHandle, IOTHUB_REQUEST_DELETE, deviceId, NULL, NULL, 0, NULL);
XinZhangMS 0:f7f1f0d76dd6 2018 }
XinZhangMS 0:f7f1f0d76dd6 2019 return result;
XinZhangMS 0:f7f1f0d76dd6 2020 }
XinZhangMS 0:f7f1f0d76dd6 2021
XinZhangMS 0:f7f1f0d76dd6 2022 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_GetModuleOrDeviceList(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const char* deviceId, size_t numberOfDevices, SINGLYLINKEDLIST_HANDLE deviceOrModuleList, IOTHUB_REGISTRYMANAGER_MODEL_TYPE struct_type, int struct_version)
XinZhangMS 0:f7f1f0d76dd6 2023 {
XinZhangMS 0:f7f1f0d76dd6 2024 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 2025
XinZhangMS 0:f7f1f0d76dd6 2026 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_060: [ IoTHubRegistryManager_GetDeviceList shall verify the input parameters and if any of them are NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 2027 if ((registryManagerHandle == NULL) || (deviceOrModuleList == NULL))
XinZhangMS 0:f7f1f0d76dd6 2028 {
XinZhangMS 0:f7f1f0d76dd6 2029 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 2030 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2031 }
XinZhangMS 0:f7f1f0d76dd6 2032 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_061: [ IoTHubRegistryManager_GetDeviceList shall verify if the numberOfDevices input parameter is between 1 and 1000 and if it is not then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 2033 else if ((numberOfDevices == 0) || (numberOfDevices > IOTHUB_DEVICES_MAX_REQUEST))
XinZhangMS 0:f7f1f0d76dd6 2034 {
XinZhangMS 0:f7f1f0d76dd6 2035 LogError("numberOfDevices has to be between 1 and 1000");
XinZhangMS 0:f7f1f0d76dd6 2036 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2037 }
XinZhangMS 0:f7f1f0d76dd6 2038 else if ((struct_type == IOTHUB_REGISTRYMANAGER_MODEL_TYPE_MODULE) && ((struct_version < IOTHUB_MODULE_VERSION_1) || (struct_version > IOTHUB_MODULE_VERSION_LATEST)))
XinZhangMS 0:f7f1f0d76dd6 2039 {
XinZhangMS 0:f7f1f0d76dd6 2040 LogError("Invalid module version");
XinZhangMS 0:f7f1f0d76dd6 2041 result = IOTHUB_REGISTRYMANAGER_INVALID_VERSION;
XinZhangMS 0:f7f1f0d76dd6 2042 }
XinZhangMS 0:f7f1f0d76dd6 2043 else
XinZhangMS 0:f7f1f0d76dd6 2044 {
XinZhangMS 0:f7f1f0d76dd6 2045 BUFFER_HANDLE responseBuffer = NULL;
XinZhangMS 0:f7f1f0d76dd6 2046
XinZhangMS 0:f7f1f0d76dd6 2047 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_109: [ IoTHubRegistryManager_GetDeviceList shall allocate memory for response buffer by calling BUFFER_new ] */
XinZhangMS 0:f7f1f0d76dd6 2048 if ((responseBuffer = BUFFER_new()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 2049 {
XinZhangMS 0:f7f1f0d76dd6 2050 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_110: [ If the BUFFER_new fails, IoTHubRegistryManager_GetDeviceList shall do clean up and return NULL ] */
XinZhangMS 0:f7f1f0d76dd6 2051 LogError("BUFFER_new failed for responseBuffer");
XinZhangMS 0:f7f1f0d76dd6 2052 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 2053 }
XinZhangMS 0:f7f1f0d76dd6 2054 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_062: [ IoTHubRegistryManager_GetDeviceList shall create HTTP GET request for numberOfDevices using the follwoing format: url/devices/?top=[numberOfDevices]&api-version ] */
XinZhangMS 0:f7f1f0d76dd6 2055 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_063: [ IoTHubRegistryManager_GetDeviceList shall add the following headers to the created HTTP GET request: authorization=sasToken,Request-Id=1001,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 2056 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_064: [ IoTHubRegistryManager_GetDeviceList shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 2057 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_065: [ IoTHubRegistryManager_GetDeviceList shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 2058 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_066: [ IoTHubRegistryManager_GetDeviceList shall execute the HTTP GET request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 2059 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_067: [ IoTHubRegistryManager_GetDeviceList shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 2060 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_068: [ IoTHubRegistryManager_GetDeviceList 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 2061 else if ((result = sendHttpRequestCRUD(registryManagerHandle, IOTHUB_REQUEST_GET_DEVICE_LIST, deviceId, NULL, NULL, numberOfDevices, responseBuffer)) == IOTHUB_REGISTRYMANAGER_ERROR)
XinZhangMS 0:f7f1f0d76dd6 2062 {
XinZhangMS 0:f7f1f0d76dd6 2063 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_115: [ If any of the HTTPAPI call fails IoTHubRegistryManager_GetDeviceList shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 2064 LogError("Failure sending HTTP request for get device list");
XinZhangMS 0:f7f1f0d76dd6 2065 }
XinZhangMS 0:f7f1f0d76dd6 2066 else if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 2067 {
XinZhangMS 0:f7f1f0d76dd6 2068 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_069: [ IoTHubRegistryManager_GetDeviceList shall use the following parson APIs to parse the response JSON: json_parse_string, json_value_get_object, json_object_get_string, json_object_dotget_string ] */
XinZhangMS 0:f7f1f0d76dd6 2069 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_070: [ If any of the parson API fails, IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_JSON_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 2070 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_071: [ IoTHubRegistryManager_GetDeviceList shall populate the deviceList parameter with structures of type "IOTHUB_DEVICE" ] */
XinZhangMS 0:f7f1f0d76dd6 2071 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_072: [ If populating the deviceList parameter fails IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 2072 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_073: [ If populating the deviceList parameter successful IoTHubRegistryManager_GetDeviceList shall return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 2073 result = parseDeviceOrModuleListJson(responseBuffer, deviceOrModuleList, struct_type, struct_version);
XinZhangMS 0:f7f1f0d76dd6 2074 }
XinZhangMS 0:f7f1f0d76dd6 2075
XinZhangMS 0:f7f1f0d76dd6 2076 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_111: [ IoTHubRegistryManager_GetDeviceList shall do clean up before return ] */
XinZhangMS 0:f7f1f0d76dd6 2077 if (responseBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 2078 {
XinZhangMS 0:f7f1f0d76dd6 2079 BUFFER_delete(responseBuffer);
XinZhangMS 0:f7f1f0d76dd6 2080 }
XinZhangMS 0:f7f1f0d76dd6 2081 }
XinZhangMS 0:f7f1f0d76dd6 2082 return result;
XinZhangMS 0:f7f1f0d76dd6 2083 }
XinZhangMS 0:f7f1f0d76dd6 2084
XinZhangMS 0:f7f1f0d76dd6 2085 /* DEPRECATED: IoTHubRegistryManager_GetDeviceList is deprecated and may be removed from a future release. */
XinZhangMS 0:f7f1f0d76dd6 2086 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_GetDeviceList(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, size_t numberOfDevices, SINGLYLINKEDLIST_HANDLE deviceList)
XinZhangMS 0:f7f1f0d76dd6 2087 {
XinZhangMS 0:f7f1f0d76dd6 2088 return IoTHubRegistryManager_GetModuleOrDeviceList(registryManagerHandle, NULL, numberOfDevices, deviceList, IOTHUB_REGISTRYMANAGER_MODEL_TYPE_DEVICE, 0);
XinZhangMS 0:f7f1f0d76dd6 2089 }
XinZhangMS 0:f7f1f0d76dd6 2090
XinZhangMS 0:f7f1f0d76dd6 2091 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_GetStatistics(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, IOTHUB_REGISTRY_STATISTICS* registryStatistics)
XinZhangMS 0:f7f1f0d76dd6 2092 {
XinZhangMS 0:f7f1f0d76dd6 2093 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 2094
XinZhangMS 0:f7f1f0d76dd6 2095 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_074: [ IoTHubRegistryManager_GetStatistics shall verify the input parameters and if any of them are NULL then return IOTHUB_REGISTRYMANAGER_INVALID_ARG ] */
XinZhangMS 0:f7f1f0d76dd6 2096 if ((registryManagerHandle == NULL) || (registryStatistics == NULL))
XinZhangMS 0:f7f1f0d76dd6 2097 {
XinZhangMS 0:f7f1f0d76dd6 2098 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 2099 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2100 }
XinZhangMS 0:f7f1f0d76dd6 2101 else
XinZhangMS 0:f7f1f0d76dd6 2102 {
XinZhangMS 0:f7f1f0d76dd6 2103 BUFFER_HANDLE responseBuffer;
XinZhangMS 0:f7f1f0d76dd6 2104
XinZhangMS 0:f7f1f0d76dd6 2105 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_112: [ IoTHubRegistryManager_GetStatistics shall allocate memory for response buffer by calling BUFFER_new ] */
XinZhangMS 0:f7f1f0d76dd6 2106 if ((responseBuffer = BUFFER_new()) == NULL)
XinZhangMS 0:f7f1f0d76dd6 2107 {
XinZhangMS 0:f7f1f0d76dd6 2108 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_113: [ If the BUFFER_new fails, IoTHubRegistryManager_GetStatistics shall do clean up and return NULL ] */
XinZhangMS 0:f7f1f0d76dd6 2109 LogError("BUFFER_new failed for responseBuffer");
XinZhangMS 0:f7f1f0d76dd6 2110 result = IOTHUB_REGISTRYMANAGER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 2111 }
XinZhangMS 0:f7f1f0d76dd6 2112 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_075: [ IoTHubRegistryManager_GetStatistics shall create HTTP GET request for statistics using the following format: url/statistics/devices?api-version ] */
XinZhangMS 0:f7f1f0d76dd6 2113 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_076: [ IoTHubRegistryManager_GetStatistics shall add the following headers to the created HTTP GET request: authorization=sasToken,Request-Id=1001,Accept=application/json,Content-Type=application/json,charset=utf-8 ] */
XinZhangMS 0:f7f1f0d76dd6 2114 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_077: [ IoTHubRegistryManager_GetStatistics shall create an HTTPAPIEX_SAS_HANDLE handle by calling HTTPAPIEX_SAS_Create ] */
XinZhangMS 0:f7f1f0d76dd6 2115 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_078: [ IoTHubRegistryManager_GetStatistics shall create an HTTPAPIEX_HANDLE handle by calling HTTPAPIEX_Create ] */
XinZhangMS 0:f7f1f0d76dd6 2116 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_079: [ IoTHubRegistryManager_GetStatistics shall execute the HTTP GET request by calling HTTPAPIEX_ExecuteRequest ] */
XinZhangMS 0:f7f1f0d76dd6 2117 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_080: [ IoTHubRegistryManager_GetStatistics shall verify the received HTTP status code and if it is greater than 300 then return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 2118 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_081: [ IoTHubRegistryManager_GetStatistics shall verify the received HTTP status code and if it is less or equal than 300 then use the following parson APIs to parse the response JSON to registry statistics structure: json_parse_string, json_value_get_object, json_object_get_string, json_object_dotget_string ] */
XinZhangMS 0:f7f1f0d76dd6 2119 else if ((result = sendHttpRequestCRUD(registryManagerHandle, IOTHUB_REQUEST_GET_STATISTICS, NULL, NULL, NULL, 0, responseBuffer)) == IOTHUB_REGISTRYMANAGER_ERROR)
XinZhangMS 0:f7f1f0d76dd6 2120 {
XinZhangMS 0:f7f1f0d76dd6 2121 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_116: [ If any of the HTTPAPI call fails IoTHubRegistryManager_GetStatistics shall fail and return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 2122 LogError("Failure sending HTTP request for get registry statistics");
XinZhangMS 0:f7f1f0d76dd6 2123 }
XinZhangMS 0:f7f1f0d76dd6 2124 else if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 2125 {
XinZhangMS 0:f7f1f0d76dd6 2126 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_082: [ If the parsing failed, IoTHubRegistryManager_GetStatistics shall return IOTHUB_REGISTRYMANAGER_ERROR ] */
XinZhangMS 0:f7f1f0d76dd6 2127 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_083: [ IoTHubRegistryManager_GetStatistics shall save the registry statistics to the out value and return IOTHUB_REGISTRYMANAGER_OK ] */
XinZhangMS 0:f7f1f0d76dd6 2128 result = parseStatisticsJson(responseBuffer, registryStatistics);
XinZhangMS 0:f7f1f0d76dd6 2129 }
XinZhangMS 0:f7f1f0d76dd6 2130
XinZhangMS 0:f7f1f0d76dd6 2131 /*Codes_SRS_IOTHUBREGISTRYMANAGER_12_114: [ IoTHubRegistryManager_GetStatistics shall do clean up before return ] */
XinZhangMS 0:f7f1f0d76dd6 2132 if (responseBuffer != NULL)
XinZhangMS 0:f7f1f0d76dd6 2133 {
XinZhangMS 0:f7f1f0d76dd6 2134 BUFFER_delete(responseBuffer);
XinZhangMS 0:f7f1f0d76dd6 2135 }
XinZhangMS 0:f7f1f0d76dd6 2136 }
XinZhangMS 0:f7f1f0d76dd6 2137 return result;
XinZhangMS 0:f7f1f0d76dd6 2138 }
XinZhangMS 0:f7f1f0d76dd6 2139
XinZhangMS 0:f7f1f0d76dd6 2140 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_CreateModule(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const IOTHUB_REGISTRY_MODULE_CREATE* moduleCreate, IOTHUB_MODULE* module)
XinZhangMS 0:f7f1f0d76dd6 2141 {
XinZhangMS 0:f7f1f0d76dd6 2142 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 2143
XinZhangMS 0:f7f1f0d76dd6 2144 if ((registryManagerHandle == NULL) || (module == NULL))
XinZhangMS 0:f7f1f0d76dd6 2145 {
XinZhangMS 0:f7f1f0d76dd6 2146 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 2147 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2148 }
XinZhangMS 0:f7f1f0d76dd6 2149 else if ((moduleCreate == NULL) || (moduleCreate->moduleId == NULL))
XinZhangMS 0:f7f1f0d76dd6 2150 {
XinZhangMS 0:f7f1f0d76dd6 2151 LogError("moduleId cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 2152 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2153 }
XinZhangMS 0:f7f1f0d76dd6 2154 else if (moduleCreate->version < IOTHUB_REGISTRY_MODULE_CREATE_VERSION_1 || moduleCreate->version > IOTHUB_REGISTRY_MODULE_CREATE_VERSION_LATEST)
XinZhangMS 0:f7f1f0d76dd6 2155 {
XinZhangMS 0:f7f1f0d76dd6 2156 LogError("moduleCreate must have a valid version");
XinZhangMS 0:f7f1f0d76dd6 2157 result = IOTHUB_REGISTRYMANAGER_INVALID_VERSION;
XinZhangMS 0:f7f1f0d76dd6 2158 }
XinZhangMS 0:f7f1f0d76dd6 2159 else if (module->version < IOTHUB_MODULE_VERSION_1 || module->version > IOTHUB_MODULE_VERSION_LATEST)
XinZhangMS 0:f7f1f0d76dd6 2160 {
XinZhangMS 0:f7f1f0d76dd6 2161 LogError("module must have a valid version");
XinZhangMS 0:f7f1f0d76dd6 2162 result = IOTHUB_REGISTRYMANAGER_INVALID_VERSION;
XinZhangMS 0:f7f1f0d76dd6 2163 }
XinZhangMS 0:f7f1f0d76dd6 2164 else
XinZhangMS 0:f7f1f0d76dd6 2165 {
XinZhangMS 0:f7f1f0d76dd6 2166 IOTHUB_REGISTRY_DEVICE_OR_MODULE_CREATE deviceOrModuleCreateInfo;
XinZhangMS 0:f7f1f0d76dd6 2167 IOTHUB_DEVICE_OR_MODULE deviceOrModuleInfo;
XinZhangMS 0:f7f1f0d76dd6 2168 memset(&deviceOrModuleCreateInfo, 0, sizeof(deviceOrModuleCreateInfo));
XinZhangMS 0:f7f1f0d76dd6 2169 memset(&deviceOrModuleInfo, 0, sizeof(deviceOrModuleInfo));
XinZhangMS 0:f7f1f0d76dd6 2170
XinZhangMS 0:f7f1f0d76dd6 2171 //Convert to generic create struct
XinZhangMS 0:f7f1f0d76dd6 2172 deviceOrModuleCreateInfo.type = IOTHUB_REGISTRYMANAGER_MODEL_TYPE_MODULE;
XinZhangMS 0:f7f1f0d76dd6 2173 if (moduleCreate->version >= IOTHUB_REGISTRY_MODULE_CREATE_VERSION_1)
XinZhangMS 0:f7f1f0d76dd6 2174 {
XinZhangMS 0:f7f1f0d76dd6 2175 deviceOrModuleCreateInfo.deviceId = moduleCreate->deviceId;
XinZhangMS 0:f7f1f0d76dd6 2176 deviceOrModuleCreateInfo.primaryKey = moduleCreate->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 2177 deviceOrModuleCreateInfo.secondaryKey = moduleCreate->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 2178 deviceOrModuleCreateInfo.authMethod = moduleCreate->authMethod;
XinZhangMS 0:f7f1f0d76dd6 2179 deviceOrModuleCreateInfo.moduleId = moduleCreate->moduleId;
XinZhangMS 0:f7f1f0d76dd6 2180 deviceOrModuleCreateInfo.managedBy = moduleCreate->managedBy;
XinZhangMS 0:f7f1f0d76dd6 2181 }
XinZhangMS 0:f7f1f0d76dd6 2182
XinZhangMS 0:f7f1f0d76dd6 2183 result = IoTHubRegistryManager_CreateDeviceOrModule(registryManagerHandle, &deviceOrModuleCreateInfo, &deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 2184 if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 2185 {
XinZhangMS 0:f7f1f0d76dd6 2186 move_deviceOrModule_members_to_module(&deviceOrModuleInfo, module);
XinZhangMS 0:f7f1f0d76dd6 2187 }
XinZhangMS 0:f7f1f0d76dd6 2188 }
XinZhangMS 0:f7f1f0d76dd6 2189
XinZhangMS 0:f7f1f0d76dd6 2190 return result;
XinZhangMS 0:f7f1f0d76dd6 2191 }
XinZhangMS 0:f7f1f0d76dd6 2192
XinZhangMS 0:f7f1f0d76dd6 2193 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_GetModule(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const char* deviceId, const char* moduleId, IOTHUB_MODULE* module)
XinZhangMS 0:f7f1f0d76dd6 2194 {
XinZhangMS 0:f7f1f0d76dd6 2195 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 2196
XinZhangMS 0:f7f1f0d76dd6 2197 if ((registryManagerHandle == NULL) || (deviceId == NULL) || (moduleId == NULL) || (module == NULL))
XinZhangMS 0:f7f1f0d76dd6 2198 {
XinZhangMS 0:f7f1f0d76dd6 2199 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 2200 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2201 }
XinZhangMS 0:f7f1f0d76dd6 2202 else if (module->version < IOTHUB_MODULE_VERSION_1 || module->version > IOTHUB_MODULE_VERSION_LATEST)
XinZhangMS 0:f7f1f0d76dd6 2203 {
XinZhangMS 0:f7f1f0d76dd6 2204 LogError("module must have a valid version");
XinZhangMS 0:f7f1f0d76dd6 2205 result = IOTHUB_REGISTRYMANAGER_INVALID_VERSION;
XinZhangMS 0:f7f1f0d76dd6 2206 }
XinZhangMS 0:f7f1f0d76dd6 2207 else
XinZhangMS 0:f7f1f0d76dd6 2208 {
XinZhangMS 0:f7f1f0d76dd6 2209 IOTHUB_DEVICE_OR_MODULE deviceOrModuleInfo;
XinZhangMS 0:f7f1f0d76dd6 2210
XinZhangMS 0:f7f1f0d76dd6 2211 result = IoTHubRegistryManager_GetDeviceOrModule(registryManagerHandle, deviceId, moduleId, &deviceOrModuleInfo);
XinZhangMS 0:f7f1f0d76dd6 2212 if (deviceOrModuleInfo.moduleId == NULL)
XinZhangMS 0:f7f1f0d76dd6 2213 {
XinZhangMS 0:f7f1f0d76dd6 2214 result = IOTHUB_REGISTRYMANAGER_DEVICE_NOT_EXIST;
XinZhangMS 0:f7f1f0d76dd6 2215 }
XinZhangMS 0:f7f1f0d76dd6 2216 else if (result == IOTHUB_REGISTRYMANAGER_OK)
XinZhangMS 0:f7f1f0d76dd6 2217 {
XinZhangMS 0:f7f1f0d76dd6 2218 move_deviceOrModule_members_to_module(&deviceOrModuleInfo, module);
XinZhangMS 0:f7f1f0d76dd6 2219 }
XinZhangMS 0:f7f1f0d76dd6 2220 }
XinZhangMS 0:f7f1f0d76dd6 2221
XinZhangMS 0:f7f1f0d76dd6 2222 return result;
XinZhangMS 0:f7f1f0d76dd6 2223 }
XinZhangMS 0:f7f1f0d76dd6 2224
XinZhangMS 0:f7f1f0d76dd6 2225 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_UpdateModule(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, IOTHUB_REGISTRY_MODULE_UPDATE* moduleUpdate)
XinZhangMS 0:f7f1f0d76dd6 2226 {
XinZhangMS 0:f7f1f0d76dd6 2227 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 2228
XinZhangMS 0:f7f1f0d76dd6 2229 if (registryManagerHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 2230 {
XinZhangMS 0:f7f1f0d76dd6 2231 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 2232 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2233 }
XinZhangMS 0:f7f1f0d76dd6 2234 else if ((moduleUpdate == NULL) || (moduleUpdate->moduleId == NULL))
XinZhangMS 0:f7f1f0d76dd6 2235 {
XinZhangMS 0:f7f1f0d76dd6 2236 LogError("moduleId cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 2237 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2238 }
XinZhangMS 0:f7f1f0d76dd6 2239 else if (moduleUpdate->version < IOTHUB_REGISTRY_MODULE_UPDATE_VERSION_1 || moduleUpdate->version > IOTHUB_REGISTRY_MODULE_UPDATE_VERSION_LATEST)
XinZhangMS 0:f7f1f0d76dd6 2240 {
XinZhangMS 0:f7f1f0d76dd6 2241 LogError("moduleUpdate must have valid version");
XinZhangMS 0:f7f1f0d76dd6 2242 result = IOTHUB_REGISTRYMANAGER_INVALID_VERSION;
XinZhangMS 0:f7f1f0d76dd6 2243 }
XinZhangMS 0:f7f1f0d76dd6 2244 else
XinZhangMS 0:f7f1f0d76dd6 2245 {
XinZhangMS 0:f7f1f0d76dd6 2246 IOTHUB_REGISTRY_DEVICE_OR_MODULE_UPDATE deviceOrModuleUpdate;
XinZhangMS 0:f7f1f0d76dd6 2247 memset(&deviceOrModuleUpdate, 0, sizeof(deviceOrModuleUpdate));
XinZhangMS 0:f7f1f0d76dd6 2248
XinZhangMS 0:f7f1f0d76dd6 2249 //Convert to generic update struct
XinZhangMS 0:f7f1f0d76dd6 2250 deviceOrModuleUpdate.type = IOTHUB_REGISTRYMANAGER_MODEL_TYPE_MODULE;
XinZhangMS 0:f7f1f0d76dd6 2251 if (moduleUpdate-> version >= IOTHUB_REGISTRY_MODULE_UPDATE_VERSION_1)
XinZhangMS 0:f7f1f0d76dd6 2252 {
XinZhangMS 0:f7f1f0d76dd6 2253 deviceOrModuleUpdate.deviceId = moduleUpdate->deviceId;
XinZhangMS 0:f7f1f0d76dd6 2254 deviceOrModuleUpdate.primaryKey = moduleUpdate->primaryKey;
XinZhangMS 0:f7f1f0d76dd6 2255 deviceOrModuleUpdate.secondaryKey = moduleUpdate->secondaryKey;
XinZhangMS 0:f7f1f0d76dd6 2256 deviceOrModuleUpdate.status = moduleUpdate->status;
XinZhangMS 0:f7f1f0d76dd6 2257 deviceOrModuleUpdate.authMethod = moduleUpdate->authMethod;
XinZhangMS 0:f7f1f0d76dd6 2258 deviceOrModuleUpdate.moduleId = moduleUpdate->moduleId;
XinZhangMS 0:f7f1f0d76dd6 2259 deviceOrModuleUpdate.managedBy = moduleUpdate->managedBy;
XinZhangMS 0:f7f1f0d76dd6 2260 }
XinZhangMS 0:f7f1f0d76dd6 2261
XinZhangMS 0:f7f1f0d76dd6 2262 result = IoTHubRegistryManager_UpdateDeviceOrModule(registryManagerHandle, &deviceOrModuleUpdate);
XinZhangMS 0:f7f1f0d76dd6 2263 }
XinZhangMS 0:f7f1f0d76dd6 2264
XinZhangMS 0:f7f1f0d76dd6 2265 return result;
XinZhangMS 0:f7f1f0d76dd6 2266 }
XinZhangMS 0:f7f1f0d76dd6 2267
XinZhangMS 0:f7f1f0d76dd6 2268 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_DeleteModule(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const char* deviceId, const char* moduleId)
XinZhangMS 0:f7f1f0d76dd6 2269 {
XinZhangMS 0:f7f1f0d76dd6 2270 IOTHUB_REGISTRYMANAGER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 2271
XinZhangMS 0:f7f1f0d76dd6 2272 if ((registryManagerHandle == NULL) || (deviceId == NULL) || (moduleId == NULL))
XinZhangMS 0:f7f1f0d76dd6 2273 {
XinZhangMS 0:f7f1f0d76dd6 2274 LogError("Input parameter cannot be NULL");
XinZhangMS 0:f7f1f0d76dd6 2275 result = IOTHUB_REGISTRYMANAGER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 2276 }
XinZhangMS 0:f7f1f0d76dd6 2277 else
XinZhangMS 0:f7f1f0d76dd6 2278 {
XinZhangMS 0:f7f1f0d76dd6 2279 result = sendHttpRequestCRUD(registryManagerHandle, IOTHUB_REQUEST_DELETE, deviceId, moduleId, NULL, 0, NULL);
XinZhangMS 0:f7f1f0d76dd6 2280 }
XinZhangMS 0:f7f1f0d76dd6 2281 return result;
XinZhangMS 0:f7f1f0d76dd6 2282 }
XinZhangMS 0:f7f1f0d76dd6 2283
XinZhangMS 0:f7f1f0d76dd6 2284 IOTHUB_REGISTRYMANAGER_RESULT IoTHubRegistryManager_GetModuleList(IOTHUB_REGISTRYMANAGER_HANDLE registryManagerHandle, const char* deviceId, SINGLYLINKEDLIST_HANDLE moduleList, int module_version)
XinZhangMS 0:f7f1f0d76dd6 2285 {
XinZhangMS 0:f7f1f0d76dd6 2286 return IoTHubRegistryManager_GetModuleOrDeviceList(registryManagerHandle, deviceId, IOTHUB_DEVICES_MAX_REQUEST, moduleList, IOTHUB_REGISTRYMANAGER_MODEL_TYPE_MODULE, module_version);
XinZhangMS 0:f7f1f0d76dd6 2287 }
XinZhangMS 0:f7f1f0d76dd6 2288