23#include <winpr/file.h>
24#include <winpr/json.h>
25#include <winpr/assert.h>
27#if !defined(WITH_CJSON)
28#error "This file must only be compiled when cJSON is enabled"
30#include <cjson/cJSON.h>
32#if defined(WITH_CJSON)
33#if CJSON_VERSION_MAJOR == 1
34#if (CJSON_VERSION_MINOR < 7) || ((CJSON_VERSION_MINOR == 7) && (CJSON_VERSION_PATCH < 13))
35#define USE_CJSON_COMPAT
40#if defined(USE_CJSON_COMPAT)
41static double cJSON_GetNumberValue(
const cJSON* prop)
46#define COMPAT_NAN_UNDEF
49#define COMPAT_NAN_UNDEF
53 if (!cJSON_IsNumber(prop))
55 char* val = cJSON_GetStringValue(prop);
61 double dval = strtod(val, &endptr);
70#ifdef COMPAT_NAN_UNDEF
75static cJSON* cJSON_ParseWithLength(
const char* value,
size_t buffer_length)
78 const size_t slen = strnlen(value, buffer_length);
79 if (slen >= buffer_length)
81 if (value[buffer_length] !=
'\0')
84 return cJSON_Parse(value);
90 return _snprintf(buffer, len,
"cJSON %s", cJSON_Version());
95 return cJSON_Parse(value);
100 return cJSON_ParseWithLength(value, buffer_length);
105 cJSON_Delete((cJSON*)item);
110 WINPR_ASSERT(index <= INT_MAX);
111 return cJSON_GetArrayItem((
const cJSON*)array, (INT)index);
116 const int rc = cJSON_GetArraySize((
const cJSON*)array);
124 return cJSON_GetObjectItem((
const cJSON*)
object,
string);
129 return cJSON_GetObjectItemCaseSensitive((
const cJSON*)
object,
string);
134 return cJSON_HasObjectItem((
const cJSON*)
object,
string);
139 return cJSON_GetErrorPtr();
144 return cJSON_GetStringValue((cJSON*)item);
149 return cJSON_GetNumberValue((
const cJSON*)item);
154 return cJSON_IsInvalid((
const cJSON*)item);
159 return cJSON_IsFalse((
const cJSON*)item);
164 return cJSON_IsTrue((
const cJSON*)item);
169 return cJSON_IsBool((
const cJSON*)item);
174 return cJSON_IsNull((
const cJSON*)item);
179 return cJSON_IsNumber((
const cJSON*)item);
184 return cJSON_IsString((
const cJSON*)item);
189 return cJSON_IsArray((
const cJSON*)item);
194 return cJSON_IsObject((
const cJSON*)item);
199 return cJSON_CreateNull();
204 return cJSON_CreateTrue();
209 return cJSON_CreateFalse();
214 return cJSON_CreateBool(
boolean);
219 return cJSON_CreateNumber(num);
224 return cJSON_CreateString(
string);
229 return cJSON_CreateArray();
234 return cJSON_CreateObject();
239 return cJSON_AddNullToObject((cJSON*)
object, name);
244 return cJSON_AddTrueToObject((cJSON*)
object, name);
249 return cJSON_AddFalseToObject((cJSON*)
object, name);
254 return cJSON_AddBoolToObject((cJSON*)
object, name,
boolean);
259 return cJSON_AddNumberToObject((cJSON*)
object, name, number);
264 return cJSON_AddStringToObject((cJSON*)
object, name,
string);
269 return cJSON_AddObjectToObject((cJSON*)
object, name);
274#if defined(USE_CJSON_COMPAT)
275 if ((array == NULL) || (item == NULL))
277 cJSON_AddItemToArray((cJSON*)array, (cJSON*)item);
280 return cJSON_AddItemToArray((cJSON*)array, (cJSON*)item);
286 return cJSON_AddArrayToObject((cJSON*)
object, name);
291 return cJSON_Print((
const cJSON*)item);
296 return cJSON_PrintUnformatted((
const cJSON*)item);
WINPR_JSON * WINPR_JSON_CreateBool(BOOL boolean)
WINPR_JSON_CreateBool.
WINPR_JSON * WINPR_JSON_CreateString(const char *string)
WINPR_JSON_CreateString.
BOOL WINPR_JSON_HasObjectItem(const WINPR_JSON *object, const char *string)
Check if JSON has an object matching the name.
WINPR_JSON * WINPR_JSON_AddNumberToObject(WINPR_JSON *object, const char *name, double number)
WINPR_JSON_AddNumberToObject.
BOOL WINPR_JSON_IsNull(const WINPR_JSON *item)
Check if JSON item is Null.
WINPR_JSON * WINPR_JSON_GetObjectItem(const WINPR_JSON *object, const char *string)
Return a pointer to an JSON object item.
BOOL WINPR_JSON_IsString(const WINPR_JSON *item)
Check if JSON item is of type String.
BOOL WINPR_JSON_AddItemToArray(WINPR_JSON *array, WINPR_JSON *item)
Add an item to an existing array.
WINPR_JSON * WINPR_JSON_AddArrayToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddArrayToObject.
BOOL WINPR_JSON_IsBool(const WINPR_JSON *item)
Check if JSON item is of type BOOL.
double WINPR_JSON_GetNumberValue(const WINPR_JSON *item)
Return the Number value of a JSON item.
WINPR_JSON * WINPR_JSON_AddTrueToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddTrueToObject.
WINPR_JSON * WINPR_JSON_CreateObject(void)
WINPR_JSON_CreateObject.
WINPR_JSON * WINPR_JSON_CreateArray(void)
WINPR_JSON_CreateArray.
int WINPR_JSON_version(char *buffer, size_t len)
Get the library version string.
char * WINPR_JSON_Print(WINPR_JSON *item)
Serialize a JSON instance to string for minimal size without formatting see WINPR_JSON_PrintUnformatt...
WINPR_JSON * WINPR_JSON_AddFalseToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddFalseToObject.
BOOL WINPR_JSON_IsNumber(const WINPR_JSON *item)
Check if JSON item is of type Number.
WINPR_JSON * WINPR_JSON_GetArrayItem(const WINPR_JSON *array, size_t index)
Return a pointer to an item in the array.
WINPR_JSON * WINPR_JSON_GetObjectItemCaseSensitive(const WINPR_JSON *object, const char *string)
Same as WINPR_JSON_GetObjectItem but with case sensitive matching.
WINPR_JSON * WINPR_JSON_AddStringToObject(WINPR_JSON *object, const char *name, const char *string)
WINPR_JSON_AddStringToObject.
WINPR_JSON * WINPR_JSON_ParseWithLength(const char *value, size_t buffer_length)
Parse a JSON string.
WINPR_JSON * WINPR_JSON_CreateFalse(void)
WINPR_JSON_CreateFalse.
WINPR_JSON * WINPR_JSON_CreateNumber(double num)
WINPR_JSON_CreateNumber.
BOOL WINPR_JSON_IsObject(const WINPR_JSON *item)
Check if JSON item is of type Object.
WINPR_JSON * WINPR_JSON_AddBoolToObject(WINPR_JSON *object, const char *name, BOOL boolean)
WINPR_JSON_AddBoolToObject.
BOOL WINPR_JSON_IsInvalid(const WINPR_JSON *item)
Check if JSON item is valid.
char * WINPR_JSON_PrintUnformatted(WINPR_JSON *item)
Serialize a JSON instance to string without formatting for human readable formatted output see WINPR_...
WINPR_JSON * WINPR_JSON_CreateNull(void)
WINPR_JSON_CreateNull.
const char * WINPR_JSON_GetStringValue(WINPR_JSON *item)
Return the String value of a JSON item.
WINPR_JSON * WINPR_JSON_AddNullToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddNullToObject.
WINPR_JSON * WINPR_JSON_CreateTrue(void)
WINPR_JSON_CreateTrue.
BOOL WINPR_JSON_IsFalse(const WINPR_JSON *item)
Check if JSON item is BOOL value False.
void WINPR_JSON_Delete(WINPR_JSON *item)
Delete a WinPR JSON wrapper object.
size_t WINPR_JSON_GetArraySize(const WINPR_JSON *array)
Get the number of arrayitems from an array.
BOOL WINPR_JSON_IsArray(const WINPR_JSON *item)
Check if JSON item is of type Array.
const char * WINPR_JSON_GetErrorPtr(void)
Return an error string.
WINPR_JSON * WINPR_JSON_AddObjectToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddObjectToObject.
WINPR_JSON * WINPR_JSON_Parse(const char *value)
Parse a '\0' terminated JSON string.
BOOL WINPR_JSON_IsTrue(const WINPR_JSON *item)
Check if JSON item is BOOL value True.