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

Dependents:   samplemqtt

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 5 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 6
XinZhangMS 0:f7f1f0d76dd6 7 #include <stddef.h>
XinZhangMS 0:f7f1f0d76dd6 8 #include "schemaserializer.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 10 #include "azure_c_shared_utility/macro_utils.h"
XinZhangMS 0:f7f1f0d76dd6 11
XinZhangMS 0:f7f1f0d76dd6 12 DEFINE_ENUM_STRINGS(SCHEMA_SERIALIZER_RESULT, SCHEMA_SERIALIZER_RESULT_VALUES);
XinZhangMS 0:f7f1f0d76dd6 13
XinZhangMS 0:f7f1f0d76dd6 14 #define LOG_SCHEMA_SERIALIZER_ERROR(result) LogError("(result = %s)", ENUM_TO_STRING(SCHEMA_SERIALIZER_RESULT, (result)))
XinZhangMS 0:f7f1f0d76dd6 15
XinZhangMS 0:f7f1f0d76dd6 16 static const char* ConvertType(const char* sourceType)
XinZhangMS 0:f7f1f0d76dd6 17 {
XinZhangMS 0:f7f1f0d76dd6 18 /* Codes_SRS_SCHEMA_SERIALIZER_01_016: ["ascii_char_ptr" shall be translated to "string".] */
XinZhangMS 0:f7f1f0d76dd6 19 if (strcmp(sourceType, "ascii_char_ptr") == 0)
XinZhangMS 0:f7f1f0d76dd6 20 {
XinZhangMS 0:f7f1f0d76dd6 21 return "string";
XinZhangMS 0:f7f1f0d76dd6 22 }
XinZhangMS 0:f7f1f0d76dd6 23 else
XinZhangMS 0:f7f1f0d76dd6 24 {
XinZhangMS 0:f7f1f0d76dd6 25 /* Codes_SRS_SCHEMA_SERIALIZER_01_017: [All other types shall be kept as they are.] */
XinZhangMS 0:f7f1f0d76dd6 26 return sourceType;
XinZhangMS 0:f7f1f0d76dd6 27 }
XinZhangMS 0:f7f1f0d76dd6 28 }
XinZhangMS 0:f7f1f0d76dd6 29
XinZhangMS 0:f7f1f0d76dd6 30 /* Codes_SRS_SCHEMA_SERIALIZER_01_001: [SchemaSerializer_SerializeCommandMetadata shall serialize a specific model to a string using JSON as format.] */
XinZhangMS 0:f7f1f0d76dd6 31 SCHEMA_SERIALIZER_RESULT SchemaSerializer_SerializeCommandMetadata(SCHEMA_MODEL_TYPE_HANDLE modelHandle, STRING_HANDLE schemaText)
XinZhangMS 0:f7f1f0d76dd6 32 {
XinZhangMS 0:f7f1f0d76dd6 33 SCHEMA_SERIALIZER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 34
XinZhangMS 0:f7f1f0d76dd6 35 /* Codes_SRS_SCHEMA_SERIALIZER_01_013: [If the modelHandle argument is NULL, SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_INVALID_ARG.] */
XinZhangMS 0:f7f1f0d76dd6 36 if ((modelHandle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 37 /* Codes_SRS_SCHEMA_SERIALIZER_01_014: [If the schemaText argument is NULL, SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_INVALID_ARG.] */
XinZhangMS 0:f7f1f0d76dd6 38 (schemaText == NULL))
XinZhangMS 0:f7f1f0d76dd6 39 {
XinZhangMS 0:f7f1f0d76dd6 40 result = SCHEMA_SERIALIZER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 41 LogError("(result = %s), modelHandle = %p, schemaText = %p", ENUM_TO_STRING(SCHEMA_SERIALIZER_RESULT, result), modelHandle, schemaText);
XinZhangMS 0:f7f1f0d76dd6 42 }
XinZhangMS 0:f7f1f0d76dd6 43 else
XinZhangMS 0:f7f1f0d76dd6 44 {
XinZhangMS 0:f7f1f0d76dd6 45 size_t commandCount;
XinZhangMS 0:f7f1f0d76dd6 46
XinZhangMS 0:f7f1f0d76dd6 47 /* Codes_SRS_SCHEMA_SERIALIZER_01_002: [Only commands shall be serialized, the properties of a model shall be ignored.] */
XinZhangMS 0:f7f1f0d76dd6 48
XinZhangMS 0:f7f1f0d76dd6 49 /* Codes_SRS_SCHEMA_SERIALIZER_01_003: [The output JSON shall have an array, where each array element shall represent a command.] */
XinZhangMS 0:f7f1f0d76dd6 50 /* Codes_SRS_SCHEMA_SERIALIZER_01_011: [The JSON text shall be built into the string indicated by the schemaText argument by using String APIs.] */
XinZhangMS 0:f7f1f0d76dd6 51 if ((STRING_concat(schemaText, "[") != 0) ||
XinZhangMS 0:f7f1f0d76dd6 52 /* Codes_SRS_SCHEMA_SERIALIZER_01_006: [The object for a command shall have a member named Name, whose value shall be the command name as obtained by using Schema APIs.] */
XinZhangMS 0:f7f1f0d76dd6 53 (Schema_GetModelActionCount(modelHandle, &commandCount) != SCHEMA_OK))
XinZhangMS 0:f7f1f0d76dd6 54 {
XinZhangMS 0:f7f1f0d76dd6 55 /* Codes_SRS_SCHEMA_SERIALIZER_01_015: [If any of the Schema or String APIs fail then SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 56 result = SCHEMA_SERIALIZER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 57 LOG_SCHEMA_SERIALIZER_ERROR(result);
XinZhangMS 0:f7f1f0d76dd6 58 }
XinZhangMS 0:f7f1f0d76dd6 59 else
XinZhangMS 0:f7f1f0d76dd6 60 {
XinZhangMS 0:f7f1f0d76dd6 61 size_t i;
XinZhangMS 0:f7f1f0d76dd6 62
XinZhangMS 0:f7f1f0d76dd6 63 for (i = 0; i < commandCount; i++)
XinZhangMS 0:f7f1f0d76dd6 64 {
XinZhangMS 0:f7f1f0d76dd6 65 SCHEMA_ACTION_HANDLE actionHandle = Schema_GetModelActionByIndex(modelHandle, i);
XinZhangMS 0:f7f1f0d76dd6 66 const char* commandName;
XinZhangMS 0:f7f1f0d76dd6 67 size_t argCount;
XinZhangMS 0:f7f1f0d76dd6 68 size_t j;
XinZhangMS 0:f7f1f0d76dd6 69
XinZhangMS 0:f7f1f0d76dd6 70 /* Codes_SRS_SCHEMA_SERIALIZER_01_005: [Each array element shall be a JSON object.] */
XinZhangMS 0:f7f1f0d76dd6 71 if ((actionHandle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 72 (STRING_concat(schemaText, "{ \"Name\":\"") != 0) ||
XinZhangMS 0:f7f1f0d76dd6 73 ((commandName = Schema_GetModelActionName(actionHandle)) == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 74 (STRING_concat(schemaText, commandName) != 0) ||
XinZhangMS 0:f7f1f0d76dd6 75 /* Codes_SRS_SCHEMA_SERIALIZER_01_007: [The object for a command shall also have a "Parameters" member.] */
XinZhangMS 0:f7f1f0d76dd6 76 (STRING_concat(schemaText, "\", \"Parameters\":[") != 0) ||
XinZhangMS 0:f7f1f0d76dd6 77 (Schema_GetModelActionArgumentCount(actionHandle, &argCount) != SCHEMA_OK))
XinZhangMS 0:f7f1f0d76dd6 78 {
XinZhangMS 0:f7f1f0d76dd6 79 /* Codes_SRS_SCHEMA_SERIALIZER_01_015: [If any of the Schema or String APIs fail then SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 80 LogError("Failed encoding action.");
XinZhangMS 0:f7f1f0d76dd6 81 break;
XinZhangMS 0:f7f1f0d76dd6 82 }
XinZhangMS 0:f7f1f0d76dd6 83 else
XinZhangMS 0:f7f1f0d76dd6 84 {
XinZhangMS 0:f7f1f0d76dd6 85 for (j = 0; j < argCount; j++)
XinZhangMS 0:f7f1f0d76dd6 86 {
XinZhangMS 0:f7f1f0d76dd6 87 /* Codes_SRS_SCHEMA_SERIALIZER_01_008: [The parameters member shall be an array, where each entry is a command parameter.] */
XinZhangMS 0:f7f1f0d76dd6 88 SCHEMA_ACTION_ARGUMENT_HANDLE argHandle = Schema_GetModelActionArgumentByIndex(actionHandle, j);
XinZhangMS 0:f7f1f0d76dd6 89 const char* argName;
XinZhangMS 0:f7f1f0d76dd6 90 const char* argType;
XinZhangMS 0:f7f1f0d76dd6 91
XinZhangMS 0:f7f1f0d76dd6 92 /* Codes_SRS_SCHEMA_SERIALIZER_01_009: [Each command parameter shall have a member named "Name", that should have as value the command argument name as obtained by using Schema APIs.] */
XinZhangMS 0:f7f1f0d76dd6 93 if ((argHandle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 94 (STRING_concat(schemaText, "{\"Name\":\"") != 0) ||
XinZhangMS 0:f7f1f0d76dd6 95 ((argName = Schema_GetActionArgumentName(argHandle)) == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 96 (STRING_concat(schemaText, argName) != 0) ||
XinZhangMS 0:f7f1f0d76dd6 97 /* Codes_SRS_SCHEMA_SERIALIZER_01_010: [Each command parameter shall have a member named "Type", that should have as value the command argument type as obtained by using Schema APIs.] */
XinZhangMS 0:f7f1f0d76dd6 98 (STRING_concat(schemaText, "\",\"Type\":\"") != 0) ||
XinZhangMS 0:f7f1f0d76dd6 99 ((argType = Schema_GetActionArgumentType(argHandle)) == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 100 (STRING_concat(schemaText, ConvertType(argType)) != 0))
XinZhangMS 0:f7f1f0d76dd6 101 {
XinZhangMS 0:f7f1f0d76dd6 102 /* Codes_SRS_SCHEMA_SERIALIZER_01_015: [If any of the Schema or String APIs fail then SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 103 LogError("Failed encoding argument.");
XinZhangMS 0:f7f1f0d76dd6 104 break;
XinZhangMS 0:f7f1f0d76dd6 105 }
XinZhangMS 0:f7f1f0d76dd6 106 else
XinZhangMS 0:f7f1f0d76dd6 107 {
XinZhangMS 0:f7f1f0d76dd6 108 if (j + 1 < argCount)
XinZhangMS 0:f7f1f0d76dd6 109 {
XinZhangMS 0:f7f1f0d76dd6 110 if (STRING_concat(schemaText, "\"},") != 0)
XinZhangMS 0:f7f1f0d76dd6 111 {
XinZhangMS 0:f7f1f0d76dd6 112 /* Codes_SRS_SCHEMA_SERIALIZER_01_015: [If any of the Schema or String APIs fail then SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 113 LogError("Failed to concatenate arg end.");
XinZhangMS 0:f7f1f0d76dd6 114 break;
XinZhangMS 0:f7f1f0d76dd6 115 }
XinZhangMS 0:f7f1f0d76dd6 116 }
XinZhangMS 0:f7f1f0d76dd6 117 else
XinZhangMS 0:f7f1f0d76dd6 118 {
XinZhangMS 0:f7f1f0d76dd6 119 if (STRING_concat(schemaText, "\"}") != 0)
XinZhangMS 0:f7f1f0d76dd6 120 {
XinZhangMS 0:f7f1f0d76dd6 121 /* Codes_SRS_SCHEMA_SERIALIZER_01_015: [If any of the Schema or String APIs fail then SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 122 LogError("Failed to concatenate arg end.");
XinZhangMS 0:f7f1f0d76dd6 123 break;
XinZhangMS 0:f7f1f0d76dd6 124 }
XinZhangMS 0:f7f1f0d76dd6 125 }
XinZhangMS 0:f7f1f0d76dd6 126 }
XinZhangMS 0:f7f1f0d76dd6 127 }
XinZhangMS 0:f7f1f0d76dd6 128
XinZhangMS 0:f7f1f0d76dd6 129 if (j < argCount)
XinZhangMS 0:f7f1f0d76dd6 130 {
XinZhangMS 0:f7f1f0d76dd6 131 break;
XinZhangMS 0:f7f1f0d76dd6 132 }
XinZhangMS 0:f7f1f0d76dd6 133
XinZhangMS 0:f7f1f0d76dd6 134 if (i + 1 < commandCount)
XinZhangMS 0:f7f1f0d76dd6 135 {
XinZhangMS 0:f7f1f0d76dd6 136 if (STRING_concat(schemaText, "]},") != 0)
XinZhangMS 0:f7f1f0d76dd6 137 {
XinZhangMS 0:f7f1f0d76dd6 138 /* Codes_SRS_SCHEMA_SERIALIZER_01_015: [If any of the Schema or String APIs fail then SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 139 LogError("Failed to concatenate.");
XinZhangMS 0:f7f1f0d76dd6 140 break;
XinZhangMS 0:f7f1f0d76dd6 141 }
XinZhangMS 0:f7f1f0d76dd6 142 }
XinZhangMS 0:f7f1f0d76dd6 143 else
XinZhangMS 0:f7f1f0d76dd6 144 {
XinZhangMS 0:f7f1f0d76dd6 145 if (STRING_concat(schemaText, "]}") != 0)
XinZhangMS 0:f7f1f0d76dd6 146 {
XinZhangMS 0:f7f1f0d76dd6 147 /* Codes_SRS_SCHEMA_SERIALIZER_01_015: [If any of the Schema or String APIs fail then SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 148 LogError("Failed to concatenate.");
XinZhangMS 0:f7f1f0d76dd6 149 break;
XinZhangMS 0:f7f1f0d76dd6 150 }
XinZhangMS 0:f7f1f0d76dd6 151 }
XinZhangMS 0:f7f1f0d76dd6 152 }
XinZhangMS 0:f7f1f0d76dd6 153 }
XinZhangMS 0:f7f1f0d76dd6 154
XinZhangMS 0:f7f1f0d76dd6 155 if (i < commandCount)
XinZhangMS 0:f7f1f0d76dd6 156 {
XinZhangMS 0:f7f1f0d76dd6 157 result = SCHEMA_SERIALIZER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 158 }
XinZhangMS 0:f7f1f0d76dd6 159 else if (STRING_concat(schemaText, "]") != 0)
XinZhangMS 0:f7f1f0d76dd6 160 {
XinZhangMS 0:f7f1f0d76dd6 161 /* Codes_SRS_SCHEMA_SERIALIZER_01_015: [If any of the Schema or String APIs fail then SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 162 LogError("Failed to concatenate commands object end.");
XinZhangMS 0:f7f1f0d76dd6 163 result = SCHEMA_SERIALIZER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 164 }
XinZhangMS 0:f7f1f0d76dd6 165 else
XinZhangMS 0:f7f1f0d76dd6 166 {
XinZhangMS 0:f7f1f0d76dd6 167 /* Codes_SRS_SCHEMA_SERIALIZER_01_012: [On success SchemaSerializer_SerializeCommandMetadata shall return SCHEMA_SERIALIZER_OK.] */
XinZhangMS 0:f7f1f0d76dd6 168 result = SCHEMA_SERIALIZER_OK;
XinZhangMS 0:f7f1f0d76dd6 169 }
XinZhangMS 0:f7f1f0d76dd6 170 }
XinZhangMS 0:f7f1f0d76dd6 171 }
XinZhangMS 0:f7f1f0d76dd6 172
XinZhangMS 0:f7f1f0d76dd6 173 return result;
XinZhangMS 0:f7f1f0d76dd6 174 }