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:
Azure.IoT Build
Date:
Fri Apr 08 13:25:09 2016 -0700
Revision:
10:c2aee3965a83
Parent:
4:233dd7616d73
Child:
19:9e5049fd4c5b
1.0.4

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