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 Jan 24 15:24:19 2017 -0800
Revision:
21:6d3dea1abd9c
Parent:
18:58b667752399
Child:
22:422d94bd3c18
1.1.5

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