A modelling and serializer library for Microsoft Azure IoTHub client applications

Dependents:   sht15_remote_monitoring f767zi_mqtt remote_monitoring simplesample_amqp ... more

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

Committer:
AzureIoTClient
Date:
Tue Sep 11 11:14:37 2018 -0700
Revision:
36:7d12a5386197
Parent:
21:6d3dea1abd9c
1.2.9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 4:233dd7616d73 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 4:233dd7616d73 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 4:233dd7616d73 3
Azure.IoT Build 10:c2aee3965a83 4 #include "azure_c_shared_utility/gballoc.h"
AzureIoTClient 20:58a5540c9721 5 #include "azure_c_shared_utility/crt_abstractions.h"
AzureIoTClient 4:233dd7616d73 6
AzureIoTClient 4:233dd7616d73 7 #include "jsondecoder.h"
AzureIoTClient 4:233dd7616d73 8 #include <stdio.h>
AzureIoTClient 4:233dd7616d73 9 #include <string.h>
AzureIoTClient 4:233dd7616d73 10 #include <ctype.h>
AzureIoTClient 4:233dd7616d73 11 #include <stddef.h>
AzureIoTClient 4:233dd7616d73 12
AzureIoTClient 4:233dd7616d73 13 #define IsWhiteSpace(A) (((A) == 0x20) || ((A) == 0x09) || ((A) == 0x0A) || ((A) == 0x0D))
AzureIoTClient 4:233dd7616d73 14
AzureIoTClient 4:233dd7616d73 15 typedef struct PARSER_STATE_TAG
AzureIoTClient 4:233dd7616d73 16 {
AzureIoTClient 4:233dd7616d73 17 char* json;
AzureIoTClient 4:233dd7616d73 18 } PARSER_STATE;
AzureIoTClient 4:233dd7616d73 19
AzureIoTClient 4:233dd7616d73 20 static JSON_DECODER_RESULT ParseArray(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode);
AzureIoTClient 4:233dd7616d73 21 static JSON_DECODER_RESULT ParseObject(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode);
AzureIoTClient 4:233dd7616d73 22
AzureIoTClient 4:233dd7616d73 23 /* Codes_SRS_JSON_DECODER_99_049:[ JSONDecoder shall not allocate new string values for the leafs, but rather point to strings in the original JSON.] */
AzureIoTClient 4:233dd7616d73 24 static void NoFreeFunction(void* value)
AzureIoTClient 4:233dd7616d73 25 {
AzureIoTClient 4:233dd7616d73 26 (void)value;
AzureIoTClient 4:233dd7616d73 27 }
AzureIoTClient 4:233dd7616d73 28
AzureIoTClient 4:233dd7616d73 29 static int NOPCloneFunction(void** destination, const void* source)
AzureIoTClient 4:233dd7616d73 30 {
AzureIoTClient 4:233dd7616d73 31 *destination = (void**)source;
AzureIoTClient 4:233dd7616d73 32 return 0;
AzureIoTClient 4:233dd7616d73 33 }
AzureIoTClient 4:233dd7616d73 34
AzureIoTClient 4:233dd7616d73 35 void SkipWhiteSpaces(PARSER_STATE* parserState)
AzureIoTClient 4:233dd7616d73 36 {
AzureIoTClient 4:233dd7616d73 37 while ((*(parserState->json) != '\0') && IsWhiteSpace(*(parserState->json)))
AzureIoTClient 4:233dd7616d73 38 {
AzureIoTClient 4:233dd7616d73 39 parserState->json++;
AzureIoTClient 4:233dd7616d73 40 }
AzureIoTClient 4:233dd7616d73 41 }
AzureIoTClient 4:233dd7616d73 42
AzureIoTClient 4:233dd7616d73 43 static JSON_DECODER_RESULT ParseString(PARSER_STATE* parserState, char** stringBegin)
AzureIoTClient 4:233dd7616d73 44 {
AzureIoTClient 4:233dd7616d73 45 JSON_DECODER_RESULT result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 46 *stringBegin = parserState->json;
AzureIoTClient 4:233dd7616d73 47
AzureIoTClient 4:233dd7616d73 48 /* Codes_SRS_JSON_DECODER_99_028:[ A string begins and ends with quotation marks.] */
AzureIoTClient 4:233dd7616d73 49 if (*(parserState->json) != '"')
AzureIoTClient 4:233dd7616d73 50 {
AzureIoTClient 4:233dd7616d73 51 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 52 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 53 }
AzureIoTClient 4:233dd7616d73 54 else
AzureIoTClient 4:233dd7616d73 55 {
AzureIoTClient 4:233dd7616d73 56 parserState->json++;
AzureIoTClient 4:233dd7616d73 57 while ((*(parserState->json) != '"') && (*(parserState->json) != '\0'))
AzureIoTClient 4:233dd7616d73 58 {
AzureIoTClient 4:233dd7616d73 59 /* Codes_SRS_JSON_DECODER_99_030:[ Any character may be escaped.] */
AzureIoTClient 4:233dd7616d73 60 /* Codes_SRS_JSON_DECODER_99_033:[ Alternatively, there are two-character sequence escape representations of some popular characters. So, for example, a string containing only a single reverse solidus character may be represented more compactly as "\\".] */
AzureIoTClient 4:233dd7616d73 61 if (*(parserState->json) == '\\')
AzureIoTClient 4:233dd7616d73 62 {
AzureIoTClient 4:233dd7616d73 63 parserState->json++;
AzureIoTClient 4:233dd7616d73 64 if (
AzureIoTClient 4:233dd7616d73 65 /* Codes_SRS_JSON_DECODER_99_051:[ %x5C / ; \ reverse solidus U+005C] */
AzureIoTClient 4:233dd7616d73 66 (*parserState->json == '\\') ||
AzureIoTClient 4:233dd7616d73 67 /* Codes_SRS_JSON_DECODER_99_050:[ %x22 / ; " quotation mark U+0022] */
AzureIoTClient 4:233dd7616d73 68 (*parserState->json == '"') ||
AzureIoTClient 4:233dd7616d73 69 /* Codes_SRS_JSON_DECODER_99_052:[ %x2F / ; / solidus U+002F] */
AzureIoTClient 4:233dd7616d73 70 (*parserState->json == '/') ||
AzureIoTClient 4:233dd7616d73 71 /* Codes_SRS_JSON_DECODER_99_053:[ %x62 / ; b backspace U+0008] */
AzureIoTClient 4:233dd7616d73 72 (*parserState->json == 'b') ||
AzureIoTClient 4:233dd7616d73 73 /* Codes_SRS_JSON_DECODER_99_054:[ %x66 / ; f form feed U+000C] */
AzureIoTClient 4:233dd7616d73 74 (*parserState->json == 'f') ||
AzureIoTClient 4:233dd7616d73 75 /* Codes_SRS_JSON_DECODER_99_055:[ %x6E / ; n line feed U+000A] */
AzureIoTClient 4:233dd7616d73 76 (*parserState->json == 'n') ||
AzureIoTClient 4:233dd7616d73 77 /* Codes_SRS_JSON_DECODER_99_056:[ %x72 / ; r carriage return U+000D] */
AzureIoTClient 4:233dd7616d73 78 (*parserState->json == 'r') ||
AzureIoTClient 4:233dd7616d73 79 /* Codes_SRS_JSON_DECODER_99_057:[ %x74 / ; t tab U+0009] */
AzureIoTClient 4:233dd7616d73 80 (*parserState->json == 't'))
AzureIoTClient 4:233dd7616d73 81 {
AzureIoTClient 4:233dd7616d73 82 parserState->json++;
AzureIoTClient 4:233dd7616d73 83 }
AzureIoTClient 4:233dd7616d73 84 else
AzureIoTClient 4:233dd7616d73 85 {
AzureIoTClient 4:233dd7616d73 86 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 87 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 88 break;
AzureIoTClient 4:233dd7616d73 89 }
AzureIoTClient 4:233dd7616d73 90 }
AzureIoTClient 4:233dd7616d73 91 else
AzureIoTClient 4:233dd7616d73 92 {
AzureIoTClient 4:233dd7616d73 93 parserState->json++;
AzureIoTClient 4:233dd7616d73 94 }
AzureIoTClient 4:233dd7616d73 95 }
AzureIoTClient 4:233dd7616d73 96
AzureIoTClient 4:233dd7616d73 97 if (*(parserState->json) != '"')
AzureIoTClient 4:233dd7616d73 98 {
AzureIoTClient 4:233dd7616d73 99 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 100 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 101 }
AzureIoTClient 4:233dd7616d73 102 else
AzureIoTClient 4:233dd7616d73 103 {
AzureIoTClient 4:233dd7616d73 104 parserState->json++;
AzureIoTClient 4:233dd7616d73 105 result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 106 }
AzureIoTClient 4:233dd7616d73 107 }
AzureIoTClient 4:233dd7616d73 108
AzureIoTClient 4:233dd7616d73 109 return result;
AzureIoTClient 4:233dd7616d73 110 }
AzureIoTClient 4:233dd7616d73 111
AzureIoTClient 4:233dd7616d73 112 static JSON_DECODER_RESULT ParseNumber(PARSER_STATE* parserState)
AzureIoTClient 4:233dd7616d73 113 {
AzureIoTClient 4:233dd7616d73 114 JSON_DECODER_RESULT result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 115 size_t digitCount = 0;
AzureIoTClient 4:233dd7616d73 116
AzureIoTClient 4:233dd7616d73 117 if (*(parserState->json) == '-')
AzureIoTClient 4:233dd7616d73 118 {
AzureIoTClient 4:233dd7616d73 119 parserState->json++;
AzureIoTClient 4:233dd7616d73 120 }
AzureIoTClient 4:233dd7616d73 121
AzureIoTClient 4:233dd7616d73 122 /* Codes_SRS_JSON_DECODER_99_043:[ A number contains an integer component that may be prefixed with an optional minus sign, which may be followed by a fraction part and/or an exponent part.] */
AzureIoTClient 4:233dd7616d73 123 while (*(parserState->json) != '\0')
AzureIoTClient 4:233dd7616d73 124 {
AzureIoTClient 4:233dd7616d73 125 /* Codes_SRS_JSON_DECODER_99_044:[ Octal and hex forms are not allowed.] */
AzureIoTClient 19:9e5049fd4c5b 126 if (ISDIGIT(*(parserState->json)))
AzureIoTClient 4:233dd7616d73 127 {
AzureIoTClient 4:233dd7616d73 128 digitCount++;
AzureIoTClient 4:233dd7616d73 129 /* simply continue */
AzureIoTClient 4:233dd7616d73 130 }
AzureIoTClient 4:233dd7616d73 131 else
AzureIoTClient 4:233dd7616d73 132 {
AzureIoTClient 4:233dd7616d73 133 break;
AzureIoTClient 4:233dd7616d73 134 }
AzureIoTClient 4:233dd7616d73 135
AzureIoTClient 4:233dd7616d73 136 parserState->json++;
AzureIoTClient 4:233dd7616d73 137 }
AzureIoTClient 4:233dd7616d73 138
AzureIoTClient 4:233dd7616d73 139 if ((digitCount == 0) ||
AzureIoTClient 4:233dd7616d73 140 /* Codes_SRS_JSON_DECODER_99_045:[ Leading zeros are not allowed.] */
AzureIoTClient 4:233dd7616d73 141 ((digitCount > 1) && *(parserState->json - digitCount) == '0'))
AzureIoTClient 4:233dd7616d73 142 {
AzureIoTClient 4:233dd7616d73 143 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 144 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 145 }
AzureIoTClient 4:233dd7616d73 146 else
AzureIoTClient 4:233dd7616d73 147 {
AzureIoTClient 4:233dd7616d73 148 /* Codes_SRS_JSON_DECODER_99_046:[ A fraction part is a decimal point followed by one or more digits.] */
AzureIoTClient 4:233dd7616d73 149 if (*(parserState->json) == '.')
AzureIoTClient 4:233dd7616d73 150 {
AzureIoTClient 4:233dd7616d73 151 /* optional fractional part */
AzureIoTClient 4:233dd7616d73 152 parserState->json++;
AzureIoTClient 4:233dd7616d73 153 digitCount = 0;
AzureIoTClient 4:233dd7616d73 154
AzureIoTClient 4:233dd7616d73 155 while (*(parserState->json) != '\0')
AzureIoTClient 4:233dd7616d73 156 {
AzureIoTClient 4:233dd7616d73 157 /* Codes_SRS_JSON_DECODER_99_044:[ Octal and hex forms are not allowed.] */
AzureIoTClient 19:9e5049fd4c5b 158 if (ISDIGIT(*(parserState->json)))
AzureIoTClient 4:233dd7616d73 159 {
AzureIoTClient 4:233dd7616d73 160 digitCount++;
AzureIoTClient 4:233dd7616d73 161 /* simply continue */
AzureIoTClient 4:233dd7616d73 162 }
AzureIoTClient 4:233dd7616d73 163 else
AzureIoTClient 4:233dd7616d73 164 {
AzureIoTClient 4:233dd7616d73 165 break;
AzureIoTClient 4:233dd7616d73 166 }
AzureIoTClient 4:233dd7616d73 167
AzureIoTClient 4:233dd7616d73 168 parserState->json++;
AzureIoTClient 4:233dd7616d73 169 }
AzureIoTClient 4:233dd7616d73 170
AzureIoTClient 4:233dd7616d73 171 if (digitCount == 0)
AzureIoTClient 4:233dd7616d73 172 {
AzureIoTClient 4:233dd7616d73 173 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 174 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 175 }
AzureIoTClient 4:233dd7616d73 176 }
AzureIoTClient 4:233dd7616d73 177
AzureIoTClient 4:233dd7616d73 178 /* Codes_SRS_JSON_DECODER_99_047:[ An exponent part begins with the letter E in upper or lowercase, which may be followed by a plus or minus sign.] */
AzureIoTClient 4:233dd7616d73 179 if ((*(parserState->json) == 'e') || (*(parserState->json) == 'E'))
AzureIoTClient 4:233dd7616d73 180 {
AzureIoTClient 4:233dd7616d73 181 parserState->json++;
AzureIoTClient 4:233dd7616d73 182
AzureIoTClient 4:233dd7616d73 183 /* optional sign */
AzureIoTClient 4:233dd7616d73 184 if ((*(parserState->json) == '-') || (*(parserState->json) == '+'))
AzureIoTClient 4:233dd7616d73 185 {
AzureIoTClient 4:233dd7616d73 186 parserState->json++;
AzureIoTClient 4:233dd7616d73 187 }
AzureIoTClient 4:233dd7616d73 188
AzureIoTClient 4:233dd7616d73 189 digitCount = 0;
AzureIoTClient 4:233dd7616d73 190
AzureIoTClient 4:233dd7616d73 191 /* Codes_SRS_JSON_DECODER_99_048:[ The E and optional sign are followed by one or more digits.] */
AzureIoTClient 4:233dd7616d73 192 while (*(parserState->json) != '\0')
AzureIoTClient 4:233dd7616d73 193 {
AzureIoTClient 4:233dd7616d73 194 /* Codes_SRS_JSON_DECODER_99_044:[ Octal and hex forms are not allowed.] */
AzureIoTClient 19:9e5049fd4c5b 195 if (ISDIGIT(*(parserState->json)))
AzureIoTClient 4:233dd7616d73 196 {
AzureIoTClient 4:233dd7616d73 197 digitCount++;
AzureIoTClient 4:233dd7616d73 198 /* simply continue */
AzureIoTClient 4:233dd7616d73 199 }
AzureIoTClient 4:233dd7616d73 200 else
AzureIoTClient 4:233dd7616d73 201 {
AzureIoTClient 4:233dd7616d73 202 break;
AzureIoTClient 4:233dd7616d73 203 }
AzureIoTClient 4:233dd7616d73 204
AzureIoTClient 4:233dd7616d73 205 parserState->json++;
AzureIoTClient 4:233dd7616d73 206 }
AzureIoTClient 4:233dd7616d73 207
AzureIoTClient 4:233dd7616d73 208 if (digitCount == 0)
AzureIoTClient 4:233dd7616d73 209 {
AzureIoTClient 4:233dd7616d73 210 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 211 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 212 }
AzureIoTClient 4:233dd7616d73 213 }
AzureIoTClient 4:233dd7616d73 214 }
AzureIoTClient 4:233dd7616d73 215
AzureIoTClient 4:233dd7616d73 216 return result;
AzureIoTClient 4:233dd7616d73 217 }
AzureIoTClient 4:233dd7616d73 218
AzureIoTClient 4:233dd7616d73 219 static JSON_DECODER_RESULT ParseValue(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode, char** stringBegin)
AzureIoTClient 4:233dd7616d73 220 {
AzureIoTClient 4:233dd7616d73 221 JSON_DECODER_RESULT result;
AzureIoTClient 4:233dd7616d73 222
AzureIoTClient 4:233dd7616d73 223 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 224
AzureIoTClient 4:233dd7616d73 225 if (*(parserState->json) == '"')
AzureIoTClient 4:233dd7616d73 226 {
AzureIoTClient 4:233dd7616d73 227 result = ParseString(parserState, stringBegin);
AzureIoTClient 4:233dd7616d73 228 }
AzureIoTClient 4:233dd7616d73 229 /* Codes_SRS_JSON_DECODER_99_018:[ A JSON value MUST be an object, array, number, or string, or one of the following three literal names: false null true] */
AzureIoTClient 4:233dd7616d73 230 /* Codes_SRS_JSON_DECODER_99_019:[ The literal names MUST be lowercase.] */
AzureIoTClient 4:233dd7616d73 231 /* Codes_SRS_JSON_DECODER_99_020:[ No other literal names are allowed.] */
AzureIoTClient 4:233dd7616d73 232 else if (strncmp(parserState->json, "false", 5) == 0)
AzureIoTClient 4:233dd7616d73 233 {
AzureIoTClient 4:233dd7616d73 234 *stringBegin = parserState->json;
AzureIoTClient 4:233dd7616d73 235 parserState->json += 5;
AzureIoTClient 4:233dd7616d73 236 result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 237 }
AzureIoTClient 4:233dd7616d73 238 else if (strncmp(parserState->json, "true", 4) == 0)
AzureIoTClient 4:233dd7616d73 239 {
AzureIoTClient 4:233dd7616d73 240 *stringBegin = parserState->json;
AzureIoTClient 4:233dd7616d73 241 parserState->json += 4;
AzureIoTClient 4:233dd7616d73 242 result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 243 }
AzureIoTClient 4:233dd7616d73 244 else if (strncmp(parserState->json, "null", 4) == 0)
AzureIoTClient 4:233dd7616d73 245 {
AzureIoTClient 4:233dd7616d73 246 *stringBegin = parserState->json;
AzureIoTClient 4:233dd7616d73 247 parserState->json += 4;
AzureIoTClient 4:233dd7616d73 248 result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 249 }
AzureIoTClient 4:233dd7616d73 250 /* Tests_SRS_JSON_DECODER_99_018:[ A JSON value MUST be an object, array, number, or string, or one of the following three literal names: false null true] */
AzureIoTClient 4:233dd7616d73 251 else if (*(parserState->json) == '[')
AzureIoTClient 4:233dd7616d73 252 {
AzureIoTClient 4:233dd7616d73 253 result = ParseArray(parserState, currentNode);
AzureIoTClient 4:233dd7616d73 254 *stringBegin = NULL;
AzureIoTClient 4:233dd7616d73 255 }
AzureIoTClient 4:233dd7616d73 256 else if (*(parserState->json) == '{')
AzureIoTClient 4:233dd7616d73 257 {
AzureIoTClient 4:233dd7616d73 258 result = ParseObject(parserState, currentNode);
AzureIoTClient 4:233dd7616d73 259 *stringBegin = NULL;
AzureIoTClient 4:233dd7616d73 260 }
AzureIoTClient 4:233dd7616d73 261 else if (
AzureIoTClient 4:233dd7616d73 262 (
AzureIoTClient 19:9e5049fd4c5b 263 ISDIGIT(*(parserState->json))
AzureIoTClient 4:233dd7616d73 264 )
AzureIoTClient 4:233dd7616d73 265 || (*(parserState->json) == '-'))
AzureIoTClient 4:233dd7616d73 266 {
AzureIoTClient 4:233dd7616d73 267 *stringBegin = parserState->json;
AzureIoTClient 4:233dd7616d73 268 result = ParseNumber(parserState);
AzureIoTClient 4:233dd7616d73 269 }
AzureIoTClient 4:233dd7616d73 270 else
AzureIoTClient 4:233dd7616d73 271 {
AzureIoTClient 4:233dd7616d73 272 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 273 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 274 }
AzureIoTClient 4:233dd7616d73 275
AzureIoTClient 4:233dd7616d73 276 return result;
AzureIoTClient 4:233dd7616d73 277 }
AzureIoTClient 4:233dd7616d73 278
AzureIoTClient 4:233dd7616d73 279 static JSON_DECODER_RESULT ParseColon(PARSER_STATE* parserState)
AzureIoTClient 4:233dd7616d73 280 {
AzureIoTClient 4:233dd7616d73 281 JSON_DECODER_RESULT result;
AzureIoTClient 4:233dd7616d73 282
AzureIoTClient 4:233dd7616d73 283 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 284 /* Codes_SRS_JSON_DECODER_99_023:[ A single colon comes after each name, separating the name from the value.] */
AzureIoTClient 4:233dd7616d73 285 if (*(parserState->json) != ':')
AzureIoTClient 4:233dd7616d73 286 {
AzureIoTClient 4:233dd7616d73 287 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 288 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 289 }
AzureIoTClient 4:233dd7616d73 290 else
AzureIoTClient 4:233dd7616d73 291 {
AzureIoTClient 4:233dd7616d73 292 parserState->json++;
AzureIoTClient 4:233dd7616d73 293 result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 294 }
AzureIoTClient 4:233dd7616d73 295
AzureIoTClient 4:233dd7616d73 296 return result;
AzureIoTClient 4:233dd7616d73 297 }
AzureIoTClient 4:233dd7616d73 298
AzureIoTClient 4:233dd7616d73 299 static JSON_DECODER_RESULT ParseOpenCurly(PARSER_STATE* parserState)
AzureIoTClient 4:233dd7616d73 300 {
AzureIoTClient 4:233dd7616d73 301 JSON_DECODER_RESULT result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 302
AzureIoTClient 4:233dd7616d73 303 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 304
AzureIoTClient 4:233dd7616d73 305 /* Codes_SRS_JSON_DECODER_99_021:[ An object structure is represented as a pair of curly brackets surrounding zero or more name/value pairs (or members).] */
AzureIoTClient 4:233dd7616d73 306 if (*(parserState->json) != '{')
AzureIoTClient 4:233dd7616d73 307 {
AzureIoTClient 4:233dd7616d73 308 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 309 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 310 }
AzureIoTClient 4:233dd7616d73 311 else
AzureIoTClient 4:233dd7616d73 312 {
AzureIoTClient 4:233dd7616d73 313 parserState->json++;
AzureIoTClient 4:233dd7616d73 314 result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 315 }
AzureIoTClient 4:233dd7616d73 316
AzureIoTClient 4:233dd7616d73 317 return result;
AzureIoTClient 4:233dd7616d73 318 }
AzureIoTClient 4:233dd7616d73 319
AzureIoTClient 4:233dd7616d73 320 static JSON_DECODER_RESULT ParseNameValuePair(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode)
AzureIoTClient 4:233dd7616d73 321 {
AzureIoTClient 4:233dd7616d73 322 JSON_DECODER_RESULT result;
AzureIoTClient 4:233dd7616d73 323 char* memberNameBegin;
AzureIoTClient 4:233dd7616d73 324
AzureIoTClient 4:233dd7616d73 325 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 326
AzureIoTClient 4:233dd7616d73 327 /* Codes_SRS_JSON_DECODER_99_022:[ A name is a string.] */
AzureIoTClient 4:233dd7616d73 328 result = ParseString(parserState, &memberNameBegin);
AzureIoTClient 4:233dd7616d73 329 if (result == JSON_DECODER_OK)
AzureIoTClient 4:233dd7616d73 330 {
AzureIoTClient 4:233dd7616d73 331 char* valueBegin;
AzureIoTClient 4:233dd7616d73 332 MULTITREE_HANDLE childNode;
AzureIoTClient 4:233dd7616d73 333 *(parserState->json - 1) = 0;
AzureIoTClient 4:233dd7616d73 334
AzureIoTClient 4:233dd7616d73 335 result = ParseColon(parserState);
AzureIoTClient 4:233dd7616d73 336 if (result == JSON_DECODER_OK)
AzureIoTClient 4:233dd7616d73 337 {
AzureIoTClient 4:233dd7616d73 338 /* Codes_SRS_JSON_DECODER_99_025:[ The names within an object SHOULD be unique.] */
AzureIoTClient 4:233dd7616d73 339 /* Multi Tree takes care of not having 2 children with the same name */
AzureIoTClient 4:233dd7616d73 340 /* Codes_SRS_JSON_DECODER_99_002:[ JSONDecoder_JSON_To_MultiTree shall use the MultiTree APIs to create the multi tree and add leafs to the multi tree.] */
AzureIoTClient 4:233dd7616d73 341 /* Codes_SRS_JSON_DECODER_99_003:[ When a JSON element is decoded from the JSON object then a leaf shall be added to the MultiTree.] */
AzureIoTClient 4:233dd7616d73 342 /* Codes_SRS_JSON_DECODER_99_004:[ The leaf node name in the multi tree shall be the JSON element name.] */
AzureIoTClient 4:233dd7616d73 343 if (MultiTree_AddChild(currentNode, memberNameBegin + 1, &childNode) != MULTITREE_OK)
AzureIoTClient 4:233dd7616d73 344 {
AzureIoTClient 4:233dd7616d73 345 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
AzureIoTClient 4:233dd7616d73 346 result = JSON_DECODER_MULTITREE_FAILED;
AzureIoTClient 4:233dd7616d73 347 }
AzureIoTClient 4:233dd7616d73 348 else
AzureIoTClient 4:233dd7616d73 349 {
AzureIoTClient 4:233dd7616d73 350 result = ParseValue(parserState, childNode, &valueBegin);
AzureIoTClient 4:233dd7616d73 351 if ((result == JSON_DECODER_OK) && (valueBegin != NULL))
AzureIoTClient 4:233dd7616d73 352 {
AzureIoTClient 4:233dd7616d73 353 /* Codes_SRS_JSON_DECODER_99_005:[ The leaf node added in the multi tree shall have the value the string value of the JSON element as parsed from the JSON object.] */
AzureIoTClient 4:233dd7616d73 354 if (MultiTree_SetValue(childNode, valueBegin) != MULTITREE_OK)
AzureIoTClient 4:233dd7616d73 355 {
AzureIoTClient 4:233dd7616d73 356 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
AzureIoTClient 4:233dd7616d73 357 result = JSON_DECODER_MULTITREE_FAILED;
AzureIoTClient 4:233dd7616d73 358 }
AzureIoTClient 4:233dd7616d73 359 }
AzureIoTClient 4:233dd7616d73 360 }
AzureIoTClient 4:233dd7616d73 361 }
AzureIoTClient 4:233dd7616d73 362 }
AzureIoTClient 4:233dd7616d73 363
AzureIoTClient 4:233dd7616d73 364 return result;
AzureIoTClient 4:233dd7616d73 365 }
AzureIoTClient 4:233dd7616d73 366
AzureIoTClient 4:233dd7616d73 367 static JSON_DECODER_RESULT ParseObject(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode)
AzureIoTClient 4:233dd7616d73 368 {
AzureIoTClient 4:233dd7616d73 369 JSON_DECODER_RESULT result = ParseOpenCurly(parserState);
AzureIoTClient 4:233dd7616d73 370 if (result == JSON_DECODER_OK)
AzureIoTClient 4:233dd7616d73 371 {
AzureIoTClient 4:233dd7616d73 372 char jsonChar;
AzureIoTClient 4:233dd7616d73 373
AzureIoTClient 4:233dd7616d73 374 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 375
AzureIoTClient 4:233dd7616d73 376 jsonChar = *(parserState->json);
AzureIoTClient 4:233dd7616d73 377 while ((jsonChar != '}') && (jsonChar != '\0'))
AzureIoTClient 4:233dd7616d73 378 {
AzureIoTClient 4:233dd7616d73 379 char* valueEnd;
AzureIoTClient 4:233dd7616d73 380
AzureIoTClient 4:233dd7616d73 381 /* decode each value */
AzureIoTClient 4:233dd7616d73 382 result = ParseNameValuePair(parserState, currentNode);
AzureIoTClient 4:233dd7616d73 383 if (result != JSON_DECODER_OK)
AzureIoTClient 4:233dd7616d73 384 {
AzureIoTClient 4:233dd7616d73 385 break;
AzureIoTClient 4:233dd7616d73 386 }
AzureIoTClient 4:233dd7616d73 387
AzureIoTClient 4:233dd7616d73 388 valueEnd = parserState->json;
AzureIoTClient 4:233dd7616d73 389
AzureIoTClient 4:233dd7616d73 390 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 391 jsonChar = *(parserState->json);
AzureIoTClient 4:233dd7616d73 392 *valueEnd = 0;
AzureIoTClient 4:233dd7616d73 393
AzureIoTClient 4:233dd7616d73 394 /* Codes_SRS_JSON_DECODER_99_024:[ A single comma separates a value from a following name.] */
AzureIoTClient 4:233dd7616d73 395 if (jsonChar == ',')
AzureIoTClient 4:233dd7616d73 396 {
AzureIoTClient 4:233dd7616d73 397 parserState->json++;
AzureIoTClient 4:233dd7616d73 398 /* get the next name/value pair */
AzureIoTClient 4:233dd7616d73 399 }
AzureIoTClient 4:233dd7616d73 400 }
AzureIoTClient 4:233dd7616d73 401
AzureIoTClient 4:233dd7616d73 402 if (result != JSON_DECODER_OK)
AzureIoTClient 4:233dd7616d73 403 {
AzureIoTClient 4:233dd7616d73 404 /* already have error */
AzureIoTClient 4:233dd7616d73 405 }
AzureIoTClient 4:233dd7616d73 406 else
AzureIoTClient 4:233dd7616d73 407 {
AzureIoTClient 4:233dd7616d73 408 if (jsonChar != '}')
AzureIoTClient 4:233dd7616d73 409 {
AzureIoTClient 4:233dd7616d73 410 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 411 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 412 }
AzureIoTClient 4:233dd7616d73 413 else
AzureIoTClient 4:233dd7616d73 414 {
AzureIoTClient 4:233dd7616d73 415 parserState->json++;
AzureIoTClient 4:233dd7616d73 416 }
AzureIoTClient 4:233dd7616d73 417 }
AzureIoTClient 4:233dd7616d73 418 }
AzureIoTClient 4:233dd7616d73 419
AzureIoTClient 4:233dd7616d73 420 return result;
AzureIoTClient 4:233dd7616d73 421 }
AzureIoTClient 4:233dd7616d73 422
AzureIoTClient 4:233dd7616d73 423 static JSON_DECODER_RESULT ParseArray(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode)
AzureIoTClient 4:233dd7616d73 424 {
AzureIoTClient 4:233dd7616d73 425 JSON_DECODER_RESULT result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 426
AzureIoTClient 4:233dd7616d73 427 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 428
AzureIoTClient 4:233dd7616d73 429 /* Codes_SRS_JSON_DECODER_99_026:[ An array structure is represented as square brackets surrounding zero or more values (or elements).] */
AzureIoTClient 4:233dd7616d73 430 if (*(parserState->json) != '[')
AzureIoTClient 4:233dd7616d73 431 {
AzureIoTClient 4:233dd7616d73 432 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 433 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 434 }
AzureIoTClient 4:233dd7616d73 435 else
AzureIoTClient 4:233dd7616d73 436 {
AzureIoTClient 4:233dd7616d73 437 char* stringBegin;
AzureIoTClient 4:233dd7616d73 438 char jsonChar;
AzureIoTClient 4:233dd7616d73 439 int arrayIndex = 0;
AzureIoTClient 4:233dd7616d73 440 result = JSON_DECODER_OK;
AzureIoTClient 4:233dd7616d73 441
AzureIoTClient 4:233dd7616d73 442 parserState->json++;
AzureIoTClient 4:233dd7616d73 443
AzureIoTClient 4:233dd7616d73 444 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 445
AzureIoTClient 4:233dd7616d73 446 jsonChar = *parserState->json;
AzureIoTClient 4:233dd7616d73 447 while ((jsonChar != ']') && (jsonChar != '\0'))
AzureIoTClient 4:233dd7616d73 448 {
AzureIoTClient 4:233dd7616d73 449 char arrayIndexStr[22];
AzureIoTClient 4:233dd7616d73 450 MULTITREE_HANDLE childNode;
AzureIoTClient 4:233dd7616d73 451
AzureIoTClient 4:233dd7616d73 452 /* Codes_SRS_JSON_DECODER_99_039:[ For array elements the multi tree node name shall be the string representation of the array index.] */
AzureIoTClient 4:233dd7616d73 453 if (sprintf(arrayIndexStr, "%d", arrayIndex++) < 0)
AzureIoTClient 4:233dd7616d73 454 {
AzureIoTClient 4:233dd7616d73 455 result = JSON_DECODER_ERROR;
AzureIoTClient 4:233dd7616d73 456 break;
AzureIoTClient 4:233dd7616d73 457 }
AzureIoTClient 4:233dd7616d73 458 /* Codes_SRS_JSON_DECODER_99_003:[ When a JSON element is decoded from the JSON object then a leaf shall be added to the MultiTree.] */
AzureIoTClient 4:233dd7616d73 459 else if (MultiTree_AddChild(currentNode, arrayIndexStr, &childNode) != MULTITREE_OK)
AzureIoTClient 4:233dd7616d73 460 {
AzureIoTClient 4:233dd7616d73 461 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
AzureIoTClient 4:233dd7616d73 462 result = JSON_DECODER_MULTITREE_FAILED;
AzureIoTClient 4:233dd7616d73 463 }
AzureIoTClient 4:233dd7616d73 464 else
AzureIoTClient 4:233dd7616d73 465 {
AzureIoTClient 4:233dd7616d73 466 char* valueEnd;
AzureIoTClient 4:233dd7616d73 467
AzureIoTClient 4:233dd7616d73 468 /* decode each value */
AzureIoTClient 4:233dd7616d73 469 result = ParseValue(parserState, childNode, &stringBegin);
AzureIoTClient 4:233dd7616d73 470 if (result != JSON_DECODER_OK)
AzureIoTClient 4:233dd7616d73 471 {
AzureIoTClient 4:233dd7616d73 472 break;
AzureIoTClient 4:233dd7616d73 473 }
AzureIoTClient 4:233dd7616d73 474
AzureIoTClient 4:233dd7616d73 475 if (stringBegin != NULL)
AzureIoTClient 4:233dd7616d73 476 {
AzureIoTClient 4:233dd7616d73 477 /* Codes_SRS_JSON_DECODER_99_005:[ The leaf node added in the multi tree shall have the value the string value of the JSON element as parsed from the JSON object.] */
AzureIoTClient 4:233dd7616d73 478 if (MultiTree_SetValue(childNode, stringBegin) != MULTITREE_OK)
AzureIoTClient 4:233dd7616d73 479 {
AzureIoTClient 4:233dd7616d73 480 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
AzureIoTClient 4:233dd7616d73 481 result = JSON_DECODER_MULTITREE_FAILED;
AzureIoTClient 4:233dd7616d73 482 break;
AzureIoTClient 4:233dd7616d73 483 }
AzureIoTClient 4:233dd7616d73 484 }
AzureIoTClient 4:233dd7616d73 485
AzureIoTClient 4:233dd7616d73 486 valueEnd = parserState->json;
AzureIoTClient 4:233dd7616d73 487
AzureIoTClient 4:233dd7616d73 488 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 489 jsonChar = *(parserState->json);
AzureIoTClient 4:233dd7616d73 490 *valueEnd = 0;
AzureIoTClient 4:233dd7616d73 491
AzureIoTClient 4:233dd7616d73 492 /* Codes_SRS_JSON_DECODER_99_027:[ Elements are separated by commas.] */
AzureIoTClient 4:233dd7616d73 493 if (jsonChar == ',')
AzureIoTClient 4:233dd7616d73 494 {
AzureIoTClient 4:233dd7616d73 495 parserState->json++;
AzureIoTClient 4:233dd7616d73 496 /* get the next value pair */
AzureIoTClient 4:233dd7616d73 497 }
AzureIoTClient 4:233dd7616d73 498 else if (jsonChar == ']')
AzureIoTClient 4:233dd7616d73 499 {
AzureIoTClient 4:233dd7616d73 500 break;
AzureIoTClient 4:233dd7616d73 501 }
AzureIoTClient 4:233dd7616d73 502 else
AzureIoTClient 4:233dd7616d73 503 {
AzureIoTClient 4:233dd7616d73 504 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 505 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 506 break;
AzureIoTClient 4:233dd7616d73 507 }
AzureIoTClient 4:233dd7616d73 508 }
AzureIoTClient 4:233dd7616d73 509 }
AzureIoTClient 4:233dd7616d73 510
AzureIoTClient 4:233dd7616d73 511 if (result != JSON_DECODER_OK)
AzureIoTClient 4:233dd7616d73 512 {
AzureIoTClient 4:233dd7616d73 513 /* already have error */
AzureIoTClient 4:233dd7616d73 514 }
AzureIoTClient 4:233dd7616d73 515 else
AzureIoTClient 4:233dd7616d73 516 {
AzureIoTClient 4:233dd7616d73 517 if (jsonChar != ']')
AzureIoTClient 4:233dd7616d73 518 {
AzureIoTClient 4:233dd7616d73 519 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 520 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 521 }
AzureIoTClient 4:233dd7616d73 522 else
AzureIoTClient 4:233dd7616d73 523 {
AzureIoTClient 4:233dd7616d73 524 parserState->json++;
AzureIoTClient 4:233dd7616d73 525 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 526 }
AzureIoTClient 4:233dd7616d73 527 }
AzureIoTClient 4:233dd7616d73 528 }
AzureIoTClient 4:233dd7616d73 529
AzureIoTClient 4:233dd7616d73 530 return result;
AzureIoTClient 4:233dd7616d73 531 }
AzureIoTClient 4:233dd7616d73 532
AzureIoTClient 4:233dd7616d73 533 /* Codes_SRS_JSON_DECODER_99_012:[ A JSON text is a serialized object or array.] */
AzureIoTClient 4:233dd7616d73 534 static JSON_DECODER_RESULT ParseObjectOrArray(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode)
AzureIoTClient 4:233dd7616d73 535 {
AzureIoTClient 4:233dd7616d73 536 JSON_DECODER_RESULT result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 537
AzureIoTClient 4:233dd7616d73 538 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 539
AzureIoTClient 4:233dd7616d73 540 if (*(parserState->json) == '{')
AzureIoTClient 4:233dd7616d73 541 {
AzureIoTClient 4:233dd7616d73 542 result = ParseObject(parserState, currentNode);
AzureIoTClient 4:233dd7616d73 543 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 544 }
AzureIoTClient 4:233dd7616d73 545 else if (*(parserState->json) == '[')
AzureIoTClient 4:233dd7616d73 546 {
AzureIoTClient 4:233dd7616d73 547 result = ParseArray(parserState, currentNode);
AzureIoTClient 4:233dd7616d73 548 SkipWhiteSpaces(parserState);
AzureIoTClient 4:233dd7616d73 549 }
AzureIoTClient 4:233dd7616d73 550 else
AzureIoTClient 4:233dd7616d73 551 {
AzureIoTClient 4:233dd7616d73 552 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 553 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 554 }
AzureIoTClient 4:233dd7616d73 555
AzureIoTClient 4:233dd7616d73 556 if ((result == JSON_DECODER_OK) &&
AzureIoTClient 4:233dd7616d73 557 (*(parserState->json) != '\0'))
AzureIoTClient 4:233dd7616d73 558 {
AzureIoTClient 4:233dd7616d73 559 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 560 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 561 }
AzureIoTClient 4:233dd7616d73 562
AzureIoTClient 4:233dd7616d73 563 return result;
AzureIoTClient 4:233dd7616d73 564 }
AzureIoTClient 4:233dd7616d73 565
AzureIoTClient 4:233dd7616d73 566 static JSON_DECODER_RESULT ParseJSON(char* json, MULTITREE_HANDLE currentNode)
AzureIoTClient 4:233dd7616d73 567 {
AzureIoTClient 4:233dd7616d73 568 /* Codes_SRS_JSON_DECODER_99_009:[ On success, JSONDecoder_JSON_To_MultiTree shall return a handle to the multi tree it created in the multiTreeHandle argument and it shall return JSON_DECODER_OK.] */
AzureIoTClient 4:233dd7616d73 569 PARSER_STATE parseState;
AzureIoTClient 4:233dd7616d73 570 parseState.json = json;
AzureIoTClient 4:233dd7616d73 571 return ParseObjectOrArray(&parseState, currentNode);
AzureIoTClient 4:233dd7616d73 572 }
AzureIoTClient 4:233dd7616d73 573
AzureIoTClient 4:233dd7616d73 574 JSON_DECODER_RESULT JSONDecoder_JSON_To_MultiTree(char* json, MULTITREE_HANDLE* multiTreeHandle)
AzureIoTClient 4:233dd7616d73 575 {
AzureIoTClient 4:233dd7616d73 576 JSON_DECODER_RESULT result;
AzureIoTClient 4:233dd7616d73 577
AzureIoTClient 4:233dd7616d73 578 if ((json == NULL) ||
AzureIoTClient 4:233dd7616d73 579 (multiTreeHandle == NULL))
AzureIoTClient 4:233dd7616d73 580 {
AzureIoTClient 4:233dd7616d73 581 /* Codes_SRS_JSON_DECODER_99_001:[ If any of the parameters passed to the JSONDecoder_JSON_To_MultiTree function is NULL then the function call shall return JSON_DECODER_INVALID_ARG.] */
AzureIoTClient 4:233dd7616d73 582 result = JSON_DECODER_INVALID_ARG;
AzureIoTClient 4:233dd7616d73 583 }
AzureIoTClient 4:233dd7616d73 584 else if (*json == '\0')
AzureIoTClient 4:233dd7616d73 585 {
AzureIoTClient 4:233dd7616d73 586 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
AzureIoTClient 4:233dd7616d73 587 result = JSON_DECODER_PARSE_ERROR;
AzureIoTClient 4:233dd7616d73 588 }
AzureIoTClient 4:233dd7616d73 589 else
AzureIoTClient 4:233dd7616d73 590 {
AzureIoTClient 4:233dd7616d73 591 /* Codes_SRS_JSON_DECODER_99_008:[ JSONDecoder_JSON_To_MultiTree shall create a multi tree based on the json string argument.] */
AzureIoTClient 4:233dd7616d73 592 /* Codes_SRS_JSON_DECODER_99_002:[ JSONDecoder_JSON_To_MultiTree shall use the MultiTree APIs to create the multi tree and add leafs to the multi tree.] */
AzureIoTClient 4:233dd7616d73 593 /* Codes_SRS_JSON_DECODER_99_009:[ On success, JSONDecoder_JSON_To_MultiTree shall return a handle to the multi tree it created in the multiTreeHandle argument and it shall return JSON_DECODER_OK.] */
AzureIoTClient 4:233dd7616d73 594 *multiTreeHandle = MultiTree_Create(NOPCloneFunction, NoFreeFunction);
AzureIoTClient 4:233dd7616d73 595 if (*multiTreeHandle == NULL)
AzureIoTClient 4:233dd7616d73 596 {
AzureIoTClient 4:233dd7616d73 597 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
AzureIoTClient 4:233dd7616d73 598 result = JSON_DECODER_MULTITREE_FAILED;
AzureIoTClient 4:233dd7616d73 599 }
AzureIoTClient 4:233dd7616d73 600 else
AzureIoTClient 4:233dd7616d73 601 {
AzureIoTClient 4:233dd7616d73 602 result = ParseJSON(json, *multiTreeHandle);
AzureIoTClient 4:233dd7616d73 603 if (result != JSON_DECODER_OK)
AzureIoTClient 4:233dd7616d73 604 {
AzureIoTClient 4:233dd7616d73 605 MultiTree_Destroy(*multiTreeHandle);
AzureIoTClient 4:233dd7616d73 606 }
AzureIoTClient 4:233dd7616d73 607 }
AzureIoTClient 4:233dd7616d73 608 }
AzureIoTClient 4:233dd7616d73 609
AzureIoTClient 4:233dd7616d73 610 return result;
AzureIoTClient 4:233dd7616d73 611 }