Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
serializer/src/schemaserializer.c@0:f7f1f0d76dd6, 2018-08-23 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |