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

Dependents:   samplemqtt

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 5
XinZhangMS 0:f7f1f0d76dd6 6 #include "jsonencoder.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/crt_abstractions.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "azure_c_shared_utility/strings.h"
XinZhangMS 0:f7f1f0d76dd6 10
XinZhangMS 0:f7f1f0d76dd6 11 #ifdef _MSC_VER
XinZhangMS 0:f7f1f0d76dd6 12 #pragma warning(disable: 4701) /* potentially uninitialized local variable 'result' used */ /* the scanner cannot track variable "i" and link it to childCount*/
XinZhangMS 0:f7f1f0d76dd6 13 #endif
XinZhangMS 0:f7f1f0d76dd6 14
XinZhangMS 0:f7f1f0d76dd6 15 DEFINE_ENUM_STRINGS(JSON_ENCODER_TOSTRING_RESULT, JSON_ENCODER_TOSTRING_RESULT_VALUES);
XinZhangMS 0:f7f1f0d76dd6 16 DEFINE_ENUM_STRINGS(JSON_ENCODER_RESULT, JSON_ENCODER_RESULT_VALUES);
XinZhangMS 0:f7f1f0d76dd6 17
XinZhangMS 0:f7f1f0d76dd6 18 JSON_ENCODER_RESULT JSONEncoder_EncodeTree(MULTITREE_HANDLE treeHandle, STRING_HANDLE destination, JSON_ENCODER_TOSTRING_FUNC toStringFunc)
XinZhangMS 0:f7f1f0d76dd6 19 {
XinZhangMS 0:f7f1f0d76dd6 20 JSON_ENCODER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 21
XinZhangMS 0:f7f1f0d76dd6 22 size_t childCount;
XinZhangMS 0:f7f1f0d76dd6 23
XinZhangMS 0:f7f1f0d76dd6 24 /* Codes_SRS_JSON_ENCODER_99_032:[If any of the arguments passed to JSONEncoder_EncodeTree is NULL then JSON_ENCODER_INVALID_ARG shall be returned.] */
XinZhangMS 0:f7f1f0d76dd6 25 if ((treeHandle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 26 (destination == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 27 (toStringFunc == NULL))
XinZhangMS 0:f7f1f0d76dd6 28 {
XinZhangMS 0:f7f1f0d76dd6 29 result = JSON_ENCODER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 30 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 31 }
XinZhangMS 0:f7f1f0d76dd6 32 /*Codes_SRS_JSON_ENCODER_99_035:[ JSON encoder shall inquire the number of child nodes (further called childCount) of the current node (given by parameter treeHandle.]*/
XinZhangMS 0:f7f1f0d76dd6 33 else if (MultiTree_GetChildCount(treeHandle, &childCount) != MULTITREE_OK)
XinZhangMS 0:f7f1f0d76dd6 34 {
XinZhangMS 0:f7f1f0d76dd6 35 result = JSON_ENCODER_MULTITREE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 36 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 37 }
XinZhangMS 0:f7f1f0d76dd6 38 else
XinZhangMS 0:f7f1f0d76dd6 39 {
XinZhangMS 0:f7f1f0d76dd6 40 size_t i;
XinZhangMS 0:f7f1f0d76dd6 41 /*Codes_SRS_JSON_ENCODER_99_036:[ The string "{" shall be added to the output;]*/
XinZhangMS 0:f7f1f0d76dd6 42 if (STRING_concat(destination, "{") != 0)
XinZhangMS 0:f7f1f0d76dd6 43 {
XinZhangMS 0:f7f1f0d76dd6 44 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 45 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 46 }
XinZhangMS 0:f7f1f0d76dd6 47 else
XinZhangMS 0:f7f1f0d76dd6 48 {
XinZhangMS 0:f7f1f0d76dd6 49 result = JSON_ENCODER_OK;
XinZhangMS 0:f7f1f0d76dd6 50 for (i = 0; (i < childCount) && (result == JSON_ENCODER_OK); i++)
XinZhangMS 0:f7f1f0d76dd6 51 {
XinZhangMS 0:f7f1f0d76dd6 52 MULTITREE_HANDLE childTreeHandle;
XinZhangMS 0:f7f1f0d76dd6 53
XinZhangMS 0:f7f1f0d76dd6 54 if ((i > 0) &&
XinZhangMS 0:f7f1f0d76dd6 55 (STRING_concat(destination, ", ") != 0))
XinZhangMS 0:f7f1f0d76dd6 56 {
XinZhangMS 0:f7f1f0d76dd6 57 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 58 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 59 }
XinZhangMS 0:f7f1f0d76dd6 60 else if (STRING_concat(destination, "\"") != 0)
XinZhangMS 0:f7f1f0d76dd6 61 {
XinZhangMS 0:f7f1f0d76dd6 62 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 63 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 64 }
XinZhangMS 0:f7f1f0d76dd6 65 else
XinZhangMS 0:f7f1f0d76dd6 66 {
XinZhangMS 0:f7f1f0d76dd6 67 STRING_HANDLE name = STRING_new();
XinZhangMS 0:f7f1f0d76dd6 68 if (name == NULL)
XinZhangMS 0:f7f1f0d76dd6 69 {
XinZhangMS 0:f7f1f0d76dd6 70 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 71 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 72 }
XinZhangMS 0:f7f1f0d76dd6 73 else
XinZhangMS 0:f7f1f0d76dd6 74 {
XinZhangMS 0:f7f1f0d76dd6 75 if (MultiTree_GetChild(treeHandle, i, &childTreeHandle) != MULTITREE_OK)
XinZhangMS 0:f7f1f0d76dd6 76 {
XinZhangMS 0:f7f1f0d76dd6 77 result = JSON_ENCODER_MULTITREE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 78 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 79 }
XinZhangMS 0:f7f1f0d76dd6 80 else if (MultiTree_GetName(childTreeHandle, name) != MULTITREE_OK)
XinZhangMS 0:f7f1f0d76dd6 81 {
XinZhangMS 0:f7f1f0d76dd6 82 result = JSON_ENCODER_MULTITREE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 83 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 84 }
XinZhangMS 0:f7f1f0d76dd6 85 else if (STRING_concat_with_STRING(destination, name) != 0)
XinZhangMS 0:f7f1f0d76dd6 86 {
XinZhangMS 0:f7f1f0d76dd6 87 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 88 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 89 }
XinZhangMS 0:f7f1f0d76dd6 90 else if (STRING_concat(destination, "\":") != 0)
XinZhangMS 0:f7f1f0d76dd6 91 {
XinZhangMS 0:f7f1f0d76dd6 92 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 93 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 94 }
XinZhangMS 0:f7f1f0d76dd6 95 else
XinZhangMS 0:f7f1f0d76dd6 96 {
XinZhangMS 0:f7f1f0d76dd6 97 size_t innerChildCount;
XinZhangMS 0:f7f1f0d76dd6 98 if (MultiTree_GetChildCount(childTreeHandle, &innerChildCount) != MULTITREE_OK)
XinZhangMS 0:f7f1f0d76dd6 99 {
XinZhangMS 0:f7f1f0d76dd6 100 result = JSON_ENCODER_MULTITREE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 101 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 102 }
XinZhangMS 0:f7f1f0d76dd6 103 else
XinZhangMS 0:f7f1f0d76dd6 104 {
XinZhangMS 0:f7f1f0d76dd6 105 if (innerChildCount > 0)
XinZhangMS 0:f7f1f0d76dd6 106 {
XinZhangMS 0:f7f1f0d76dd6 107 STRING_HANDLE child = STRING_new();
XinZhangMS 0:f7f1f0d76dd6 108 if (child == NULL)
XinZhangMS 0:f7f1f0d76dd6 109 {
XinZhangMS 0:f7f1f0d76dd6 110 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 111 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 112 }
XinZhangMS 0:f7f1f0d76dd6 113 else
XinZhangMS 0:f7f1f0d76dd6 114 {
XinZhangMS 0:f7f1f0d76dd6 115 if ((result = JSONEncoder_EncodeTree(childTreeHandle, child, toStringFunc)) != JSON_ENCODER_OK)
XinZhangMS 0:f7f1f0d76dd6 116 {
XinZhangMS 0:f7f1f0d76dd6 117 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 118 }
XinZhangMS 0:f7f1f0d76dd6 119 else if (STRING_concat_with_STRING(destination, child)!=0)
XinZhangMS 0:f7f1f0d76dd6 120 {
XinZhangMS 0:f7f1f0d76dd6 121 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 122 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 123 }
XinZhangMS 0:f7f1f0d76dd6 124 STRING_delete(child);
XinZhangMS 0:f7f1f0d76dd6 125 }
XinZhangMS 0:f7f1f0d76dd6 126 }
XinZhangMS 0:f7f1f0d76dd6 127 else
XinZhangMS 0:f7f1f0d76dd6 128 {
XinZhangMS 0:f7f1f0d76dd6 129 const void* value;
XinZhangMS 0:f7f1f0d76dd6 130 if (MultiTree_GetValue(childTreeHandle, &value) != MULTITREE_OK)
XinZhangMS 0:f7f1f0d76dd6 131 {
XinZhangMS 0:f7f1f0d76dd6 132 result = JSON_ENCODER_MULTITREE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 133 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 134
XinZhangMS 0:f7f1f0d76dd6 135 }
XinZhangMS 0:f7f1f0d76dd6 136 else
XinZhangMS 0:f7f1f0d76dd6 137 {
XinZhangMS 0:f7f1f0d76dd6 138 STRING_HANDLE childValue = STRING_new();
XinZhangMS 0:f7f1f0d76dd6 139 if (childValue == NULL)
XinZhangMS 0:f7f1f0d76dd6 140 {
XinZhangMS 0:f7f1f0d76dd6 141 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 142 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 143 }
XinZhangMS 0:f7f1f0d76dd6 144 else
XinZhangMS 0:f7f1f0d76dd6 145 {
XinZhangMS 0:f7f1f0d76dd6 146 if (toStringFunc(childValue, value) != JSON_ENCODER_TOSTRING_OK)
XinZhangMS 0:f7f1f0d76dd6 147 {
XinZhangMS 0:f7f1f0d76dd6 148 result = JSON_ENCODER_TOSTRING_FUNCTION_ERROR;
XinZhangMS 0:f7f1f0d76dd6 149 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 150 }
XinZhangMS 0:f7f1f0d76dd6 151 else if (STRING_concat_with_STRING(destination, childValue)!=0)
XinZhangMS 0:f7f1f0d76dd6 152 {
XinZhangMS 0:f7f1f0d76dd6 153 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 154 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 155 }
XinZhangMS 0:f7f1f0d76dd6 156 else
XinZhangMS 0:f7f1f0d76dd6 157 {
XinZhangMS 0:f7f1f0d76dd6 158 /*do nothing, result = JSON_ENCODER_OK is set above at the beginning of the FOR loop*/
XinZhangMS 0:f7f1f0d76dd6 159 }
XinZhangMS 0:f7f1f0d76dd6 160 STRING_delete(childValue);
XinZhangMS 0:f7f1f0d76dd6 161 }
XinZhangMS 0:f7f1f0d76dd6 162 }
XinZhangMS 0:f7f1f0d76dd6 163 }
XinZhangMS 0:f7f1f0d76dd6 164 }
XinZhangMS 0:f7f1f0d76dd6 165 }
XinZhangMS 0:f7f1f0d76dd6 166 STRING_delete(name);
XinZhangMS 0:f7f1f0d76dd6 167 }
XinZhangMS 0:f7f1f0d76dd6 168 }
XinZhangMS 0:f7f1f0d76dd6 169 }
XinZhangMS 0:f7f1f0d76dd6 170
XinZhangMS 0:f7f1f0d76dd6 171 if ((i == childCount) && (result == JSON_ENCODER_OK))
XinZhangMS 0:f7f1f0d76dd6 172 {
XinZhangMS 0:f7f1f0d76dd6 173 if (STRING_concat(destination, "}") != 0)
XinZhangMS 0:f7f1f0d76dd6 174 {
XinZhangMS 0:f7f1f0d76dd6 175 result = JSON_ENCODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 176 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 177 }
XinZhangMS 0:f7f1f0d76dd6 178 else
XinZhangMS 0:f7f1f0d76dd6 179 {
XinZhangMS 0:f7f1f0d76dd6 180 /* Codes_SRS_JSON_ENCODER_99_031:[On success, JSONEncoder_EncodeTree shall return JSON_ENCODER_OK.] */
XinZhangMS 0:f7f1f0d76dd6 181 result = JSON_ENCODER_OK;
XinZhangMS 0:f7f1f0d76dd6 182 }
XinZhangMS 0:f7f1f0d76dd6 183 }
XinZhangMS 0:f7f1f0d76dd6 184 }
XinZhangMS 0:f7f1f0d76dd6 185 }
XinZhangMS 0:f7f1f0d76dd6 186
XinZhangMS 0:f7f1f0d76dd6 187 return result;
XinZhangMS 0:f7f1f0d76dd6 188 #ifdef _MSC_VER
XinZhangMS 0:f7f1f0d76dd6 189 #pragma warning(disable: 4701) /* potentially uninitialized local variable 'result' used */ /* the scanner cannot track variable "i" and link it to childCount*/
XinZhangMS 0:f7f1f0d76dd6 190 #endif
XinZhangMS 0:f7f1f0d76dd6 191 }
XinZhangMS 0:f7f1f0d76dd6 192
XinZhangMS 0:f7f1f0d76dd6 193 JSON_ENCODER_TOSTRING_RESULT JSONEncoder_CharPtr_ToString(STRING_HANDLE destination, const void* value)
XinZhangMS 0:f7f1f0d76dd6 194 {
XinZhangMS 0:f7f1f0d76dd6 195 JSON_ENCODER_TOSTRING_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 196
XinZhangMS 0:f7f1f0d76dd6 197 /*Coes_SRS_JSON_ENCODER_99_047:[ JSONEncoder_CharPtr_ToString shall return JSON_ENCODER_TOSTRING_INVALID_ARG if destination or value parameters passed to it are NULL.]*/
XinZhangMS 0:f7f1f0d76dd6 198 if ((destination == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 199 (value == NULL))
XinZhangMS 0:f7f1f0d76dd6 200 {
XinZhangMS 0:f7f1f0d76dd6 201 result = JSON_ENCODER_TOSTRING_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 202 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_TOSTRING_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 203 }
XinZhangMS 0:f7f1f0d76dd6 204 /*Codes_SRS_JSON_ENCODER_99_048:[ JSONEncoder_CharPtr_ToString shall use strcpy_s to copy from value to destination.]*/
XinZhangMS 0:f7f1f0d76dd6 205 else if (STRING_concat(destination, (const char*)value) != 0)
XinZhangMS 0:f7f1f0d76dd6 206 {
XinZhangMS 0:f7f1f0d76dd6 207 /*Codes_SRS_JSON_ENCODER_99_049:[ If strcpy_s fails then JSONEncoder_CharPtr_ToString shall return JSON_ENCODER_TOSTRING_ERROR.]*/
XinZhangMS 0:f7f1f0d76dd6 208 result = JSON_ENCODER_TOSTRING_ERROR;
XinZhangMS 0:f7f1f0d76dd6 209 LogError("(result = %s)", ENUM_TO_STRING(JSON_ENCODER_TOSTRING_RESULT, result));
XinZhangMS 0:f7f1f0d76dd6 210 }
XinZhangMS 0:f7f1f0d76dd6 211 else
XinZhangMS 0:f7f1f0d76dd6 212 {
XinZhangMS 0:f7f1f0d76dd6 213 /*Codes_SRS_JSON_ENCODER_99_050:[ If strcpy_s doesn't fail, then JSONEncoder_CharPtr_ToString shall return JSON_ENCODER_TOSTRING_OK]*/
XinZhangMS 0:f7f1f0d76dd6 214 result = JSON_ENCODER_TOSTRING_OK;
XinZhangMS 0:f7f1f0d76dd6 215 }
XinZhangMS 0:f7f1f0d76dd6 216
XinZhangMS 0:f7f1f0d76dd6 217 return result;
XinZhangMS 0:f7f1f0d76dd6 218 }