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:
Wed Sep 16 22:42:57 2015 -0700
Revision:
1:f20abf1e13e9
Parent:
0:1f9b2707ec7d
New release

Who changed what in which revision?

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