A modelling and serializer library for Microsoft Azure IoTHub client applications

Dependents:   sht15_remote_monitoring f767zi_mqtt remote_monitoring simplesample_amqp ... more

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

Committer:
AzureIoTClient
Date:
Tue Sep 11 11:14:37 2018 -0700
Revision:
36:7d12a5386197
Parent:
24:49c36a13bed1
1.2.9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 0:1f9b2707ec7d 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 0:1f9b2707ec7d 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 0:1f9b2707ec7d 3
AzureIoTClient 0:1f9b2707ec7d 4 #include <stdlib.h>
Azure.IoT Build 10:c2aee3965a83 5 #include "azure_c_shared_utility/gballoc.h"
AzureIoTClient 0:1f9b2707ec7d 6
AzureIoTClient 0:1f9b2707ec7d 7 #include "schema.h"
Azure.IoT Build 10:c2aee3965a83 8 #include "azure_c_shared_utility/crt_abstractions.h"
Azure.IoT Build 13:16e88f0cfa5f 9 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 10:c2aee3965a83 10 #include "azure_c_shared_utility/vector.h"
AzureIoTClient 0:1f9b2707ec7d 11
AzureIoTClient 0:1f9b2707ec7d 12
AzureIoTClient 0:1f9b2707ec7d 13 DEFINE_ENUM_STRINGS(SCHEMA_RESULT, SCHEMA_RESULT_VALUES);
AzureIoTClient 0:1f9b2707ec7d 14
AzureIoTClient 17:fa1bba4c6053 15 typedef struct SCHEMA_PROPERTY_HANDLE_DATA_TAG
AzureIoTClient 0:1f9b2707ec7d 16 {
AzureIoTClient 0:1f9b2707ec7d 17 const char* PropertyName;
AzureIoTClient 0:1f9b2707ec7d 18 const char* PropertyType;
AzureIoTClient 17:fa1bba4c6053 19 } SCHEMA_PROPERTY_HANDLE_DATA;
AzureIoTClient 17:fa1bba4c6053 20
AzureIoTClient 17:fa1bba4c6053 21 typedef struct SCHEMA_REPORTED_PROPERTY_HANDLE_DATA_TAG
AzureIoTClient 17:fa1bba4c6053 22 {
AzureIoTClient 17:fa1bba4c6053 23 const char* reportedPropertyName;
AzureIoTClient 17:fa1bba4c6053 24 const char* reportedPropertyType;
AzureIoTClient 17:fa1bba4c6053 25 } SCHEMA_REPORTED_PROPERTY_HANDLE_DATA;
AzureIoTClient 0:1f9b2707ec7d 26
AzureIoTClient 17:fa1bba4c6053 27 typedef struct SCHEMA_DESIRED_PROPERTY_HANDLE_DATA_TAG
AzureIoTClient 17:fa1bba4c6053 28 {
AzureIoTClient 17:fa1bba4c6053 29 pfOnDesiredProperty onDesiredProperty;
AzureIoTClient 17:fa1bba4c6053 30 pfDesiredPropertyInitialize desiredPropertInitialize;
AzureIoTClient 17:fa1bba4c6053 31 pfDesiredPropertyDeinitialize desiredPropertDeinitialize;
AzureIoTClient 17:fa1bba4c6053 32 const char* desiredPropertyName;
AzureIoTClient 17:fa1bba4c6053 33 const char* desiredPropertyType;
AzureIoTClient 17:fa1bba4c6053 34 pfDesiredPropertyFromAGENT_DATA_TYPE desiredPropertyFromAGENT_DATA_TYPE;
AzureIoTClient 17:fa1bba4c6053 35 size_t offset;
AzureIoTClient 17:fa1bba4c6053 36 } SCHEMA_DESIRED_PROPERTY_HANDLE_DATA;
AzureIoTClient 17:fa1bba4c6053 37
AzureIoTClient 17:fa1bba4c6053 38 typedef struct SCHEMA_ACTION_ARGUMENT_HANDLE_DATA_TAG
AzureIoTClient 0:1f9b2707ec7d 39 {
AzureIoTClient 0:1f9b2707ec7d 40 const char* Name;
AzureIoTClient 0:1f9b2707ec7d 41 const char* Type;
AzureIoTClient 17:fa1bba4c6053 42 } SCHEMA_ACTION_ARGUMENT_HANDLE_DATA;
AzureIoTClient 0:1f9b2707ec7d 43
Azure.IoT.Build 18:58b667752399 44 typedef struct SCHEMA_METHOD_ARGUMENT_HANDLE_DATA_TAG
Azure.IoT.Build 18:58b667752399 45 {
Azure.IoT.Build 18:58b667752399 46 char* Name;
Azure.IoT.Build 18:58b667752399 47 char* Type;
Azure.IoT.Build 18:58b667752399 48 } SCHEMA_METHOD_ARGUMENT_HANDLE_DATA;
Azure.IoT.Build 18:58b667752399 49
AzureIoTClient 17:fa1bba4c6053 50 typedef struct SCHEMA_ACTION_HANDLE_DATA_TAG
AzureIoTClient 0:1f9b2707ec7d 51 {
AzureIoTClient 0:1f9b2707ec7d 52 const char* ActionName;
AzureIoTClient 0:1f9b2707ec7d 53 size_t ArgumentCount;
AzureIoTClient 0:1f9b2707ec7d 54 SCHEMA_ACTION_ARGUMENT_HANDLE* ArgumentHandles;
AzureIoTClient 17:fa1bba4c6053 55 } SCHEMA_ACTION_HANDLE_DATA;
AzureIoTClient 0:1f9b2707ec7d 56
Azure.IoT.Build 18:58b667752399 57 typedef struct SCHEMA_METHOD_HANDLE_DATA_TAG
Azure.IoT.Build 18:58b667752399 58 {
Azure.IoT.Build 18:58b667752399 59 char* methodName;
Azure.IoT.Build 18:58b667752399 60 VECTOR_HANDLE methodArguments; /*holds SCHEMA_METHOD_ARGUMENT_HANDLE*/
Azure.IoT.Build 18:58b667752399 61 } SCHEMA_METHOD_HANDLE_DATA;
Azure.IoT.Build 18:58b667752399 62
AzureIoTClient 0:1f9b2707ec7d 63 typedef struct MODEL_IN_MODEL_TAG
AzureIoTClient 0:1f9b2707ec7d 64 {
AzureIoTClient 17:fa1bba4c6053 65 pfOnDesiredProperty onDesiredProperty; /*is NULL if not specified or if the model in model is not WITH_DESIRED_PROPERTY*/
AzureIoTClient 17:fa1bba4c6053 66 size_t offset; /*offset of the model in model (offsetof)*/
AzureIoTClient 0:1f9b2707ec7d 67 const char* propertyName;
AzureIoTClient 0:1f9b2707ec7d 68 SCHEMA_MODEL_TYPE_HANDLE modelHandle;
AzureIoTClient 0:1f9b2707ec7d 69 } MODEL_IN_MODEL;
AzureIoTClient 0:1f9b2707ec7d 70
AzureIoTClient 17:fa1bba4c6053 71 typedef struct SCHEMA_MODEL_TYPE_HANDLE_DATA_TAG
AzureIoTClient 0:1f9b2707ec7d 72 {
Azure.IoT.Build 18:58b667752399 73 VECTOR_HANDLE methods; /*holds SCHEMA_METHOD_HANDLE*/
AzureIoTClient 17:fa1bba4c6053 74 VECTOR_HANDLE desiredProperties; /*holds SCHEMA_DESIRED_PROPERTY_HANDLE_DATA*/
AzureIoTClient 0:1f9b2707ec7d 75 const char* Name;
AzureIoTClient 0:1f9b2707ec7d 76 SCHEMA_HANDLE SchemaHandle;
AzureIoTClient 0:1f9b2707ec7d 77 SCHEMA_PROPERTY_HANDLE* Properties;
AzureIoTClient 0:1f9b2707ec7d 78 size_t PropertyCount;
AzureIoTClient 17:fa1bba4c6053 79 VECTOR_HANDLE reportedProperties; /*holds SCHEMA_REPORTED_PROPERTY_HANDLE*/
AzureIoTClient 0:1f9b2707ec7d 80 SCHEMA_ACTION_HANDLE* Actions;
AzureIoTClient 0:1f9b2707ec7d 81 size_t ActionCount;
AzureIoTClient 0:1f9b2707ec7d 82 VECTOR_HANDLE models;
AzureIoTClient 0:1f9b2707ec7d 83 size_t DeviceCount;
AzureIoTClient 17:fa1bba4c6053 84 } SCHEMA_MODEL_TYPE_HANDLE_DATA;
AzureIoTClient 0:1f9b2707ec7d 85
AzureIoTClient 17:fa1bba4c6053 86 typedef struct SCHEMA_STRUCT_TYPE_HANDLE_DATA_TAG
AzureIoTClient 0:1f9b2707ec7d 87 {
AzureIoTClient 0:1f9b2707ec7d 88 const char* Name;
AzureIoTClient 0:1f9b2707ec7d 89 SCHEMA_PROPERTY_HANDLE* Properties;
AzureIoTClient 0:1f9b2707ec7d 90 size_t PropertyCount;
AzureIoTClient 17:fa1bba4c6053 91 } SCHEMA_STRUCT_TYPE_HANDLE_DATA;
AzureIoTClient 0:1f9b2707ec7d 92
AzureIoTClient 17:fa1bba4c6053 93 typedef struct SCHEMA_HANDLE_DATA_TAG
AzureIoTClient 0:1f9b2707ec7d 94 {
AzureIoTClient 17:fa1bba4c6053 95 void* metadata;
AzureIoTClient 0:1f9b2707ec7d 96 const char* Namespace;
AzureIoTClient 0:1f9b2707ec7d 97 SCHEMA_MODEL_TYPE_HANDLE* ModelTypes;
AzureIoTClient 0:1f9b2707ec7d 98 size_t ModelTypeCount;
AzureIoTClient 0:1f9b2707ec7d 99 SCHEMA_STRUCT_TYPE_HANDLE* StructTypes;
AzureIoTClient 0:1f9b2707ec7d 100 size_t StructTypeCount;
AzureIoTClient 17:fa1bba4c6053 101 } SCHEMA_HANDLE_DATA;
AzureIoTClient 0:1f9b2707ec7d 102
AzureIoTClient 0:1f9b2707ec7d 103 static VECTOR_HANDLE g_schemas = NULL;
AzureIoTClient 0:1f9b2707ec7d 104
AzureIoTClient 0:1f9b2707ec7d 105 static void DestroyProperty(SCHEMA_PROPERTY_HANDLE propertyHandle)
AzureIoTClient 0:1f9b2707ec7d 106 {
AzureIoTClient 17:fa1bba4c6053 107 SCHEMA_PROPERTY_HANDLE_DATA* propertyType = (SCHEMA_PROPERTY_HANDLE_DATA*)propertyHandle;
AzureIoTClient 0:1f9b2707ec7d 108 free((void*)propertyType->PropertyName);
AzureIoTClient 0:1f9b2707ec7d 109 free((void*)propertyType->PropertyType);
AzureIoTClient 0:1f9b2707ec7d 110 free(propertyType);
AzureIoTClient 0:1f9b2707ec7d 111 }
AzureIoTClient 0:1f9b2707ec7d 112
AzureIoTClient 0:1f9b2707ec7d 113 static void DestroyActionArgument(SCHEMA_ACTION_ARGUMENT_HANDLE actionArgumentHandle)
AzureIoTClient 0:1f9b2707ec7d 114 {
AzureIoTClient 17:fa1bba4c6053 115 SCHEMA_ACTION_ARGUMENT_HANDLE_DATA* actionArgument = (SCHEMA_ACTION_ARGUMENT_HANDLE_DATA*)actionArgumentHandle;
AzureIoTClient 0:1f9b2707ec7d 116 if (actionArgument != NULL)
AzureIoTClient 0:1f9b2707ec7d 117 {
AzureIoTClient 0:1f9b2707ec7d 118 free((void*)actionArgument->Name);
AzureIoTClient 0:1f9b2707ec7d 119 free((void*)actionArgument->Type);
AzureIoTClient 0:1f9b2707ec7d 120 free(actionArgument);
AzureIoTClient 0:1f9b2707ec7d 121 }
AzureIoTClient 0:1f9b2707ec7d 122 }
AzureIoTClient 0:1f9b2707ec7d 123
Azure.IoT.Build 18:58b667752399 124 static void DestroyMethodArgument(SCHEMA_METHOD_ARGUMENT_HANDLE methodArgumentHandle)
Azure.IoT.Build 18:58b667752399 125 {
Azure.IoT.Build 18:58b667752399 126 free(methodArgumentHandle->Name);
Azure.IoT.Build 18:58b667752399 127 free(methodArgumentHandle->Type);
Azure.IoT.Build 18:58b667752399 128 free(methodArgumentHandle);
Azure.IoT.Build 18:58b667752399 129 }
Azure.IoT.Build 18:58b667752399 130
AzureIoTClient 0:1f9b2707ec7d 131 static void DestroyAction(SCHEMA_ACTION_HANDLE actionHandle)
AzureIoTClient 0:1f9b2707ec7d 132 {
AzureIoTClient 17:fa1bba4c6053 133 SCHEMA_ACTION_HANDLE_DATA* action = (SCHEMA_ACTION_HANDLE_DATA*)actionHandle;
AzureIoTClient 0:1f9b2707ec7d 134 if (action != NULL)
AzureIoTClient 0:1f9b2707ec7d 135 {
AzureIoTClient 0:1f9b2707ec7d 136 size_t j;
AzureIoTClient 36:7d12a5386197 137
AzureIoTClient 0:1f9b2707ec7d 138 for (j = 0; j < action->ArgumentCount; j++)
AzureIoTClient 0:1f9b2707ec7d 139 {
AzureIoTClient 0:1f9b2707ec7d 140 DestroyActionArgument(action->ArgumentHandles[j]);
AzureIoTClient 0:1f9b2707ec7d 141 }
AzureIoTClient 0:1f9b2707ec7d 142 free(action->ArgumentHandles);
AzureIoTClient 0:1f9b2707ec7d 143
AzureIoTClient 0:1f9b2707ec7d 144 free((void*)action->ActionName);
AzureIoTClient 0:1f9b2707ec7d 145 free(action);
AzureIoTClient 0:1f9b2707ec7d 146 }
AzureIoTClient 0:1f9b2707ec7d 147 }
AzureIoTClient 0:1f9b2707ec7d 148
Azure.IoT.Build 18:58b667752399 149 static void DestroyMethod(SCHEMA_METHOD_HANDLE methodHandle)
Azure.IoT.Build 18:58b667752399 150 {
Azure.IoT.Build 18:58b667752399 151 size_t nArguments = VECTOR_size(methodHandle->methodArguments);
Azure.IoT.Build 18:58b667752399 152
Azure.IoT.Build 18:58b667752399 153 for (size_t j = 0; j < nArguments; j++)
Azure.IoT.Build 18:58b667752399 154 {
Azure.IoT.Build 18:58b667752399 155 SCHEMA_METHOD_ARGUMENT_HANDLE* methodArgumentHandle = VECTOR_element(methodHandle->methodArguments, j);
Azure.IoT.Build 18:58b667752399 156 DestroyMethodArgument(*methodArgumentHandle);
Azure.IoT.Build 18:58b667752399 157 }
Azure.IoT.Build 18:58b667752399 158 free(methodHandle->methodName);
Azure.IoT.Build 18:58b667752399 159 VECTOR_destroy(methodHandle->methodArguments);
Azure.IoT.Build 18:58b667752399 160 free(methodHandle);
Azure.IoT.Build 18:58b667752399 161 }
Azure.IoT.Build 18:58b667752399 162
Azure.IoT.Build 18:58b667752399 163 static void DestroyMethods(SCHEMA_MODEL_TYPE_HANDLE modelHandle)
Azure.IoT.Build 18:58b667752399 164 {
Azure.IoT.Build 18:58b667752399 165 size_t nMethods = VECTOR_size(modelHandle->methods);
Azure.IoT.Build 18:58b667752399 166
Azure.IoT.Build 18:58b667752399 167 for (size_t j = 0; j < nMethods; j++)
Azure.IoT.Build 18:58b667752399 168 {
Azure.IoT.Build 18:58b667752399 169 SCHEMA_METHOD_HANDLE* methodHandle = VECTOR_element(modelHandle->methods, j);
Azure.IoT.Build 18:58b667752399 170 DestroyMethod(*methodHandle);
Azure.IoT.Build 18:58b667752399 171 }
Azure.IoT.Build 18:58b667752399 172 VECTOR_destroy(modelHandle->methods);
Azure.IoT.Build 18:58b667752399 173 }
Azure.IoT.Build 18:58b667752399 174
Azure.IoT.Build 18:58b667752399 175
AzureIoTClient 0:1f9b2707ec7d 176 static void DestroyStruct(SCHEMA_STRUCT_TYPE_HANDLE structTypeHandle)
AzureIoTClient 0:1f9b2707ec7d 177 {
AzureIoTClient 0:1f9b2707ec7d 178 size_t i;
AzureIoTClient 17:fa1bba4c6053 179 SCHEMA_STRUCT_TYPE_HANDLE_DATA* structType = (SCHEMA_STRUCT_TYPE_HANDLE_DATA*)structTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 180 if (structType != NULL)
AzureIoTClient 0:1f9b2707ec7d 181 {
AzureIoTClient 0:1f9b2707ec7d 182 for (i = 0; i < structType->PropertyCount; i++)
AzureIoTClient 0:1f9b2707ec7d 183 {
AzureIoTClient 0:1f9b2707ec7d 184 DestroyProperty(structType->Properties[i]);
AzureIoTClient 0:1f9b2707ec7d 185 }
AzureIoTClient 0:1f9b2707ec7d 186 free(structType->Properties);
AzureIoTClient 0:1f9b2707ec7d 187
AzureIoTClient 0:1f9b2707ec7d 188 free((void*)structType->Name);
AzureIoTClient 0:1f9b2707ec7d 189
AzureIoTClient 0:1f9b2707ec7d 190 free(structType);
AzureIoTClient 0:1f9b2707ec7d 191 }
AzureIoTClient 0:1f9b2707ec7d 192 }
AzureIoTClient 0:1f9b2707ec7d 193
AzureIoTClient 0:1f9b2707ec7d 194 static void DestroyModel(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle)
AzureIoTClient 0:1f9b2707ec7d 195 {
AzureIoTClient 17:fa1bba4c6053 196 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 197 size_t i, nReportedProperties;
AzureIoTClient 0:1f9b2707ec7d 198
AzureIoTClient 0:1f9b2707ec7d 199 free((void*)modelType->Name);
AzureIoTClient 0:1f9b2707ec7d 200 modelType->Name = NULL;
AzureIoTClient 0:1f9b2707ec7d 201
AzureIoTClient 0:1f9b2707ec7d 202 for (i = 0; i < modelType->PropertyCount; i++)
AzureIoTClient 0:1f9b2707ec7d 203 {
AzureIoTClient 0:1f9b2707ec7d 204 DestroyProperty(modelType->Properties[i]);
AzureIoTClient 0:1f9b2707ec7d 205 }
AzureIoTClient 0:1f9b2707ec7d 206
AzureIoTClient 0:1f9b2707ec7d 207 free(modelType->Properties);
AzureIoTClient 0:1f9b2707ec7d 208
AzureIoTClient 0:1f9b2707ec7d 209 for (i = 0; i < modelType->ActionCount; i++)
AzureIoTClient 0:1f9b2707ec7d 210 {
AzureIoTClient 0:1f9b2707ec7d 211 DestroyAction(modelType->Actions[i]);
AzureIoTClient 0:1f9b2707ec7d 212 }
AzureIoTClient 0:1f9b2707ec7d 213
Azure.IoT.Build 18:58b667752399 214 DestroyMethods(modelType);
Azure.IoT.Build 18:58b667752399 215
AzureIoTClient 0:1f9b2707ec7d 216 /*destroy the vector holding the added models. This does not destroy the said models, however, their names shall be*/
AzureIoTClient 0:1f9b2707ec7d 217 for (i = 0; i < VECTOR_size(modelType->models); i++)
AzureIoTClient 0:1f9b2707ec7d 218 {
AzureIoTClient 0:1f9b2707ec7d 219 MODEL_IN_MODEL* temp = (MODEL_IN_MODEL*)VECTOR_element(modelType->models, i);
AzureIoTClient 0:1f9b2707ec7d 220 free((void*)temp->propertyName);
AzureIoTClient 0:1f9b2707ec7d 221 }
AzureIoTClient 17:fa1bba4c6053 222
AzureIoTClient 17:fa1bba4c6053 223 nReportedProperties = VECTOR_size(modelType->reportedProperties);
AzureIoTClient 17:fa1bba4c6053 224 for (i = 0;i < nReportedProperties;i++)
AzureIoTClient 17:fa1bba4c6053 225 {
AzureIoTClient 17:fa1bba4c6053 226 SCHEMA_REPORTED_PROPERTY_HANDLE_DATA* reportedProperty = *(SCHEMA_REPORTED_PROPERTY_HANDLE_DATA **)VECTOR_element(modelType->reportedProperties, i);
AzureIoTClient 17:fa1bba4c6053 227 free((void*)reportedProperty->reportedPropertyName);
AzureIoTClient 17:fa1bba4c6053 228 free((void*)reportedProperty->reportedPropertyType);
AzureIoTClient 17:fa1bba4c6053 229 free(reportedProperty);
AzureIoTClient 17:fa1bba4c6053 230 }
AzureIoTClient 17:fa1bba4c6053 231 VECTOR_destroy(modelType->reportedProperties);
AzureIoTClient 17:fa1bba4c6053 232
AzureIoTClient 17:fa1bba4c6053 233 size_t nDesiredProperties = VECTOR_size(modelType->desiredProperties);
AzureIoTClient 17:fa1bba4c6053 234 for (i = 0;i < nDesiredProperties;i++)
AzureIoTClient 17:fa1bba4c6053 235 {
AzureIoTClient 17:fa1bba4c6053 236 SCHEMA_DESIRED_PROPERTY_HANDLE_DATA* desiredProperty = *(SCHEMA_DESIRED_PROPERTY_HANDLE_DATA **)VECTOR_element(modelType->desiredProperties, i);
AzureIoTClient 17:fa1bba4c6053 237 free((void*)desiredProperty->desiredPropertyName);
AzureIoTClient 17:fa1bba4c6053 238 free((void*)desiredProperty->desiredPropertyType);
AzureIoTClient 17:fa1bba4c6053 239 free(desiredProperty);
AzureIoTClient 17:fa1bba4c6053 240 }
AzureIoTClient 17:fa1bba4c6053 241 VECTOR_destroy(modelType->desiredProperties);
AzureIoTClient 17:fa1bba4c6053 242
AzureIoTClient 0:1f9b2707ec7d 243 VECTOR_clear(modelType->models);
AzureIoTClient 0:1f9b2707ec7d 244 VECTOR_destroy(modelType->models);
AzureIoTClient 0:1f9b2707ec7d 245
AzureIoTClient 0:1f9b2707ec7d 246 free(modelType->Actions);
AzureIoTClient 0:1f9b2707ec7d 247 free(modelType);
AzureIoTClient 0:1f9b2707ec7d 248 }
AzureIoTClient 0:1f9b2707ec7d 249
AzureIoTClient 17:fa1bba4c6053 250 static SCHEMA_RESULT AddModelProperty(SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType, const char* name, const char* type)
AzureIoTClient 0:1f9b2707ec7d 251 {
AzureIoTClient 0:1f9b2707ec7d 252 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 253
AzureIoTClient 0:1f9b2707ec7d 254 /* Codes_SRS_SCHEMA_99_013:[If any of the arguments is NULL, Schema_AddModelProperty shall return SCHEMA_INVALID_ARG.] */
AzureIoTClient 0:1f9b2707ec7d 255 if ((modelType == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 256 (name == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 257 (type == NULL))
AzureIoTClient 0:1f9b2707ec7d 258 {
AzureIoTClient 0:1f9b2707ec7d 259 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 260 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 261 }
AzureIoTClient 0:1f9b2707ec7d 262 else
AzureIoTClient 0:1f9b2707ec7d 263 {
AzureIoTClient 0:1f9b2707ec7d 264 size_t i;
AzureIoTClient 0:1f9b2707ec7d 265
AzureIoTClient 0:1f9b2707ec7d 266 /* Codes_SRS_SCHEMA_99_015:[The property name shall be unique per model, if the same property name is added twice to a model, SCHEMA_DUPLICATE_ELEMENT shall be returned.] */
AzureIoTClient 0:1f9b2707ec7d 267 for (i = 0; i < modelType->PropertyCount; i++)
AzureIoTClient 0:1f9b2707ec7d 268 {
AzureIoTClient 17:fa1bba4c6053 269 SCHEMA_PROPERTY_HANDLE_DATA* property = (SCHEMA_PROPERTY_HANDLE_DATA*)modelType->Properties[i];
AzureIoTClient 0:1f9b2707ec7d 270 if (strcmp(property->PropertyName, name) == 0)
AzureIoTClient 0:1f9b2707ec7d 271 {
AzureIoTClient 0:1f9b2707ec7d 272 break;
AzureIoTClient 0:1f9b2707ec7d 273 }
AzureIoTClient 0:1f9b2707ec7d 274 }
AzureIoTClient 0:1f9b2707ec7d 275
AzureIoTClient 0:1f9b2707ec7d 276 if (i < modelType->PropertyCount)
AzureIoTClient 0:1f9b2707ec7d 277 {
AzureIoTClient 0:1f9b2707ec7d 278 result = SCHEMA_DUPLICATE_ELEMENT;
AzureIoTClient 11:b1327861f5e0 279 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 280 }
AzureIoTClient 0:1f9b2707ec7d 281 else
AzureIoTClient 0:1f9b2707ec7d 282 {
AzureIoTClient 0:1f9b2707ec7d 283 SCHEMA_PROPERTY_HANDLE* newProperties = (SCHEMA_PROPERTY_HANDLE*)realloc(modelType->Properties, sizeof(SCHEMA_PROPERTY_HANDLE) * (modelType->PropertyCount + 1));
AzureIoTClient 0:1f9b2707ec7d 284 if (newProperties == NULL)
AzureIoTClient 0:1f9b2707ec7d 285 {
AzureIoTClient 0:1f9b2707ec7d 286 /* Codes_SRS_SCHEMA_99_014:[On any other error, Schema_AddModelProperty shall return SCHEMA_ERROR.] */
AzureIoTClient 0:1f9b2707ec7d 287 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 288 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 289 }
AzureIoTClient 0:1f9b2707ec7d 290 else
AzureIoTClient 0:1f9b2707ec7d 291 {
AzureIoTClient 17:fa1bba4c6053 292 SCHEMA_PROPERTY_HANDLE_DATA* newProperty;
AzureIoTClient 0:1f9b2707ec7d 293
AzureIoTClient 0:1f9b2707ec7d 294 modelType->Properties = newProperties;
AzureIoTClient 17:fa1bba4c6053 295 if ((newProperty = (SCHEMA_PROPERTY_HANDLE_DATA*)malloc(sizeof(SCHEMA_PROPERTY_HANDLE_DATA))) == NULL)
AzureIoTClient 0:1f9b2707ec7d 296 {
AzureIoTClient 0:1f9b2707ec7d 297 /* Codes_SRS_SCHEMA_99_014:[On any other error, Schema_AddModelProperty shall return SCHEMA_ERROR.] */
AzureIoTClient 0:1f9b2707ec7d 298 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 299 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 300 }
AzureIoTClient 0:1f9b2707ec7d 301 else
AzureIoTClient 0:1f9b2707ec7d 302 {
AzureIoTClient 0:1f9b2707ec7d 303 if (mallocAndStrcpy_s((char**)&newProperty->PropertyName, name) != 0)
AzureIoTClient 0:1f9b2707ec7d 304 {
AzureIoTClient 0:1f9b2707ec7d 305 /* Codes_SRS_SCHEMA_99_014:[On any other error, Schema_AddModelProperty shall return SCHEMA_ERROR.] */
AzureIoTClient 0:1f9b2707ec7d 306 free(newProperty);
AzureIoTClient 0:1f9b2707ec7d 307 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 308 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 309 }
AzureIoTClient 0:1f9b2707ec7d 310 else if (mallocAndStrcpy_s((char**)&newProperty->PropertyType, type) != 0)
AzureIoTClient 0:1f9b2707ec7d 311 {
AzureIoTClient 0:1f9b2707ec7d 312 /* Codes_SRS_SCHEMA_99_014:[On any other error, Schema_AddModelProperty shall return SCHEMA_ERROR.] */
AzureIoTClient 0:1f9b2707ec7d 313 free((void*)newProperty->PropertyName);
AzureIoTClient 0:1f9b2707ec7d 314 free(newProperty);
AzureIoTClient 0:1f9b2707ec7d 315 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 316 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 317 }
AzureIoTClient 0:1f9b2707ec7d 318 else
AzureIoTClient 0:1f9b2707ec7d 319 {
AzureIoTClient 0:1f9b2707ec7d 320 modelType->Properties[modelType->PropertyCount] = (SCHEMA_PROPERTY_HANDLE)newProperty;
AzureIoTClient 0:1f9b2707ec7d 321 modelType->PropertyCount++;
AzureIoTClient 0:1f9b2707ec7d 322
AzureIoTClient 0:1f9b2707ec7d 323 /* Codes_SRS_SCHEMA_99_012:[On success, Schema_AddModelProperty shall return SCHEMA_OK.] */
AzureIoTClient 0:1f9b2707ec7d 324 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 325 }
AzureIoTClient 0:1f9b2707ec7d 326 }
AzureIoTClient 0:1f9b2707ec7d 327
AzureIoTClient 0:1f9b2707ec7d 328 /* If possible, reduce the memory of over allocation */
AzureIoTClient 0:1f9b2707ec7d 329 if (result != SCHEMA_OK)
AzureIoTClient 0:1f9b2707ec7d 330 {
AzureIoTClient 36:7d12a5386197 331 if (modelType->PropertyCount > 0)
AzureIoTClient 0:1f9b2707ec7d 332 {
AzureIoTClient 36:7d12a5386197 333 SCHEMA_PROPERTY_HANDLE *oldProperties = (SCHEMA_PROPERTY_HANDLE *)realloc(modelType->Properties, sizeof(SCHEMA_PROPERTY_HANDLE) * modelType->PropertyCount);
AzureIoTClient 36:7d12a5386197 334 if (oldProperties == NULL)
AzureIoTClient 36:7d12a5386197 335 {
AzureIoTClient 36:7d12a5386197 336 result = SCHEMA_ERROR;
AzureIoTClient 36:7d12a5386197 337 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 36:7d12a5386197 338 }
AzureIoTClient 36:7d12a5386197 339 else
AzureIoTClient 36:7d12a5386197 340 {
AzureIoTClient 36:7d12a5386197 341 modelType->Properties = oldProperties;
AzureIoTClient 36:7d12a5386197 342 }
AzureIoTClient 0:1f9b2707ec7d 343 }
AzureIoTClient 0:1f9b2707ec7d 344 else
AzureIoTClient 0:1f9b2707ec7d 345 {
AzureIoTClient 36:7d12a5386197 346 modelType->Properties = NULL;
AzureIoTClient 0:1f9b2707ec7d 347 }
AzureIoTClient 0:1f9b2707ec7d 348 }
AzureIoTClient 0:1f9b2707ec7d 349 }
AzureIoTClient 0:1f9b2707ec7d 350 }
AzureIoTClient 0:1f9b2707ec7d 351 }
AzureIoTClient 0:1f9b2707ec7d 352
AzureIoTClient 0:1f9b2707ec7d 353 return result;
AzureIoTClient 0:1f9b2707ec7d 354 }
AzureIoTClient 0:1f9b2707ec7d 355
AzureIoTClient 0:1f9b2707ec7d 356 static bool SchemaHandlesMatch(const SCHEMA_HANDLE* handle, const SCHEMA_HANDLE* otherHandle)
AzureIoTClient 0:1f9b2707ec7d 357 {
AzureIoTClient 0:1f9b2707ec7d 358 return (*handle == *otherHandle);
AzureIoTClient 0:1f9b2707ec7d 359 }
AzureIoTClient 0:1f9b2707ec7d 360
AzureIoTClient 0:1f9b2707ec7d 361 static bool SchemaNamespacesMatch(const SCHEMA_HANDLE* handle, const char* schemaNamespace)
AzureIoTClient 0:1f9b2707ec7d 362 {
AzureIoTClient 17:fa1bba4c6053 363 const SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)*handle;
AzureIoTClient 0:1f9b2707ec7d 364 return (strcmp(schema->Namespace, schemaNamespace) == 0);
AzureIoTClient 0:1f9b2707ec7d 365 }
AzureIoTClient 0:1f9b2707ec7d 366
AzureIoTClient 0:1f9b2707ec7d 367 /* Codes_SRS_SCHEMA_99_001:[Schema_Create shall initialize a schema with a given namespace.] */
AzureIoTClient 17:fa1bba4c6053 368 SCHEMA_HANDLE Schema_Create(const char* schemaNamespace, void* metadata)
AzureIoTClient 0:1f9b2707ec7d 369 {
AzureIoTClient 17:fa1bba4c6053 370 SCHEMA_HANDLE_DATA* result;
AzureIoTClient 17:fa1bba4c6053 371 /*Codes_SRS_SCHEMA_02_090: [ If metadata is NULL then Schema_Create shall fail and return NULL. ]*/
AzureIoTClient 0:1f9b2707ec7d 372 /* Codes_SRS_SCHEMA_99_004:[If schemaNamespace is NULL, Schema_Create shall fail.] */
AzureIoTClient 17:fa1bba4c6053 373 if (
AzureIoTClient 17:fa1bba4c6053 374 (schemaNamespace == NULL)||
AzureIoTClient 17:fa1bba4c6053 375 (metadata == NULL)
AzureIoTClient 17:fa1bba4c6053 376 )
AzureIoTClient 0:1f9b2707ec7d 377 {
AzureIoTClient 0:1f9b2707ec7d 378 /* Codes_SRS_SCHEMA_99_003:[On failure, NULL shall be returned.] */
AzureIoTClient 17:fa1bba4c6053 379 LogError("invalid arg const char* schemaNamespace=%p, void* metadata=%p",schemaNamespace, metadata);
AzureIoTClient 0:1f9b2707ec7d 380 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 381 }
AzureIoTClient 0:1f9b2707ec7d 382 else
AzureIoTClient 0:1f9b2707ec7d 383 {
AzureIoTClient 17:fa1bba4c6053 384 if (g_schemas == NULL && (g_schemas = VECTOR_create(sizeof(SCHEMA_HANDLE_DATA*) ) ) == NULL)
AzureIoTClient 0:1f9b2707ec7d 385 {
AzureIoTClient 0:1f9b2707ec7d 386 /* Codes_SRS_SCHEMA_99_003:[On failure, NULL shall be returned.] */
AzureIoTClient 0:1f9b2707ec7d 387 result = NULL;
AzureIoTClient 11:b1327861f5e0 388 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 389 }
AzureIoTClient 17:fa1bba4c6053 390 else if ((result = (SCHEMA_HANDLE_DATA*)malloc(sizeof(SCHEMA_HANDLE_DATA))) == NULL)
AzureIoTClient 0:1f9b2707ec7d 391 {
AzureIoTClient 0:1f9b2707ec7d 392 /* Codes_SRS_SCHEMA_99_003:[On failure, NULL shall be returned.] */
AzureIoTClient 11:b1327861f5e0 393 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 394 }
AzureIoTClient 0:1f9b2707ec7d 395 else if (mallocAndStrcpy_s((char**)&result->Namespace, schemaNamespace) != 0)
AzureIoTClient 0:1f9b2707ec7d 396 {
AzureIoTClient 0:1f9b2707ec7d 397 /* Codes_SRS_SCHEMA_99_003:[On failure, NULL shall be returned.] */
AzureIoTClient 0:1f9b2707ec7d 398 free(result);
AzureIoTClient 0:1f9b2707ec7d 399 result = NULL;
AzureIoTClient 11:b1327861f5e0 400 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 401 }
AzureIoTClient 0:1f9b2707ec7d 402 else if (VECTOR_push_back(g_schemas, &result, 1) != 0)
AzureIoTClient 0:1f9b2707ec7d 403 {
AzureIoTClient 0:1f9b2707ec7d 404 free((void*)result->Namespace);
AzureIoTClient 0:1f9b2707ec7d 405 free(result);
AzureIoTClient 0:1f9b2707ec7d 406 result = NULL;
AzureIoTClient 11:b1327861f5e0 407 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 408 }
AzureIoTClient 0:1f9b2707ec7d 409 else
AzureIoTClient 0:1f9b2707ec7d 410 {
AzureIoTClient 0:1f9b2707ec7d 411 /* Codes_SRS_SCHEMA_99_002:[On success a non-NULL handle to the newly created schema shall be returned.] */
AzureIoTClient 0:1f9b2707ec7d 412 result->ModelTypes = NULL;
AzureIoTClient 0:1f9b2707ec7d 413 result->ModelTypeCount = 0;
AzureIoTClient 0:1f9b2707ec7d 414 result->StructTypes = NULL;
AzureIoTClient 0:1f9b2707ec7d 415 result->StructTypeCount = 0;
AzureIoTClient 17:fa1bba4c6053 416 result->metadata = metadata;
AzureIoTClient 0:1f9b2707ec7d 417 }
AzureIoTClient 0:1f9b2707ec7d 418 }
AzureIoTClient 0:1f9b2707ec7d 419
AzureIoTClient 0:1f9b2707ec7d 420 return (SCHEMA_HANDLE)result;
AzureIoTClient 0:1f9b2707ec7d 421 }
AzureIoTClient 0:1f9b2707ec7d 422
AzureIoTClient 0:1f9b2707ec7d 423 size_t Schema_GetSchemaCount(void)
AzureIoTClient 0:1f9b2707ec7d 424 {
AzureIoTClient 0:1f9b2707ec7d 425 /* Codes_SRS_SCHEMA_99_153: [Schema_GetSchemaCount shall return the number of "active" schemas (all schemas created with Schema_Create
AzureIoTClient 0:1f9b2707ec7d 426 in the current process, for which Schema_Destroy has not been called).] */
AzureIoTClient 0:1f9b2707ec7d 427 return VECTOR_size(g_schemas);
AzureIoTClient 0:1f9b2707ec7d 428 }
AzureIoTClient 0:1f9b2707ec7d 429
AzureIoTClient 0:1f9b2707ec7d 430 SCHEMA_HANDLE Schema_GetSchemaByNamespace(const char* schemaNamespace)
AzureIoTClient 0:1f9b2707ec7d 431 {
AzureIoTClient 0:1f9b2707ec7d 432 /* Codes_SRS_SCHEMA_99_151: [If no active schema matches the schemaNamespace argument, Schema_GetSchemaByNamespace shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 433 SCHEMA_HANDLE result = NULL;
AzureIoTClient 0:1f9b2707ec7d 434
AzureIoTClient 0:1f9b2707ec7d 435 /* Codes_SRS_SCHEMA_99_150: [If the schemaNamespace argument is NULL, Schema_GetSchemaByNamespace shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 436 if (schemaNamespace != NULL)
AzureIoTClient 0:1f9b2707ec7d 437 {
AzureIoTClient 24:49c36a13bed1 438 SCHEMA_HANDLE* handle = (g_schemas==NULL)?NULL:(SCHEMA_HANDLE*)VECTOR_find_if(g_schemas, (PREDICATE_FUNCTION)SchemaNamespacesMatch, schemaNamespace);
AzureIoTClient 0:1f9b2707ec7d 439 if (handle != NULL)
AzureIoTClient 0:1f9b2707ec7d 440 {
AzureIoTClient 36:7d12a5386197 441 /* Codes_SRS_SCHEMA_99_148: [Schema_GetSchemaByNamespace shall search all active schemas and return the schema with the
AzureIoTClient 0:1f9b2707ec7d 442 namespace given by the schemaNamespace argument.] */
AzureIoTClient 0:1f9b2707ec7d 443 result = *handle;
AzureIoTClient 0:1f9b2707ec7d 444 }
AzureIoTClient 0:1f9b2707ec7d 445 }
AzureIoTClient 0:1f9b2707ec7d 446
AzureIoTClient 0:1f9b2707ec7d 447 return result;
AzureIoTClient 0:1f9b2707ec7d 448 }
AzureIoTClient 0:1f9b2707ec7d 449
AzureIoTClient 0:1f9b2707ec7d 450 const char* Schema_GetSchemaNamespace(SCHEMA_HANDLE schemaHandle)
AzureIoTClient 0:1f9b2707ec7d 451 {
AzureIoTClient 0:1f9b2707ec7d 452 const char* result;
AzureIoTClient 0:1f9b2707ec7d 453
AzureIoTClient 0:1f9b2707ec7d 454 /* Codes_SRS_SCHEMA_99_130: [If the schemaHandle argument is NULL, Schema_GetSchemaNamespace shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 455 if (schemaHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 456 {
AzureIoTClient 0:1f9b2707ec7d 457 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 458 }
AzureIoTClient 0:1f9b2707ec7d 459 else
AzureIoTClient 0:1f9b2707ec7d 460 {
AzureIoTClient 0:1f9b2707ec7d 461 /* Codes_SRS_SCHEMA_99_129: [Schema_GetSchemaNamespace shall return the namespace for the schema identified by schemaHandle.] */
AzureIoTClient 17:fa1bba4c6053 462 result = ((SCHEMA_HANDLE_DATA*)schemaHandle)->Namespace;
AzureIoTClient 0:1f9b2707ec7d 463 }
AzureIoTClient 0:1f9b2707ec7d 464
AzureIoTClient 0:1f9b2707ec7d 465 return result;
AzureIoTClient 0:1f9b2707ec7d 466 }
AzureIoTClient 0:1f9b2707ec7d 467
AzureIoTClient 0:1f9b2707ec7d 468 void Schema_Destroy(SCHEMA_HANDLE schemaHandle)
AzureIoTClient 0:1f9b2707ec7d 469 {
AzureIoTClient 0:1f9b2707ec7d 470 /* Codes_SRS_SCHEMA_99_006:[If the schemaHandle is NULL, Schema_Destroy shall do nothing.] */
AzureIoTClient 0:1f9b2707ec7d 471 if (schemaHandle != NULL)
AzureIoTClient 0:1f9b2707ec7d 472 {
AzureIoTClient 17:fa1bba4c6053 473 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 474 size_t i;
AzureIoTClient 0:1f9b2707ec7d 475
AzureIoTClient 0:1f9b2707ec7d 476 /* Codes_SRS_SCHEMA_99_005:[Schema_Destroy shall free all resources associated with a schema.] */
AzureIoTClient 0:1f9b2707ec7d 477 for (i = 0; i < schema->ModelTypeCount; i++)
AzureIoTClient 0:1f9b2707ec7d 478 {
AzureIoTClient 0:1f9b2707ec7d 479 DestroyModel(schema->ModelTypes[i]);
AzureIoTClient 0:1f9b2707ec7d 480 }
AzureIoTClient 0:1f9b2707ec7d 481
AzureIoTClient 0:1f9b2707ec7d 482 free(schema->ModelTypes);
AzureIoTClient 0:1f9b2707ec7d 483
AzureIoTClient 0:1f9b2707ec7d 484 /* Codes_SRS_SCHEMA_99_005:[Schema_Destroy shall free all resources associated with a schema.] */
AzureIoTClient 0:1f9b2707ec7d 485 for (i = 0; i < schema->StructTypeCount; i++)
AzureIoTClient 0:1f9b2707ec7d 486 {
AzureIoTClient 0:1f9b2707ec7d 487 DestroyStruct(schema->StructTypes[i]);
AzureIoTClient 0:1f9b2707ec7d 488 }
AzureIoTClient 0:1f9b2707ec7d 489
AzureIoTClient 0:1f9b2707ec7d 490 free(schema->StructTypes);
AzureIoTClient 0:1f9b2707ec7d 491 free((void*)schema->Namespace);
AzureIoTClient 0:1f9b2707ec7d 492 free(schema);
AzureIoTClient 0:1f9b2707ec7d 493
AzureIoTClient 17:fa1bba4c6053 494 schema = (SCHEMA_HANDLE_DATA*)VECTOR_find_if(g_schemas, (PREDICATE_FUNCTION)SchemaHandlesMatch, &schemaHandle);
AzureIoTClient 0:1f9b2707ec7d 495 if (schema != NULL)
AzureIoTClient 0:1f9b2707ec7d 496 {
AzureIoTClient 0:1f9b2707ec7d 497 VECTOR_erase(g_schemas, schema, 1);
AzureIoTClient 0:1f9b2707ec7d 498 }
AzureIoTClient 0:1f9b2707ec7d 499 // If the g_schema is empty then destroy it
AzureIoTClient 0:1f9b2707ec7d 500 if (VECTOR_size(g_schemas) == 0)
AzureIoTClient 0:1f9b2707ec7d 501 {
AzureIoTClient 0:1f9b2707ec7d 502 VECTOR_destroy(g_schemas);
AzureIoTClient 0:1f9b2707ec7d 503 g_schemas = NULL;
AzureIoTClient 0:1f9b2707ec7d 504 }
AzureIoTClient 0:1f9b2707ec7d 505 }
AzureIoTClient 0:1f9b2707ec7d 506 }
AzureIoTClient 0:1f9b2707ec7d 507
AzureIoTClient 0:1f9b2707ec7d 508 SCHEMA_RESULT Schema_DestroyIfUnused(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle)
AzureIoTClient 0:1f9b2707ec7d 509 {
AzureIoTClient 0:1f9b2707ec7d 510 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 511
AzureIoTClient 0:1f9b2707ec7d 512 /* Codes_SRS_SCHEMA_07_189: [If modelHandle variable is NULL Schema_DestroyIfUnused shall do nothing.] */
AzureIoTClient 0:1f9b2707ec7d 513 if (modelTypeHandle != NULL)
AzureIoTClient 0:1f9b2707ec7d 514 {
AzureIoTClient 0:1f9b2707ec7d 515 SCHEMA_HANDLE schemaHandle = Schema_GetSchemaForModelType(modelTypeHandle);
AzureIoTClient 0:1f9b2707ec7d 516 if (schemaHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 517 {
AzureIoTClient 0:1f9b2707ec7d 518 result = SCHEMA_ERROR;
AzureIoTClient 0:1f9b2707ec7d 519 }
AzureIoTClient 0:1f9b2707ec7d 520 else
AzureIoTClient 0:1f9b2707ec7d 521 {
AzureIoTClient 17:fa1bba4c6053 522 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 523 size_t nIndex;
AzureIoTClient 0:1f9b2707ec7d 524
AzureIoTClient 0:1f9b2707ec7d 525 /* Codes_SRS_SCHEMA_07_190: [Schema_DestroyIfUnused shall iterate through the ModuleTypes objects and if all the DeviceCount variables 0 then it will delete the schemaHandle.] */
AzureIoTClient 0:1f9b2707ec7d 526 for (nIndex = 0; nIndex < schema->ModelTypeCount; nIndex++)
AzureIoTClient 0:1f9b2707ec7d 527 {
AzureIoTClient 17:fa1bba4c6053 528 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)schema->ModelTypes[nIndex];
AzureIoTClient 0:1f9b2707ec7d 529 if (modelType->DeviceCount > 0)
AzureIoTClient 0:1f9b2707ec7d 530 break;
AzureIoTClient 0:1f9b2707ec7d 531 }
AzureIoTClient 0:1f9b2707ec7d 532 /* Codes_SRS_SCHEMA_07_191: [If 1 or more DeviceCount variables are > 0 then Schema_DestroyIfUnused shall do nothing.] */
AzureIoTClient 0:1f9b2707ec7d 533 if (nIndex == schema->ModelTypeCount)
AzureIoTClient 0:1f9b2707ec7d 534 {
AzureIoTClient 0:1f9b2707ec7d 535 Schema_Destroy(schemaHandle);
AzureIoTClient 0:1f9b2707ec7d 536 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 537 }
AzureIoTClient 0:1f9b2707ec7d 538 else
AzureIoTClient 0:1f9b2707ec7d 539 {
AzureIoTClient 0:1f9b2707ec7d 540 result = SCHEMA_MODEL_IN_USE;
AzureIoTClient 0:1f9b2707ec7d 541 }
AzureIoTClient 0:1f9b2707ec7d 542 }
AzureIoTClient 0:1f9b2707ec7d 543 }
AzureIoTClient 0:1f9b2707ec7d 544 else
AzureIoTClient 0:1f9b2707ec7d 545 {
AzureIoTClient 0:1f9b2707ec7d 546 result = SCHEMA_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 547 }
AzureIoTClient 0:1f9b2707ec7d 548 return result;
AzureIoTClient 0:1f9b2707ec7d 549 }
AzureIoTClient 0:1f9b2707ec7d 550
AzureIoTClient 0:1f9b2707ec7d 551 SCHEMA_RESULT Schema_AddDeviceRef(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle)
AzureIoTClient 0:1f9b2707ec7d 552 {
AzureIoTClient 0:1f9b2707ec7d 553 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 554 if (modelTypeHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 555 {
AzureIoTClient 0:1f9b2707ec7d 556 /* Codes_SRS_SCHEMA_07_187: [Schema_AddDeviceRef shall return SCHEMA_INVALID_ARG if modelTypeHandle is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 557 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 558 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 559 }
AzureIoTClient 0:1f9b2707ec7d 560 else
AzureIoTClient 0:1f9b2707ec7d 561 {
AzureIoTClient 17:fa1bba4c6053 562 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 563 /* Codes_SRS_SCHEMA_07_188: [If the modelTypeHandle is nonNULL, Schema_AddDeviceRef shall increment the SCHEMA_MODEL_TYPE_HANDLE_DATA DeviceCount variable.] */
AzureIoTClient 0:1f9b2707ec7d 564 model->DeviceCount++;
AzureIoTClient 0:1f9b2707ec7d 565 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 566 }
AzureIoTClient 0:1f9b2707ec7d 567 return result;
AzureIoTClient 0:1f9b2707ec7d 568 }
AzureIoTClient 0:1f9b2707ec7d 569
AzureIoTClient 0:1f9b2707ec7d 570 SCHEMA_RESULT Schema_ReleaseDeviceRef(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle)
AzureIoTClient 0:1f9b2707ec7d 571 {
AzureIoTClient 0:1f9b2707ec7d 572 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 573 /* Codes_SRS_SCHEMA_07_184: [Schema_DeviceRelease shall do nothing if the supplied modelHandle is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 574 if (modelTypeHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 575 {
AzureIoTClient 0:1f9b2707ec7d 576 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 577 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 578 }
AzureIoTClient 0:1f9b2707ec7d 579 else
AzureIoTClient 0:1f9b2707ec7d 580 {
AzureIoTClient 17:fa1bba4c6053 581 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 582 if (model->DeviceCount > 0)
AzureIoTClient 0:1f9b2707ec7d 583 {
AzureIoTClient 0:1f9b2707ec7d 584 /* Codes_SRS_SCHEMA_07_186: [On a nonNULL SCHEMA_MODEL_TYPE_HANDLE if the DeviceCount variable is > 0 then the variable will be decremented.] */
AzureIoTClient 0:1f9b2707ec7d 585 model->DeviceCount--;
AzureIoTClient 0:1f9b2707ec7d 586 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 587 }
AzureIoTClient 0:1f9b2707ec7d 588 else
AzureIoTClient 0:1f9b2707ec7d 589 {
AzureIoTClient 17:fa1bba4c6053 590 result = SCHEMA_DEVICE_COUNT_ZERO;
AzureIoTClient 17:fa1bba4c6053 591 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 592 }
AzureIoTClient 0:1f9b2707ec7d 593 }
AzureIoTClient 0:1f9b2707ec7d 594 return result;
AzureIoTClient 0:1f9b2707ec7d 595 }
AzureIoTClient 0:1f9b2707ec7d 596
AzureIoTClient 0:1f9b2707ec7d 597 /* Codes_SRS_SCHEMA_99_007:[Schema_CreateModelType shall create a new model type and return a handle to it.] */
AzureIoTClient 0:1f9b2707ec7d 598 SCHEMA_MODEL_TYPE_HANDLE Schema_CreateModelType(SCHEMA_HANDLE schemaHandle, const char* modelName)
AzureIoTClient 0:1f9b2707ec7d 599 {
AzureIoTClient 0:1f9b2707ec7d 600 SCHEMA_MODEL_TYPE_HANDLE result;
AzureIoTClient 0:1f9b2707ec7d 601
AzureIoTClient 0:1f9b2707ec7d 602 /* Codes_SRS_SCHEMA_99_010:[If any of the arguments is NULL, Schema_CreateModelType shall fail.] */
AzureIoTClient 0:1f9b2707ec7d 603 if ((schemaHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 604 (modelName == NULL))
AzureIoTClient 0:1f9b2707ec7d 605 {
AzureIoTClient 0:1f9b2707ec7d 606 /* Codes_SRS_SCHEMA_99_009:[On failure, Schema_CreateModelType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 607 result = NULL;
AzureIoTClient 11:b1327861f5e0 608 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 609 }
AzureIoTClient 0:1f9b2707ec7d 610 else
AzureIoTClient 0:1f9b2707ec7d 611 {
AzureIoTClient 17:fa1bba4c6053 612 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 613
AzureIoTClient 0:1f9b2707ec7d 614 /* Codes_SRS_SCHEMA_99_100: [Schema_CreateModelType shall return SCHEMA_DUPLICATE_ELEMENT if modelName already exists.] */
AzureIoTClient 0:1f9b2707ec7d 615 size_t i;
AzureIoTClient 0:1f9b2707ec7d 616 for (i = 0; i < schema->ModelTypeCount; i++)
AzureIoTClient 0:1f9b2707ec7d 617 {
AzureIoTClient 17:fa1bba4c6053 618 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)(schema->ModelTypes[i]);
AzureIoTClient 0:1f9b2707ec7d 619 if (strcmp(model->Name, modelName) == 0)
AzureIoTClient 0:1f9b2707ec7d 620 {
AzureIoTClient 0:1f9b2707ec7d 621 break;
AzureIoTClient 0:1f9b2707ec7d 622 }
AzureIoTClient 0:1f9b2707ec7d 623 }
AzureIoTClient 0:1f9b2707ec7d 624
AzureIoTClient 0:1f9b2707ec7d 625 if (i < schema->ModelTypeCount)
AzureIoTClient 0:1f9b2707ec7d 626 {
AzureIoTClient 0:1f9b2707ec7d 627 /* Codes_SRS_SCHEMA_99_009:[On failure, Schema_CreateModelType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 628 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 629 LogError("%s Model Name already exists", modelName);
AzureIoTClient 0:1f9b2707ec7d 630 }
AzureIoTClient 0:1f9b2707ec7d 631
AzureIoTClient 0:1f9b2707ec7d 632 else
AzureIoTClient 0:1f9b2707ec7d 633 {
AzureIoTClient 0:1f9b2707ec7d 634 SCHEMA_MODEL_TYPE_HANDLE* newModelTypes = (SCHEMA_MODEL_TYPE_HANDLE*)realloc(schema->ModelTypes, sizeof(SCHEMA_MODEL_TYPE_HANDLE) * (schema->ModelTypeCount + 1));
AzureIoTClient 0:1f9b2707ec7d 635 if (newModelTypes == NULL)
AzureIoTClient 0:1f9b2707ec7d 636 {
AzureIoTClient 0:1f9b2707ec7d 637 /* Codes_SRS_SCHEMA_99_009:[On failure, Schema_CreateModelType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 638 result = NULL;
AzureIoTClient 11:b1327861f5e0 639 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 640 }
AzureIoTClient 0:1f9b2707ec7d 641 else
AzureIoTClient 0:1f9b2707ec7d 642 {
AzureIoTClient 17:fa1bba4c6053 643 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType;
AzureIoTClient 0:1f9b2707ec7d 644 schema->ModelTypes = newModelTypes;
AzureIoTClient 0:1f9b2707ec7d 645
AzureIoTClient 17:fa1bba4c6053 646 if ((modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)malloc(sizeof(SCHEMA_MODEL_TYPE_HANDLE_DATA))) == NULL)
AzureIoTClient 0:1f9b2707ec7d 647 {
AzureIoTClient 0:1f9b2707ec7d 648
AzureIoTClient 0:1f9b2707ec7d 649 /* Codes_SRS_SCHEMA_99_009:[On failure, Schema_CreateModelType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 650 result = NULL;
AzureIoTClient 11:b1327861f5e0 651 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 652 }
AzureIoTClient 0:1f9b2707ec7d 653 else if (mallocAndStrcpy_s((char**)&modelType->Name, modelName) != 0)
AzureIoTClient 0:1f9b2707ec7d 654 {
AzureIoTClient 0:1f9b2707ec7d 655 /* Codes_SRS_SCHEMA_99_009:[On failure, Schema_CreateModelType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 656 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 657 free(modelType);
AzureIoTClient 11:b1327861f5e0 658 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 659 }
AzureIoTClient 0:1f9b2707ec7d 660 else
AzureIoTClient 0:1f9b2707ec7d 661 {
AzureIoTClient 17:fa1bba4c6053 662 modelType->models = VECTOR_create(sizeof(MODEL_IN_MODEL));
AzureIoTClient 17:fa1bba4c6053 663 if (modelType->models == NULL)
AzureIoTClient 17:fa1bba4c6053 664 {
Azure.IoT.Build 18:58b667752399 665 /* Codes_SRS_SCHEMA_99_009:[On failure, Schema_CreateModelType shall return NULL.] */
AzureIoTClient 17:fa1bba4c6053 666 LogError("unable to VECTOR_create");
AzureIoTClient 17:fa1bba4c6053 667 free((void*)modelType->Name);
AzureIoTClient 17:fa1bba4c6053 668 free((void*)modelType);
AzureIoTClient 17:fa1bba4c6053 669 result = NULL;
AzureIoTClient 17:fa1bba4c6053 670 }
AzureIoTClient 17:fa1bba4c6053 671 else
AzureIoTClient 17:fa1bba4c6053 672 {
AzureIoTClient 17:fa1bba4c6053 673 if ((modelType->reportedProperties = VECTOR_create(sizeof(SCHEMA_REPORTED_PROPERTY_HANDLE))) == NULL)
AzureIoTClient 17:fa1bba4c6053 674 {
Azure.IoT.Build 18:58b667752399 675 /* Codes_SRS_SCHEMA_99_009:[On failure, Schema_CreateModelType shall return NULL.] */
AzureIoTClient 17:fa1bba4c6053 676 LogError("failed to VECTOR_create (reported properties)");
AzureIoTClient 17:fa1bba4c6053 677 VECTOR_destroy(modelType->models);
AzureIoTClient 17:fa1bba4c6053 678 free((void*)modelType->Name);
AzureIoTClient 17:fa1bba4c6053 679 free((void*)modelType);
AzureIoTClient 17:fa1bba4c6053 680 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 681
AzureIoTClient 17:fa1bba4c6053 682 }
AzureIoTClient 17:fa1bba4c6053 683 else
AzureIoTClient 17:fa1bba4c6053 684 {
Azure.IoT.Build 18:58b667752399 685 /* Codes_SRS_SCHEMA_99_009:[On failure, Schema_CreateModelType shall return NULL.] */
AzureIoTClient 17:fa1bba4c6053 686 if ((modelType->desiredProperties = VECTOR_create(sizeof(SCHEMA_DESIRED_PROPERTY_HANDLE))) == NULL)
AzureIoTClient 17:fa1bba4c6053 687 {
AzureIoTClient 17:fa1bba4c6053 688 LogError("failure in VECTOR_create (desired properties)");
AzureIoTClient 17:fa1bba4c6053 689 VECTOR_destroy(modelType->reportedProperties);
AzureIoTClient 17:fa1bba4c6053 690 VECTOR_destroy(modelType->models);
AzureIoTClient 17:fa1bba4c6053 691 free((void*)modelType->Name);
AzureIoTClient 17:fa1bba4c6053 692 free((void*)modelType);
AzureIoTClient 17:fa1bba4c6053 693 result = NULL;
AzureIoTClient 17:fa1bba4c6053 694 }
AzureIoTClient 17:fa1bba4c6053 695 else
AzureIoTClient 17:fa1bba4c6053 696 {
Azure.IoT.Build 18:58b667752399 697 if ((modelType->methods = VECTOR_create(sizeof(SCHEMA_METHOD_HANDLE))) == NULL)
Azure.IoT.Build 18:58b667752399 698 {
Azure.IoT.Build 18:58b667752399 699 LogError("failure in VECTOR_create (desired properties)");
Azure.IoT.Build 18:58b667752399 700 VECTOR_destroy(modelType->desiredProperties);
Azure.IoT.Build 18:58b667752399 701 VECTOR_destroy(modelType->reportedProperties);
Azure.IoT.Build 18:58b667752399 702 VECTOR_destroy(modelType->models);
Azure.IoT.Build 18:58b667752399 703 free((void*)modelType->Name);
Azure.IoT.Build 18:58b667752399 704 free((void*)modelType);
Azure.IoT.Build 18:58b667752399 705 result = NULL;
Azure.IoT.Build 18:58b667752399 706 }
Azure.IoT.Build 18:58b667752399 707 else
Azure.IoT.Build 18:58b667752399 708 {
Azure.IoT.Build 18:58b667752399 709 modelType->PropertyCount = 0;
Azure.IoT.Build 18:58b667752399 710 modelType->Properties = NULL;
Azure.IoT.Build 18:58b667752399 711 modelType->ActionCount = 0;
Azure.IoT.Build 18:58b667752399 712 modelType->Actions = NULL;
Azure.IoT.Build 18:58b667752399 713 modelType->SchemaHandle = schemaHandle;
Azure.IoT.Build 18:58b667752399 714 modelType->DeviceCount = 0;
AzureIoTClient 17:fa1bba4c6053 715
Azure.IoT.Build 18:58b667752399 716 schema->ModelTypes[schema->ModelTypeCount] = modelType;
Azure.IoT.Build 18:58b667752399 717 schema->ModelTypeCount++;
Azure.IoT.Build 18:58b667752399 718 /* Codes_SRS_SCHEMA_99_008:[On success, a non-NULL handle shall be returned.] */
Azure.IoT.Build 18:58b667752399 719 result = (SCHEMA_MODEL_TYPE_HANDLE)modelType;
Azure.IoT.Build 18:58b667752399 720 }
AzureIoTClient 17:fa1bba4c6053 721 }
AzureIoTClient 17:fa1bba4c6053 722 }
AzureIoTClient 17:fa1bba4c6053 723 }
AzureIoTClient 0:1f9b2707ec7d 724 }
AzureIoTClient 0:1f9b2707ec7d 725
AzureIoTClient 0:1f9b2707ec7d 726 /* If possible, reduce the memory of over allocation */
AzureIoTClient 17:fa1bba4c6053 727 if ((result == NULL) &&(schema->ModelTypeCount>0))
AzureIoTClient 0:1f9b2707ec7d 728 {
AzureIoTClient 0:1f9b2707ec7d 729 SCHEMA_MODEL_TYPE_HANDLE* oldModelTypes = (SCHEMA_MODEL_TYPE_HANDLE*)realloc(schema->ModelTypes, sizeof(SCHEMA_MODEL_TYPE_HANDLE) * schema->ModelTypeCount);
AzureIoTClient 0:1f9b2707ec7d 730 if (oldModelTypes == NULL)
AzureIoTClient 0:1f9b2707ec7d 731 {
AzureIoTClient 11:b1327861f5e0 732 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 733 }
AzureIoTClient 0:1f9b2707ec7d 734 else
AzureIoTClient 0:1f9b2707ec7d 735 {
AzureIoTClient 0:1f9b2707ec7d 736 schema->ModelTypes = oldModelTypes;
AzureIoTClient 0:1f9b2707ec7d 737 }
AzureIoTClient 0:1f9b2707ec7d 738 }
AzureIoTClient 0:1f9b2707ec7d 739 }
AzureIoTClient 0:1f9b2707ec7d 740 }
AzureIoTClient 0:1f9b2707ec7d 741 }
AzureIoTClient 0:1f9b2707ec7d 742
AzureIoTClient 0:1f9b2707ec7d 743 return result;
AzureIoTClient 0:1f9b2707ec7d 744 }
AzureIoTClient 0:1f9b2707ec7d 745
AzureIoTClient 0:1f9b2707ec7d 746 SCHEMA_HANDLE Schema_GetSchemaForModelType(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle)
AzureIoTClient 0:1f9b2707ec7d 747 {
AzureIoTClient 0:1f9b2707ec7d 748 SCHEMA_HANDLE result;
AzureIoTClient 0:1f9b2707ec7d 749
AzureIoTClient 0:1f9b2707ec7d 750 if (modelTypeHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 751 {
AzureIoTClient 0:1f9b2707ec7d 752 /* Codes_SRS_SCHEMA_99_132: [If the modelTypeHandle argument is NULL, Schema_GetSchemaForModelType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 753 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 754 }
AzureIoTClient 0:1f9b2707ec7d 755 else
AzureIoTClient 0:1f9b2707ec7d 756 {
AzureIoTClient 0:1f9b2707ec7d 757 /* Codes_SRS_SCHEMA_99_131: [Schema_GetSchemaForModelType returns the schema handle for a given model type.] */
AzureIoTClient 17:fa1bba4c6053 758 result = ((SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle)->SchemaHandle;
AzureIoTClient 0:1f9b2707ec7d 759 }
AzureIoTClient 0:1f9b2707ec7d 760
AzureIoTClient 0:1f9b2707ec7d 761 return result;
AzureIoTClient 0:1f9b2707ec7d 762 }
AzureIoTClient 0:1f9b2707ec7d 763
AzureIoTClient 0:1f9b2707ec7d 764 /* Codes_SRS_SCHEMA_99_011:[Schema_AddModelProperty shall add one property to the model type identified by modelTypeHandle.] */
AzureIoTClient 0:1f9b2707ec7d 765 SCHEMA_RESULT Schema_AddModelProperty(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* propertyName, const char* propertyType)
AzureIoTClient 0:1f9b2707ec7d 766 {
AzureIoTClient 17:fa1bba4c6053 767 return AddModelProperty((SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle, propertyName, propertyType);
AzureIoTClient 17:fa1bba4c6053 768 }
AzureIoTClient 17:fa1bba4c6053 769
AzureIoTClient 17:fa1bba4c6053 770 static bool reportedPropertyExists(const void* element, const void* value)
AzureIoTClient 17:fa1bba4c6053 771 {
AzureIoTClient 17:fa1bba4c6053 772 SCHEMA_REPORTED_PROPERTY_HANDLE_DATA* reportedProperty = *(SCHEMA_REPORTED_PROPERTY_HANDLE_DATA**)element;
AzureIoTClient 17:fa1bba4c6053 773 return (strcmp(reportedProperty->reportedPropertyName, value) == 0);
AzureIoTClient 17:fa1bba4c6053 774 }
AzureIoTClient 17:fa1bba4c6053 775
AzureIoTClient 17:fa1bba4c6053 776 SCHEMA_RESULT Schema_AddModelReportedProperty(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* reportedPropertyName, const char* reportedPropertyType)
AzureIoTClient 17:fa1bba4c6053 777 {
AzureIoTClient 17:fa1bba4c6053 778 SCHEMA_RESULT result;
AzureIoTClient 17:fa1bba4c6053 779 /*Codes_SRS_SCHEMA_02_001: [ If modelTypeHandle is NULL then Schema_AddModelReportedProperty shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 780 /*Codes_SRS_SCHEMA_02_002: [ If reportedPropertyName is NULL then Schema_AddModelReportedProperty shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 781 /*Codes_SRS_SCHEMA_02_003: [ If reportedPropertyType is NULL then Schema_AddModelReportedProperty shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 782 if (
AzureIoTClient 17:fa1bba4c6053 783 (modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 784 (reportedPropertyName == NULL) ||
AzureIoTClient 17:fa1bba4c6053 785 (reportedPropertyType == NULL)
AzureIoTClient 17:fa1bba4c6053 786 )
AzureIoTClient 17:fa1bba4c6053 787 {
AzureIoTClient 17:fa1bba4c6053 788 LogError("invalid argument SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* reportedPropertyName=%p, const char* reportedPropertyType=%p", modelTypeHandle, reportedPropertyName, reportedPropertyType);
AzureIoTClient 17:fa1bba4c6053 789 result = SCHEMA_INVALID_ARG;
AzureIoTClient 17:fa1bba4c6053 790 }
AzureIoTClient 17:fa1bba4c6053 791 else
AzureIoTClient 17:fa1bba4c6053 792 {
AzureIoTClient 17:fa1bba4c6053 793 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 794 /*Codes_SRS_SCHEMA_02_004: [ If reportedPropertyName has already been added then Schema_AddModelReportedProperty shall fail and return SCHEMA_PROPERTY_ELEMENT_EXISTS. ]*/
AzureIoTClient 17:fa1bba4c6053 795 if (VECTOR_find_if(modelType->reportedProperties, reportedPropertyExists, reportedPropertyName) != NULL)
AzureIoTClient 17:fa1bba4c6053 796 {
AzureIoTClient 17:fa1bba4c6053 797 LogError("unable to add reportedProperty %s because it already exists", reportedPropertyName);
AzureIoTClient 17:fa1bba4c6053 798 result = SCHEMA_DUPLICATE_ELEMENT;
AzureIoTClient 17:fa1bba4c6053 799 }
AzureIoTClient 17:fa1bba4c6053 800 else
AzureIoTClient 17:fa1bba4c6053 801 {
AzureIoTClient 17:fa1bba4c6053 802 /*Codes_SRS_SCHEMA_02_005: [ Schema_AddModelReportedProperty shall record reportedPropertyName and reportedPropertyType. ]*/
AzureIoTClient 17:fa1bba4c6053 803 SCHEMA_REPORTED_PROPERTY_HANDLE_DATA* reportedProperty = (SCHEMA_REPORTED_PROPERTY_HANDLE_DATA*)malloc(sizeof(SCHEMA_REPORTED_PROPERTY_HANDLE_DATA));
AzureIoTClient 17:fa1bba4c6053 804 if (reportedProperty == NULL)
AzureIoTClient 17:fa1bba4c6053 805 {
AzureIoTClient 17:fa1bba4c6053 806 /*Codes_SRS_SCHEMA_02_006: [ If any error occurs then Schema_AddModelReportedProperty shall fail and return SCHEMA_ERROR. ]*/
AzureIoTClient 17:fa1bba4c6053 807 LogError("unable to malloc");
AzureIoTClient 17:fa1bba4c6053 808 result = SCHEMA_ERROR;
AzureIoTClient 17:fa1bba4c6053 809 }
AzureIoTClient 17:fa1bba4c6053 810 else
AzureIoTClient 17:fa1bba4c6053 811 {
AzureIoTClient 17:fa1bba4c6053 812 if (mallocAndStrcpy_s((char**)&reportedProperty->reportedPropertyName, reportedPropertyName) != 0)
AzureIoTClient 17:fa1bba4c6053 813 {
AzureIoTClient 17:fa1bba4c6053 814 /*Codes_SRS_SCHEMA_02_006: [ If any error occurs then Schema_AddModelReportedProperty shall fail and return SCHEMA_ERROR. ]*/
AzureIoTClient 17:fa1bba4c6053 815 LogError("unable to mallocAndStrcpy_s");
AzureIoTClient 17:fa1bba4c6053 816 free(reportedProperty);
AzureIoTClient 17:fa1bba4c6053 817 result = SCHEMA_ERROR;
AzureIoTClient 17:fa1bba4c6053 818 }
AzureIoTClient 17:fa1bba4c6053 819 else
AzureIoTClient 17:fa1bba4c6053 820 {
AzureIoTClient 17:fa1bba4c6053 821 if (mallocAndStrcpy_s((char**)&reportedProperty->reportedPropertyType, reportedPropertyType) != 0)
AzureIoTClient 17:fa1bba4c6053 822 {
AzureIoTClient 17:fa1bba4c6053 823 /*Codes_SRS_SCHEMA_02_006: [ If any error occurs then Schema_AddModelReportedProperty shall fail and return SCHEMA_ERROR. ]*/
AzureIoTClient 17:fa1bba4c6053 824 LogError("unable to mallocAndStrcpy_s");
AzureIoTClient 17:fa1bba4c6053 825 free((void*)reportedProperty->reportedPropertyName);
AzureIoTClient 17:fa1bba4c6053 826 free(reportedProperty);
AzureIoTClient 17:fa1bba4c6053 827 result = SCHEMA_ERROR;
AzureIoTClient 17:fa1bba4c6053 828 }
AzureIoTClient 17:fa1bba4c6053 829 else
AzureIoTClient 17:fa1bba4c6053 830 {
AzureIoTClient 17:fa1bba4c6053 831 if (VECTOR_push_back(modelType->reportedProperties, &reportedProperty, 1) != 0)
AzureIoTClient 17:fa1bba4c6053 832 {
AzureIoTClient 17:fa1bba4c6053 833 /*Codes_SRS_SCHEMA_02_006: [ If any error occurs then Schema_AddModelReportedProperty shall fail and return SCHEMA_ERROR. ]*/
AzureIoTClient 17:fa1bba4c6053 834 LogError("unable to VECTOR_push_back");
AzureIoTClient 17:fa1bba4c6053 835 free((void*)reportedProperty->reportedPropertyType);
AzureIoTClient 17:fa1bba4c6053 836 free((void*)reportedProperty->reportedPropertyName);
AzureIoTClient 17:fa1bba4c6053 837 free(reportedProperty);
AzureIoTClient 17:fa1bba4c6053 838 result = SCHEMA_ERROR;
AzureIoTClient 17:fa1bba4c6053 839 }
AzureIoTClient 17:fa1bba4c6053 840 else
AzureIoTClient 17:fa1bba4c6053 841 {
AzureIoTClient 17:fa1bba4c6053 842 /*Codes_SRS_SCHEMA_02_007: [ Otherwise Schema_AddModelReportedProperty shall succeed and return SCHEMA_OK. ]*/
AzureIoTClient 17:fa1bba4c6053 843 result = SCHEMA_OK;
AzureIoTClient 17:fa1bba4c6053 844 }
AzureIoTClient 17:fa1bba4c6053 845 }
AzureIoTClient 17:fa1bba4c6053 846 }
AzureIoTClient 17:fa1bba4c6053 847 }
AzureIoTClient 17:fa1bba4c6053 848 }
AzureIoTClient 17:fa1bba4c6053 849 }
AzureIoTClient 17:fa1bba4c6053 850 return result;
AzureIoTClient 0:1f9b2707ec7d 851 }
AzureIoTClient 0:1f9b2707ec7d 852
AzureIoTClient 0:1f9b2707ec7d 853 SCHEMA_ACTION_HANDLE Schema_CreateModelAction(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* actionName)
AzureIoTClient 0:1f9b2707ec7d 854 {
AzureIoTClient 0:1f9b2707ec7d 855 SCHEMA_ACTION_HANDLE result;
AzureIoTClient 0:1f9b2707ec7d 856
AzureIoTClient 0:1f9b2707ec7d 857 /* Codes_SRS_SCHEMA_99_104: [If any of the modelTypeHandle or actionName arguments is NULL, Schema_CreateModelAction shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 858 if ((modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 859 (actionName == NULL))
AzureIoTClient 0:1f9b2707ec7d 860 {
AzureIoTClient 0:1f9b2707ec7d 861 result = NULL;
AzureIoTClient 11:b1327861f5e0 862 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 863 }
AzureIoTClient 0:1f9b2707ec7d 864 else
AzureIoTClient 0:1f9b2707ec7d 865 {
AzureIoTClient 17:fa1bba4c6053 866 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 867 size_t i;
AzureIoTClient 0:1f9b2707ec7d 868
AzureIoTClient 0:1f9b2707ec7d 869 /* Codes_SRS_SCHEMA_99_105: [The action name shall be unique per model, if the same action name is added twice to a model, Schema_CreateModelAction shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 870 for (i = 0; i < modelType->ActionCount; i++)
AzureIoTClient 0:1f9b2707ec7d 871 {
AzureIoTClient 17:fa1bba4c6053 872 SCHEMA_ACTION_HANDLE_DATA* action = (SCHEMA_ACTION_HANDLE_DATA*)modelType->Actions[i];
AzureIoTClient 0:1f9b2707ec7d 873 if (strcmp(action->ActionName, actionName) == 0)
AzureIoTClient 0:1f9b2707ec7d 874 {
AzureIoTClient 0:1f9b2707ec7d 875 break;
AzureIoTClient 0:1f9b2707ec7d 876 }
AzureIoTClient 0:1f9b2707ec7d 877 }
AzureIoTClient 0:1f9b2707ec7d 878
AzureIoTClient 0:1f9b2707ec7d 879 if (i < modelType->ActionCount)
AzureIoTClient 0:1f9b2707ec7d 880 {
AzureIoTClient 0:1f9b2707ec7d 881 result = NULL;
AzureIoTClient 11:b1327861f5e0 882 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_DUPLICATE_ELEMENT));
AzureIoTClient 0:1f9b2707ec7d 883 }
AzureIoTClient 0:1f9b2707ec7d 884 else
AzureIoTClient 0:1f9b2707ec7d 885 {
AzureIoTClient 0:1f9b2707ec7d 886 /* Codes_SRS_SCHEMA_99_102: [Schema_CreateModelAction shall add one action to the model type identified by modelTypeHandle.] */
AzureIoTClient 0:1f9b2707ec7d 887 SCHEMA_ACTION_HANDLE* newActions = (SCHEMA_ACTION_HANDLE*)realloc(modelType->Actions, sizeof(SCHEMA_ACTION_HANDLE) * (modelType->ActionCount + 1));
AzureIoTClient 0:1f9b2707ec7d 888 if (newActions == NULL)
AzureIoTClient 0:1f9b2707ec7d 889 {
AzureIoTClient 0:1f9b2707ec7d 890 /* Codes_SRS_SCHEMA_99_106: [On any other error, Schema_CreateModelAction shall return NULL.]*/
AzureIoTClient 0:1f9b2707ec7d 891 result = NULL;
AzureIoTClient 11:b1327861f5e0 892 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 893 }
AzureIoTClient 0:1f9b2707ec7d 894 else
AzureIoTClient 0:1f9b2707ec7d 895 {
AzureIoTClient 17:fa1bba4c6053 896 SCHEMA_ACTION_HANDLE_DATA* newAction;
AzureIoTClient 0:1f9b2707ec7d 897 modelType->Actions = newActions;
AzureIoTClient 0:1f9b2707ec7d 898
AzureIoTClient 0:1f9b2707ec7d 899 /* Codes_SRS_SCHEMA_99_103: [On success, Schema_CreateModelAction shall return a none-NULL SCHEMA_ACTION_HANDLE to the newly created action.] */
AzureIoTClient 17:fa1bba4c6053 900 if ((newAction = (SCHEMA_ACTION_HANDLE_DATA*)malloc(sizeof(SCHEMA_ACTION_HANDLE_DATA))) == NULL)
AzureIoTClient 0:1f9b2707ec7d 901 {
AzureIoTClient 0:1f9b2707ec7d 902 /* Codes_SRS_SCHEMA_99_106: [On any other error, Schema_CreateModelAction shall return NULL.]*/
AzureIoTClient 0:1f9b2707ec7d 903 result = NULL;
AzureIoTClient 11:b1327861f5e0 904 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 905 }
AzureIoTClient 0:1f9b2707ec7d 906 else
AzureIoTClient 0:1f9b2707ec7d 907 {
AzureIoTClient 0:1f9b2707ec7d 908 if (mallocAndStrcpy_s((char**)&newAction->ActionName, actionName) != 0)
AzureIoTClient 0:1f9b2707ec7d 909 {
AzureIoTClient 0:1f9b2707ec7d 910 /* Codes_SRS_SCHEMA_99_106: [On any other error, Schema_CreateModelAction shall return NULL.]*/
AzureIoTClient 0:1f9b2707ec7d 911 free(newAction);
AzureIoTClient 0:1f9b2707ec7d 912 result = NULL;
AzureIoTClient 11:b1327861f5e0 913 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 914 }
AzureIoTClient 0:1f9b2707ec7d 915 else
AzureIoTClient 0:1f9b2707ec7d 916 {
AzureIoTClient 0:1f9b2707ec7d 917 newAction->ArgumentCount = 0;
AzureIoTClient 0:1f9b2707ec7d 918 newAction->ArgumentHandles = NULL;
AzureIoTClient 0:1f9b2707ec7d 919
AzureIoTClient 0:1f9b2707ec7d 920 modelType->Actions[modelType->ActionCount] = newAction;
AzureIoTClient 0:1f9b2707ec7d 921 modelType->ActionCount++;
AzureIoTClient 0:1f9b2707ec7d 922 result = (SCHEMA_ACTION_HANDLE)(newAction);
AzureIoTClient 0:1f9b2707ec7d 923 }
AzureIoTClient 0:1f9b2707ec7d 924
AzureIoTClient 0:1f9b2707ec7d 925 /* If possible, reduce the memory of over allocation */
AzureIoTClient 0:1f9b2707ec7d 926 if (result == NULL)
AzureIoTClient 0:1f9b2707ec7d 927 {
AzureIoTClient 36:7d12a5386197 928 if (modelType->ActionCount > 0)
AzureIoTClient 0:1f9b2707ec7d 929 {
AzureIoTClient 36:7d12a5386197 930 SCHEMA_ACTION_HANDLE *oldActions = (SCHEMA_ACTION_HANDLE *)realloc(modelType->Actions, sizeof(SCHEMA_ACTION_HANDLE) * modelType->ActionCount);
AzureIoTClient 36:7d12a5386197 931 if (oldActions == NULL)
AzureIoTClient 36:7d12a5386197 932 {
AzureIoTClient 36:7d12a5386197 933 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 36:7d12a5386197 934 }
AzureIoTClient 36:7d12a5386197 935 else
AzureIoTClient 36:7d12a5386197 936 {
AzureIoTClient 36:7d12a5386197 937 modelType->Actions = oldActions;
AzureIoTClient 36:7d12a5386197 938 }
AzureIoTClient 0:1f9b2707ec7d 939 }
AzureIoTClient 0:1f9b2707ec7d 940 else
AzureIoTClient 0:1f9b2707ec7d 941 {
AzureIoTClient 36:7d12a5386197 942 modelType->Actions = NULL;
AzureIoTClient 0:1f9b2707ec7d 943 }
AzureIoTClient 0:1f9b2707ec7d 944 }
AzureIoTClient 0:1f9b2707ec7d 945 }
AzureIoTClient 0:1f9b2707ec7d 946 }
AzureIoTClient 0:1f9b2707ec7d 947 }
AzureIoTClient 0:1f9b2707ec7d 948 }
AzureIoTClient 0:1f9b2707ec7d 949 return result;
AzureIoTClient 0:1f9b2707ec7d 950 }
AzureIoTClient 0:1f9b2707ec7d 951
Azure.IoT.Build 18:58b667752399 952
Azure.IoT.Build 18:58b667752399 953 static bool methodExists(const void* element, const void* value)
Azure.IoT.Build 18:58b667752399 954 {
Azure.IoT.Build 18:58b667752399 955 const SCHEMA_METHOD_HANDLE* method = (const SCHEMA_METHOD_HANDLE*)element;
Azure.IoT.Build 18:58b667752399 956 return (strcmp((*method)->methodName, value) == 0);
Azure.IoT.Build 18:58b667752399 957 }
Azure.IoT.Build 18:58b667752399 958
Azure.IoT.Build 18:58b667752399 959
Azure.IoT.Build 18:58b667752399 960 SCHEMA_METHOD_HANDLE Schema_CreateModelMethod(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* methodName)
Azure.IoT.Build 18:58b667752399 961 {
Azure.IoT.Build 18:58b667752399 962 SCHEMA_METHOD_HANDLE result;
Azure.IoT.Build 18:58b667752399 963
Azure.IoT.Build 18:58b667752399 964 /*Codes_SRS_SCHEMA_02_096: [ If modelTypeHandle is NULL then Schema_CreateModelMethod shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 965 /*Codes_SRS_SCHEMA_02_097: [ If methodName is NULL then Schema_CreateModelMethod shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 966 if ((modelTypeHandle == NULL) ||
Azure.IoT.Build 18:58b667752399 967 (methodName == NULL))
Azure.IoT.Build 18:58b667752399 968 {
Azure.IoT.Build 18:58b667752399 969 result = NULL;
Azure.IoT.Build 18:58b667752399 970 LogError("invalid argument: SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* methodName=%p", modelTypeHandle, methodName);
Azure.IoT.Build 18:58b667752399 971 }
Azure.IoT.Build 18:58b667752399 972 else
Azure.IoT.Build 18:58b667752399 973 {
Azure.IoT.Build 18:58b667752399 974 /*Codes_SRS_SCHEMA_02_103: [ If methodName already exists, then Schema_CreateModelMethod shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 975 if (VECTOR_find_if(modelTypeHandle->methods, methodExists, methodName) != NULL)
Azure.IoT.Build 18:58b667752399 976 {
Azure.IoT.Build 18:58b667752399 977 LogError("method %s already exists", methodName);
Azure.IoT.Build 18:58b667752399 978 result = NULL;
Azure.IoT.Build 18:58b667752399 979 }
Azure.IoT.Build 18:58b667752399 980 else
Azure.IoT.Build 18:58b667752399 981 {
Azure.IoT.Build 18:58b667752399 982 /*Codes_SRS_SCHEMA_02_098: [ Schema_CreateModelMethod shall allocate the space for the method. ]*/
Azure.IoT.Build 18:58b667752399 983 result = malloc(sizeof(SCHEMA_METHOD_HANDLE_DATA));
Azure.IoT.Build 18:58b667752399 984 if (result == NULL)
Azure.IoT.Build 18:58b667752399 985 {
Azure.IoT.Build 18:58b667752399 986 LogError("failed to malloc");
Azure.IoT.Build 18:58b667752399 987 /*Codes_SRS_SCHEMA_02_102: [ If any of the above fails, then Schema_CreateModelMethod shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 988 /*return as is*/
Azure.IoT.Build 18:58b667752399 989 }
Azure.IoT.Build 18:58b667752399 990 else
Azure.IoT.Build 18:58b667752399 991 {
Azure.IoT.Build 18:58b667752399 992 /*Codes_SRS_SCHEMA_02_099: [ Schema_CreateModelMethod shall create a VECTOR that will hold the method's arguments. ]*/
Azure.IoT.Build 18:58b667752399 993 result->methodArguments = VECTOR_create(sizeof(SCHEMA_METHOD_ARGUMENT_HANDLE));
Azure.IoT.Build 18:58b667752399 994 if (result->methodArguments == NULL)
Azure.IoT.Build 18:58b667752399 995 {
Azure.IoT.Build 18:58b667752399 996 /*Codes_SRS_SCHEMA_02_102: [ If any of the above fails, then Schema_CreateModelMethod shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 997 LogError("failure in VECTOR_create");
Azure.IoT.Build 18:58b667752399 998 free(result);
Azure.IoT.Build 18:58b667752399 999 result = NULL;
Azure.IoT.Build 18:58b667752399 1000 }
Azure.IoT.Build 18:58b667752399 1001 else
Azure.IoT.Build 18:58b667752399 1002 {
Azure.IoT.Build 18:58b667752399 1003 /*Codes_SRS_SCHEMA_02_100: [ Schema_CreateModelMethod shall clone methodName ]*/
Azure.IoT.Build 18:58b667752399 1004 if (mallocAndStrcpy_s(&result->methodName, methodName) != 0)
Azure.IoT.Build 18:58b667752399 1005 {
Azure.IoT.Build 18:58b667752399 1006 /*Codes_SRS_SCHEMA_02_102: [ If any of the above fails, then Schema_CreateModelMethod shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 1007 LogError("failure in mallocAndStrcpy_s");
Azure.IoT.Build 18:58b667752399 1008 VECTOR_destroy(result->methodArguments);
Azure.IoT.Build 18:58b667752399 1009 free(result);
Azure.IoT.Build 18:58b667752399 1010 result = NULL;
Azure.IoT.Build 18:58b667752399 1011 }
Azure.IoT.Build 18:58b667752399 1012 else
Azure.IoT.Build 18:58b667752399 1013 {
Azure.IoT.Build 18:58b667752399 1014 /*Codes_SRS_SCHEMA_02_101: [ Schema_CreateModelMethod shall add the new created method to the model's list of methods. ]*/
Azure.IoT.Build 18:58b667752399 1015 if (VECTOR_push_back(modelTypeHandle->methods, &result, 1) != 0)
Azure.IoT.Build 18:58b667752399 1016 {
Azure.IoT.Build 18:58b667752399 1017 /*Codes_SRS_SCHEMA_02_102: [ If any of the above fails, then Schema_CreateModelMethod shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 1018 LogError("failure in VECTOR_push_back");
Azure.IoT.Build 18:58b667752399 1019 free(result->methodName);
Azure.IoT.Build 18:58b667752399 1020 VECTOR_destroy(result->methodArguments);
Azure.IoT.Build 18:58b667752399 1021 free(result);
Azure.IoT.Build 18:58b667752399 1022 result = NULL;
Azure.IoT.Build 18:58b667752399 1023 }
Azure.IoT.Build 18:58b667752399 1024 else
Azure.IoT.Build 18:58b667752399 1025 {
Azure.IoT.Build 18:58b667752399 1026 /*Codes_SRS_SCHEMA_02_104: [ Otherwise, Schema_CreateModelMethod shall succeed and return a non-NULL SCHEMA_METHOD_HANDLE. ]*/
Azure.IoT.Build 18:58b667752399 1027 /*return as is*/
Azure.IoT.Build 18:58b667752399 1028 }
Azure.IoT.Build 18:58b667752399 1029 }
Azure.IoT.Build 18:58b667752399 1030 }
Azure.IoT.Build 18:58b667752399 1031 }
Azure.IoT.Build 18:58b667752399 1032 }
Azure.IoT.Build 18:58b667752399 1033 }
Azure.IoT.Build 18:58b667752399 1034 return result;
Azure.IoT.Build 18:58b667752399 1035 }
Azure.IoT.Build 18:58b667752399 1036
Azure.IoT.Build 18:58b667752399 1037
AzureIoTClient 0:1f9b2707ec7d 1038 SCHEMA_RESULT Schema_AddModelActionArgument(SCHEMA_ACTION_HANDLE actionHandle, const char* argumentName, const char* argumentType)
AzureIoTClient 0:1f9b2707ec7d 1039 {
AzureIoTClient 0:1f9b2707ec7d 1040 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 1041
AzureIoTClient 0:1f9b2707ec7d 1042 /* Codes_SRS_SCHEMA_99_109: [If any of the arguments is NULL, Schema_AddModelActionArgument shall return SCHEMA_INVALID_ARG.] */
AzureIoTClient 0:1f9b2707ec7d 1043 if ((actionHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1044 (argumentName == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1045 (argumentType == NULL))
AzureIoTClient 0:1f9b2707ec7d 1046 {
AzureIoTClient 0:1f9b2707ec7d 1047 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 1048 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1049 }
AzureIoTClient 0:1f9b2707ec7d 1050 else
AzureIoTClient 0:1f9b2707ec7d 1051 {
AzureIoTClient 17:fa1bba4c6053 1052 SCHEMA_ACTION_HANDLE_DATA* action = (SCHEMA_ACTION_HANDLE_DATA*)actionHandle;
AzureIoTClient 0:1f9b2707ec7d 1053
AzureIoTClient 0:1f9b2707ec7d 1054 /* Codes_SRS_SCHEMA_99_110: [The argument name shall be unique per action, if the same name is added twice to an action, SCHEMA_DUPLICATE_ELEMENT shall be returned.] */
AzureIoTClient 0:1f9b2707ec7d 1055 /* Codes_SRS_SCHEMA_99_111: [Schema_AddModelActionArgument shall accept arguments with different names of the same type.] */
AzureIoTClient 0:1f9b2707ec7d 1056 size_t i;
AzureIoTClient 0:1f9b2707ec7d 1057 for (i = 0; i < action->ArgumentCount; i++)
AzureIoTClient 0:1f9b2707ec7d 1058 {
AzureIoTClient 17:fa1bba4c6053 1059 SCHEMA_ACTION_ARGUMENT_HANDLE_DATA* actionArgument = (SCHEMA_ACTION_ARGUMENT_HANDLE_DATA*)action->ArgumentHandles[i];
AzureIoTClient 0:1f9b2707ec7d 1060 if (strcmp((actionArgument->Name), argumentName) == 0)
AzureIoTClient 0:1f9b2707ec7d 1061 {
AzureIoTClient 0:1f9b2707ec7d 1062 break;
AzureIoTClient 0:1f9b2707ec7d 1063 }
AzureIoTClient 0:1f9b2707ec7d 1064 }
AzureIoTClient 0:1f9b2707ec7d 1065
AzureIoTClient 0:1f9b2707ec7d 1066 if (i < action->ArgumentCount)
AzureIoTClient 0:1f9b2707ec7d 1067 {
AzureIoTClient 0:1f9b2707ec7d 1068 result = SCHEMA_DUPLICATE_ELEMENT;
AzureIoTClient 11:b1327861f5e0 1069 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1070 }
AzureIoTClient 0:1f9b2707ec7d 1071 else
AzureIoTClient 0:1f9b2707ec7d 1072 {
AzureIoTClient 0:1f9b2707ec7d 1073 /* Codes_SRS_SCHEMA_99_107: [Schema_AddModelActionArgument shall add one argument name & type to an action identified by actionHandle.] */
AzureIoTClient 0:1f9b2707ec7d 1074 SCHEMA_ACTION_ARGUMENT_HANDLE* newArguments = (SCHEMA_ACTION_ARGUMENT_HANDLE*)realloc(action->ArgumentHandles, sizeof(SCHEMA_ACTION_ARGUMENT_HANDLE) * (action->ArgumentCount + 1));
AzureIoTClient 0:1f9b2707ec7d 1075 if (newArguments == NULL)
AzureIoTClient 0:1f9b2707ec7d 1076 {
AzureIoTClient 0:1f9b2707ec7d 1077 /* Codes_SRS_SCHEMA_99_112: [On any other error, Schema_ AddModelActionArgumet shall return SCHEMA_ERROR.] */
AzureIoTClient 0:1f9b2707ec7d 1078 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 1079 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1080 }
AzureIoTClient 0:1f9b2707ec7d 1081 else
AzureIoTClient 0:1f9b2707ec7d 1082 {
AzureIoTClient 36:7d12a5386197 1083 action->ArgumentHandles = newArguments;
AzureIoTClient 36:7d12a5386197 1084
AzureIoTClient 17:fa1bba4c6053 1085 SCHEMA_ACTION_ARGUMENT_HANDLE_DATA* newActionArgument;
AzureIoTClient 36:7d12a5386197 1086
AzureIoTClient 36:7d12a5386197 1087 action->ArgumentHandles = newArguments;
AzureIoTClient 17:fa1bba4c6053 1088 if ((newActionArgument = (SCHEMA_ACTION_ARGUMENT_HANDLE_DATA*)malloc(sizeof(SCHEMA_ACTION_ARGUMENT_HANDLE_DATA))) == NULL)
AzureIoTClient 0:1f9b2707ec7d 1089 {
AzureIoTClient 0:1f9b2707ec7d 1090 /* Codes_SRS_SCHEMA_99_112: [On any other error, Schema_ AddModelActionArgumet shall return SCHEMA_ERROR.] */
AzureIoTClient 0:1f9b2707ec7d 1091 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 1092 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1093 }
AzureIoTClient 0:1f9b2707ec7d 1094 else
AzureIoTClient 0:1f9b2707ec7d 1095 {
AzureIoTClient 0:1f9b2707ec7d 1096 if (mallocAndStrcpy_s((char**)&newActionArgument->Name, argumentName) != 0)
AzureIoTClient 0:1f9b2707ec7d 1097 {
AzureIoTClient 0:1f9b2707ec7d 1098 /* Codes_SRS_SCHEMA_99_112: [On any other error, Schema_ AddModelActionArgumet shall return SCHEMA_ERROR.] */
AzureIoTClient 0:1f9b2707ec7d 1099 free(newActionArgument);
AzureIoTClient 0:1f9b2707ec7d 1100 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 1101 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1102 }
AzureIoTClient 0:1f9b2707ec7d 1103 else if (mallocAndStrcpy_s((char**)&newActionArgument->Type, argumentType) != 0)
AzureIoTClient 0:1f9b2707ec7d 1104 {
AzureIoTClient 0:1f9b2707ec7d 1105 /* Codes_SRS_SCHEMA_99_112: [On any other error, Schema_ AddModelActionArgumet shall return SCHEMA_ERROR.] */
AzureIoTClient 0:1f9b2707ec7d 1106 free((void*)newActionArgument->Name);
AzureIoTClient 0:1f9b2707ec7d 1107 free(newActionArgument);
AzureIoTClient 0:1f9b2707ec7d 1108 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 1109 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1110 }
AzureIoTClient 0:1f9b2707ec7d 1111 else
AzureIoTClient 0:1f9b2707ec7d 1112 {
AzureIoTClient 0:1f9b2707ec7d 1113 /* Codes_SRS_SCHEMA_99_119: [Schema_AddModelActionArgument shall preserve the order of the action arguments according to the order in which they were added, starting with index 0 for the first added argument.] */
AzureIoTClient 0:1f9b2707ec7d 1114 action->ArgumentHandles[action->ArgumentCount] = newActionArgument;
AzureIoTClient 0:1f9b2707ec7d 1115 action->ArgumentCount++;
AzureIoTClient 0:1f9b2707ec7d 1116
AzureIoTClient 0:1f9b2707ec7d 1117 /* Codes_SRS_SCHEMA_99_108: [On success, Schema_AddModelActionArgunent shall return SCHEMA_OK.] */
AzureIoTClient 0:1f9b2707ec7d 1118 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 1119 }
AzureIoTClient 0:1f9b2707ec7d 1120 }
AzureIoTClient 0:1f9b2707ec7d 1121
AzureIoTClient 0:1f9b2707ec7d 1122 /* If possible, reduce the memory of over allocation */
AzureIoTClient 0:1f9b2707ec7d 1123 if (result == SCHEMA_ERROR)
AzureIoTClient 0:1f9b2707ec7d 1124 {
AzureIoTClient 36:7d12a5386197 1125 if (action->ArgumentCount > 0)
AzureIoTClient 0:1f9b2707ec7d 1126 {
AzureIoTClient 36:7d12a5386197 1127 SCHEMA_ACTION_ARGUMENT_HANDLE *oldArguments = (SCHEMA_ACTION_ARGUMENT_HANDLE *)realloc(action->ArgumentHandles, sizeof(SCHEMA_ACTION_ARGUMENT_HANDLE) * action->ArgumentCount);
AzureIoTClient 36:7d12a5386197 1128 if (oldArguments == NULL)
AzureIoTClient 36:7d12a5386197 1129 {
AzureIoTClient 36:7d12a5386197 1130 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 36:7d12a5386197 1131 }
AzureIoTClient 36:7d12a5386197 1132 else
AzureIoTClient 36:7d12a5386197 1133 {
AzureIoTClient 36:7d12a5386197 1134 action->ArgumentHandles = oldArguments;
AzureIoTClient 36:7d12a5386197 1135 }
AzureIoTClient 0:1f9b2707ec7d 1136 }
AzureIoTClient 0:1f9b2707ec7d 1137 else
AzureIoTClient 0:1f9b2707ec7d 1138 {
AzureIoTClient 36:7d12a5386197 1139 action->ArgumentHandles = NULL;
AzureIoTClient 0:1f9b2707ec7d 1140 }
AzureIoTClient 0:1f9b2707ec7d 1141 }
AzureIoTClient 0:1f9b2707ec7d 1142 }
AzureIoTClient 0:1f9b2707ec7d 1143 }
AzureIoTClient 0:1f9b2707ec7d 1144 }
AzureIoTClient 0:1f9b2707ec7d 1145 return result;
AzureIoTClient 0:1f9b2707ec7d 1146 }
AzureIoTClient 0:1f9b2707ec7d 1147
Azure.IoT.Build 18:58b667752399 1148 static bool methodFindArgumentByBame(const void* element, const void* value)
Azure.IoT.Build 18:58b667752399 1149 {
Azure.IoT.Build 18:58b667752399 1150 /*element is a pointer to SCHEMA_METHOD_ARGUMENT_HANDLE*/
Azure.IoT.Build 18:58b667752399 1151 const SCHEMA_METHOD_ARGUMENT_HANDLE* decodedElement = (const SCHEMA_METHOD_ARGUMENT_HANDLE*)element;
Azure.IoT.Build 18:58b667752399 1152 const char* name = (const char*)value;
Azure.IoT.Build 18:58b667752399 1153 return (strcmp((*decodedElement)->Name, name) == 0);
Azure.IoT.Build 18:58b667752399 1154 }
Azure.IoT.Build 18:58b667752399 1155
Azure.IoT.Build 18:58b667752399 1156 SCHEMA_RESULT Schema_AddModelMethodArgument(SCHEMA_METHOD_HANDLE methodHandle, const char* argumentName, const char* argumentType)
Azure.IoT.Build 18:58b667752399 1157 {
Azure.IoT.Build 18:58b667752399 1158 SCHEMA_RESULT result;
Azure.IoT.Build 18:58b667752399 1159 /*Codes_SRS_SCHEMA_02_105: [ If methodHandle is NULL then Schema_AddModelMethodArgument shall fail and return SCHEMA_INVALID_ARG. ]*/
Azure.IoT.Build 18:58b667752399 1160 /*Codes_SRS_SCHEMA_02_106: [ If argumentName is NULL then Schema_AddModelMethodArgument shall fail and return SCHEMA_INVALID_ARG. ]*/
Azure.IoT.Build 18:58b667752399 1161 /*Codes_SRS_SCHEMA_02_107: [ If argumentType is NULL then Schema_AddModelMethodArgument shall fail and return SCHEMA_INVALID_ARG. ]*/
Azure.IoT.Build 18:58b667752399 1162 if ((methodHandle == NULL) ||
Azure.IoT.Build 18:58b667752399 1163 (argumentName == NULL) ||
Azure.IoT.Build 18:58b667752399 1164 (argumentType == NULL))
Azure.IoT.Build 18:58b667752399 1165 {
Azure.IoT.Build 18:58b667752399 1166 result = SCHEMA_INVALID_ARG;
Azure.IoT.Build 18:58b667752399 1167 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
Azure.IoT.Build 18:58b667752399 1168 }
Azure.IoT.Build 18:58b667752399 1169 else
Azure.IoT.Build 18:58b667752399 1170 {
Azure.IoT.Build 18:58b667752399 1171 /*Codes_SRS_SCHEMA_02_108: [ If argumentName already exists in the list of arguments then then Schema_AddModelMethodArgument shall fail and return SCHEMA_INVALID_ARG. ]*/
Azure.IoT.Build 18:58b667752399 1172 if (VECTOR_find_if(methodHandle->methodArguments, methodFindArgumentByBame, argumentName) != NULL)
Azure.IoT.Build 18:58b667752399 1173 {
Azure.IoT.Build 18:58b667752399 1174 LogError("an argument with name %s already exists", argumentName);
Azure.IoT.Build 18:58b667752399 1175 result = SCHEMA_INVALID_ARG;
Azure.IoT.Build 18:58b667752399 1176 }
Azure.IoT.Build 18:58b667752399 1177 else
Azure.IoT.Build 18:58b667752399 1178 {
Azure.IoT.Build 18:58b667752399 1179 /*Codes_SRS_SCHEMA_02_109: [ Schema_AddModelMethodArgument shall allocate memory for the new argument. ]*/
Azure.IoT.Build 18:58b667752399 1180 SCHEMA_METHOD_ARGUMENT_HANDLE_DATA* argument = malloc(sizeof(SCHEMA_METHOD_ARGUMENT_HANDLE_DATA));
Azure.IoT.Build 18:58b667752399 1181 if (argument == NULL)
Azure.IoT.Build 18:58b667752399 1182 {
Azure.IoT.Build 18:58b667752399 1183 /*Codes_SRS_SCHEMA_02_113: [ If any of the above operations fails, then Schema_AddModelMethodArgument shall fail and return SCHEMA_ERROR. ]*/
Azure.IoT.Build 18:58b667752399 1184 LogError("failure to malloc");
Azure.IoT.Build 18:58b667752399 1185 result = SCHEMA_ERROR;
Azure.IoT.Build 18:58b667752399 1186 }
Azure.IoT.Build 18:58b667752399 1187 else
Azure.IoT.Build 18:58b667752399 1188 {
Azure.IoT.Build 18:58b667752399 1189 /*Codes_SRS_SCHEMA_02_110: [ Schema_AddModelMethodArgument shall clone methodHandle. ]*/
Azure.IoT.Build 18:58b667752399 1190 if (mallocAndStrcpy_s(&argument->Name, argumentName) != 0)
Azure.IoT.Build 18:58b667752399 1191 {
Azure.IoT.Build 18:58b667752399 1192 /*Codes_SRS_SCHEMA_02_113: [ If any of the above operations fails, then Schema_AddModelMethodArgument shall fail and return SCHEMA_ERROR. ]*/
Azure.IoT.Build 18:58b667752399 1193 LogError("failure in mallocAndStrcpy_s");
Azure.IoT.Build 18:58b667752399 1194 free(argument);
Azure.IoT.Build 18:58b667752399 1195 result = SCHEMA_ERROR;
Azure.IoT.Build 18:58b667752399 1196 }
Azure.IoT.Build 18:58b667752399 1197 else
Azure.IoT.Build 18:58b667752399 1198 {
Azure.IoT.Build 18:58b667752399 1199 /*Codes_SRS_SCHEMA_02_111: [ Schema_AddModelMethodArgument shall clone argumentType. ]*/
Azure.IoT.Build 18:58b667752399 1200 if (mallocAndStrcpy_s(&argument->Type, argumentType) != 0)
Azure.IoT.Build 18:58b667752399 1201 {
Azure.IoT.Build 18:58b667752399 1202 /*Codes_SRS_SCHEMA_02_113: [ If any of the above operations fails, then Schema_AddModelMethodArgument shall fail and return SCHEMA_ERROR. ]*/
Azure.IoT.Build 18:58b667752399 1203 LogError("failure in mallocAndStrcpy_s");
Azure.IoT.Build 18:58b667752399 1204 free(argument->Name);
Azure.IoT.Build 18:58b667752399 1205 free(argument);
Azure.IoT.Build 18:58b667752399 1206 result = SCHEMA_ERROR;
Azure.IoT.Build 18:58b667752399 1207 }
Azure.IoT.Build 18:58b667752399 1208 else
Azure.IoT.Build 18:58b667752399 1209 {
Azure.IoT.Build 18:58b667752399 1210 /*Codes_SRS_SCHEMA_02_112: [ Schema_AddModelMethodArgument shall add the created argument to the method's list of arguments. ]*/
Azure.IoT.Build 18:58b667752399 1211 if (VECTOR_push_back(methodHandle->methodArguments, &argument, 1) != 0)
Azure.IoT.Build 18:58b667752399 1212 {
Azure.IoT.Build 18:58b667752399 1213 /*Codes_SRS_SCHEMA_02_113: [ If any of the above operations fails, then Schema_AddModelMethodArgument shall fail and return SCHEMA_ERROR. ]*/
Azure.IoT.Build 18:58b667752399 1214 LogError("failure in VECTOR_push_back");
Azure.IoT.Build 18:58b667752399 1215 free(argument->Name);
Azure.IoT.Build 18:58b667752399 1216 free(argument->Type);
Azure.IoT.Build 18:58b667752399 1217 free(argument);
Azure.IoT.Build 18:58b667752399 1218 result = SCHEMA_ERROR;
Azure.IoT.Build 18:58b667752399 1219 }
Azure.IoT.Build 18:58b667752399 1220 else
Azure.IoT.Build 18:58b667752399 1221 {
Azure.IoT.Build 18:58b667752399 1222 /*Codes_SRS_SCHEMA_02_114: [ Otherwise, Schema_AddModelMethodArgument shall succeed and return SCHEMA_OK. ]*/
Azure.IoT.Build 18:58b667752399 1223 result = SCHEMA_OK;
Azure.IoT.Build 18:58b667752399 1224 }
Azure.IoT.Build 18:58b667752399 1225 }
Azure.IoT.Build 18:58b667752399 1226 }
Azure.IoT.Build 18:58b667752399 1227 }
Azure.IoT.Build 18:58b667752399 1228 }
Azure.IoT.Build 18:58b667752399 1229 }
Azure.IoT.Build 18:58b667752399 1230 return result;
Azure.IoT.Build 18:58b667752399 1231 }
Azure.IoT.Build 18:58b667752399 1232
AzureIoTClient 0:1f9b2707ec7d 1233 SCHEMA_PROPERTY_HANDLE Schema_GetModelPropertyByName(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* propertyName)
AzureIoTClient 0:1f9b2707ec7d 1234 {
AzureIoTClient 0:1f9b2707ec7d 1235 SCHEMA_PROPERTY_HANDLE result;
AzureIoTClient 0:1f9b2707ec7d 1236
AzureIoTClient 0:1f9b2707ec7d 1237 /* Codes_SRS_SCHEMA_99_038:[Schema_GetModelPropertyByName shall return NULL if unable to find a matching property or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1238 if ((modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1239 (propertyName == NULL))
AzureIoTClient 0:1f9b2707ec7d 1240 {
AzureIoTClient 0:1f9b2707ec7d 1241 result = NULL;
AzureIoTClient 11:b1327861f5e0 1242 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1243 }
AzureIoTClient 0:1f9b2707ec7d 1244 else
AzureIoTClient 0:1f9b2707ec7d 1245 {
AzureIoTClient 0:1f9b2707ec7d 1246 size_t i;
AzureIoTClient 17:fa1bba4c6053 1247 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 1248
AzureIoTClient 0:1f9b2707ec7d 1249 /* Codes_SRS_SCHEMA_99_036:[Schema_GetModelPropertyByName shall return a non-NULL SCHEMA_PROPERTY_HANDLE corresponding to the model type identified by modelTypeHandle and matching the propertyName argument value.] */
AzureIoTClient 0:1f9b2707ec7d 1250 for (i = 0; i < modelType->PropertyCount; i++)
AzureIoTClient 0:1f9b2707ec7d 1251 {
AzureIoTClient 17:fa1bba4c6053 1252 SCHEMA_PROPERTY_HANDLE_DATA* modelProperty = (SCHEMA_PROPERTY_HANDLE_DATA*)modelType->Properties[i];
AzureIoTClient 0:1f9b2707ec7d 1253 if (strcmp(modelProperty->PropertyName, propertyName) == 0)
AzureIoTClient 0:1f9b2707ec7d 1254 {
AzureIoTClient 0:1f9b2707ec7d 1255 break;
AzureIoTClient 0:1f9b2707ec7d 1256 }
AzureIoTClient 0:1f9b2707ec7d 1257 }
AzureIoTClient 0:1f9b2707ec7d 1258
AzureIoTClient 0:1f9b2707ec7d 1259 if (i == modelType->PropertyCount)
AzureIoTClient 0:1f9b2707ec7d 1260 {
AzureIoTClient 0:1f9b2707ec7d 1261 /* Codes_SRS_SCHEMA_99_038:[Schema_GetModelPropertyByName shall return NULL if unable to find a matching property or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1262 result = NULL;
AzureIoTClient 11:b1327861f5e0 1263 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ELEMENT_NOT_FOUND));
AzureIoTClient 0:1f9b2707ec7d 1264 }
AzureIoTClient 0:1f9b2707ec7d 1265 else
AzureIoTClient 0:1f9b2707ec7d 1266 {
AzureIoTClient 0:1f9b2707ec7d 1267 result = (SCHEMA_PROPERTY_HANDLE)(modelType->Properties[i]);
AzureIoTClient 0:1f9b2707ec7d 1268 }
AzureIoTClient 0:1f9b2707ec7d 1269 }
AzureIoTClient 0:1f9b2707ec7d 1270
AzureIoTClient 0:1f9b2707ec7d 1271 return result;
AzureIoTClient 0:1f9b2707ec7d 1272 }
AzureIoTClient 0:1f9b2707ec7d 1273
AzureIoTClient 0:1f9b2707ec7d 1274 SCHEMA_RESULT Schema_GetModelPropertyCount(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t* propertyCount)
AzureIoTClient 0:1f9b2707ec7d 1275 {
AzureIoTClient 0:1f9b2707ec7d 1276 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 1277
AzureIoTClient 0:1f9b2707ec7d 1278 /* Codes_SRS_SCHEMA_99_092: [Schema_GetModelPropertyCount shall return SCHEMA_INVALID_ARG if any of the arguments is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1279 if ((modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1280 (propertyCount == NULL))
AzureIoTClient 0:1f9b2707ec7d 1281 {
AzureIoTClient 0:1f9b2707ec7d 1282 result = SCHEMA_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 1283 }
AzureIoTClient 0:1f9b2707ec7d 1284 else
AzureIoTClient 0:1f9b2707ec7d 1285 {
AzureIoTClient 0:1f9b2707ec7d 1286 /* Codes_SRS_SCHEMA_99_089: [Schema_GetModelPropertyCount shall provide the number of properties defined in the model type identified by modelTypeHandle.] */
AzureIoTClient 17:fa1bba4c6053 1287 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 1288
AzureIoTClient 0:1f9b2707ec7d 1289 /* Codes_SRS_SCHEMA_99_090: [The count shall be provided via the out argument propertyCount.]*/
AzureIoTClient 0:1f9b2707ec7d 1290 *propertyCount = modelType->PropertyCount;
AzureIoTClient 0:1f9b2707ec7d 1291
AzureIoTClient 0:1f9b2707ec7d 1292 /* Codes_SRS_SCHEMA_99_091: [On success, Schema_GetModelPropertyCount shall return SCHEMA_OK.] */
AzureIoTClient 0:1f9b2707ec7d 1293 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 1294 }
AzureIoTClient 0:1f9b2707ec7d 1295
AzureIoTClient 0:1f9b2707ec7d 1296 return result;
AzureIoTClient 0:1f9b2707ec7d 1297 }
AzureIoTClient 0:1f9b2707ec7d 1298
AzureIoTClient 17:fa1bba4c6053 1299 SCHEMA_RESULT Schema_GetModelReportedPropertyCount(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t* reportedPropertyCount)
AzureIoTClient 17:fa1bba4c6053 1300 {
AzureIoTClient 17:fa1bba4c6053 1301 SCHEMA_RESULT result;
AzureIoTClient 17:fa1bba4c6053 1302 /*Codes_SRS_SCHEMA_02_008: [ If parameter modelTypeHandle is NULL then Schema_GetModelReportedPropertyCount shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 1303 /*Codes_SRS_SCHEMA_02_009: [ If parameter reportedPropertyCount is NULL then Schema_GetModelReportedPropertyCount shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 1304 if (
AzureIoTClient 17:fa1bba4c6053 1305 (modelTypeHandle == NULL)||
AzureIoTClient 17:fa1bba4c6053 1306 (reportedPropertyCount==NULL)
AzureIoTClient 17:fa1bba4c6053 1307 )
AzureIoTClient 17:fa1bba4c6053 1308 {
AzureIoTClient 17:fa1bba4c6053 1309 LogError("SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, size_t* reportedPropertyCount=%p", modelTypeHandle, reportedPropertyCount);
AzureIoTClient 17:fa1bba4c6053 1310 result = SCHEMA_INVALID_ARG;
AzureIoTClient 17:fa1bba4c6053 1311 }
AzureIoTClient 17:fa1bba4c6053 1312 else
AzureIoTClient 17:fa1bba4c6053 1313 {
AzureIoTClient 17:fa1bba4c6053 1314 /*Codes_SRS_SCHEMA_02_010: [ Schema_GetModelReportedPropertyCount shall provide in reportedPropertyCount the number of reported properties and return SCHEMA_OK. ]*/
AzureIoTClient 17:fa1bba4c6053 1315 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 1316 *reportedPropertyCount = VECTOR_size(modelType->reportedProperties);
AzureIoTClient 17:fa1bba4c6053 1317 result = SCHEMA_OK;
AzureIoTClient 17:fa1bba4c6053 1318 }
AzureIoTClient 17:fa1bba4c6053 1319 return result;
AzureIoTClient 17:fa1bba4c6053 1320 }
AzureIoTClient 17:fa1bba4c6053 1321
AzureIoTClient 17:fa1bba4c6053 1322 SCHEMA_REPORTED_PROPERTY_HANDLE Schema_GetModelReportedPropertyByName(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* reportedPropertyName)
AzureIoTClient 17:fa1bba4c6053 1323 {
AzureIoTClient 17:fa1bba4c6053 1324 SCHEMA_REPORTED_PROPERTY_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 1325 /*Codes_SRS_SCHEMA_02_011: [ If argument modelTypeHandle is NULL then Schema_GetModelReportedPropertyByName shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 1326 /*Codes_SRS_SCHEMA_02_012: [ If argument reportedPropertyName is NULL then Schema_GetModelReportedPropertyByName shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 1327 if(
AzureIoTClient 17:fa1bba4c6053 1328 (modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 1329 (reportedPropertyName == NULL)
AzureIoTClient 17:fa1bba4c6053 1330 )
AzureIoTClient 17:fa1bba4c6053 1331 {
AzureIoTClient 17:fa1bba4c6053 1332 LogError("invalid argument SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* reportedPropertyName=%p", modelTypeHandle, reportedPropertyName);
AzureIoTClient 17:fa1bba4c6053 1333 result = NULL;
AzureIoTClient 17:fa1bba4c6053 1334 }
AzureIoTClient 17:fa1bba4c6053 1335 else
AzureIoTClient 17:fa1bba4c6053 1336 {
AzureIoTClient 17:fa1bba4c6053 1337 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 1338 /*Codes_SRS_SCHEMA_02_013: [ If reported property by the name reportedPropertyName exists then Schema_GetModelReportedPropertyByName shall succeed and return a non-NULL value. ]*/
AzureIoTClient 17:fa1bba4c6053 1339 /*Codes_SRS_SCHEMA_02_014: [ Otherwise Schema_GetModelReportedPropertyByName shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 1340 if((result = VECTOR_find_if(modelType->reportedProperties, reportedPropertyExists, reportedPropertyName))==NULL)
AzureIoTClient 17:fa1bba4c6053 1341 {
AzureIoTClient 17:fa1bba4c6053 1342 LogError("a reported property with name \"%s\" does not exist", reportedPropertyName);
AzureIoTClient 17:fa1bba4c6053 1343 }
AzureIoTClient 17:fa1bba4c6053 1344 else
AzureIoTClient 17:fa1bba4c6053 1345 {
AzureIoTClient 17:fa1bba4c6053 1346 /*return as is*/
AzureIoTClient 17:fa1bba4c6053 1347 }
AzureIoTClient 17:fa1bba4c6053 1348 }
AzureIoTClient 17:fa1bba4c6053 1349 return result;
AzureIoTClient 17:fa1bba4c6053 1350 }
AzureIoTClient 17:fa1bba4c6053 1351
AzureIoTClient 17:fa1bba4c6053 1352 SCHEMA_REPORTED_PROPERTY_HANDLE Schema_GetModelReportedPropertyByIndex(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t index)
AzureIoTClient 17:fa1bba4c6053 1353 {
AzureIoTClient 17:fa1bba4c6053 1354 SCHEMA_REPORTED_PROPERTY_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 1355 /*Codes_SRS_SCHEMA_02_015: [ If argument modelTypeHandle is NULL then Schema_GetModelReportedPropertyByIndex shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 1356 if (modelTypeHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 1357 {
AzureIoTClient 17:fa1bba4c6053 1358 LogError("invalid argument SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, size_t index=%zu", modelTypeHandle, index);
AzureIoTClient 17:fa1bba4c6053 1359 result = NULL;
AzureIoTClient 17:fa1bba4c6053 1360 }
AzureIoTClient 17:fa1bba4c6053 1361 else
AzureIoTClient 17:fa1bba4c6053 1362 {
AzureIoTClient 17:fa1bba4c6053 1363 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 1364
AzureIoTClient 17:fa1bba4c6053 1365 /*Codes_SRS_SCHEMA_02_016: [ If a reported property with index equal to index exists then Schema_GetModelReportedPropertyByIndex shall succeed and return the non-NULL handle of that REPORTED_PROPERTY. ]*/
AzureIoTClient 17:fa1bba4c6053 1366 /*Codes_SRS_SCHEMA_02_017: [ Otherwise Schema_GetModelReportedPropertyByIndex shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 1367 if ((result = VECTOR_element(modelType->reportedProperties, index)) == NULL)
AzureIoTClient 17:fa1bba4c6053 1368 {
AzureIoTClient 17:fa1bba4c6053 1369 LogError("index %zu is invalid", index);
AzureIoTClient 17:fa1bba4c6053 1370 }
AzureIoTClient 17:fa1bba4c6053 1371 else
AzureIoTClient 17:fa1bba4c6053 1372 {
AzureIoTClient 17:fa1bba4c6053 1373 /*return as is*/
AzureIoTClient 17:fa1bba4c6053 1374 }
AzureIoTClient 17:fa1bba4c6053 1375 }
AzureIoTClient 17:fa1bba4c6053 1376 return result;
AzureIoTClient 17:fa1bba4c6053 1377 }
AzureIoTClient 17:fa1bba4c6053 1378
AzureIoTClient 0:1f9b2707ec7d 1379 SCHEMA_PROPERTY_HANDLE Schema_GetModelPropertyByIndex(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t index)
AzureIoTClient 0:1f9b2707ec7d 1380 {
AzureIoTClient 0:1f9b2707ec7d 1381 SCHEMA_PROPERTY_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 1382 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 1383
AzureIoTClient 0:1f9b2707ec7d 1384 /* Codes_SRS_SCHEMA_99_094: [Schema_GetModelProperty shall return NULL if the index specified is outside the valid range or if modelTypeHandle argument is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1385 if ((modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1386 (index >= modelType->PropertyCount))
AzureIoTClient 0:1f9b2707ec7d 1387 {
AzureIoTClient 0:1f9b2707ec7d 1388 result = NULL;
AzureIoTClient 11:b1327861f5e0 1389 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1390 }
AzureIoTClient 0:1f9b2707ec7d 1391 else
AzureIoTClient 0:1f9b2707ec7d 1392 {
AzureIoTClient 0:1f9b2707ec7d 1393 /* Tests_SRS_SCHEMA_99_093: [Schema_GetModelProperty shall return a non-NULL SCHEMA_PROPERTY_HANDLE corresponding to the model type identified by modelTypeHandle and matching the index number provided by the index argument.] */
AzureIoTClient 0:1f9b2707ec7d 1394 /* Codes_SRS_SCHEMA_99_097: [index is zero based, and the order in which actions were added shall be the index in which they will be retrieved.] */
AzureIoTClient 0:1f9b2707ec7d 1395 result = modelType->Properties[index];
AzureIoTClient 0:1f9b2707ec7d 1396 }
AzureIoTClient 0:1f9b2707ec7d 1397
AzureIoTClient 0:1f9b2707ec7d 1398 return result;
AzureIoTClient 0:1f9b2707ec7d 1399 }
AzureIoTClient 0:1f9b2707ec7d 1400
AzureIoTClient 0:1f9b2707ec7d 1401 SCHEMA_ACTION_HANDLE Schema_GetModelActionByName(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* actionName)
AzureIoTClient 0:1f9b2707ec7d 1402 {
AzureIoTClient 0:1f9b2707ec7d 1403 SCHEMA_ACTION_HANDLE result;
AzureIoTClient 0:1f9b2707ec7d 1404
AzureIoTClient 0:1f9b2707ec7d 1405 /* Codes_SRS_SCHEMA_99_041:[Schema_GetModelActionByName shall return NULL if unable to find a matching action, if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1406 if ((modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1407 (actionName == NULL))
AzureIoTClient 0:1f9b2707ec7d 1408 {
AzureIoTClient 0:1f9b2707ec7d 1409 result = NULL;
AzureIoTClient 11:b1327861f5e0 1410 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1411 }
AzureIoTClient 0:1f9b2707ec7d 1412 else
AzureIoTClient 0:1f9b2707ec7d 1413 {
AzureIoTClient 0:1f9b2707ec7d 1414 size_t i;
AzureIoTClient 17:fa1bba4c6053 1415 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 1416
AzureIoTClient 0:1f9b2707ec7d 1417 /* Codes_SRS_SCHEMA_99_040:[Schema_GetModelActionByName shall return a non-NULL SCHEMA_ACTION_HANDLE corresponding to the model type identified by modelTypeHandle and matching the actionName argument value.] */
AzureIoTClient 0:1f9b2707ec7d 1418 for (i = 0; i < modelType->ActionCount; i++)
AzureIoTClient 0:1f9b2707ec7d 1419 {
AzureIoTClient 17:fa1bba4c6053 1420 SCHEMA_ACTION_HANDLE_DATA* modelAction = (SCHEMA_ACTION_HANDLE_DATA*)modelType->Actions[i];
AzureIoTClient 0:1f9b2707ec7d 1421 if (strcmp(modelAction->ActionName, actionName) == 0)
AzureIoTClient 0:1f9b2707ec7d 1422 {
AzureIoTClient 0:1f9b2707ec7d 1423 break;
AzureIoTClient 0:1f9b2707ec7d 1424 }
AzureIoTClient 0:1f9b2707ec7d 1425 }
AzureIoTClient 0:1f9b2707ec7d 1426
AzureIoTClient 0:1f9b2707ec7d 1427 if (i == modelType->ActionCount)
AzureIoTClient 0:1f9b2707ec7d 1428 {
AzureIoTClient 0:1f9b2707ec7d 1429 /* Codes_SRS_SCHEMA_99_041:[Schema_GetModelActionByName shall return NULL if unable to find a matching action, if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1430 result = NULL;
AzureIoTClient 11:b1327861f5e0 1431 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ELEMENT_NOT_FOUND));
AzureIoTClient 0:1f9b2707ec7d 1432 }
AzureIoTClient 0:1f9b2707ec7d 1433 else
AzureIoTClient 0:1f9b2707ec7d 1434 {
AzureIoTClient 0:1f9b2707ec7d 1435 result = modelType->Actions[i];
AzureIoTClient 0:1f9b2707ec7d 1436 }
AzureIoTClient 0:1f9b2707ec7d 1437 }
AzureIoTClient 0:1f9b2707ec7d 1438
AzureIoTClient 0:1f9b2707ec7d 1439 return result;
AzureIoTClient 0:1f9b2707ec7d 1440 }
AzureIoTClient 0:1f9b2707ec7d 1441
Azure.IoT.Build 18:58b667752399 1442 static bool matchModelMethod(const void* element, const void* value)
Azure.IoT.Build 18:58b667752399 1443 {
Azure.IoT.Build 18:58b667752399 1444 /*element is a pointer to SCHEMA_METHOD_HANDLE_DATA*/
Azure.IoT.Build 18:58b667752399 1445 const SCHEMA_METHOD_HANDLE* decodedElement = (const SCHEMA_METHOD_HANDLE* )element;
Azure.IoT.Build 18:58b667752399 1446 const char* name = (const char*)value;
Azure.IoT.Build 18:58b667752399 1447 return (strcmp((*decodedElement)->methodName, name) == 0);
Azure.IoT.Build 18:58b667752399 1448 }
Azure.IoT.Build 18:58b667752399 1449
Azure.IoT.Build 18:58b667752399 1450 SCHEMA_METHOD_HANDLE Schema_GetModelMethodByName(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* methodName)
Azure.IoT.Build 18:58b667752399 1451 {
Azure.IoT.Build 18:58b667752399 1452 SCHEMA_METHOD_HANDLE result;
Azure.IoT.Build 18:58b667752399 1453
Azure.IoT.Build 18:58b667752399 1454 /*Codes_SRS_SCHEMA_02_115: [ If modelTypeHandle is NULL then Schema_GetModelMethodByName shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 1455 /*Codes_SRS_SCHEMA_02_116: [ If methodName is NULL then Schema_GetModelMethodByName shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 1456 if ((modelTypeHandle == NULL) ||
Azure.IoT.Build 18:58b667752399 1457 (methodName == NULL))
Azure.IoT.Build 18:58b667752399 1458 {
Azure.IoT.Build 18:58b667752399 1459 result = NULL;
Azure.IoT.Build 18:58b667752399 1460 LogError("invalid arguments SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* methodName=%p", modelTypeHandle, methodName);
Azure.IoT.Build 18:58b667752399 1461 }
Azure.IoT.Build 18:58b667752399 1462 else
Azure.IoT.Build 18:58b667752399 1463 {
Azure.IoT.Build 18:58b667752399 1464 /*Codes_SRS_SCHEMA_02_117: [ If a method with the name methodName exists then Schema_GetModelMethodByName shall succeed and returns its handle. ]*/
Azure.IoT.Build 18:58b667752399 1465 SCHEMA_METHOD_HANDLE* found = VECTOR_find_if(modelTypeHandle->methods, matchModelMethod, methodName);
Azure.IoT.Build 18:58b667752399 1466 if (found == NULL)
Azure.IoT.Build 18:58b667752399 1467 {
Azure.IoT.Build 18:58b667752399 1468 /*Codes_SRS_SCHEMA_02_118: [ Otherwise, Schema_GetModelMethodByName shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 1469 LogError("no such method by name = %s", methodName);
Azure.IoT.Build 18:58b667752399 1470 result = NULL;
Azure.IoT.Build 18:58b667752399 1471 }
Azure.IoT.Build 18:58b667752399 1472 else
Azure.IoT.Build 18:58b667752399 1473 {
Azure.IoT.Build 18:58b667752399 1474 result = *found;
Azure.IoT.Build 18:58b667752399 1475 }
Azure.IoT.Build 18:58b667752399 1476 }
Azure.IoT.Build 18:58b667752399 1477
Azure.IoT.Build 18:58b667752399 1478 return result;
Azure.IoT.Build 18:58b667752399 1479 }
Azure.IoT.Build 18:58b667752399 1480
AzureIoTClient 0:1f9b2707ec7d 1481 SCHEMA_RESULT Schema_GetModelActionCount(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t* actionCount)
AzureIoTClient 0:1f9b2707ec7d 1482 {
AzureIoTClient 0:1f9b2707ec7d 1483 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 1484
AzureIoTClient 0:1f9b2707ec7d 1485 /* Codes_SRS_SCHEMA_99_045:[If any of the modelTypeHandle or actionCount arguments is NULL, Schema_GetModelActionCount shall return SCHEMA_INVALID_ARG.] */
AzureIoTClient 0:1f9b2707ec7d 1486 if ((modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1487 (actionCount == NULL))
AzureIoTClient 0:1f9b2707ec7d 1488 {
AzureIoTClient 0:1f9b2707ec7d 1489 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 1490 LogError("(result=%s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1491 }
AzureIoTClient 0:1f9b2707ec7d 1492 else
AzureIoTClient 0:1f9b2707ec7d 1493 {
AzureIoTClient 0:1f9b2707ec7d 1494 /* Codes_SRS_SCHEMA_99_042:[Schema_GetModelActionCount shall provide the total number of actions defined in a model type identified by the modelTypeHandle.] */
AzureIoTClient 17:fa1bba4c6053 1495 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 1496
AzureIoTClient 0:1f9b2707ec7d 1497 /* Codes_SRS_SCHEMA_99_043:[The count shall be provided via the out argument actionCount.] */
AzureIoTClient 0:1f9b2707ec7d 1498 *actionCount = modelType->ActionCount;
AzureIoTClient 0:1f9b2707ec7d 1499
AzureIoTClient 0:1f9b2707ec7d 1500 /* Codes_SRS_SCHEMA_99_044:[On success, Schema_GetModelActionCount shall return SCHEMA_OK.] */
AzureIoTClient 0:1f9b2707ec7d 1501 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 1502 }
AzureIoTClient 0:1f9b2707ec7d 1503
AzureIoTClient 0:1f9b2707ec7d 1504 return result;
AzureIoTClient 0:1f9b2707ec7d 1505 }
AzureIoTClient 0:1f9b2707ec7d 1506
AzureIoTClient 0:1f9b2707ec7d 1507 SCHEMA_ACTION_HANDLE Schema_GetModelActionByIndex(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t index)
AzureIoTClient 0:1f9b2707ec7d 1508 {
AzureIoTClient 0:1f9b2707ec7d 1509 SCHEMA_ACTION_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 1510 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 1511
AzureIoTClient 0:1f9b2707ec7d 1512 /* Codes_SRS_SCHEMA_99_048:[Schema_GetModelAction shall return NULL if the index specified is outside the valid range or if modelTypeHandle argument is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1513 if ((modelType == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1514 (index >= modelType->ActionCount))
AzureIoTClient 0:1f9b2707ec7d 1515 {
AzureIoTClient 0:1f9b2707ec7d 1516 result = NULL;
AzureIoTClient 11:b1327861f5e0 1517 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1518 }
AzureIoTClient 0:1f9b2707ec7d 1519 else
AzureIoTClient 0:1f9b2707ec7d 1520 {
AzureIoTClient 0:1f9b2707ec7d 1521 /* Codes_SRS_SCHEMA_99_047:[Schema_GetModelAction shall return a non-NULL SCHEMA_ACTION_HANDLE corresponding to the model type identified by modelTypeHandle and matching the index number provided by the index argument.] */
AzureIoTClient 0:1f9b2707ec7d 1522 /* Codes_SRS_SCHEMA_99_096: [index is zero based and the order in which actions were added shall be the index in which they will be retrieved.] */
AzureIoTClient 0:1f9b2707ec7d 1523 result = modelType->Actions[index];
AzureIoTClient 0:1f9b2707ec7d 1524 }
AzureIoTClient 0:1f9b2707ec7d 1525
AzureIoTClient 0:1f9b2707ec7d 1526 return result;
AzureIoTClient 0:1f9b2707ec7d 1527 }
AzureIoTClient 0:1f9b2707ec7d 1528
AzureIoTClient 0:1f9b2707ec7d 1529 const char* Schema_GetModelActionName(SCHEMA_ACTION_HANDLE actionHandle)
AzureIoTClient 0:1f9b2707ec7d 1530 {
AzureIoTClient 0:1f9b2707ec7d 1531 const char* result;
AzureIoTClient 0:1f9b2707ec7d 1532
AzureIoTClient 0:1f9b2707ec7d 1533 /* Codes_SRS_SCHEMA_99_050:[If the actionHandle is NULL, Schema_GetModelActionName shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1534 if (actionHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 1535 {
AzureIoTClient 0:1f9b2707ec7d 1536 result = NULL;
AzureIoTClient 11:b1327861f5e0 1537 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1538 }
AzureIoTClient 0:1f9b2707ec7d 1539 else
AzureIoTClient 0:1f9b2707ec7d 1540 {
AzureIoTClient 17:fa1bba4c6053 1541 SCHEMA_ACTION_HANDLE_DATA* action = (SCHEMA_ACTION_HANDLE_DATA*)actionHandle;
AzureIoTClient 0:1f9b2707ec7d 1542 /* Codes_SRS_SCHEMA_99_049:[Schema_GetModelActionName shall return the action name for a given action handle.] */
AzureIoTClient 0:1f9b2707ec7d 1543 result = action->ActionName;
AzureIoTClient 0:1f9b2707ec7d 1544 }
AzureIoTClient 0:1f9b2707ec7d 1545
AzureIoTClient 0:1f9b2707ec7d 1546 return result;
AzureIoTClient 0:1f9b2707ec7d 1547 }
AzureIoTClient 0:1f9b2707ec7d 1548
AzureIoTClient 0:1f9b2707ec7d 1549 SCHEMA_RESULT Schema_GetModelActionArgumentCount(SCHEMA_ACTION_HANDLE actionHandle, size_t* argumentCount)
AzureIoTClient 0:1f9b2707ec7d 1550 {
AzureIoTClient 0:1f9b2707ec7d 1551 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 1552
AzureIoTClient 0:1f9b2707ec7d 1553 /* Codes_SRS_SCHEMA_99_054:[If any argument is NULL, Schema_GetModelActionArgumentCount shall return SCHEMA_INVALID_ARG.] */
AzureIoTClient 0:1f9b2707ec7d 1554 if ((actionHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1555 (argumentCount == NULL))
AzureIoTClient 0:1f9b2707ec7d 1556 {
AzureIoTClient 0:1f9b2707ec7d 1557 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 1558 LogError("(result=%s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1559 }
AzureIoTClient 0:1f9b2707ec7d 1560 else
AzureIoTClient 0:1f9b2707ec7d 1561 {
AzureIoTClient 17:fa1bba4c6053 1562 SCHEMA_ACTION_HANDLE_DATA* modelAction = (SCHEMA_ACTION_HANDLE_DATA*)actionHandle;
AzureIoTClient 0:1f9b2707ec7d 1563
AzureIoTClient 0:1f9b2707ec7d 1564 /* Codes_SRS_SCHEMA_99_051:[Schema_GetModelActionArgumentCount shall provide the number of arguments for a specific schema action identified by actionHandle.] */
AzureIoTClient 0:1f9b2707ec7d 1565 /* Codes_SRS_SCHEMA_99_052:[The argument count shall be provided via the out argument argumentCount.] */
AzureIoTClient 0:1f9b2707ec7d 1566 *argumentCount = modelAction->ArgumentCount;
AzureIoTClient 0:1f9b2707ec7d 1567
AzureIoTClient 0:1f9b2707ec7d 1568 /* Codes_SRS_SCHEMA_99_053:[On success, Schema_GetModelActionArgumentCount shall return SCHEMA_OK.] */
AzureIoTClient 0:1f9b2707ec7d 1569 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 1570 }
AzureIoTClient 0:1f9b2707ec7d 1571
AzureIoTClient 0:1f9b2707ec7d 1572 return result;
AzureIoTClient 0:1f9b2707ec7d 1573 }
AzureIoTClient 0:1f9b2707ec7d 1574
Azure.IoT.Build 18:58b667752399 1575 SCHEMA_RESULT Schema_GetModelMethodArgumentCount(SCHEMA_METHOD_HANDLE methodHandle, size_t* argumentCount)
Azure.IoT.Build 18:58b667752399 1576 {
Azure.IoT.Build 18:58b667752399 1577 SCHEMA_RESULT result;
Azure.IoT.Build 18:58b667752399 1578
Azure.IoT.Build 18:58b667752399 1579 /*Codes_SRS_SCHEMA_02_119: [ If methodHandle is NULL then Schema_GetModelMethodArgumentCount shall fail and return SCHEMA_INVALID_ARG. ]*/
Azure.IoT.Build 18:58b667752399 1580 /*Codes_SRS_SCHEMA_02_120: [ If argumentCount is NULL then Schema_GetModelMethodArgumentCount shall fail and return SCHEMA_INVALID_ARG. ]*/
Azure.IoT.Build 18:58b667752399 1581 if ((methodHandle == NULL) ||
Azure.IoT.Build 18:58b667752399 1582 (argumentCount == NULL))
Azure.IoT.Build 18:58b667752399 1583 {
Azure.IoT.Build 18:58b667752399 1584 result = SCHEMA_INVALID_ARG;
Azure.IoT.Build 18:58b667752399 1585 LogError("(result=%s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
Azure.IoT.Build 18:58b667752399 1586 }
Azure.IoT.Build 18:58b667752399 1587 else
Azure.IoT.Build 18:58b667752399 1588 {
Azure.IoT.Build 18:58b667752399 1589 /*Codes_SRS_SCHEMA_02_121: [ Otherwise, Schema_GetModelMethodArgumentCount shall succeed, return in argumentCount the number of arguments for the method and return SCHEMA_OK. ]*/
Azure.IoT.Build 18:58b667752399 1590 *argumentCount = VECTOR_size(methodHandle->methodArguments);
Azure.IoT.Build 18:58b667752399 1591 result = SCHEMA_OK;
Azure.IoT.Build 18:58b667752399 1592 }
Azure.IoT.Build 18:58b667752399 1593
Azure.IoT.Build 18:58b667752399 1594 return result;
Azure.IoT.Build 18:58b667752399 1595 }
Azure.IoT.Build 18:58b667752399 1596
Azure.IoT.Build 18:58b667752399 1597
AzureIoTClient 0:1f9b2707ec7d 1598 SCHEMA_ACTION_ARGUMENT_HANDLE Schema_GetModelActionArgumentByName(SCHEMA_ACTION_HANDLE actionHandle, const char* actionArgumentName)
AzureIoTClient 0:1f9b2707ec7d 1599 {
AzureIoTClient 0:1f9b2707ec7d 1600 SCHEMA_ACTION_ARGUMENT_HANDLE result;
AzureIoTClient 0:1f9b2707ec7d 1601
AzureIoTClient 0:1f9b2707ec7d 1602 /* Codes_SRS_SCHEMA_99_118: [Schema_GetModelActionArgumentByName shall return NULL if unable to find a matching argument or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1603 if ((actionHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1604 (actionArgumentName == NULL))
AzureIoTClient 0:1f9b2707ec7d 1605 {
AzureIoTClient 0:1f9b2707ec7d 1606 result = NULL;
AzureIoTClient 11:b1327861f5e0 1607 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1608 }
AzureIoTClient 0:1f9b2707ec7d 1609 else
AzureIoTClient 0:1f9b2707ec7d 1610 {
AzureIoTClient 0:1f9b2707ec7d 1611 /* Codes_SRS_SCHEMA_99_118: [Schema_GetModelActionArgumentByName shall return NULL if unable to find a matching argument or if any of the arguments are NULL.] */
AzureIoTClient 17:fa1bba4c6053 1612 SCHEMA_ACTION_HANDLE_DATA* modelAction = (SCHEMA_ACTION_HANDLE_DATA*)actionHandle;
AzureIoTClient 0:1f9b2707ec7d 1613 size_t i;
AzureIoTClient 0:1f9b2707ec7d 1614
AzureIoTClient 0:1f9b2707ec7d 1615 for (i = 0; i < modelAction->ArgumentCount; i++)
AzureIoTClient 0:1f9b2707ec7d 1616 {
AzureIoTClient 17:fa1bba4c6053 1617 SCHEMA_ACTION_ARGUMENT_HANDLE_DATA* actionArgument = (SCHEMA_ACTION_ARGUMENT_HANDLE_DATA*)modelAction->ArgumentHandles[i];
AzureIoTClient 0:1f9b2707ec7d 1618 if (strcmp(actionArgument->Name, actionArgumentName) == 0)
AzureIoTClient 0:1f9b2707ec7d 1619 {
AzureIoTClient 0:1f9b2707ec7d 1620 break;
AzureIoTClient 0:1f9b2707ec7d 1621 }
AzureIoTClient 0:1f9b2707ec7d 1622 }
AzureIoTClient 0:1f9b2707ec7d 1623
AzureIoTClient 0:1f9b2707ec7d 1624 if (i == modelAction->ArgumentCount)
AzureIoTClient 0:1f9b2707ec7d 1625 {
AzureIoTClient 0:1f9b2707ec7d 1626 /* Codes_SRS_SCHEMA_99_118: [Schema_GetModelActionArgumentByName shall return NULL if unable to find a matching argument or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1627 result = NULL;
AzureIoTClient 11:b1327861f5e0 1628 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ELEMENT_NOT_FOUND));
AzureIoTClient 0:1f9b2707ec7d 1629 }
AzureIoTClient 0:1f9b2707ec7d 1630 else
AzureIoTClient 0:1f9b2707ec7d 1631 {
AzureIoTClient 0:1f9b2707ec7d 1632 /* Codes_SRS_SCHEMA_99_117: [Schema_GetModelActionArgumentByName shall return a non-NULL handle corresponding to an action argument identified by the actionHandle and actionArgumentName.] */
AzureIoTClient 0:1f9b2707ec7d 1633 result = modelAction->ArgumentHandles[i];
AzureIoTClient 0:1f9b2707ec7d 1634 }
AzureIoTClient 0:1f9b2707ec7d 1635 }
AzureIoTClient 0:1f9b2707ec7d 1636
AzureIoTClient 0:1f9b2707ec7d 1637 return result;
AzureIoTClient 0:1f9b2707ec7d 1638 }
AzureIoTClient 0:1f9b2707ec7d 1639
AzureIoTClient 0:1f9b2707ec7d 1640 SCHEMA_ACTION_ARGUMENT_HANDLE Schema_GetModelActionArgumentByIndex(SCHEMA_ACTION_HANDLE actionHandle, size_t argumentIndex)
AzureIoTClient 0:1f9b2707ec7d 1641 {
AzureIoTClient 0:1f9b2707ec7d 1642 SCHEMA_ACTION_ARGUMENT_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 1643 SCHEMA_ACTION_HANDLE_DATA* modelAction = (SCHEMA_ACTION_HANDLE_DATA*)actionHandle;
AzureIoTClient 0:1f9b2707ec7d 1644
AzureIoTClient 0:1f9b2707ec7d 1645 /* Codes_SRS_SCHEMA_99_056:[Schema_GetModelActionArgument shall return NULL if the index specified is outside the valid range or if the actionHandle argument is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1646 if ((actionHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1647 (argumentIndex >= modelAction->ArgumentCount))
AzureIoTClient 0:1f9b2707ec7d 1648 {
AzureIoTClient 0:1f9b2707ec7d 1649 result = NULL;
AzureIoTClient 11:b1327861f5e0 1650 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1651 }
AzureIoTClient 0:1f9b2707ec7d 1652 else
AzureIoTClient 0:1f9b2707ec7d 1653 {
AzureIoTClient 0:1f9b2707ec7d 1654 /* Codes_SRS_SCHEMA_99_055:[Schema_GetModelActionArgument shall return a non-NULL SCHEMA_ACTION_ARGUMENT_HANDLE corresponding to the action type identified by actionHandle and matching the index number provided by the argumentIndex argument.] */
AzureIoTClient 0:1f9b2707ec7d 1655 result = modelAction->ArgumentHandles[argumentIndex];
AzureIoTClient 0:1f9b2707ec7d 1656 }
AzureIoTClient 0:1f9b2707ec7d 1657
AzureIoTClient 0:1f9b2707ec7d 1658 return result;
AzureIoTClient 0:1f9b2707ec7d 1659 }
AzureIoTClient 0:1f9b2707ec7d 1660
Azure.IoT.Build 18:58b667752399 1661 SCHEMA_METHOD_ARGUMENT_HANDLE Schema_GetModelMethodArgumentByIndex(SCHEMA_METHOD_HANDLE methodHandle, size_t argumentIndex)
Azure.IoT.Build 18:58b667752399 1662 {
Azure.IoT.Build 18:58b667752399 1663 SCHEMA_METHOD_ARGUMENT_HANDLE result;
Azure.IoT.Build 18:58b667752399 1664
Azure.IoT.Build 18:58b667752399 1665 /*Codes_SRS_SCHEMA_02_122: [ If methodHandle is NULL then Schema_GetModelMethodArgumentByIndex shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 1666 if (methodHandle == NULL)
Azure.IoT.Build 18:58b667752399 1667 {
Azure.IoT.Build 18:58b667752399 1668 result = NULL;
Azure.IoT.Build 18:58b667752399 1669 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
Azure.IoT.Build 18:58b667752399 1670 }
Azure.IoT.Build 18:58b667752399 1671 else
Azure.IoT.Build 18:58b667752399 1672 {
Azure.IoT.Build 18:58b667752399 1673 /*Codes_SRS_SCHEMA_02_123: [ If argumentIndex does not exist then Schema_GetModelMethodArgumentByIndex shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 1674 SCHEMA_METHOD_ARGUMENT_HANDLE *temp = VECTOR_element(methodHandle->methodArguments, argumentIndex);
Azure.IoT.Build 18:58b667752399 1675 if (temp == NULL)
Azure.IoT.Build 18:58b667752399 1676 {
Azure.IoT.Build 18:58b667752399 1677 result = NULL;
Azure.IoT.Build 18:58b667752399 1678 }
Azure.IoT.Build 18:58b667752399 1679 else
Azure.IoT.Build 18:58b667752399 1680 {
Azure.IoT.Build 18:58b667752399 1681 /*Codes_SRS_SCHEMA_02_124: [ Otherwise, Schema_GetModelMethodArgumentByIndex shall succeed and return a non-NULL value. ]*/
Azure.IoT.Build 18:58b667752399 1682 result = *temp;
Azure.IoT.Build 18:58b667752399 1683 }
Azure.IoT.Build 18:58b667752399 1684 }
Azure.IoT.Build 18:58b667752399 1685
Azure.IoT.Build 18:58b667752399 1686 return result;
Azure.IoT.Build 18:58b667752399 1687 }
Azure.IoT.Build 18:58b667752399 1688
Azure.IoT.Build 18:58b667752399 1689
AzureIoTClient 0:1f9b2707ec7d 1690 const char* Schema_GetActionArgumentName(SCHEMA_ACTION_ARGUMENT_HANDLE actionArgumentHandle)
AzureIoTClient 0:1f9b2707ec7d 1691 {
AzureIoTClient 0:1f9b2707ec7d 1692 const char* result;
AzureIoTClient 0:1f9b2707ec7d 1693 /* Codes_SRS_SCHEMA_99_114: [Schema_GetActionArgumentName shall return NULL if actionArgumentHandle is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1694 if (actionArgumentHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 1695 {
AzureIoTClient 0:1f9b2707ec7d 1696 result = NULL;
AzureIoTClient 11:b1327861f5e0 1697 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1698 }
AzureIoTClient 0:1f9b2707ec7d 1699 else
AzureIoTClient 0:1f9b2707ec7d 1700 {
AzureIoTClient 0:1f9b2707ec7d 1701 /* Codes_SRS_SCHEMA_99_113: [Schema_GetActionArgumentName shall return the argument name identified by the actionArgumentHandle.] */
AzureIoTClient 17:fa1bba4c6053 1702 SCHEMA_ACTION_ARGUMENT_HANDLE_DATA* actionArgument = (SCHEMA_ACTION_ARGUMENT_HANDLE_DATA*)actionArgumentHandle;
AzureIoTClient 0:1f9b2707ec7d 1703 result = actionArgument->Name;
AzureIoTClient 0:1f9b2707ec7d 1704 }
AzureIoTClient 0:1f9b2707ec7d 1705 return result;
AzureIoTClient 0:1f9b2707ec7d 1706 }
AzureIoTClient 0:1f9b2707ec7d 1707
Azure.IoT.Build 18:58b667752399 1708 const char* Schema_GetMethodArgumentName(SCHEMA_METHOD_ARGUMENT_HANDLE methodArgumentHandle)
Azure.IoT.Build 18:58b667752399 1709 {
Azure.IoT.Build 18:58b667752399 1710 const char* result;
Azure.IoT.Build 18:58b667752399 1711 /*Codes_SRS_SCHEMA_02_125: [ If methodArgumentHandle is NULL then Schema_GetMethodArgumentName shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 1712 if (methodArgumentHandle == NULL)
Azure.IoT.Build 18:58b667752399 1713 {
Azure.IoT.Build 18:58b667752399 1714 result = NULL;
Azure.IoT.Build 18:58b667752399 1715 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
Azure.IoT.Build 18:58b667752399 1716 }
Azure.IoT.Build 18:58b667752399 1717 else
Azure.IoT.Build 18:58b667752399 1718 {
Azure.IoT.Build 18:58b667752399 1719 /*Codes_SRS_SCHEMA_02_126: [ Otherwise, Schema_GetMethodArgumentName shall succeed and return a non-NULL value. ]*/
Azure.IoT.Build 18:58b667752399 1720 result = methodArgumentHandle->Name;
Azure.IoT.Build 18:58b667752399 1721 }
Azure.IoT.Build 18:58b667752399 1722 return result;
Azure.IoT.Build 18:58b667752399 1723 }
Azure.IoT.Build 18:58b667752399 1724
Azure.IoT.Build 18:58b667752399 1725
AzureIoTClient 0:1f9b2707ec7d 1726 const char* Schema_GetActionArgumentType(SCHEMA_ACTION_ARGUMENT_HANDLE actionArgumentHandle)
AzureIoTClient 0:1f9b2707ec7d 1727 {
AzureIoTClient 0:1f9b2707ec7d 1728 const char* result;
AzureIoTClient 0:1f9b2707ec7d 1729 /* Codes_SRS_SCHEMA_99_116: [Schema_GetActionArgumentType shall return NULL if actionArgumentHandle is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1730 if (actionArgumentHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 1731 {
AzureIoTClient 0:1f9b2707ec7d 1732 result = NULL;
AzureIoTClient 11:b1327861f5e0 1733 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1734 }
AzureIoTClient 0:1f9b2707ec7d 1735 else
AzureIoTClient 0:1f9b2707ec7d 1736 {
AzureIoTClient 0:1f9b2707ec7d 1737 /* Codes_SRS_SCHEMA_99_115: [Schema_GetActionArgumentType shall return the argument type identified by the actionArgumentHandle.] */
AzureIoTClient 17:fa1bba4c6053 1738 SCHEMA_ACTION_ARGUMENT_HANDLE_DATA* actionArgument = (SCHEMA_ACTION_ARGUMENT_HANDLE_DATA*)actionArgumentHandle;
AzureIoTClient 0:1f9b2707ec7d 1739 result = actionArgument->Type;
AzureIoTClient 0:1f9b2707ec7d 1740 }
AzureIoTClient 0:1f9b2707ec7d 1741 return result;
AzureIoTClient 0:1f9b2707ec7d 1742 }
AzureIoTClient 0:1f9b2707ec7d 1743
Azure.IoT.Build 18:58b667752399 1744 const char* Schema_GetMethodArgumentType(SCHEMA_METHOD_ARGUMENT_HANDLE methodArgumentHandle)
Azure.IoT.Build 18:58b667752399 1745 {
Azure.IoT.Build 18:58b667752399 1746 const char* result;
Azure.IoT.Build 18:58b667752399 1747 /*Codes_SRS_SCHEMA_02_127: [ If methodArgumentHandle is NULL then Schema_GetMethodArgumentType shall fail and return NULL. ]*/
Azure.IoT.Build 18:58b667752399 1748 if (methodArgumentHandle == NULL)
Azure.IoT.Build 18:58b667752399 1749 {
Azure.IoT.Build 18:58b667752399 1750 result = NULL;
Azure.IoT.Build 18:58b667752399 1751 LogError("invalid argument SCHEMA_METHOD_ARGUMENT_HANDLE methodArgumentHandle=%p", methodArgumentHandle);
Azure.IoT.Build 18:58b667752399 1752 }
Azure.IoT.Build 18:58b667752399 1753 else
Azure.IoT.Build 18:58b667752399 1754 {
Azure.IoT.Build 18:58b667752399 1755 /*Codes_SRS_SCHEMA_02_128: [ Otherwise, Schema_GetMethodArgumentType shall succeed and return a non-NULL value. ]*/
Azure.IoT.Build 18:58b667752399 1756 result = methodArgumentHandle->Type;
Azure.IoT.Build 18:58b667752399 1757 }
Azure.IoT.Build 18:58b667752399 1758 return result;
Azure.IoT.Build 18:58b667752399 1759 }
Azure.IoT.Build 18:58b667752399 1760
Azure.IoT.Build 18:58b667752399 1761
AzureIoTClient 0:1f9b2707ec7d 1762 SCHEMA_STRUCT_TYPE_HANDLE Schema_CreateStructType(SCHEMA_HANDLE schemaHandle, const char* typeName)
AzureIoTClient 0:1f9b2707ec7d 1763 {
AzureIoTClient 0:1f9b2707ec7d 1764 SCHEMA_STRUCT_TYPE_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 1765 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 1766
AzureIoTClient 0:1f9b2707ec7d 1767 /* Codes_SRS_SCHEMA_99_060:[If any of the arguments is NULL, Schema_CreateStructType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1768 if ((schema == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1769 (typeName == NULL))
AzureIoTClient 0:1f9b2707ec7d 1770 {
AzureIoTClient 0:1f9b2707ec7d 1771 result = NULL;
AzureIoTClient 11:b1327861f5e0 1772 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1773 }
AzureIoTClient 0:1f9b2707ec7d 1774 else
AzureIoTClient 0:1f9b2707ec7d 1775 {
AzureIoTClient 17:fa1bba4c6053 1776 SCHEMA_STRUCT_TYPE_HANDLE_DATA* structType;
AzureIoTClient 0:1f9b2707ec7d 1777 size_t i;
AzureIoTClient 0:1f9b2707ec7d 1778
AzureIoTClient 0:1f9b2707ec7d 1779 /* Codes_SRS_SCHEMA_99_061:[If a struct type with the same name already exists, Schema_CreateStructType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1780 for (i = 0; i < schema->StructTypeCount; i++)
AzureIoTClient 0:1f9b2707ec7d 1781 {
AzureIoTClient 17:fa1bba4c6053 1782 structType = (SCHEMA_STRUCT_TYPE_HANDLE_DATA*)schema->StructTypes[i];
AzureIoTClient 0:1f9b2707ec7d 1783 if (strcmp(structType->Name, typeName) == 0)
AzureIoTClient 0:1f9b2707ec7d 1784 {
AzureIoTClient 0:1f9b2707ec7d 1785 break;
AzureIoTClient 0:1f9b2707ec7d 1786 }
AzureIoTClient 0:1f9b2707ec7d 1787 }
AzureIoTClient 0:1f9b2707ec7d 1788
AzureIoTClient 0:1f9b2707ec7d 1789 if (i < schema->StructTypeCount)
AzureIoTClient 0:1f9b2707ec7d 1790 {
AzureIoTClient 0:1f9b2707ec7d 1791 result = NULL;
AzureIoTClient 11:b1327861f5e0 1792 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_DUPLICATE_ELEMENT));
AzureIoTClient 0:1f9b2707ec7d 1793 }
AzureIoTClient 0:1f9b2707ec7d 1794 else
AzureIoTClient 0:1f9b2707ec7d 1795 {
AzureIoTClient 0:1f9b2707ec7d 1796 SCHEMA_STRUCT_TYPE_HANDLE* newStructTypes = (SCHEMA_STRUCT_TYPE_HANDLE*)realloc(schema->StructTypes, sizeof(SCHEMA_STRUCT_TYPE_HANDLE) * (schema->StructTypeCount + 1));
AzureIoTClient 0:1f9b2707ec7d 1797 if (newStructTypes == NULL)
AzureIoTClient 0:1f9b2707ec7d 1798 {
AzureIoTClient 0:1f9b2707ec7d 1799 /* Codes_SRS_SCHEMA_99_066:[On any other error, Schema_CreateStructType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1800 result = NULL;
AzureIoTClient 11:b1327861f5e0 1801 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 1802 }
AzureIoTClient 0:1f9b2707ec7d 1803 else
AzureIoTClient 0:1f9b2707ec7d 1804 {
AzureIoTClient 0:1f9b2707ec7d 1805 schema->StructTypes = newStructTypes;
AzureIoTClient 17:fa1bba4c6053 1806 if ((structType = (SCHEMA_STRUCT_TYPE_HANDLE_DATA*)malloc(sizeof(SCHEMA_STRUCT_TYPE_HANDLE_DATA))) == NULL)
AzureIoTClient 0:1f9b2707ec7d 1807 {
AzureIoTClient 0:1f9b2707ec7d 1808 /* Codes_SRS_SCHEMA_99_066:[On any other error, Schema_CreateStructType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1809 result = NULL;
AzureIoTClient 11:b1327861f5e0 1810 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 1811 }
AzureIoTClient 0:1f9b2707ec7d 1812 else if (mallocAndStrcpy_s((char**)&structType->Name, typeName) != 0)
AzureIoTClient 0:1f9b2707ec7d 1813 {
AzureIoTClient 0:1f9b2707ec7d 1814 /* Codes_SRS_SCHEMA_99_066:[On any other error, Schema_CreateStructType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1815 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 1816 free(structType);
AzureIoTClient 11:b1327861f5e0 1817 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 0:1f9b2707ec7d 1818 }
AzureIoTClient 0:1f9b2707ec7d 1819 else
AzureIoTClient 0:1f9b2707ec7d 1820 {
AzureIoTClient 0:1f9b2707ec7d 1821 /* Codes_SRS_SCHEMA_99_057:[Schema_CreateStructType shall create a new struct type and return a handle to it.] */
AzureIoTClient 0:1f9b2707ec7d 1822 schema->StructTypes[schema->StructTypeCount] = structType;
AzureIoTClient 0:1f9b2707ec7d 1823 schema->StructTypeCount++;
AzureIoTClient 0:1f9b2707ec7d 1824 structType->PropertyCount = 0;
AzureIoTClient 0:1f9b2707ec7d 1825 structType->Properties = NULL;
AzureIoTClient 0:1f9b2707ec7d 1826
AzureIoTClient 0:1f9b2707ec7d 1827 /* Codes_SRS_SCHEMA_99_058:[On success, a non-NULL handle shall be returned.] */
AzureIoTClient 0:1f9b2707ec7d 1828 result = (SCHEMA_STRUCT_TYPE_HANDLE)structType;
AzureIoTClient 0:1f9b2707ec7d 1829 }
AzureIoTClient 0:1f9b2707ec7d 1830
AzureIoTClient 0:1f9b2707ec7d 1831 /* If possible, reduce the memory of over allocation */
AzureIoTClient 0:1f9b2707ec7d 1832 if (result == NULL)
AzureIoTClient 0:1f9b2707ec7d 1833 {
AzureIoTClient 36:7d12a5386197 1834 if (schema->StructTypeCount > 0)
AzureIoTClient 0:1f9b2707ec7d 1835 {
AzureIoTClient 36:7d12a5386197 1836 SCHEMA_STRUCT_TYPE_HANDLE *oldStructTypes = (SCHEMA_STRUCT_TYPE_HANDLE *)realloc(schema->StructTypes, sizeof(SCHEMA_STRUCT_TYPE_HANDLE) * schema->StructTypeCount);
AzureIoTClient 36:7d12a5386197 1837 if (oldStructTypes == NULL)
AzureIoTClient 36:7d12a5386197 1838 {
AzureIoTClient 36:7d12a5386197 1839 result = NULL;
AzureIoTClient 36:7d12a5386197 1840 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ERROR));
AzureIoTClient 36:7d12a5386197 1841 }
AzureIoTClient 36:7d12a5386197 1842 else
AzureIoTClient 36:7d12a5386197 1843 {
AzureIoTClient 36:7d12a5386197 1844 schema->StructTypes = oldStructTypes;
AzureIoTClient 36:7d12a5386197 1845 }
AzureIoTClient 0:1f9b2707ec7d 1846 }
AzureIoTClient 0:1f9b2707ec7d 1847 else
AzureIoTClient 0:1f9b2707ec7d 1848 {
AzureIoTClient 36:7d12a5386197 1849 schema->StructTypes = NULL;
AzureIoTClient 0:1f9b2707ec7d 1850 }
AzureIoTClient 0:1f9b2707ec7d 1851 }
AzureIoTClient 0:1f9b2707ec7d 1852 }
AzureIoTClient 0:1f9b2707ec7d 1853 }
AzureIoTClient 0:1f9b2707ec7d 1854 }
AzureIoTClient 0:1f9b2707ec7d 1855
AzureIoTClient 0:1f9b2707ec7d 1856 return result;
AzureIoTClient 0:1f9b2707ec7d 1857 }
AzureIoTClient 0:1f9b2707ec7d 1858
AzureIoTClient 0:1f9b2707ec7d 1859 const char* Schema_GetStructTypeName(SCHEMA_STRUCT_TYPE_HANDLE structTypeHandle)
AzureIoTClient 0:1f9b2707ec7d 1860 {
AzureIoTClient 0:1f9b2707ec7d 1861 const char* result;
AzureIoTClient 0:1f9b2707ec7d 1862
AzureIoTClient 0:1f9b2707ec7d 1863 /* Codes_SRS_SCHEMA_99_136: [If structTypeHandle is NULL, Schema_GetStructTypeName shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1864 if (structTypeHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 1865 {
AzureIoTClient 0:1f9b2707ec7d 1866 result = NULL;
AzureIoTClient 11:b1327861f5e0 1867 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1868 }
AzureIoTClient 0:1f9b2707ec7d 1869 else
AzureIoTClient 0:1f9b2707ec7d 1870 {
AzureIoTClient 0:1f9b2707ec7d 1871 /* Codes_SRS_SCHEMA_99_135: [Schema_GetStructTypeName shall return the name of a struct type identified by the structTypeHandle argument.] */
AzureIoTClient 17:fa1bba4c6053 1872 result = ((SCHEMA_STRUCT_TYPE_HANDLE_DATA*)structTypeHandle)->Name;
AzureIoTClient 0:1f9b2707ec7d 1873 }
AzureIoTClient 36:7d12a5386197 1874
AzureIoTClient 0:1f9b2707ec7d 1875 return result;
AzureIoTClient 0:1f9b2707ec7d 1876 }
AzureIoTClient 0:1f9b2707ec7d 1877
AzureIoTClient 0:1f9b2707ec7d 1878 SCHEMA_RESULT Schema_GetStructTypeCount(SCHEMA_HANDLE schemaHandle, size_t* structTypeCount)
AzureIoTClient 0:1f9b2707ec7d 1879 {
AzureIoTClient 0:1f9b2707ec7d 1880 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 1881
AzureIoTClient 0:1f9b2707ec7d 1882 /* Codes_SRS_SCHEMA_99_140: [Schema_GetStructTypeCount shall return SCHEMA_INVALID_ARG if any of the arguments is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1883 if ((schemaHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1884 (structTypeCount == NULL))
AzureIoTClient 0:1f9b2707ec7d 1885 {
AzureIoTClient 0:1f9b2707ec7d 1886 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 1887 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1888 }
AzureIoTClient 0:1f9b2707ec7d 1889 else
AzureIoTClient 0:1f9b2707ec7d 1890 {
AzureIoTClient 0:1f9b2707ec7d 1891 /* Codes_SRS_SCHEMA_99_137: [Schema_GetStructTypeCount shall provide the number of structs defined in the schema identified by schemaHandle.] */
AzureIoTClient 17:fa1bba4c6053 1892 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 1893 /* Codes_SRS_SCHEMA_99_138: [The count shall be provided via the out argument structTypeCount.] */
AzureIoTClient 0:1f9b2707ec7d 1894 *structTypeCount = schema->StructTypeCount;
AzureIoTClient 0:1f9b2707ec7d 1895 /* Codes_SRS_SCHEMA_99_139: [On success, Schema_GetStructTypeCount shall return SCHEMA_OK.] */
AzureIoTClient 0:1f9b2707ec7d 1896 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 1897 }
AzureIoTClient 0:1f9b2707ec7d 1898
AzureIoTClient 0:1f9b2707ec7d 1899 return result;
AzureIoTClient 0:1f9b2707ec7d 1900 }
AzureIoTClient 0:1f9b2707ec7d 1901
AzureIoTClient 0:1f9b2707ec7d 1902 SCHEMA_STRUCT_TYPE_HANDLE Schema_GetStructTypeByName(SCHEMA_HANDLE schemaHandle, const char* name)
AzureIoTClient 0:1f9b2707ec7d 1903 {
AzureIoTClient 17:fa1bba4c6053 1904 SCHEMA_STRUCT_TYPE_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 1905 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 1906
AzureIoTClient 0:1f9b2707ec7d 1907 /* Codes_SRS_SCHEMA_99_069:[Schema_GetStructTypeByName shall return NULL if unable to find a matching struct or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1908 if ((schemaHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1909 (name == NULL))
AzureIoTClient 0:1f9b2707ec7d 1910 {
AzureIoTClient 0:1f9b2707ec7d 1911 result = NULL;
AzureIoTClient 11:b1327861f5e0 1912 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1913 }
AzureIoTClient 0:1f9b2707ec7d 1914 else
AzureIoTClient 0:1f9b2707ec7d 1915 {
AzureIoTClient 0:1f9b2707ec7d 1916 size_t i;
AzureIoTClient 0:1f9b2707ec7d 1917
AzureIoTClient 0:1f9b2707ec7d 1918 /* Codes_SRS_SCHEMA_99_068:[Schema_GetStructTypeByName shall return a non-NULL handle corresponding to the struct type identified by the structTypeName in the schemaHandle schema.] */
AzureIoTClient 0:1f9b2707ec7d 1919 for (i = 0; i < schema->StructTypeCount; i++)
AzureIoTClient 0:1f9b2707ec7d 1920 {
AzureIoTClient 17:fa1bba4c6053 1921 SCHEMA_STRUCT_TYPE_HANDLE_DATA* structType = (SCHEMA_STRUCT_TYPE_HANDLE_DATA*)schema->StructTypes[i];
AzureIoTClient 0:1f9b2707ec7d 1922 if (strcmp(structType->Name, name) == 0)
AzureIoTClient 0:1f9b2707ec7d 1923 {
AzureIoTClient 0:1f9b2707ec7d 1924 break;
AzureIoTClient 0:1f9b2707ec7d 1925 }
AzureIoTClient 0:1f9b2707ec7d 1926 }
AzureIoTClient 0:1f9b2707ec7d 1927
AzureIoTClient 0:1f9b2707ec7d 1928 if (i == schema->StructTypeCount)
AzureIoTClient 0:1f9b2707ec7d 1929 {
AzureIoTClient 0:1f9b2707ec7d 1930 /* Codes_SRS_SCHEMA_99_069:[Schema_GetStructTypeByName shall return NULL if unable to find a matching struct or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1931 result = NULL;
AzureIoTClient 11:b1327861f5e0 1932 LogError("(Error code:%s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ELEMENT_NOT_FOUND));
AzureIoTClient 0:1f9b2707ec7d 1933 }
AzureIoTClient 0:1f9b2707ec7d 1934 else
AzureIoTClient 0:1f9b2707ec7d 1935 {
AzureIoTClient 0:1f9b2707ec7d 1936 result = schema->StructTypes[i];
AzureIoTClient 0:1f9b2707ec7d 1937 }
AzureIoTClient 0:1f9b2707ec7d 1938 }
AzureIoTClient 0:1f9b2707ec7d 1939
AzureIoTClient 0:1f9b2707ec7d 1940 return result;
AzureIoTClient 0:1f9b2707ec7d 1941 }
AzureIoTClient 0:1f9b2707ec7d 1942
AzureIoTClient 0:1f9b2707ec7d 1943 SCHEMA_STRUCT_TYPE_HANDLE Schema_GetStructTypeByIndex(SCHEMA_HANDLE schemaHandle, size_t index)
AzureIoTClient 0:1f9b2707ec7d 1944 {
AzureIoTClient 0:1f9b2707ec7d 1945 SCHEMA_STRUCT_TYPE_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 1946 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 1947
AzureIoTClient 0:1f9b2707ec7d 1948 /* Codes_SRS_SCHEMA_99_143: [Schema_GetStructTypeByIndex shall return NULL if the index specified is outside the valid range or if schemaHandle argument is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 1949 /* Codes_SRS_SCHEMA_99_142: [The index argument is zero based, and the order in which models were added shall be the index in which they will be retrieved.] */
AzureIoTClient 0:1f9b2707ec7d 1950 if ((schemaHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1951 (index >= schema->StructTypeCount))
AzureIoTClient 0:1f9b2707ec7d 1952 {
AzureIoTClient 0:1f9b2707ec7d 1953 result = NULL;
AzureIoTClient 11:b1327861f5e0 1954 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 1955 }
AzureIoTClient 0:1f9b2707ec7d 1956 else
AzureIoTClient 0:1f9b2707ec7d 1957 {
AzureIoTClient 0:1f9b2707ec7d 1958
AzureIoTClient 0:1f9b2707ec7d 1959 /* Codes_SRS_SCHEMA_99_141: [Schema_GetStructTypeByIndex shall return a non-NULL SCHEMA_STRUCT_TYPE_HANDLE corresponding to the struct type identified by schemaHandle and matching the index number provided by the index argument.] */
AzureIoTClient 0:1f9b2707ec7d 1960 /* Codes_SRS_SCHEMA_99_142: [The index argument is zero based, and the order in which models were added shall be the index in which they will be retrieved.] */
AzureIoTClient 0:1f9b2707ec7d 1961 result = schema->StructTypes[index];
AzureIoTClient 0:1f9b2707ec7d 1962 }
AzureIoTClient 0:1f9b2707ec7d 1963 return result;
AzureIoTClient 0:1f9b2707ec7d 1964 }
AzureIoTClient 0:1f9b2707ec7d 1965
AzureIoTClient 0:1f9b2707ec7d 1966 SCHEMA_RESULT Schema_AddStructTypeProperty(SCHEMA_STRUCT_TYPE_HANDLE structTypeHandle, const char* propertyName, const char* propertyType)
AzureIoTClient 0:1f9b2707ec7d 1967 {
AzureIoTClient 0:1f9b2707ec7d 1968 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 1969
AzureIoTClient 0:1f9b2707ec7d 1970 /* Codes_SRS_SCHEMA_99_072:[If any of the arguments is NULL, Schema_AddStructTypeProperty shall return SCHEMA_INVALID_ARG.] */
AzureIoTClient 0:1f9b2707ec7d 1971 if ((structTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1972 (propertyName == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 1973 (propertyType == NULL))
AzureIoTClient 0:1f9b2707ec7d 1974 {
AzureIoTClient 0:1f9b2707ec7d 1975 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 1976 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1977 }
AzureIoTClient 0:1f9b2707ec7d 1978 else
AzureIoTClient 0:1f9b2707ec7d 1979 {
AzureIoTClient 0:1f9b2707ec7d 1980 size_t i;
AzureIoTClient 17:fa1bba4c6053 1981 SCHEMA_STRUCT_TYPE_HANDLE_DATA* structType = (SCHEMA_STRUCT_TYPE_HANDLE_DATA*)structTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 1982
AzureIoTClient 0:1f9b2707ec7d 1983 /* Codes_SRS_SCHEMA_99_074:[The property name shall be unique per struct type, if the same property name is added twice to a struct type, SCHEMA_DUPLICATE_ELEMENT shall be returned.] */
AzureIoTClient 0:1f9b2707ec7d 1984 for (i = 0; i < structType->PropertyCount; i++)
AzureIoTClient 0:1f9b2707ec7d 1985 {
AzureIoTClient 17:fa1bba4c6053 1986 SCHEMA_PROPERTY_HANDLE_DATA* property = (SCHEMA_PROPERTY_HANDLE_DATA*)structType->Properties[i];
AzureIoTClient 0:1f9b2707ec7d 1987 if (strcmp(property->PropertyName, propertyName) == 0)
AzureIoTClient 0:1f9b2707ec7d 1988 {
AzureIoTClient 0:1f9b2707ec7d 1989 break;
AzureIoTClient 0:1f9b2707ec7d 1990 }
AzureIoTClient 0:1f9b2707ec7d 1991 }
AzureIoTClient 0:1f9b2707ec7d 1992
AzureIoTClient 0:1f9b2707ec7d 1993 if (i < structType->PropertyCount)
AzureIoTClient 0:1f9b2707ec7d 1994 {
AzureIoTClient 0:1f9b2707ec7d 1995 result = SCHEMA_DUPLICATE_ELEMENT;
AzureIoTClient 11:b1327861f5e0 1996 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1997 }
AzureIoTClient 0:1f9b2707ec7d 1998 else
AzureIoTClient 0:1f9b2707ec7d 1999 {
AzureIoTClient 0:1f9b2707ec7d 2000 SCHEMA_PROPERTY_HANDLE* newProperties = (SCHEMA_PROPERTY_HANDLE*)realloc(structType->Properties, sizeof(SCHEMA_PROPERTY_HANDLE) * (structType->PropertyCount + 1));
AzureIoTClient 0:1f9b2707ec7d 2001 if (newProperties == NULL)
AzureIoTClient 0:1f9b2707ec7d 2002 {
AzureIoTClient 0:1f9b2707ec7d 2003 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 2004 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2005 }
AzureIoTClient 0:1f9b2707ec7d 2006 else
AzureIoTClient 0:1f9b2707ec7d 2007 {
AzureIoTClient 17:fa1bba4c6053 2008 SCHEMA_PROPERTY_HANDLE_DATA* newProperty;
AzureIoTClient 0:1f9b2707ec7d 2009
AzureIoTClient 0:1f9b2707ec7d 2010 structType->Properties = newProperties;
AzureIoTClient 17:fa1bba4c6053 2011 if ((newProperty = (SCHEMA_PROPERTY_HANDLE_DATA*)malloc(sizeof(SCHEMA_PROPERTY_HANDLE_DATA))) == NULL)
AzureIoTClient 0:1f9b2707ec7d 2012 {
AzureIoTClient 0:1f9b2707ec7d 2013 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 2014 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2015 }
AzureIoTClient 0:1f9b2707ec7d 2016 else
AzureIoTClient 0:1f9b2707ec7d 2017 {
AzureIoTClient 0:1f9b2707ec7d 2018 if (mallocAndStrcpy_s((char**)&newProperty->PropertyName, propertyName) != 0)
AzureIoTClient 0:1f9b2707ec7d 2019 {
AzureIoTClient 0:1f9b2707ec7d 2020 free(newProperty);
AzureIoTClient 0:1f9b2707ec7d 2021 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 2022 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2023 }
AzureIoTClient 0:1f9b2707ec7d 2024 else if (mallocAndStrcpy_s((char**)&newProperty->PropertyType, propertyType) != 0)
AzureIoTClient 0:1f9b2707ec7d 2025 {
AzureIoTClient 0:1f9b2707ec7d 2026 free((void*)newProperty->PropertyName);
AzureIoTClient 0:1f9b2707ec7d 2027 free(newProperty);
AzureIoTClient 0:1f9b2707ec7d 2028 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 2029 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2030 }
AzureIoTClient 0:1f9b2707ec7d 2031 else
AzureIoTClient 0:1f9b2707ec7d 2032 {
AzureIoTClient 0:1f9b2707ec7d 2033 /* Codes_SRS_SCHEMA_99_070:[Schema_AddStructTypeProperty shall add one property to the struct type identified by structTypeHandle.] */
AzureIoTClient 0:1f9b2707ec7d 2034 structType->Properties[structType->PropertyCount] = (SCHEMA_PROPERTY_HANDLE)newProperty;
AzureIoTClient 0:1f9b2707ec7d 2035 structType->PropertyCount++;
AzureIoTClient 0:1f9b2707ec7d 2036
AzureIoTClient 0:1f9b2707ec7d 2037 /* Codes_SRS_SCHEMA_99_071:[On success, Schema_AddStructTypeProperty shall return SCHEMA_OK.] */
AzureIoTClient 0:1f9b2707ec7d 2038 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 2039 }
AzureIoTClient 0:1f9b2707ec7d 2040 }
AzureIoTClient 0:1f9b2707ec7d 2041
AzureIoTClient 0:1f9b2707ec7d 2042 /* If possible, reduce the memory of over allocation */
AzureIoTClient 0:1f9b2707ec7d 2043 if (result != SCHEMA_OK)
AzureIoTClient 0:1f9b2707ec7d 2044 {
AzureIoTClient 36:7d12a5386197 2045 if (structType->PropertyCount > 0)
AzureIoTClient 0:1f9b2707ec7d 2046 {
AzureIoTClient 36:7d12a5386197 2047 SCHEMA_PROPERTY_HANDLE *oldProperties = (SCHEMA_PROPERTY_HANDLE *)realloc(structType->Properties, sizeof(SCHEMA_PROPERTY_HANDLE) * structType->PropertyCount);
AzureIoTClient 36:7d12a5386197 2048 if (oldProperties == NULL)
AzureIoTClient 36:7d12a5386197 2049 {
AzureIoTClient 36:7d12a5386197 2050 result = SCHEMA_ERROR;
AzureIoTClient 36:7d12a5386197 2051 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 36:7d12a5386197 2052 }
AzureIoTClient 36:7d12a5386197 2053 else
AzureIoTClient 36:7d12a5386197 2054 {
AzureIoTClient 36:7d12a5386197 2055 structType->Properties = oldProperties;
AzureIoTClient 36:7d12a5386197 2056 }
AzureIoTClient 0:1f9b2707ec7d 2057 }
AzureIoTClient 0:1f9b2707ec7d 2058 else
AzureIoTClient 0:1f9b2707ec7d 2059 {
AzureIoTClient 36:7d12a5386197 2060 structType->Properties = NULL;
AzureIoTClient 0:1f9b2707ec7d 2061 }
AzureIoTClient 0:1f9b2707ec7d 2062 }
AzureIoTClient 0:1f9b2707ec7d 2063 }
AzureIoTClient 0:1f9b2707ec7d 2064 }
AzureIoTClient 0:1f9b2707ec7d 2065 }
AzureIoTClient 0:1f9b2707ec7d 2066
AzureIoTClient 0:1f9b2707ec7d 2067 return result;
AzureIoTClient 0:1f9b2707ec7d 2068 }
AzureIoTClient 0:1f9b2707ec7d 2069
AzureIoTClient 0:1f9b2707ec7d 2070 SCHEMA_PROPERTY_HANDLE Schema_GetStructTypePropertyByName(SCHEMA_STRUCT_TYPE_HANDLE structTypeHandle, const char* propertyName)
AzureIoTClient 0:1f9b2707ec7d 2071 {
AzureIoTClient 0:1f9b2707ec7d 2072 SCHEMA_PROPERTY_HANDLE result;
AzureIoTClient 0:1f9b2707ec7d 2073
AzureIoTClient 0:1f9b2707ec7d 2074 /* Codes_SRS_SCHEMA_99_076:[Schema_GetStructTypePropertyByName shall return NULL if unable to find a matching property or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2075 if ((structTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2076 (propertyName == NULL))
AzureIoTClient 0:1f9b2707ec7d 2077 {
AzureIoTClient 0:1f9b2707ec7d 2078 result = NULL;
AzureIoTClient 11:b1327861f5e0 2079 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 2080 }
AzureIoTClient 0:1f9b2707ec7d 2081 else
AzureIoTClient 0:1f9b2707ec7d 2082 {
AzureIoTClient 0:1f9b2707ec7d 2083 size_t i;
AzureIoTClient 17:fa1bba4c6053 2084 SCHEMA_STRUCT_TYPE_HANDLE_DATA* structType = (SCHEMA_STRUCT_TYPE_HANDLE_DATA*)structTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2085
AzureIoTClient 0:1f9b2707ec7d 2086 for (i = 0; i < structType->PropertyCount; i++)
AzureIoTClient 0:1f9b2707ec7d 2087 {
AzureIoTClient 17:fa1bba4c6053 2088 SCHEMA_PROPERTY_HANDLE_DATA* modelProperty = (SCHEMA_PROPERTY_HANDLE_DATA*)structType->Properties[i];
AzureIoTClient 0:1f9b2707ec7d 2089 if (strcmp(modelProperty->PropertyName, propertyName) == 0)
AzureIoTClient 0:1f9b2707ec7d 2090 {
AzureIoTClient 0:1f9b2707ec7d 2091 break;
AzureIoTClient 0:1f9b2707ec7d 2092 }
AzureIoTClient 0:1f9b2707ec7d 2093 }
AzureIoTClient 0:1f9b2707ec7d 2094
AzureIoTClient 0:1f9b2707ec7d 2095 /* Codes_SRS_SCHEMA_99_076:[Schema_GetStructTypePropertyByName shall return NULL if unable to find a matching property or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2096 if (i == structType->PropertyCount)
AzureIoTClient 0:1f9b2707ec7d 2097 {
AzureIoTClient 0:1f9b2707ec7d 2098 result = NULL;
AzureIoTClient 11:b1327861f5e0 2099 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_ELEMENT_NOT_FOUND));
AzureIoTClient 0:1f9b2707ec7d 2100 }
AzureIoTClient 0:1f9b2707ec7d 2101 /* Codes_SRS_SCHEMA_99_075:[Schema_GetStructTypePropertyByName shall return a non-NULL handle corresponding to a property identified by the structTypeHandle and propertyName.] */
AzureIoTClient 0:1f9b2707ec7d 2102 else
AzureIoTClient 0:1f9b2707ec7d 2103 {
AzureIoTClient 0:1f9b2707ec7d 2104 result = structType->Properties[i];
AzureIoTClient 0:1f9b2707ec7d 2105 }
AzureIoTClient 0:1f9b2707ec7d 2106 }
AzureIoTClient 0:1f9b2707ec7d 2107
AzureIoTClient 0:1f9b2707ec7d 2108 return result;
AzureIoTClient 0:1f9b2707ec7d 2109 }
AzureIoTClient 0:1f9b2707ec7d 2110
AzureIoTClient 0:1f9b2707ec7d 2111 SCHEMA_RESULT Schema_GetStructTypePropertyCount(SCHEMA_STRUCT_TYPE_HANDLE structTypeHandle, size_t* propertyCount)
AzureIoTClient 0:1f9b2707ec7d 2112 {
AzureIoTClient 0:1f9b2707ec7d 2113 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 2114
AzureIoTClient 0:1f9b2707ec7d 2115 /* Codes_SRS_SCHEMA_99_079: [Schema_GetStructTypePropertyCount shall return SCHEMA_INVALID_ARG if any of the structlTypeHandle or propertyCount arguments is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2116 if ((structTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2117 (propertyCount == NULL))
AzureIoTClient 0:1f9b2707ec7d 2118 {
AzureIoTClient 0:1f9b2707ec7d 2119 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 2120 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2121 }
AzureIoTClient 0:1f9b2707ec7d 2122 else
AzureIoTClient 0:1f9b2707ec7d 2123 {
AzureIoTClient 17:fa1bba4c6053 2124 SCHEMA_STRUCT_TYPE_HANDLE_DATA* structType = (SCHEMA_STRUCT_TYPE_HANDLE_DATA*)structTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2125
AzureIoTClient 0:1f9b2707ec7d 2126 /* Codes_SRS_SCHEMA_99_077: [Schema_GetStructTypePropertyCount shall provide the total number of properties defined in a struct type identified by structTypeHandle. The value is provided via the out argument propertyCount.] */
AzureIoTClient 0:1f9b2707ec7d 2127 /* Codes_SRS_SCHEMA_99_081: [The count shall be provided via the out argument propertyCount.] */
AzureIoTClient 0:1f9b2707ec7d 2128 *propertyCount = structType->PropertyCount;
AzureIoTClient 0:1f9b2707ec7d 2129
AzureIoTClient 0:1f9b2707ec7d 2130 /* Codes_SRS_SCHEMA_99_078: [On success, Schema_ GetStructTypePropertyCount shall return SCHEMA_OK.] */
AzureIoTClient 0:1f9b2707ec7d 2131 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 2132 }
AzureIoTClient 0:1f9b2707ec7d 2133
AzureIoTClient 0:1f9b2707ec7d 2134 return result;
AzureIoTClient 0:1f9b2707ec7d 2135 }
AzureIoTClient 0:1f9b2707ec7d 2136
AzureIoTClient 0:1f9b2707ec7d 2137 SCHEMA_PROPERTY_HANDLE Schema_GetStructTypePropertyByIndex(SCHEMA_STRUCT_TYPE_HANDLE structTypeHandle, size_t index)
AzureIoTClient 0:1f9b2707ec7d 2138 {
AzureIoTClient 0:1f9b2707ec7d 2139 SCHEMA_PROPERTY_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 2140 SCHEMA_STRUCT_TYPE_HANDLE_DATA* structType = (SCHEMA_STRUCT_TYPE_HANDLE_DATA*)structTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2141
AzureIoTClient 0:1f9b2707ec7d 2142 /* Codes_SRS_SCHEMA_99_083: [Schema_ GetStructTypeProperty shall return NULL if the index specified is outside the valid range, if structTypeHandle argument is NULL] */
AzureIoTClient 0:1f9b2707ec7d 2143 if ((structTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2144 (index >= structType->PropertyCount))
AzureIoTClient 0:1f9b2707ec7d 2145 {
AzureIoTClient 0:1f9b2707ec7d 2146 result = NULL;
AzureIoTClient 11:b1327861f5e0 2147 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 2148 }
AzureIoTClient 0:1f9b2707ec7d 2149 else
AzureIoTClient 0:1f9b2707ec7d 2150 {
AzureIoTClient 0:1f9b2707ec7d 2151 /* Codes_SRS_SCHEMA_99_082: [Schema_GetStructTypeProperty shall return a non-NULL SCHEMA_PROPERTY_HANDLE corresponding to the struct type identified by strutTypeHandle and matching the index number provided by the index argument.] */
AzureIoTClient 0:1f9b2707ec7d 2152 /* Codes_SRS_SCHEMA_99_098: [index is zero based and the order in which actions were added shall be the index in which they will be retrieved.] */
AzureIoTClient 0:1f9b2707ec7d 2153 result = structType->Properties[index];
AzureIoTClient 0:1f9b2707ec7d 2154 }
AzureIoTClient 0:1f9b2707ec7d 2155
AzureIoTClient 0:1f9b2707ec7d 2156 return result;
AzureIoTClient 0:1f9b2707ec7d 2157 }
AzureIoTClient 0:1f9b2707ec7d 2158
AzureIoTClient 0:1f9b2707ec7d 2159 const char* Schema_GetPropertyName(SCHEMA_PROPERTY_HANDLE propertyHandle)
AzureIoTClient 0:1f9b2707ec7d 2160 {
AzureIoTClient 0:1f9b2707ec7d 2161 const char* result;
AzureIoTClient 0:1f9b2707ec7d 2162
AzureIoTClient 0:1f9b2707ec7d 2163 /* Codes_SRS_SCHEMA_99_086: [If propertyHandle is NULL, Schema_GetPropertyName shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2164 if (propertyHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 2165 {
AzureIoTClient 0:1f9b2707ec7d 2166 result = NULL;
AzureIoTClient 11:b1327861f5e0 2167 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 2168 }
AzureIoTClient 0:1f9b2707ec7d 2169 else
AzureIoTClient 0:1f9b2707ec7d 2170 {
AzureIoTClient 17:fa1bba4c6053 2171 SCHEMA_PROPERTY_HANDLE_DATA* propertyType = (SCHEMA_PROPERTY_HANDLE_DATA*)propertyHandle;
AzureIoTClient 0:1f9b2707ec7d 2172
AzureIoTClient 0:1f9b2707ec7d 2173 /* Codes_SRS_SCHEMA_99_085: [Schema_GetPropertyName shall return the property name identified by the propertyHandle.] */
AzureIoTClient 0:1f9b2707ec7d 2174 result = propertyType->PropertyName;
AzureIoTClient 0:1f9b2707ec7d 2175 }
AzureIoTClient 0:1f9b2707ec7d 2176
AzureIoTClient 0:1f9b2707ec7d 2177 return result;
AzureIoTClient 0:1f9b2707ec7d 2178 }
AzureIoTClient 0:1f9b2707ec7d 2179
AzureIoTClient 0:1f9b2707ec7d 2180 const char* Schema_GetPropertyType(SCHEMA_PROPERTY_HANDLE propertyHandle)
AzureIoTClient 0:1f9b2707ec7d 2181 {
AzureIoTClient 0:1f9b2707ec7d 2182 const char* result;
AzureIoTClient 0:1f9b2707ec7d 2183
AzureIoTClient 0:1f9b2707ec7d 2184 /* Codes_SRS_SCHEMA_99_088: [If propertyHandle is NULL, Schema_GetPropertyType shall return NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2185 if (propertyHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 2186 {
AzureIoTClient 0:1f9b2707ec7d 2187 result = NULL;
AzureIoTClient 11:b1327861f5e0 2188 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 2189 }
AzureIoTClient 0:1f9b2707ec7d 2190 else
AzureIoTClient 0:1f9b2707ec7d 2191 {
AzureIoTClient 17:fa1bba4c6053 2192 SCHEMA_PROPERTY_HANDLE_DATA* modelProperty = (SCHEMA_PROPERTY_HANDLE_DATA*)propertyHandle;
AzureIoTClient 0:1f9b2707ec7d 2193
AzureIoTClient 0:1f9b2707ec7d 2194 /* Codes_SRS_SCHEMA_99_087: [Schema_GetPropertyType shall return the property type identified by the propertyHandle.] */
AzureIoTClient 0:1f9b2707ec7d 2195 result = modelProperty->PropertyType;
AzureIoTClient 0:1f9b2707ec7d 2196 }
AzureIoTClient 0:1f9b2707ec7d 2197
AzureIoTClient 0:1f9b2707ec7d 2198 return result;
AzureIoTClient 0:1f9b2707ec7d 2199 }
AzureIoTClient 0:1f9b2707ec7d 2200
AzureIoTClient 0:1f9b2707ec7d 2201 SCHEMA_RESULT Schema_GetModelCount(SCHEMA_HANDLE schemaHandle, size_t* modelCount)
AzureIoTClient 0:1f9b2707ec7d 2202 {
AzureIoTClient 0:1f9b2707ec7d 2203 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 2204 /* Codes_SRS_SCHEMA_99_123: [Schema_GetModelCount shall return SCHEMA_INVALID_ARG if any of the arguments is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2205 if ((schemaHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2206 (modelCount == NULL) )
AzureIoTClient 0:1f9b2707ec7d 2207 {
AzureIoTClient 0:1f9b2707ec7d 2208 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 2209 LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2210 }
AzureIoTClient 0:1f9b2707ec7d 2211 else
AzureIoTClient 0:1f9b2707ec7d 2212 {
AzureIoTClient 0:1f9b2707ec7d 2213 /* Codes_SRS_SCHEMA_99_120: [Schema_GetModelCount shall provide the number of models defined in the schema identified by schemaHandle.] */
AzureIoTClient 17:fa1bba4c6053 2214 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 2215 /* Codes_SRS_SCHEMA_99_121: [The count shall be provided via the out argument modelCount.] */
AzureIoTClient 0:1f9b2707ec7d 2216 *modelCount = schema->ModelTypeCount;
AzureIoTClient 0:1f9b2707ec7d 2217 /* Codes_SRS_SCHEMA_99_122: [On success, Schema_GetModelCount shall return SCHEMA_OK.] */
AzureIoTClient 0:1f9b2707ec7d 2218 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 2219 }
AzureIoTClient 0:1f9b2707ec7d 2220 return result;
AzureIoTClient 0:1f9b2707ec7d 2221 }
AzureIoTClient 0:1f9b2707ec7d 2222
AzureIoTClient 0:1f9b2707ec7d 2223 SCHEMA_MODEL_TYPE_HANDLE Schema_GetModelByName(SCHEMA_HANDLE schemaHandle, const char* modelName)
AzureIoTClient 0:1f9b2707ec7d 2224 {
AzureIoTClient 0:1f9b2707ec7d 2225 SCHEMA_MODEL_TYPE_HANDLE result;
AzureIoTClient 0:1f9b2707ec7d 2226
AzureIoTClient 0:1f9b2707ec7d 2227 /* Codes_SRS_SCHEMA_99_125: [Schema_GetModelByName shall return NULL if unable to find a matching model, or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2228 if ((schemaHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2229 (modelName == NULL))
AzureIoTClient 0:1f9b2707ec7d 2230 {
AzureIoTClient 0:1f9b2707ec7d 2231 result = NULL;
AzureIoTClient 11:b1327861f5e0 2232 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 2233 }
AzureIoTClient 0:1f9b2707ec7d 2234 else
AzureIoTClient 0:1f9b2707ec7d 2235 {
AzureIoTClient 0:1f9b2707ec7d 2236 /* Codes_SRS_SCHEMA_99_124: [Schema_GetModelByName shall return a non-NULL SCHEMA_MODEL_TYPE_HANDLE corresponding to the model identified by schemaHandle and matching the modelName argument value.] */
AzureIoTClient 17:fa1bba4c6053 2237 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 2238 size_t i;
AzureIoTClient 0:1f9b2707ec7d 2239 for (i = 0; i < schema->ModelTypeCount; i++)
AzureIoTClient 0:1f9b2707ec7d 2240 {
AzureIoTClient 17:fa1bba4c6053 2241 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)schema->ModelTypes[i];
AzureIoTClient 0:1f9b2707ec7d 2242 if (strcmp(modelName, modelType->Name)==0)
AzureIoTClient 0:1f9b2707ec7d 2243 {
AzureIoTClient 0:1f9b2707ec7d 2244 break;
AzureIoTClient 0:1f9b2707ec7d 2245 }
AzureIoTClient 0:1f9b2707ec7d 2246 }
AzureIoTClient 0:1f9b2707ec7d 2247 if (i == schema->ModelTypeCount)
AzureIoTClient 0:1f9b2707ec7d 2248 {
AzureIoTClient 0:1f9b2707ec7d 2249 /* Codes_SRS_SCHEMA_99_125: [Schema_GetModelByName shall return NULL if unable to find a matching model, or if any of the arguments are NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2250 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 2251 }
AzureIoTClient 0:1f9b2707ec7d 2252 else
AzureIoTClient 0:1f9b2707ec7d 2253 {
AzureIoTClient 0:1f9b2707ec7d 2254 result = schema->ModelTypes[i];
AzureIoTClient 0:1f9b2707ec7d 2255 }
AzureIoTClient 0:1f9b2707ec7d 2256 }
AzureIoTClient 0:1f9b2707ec7d 2257 return result;
AzureIoTClient 0:1f9b2707ec7d 2258 }
AzureIoTClient 0:1f9b2707ec7d 2259
AzureIoTClient 0:1f9b2707ec7d 2260 SCHEMA_MODEL_TYPE_HANDLE Schema_GetModelByIndex(SCHEMA_HANDLE schemaHandle, size_t index)
AzureIoTClient 0:1f9b2707ec7d 2261 {
AzureIoTClient 0:1f9b2707ec7d 2262 SCHEMA_MODEL_TYPE_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 2263 SCHEMA_HANDLE_DATA* schema = (SCHEMA_HANDLE_DATA*)schemaHandle;
AzureIoTClient 0:1f9b2707ec7d 2264
AzureIoTClient 0:1f9b2707ec7d 2265 /* Codes_SRS_SCHEMA_99_128: [Schema_GetModelByIndex shall return NULL if the index specified is outside the valid range or if schemaHandle argument is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2266 /* Codes_SRS_SCHEMA_99_127: [The index argument is zero based, and the order in which models were added shall be the index in which they will be retrieved.] */
AzureIoTClient 0:1f9b2707ec7d 2267 if ((schemaHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2268 (index >= schema->ModelTypeCount))
AzureIoTClient 0:1f9b2707ec7d 2269 {
AzureIoTClient 0:1f9b2707ec7d 2270 result = NULL;
AzureIoTClient 11:b1327861f5e0 2271 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 2272 }
AzureIoTClient 0:1f9b2707ec7d 2273 else
AzureIoTClient 0:1f9b2707ec7d 2274 {
AzureIoTClient 0:1f9b2707ec7d 2275
AzureIoTClient 36:7d12a5386197 2276 /* Codes_SRS_SCHEMA_99_126: [Schema_GetModelByIndex shall return a non-NULL SCHEMA_MODEL_TYPE_HANDLE corresponding to the model identified by schemaHandle and matching the index number provided by the index argument.] */
AzureIoTClient 0:1f9b2707ec7d 2277 /* Codes_SRS_SCHEMA_99_127: [The index argument is zero based, and the order in which models were added shall be the index in which they will be retrieved.] */
AzureIoTClient 0:1f9b2707ec7d 2278 result = schema->ModelTypes[index];
AzureIoTClient 0:1f9b2707ec7d 2279 }
AzureIoTClient 0:1f9b2707ec7d 2280 return result;
AzureIoTClient 0:1f9b2707ec7d 2281 }
AzureIoTClient 0:1f9b2707ec7d 2282
AzureIoTClient 0:1f9b2707ec7d 2283 /*Codes_SRS_SCHEMA_99_160: [Schema_GetModelName shall return the name of the model identified by modelTypeHandle. If the name cannot be retrieved, then NULL shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 2284 const char* Schema_GetModelName(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle)
AzureIoTClient 0:1f9b2707ec7d 2285 {
AzureIoTClient 0:1f9b2707ec7d 2286 const char* result;
AzureIoTClient 0:1f9b2707ec7d 2287 if (modelTypeHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 2288 {
AzureIoTClient 0:1f9b2707ec7d 2289 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 2290 }
AzureIoTClient 0:1f9b2707ec7d 2291 else
AzureIoTClient 0:1f9b2707ec7d 2292 {
AzureIoTClient 17:fa1bba4c6053 2293 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2294 result = modelType->Name;
AzureIoTClient 0:1f9b2707ec7d 2295 }
AzureIoTClient 0:1f9b2707ec7d 2296 return result;
AzureIoTClient 0:1f9b2707ec7d 2297 }
AzureIoTClient 0:1f9b2707ec7d 2298
AzureIoTClient 0:1f9b2707ec7d 2299 /*Codes_SRS_SCHEMA_99_163: [Schema_AddModelModel shall insert an existing model, identified by the handle modelType, into the existing model identified by modelTypeHandle under a property having the name propertyName.]*/
AzureIoTClient 17:fa1bba4c6053 2300 SCHEMA_RESULT Schema_AddModelModel(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* propertyName, SCHEMA_MODEL_TYPE_HANDLE modelType, size_t offset, pfOnDesiredProperty onDesiredProperty)
AzureIoTClient 0:1f9b2707ec7d 2301 {
AzureIoTClient 0:1f9b2707ec7d 2302 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 2303 /*Codes_SRS_SCHEMA_99_165: [If any of the parameters is NULL then Schema_AddModelModel shall return SCHEMA_INVALID_ARG.]*/
AzureIoTClient 0:1f9b2707ec7d 2304 if (
AzureIoTClient 0:1f9b2707ec7d 2305 (modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2306 (propertyName == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2307 (modelType == NULL)
AzureIoTClient 0:1f9b2707ec7d 2308 )
AzureIoTClient 0:1f9b2707ec7d 2309 {
AzureIoTClient 0:1f9b2707ec7d 2310 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 2311 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, SCHEMA_INVALID_ARG));
AzureIoTClient 0:1f9b2707ec7d 2312 }
AzureIoTClient 0:1f9b2707ec7d 2313 else
AzureIoTClient 0:1f9b2707ec7d 2314 {
AzureIoTClient 17:fa1bba4c6053 2315 SCHEMA_MODEL_TYPE_HANDLE_DATA* parentModel = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2316 MODEL_IN_MODEL temp;
AzureIoTClient 0:1f9b2707ec7d 2317 temp.modelHandle = modelType;
AzureIoTClient 17:fa1bba4c6053 2318 temp.offset = offset;
AzureIoTClient 17:fa1bba4c6053 2319 temp.onDesiredProperty = onDesiredProperty;
AzureIoTClient 0:1f9b2707ec7d 2320 if (mallocAndStrcpy_s((char**)&(temp.propertyName), propertyName) != 0)
AzureIoTClient 0:1f9b2707ec7d 2321 {
AzureIoTClient 0:1f9b2707ec7d 2322 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 2323 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2324 }
AzureIoTClient 0:1f9b2707ec7d 2325 else if (VECTOR_push_back(parentModel->models, &temp, 1) != 0)
AzureIoTClient 0:1f9b2707ec7d 2326 {
AzureIoTClient 0:1f9b2707ec7d 2327 /*Codes_SRS_SCHEMA_99_174: [The function shall return SCHEMA_ERROR if any other error occurs.]*/
AzureIoTClient 0:1f9b2707ec7d 2328 free((void*)temp.propertyName);
AzureIoTClient 0:1f9b2707ec7d 2329 result = SCHEMA_ERROR;
AzureIoTClient 11:b1327861f5e0 2330 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2331 }
AzureIoTClient 0:1f9b2707ec7d 2332 else
AzureIoTClient 0:1f9b2707ec7d 2333 {
AzureIoTClient 0:1f9b2707ec7d 2334 /*Codes_SRS_SCHEMA_99_164: [If the function succeeds, then the return value shall be SCHEMA_OK.]*/
AzureIoTClient 36:7d12a5386197 2335
AzureIoTClient 0:1f9b2707ec7d 2336 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 2337 }
AzureIoTClient 0:1f9b2707ec7d 2338 }
AzureIoTClient 0:1f9b2707ec7d 2339 return result;
AzureIoTClient 0:1f9b2707ec7d 2340 }
AzureIoTClient 0:1f9b2707ec7d 2341
AzureIoTClient 0:1f9b2707ec7d 2342
AzureIoTClient 0:1f9b2707ec7d 2343 SCHEMA_RESULT Schema_GetModelModelCount(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t* modelCount)
AzureIoTClient 0:1f9b2707ec7d 2344 {
AzureIoTClient 0:1f9b2707ec7d 2345 SCHEMA_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 2346 /*Codes_SRS_SCHEMA_99_169: [If any of the parameters is NULL, then the function shall return SCHEMA_INVALID_ARG.]*/
AzureIoTClient 0:1f9b2707ec7d 2347 if (
AzureIoTClient 0:1f9b2707ec7d 2348 (modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2349 (modelCount == NULL)
AzureIoTClient 0:1f9b2707ec7d 2350 )
AzureIoTClient 0:1f9b2707ec7d 2351 {
AzureIoTClient 0:1f9b2707ec7d 2352 result = SCHEMA_INVALID_ARG;
AzureIoTClient 11:b1327861f5e0 2353 LogError("(Error code: %s)", ENUM_TO_STRING(SCHEMA_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2354 }
AzureIoTClient 0:1f9b2707ec7d 2355 else
AzureIoTClient 0:1f9b2707ec7d 2356 {
AzureIoTClient 17:fa1bba4c6053 2357 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2358 /*Codes_SRS_SCHEMA_99_167: [Schema_GetModelModelCount shall return in parameter modelCount the number of models inserted in the model identified by parameter modelTypeHandle.]*/
AzureIoTClient 0:1f9b2707ec7d 2359 *modelCount = VECTOR_size(model->models);
AzureIoTClient 0:1f9b2707ec7d 2360 /*SRS_SCHEMA_99_168: [If the function succeeds, it shall return SCHEMA_OK.]*/
AzureIoTClient 0:1f9b2707ec7d 2361 result = SCHEMA_OK;
AzureIoTClient 0:1f9b2707ec7d 2362 }
AzureIoTClient 0:1f9b2707ec7d 2363 return result;
AzureIoTClient 0:1f9b2707ec7d 2364 }
AzureIoTClient 0:1f9b2707ec7d 2365
AzureIoTClient 0:1f9b2707ec7d 2366 static bool matchModelName(const void* element, const void* value)
AzureIoTClient 0:1f9b2707ec7d 2367 {
AzureIoTClient 0:1f9b2707ec7d 2368 MODEL_IN_MODEL* decodedElement = (MODEL_IN_MODEL*)element;
AzureIoTClient 0:1f9b2707ec7d 2369 const char* name = (const char*)value;
AzureIoTClient 0:1f9b2707ec7d 2370 return (strcmp(decodedElement->propertyName, name) == 0);
AzureIoTClient 0:1f9b2707ec7d 2371 }
AzureIoTClient 0:1f9b2707ec7d 2372
AzureIoTClient 0:1f9b2707ec7d 2373 SCHEMA_MODEL_TYPE_HANDLE Schema_GetModelModelByName(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* propertyName)
AzureIoTClient 0:1f9b2707ec7d 2374 {
AzureIoTClient 0:1f9b2707ec7d 2375 SCHEMA_MODEL_TYPE_HANDLE result;
AzureIoTClient 0:1f9b2707ec7d 2376 if (
AzureIoTClient 0:1f9b2707ec7d 2377 (modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2378 (propertyName == NULL)
AzureIoTClient 0:1f9b2707ec7d 2379 )
AzureIoTClient 0:1f9b2707ec7d 2380 {
AzureIoTClient 0:1f9b2707ec7d 2381 /*Codes_SRS_SCHEMA_99_171: [If Schema_GetModelModelByName is unable to provide the handle it shall return NULL.]*/
AzureIoTClient 0:1f9b2707ec7d 2382 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 2383 LogError("error SCHEMA_INVALID_ARG");
AzureIoTClient 0:1f9b2707ec7d 2384 }
AzureIoTClient 0:1f9b2707ec7d 2385 else
AzureIoTClient 0:1f9b2707ec7d 2386 {
AzureIoTClient 17:fa1bba4c6053 2387 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2388 /*Codes_SRS_SCHEMA_99_170: [Schema_GetModelModelByName shall return a handle to the model identified by the property with the name propertyName in the model identified by the handle modelTypeHandle.]*/
AzureIoTClient 0:1f9b2707ec7d 2389 /*Codes_SRS_SCHEMA_99_171: [If Schema_GetModelModelByName is unable to provide the handle it shall return NULL.]*/
AzureIoTClient 0:1f9b2707ec7d 2390 void* temp = VECTOR_find_if(model->models, matchModelName, propertyName);
AzureIoTClient 0:1f9b2707ec7d 2391 if (temp == NULL)
AzureIoTClient 0:1f9b2707ec7d 2392 {
AzureIoTClient 0:1f9b2707ec7d 2393 LogError("specified propertyName not found (%s)", propertyName);
AzureIoTClient 0:1f9b2707ec7d 2394 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 2395 }
AzureIoTClient 0:1f9b2707ec7d 2396 else
AzureIoTClient 0:1f9b2707ec7d 2397 {
AzureIoTClient 0:1f9b2707ec7d 2398 result = ((MODEL_IN_MODEL*)temp)->modelHandle;
AzureIoTClient 0:1f9b2707ec7d 2399 }
AzureIoTClient 0:1f9b2707ec7d 2400 }
AzureIoTClient 0:1f9b2707ec7d 2401 return result;
AzureIoTClient 0:1f9b2707ec7d 2402 }
AzureIoTClient 0:1f9b2707ec7d 2403
AzureIoTClient 17:fa1bba4c6053 2404 size_t Schema_GetModelModelByName_Offset(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* propertyName)
AzureIoTClient 17:fa1bba4c6053 2405 {
AzureIoTClient 17:fa1bba4c6053 2406 size_t result;
AzureIoTClient 17:fa1bba4c6053 2407 /*Codes_SRS_SCHEMA_02_053: [ If modelTypeHandle is NULL then Schema_GetModelModelByName_Offset shall fail and return 0. ]*/
AzureIoTClient 17:fa1bba4c6053 2408 /*Codes_SRS_SCHEMA_02_054: [ If propertyName is NULL then Schema_GetModelModelByName_Offset shall fail and return 0. ]*/
AzureIoTClient 17:fa1bba4c6053 2409 if (
AzureIoTClient 17:fa1bba4c6053 2410 (modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2411 (propertyName == NULL)
AzureIoTClient 17:fa1bba4c6053 2412 )
AzureIoTClient 17:fa1bba4c6053 2413 {
AzureIoTClient 17:fa1bba4c6053 2414 /*Codes_SRS_SCHEMA_99_171: [If Schema_GetModelModelByName is unable to provide the handle it shall return NULL.]*/
AzureIoTClient 17:fa1bba4c6053 2415 result = 0;
AzureIoTClient 17:fa1bba4c6053 2416 LogError("error SCHEMA_INVALID_ARG");
AzureIoTClient 17:fa1bba4c6053 2417 }
AzureIoTClient 17:fa1bba4c6053 2418 else
AzureIoTClient 17:fa1bba4c6053 2419 {
AzureIoTClient 17:fa1bba4c6053 2420 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 2421 /*Codes_SRS_SCHEMA_02_056: [ If propertyName is not a model then Schema_GetModelModelByName_Offset shall fail and return 0. ]*/
AzureIoTClient 17:fa1bba4c6053 2422 void* temp = VECTOR_find_if(model->models, matchModelName, propertyName);
AzureIoTClient 17:fa1bba4c6053 2423 if (temp == NULL)
AzureIoTClient 17:fa1bba4c6053 2424 {
AzureIoTClient 17:fa1bba4c6053 2425 LogError("specified propertyName not found (%s)", propertyName);
AzureIoTClient 17:fa1bba4c6053 2426 result = 0;
AzureIoTClient 17:fa1bba4c6053 2427 }
AzureIoTClient 17:fa1bba4c6053 2428 else
AzureIoTClient 17:fa1bba4c6053 2429 {
AzureIoTClient 17:fa1bba4c6053 2430 /*Codes_SRS_SCHEMA_02_055: [ Otherwise Schema_GetModelModelByName_Offset shall succeed and return the offset. ]*/
AzureIoTClient 17:fa1bba4c6053 2431 result = ((MODEL_IN_MODEL*)temp)->offset;
AzureIoTClient 17:fa1bba4c6053 2432 }
AzureIoTClient 17:fa1bba4c6053 2433 }
AzureIoTClient 17:fa1bba4c6053 2434 return result;
AzureIoTClient 17:fa1bba4c6053 2435 }
AzureIoTClient 17:fa1bba4c6053 2436
AzureIoTClient 17:fa1bba4c6053 2437 pfOnDesiredProperty Schema_GetModelModelByName_OnDesiredProperty(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* propertyName)
AzureIoTClient 17:fa1bba4c6053 2438 {
AzureIoTClient 17:fa1bba4c6053 2439 pfOnDesiredProperty result;
AzureIoTClient 17:fa1bba4c6053 2440 /*Codes_SRS_SCHEMA_02_086: [ If modelTypeHandle is NULL then Schema_GetModelModelByName_OnDesiredProperty shall return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 2441 /*Codes_SRS_SCHEMA_02_087: [ If propertyName is NULL then Schema_GetModelModelByName_OnDesiredProperty shall return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 2442 if (
AzureIoTClient 17:fa1bba4c6053 2443 (modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2444 (propertyName == NULL)
AzureIoTClient 17:fa1bba4c6053 2445 )
AzureIoTClient 17:fa1bba4c6053 2446 {
AzureIoTClient 17:fa1bba4c6053 2447 result = NULL;
AzureIoTClient 17:fa1bba4c6053 2448 LogError("invalid argument SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* propertyName=%p",modelTypeHandle, propertyName);
AzureIoTClient 17:fa1bba4c6053 2449 }
AzureIoTClient 17:fa1bba4c6053 2450 else
AzureIoTClient 17:fa1bba4c6053 2451 {
AzureIoTClient 17:fa1bba4c6053 2452 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 2453 void* temp = VECTOR_find_if(model->models, matchModelName, propertyName);
AzureIoTClient 17:fa1bba4c6053 2454 if (temp == NULL)
AzureIoTClient 17:fa1bba4c6053 2455 {
AzureIoTClient 17:fa1bba4c6053 2456 LogError("specified propertyName not found (%s)", propertyName);
AzureIoTClient 17:fa1bba4c6053 2457 result = NULL;
AzureIoTClient 17:fa1bba4c6053 2458 }
AzureIoTClient 17:fa1bba4c6053 2459 else
AzureIoTClient 17:fa1bba4c6053 2460 {
AzureIoTClient 17:fa1bba4c6053 2461 /*Codes_SRS_SCHEMA_02_089: [ Otherwise Schema_GetModelModelByName_OnDesiredProperty shall return the desired property callback. ]*/
AzureIoTClient 17:fa1bba4c6053 2462 result = ((MODEL_IN_MODEL*)temp)->onDesiredProperty;
AzureIoTClient 17:fa1bba4c6053 2463 }
AzureIoTClient 17:fa1bba4c6053 2464 }
AzureIoTClient 17:fa1bba4c6053 2465 return result;
AzureIoTClient 17:fa1bba4c6053 2466
AzureIoTClient 17:fa1bba4c6053 2467 }
AzureIoTClient 17:fa1bba4c6053 2468
AzureIoTClient 17:fa1bba4c6053 2469 size_t Schema_GetModelModelByIndex_Offset(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t index)
AzureIoTClient 17:fa1bba4c6053 2470 {
AzureIoTClient 17:fa1bba4c6053 2471 size_t result;
AzureIoTClient 17:fa1bba4c6053 2472 /*Codes_SRS_SCHEMA_02_057: [ If modelTypeHandle is NULL then Schema_GetModelModelByIndex_Offset shall fail and return 0. ]*/
AzureIoTClient 22:422d94bd3c18 2473 if (modelTypeHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 2474 {
AzureIoTClient 17:fa1bba4c6053 2475 result = 0;
AzureIoTClient 17:fa1bba4c6053 2476 LogError("error SCHEMA_INVALID_ARG");
AzureIoTClient 17:fa1bba4c6053 2477 }
AzureIoTClient 17:fa1bba4c6053 2478 else
AzureIoTClient 17:fa1bba4c6053 2479 {
AzureIoTClient 17:fa1bba4c6053 2480 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 2481 /*Codes_SRS_SCHEMA_02_058: [ If index is not valid then Schema_GetModelModelByIndex_Offset shall fail and return 0. ]*/
AzureIoTClient 17:fa1bba4c6053 2482 void* temp = VECTOR_element(model->models, index);
AzureIoTClient 17:fa1bba4c6053 2483 if (temp == 0)
AzureIoTClient 17:fa1bba4c6053 2484 {
AzureIoTClient 17:fa1bba4c6053 2485 LogError("specified index [out of bounds] (%zu)", index);
AzureIoTClient 17:fa1bba4c6053 2486 result = 0;
AzureIoTClient 17:fa1bba4c6053 2487 }
AzureIoTClient 17:fa1bba4c6053 2488 else
AzureIoTClient 17:fa1bba4c6053 2489 {
AzureIoTClient 17:fa1bba4c6053 2490 /*Codes_SRS_SCHEMA_02_059: [ Otherwise Schema_GetModelModelByIndex_Offset shall succeed and return the offset. ]*/
AzureIoTClient 17:fa1bba4c6053 2491 result = ((MODEL_IN_MODEL*)temp)->offset;
AzureIoTClient 17:fa1bba4c6053 2492 }
AzureIoTClient 17:fa1bba4c6053 2493 }
AzureIoTClient 17:fa1bba4c6053 2494 return result;
AzureIoTClient 17:fa1bba4c6053 2495 }
AzureIoTClient 17:fa1bba4c6053 2496
AzureIoTClient 0:1f9b2707ec7d 2497 SCHEMA_MODEL_TYPE_HANDLE Schema_GetModelModelyByIndex(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t index)
AzureIoTClient 0:1f9b2707ec7d 2498 {
AzureIoTClient 0:1f9b2707ec7d 2499 SCHEMA_MODEL_TYPE_HANDLE result;
AzureIoTClient 36:7d12a5386197 2500 if (modelTypeHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 2501 {
AzureIoTClient 0:1f9b2707ec7d 2502 /*Codes_SRS_SCHEMA_99_173: [Schema_GetModelModelyByIndex shall return NULL in the cases when it cannot provide the handle.]*/
AzureIoTClient 0:1f9b2707ec7d 2503 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 2504 LogError("error SCHEMA_INVALID_ARG");
AzureIoTClient 0:1f9b2707ec7d 2505 }
AzureIoTClient 0:1f9b2707ec7d 2506 else
AzureIoTClient 0:1f9b2707ec7d 2507 {
AzureIoTClient 17:fa1bba4c6053 2508 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2509 size_t nModelsInModel;
AzureIoTClient 0:1f9b2707ec7d 2510 /*Codes_SRS_SCHEMA_99_172: [ Schema_GetModelModelyByIndex shall return a handle to the "index"th model inserted in the model identified by the parameter modelTypeHandle.]*/
AzureIoTClient 0:1f9b2707ec7d 2511 /*Codes_SRS_SCHEMA_99_173: [Schema_GetModelModelyByIndex shall return NULL in the cases when it cannot provide the handle.]*/
AzureIoTClient 0:1f9b2707ec7d 2512 nModelsInModel = VECTOR_size(model->models);
AzureIoTClient 0:1f9b2707ec7d 2513 if (index < nModelsInModel)
AzureIoTClient 0:1f9b2707ec7d 2514 {
AzureIoTClient 0:1f9b2707ec7d 2515 result = ((MODEL_IN_MODEL*)VECTOR_element(model->models, index))->modelHandle;
AzureIoTClient 0:1f9b2707ec7d 2516 }
AzureIoTClient 0:1f9b2707ec7d 2517 else
AzureIoTClient 0:1f9b2707ec7d 2518 {
AzureIoTClient 0:1f9b2707ec7d 2519 LogError("attempted out of bounds access in array.");
AzureIoTClient 0:1f9b2707ec7d 2520 result = NULL; /*out of bounds array access*/
AzureIoTClient 0:1f9b2707ec7d 2521 }
AzureIoTClient 0:1f9b2707ec7d 2522 }
AzureIoTClient 0:1f9b2707ec7d 2523 return result;
AzureIoTClient 0:1f9b2707ec7d 2524 }
AzureIoTClient 0:1f9b2707ec7d 2525
AzureIoTClient 0:1f9b2707ec7d 2526 const char* Schema_GetModelModelPropertyNameByIndex(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t index)
AzureIoTClient 0:1f9b2707ec7d 2527 {
AzureIoTClient 0:1f9b2707ec7d 2528 const char* result;
AzureIoTClient 0:1f9b2707ec7d 2529 if (modelTypeHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 2530 {
AzureIoTClient 0:1f9b2707ec7d 2531 /*Codes_SRS_SCHEMA_99_176: [If Schema_GetModelModelPropertyNameByIndex cannot produce the property name, it shall return NULL.]*/
AzureIoTClient 0:1f9b2707ec7d 2532 result = NULL;
AzureIoTClient 0:1f9b2707ec7d 2533 }
AzureIoTClient 0:1f9b2707ec7d 2534 else
AzureIoTClient 0:1f9b2707ec7d 2535 {
AzureIoTClient 17:fa1bba4c6053 2536 SCHEMA_MODEL_TYPE_HANDLE_DATA* model = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2537 size_t nModelsInModel;
AzureIoTClient 0:1f9b2707ec7d 2538 /*Codes_SRS_SCHEMA_99_175: [Schema_GetModelModelPropertyNameByIndex shall return the name of the property for the "index"th model in the model identified by modelTypeHandle parameter.]*/
AzureIoTClient 0:1f9b2707ec7d 2539 /*Codes_SRS_SCHEMA_99_176: [If Schema_GetModelModelPropertyNameByIndex cannot produce the property name, it shall return NULL.]*/
AzureIoTClient 0:1f9b2707ec7d 2540 nModelsInModel = VECTOR_size(model->models);
AzureIoTClient 0:1f9b2707ec7d 2541 if (index < nModelsInModel)
AzureIoTClient 0:1f9b2707ec7d 2542 {
AzureIoTClient 0:1f9b2707ec7d 2543 result = ((MODEL_IN_MODEL*)VECTOR_element(model->models, index))->propertyName;
AzureIoTClient 0:1f9b2707ec7d 2544 }
AzureIoTClient 0:1f9b2707ec7d 2545 else
AzureIoTClient 0:1f9b2707ec7d 2546 {
AzureIoTClient 0:1f9b2707ec7d 2547 LogError("attempted out of bounds access in array.");
AzureIoTClient 0:1f9b2707ec7d 2548 result = NULL; /*out of bounds array access*/
AzureIoTClient 0:1f9b2707ec7d 2549 }
AzureIoTClient 0:1f9b2707ec7d 2550 }
AzureIoTClient 0:1f9b2707ec7d 2551 return result;
AzureIoTClient 0:1f9b2707ec7d 2552 }
AzureIoTClient 0:1f9b2707ec7d 2553
AzureIoTClient 0:1f9b2707ec7d 2554 bool Schema_ModelPropertyByPathExists(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* propertyPath)
AzureIoTClient 0:1f9b2707ec7d 2555 {
AzureIoTClient 0:1f9b2707ec7d 2556 bool result;
AzureIoTClient 0:1f9b2707ec7d 2557
AzureIoTClient 0:1f9b2707ec7d 2558 /* Codes_SRS_SCHEMA_99_180: [If any of the arguments are NULL, Schema_ModelPropertyByPathExists shall return false.] */
AzureIoTClient 0:1f9b2707ec7d 2559 if ((modelTypeHandle == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2560 (propertyPath == NULL))
AzureIoTClient 0:1f9b2707ec7d 2561 {
AzureIoTClient 0:1f9b2707ec7d 2562 LogError("error SCHEMA_INVALID_ARG");
AzureIoTClient 0:1f9b2707ec7d 2563 result = false;
AzureIoTClient 0:1f9b2707ec7d 2564 }
AzureIoTClient 0:1f9b2707ec7d 2565 else
AzureIoTClient 0:1f9b2707ec7d 2566 {
AzureIoTClient 0:1f9b2707ec7d 2567 const char* slashPos;
AzureIoTClient 0:1f9b2707ec7d 2568 result = false;
AzureIoTClient 0:1f9b2707ec7d 2569
AzureIoTClient 0:1f9b2707ec7d 2570 /* Codes_SRS_SCHEMA_99_182: [A single slash ('/') at the beginning of the path shall be ignored and the path shall still be valid.] */
AzureIoTClient 0:1f9b2707ec7d 2571 if (*propertyPath == '/')
AzureIoTClient 0:1f9b2707ec7d 2572 {
AzureIoTClient 0:1f9b2707ec7d 2573 propertyPath++;
AzureIoTClient 0:1f9b2707ec7d 2574 }
AzureIoTClient 0:1f9b2707ec7d 2575
AzureIoTClient 0:1f9b2707ec7d 2576 do
AzureIoTClient 0:1f9b2707ec7d 2577 {
AzureIoTClient 0:1f9b2707ec7d 2578 const char* endPos;
AzureIoTClient 0:1f9b2707ec7d 2579 size_t i;
AzureIoTClient 0:1f9b2707ec7d 2580 size_t modelCount;
AzureIoTClient 17:fa1bba4c6053 2581 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 0:1f9b2707ec7d 2582
AzureIoTClient 0:1f9b2707ec7d 2583 /* Codes_SRS_SCHEMA_99_179: [The propertyPath shall be assumed to be in the format model1/model2/.../propertyName.] */
AzureIoTClient 0:1f9b2707ec7d 2584 slashPos = strchr(propertyPath, '/');
AzureIoTClient 0:1f9b2707ec7d 2585 endPos = slashPos;
AzureIoTClient 0:1f9b2707ec7d 2586 if (endPos == NULL)
AzureIoTClient 0:1f9b2707ec7d 2587 {
AzureIoTClient 0:1f9b2707ec7d 2588 endPos = &propertyPath[strlen(propertyPath)];
AzureIoTClient 0:1f9b2707ec7d 2589 }
AzureIoTClient 0:1f9b2707ec7d 2590
AzureIoTClient 0:1f9b2707ec7d 2591 /* get the child-model */
AzureIoTClient 0:1f9b2707ec7d 2592 modelCount = VECTOR_size(modelType->models);
AzureIoTClient 0:1f9b2707ec7d 2593 for (i = 0; i < modelCount; i++)
AzureIoTClient 0:1f9b2707ec7d 2594 {
AzureIoTClient 0:1f9b2707ec7d 2595 MODEL_IN_MODEL* childModel = (MODEL_IN_MODEL*)VECTOR_element(modelType->models, i);
AzureIoTClient 0:1f9b2707ec7d 2596 if ((strncmp(childModel->propertyName, propertyPath, endPos - propertyPath) == 0) &&
AzureIoTClient 0:1f9b2707ec7d 2597 (strlen(childModel->propertyName) == (size_t)(endPos - propertyPath)))
AzureIoTClient 0:1f9b2707ec7d 2598 {
AzureIoTClient 0:1f9b2707ec7d 2599 /* found */
AzureIoTClient 0:1f9b2707ec7d 2600 modelTypeHandle = childModel->modelHandle;
AzureIoTClient 0:1f9b2707ec7d 2601 break;
AzureIoTClient 0:1f9b2707ec7d 2602 }
AzureIoTClient 0:1f9b2707ec7d 2603 }
AzureIoTClient 0:1f9b2707ec7d 2604
AzureIoTClient 0:1f9b2707ec7d 2605 if (i < modelCount)
AzureIoTClient 0:1f9b2707ec7d 2606 {
AzureIoTClient 0:1f9b2707ec7d 2607 /* model found, check if there is more in the path */
AzureIoTClient 0:1f9b2707ec7d 2608 if (slashPos == NULL)
AzureIoTClient 0:1f9b2707ec7d 2609 {
AzureIoTClient 0:1f9b2707ec7d 2610 /* this is the last one, so this is the thing we were looking for */
AzureIoTClient 0:1f9b2707ec7d 2611 result = true;
AzureIoTClient 0:1f9b2707ec7d 2612 break;
AzureIoTClient 0:1f9b2707ec7d 2613 }
AzureIoTClient 0:1f9b2707ec7d 2614 else
AzureIoTClient 0:1f9b2707ec7d 2615 {
AzureIoTClient 0:1f9b2707ec7d 2616 /* continue looking, there's more */
AzureIoTClient 0:1f9b2707ec7d 2617 propertyPath = slashPos + 1;
AzureIoTClient 0:1f9b2707ec7d 2618 }
AzureIoTClient 0:1f9b2707ec7d 2619 }
AzureIoTClient 0:1f9b2707ec7d 2620 else
AzureIoTClient 0:1f9b2707ec7d 2621 {
AzureIoTClient 0:1f9b2707ec7d 2622 /* no model found, let's see if this is a property */
AzureIoTClient 0:1f9b2707ec7d 2623 /* Codes_SRS_SCHEMA_99_178: [The argument propertyPath shall be used to find the leaf property.] */
AzureIoTClient 0:1f9b2707ec7d 2624 for (i = 0; i < modelType->PropertyCount; i++)
AzureIoTClient 0:1f9b2707ec7d 2625 {
AzureIoTClient 17:fa1bba4c6053 2626 SCHEMA_PROPERTY_HANDLE_DATA* property = (SCHEMA_PROPERTY_HANDLE_DATA*)modelType->Properties[i];
AzureIoTClient 0:1f9b2707ec7d 2627 if ((strncmp(property->PropertyName, propertyPath, endPos - propertyPath) == 0) &&
AzureIoTClient 0:1f9b2707ec7d 2628 (strlen(property->PropertyName) == (size_t)(endPos - propertyPath)))
AzureIoTClient 0:1f9b2707ec7d 2629 {
AzureIoTClient 0:1f9b2707ec7d 2630 /* found property */
AzureIoTClient 0:1f9b2707ec7d 2631 /* Codes_SRS_SCHEMA_99_177: [Schema_ModelPropertyByPathExists shall return true if a leaf property exists in the model modelTypeHandle.] */
AzureIoTClient 0:1f9b2707ec7d 2632 result = true;
AzureIoTClient 0:1f9b2707ec7d 2633 break;
AzureIoTClient 0:1f9b2707ec7d 2634 }
AzureIoTClient 0:1f9b2707ec7d 2635 }
AzureIoTClient 0:1f9b2707ec7d 2636
AzureIoTClient 0:1f9b2707ec7d 2637 break;
AzureIoTClient 0:1f9b2707ec7d 2638 }
AzureIoTClient 0:1f9b2707ec7d 2639 } while (slashPos != NULL);
AzureIoTClient 0:1f9b2707ec7d 2640 }
AzureIoTClient 0:1f9b2707ec7d 2641
AzureIoTClient 0:1f9b2707ec7d 2642 return result;
AzureIoTClient 0:1f9b2707ec7d 2643 }
AzureIoTClient 17:fa1bba4c6053 2644
AzureIoTClient 17:fa1bba4c6053 2645 bool Schema_ModelReportedPropertyByPathExists(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* reportedPropertyPath)
AzureIoTClient 17:fa1bba4c6053 2646 {
AzureIoTClient 17:fa1bba4c6053 2647 bool result;
AzureIoTClient 17:fa1bba4c6053 2648
AzureIoTClient 17:fa1bba4c6053 2649 /*Codes_SRS_SCHEMA_02_018: [ If argument modelTypeHandle is NULL then Schema_ModelReportedPropertyByPathExists shall fail and return false. ]*/
AzureIoTClient 17:fa1bba4c6053 2650 /*Codes_SRS_SCHEMA_02_019: [ If argument reportedPropertyPath is NULL then Schema_ModelReportedPropertyByPathExists shall fail and return false. ]*/
AzureIoTClient 17:fa1bba4c6053 2651 if ((modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2652 (reportedPropertyPath == NULL))
AzureIoTClient 17:fa1bba4c6053 2653 {
AzureIoTClient 17:fa1bba4c6053 2654 LogError("invalid argument SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* reportedPropertyPath=%s", modelTypeHandle, reportedPropertyPath);
AzureIoTClient 17:fa1bba4c6053 2655 result = false;
AzureIoTClient 17:fa1bba4c6053 2656 }
AzureIoTClient 17:fa1bba4c6053 2657 else
AzureIoTClient 17:fa1bba4c6053 2658 {
AzureIoTClient 17:fa1bba4c6053 2659 const char* slashPos;
AzureIoTClient 17:fa1bba4c6053 2660
AzureIoTClient 17:fa1bba4c6053 2661 /*Codes_SRS_SCHEMA_02_021: [ If the reported property cannot be found Schema_ModelReportedPropertyByPathExists shall fail and return false. ]*/
AzureIoTClient 17:fa1bba4c6053 2662 result = false;
AzureIoTClient 17:fa1bba4c6053 2663
AzureIoTClient 17:fa1bba4c6053 2664 /*Codes_SRS_SCHEMA_02_020: [ reportedPropertyPath shall be assumed to be in the format model1/model2/.../reportedPropertyName. ]*/
AzureIoTClient 17:fa1bba4c6053 2665 if (*reportedPropertyPath == '/')
AzureIoTClient 17:fa1bba4c6053 2666 {
AzureIoTClient 17:fa1bba4c6053 2667 reportedPropertyPath++;
AzureIoTClient 17:fa1bba4c6053 2668 }
AzureIoTClient 17:fa1bba4c6053 2669
AzureIoTClient 17:fa1bba4c6053 2670 do
AzureIoTClient 17:fa1bba4c6053 2671 {
AzureIoTClient 17:fa1bba4c6053 2672 const char* endPos;
AzureIoTClient 17:fa1bba4c6053 2673 size_t i;
AzureIoTClient 17:fa1bba4c6053 2674 size_t modelCount;
AzureIoTClient 17:fa1bba4c6053 2675 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 2676
AzureIoTClient 17:fa1bba4c6053 2677 slashPos = strchr(reportedPropertyPath, '/');
AzureIoTClient 17:fa1bba4c6053 2678 endPos = slashPos;
AzureIoTClient 17:fa1bba4c6053 2679 if (endPos == NULL)
AzureIoTClient 17:fa1bba4c6053 2680 {
AzureIoTClient 17:fa1bba4c6053 2681 endPos = &reportedPropertyPath[strlen(reportedPropertyPath)];
AzureIoTClient 17:fa1bba4c6053 2682 }
AzureIoTClient 17:fa1bba4c6053 2683
AzureIoTClient 17:fa1bba4c6053 2684 modelCount = VECTOR_size(modelType->models);
AzureIoTClient 17:fa1bba4c6053 2685 for (i = 0; i < modelCount; i++)
AzureIoTClient 17:fa1bba4c6053 2686 {
AzureIoTClient 17:fa1bba4c6053 2687 MODEL_IN_MODEL* childModel = (MODEL_IN_MODEL*)VECTOR_element(modelType->models, i);
AzureIoTClient 17:fa1bba4c6053 2688 if ((strncmp(childModel->propertyName, reportedPropertyPath, endPos - reportedPropertyPath) == 0) &&
AzureIoTClient 17:fa1bba4c6053 2689 (strlen(childModel->propertyName) == (size_t)(endPos - reportedPropertyPath)))
AzureIoTClient 17:fa1bba4c6053 2690 {
AzureIoTClient 17:fa1bba4c6053 2691 /* found */
AzureIoTClient 17:fa1bba4c6053 2692 modelTypeHandle = childModel->modelHandle;
AzureIoTClient 17:fa1bba4c6053 2693 break;
AzureIoTClient 17:fa1bba4c6053 2694 }
AzureIoTClient 17:fa1bba4c6053 2695 }
AzureIoTClient 17:fa1bba4c6053 2696
AzureIoTClient 17:fa1bba4c6053 2697 if (i < modelCount)
AzureIoTClient 17:fa1bba4c6053 2698 {
AzureIoTClient 17:fa1bba4c6053 2699 /* model found, check if there is more in the path */
AzureIoTClient 17:fa1bba4c6053 2700 if (slashPos == NULL)
AzureIoTClient 17:fa1bba4c6053 2701 {
AzureIoTClient 17:fa1bba4c6053 2702 /*Codes_SRS_SCHEMA_02_022: [ If the path reportedPropertyPath points to a sub-model, Schema_ModelReportedPropertyByPathExists shall succeed and true. ]*/
AzureIoTClient 17:fa1bba4c6053 2703 /* this is the last one, so this is the thing we were looking for */
AzureIoTClient 17:fa1bba4c6053 2704 result = true;
AzureIoTClient 17:fa1bba4c6053 2705 break;
AzureIoTClient 17:fa1bba4c6053 2706 }
AzureIoTClient 17:fa1bba4c6053 2707 else
AzureIoTClient 17:fa1bba4c6053 2708 {
AzureIoTClient 17:fa1bba4c6053 2709 /* continue looking, there's more */
AzureIoTClient 17:fa1bba4c6053 2710 reportedPropertyPath = slashPos + 1;
AzureIoTClient 17:fa1bba4c6053 2711 }
AzureIoTClient 17:fa1bba4c6053 2712 }
AzureIoTClient 17:fa1bba4c6053 2713 else
AzureIoTClient 17:fa1bba4c6053 2714 {
AzureIoTClient 17:fa1bba4c6053 2715 /* no model found, let's see if this is a property */
AzureIoTClient 17:fa1bba4c6053 2716 result = (VECTOR_find_if(modelType->reportedProperties, reportedPropertyExists, reportedPropertyPath) != NULL);
AzureIoTClient 17:fa1bba4c6053 2717 if (!result)
AzureIoTClient 17:fa1bba4c6053 2718 {
AzureIoTClient 17:fa1bba4c6053 2719 LogError("no such reported property \"%s\"", reportedPropertyPath);
AzureIoTClient 17:fa1bba4c6053 2720 }
AzureIoTClient 17:fa1bba4c6053 2721 break;
AzureIoTClient 17:fa1bba4c6053 2722 }
AzureIoTClient 17:fa1bba4c6053 2723 } while (slashPos != NULL);
AzureIoTClient 17:fa1bba4c6053 2724 }
AzureIoTClient 17:fa1bba4c6053 2725
AzureIoTClient 17:fa1bba4c6053 2726 return result;
AzureIoTClient 17:fa1bba4c6053 2727 }
AzureIoTClient 17:fa1bba4c6053 2728
AzureIoTClient 17:fa1bba4c6053 2729 static bool desiredPropertyExists(const void* element, const void* value)
AzureIoTClient 17:fa1bba4c6053 2730 {
AzureIoTClient 17:fa1bba4c6053 2731 SCHEMA_DESIRED_PROPERTY_HANDLE_DATA* desiredProperty = *(SCHEMA_DESIRED_PROPERTY_HANDLE_DATA**)element;
AzureIoTClient 17:fa1bba4c6053 2732 return (strcmp(desiredProperty->desiredPropertyName, value) == 0);
AzureIoTClient 17:fa1bba4c6053 2733 }
AzureIoTClient 17:fa1bba4c6053 2734
AzureIoTClient 17:fa1bba4c6053 2735 SCHEMA_RESULT Schema_AddModelDesiredProperty(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* desiredPropertyName, const char* desiredPropertyType, pfDesiredPropertyFromAGENT_DATA_TYPE desiredPropertyFromAGENT_DATA_TYPE, pfDesiredPropertyInitialize desiredPropertyInitialize, pfDesiredPropertyDeinitialize desiredPropertyDeinitialize, size_t offset, pfOnDesiredProperty onDesiredProperty)
AzureIoTClient 17:fa1bba4c6053 2736 {
AzureIoTClient 17:fa1bba4c6053 2737 SCHEMA_RESULT result;
AzureIoTClient 17:fa1bba4c6053 2738 /*Codes_SRS_SCHEMA_02_024: [ If modelTypeHandle is NULL then Schema_AddModelDesiredProperty shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 2739 /*Codes_SRS_SCHEMA_02_025: [ If desiredPropertyName is NULL then Schema_AddModelDesiredProperty shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 2740 /*Codes_SRS_SCHEMA_02_026: [ If desiredPropertyType is NULL then Schema_AddModelDesiredProperty shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 2741 /*Codes_SRS_SCHEMA_02_048: [ If desiredPropertyFromAGENT_DATA_TYPE is NULL then Schema_AddModelDesiredProperty shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 2742 /*Codes_SRS_SCHEMA_02_049: [ If desiredPropertyInitialize is NULL then Schema_AddModelDesiredProperty shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 2743 /*Codes_SRS_SCHEMA_02_050: [ If desiredPropertyDeinitialize is NULL then Schema_AddModelDesiredProperty shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 2744 if (
AzureIoTClient 17:fa1bba4c6053 2745 (modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2746 (desiredPropertyName == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2747 (desiredPropertyType == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2748 (desiredPropertyFromAGENT_DATA_TYPE == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2749 (desiredPropertyInitialize == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2750 (desiredPropertyDeinitialize== NULL)
AzureIoTClient 17:fa1bba4c6053 2751 )
AzureIoTClient 17:fa1bba4c6053 2752 {
AzureIoTClient 17:fa1bba4c6053 2753 LogError("invalid arg SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* desiredPropertyName=%p, const char* desiredPropertyType=%p, pfDesiredPropertyFromAGENT_DATA_TYPE desiredPropertyFromAGENT_DATA_TYPE=%p, pfDesiredPropertyInitialize desiredPropertyInitialize=%p, pfDesiredPropertyDeinitialize desiredPropertyDeinitialize=%p, size_t offset=%zu",
AzureIoTClient 17:fa1bba4c6053 2754 modelTypeHandle, desiredPropertyName, desiredPropertyType, desiredPropertyFromAGENT_DATA_TYPE, desiredPropertyInitialize, desiredPropertyDeinitialize, offset);
AzureIoTClient 17:fa1bba4c6053 2755 result = SCHEMA_INVALID_ARG;
AzureIoTClient 17:fa1bba4c6053 2756 }
AzureIoTClient 17:fa1bba4c6053 2757 else
AzureIoTClient 17:fa1bba4c6053 2758 {
AzureIoTClient 17:fa1bba4c6053 2759 SCHEMA_MODEL_TYPE_HANDLE_DATA* handleData = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 2760 /*Codes_SRS_SCHEMA_02_027: [ Schema_AddModelDesiredProperty shall add the desired property given by the name desiredPropertyName and the type desiredPropertyType to the collection of existing desired properties. ]*/
AzureIoTClient 17:fa1bba4c6053 2761 if (VECTOR_find_if(handleData->desiredProperties, desiredPropertyExists, desiredPropertyName) != NULL)
AzureIoTClient 17:fa1bba4c6053 2762 {
AzureIoTClient 17:fa1bba4c6053 2763 /*Codes_SRS_SCHEMA_02_047: [ If the desired property already exists, then Schema_AddModelDesiredProperty shall fail and return SCHEMA_DUPLICATE_ELEMENT. ]*/
AzureIoTClient 17:fa1bba4c6053 2764 LogError("unable to Schema_AddModelDesiredProperty because a desired property with the same name (%s) already exists", desiredPropertyName);
AzureIoTClient 17:fa1bba4c6053 2765 result = SCHEMA_DUPLICATE_ELEMENT;
AzureIoTClient 17:fa1bba4c6053 2766 }
AzureIoTClient 17:fa1bba4c6053 2767 else
AzureIoTClient 17:fa1bba4c6053 2768 {
AzureIoTClient 17:fa1bba4c6053 2769 SCHEMA_DESIRED_PROPERTY_HANDLE_DATA* desiredProperty = (SCHEMA_DESIRED_PROPERTY_HANDLE_DATA*)malloc(sizeof(SCHEMA_DESIRED_PROPERTY_HANDLE_DATA));
AzureIoTClient 17:fa1bba4c6053 2770 if (desiredProperty == NULL)
AzureIoTClient 17:fa1bba4c6053 2771 {
AzureIoTClient 17:fa1bba4c6053 2772 /*Codes_SRS_SCHEMA_02_028: [ If any failure occurs then Schema_AddModelDesiredProperty shall fail and return SCHEMA_ERROR. ]*/
AzureIoTClient 17:fa1bba4c6053 2773 LogError("failure in malloc");
AzureIoTClient 17:fa1bba4c6053 2774 result = SCHEMA_ERROR;
AzureIoTClient 17:fa1bba4c6053 2775 }
AzureIoTClient 17:fa1bba4c6053 2776 else
AzureIoTClient 17:fa1bba4c6053 2777 {
AzureIoTClient 17:fa1bba4c6053 2778 if (mallocAndStrcpy_s((char**)&desiredProperty->desiredPropertyName, desiredPropertyName) != 0)
AzureIoTClient 17:fa1bba4c6053 2779 {
AzureIoTClient 17:fa1bba4c6053 2780 /*Codes_SRS_SCHEMA_02_028: [ If any failure occurs then Schema_AddModelDesiredProperty shall fail and return SCHEMA_ERROR. ]*/
AzureIoTClient 17:fa1bba4c6053 2781 LogError("failure in mallocAndStrcpy_s");
AzureIoTClient 17:fa1bba4c6053 2782 free(desiredProperty);
AzureIoTClient 17:fa1bba4c6053 2783 result = SCHEMA_ERROR;
AzureIoTClient 17:fa1bba4c6053 2784 }
AzureIoTClient 17:fa1bba4c6053 2785 else
AzureIoTClient 17:fa1bba4c6053 2786 {
AzureIoTClient 17:fa1bba4c6053 2787 if (mallocAndStrcpy_s((char**)&desiredProperty->desiredPropertyType, desiredPropertyType) != 0)
AzureIoTClient 17:fa1bba4c6053 2788 {
AzureIoTClient 17:fa1bba4c6053 2789 /*Codes_SRS_SCHEMA_02_028: [ If any failure occurs then Schema_AddModelDesiredProperty shall fail and return SCHEMA_ERROR. ]*/
AzureIoTClient 17:fa1bba4c6053 2790 LogError("failure in mallocAndStrcpy_s");
AzureIoTClient 17:fa1bba4c6053 2791 free((void*)desiredProperty->desiredPropertyName);
AzureIoTClient 17:fa1bba4c6053 2792 free(desiredProperty);
AzureIoTClient 17:fa1bba4c6053 2793 result = SCHEMA_ERROR;
AzureIoTClient 17:fa1bba4c6053 2794 }
AzureIoTClient 17:fa1bba4c6053 2795 else
AzureIoTClient 17:fa1bba4c6053 2796 {
AzureIoTClient 17:fa1bba4c6053 2797 if (VECTOR_push_back(handleData->desiredProperties, &desiredProperty, 1) != 0)
AzureIoTClient 17:fa1bba4c6053 2798 {
AzureIoTClient 17:fa1bba4c6053 2799 /*Codes_SRS_SCHEMA_02_028: [ If any failure occurs then Schema_AddModelDesiredProperty shall fail and return SCHEMA_ERROR. ]*/
AzureIoTClient 17:fa1bba4c6053 2800 LogError("failure in VECTOR_push_back");
AzureIoTClient 17:fa1bba4c6053 2801 free((void*)desiredProperty->desiredPropertyType);
AzureIoTClient 17:fa1bba4c6053 2802 free((void*)desiredProperty->desiredPropertyName);
AzureIoTClient 17:fa1bba4c6053 2803 free(desiredProperty);
AzureIoTClient 17:fa1bba4c6053 2804 result = SCHEMA_ERROR;
AzureIoTClient 17:fa1bba4c6053 2805 }
AzureIoTClient 17:fa1bba4c6053 2806 else
AzureIoTClient 17:fa1bba4c6053 2807 {
AzureIoTClient 17:fa1bba4c6053 2808 /*Codes_SRS_SCHEMA_02_029: [ Otherwise, Schema_AddModelDesiredProperty shall succeed and return SCHEMA_OK. ]*/
AzureIoTClient 17:fa1bba4c6053 2809 desiredProperty->desiredPropertyFromAGENT_DATA_TYPE = desiredPropertyFromAGENT_DATA_TYPE;
AzureIoTClient 17:fa1bba4c6053 2810 desiredProperty->desiredPropertInitialize = desiredPropertyInitialize;
AzureIoTClient 17:fa1bba4c6053 2811 desiredProperty->desiredPropertDeinitialize = desiredPropertyDeinitialize;
AzureIoTClient 17:fa1bba4c6053 2812 desiredProperty->onDesiredProperty = onDesiredProperty; /*NULL is a perfectly fine value*/
AzureIoTClient 17:fa1bba4c6053 2813 desiredProperty->offset = offset;
AzureIoTClient 17:fa1bba4c6053 2814 result = SCHEMA_OK;
AzureIoTClient 17:fa1bba4c6053 2815 }
AzureIoTClient 17:fa1bba4c6053 2816 }
AzureIoTClient 17:fa1bba4c6053 2817 }
AzureIoTClient 17:fa1bba4c6053 2818 }
AzureIoTClient 17:fa1bba4c6053 2819 }
AzureIoTClient 17:fa1bba4c6053 2820 }
AzureIoTClient 17:fa1bba4c6053 2821 return result;
AzureIoTClient 17:fa1bba4c6053 2822 }
AzureIoTClient 17:fa1bba4c6053 2823
AzureIoTClient 17:fa1bba4c6053 2824
AzureIoTClient 17:fa1bba4c6053 2825 SCHEMA_RESULT Schema_GetModelDesiredPropertyCount(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t* desiredPropertyCount)
AzureIoTClient 17:fa1bba4c6053 2826 {
AzureIoTClient 17:fa1bba4c6053 2827 SCHEMA_RESULT result;
AzureIoTClient 17:fa1bba4c6053 2828 /*Codes_SRS_SCHEMA_02_030: [ If modelTypeHandle is NULL then Schema_GetModelDesiredPropertyCount shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 2829 /*Codes_SRS_SCHEMA_02_031: [ If desiredPropertyCount is NULL then Schema_GetModelDesiredPropertyCount shall fail and return SCHEMA_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 2830 if (
AzureIoTClient 17:fa1bba4c6053 2831 (modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2832 (desiredPropertyCount == NULL)
AzureIoTClient 17:fa1bba4c6053 2833 )
AzureIoTClient 17:fa1bba4c6053 2834 {
AzureIoTClient 17:fa1bba4c6053 2835 LogError("invalid arg: SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, size_t* desiredPropertyCount=%p", modelTypeHandle, desiredPropertyCount);
AzureIoTClient 17:fa1bba4c6053 2836 result = SCHEMA_INVALID_ARG;
AzureIoTClient 17:fa1bba4c6053 2837 }
AzureIoTClient 17:fa1bba4c6053 2838 else
AzureIoTClient 17:fa1bba4c6053 2839 {
AzureIoTClient 17:fa1bba4c6053 2840 /*Codes_SRS_SCHEMA_02_032: [ Otherwise, Schema_GetModelDesiredPropertyCount shall succeed and write in desiredPropertyCount the existing number of desired properties. ]*/
AzureIoTClient 17:fa1bba4c6053 2841 SCHEMA_MODEL_TYPE_HANDLE_DATA* handleData = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 2842 *desiredPropertyCount = VECTOR_size(handleData->desiredProperties);
AzureIoTClient 17:fa1bba4c6053 2843 result = SCHEMA_OK;
AzureIoTClient 17:fa1bba4c6053 2844 }
AzureIoTClient 17:fa1bba4c6053 2845 return result;
AzureIoTClient 17:fa1bba4c6053 2846 }
AzureIoTClient 17:fa1bba4c6053 2847
AzureIoTClient 17:fa1bba4c6053 2848 SCHEMA_DESIRED_PROPERTY_HANDLE Schema_GetModelDesiredPropertyByName(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* desiredPropertyName)
AzureIoTClient 17:fa1bba4c6053 2849 {
AzureIoTClient 17:fa1bba4c6053 2850 SCHEMA_DESIRED_PROPERTY_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 2851 /*Codes_SRS_SCHEMA_02_034: [ If modelTypeHandle is NULL then Schema_GetModelDesiredPropertyByName shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 2852 /*Codes_SRS_SCHEMA_02_035: [ If desiredPropertyName is NULL then Schema_GetModelDesiredPropertyByName shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 2853 if (
AzureIoTClient 17:fa1bba4c6053 2854 (modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2855 (desiredPropertyName == NULL)
AzureIoTClient 17:fa1bba4c6053 2856 )
AzureIoTClient 17:fa1bba4c6053 2857 {
AzureIoTClient 17:fa1bba4c6053 2858 LogError("invalid arg SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* desiredPropertyName=%p", modelTypeHandle, desiredPropertyName);
AzureIoTClient 17:fa1bba4c6053 2859 result = NULL;
AzureIoTClient 17:fa1bba4c6053 2860 }
AzureIoTClient 17:fa1bba4c6053 2861 else
AzureIoTClient 17:fa1bba4c6053 2862 {
AzureIoTClient 17:fa1bba4c6053 2863 /*Codes_SRS_SCHEMA_02_036: [ If a desired property having the name desiredPropertyName exists then Schema_GetModelDesiredPropertyByName shall succeed and return a non-NULL value. ]*/
AzureIoTClient 17:fa1bba4c6053 2864 /*Codes_SRS_SCHEMA_02_037: [ Otherwise, Schema_GetModelDesiredPropertyByName shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 2865 SCHEMA_MODEL_TYPE_HANDLE_DATA* handleData = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 2866 SCHEMA_DESIRED_PROPERTY_HANDLE* temp = VECTOR_find_if(handleData->desiredProperties, desiredPropertyExists, desiredPropertyName);
AzureIoTClient 17:fa1bba4c6053 2867 if (temp == NULL)
AzureIoTClient 17:fa1bba4c6053 2868 {
AzureIoTClient 17:fa1bba4c6053 2869 LogError("no such desired property by name %s", desiredPropertyName);
AzureIoTClient 17:fa1bba4c6053 2870 result = NULL;
AzureIoTClient 17:fa1bba4c6053 2871 }
AzureIoTClient 17:fa1bba4c6053 2872 else
AzureIoTClient 17:fa1bba4c6053 2873 {
AzureIoTClient 17:fa1bba4c6053 2874 result = *temp;
AzureIoTClient 17:fa1bba4c6053 2875 }
AzureIoTClient 17:fa1bba4c6053 2876 }
AzureIoTClient 17:fa1bba4c6053 2877 return result;
AzureIoTClient 17:fa1bba4c6053 2878 }
AzureIoTClient 17:fa1bba4c6053 2879
AzureIoTClient 17:fa1bba4c6053 2880 SCHEMA_DESIRED_PROPERTY_HANDLE Schema_GetModelDesiredPropertyByIndex(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, size_t index)
AzureIoTClient 17:fa1bba4c6053 2881 {
AzureIoTClient 17:fa1bba4c6053 2882 SCHEMA_DESIRED_PROPERTY_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 2883 /*Codes_SRS_SCHEMA_02_038: [ If modelTypeHandle is NULL then Schema_GetModelDesiredPropertyByIndex shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 2884 if (modelTypeHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 2885 {
AzureIoTClient 17:fa1bba4c6053 2886 LogError("invalid argument SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, size_t index=%p", modelTypeHandle, index);
AzureIoTClient 17:fa1bba4c6053 2887 result = NULL;
AzureIoTClient 17:fa1bba4c6053 2888 }
AzureIoTClient 17:fa1bba4c6053 2889 else
AzureIoTClient 17:fa1bba4c6053 2890 {
AzureIoTClient 17:fa1bba4c6053 2891 SCHEMA_MODEL_TYPE_HANDLE_DATA* handleData = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 2892 /*Codes_SRS_SCHEMA_02_039: [ If index is outside the range for existing indexes of desire properties, then Schema_GetModelDesiredPropertyByIndex shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 2893 /*Codes_SRS_SCHEMA_02_040: [ Otherwise, Schema_GetModelDesiredPropertyByIndex shall succeed and return a non-NULL value. ]*/
AzureIoTClient 17:fa1bba4c6053 2894 SCHEMA_DESIRED_PROPERTY_HANDLE* temp = VECTOR_element(handleData->desiredProperties, index);
AzureIoTClient 17:fa1bba4c6053 2895 if (temp == NULL)
AzureIoTClient 17:fa1bba4c6053 2896 {
AzureIoTClient 17:fa1bba4c6053 2897 LogError("VECTOR_element produced NULL (likely out of bounds index)");
AzureIoTClient 17:fa1bba4c6053 2898 result = NULL;
AzureIoTClient 17:fa1bba4c6053 2899 }
AzureIoTClient 17:fa1bba4c6053 2900 else
AzureIoTClient 17:fa1bba4c6053 2901 {
AzureIoTClient 17:fa1bba4c6053 2902 result = *temp;
AzureIoTClient 17:fa1bba4c6053 2903 }
AzureIoTClient 17:fa1bba4c6053 2904 }
AzureIoTClient 17:fa1bba4c6053 2905 return result;
AzureIoTClient 17:fa1bba4c6053 2906 }
AzureIoTClient 17:fa1bba4c6053 2907
AzureIoTClient 17:fa1bba4c6053 2908 bool Schema_ModelDesiredPropertyByPathExists(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* desiredPropertyPath)
AzureIoTClient 17:fa1bba4c6053 2909 {
AzureIoTClient 17:fa1bba4c6053 2910 bool result;
AzureIoTClient 17:fa1bba4c6053 2911 /*Codes_SRS_SCHEMA_02_041: [ If modelTypeHandle is NULL then Schema_ModelDesiredPropertyByPathExists shall fail and return false. ]*/
AzureIoTClient 17:fa1bba4c6053 2912 /*Codes_SRS_SCHEMA_02_042: [ If desiredPropertyPath is NULL then Schema_ModelDesiredPropertyByPathExists shall fail and return false. ]*/
AzureIoTClient 17:fa1bba4c6053 2913 if (
AzureIoTClient 17:fa1bba4c6053 2914 (modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 2915 (desiredPropertyPath == NULL)
AzureIoTClient 17:fa1bba4c6053 2916 )
AzureIoTClient 17:fa1bba4c6053 2917 {
AzureIoTClient 17:fa1bba4c6053 2918 LogError("invalid arg SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* desiredPropertyPath=%p", modelTypeHandle, desiredPropertyPath);
AzureIoTClient 17:fa1bba4c6053 2919 result = false;
AzureIoTClient 17:fa1bba4c6053 2920 }
AzureIoTClient 17:fa1bba4c6053 2921 else
AzureIoTClient 17:fa1bba4c6053 2922 {
AzureIoTClient 17:fa1bba4c6053 2923 const char* slashPos;
AzureIoTClient 17:fa1bba4c6053 2924
AzureIoTClient 17:fa1bba4c6053 2925 /*Codes_SRS_SCHEMA_02_044: [ If the desired property cannot be found Schema_ModelDesiredPropertyByPathExists shall fail and return false. ]*/
AzureIoTClient 17:fa1bba4c6053 2926 result = false;
AzureIoTClient 17:fa1bba4c6053 2927
AzureIoTClient 17:fa1bba4c6053 2928 /*Codes_SRS_SCHEMA_02_043: [ desiredPropertyPath shall be assumed to be in the format model1/model2/.../desiredPropertyName. ]*/
AzureIoTClient 17:fa1bba4c6053 2929 if (*desiredPropertyPath == '/')
AzureIoTClient 17:fa1bba4c6053 2930 {
AzureIoTClient 17:fa1bba4c6053 2931 desiredPropertyPath++;
AzureIoTClient 17:fa1bba4c6053 2932 }
AzureIoTClient 17:fa1bba4c6053 2933
AzureIoTClient 17:fa1bba4c6053 2934 do
AzureIoTClient 17:fa1bba4c6053 2935 {
AzureIoTClient 17:fa1bba4c6053 2936 const char* endPos;
AzureIoTClient 17:fa1bba4c6053 2937 size_t i;
AzureIoTClient 17:fa1bba4c6053 2938 size_t modelCount;
AzureIoTClient 17:fa1bba4c6053 2939 SCHEMA_MODEL_TYPE_HANDLE_DATA* modelType = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 2940
AzureIoTClient 17:fa1bba4c6053 2941 slashPos = strchr(desiredPropertyPath, '/');
AzureIoTClient 17:fa1bba4c6053 2942 endPos = slashPos;
AzureIoTClient 17:fa1bba4c6053 2943 if (endPos == NULL)
AzureIoTClient 17:fa1bba4c6053 2944 {
AzureIoTClient 17:fa1bba4c6053 2945 endPos = &desiredPropertyPath[strlen(desiredPropertyPath)];
AzureIoTClient 17:fa1bba4c6053 2946 }
AzureIoTClient 17:fa1bba4c6053 2947
AzureIoTClient 17:fa1bba4c6053 2948 modelCount = VECTOR_size(modelType->models);
AzureIoTClient 17:fa1bba4c6053 2949 for (i = 0; i < modelCount; i++)
AzureIoTClient 17:fa1bba4c6053 2950 {
AzureIoTClient 17:fa1bba4c6053 2951 MODEL_IN_MODEL* childModel = (MODEL_IN_MODEL*)VECTOR_element(modelType->models, i);
AzureIoTClient 17:fa1bba4c6053 2952 if ((strncmp(childModel->propertyName, desiredPropertyPath, endPos - desiredPropertyPath) == 0) &&
AzureIoTClient 17:fa1bba4c6053 2953 (strlen(childModel->propertyName) == (size_t)(endPos - desiredPropertyPath)))
AzureIoTClient 17:fa1bba4c6053 2954 {
AzureIoTClient 17:fa1bba4c6053 2955 /* found */
AzureIoTClient 17:fa1bba4c6053 2956 modelTypeHandle = childModel->modelHandle;
AzureIoTClient 17:fa1bba4c6053 2957 break;
AzureIoTClient 17:fa1bba4c6053 2958 }
AzureIoTClient 17:fa1bba4c6053 2959 }
AzureIoTClient 17:fa1bba4c6053 2960
AzureIoTClient 17:fa1bba4c6053 2961 if (i < modelCount)
AzureIoTClient 17:fa1bba4c6053 2962 {
AzureIoTClient 17:fa1bba4c6053 2963 /* model found, check if there is more in the path */
AzureIoTClient 17:fa1bba4c6053 2964 if (slashPos == NULL)
AzureIoTClient 17:fa1bba4c6053 2965 {
AzureIoTClient 17:fa1bba4c6053 2966 /*Codes_SRS_SCHEMA_02_045: [ If the path desiredPropertyPath points to a sub-model, Schema_ModelDesiredPropertyByPathExists shall succeed and true. ]*/
AzureIoTClient 17:fa1bba4c6053 2967 /* this is the last one, so this is the thing we were looking for */
AzureIoTClient 17:fa1bba4c6053 2968 result = true;
AzureIoTClient 17:fa1bba4c6053 2969 break;
AzureIoTClient 17:fa1bba4c6053 2970 }
AzureIoTClient 17:fa1bba4c6053 2971 else
AzureIoTClient 17:fa1bba4c6053 2972 {
AzureIoTClient 17:fa1bba4c6053 2973 /* continue looking, there's more */
AzureIoTClient 17:fa1bba4c6053 2974 desiredPropertyPath = slashPos + 1;
AzureIoTClient 17:fa1bba4c6053 2975 }
AzureIoTClient 17:fa1bba4c6053 2976 }
AzureIoTClient 17:fa1bba4c6053 2977 else
AzureIoTClient 17:fa1bba4c6053 2978 {
AzureIoTClient 17:fa1bba4c6053 2979 /* no model found, let's see if this is a property */
AzureIoTClient 17:fa1bba4c6053 2980 result = (VECTOR_find_if(modelType->desiredProperties, desiredPropertyExists, desiredPropertyPath) != NULL);
AzureIoTClient 17:fa1bba4c6053 2981 if (!result)
AzureIoTClient 17:fa1bba4c6053 2982 {
AzureIoTClient 17:fa1bba4c6053 2983 LogError("no such desired property \"%s\"", desiredPropertyPath);
AzureIoTClient 17:fa1bba4c6053 2984 }
AzureIoTClient 17:fa1bba4c6053 2985 break;
AzureIoTClient 17:fa1bba4c6053 2986 }
AzureIoTClient 17:fa1bba4c6053 2987 } while (slashPos != NULL);
AzureIoTClient 17:fa1bba4c6053 2988 }
AzureIoTClient 17:fa1bba4c6053 2989 return result;
AzureIoTClient 17:fa1bba4c6053 2990 }
AzureIoTClient 17:fa1bba4c6053 2991
AzureIoTClient 17:fa1bba4c6053 2992 const char* Schema_GetModelDesiredPropertyType(SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle)
AzureIoTClient 17:fa1bba4c6053 2993 {
AzureIoTClient 17:fa1bba4c6053 2994 const char* result;
AzureIoTClient 17:fa1bba4c6053 2995 /*Codes_SRS_SCHEMA_02_062: [ If desiredPropertyHandle is NULL then Schema_GetModelDesiredPropertyType shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 2996 if (desiredPropertyHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 2997 {
AzureIoTClient 17:fa1bba4c6053 2998 LogError("invalid argument SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle=%p", desiredPropertyHandle);
AzureIoTClient 17:fa1bba4c6053 2999 result = NULL;
AzureIoTClient 17:fa1bba4c6053 3000 }
AzureIoTClient 17:fa1bba4c6053 3001 else
AzureIoTClient 17:fa1bba4c6053 3002 {
AzureIoTClient 17:fa1bba4c6053 3003 /*Codes_SRS_SCHEMA_02_063: [ Otherwise, Schema_GetModelDesiredPropertyType shall return the type of the desired property. ]*/
AzureIoTClient 17:fa1bba4c6053 3004 SCHEMA_DESIRED_PROPERTY_HANDLE_DATA* desirePropertyHandleData = (SCHEMA_DESIRED_PROPERTY_HANDLE_DATA*)desiredPropertyHandle;
AzureIoTClient 17:fa1bba4c6053 3005 result = desirePropertyHandleData->desiredPropertyType;
AzureIoTClient 17:fa1bba4c6053 3006 }
AzureIoTClient 17:fa1bba4c6053 3007 return result;
AzureIoTClient 17:fa1bba4c6053 3008 }
AzureIoTClient 17:fa1bba4c6053 3009
AzureIoTClient 17:fa1bba4c6053 3010 pfDesiredPropertyFromAGENT_DATA_TYPE Schema_GetModelDesiredProperty_pfDesiredPropertyFromAGENT_DATA_TYPE(SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle)
AzureIoTClient 17:fa1bba4c6053 3011 {
AzureIoTClient 17:fa1bba4c6053 3012 pfDesiredPropertyFromAGENT_DATA_TYPE result;
AzureIoTClient 17:fa1bba4c6053 3013 if (desiredPropertyHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 3014 {
AzureIoTClient 17:fa1bba4c6053 3015 LogError("invalid argument SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle=%p", desiredPropertyHandle);
AzureIoTClient 17:fa1bba4c6053 3016 result = NULL;
AzureIoTClient 17:fa1bba4c6053 3017 }
AzureIoTClient 17:fa1bba4c6053 3018 else
AzureIoTClient 17:fa1bba4c6053 3019 {
AzureIoTClient 17:fa1bba4c6053 3020 SCHEMA_DESIRED_PROPERTY_HANDLE_DATA* desirePropertyHandleData = (SCHEMA_DESIRED_PROPERTY_HANDLE_DATA*)desiredPropertyHandle;
AzureIoTClient 17:fa1bba4c6053 3021 result = desirePropertyHandleData->desiredPropertyFromAGENT_DATA_TYPE;
AzureIoTClient 17:fa1bba4c6053 3022 }
AzureIoTClient 17:fa1bba4c6053 3023 return result;
AzureIoTClient 17:fa1bba4c6053 3024 }
AzureIoTClient 17:fa1bba4c6053 3025
AzureIoTClient 17:fa1bba4c6053 3026 pfOnDesiredProperty Schema_GetModelDesiredProperty_pfOnDesiredProperty(SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle)
AzureIoTClient 17:fa1bba4c6053 3027 {
AzureIoTClient 17:fa1bba4c6053 3028 pfOnDesiredProperty result;
AzureIoTClient 17:fa1bba4c6053 3029 /*Codes_SRS_SCHEMA_02_084: [ If desiredPropertyHandle is NULL then Schema_GetModelDesiredProperty_pfOnDesiredProperty shall return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 3030 if (desiredPropertyHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 3031 {
AzureIoTClient 17:fa1bba4c6053 3032 LogError("invalid argument SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle=%p", desiredPropertyHandle);
AzureIoTClient 17:fa1bba4c6053 3033 result = NULL;
AzureIoTClient 17:fa1bba4c6053 3034 }
AzureIoTClient 17:fa1bba4c6053 3035 else
AzureIoTClient 17:fa1bba4c6053 3036 {
AzureIoTClient 17:fa1bba4c6053 3037 /*Codes_SRS_SCHEMA_02_085: [ Otherwise Schema_GetModelDesiredProperty_pfOnDesiredProperty shall return the saved desired property callback. ]*/
AzureIoTClient 17:fa1bba4c6053 3038 SCHEMA_DESIRED_PROPERTY_HANDLE_DATA* desirePropertyHandleData = (SCHEMA_DESIRED_PROPERTY_HANDLE_DATA*)desiredPropertyHandle;
AzureIoTClient 17:fa1bba4c6053 3039 result = desirePropertyHandleData->onDesiredProperty;
AzureIoTClient 17:fa1bba4c6053 3040 }
AzureIoTClient 17:fa1bba4c6053 3041 return result;
AzureIoTClient 17:fa1bba4c6053 3042 }
AzureIoTClient 17:fa1bba4c6053 3043
AzureIoTClient 17:fa1bba4c6053 3044 size_t Schema_GetModelDesiredProperty_offset(SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle)
AzureIoTClient 17:fa1bba4c6053 3045 {
AzureIoTClient 17:fa1bba4c6053 3046 size_t result;
AzureIoTClient 17:fa1bba4c6053 3047 /*Codes_SRS_SCHEMA_02_060: [ If desiredPropertyHandle is NULL then Schema_GetModelDesiredProperty_offset shall fail and return 0. ]*/
AzureIoTClient 17:fa1bba4c6053 3048 if (desiredPropertyHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 3049 {
AzureIoTClient 17:fa1bba4c6053 3050 LogError("invalid argument SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle=%p", desiredPropertyHandle);
AzureIoTClient 17:fa1bba4c6053 3051 result = 0;
AzureIoTClient 17:fa1bba4c6053 3052 }
AzureIoTClient 17:fa1bba4c6053 3053 else
AzureIoTClient 17:fa1bba4c6053 3054 {
AzureIoTClient 17:fa1bba4c6053 3055 /*Codes_SRS_SCHEMA_02_061: [ Otherwise Schema_GetModelDesiredProperty_offset shall succeed and return the offset. ]*/
AzureIoTClient 17:fa1bba4c6053 3056 SCHEMA_DESIRED_PROPERTY_HANDLE_DATA* desirePropertyHandleData = (SCHEMA_DESIRED_PROPERTY_HANDLE_DATA*)desiredPropertyHandle;
AzureIoTClient 17:fa1bba4c6053 3057 result = desirePropertyHandleData->offset;
AzureIoTClient 17:fa1bba4c6053 3058 }
AzureIoTClient 17:fa1bba4c6053 3059 return result;
AzureIoTClient 17:fa1bba4c6053 3060 }
AzureIoTClient 17:fa1bba4c6053 3061
AzureIoTClient 17:fa1bba4c6053 3062 static bool modelInModelExists(const void* element, const void* value)
AzureIoTClient 17:fa1bba4c6053 3063 {
AzureIoTClient 17:fa1bba4c6053 3064 MODEL_IN_MODEL* modelInModel = (MODEL_IN_MODEL*)element;
AzureIoTClient 17:fa1bba4c6053 3065 return (strcmp(modelInModel->propertyName, value) == 0);
AzureIoTClient 17:fa1bba4c6053 3066 }
AzureIoTClient 17:fa1bba4c6053 3067
AzureIoTClient 17:fa1bba4c6053 3068 SCHEMA_MODEL_ELEMENT Schema_GetModelElementByName(SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle, const char* elementName)
AzureIoTClient 17:fa1bba4c6053 3069 {
AzureIoTClient 17:fa1bba4c6053 3070 SCHEMA_MODEL_ELEMENT result;
AzureIoTClient 17:fa1bba4c6053 3071 /*Codes_SRS_SCHEMA_02_076: [ If modelTypeHandle is NULL then Schema_GetModelElementByName shall fail and set SCHEMA_MODEL_ELEMENT.elementType to SCHEMA_SEARCH_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 3072 /*Codes_SRS_SCHEMA_02_077: [ If elementName is NULL then Schema_GetModelElementByName shall fail and set SCHEMA_MODEL_ELEMENT.elementType to SCHEMA_SEARCH_INVALID_ARG. ]*/
AzureIoTClient 17:fa1bba4c6053 3073 if (
AzureIoTClient 17:fa1bba4c6053 3074 (modelTypeHandle == NULL) ||
AzureIoTClient 17:fa1bba4c6053 3075 (elementName == NULL)
AzureIoTClient 17:fa1bba4c6053 3076 )
AzureIoTClient 17:fa1bba4c6053 3077 {
AzureIoTClient 17:fa1bba4c6053 3078 LogError("invalid argument SCHEMA_MODEL_TYPE_HANDLE modelTypeHandle=%p, const char* elementName=%p", modelTypeHandle, elementName);
AzureIoTClient 17:fa1bba4c6053 3079 result.elementType = SCHEMA_SEARCH_INVALID_ARG;
AzureIoTClient 17:fa1bba4c6053 3080 }
AzureIoTClient 17:fa1bba4c6053 3081 else
AzureIoTClient 17:fa1bba4c6053 3082 {
AzureIoTClient 17:fa1bba4c6053 3083 SCHEMA_MODEL_TYPE_HANDLE_DATA* handleData = (SCHEMA_MODEL_TYPE_HANDLE_DATA*)modelTypeHandle;
AzureIoTClient 17:fa1bba4c6053 3084
AzureIoTClient 17:fa1bba4c6053 3085 SCHEMA_DESIRED_PROPERTY_HANDLE* desiredPropertyHandle = VECTOR_find_if(handleData->desiredProperties, desiredPropertyExists, elementName);
AzureIoTClient 17:fa1bba4c6053 3086 if (desiredPropertyHandle != NULL)
AzureIoTClient 17:fa1bba4c6053 3087 {
AzureIoTClient 17:fa1bba4c6053 3088 /*Codes_SRS_SCHEMA_02_080: [ If elementName is a desired property then Schema_GetModelElementByName shall succeed and set SCHEMA_MODEL_ELEMENT.elementType to SCHEMA_DESIRED_PROPERTY and SCHEMA_MODEL_ELEMENT.elementHandle.desiredPropertyHandle to the handle of the desired property. ]*/
AzureIoTClient 17:fa1bba4c6053 3089 result.elementType = SCHEMA_DESIRED_PROPERTY;
AzureIoTClient 17:fa1bba4c6053 3090 result.elementHandle.desiredPropertyHandle = *desiredPropertyHandle;
AzureIoTClient 17:fa1bba4c6053 3091 }
AzureIoTClient 17:fa1bba4c6053 3092 else
AzureIoTClient 17:fa1bba4c6053 3093 {
AzureIoTClient 17:fa1bba4c6053 3094 size_t nProcessedProperties = 0;
AzureIoTClient 17:fa1bba4c6053 3095 SCHEMA_PROPERTY_HANDLE_DATA* property = NULL;
AzureIoTClient 17:fa1bba4c6053 3096 for (size_t i = 0; i < handleData->PropertyCount;i++)
AzureIoTClient 17:fa1bba4c6053 3097 {
AzureIoTClient 17:fa1bba4c6053 3098 property = (SCHEMA_PROPERTY_HANDLE_DATA*)(handleData->Properties[i]);
AzureIoTClient 17:fa1bba4c6053 3099 if (strcmp(property->PropertyName, elementName) == 0)
AzureIoTClient 17:fa1bba4c6053 3100 {
AzureIoTClient 17:fa1bba4c6053 3101 i = handleData->PropertyCount; /*found it*/
AzureIoTClient 17:fa1bba4c6053 3102 }
AzureIoTClient 17:fa1bba4c6053 3103 else
AzureIoTClient 17:fa1bba4c6053 3104 {
AzureIoTClient 17:fa1bba4c6053 3105 nProcessedProperties++;
AzureIoTClient 17:fa1bba4c6053 3106 }
AzureIoTClient 17:fa1bba4c6053 3107 }
AzureIoTClient 17:fa1bba4c6053 3108
AzureIoTClient 17:fa1bba4c6053 3109 if (nProcessedProperties < handleData->PropertyCount)
AzureIoTClient 17:fa1bba4c6053 3110 {
AzureIoTClient 17:fa1bba4c6053 3111 /*Codes_SRS_SCHEMA_02_078: [ If elementName is a property then Schema_GetModelElementByName shall succeed and set SCHEMA_MODEL_ELEMENT.elementType to SCHEMA_PROPERTY and SCHEMA_MODEL_ELEMENT.elementHandle.propertyHandle to the handle of the property. ]*/
AzureIoTClient 17:fa1bba4c6053 3112 result.elementType = SCHEMA_PROPERTY;
AzureIoTClient 17:fa1bba4c6053 3113 result.elementHandle.propertyHandle = property;
AzureIoTClient 17:fa1bba4c6053 3114 }
AzureIoTClient 17:fa1bba4c6053 3115 else
AzureIoTClient 17:fa1bba4c6053 3116 {
AzureIoTClient 17:fa1bba4c6053 3117
AzureIoTClient 17:fa1bba4c6053 3118 SCHEMA_REPORTED_PROPERTY_HANDLE* reportedPropertyHandle = VECTOR_find_if(handleData->reportedProperties, reportedPropertyExists, elementName);
AzureIoTClient 17:fa1bba4c6053 3119 if (reportedPropertyHandle != NULL)
AzureIoTClient 17:fa1bba4c6053 3120 {
AzureIoTClient 17:fa1bba4c6053 3121 /*Codes_SRS_SCHEMA_02_079: [ If elementName is a reported property then Schema_GetModelElementByName shall succeed and set SCHEMA_MODEL_ELEMENT.elementType to SCHEMA_REPORTED_PROPERTY and SCHEMA_MODEL_ELEMENT.elementHandle.reportedPropertyHandle to the handle of the reported property. ]*/
AzureIoTClient 17:fa1bba4c6053 3122 result.elementType = SCHEMA_REPORTED_PROPERTY;
AzureIoTClient 17:fa1bba4c6053 3123 result.elementHandle.reportedPropertyHandle = *reportedPropertyHandle;
AzureIoTClient 17:fa1bba4c6053 3124 }
AzureIoTClient 17:fa1bba4c6053 3125 else
AzureIoTClient 17:fa1bba4c6053 3126 {
AzureIoTClient 17:fa1bba4c6053 3127
AzureIoTClient 17:fa1bba4c6053 3128 size_t nProcessedActions = 0;
AzureIoTClient 17:fa1bba4c6053 3129 SCHEMA_ACTION_HANDLE_DATA* actionHandleData = NULL;
AzureIoTClient 17:fa1bba4c6053 3130 for (size_t i = 0;i < handleData->ActionCount; i++)
AzureIoTClient 17:fa1bba4c6053 3131 {
AzureIoTClient 17:fa1bba4c6053 3132 actionHandleData = (SCHEMA_ACTION_HANDLE_DATA*)(handleData->Actions[i]);
AzureIoTClient 17:fa1bba4c6053 3133 if (strcmp(actionHandleData->ActionName, elementName) == 0)
AzureIoTClient 17:fa1bba4c6053 3134 {
AzureIoTClient 17:fa1bba4c6053 3135 i = handleData->ActionCount; /*get out quickly*/
AzureIoTClient 17:fa1bba4c6053 3136 }
AzureIoTClient 17:fa1bba4c6053 3137 else
AzureIoTClient 17:fa1bba4c6053 3138 {
AzureIoTClient 17:fa1bba4c6053 3139 nProcessedActions++;
AzureIoTClient 17:fa1bba4c6053 3140 }
AzureIoTClient 17:fa1bba4c6053 3141 }
AzureIoTClient 17:fa1bba4c6053 3142
AzureIoTClient 17:fa1bba4c6053 3143 if (nProcessedActions < handleData->ActionCount)
AzureIoTClient 17:fa1bba4c6053 3144 {
AzureIoTClient 17:fa1bba4c6053 3145 /*Codes_SRS_SCHEMA_02_081: [ If elementName is a model action then Schema_GetModelElementByName shall succeed and set SCHEMA_MODEL_ELEMENT.elementType to SCHEMA_MODEL_ACTION and SCHEMA_MODEL_ELEMENT.elementHandle.actionHandle to the handle of the action. ]*/
AzureIoTClient 17:fa1bba4c6053 3146 result.elementType = SCHEMA_MODEL_ACTION;
AzureIoTClient 17:fa1bba4c6053 3147 result.elementHandle.actionHandle = actionHandleData;
AzureIoTClient 17:fa1bba4c6053 3148 }
AzureIoTClient 17:fa1bba4c6053 3149 else
AzureIoTClient 17:fa1bba4c6053 3150 {
AzureIoTClient 17:fa1bba4c6053 3151 MODEL_IN_MODEL* modelInModel = VECTOR_find_if(handleData->models, modelInModelExists, elementName);
AzureIoTClient 17:fa1bba4c6053 3152 if (modelInModel != NULL)
AzureIoTClient 17:fa1bba4c6053 3153 {
AzureIoTClient 17:fa1bba4c6053 3154 /*Codes_SRS_SCHEMA_02_082: [ If elementName is a model in model then Schema_GetModelElementByName shall succeed and set SCHEMA_MODEL_ELEMENT.elementType to SCHEMA_MODEL_IN_MODEL and SCHEMA_MODEL_ELEMENT.elementHandle.modelHandle to the handle of the model. ]*/
AzureIoTClient 17:fa1bba4c6053 3155 result.elementType = SCHEMA_MODEL_IN_MODEL;
AzureIoTClient 17:fa1bba4c6053 3156 result.elementHandle.modelHandle = modelInModel->modelHandle;
AzureIoTClient 17:fa1bba4c6053 3157 }
AzureIoTClient 17:fa1bba4c6053 3158 else
AzureIoTClient 17:fa1bba4c6053 3159 {
AzureIoTClient 17:fa1bba4c6053 3160 /*Codes_SRS_SCHEMA_02_083: [ Otherwise Schema_GetModelElementByName shall fail and set SCHEMA_MODEL_ELEMENT.elementType to SCHEMA_NOT_FOUND. ]*/
AzureIoTClient 17:fa1bba4c6053 3161 result.elementType = SCHEMA_NOT_FOUND;
AzureIoTClient 17:fa1bba4c6053 3162 }
AzureIoTClient 17:fa1bba4c6053 3163 }
AzureIoTClient 17:fa1bba4c6053 3164 }
AzureIoTClient 17:fa1bba4c6053 3165 }
AzureIoTClient 17:fa1bba4c6053 3166 }
AzureIoTClient 17:fa1bba4c6053 3167 }
AzureIoTClient 17:fa1bba4c6053 3168 return result;
AzureIoTClient 17:fa1bba4c6053 3169 }
AzureIoTClient 17:fa1bba4c6053 3170
AzureIoTClient 17:fa1bba4c6053 3171 pfDesiredPropertyDeinitialize Schema_GetModelDesiredProperty_pfDesiredPropertyDeinitialize(SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle)
AzureIoTClient 17:fa1bba4c6053 3172 {
AzureIoTClient 17:fa1bba4c6053 3173 pfDesiredPropertyDeinitialize result;
AzureIoTClient 17:fa1bba4c6053 3174 /*Ccodes_SRS_SCHEMA_02_064: [ If desiredPropertyHandle is NULL then Schema_GetModelDesiredProperty_pfDesiredPropertyDeinitialize shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 3175 if (desiredPropertyHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 3176 {
AzureIoTClient 17:fa1bba4c6053 3177 LogError("invalid argument SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle=%p", desiredPropertyHandle);
AzureIoTClient 17:fa1bba4c6053 3178 result = NULL;
AzureIoTClient 17:fa1bba4c6053 3179 }
AzureIoTClient 17:fa1bba4c6053 3180 else
AzureIoTClient 17:fa1bba4c6053 3181 {
AzureIoTClient 17:fa1bba4c6053 3182 /*Codes_SRS_SCHEMA_02_065: [ Otherwise Schema_GetModelDesiredProperty_pfDesiredPropertyDeinitialize shall return a non-NULL function pointer. ]*/
AzureIoTClient 17:fa1bba4c6053 3183 SCHEMA_DESIRED_PROPERTY_HANDLE_DATA* handleData = (SCHEMA_DESIRED_PROPERTY_HANDLE_DATA*)desiredPropertyHandle;
AzureIoTClient 17:fa1bba4c6053 3184 result = handleData->desiredPropertDeinitialize;
AzureIoTClient 17:fa1bba4c6053 3185 }
AzureIoTClient 17:fa1bba4c6053 3186 return result;
AzureIoTClient 17:fa1bba4c6053 3187 }
AzureIoTClient 17:fa1bba4c6053 3188
AzureIoTClient 17:fa1bba4c6053 3189 pfDesiredPropertyInitialize Schema_GetModelDesiredProperty_pfDesiredPropertyInitialize(SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle)
AzureIoTClient 17:fa1bba4c6053 3190 {
AzureIoTClient 17:fa1bba4c6053 3191 pfDesiredPropertyInitialize result;
AzureIoTClient 17:fa1bba4c6053 3192 /*Codes_SRS_SCHEMA_02_066: [ If desiredPropertyHandle is NULL then Schema_GetModelDesiredProperty_pfDesiredPropertyInitialize shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 3193 if (desiredPropertyHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 3194 {
AzureIoTClient 17:fa1bba4c6053 3195 LogError("invalid argument SCHEMA_DESIRED_PROPERTY_HANDLE desiredPropertyHandle=%p", desiredPropertyHandle);
AzureIoTClient 17:fa1bba4c6053 3196 result = NULL;
AzureIoTClient 17:fa1bba4c6053 3197 }
AzureIoTClient 17:fa1bba4c6053 3198 else
AzureIoTClient 17:fa1bba4c6053 3199 {
AzureIoTClient 17:fa1bba4c6053 3200 /*Codes_SRS_SCHEMA_02_067: [ Otherwise Schema_GetModelDesiredProperty_pfDesiredPropertyInitialize shall return a non-NULL function pointer. ]*/
AzureIoTClient 17:fa1bba4c6053 3201 SCHEMA_DESIRED_PROPERTY_HANDLE_DATA* handleData = (SCHEMA_DESIRED_PROPERTY_HANDLE_DATA*)desiredPropertyHandle;
AzureIoTClient 17:fa1bba4c6053 3202 result = handleData->desiredPropertInitialize;
AzureIoTClient 17:fa1bba4c6053 3203 }
AzureIoTClient 17:fa1bba4c6053 3204 return result;
AzureIoTClient 17:fa1bba4c6053 3205 }
AzureIoTClient 17:fa1bba4c6053 3206
AzureIoTClient 17:fa1bba4c6053 3207 static bool SchemaHasModel(const SCHEMA_HANDLE* schemaHandle, const char* modelName)
AzureIoTClient 17:fa1bba4c6053 3208 {
AzureIoTClient 17:fa1bba4c6053 3209 return (Schema_GetModelByName(*schemaHandle, modelName) != NULL);
AzureIoTClient 17:fa1bba4c6053 3210 }
AzureIoTClient 17:fa1bba4c6053 3211
AzureIoTClient 17:fa1bba4c6053 3212
AzureIoTClient 17:fa1bba4c6053 3213 SCHEMA_HANDLE Schema_GetSchemaForModel(const char* modelName)
AzureIoTClient 17:fa1bba4c6053 3214 {
AzureIoTClient 17:fa1bba4c6053 3215 SCHEMA_HANDLE result;
AzureIoTClient 17:fa1bba4c6053 3216 /*Codes_SRS_SCHEMA_02_093: [ If modelName is NULL then Schema_GetSchemaForModel shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 3217 if (modelName == NULL)
AzureIoTClient 17:fa1bba4c6053 3218 {
AzureIoTClient 17:fa1bba4c6053 3219 LogError("invalid arg const char* modelName=%p", modelName);
AzureIoTClient 17:fa1bba4c6053 3220 result = NULL;
AzureIoTClient 17:fa1bba4c6053 3221 }
AzureIoTClient 17:fa1bba4c6053 3222 else
AzureIoTClient 17:fa1bba4c6053 3223 {
AzureIoTClient 17:fa1bba4c6053 3224 /*Codes_SRS_SCHEMA_02_094: [ Schema_GetSchemaForModel shall find the SCHEMA_HANDLE that contains a model by name modelName and if found, succeed and return that. ]*/
AzureIoTClient 17:fa1bba4c6053 3225 SCHEMA_HANDLE* temp = VECTOR_find_if(g_schemas, (PREDICATE_FUNCTION)SchemaHasModel, modelName);
AzureIoTClient 17:fa1bba4c6053 3226
AzureIoTClient 17:fa1bba4c6053 3227 if (temp == NULL)
AzureIoTClient 17:fa1bba4c6053 3228 {
AzureIoTClient 17:fa1bba4c6053 3229 /*Codes_SRS_SCHEMA_02_095: [ If the model is not found in any schema, then Schema_GetSchemaForModel shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 3230 LogError("unable to find a schema that has a model named %s", modelName);
AzureIoTClient 17:fa1bba4c6053 3231 result = NULL;
AzureIoTClient 17:fa1bba4c6053 3232 }
AzureIoTClient 17:fa1bba4c6053 3233 else
AzureIoTClient 17:fa1bba4c6053 3234 {
AzureIoTClient 17:fa1bba4c6053 3235 /*Codes_SRS_SCHEMA_02_094: [ Schema_GetSchemaForModel shall find the SCHEMA_HANDLE that contains a model by name modelName and if found, succeed and return that. ]*/
AzureIoTClient 17:fa1bba4c6053 3236 result = *temp;
AzureIoTClient 17:fa1bba4c6053 3237 }
AzureIoTClient 17:fa1bba4c6053 3238 }
AzureIoTClient 17:fa1bba4c6053 3239
AzureIoTClient 17:fa1bba4c6053 3240 return result;
AzureIoTClient 17:fa1bba4c6053 3241 }
AzureIoTClient 17:fa1bba4c6053 3242
AzureIoTClient 17:fa1bba4c6053 3243 void* Schema_GetMetadata(SCHEMA_HANDLE schemaHandle)
AzureIoTClient 17:fa1bba4c6053 3244 {
AzureIoTClient 17:fa1bba4c6053 3245 void* result;
AzureIoTClient 17:fa1bba4c6053 3246 /*Codes_SRS_SCHEMA_02_091: [ If schemaHandle is NULL then Schema_GetMetadata shall fail and return NULL. ]*/
AzureIoTClient 17:fa1bba4c6053 3247 if (schemaHandle == NULL)
AzureIoTClient 17:fa1bba4c6053 3248 {
AzureIoTClient 17:fa1bba4c6053 3249 LogError("invalid arg SCHEMA_HANDLE schemaHandle=%p", schemaHandle);
AzureIoTClient 17:fa1bba4c6053 3250 result = NULL;
AzureIoTClient 17:fa1bba4c6053 3251 }
AzureIoTClient 17:fa1bba4c6053 3252 else
AzureIoTClient 17:fa1bba4c6053 3253 {
AzureIoTClient 17:fa1bba4c6053 3254 /*Codes_SRS_SCHEMA_02_092: [ Otherwise, Schema_GetMetadata shall succeed and return the saved metadata pointer. ]*/
AzureIoTClient 17:fa1bba4c6053 3255 result = ((SCHEMA_HANDLE_DATA*)schemaHandle)->metadata;
AzureIoTClient 17:fa1bba4c6053 3256 }
AzureIoTClient 17:fa1bba4c6053 3257 return result;
AzureIoTClient 17:fa1bba4c6053 3258 }