X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Futils-json.c;h=96da660f5399434b5637f3c9cd72da04528374aa;hb=3a6e947bef1b2942e24d2fdee1a76dbf3305b508;hp=82908f48c3c51d0a7d860e799863e48986e70208;hpb=991c5480c46418e1dd0ff733e5f86de5e20429f5;p=src%2Fapp-framework-main.git diff --git a/src/utils-json.c b/src/utils-json.c index 82908f4..96da660 100644 --- a/src/utils-json.c +++ b/src/utils-json.c @@ -1,5 +1,5 @@ /* - Copyright 2015 IoT.bzh + Copyright 2015, 2016, 2017 IoT.bzh author: José Bollo @@ -18,66 +18,87 @@ #include -#include +#include #include "utils-json.h" -int j_object(struct json_object *obj, const char *key, struct json_object **value) +int j_read_string(struct json_object *obj, const char **value) +{ + return j_is_string(obj) && (*value = json_object_get_string(obj)) != NULL; +} + +int j_read_boolean(struct json_object *obj, int *value) +{ + return j_is_boolean(obj) && ((*value = (int)json_object_get_boolean(obj)), 1); +} + +int j_read_integer(struct json_object *obj, int *value) +{ + return j_is_integer(obj) && ((*value = (int)json_object_get_int(obj)), 1); +} + +const char *j_string(struct json_object *obj, const char *defval) +{ + return j_is_string(obj) ? json_object_get_string(obj) : defval; +} + +int j_boolean(struct json_object *obj, int defval) +{ + return j_is_boolean(obj) ? json_object_get_boolean(obj) : defval; +} + +int j_integer(struct json_object *obj, int defval) +{ + return j_is_integer(obj) ? json_object_get_int(obj) : defval; +} + +int j_read_object_at(struct json_object *obj, const char *key, struct json_object **value) { return json_object_object_get_ex(obj, key, value); } -int j_string(struct json_object *obj, const char *key, const char **value) +int j_read_string_at(struct json_object *obj, const char *key, const char **value) { json_object *data; - return j_object(obj, key, &data) - && json_object_get_type(data) == json_type_string - && (*value = json_object_get_string(data)) != NULL; + return j_read_object_at(obj, key, &data) && j_read_string(data, value); } -int j_boolean(struct json_object *obj, const char *key, int *value) +int j_read_boolean_at(struct json_object *obj, const char *key, int *value) { json_object *data; - return json_object_object_get_ex(obj, key, &data) - && json_object_get_type(data) == json_type_boolean - && ((*value = (int)json_object_get_boolean(data)), 1); + return j_read_object_at(obj, key, &data) && j_read_boolean(data, value); } -int j_integer(struct json_object *obj, const char *key, int *value) +int j_read_integer_at(struct json_object *obj, const char *key, int *value) { json_object *data; - return json_object_object_get_ex(obj, key, &data) - && json_object_get_type(data) == json_type_int - && ((*value = (int)json_object_get_int(data)), 1); + return j_read_object_at(obj, key, &data) && j_read_integer(data, value); } -const char *j_get_string(struct json_object *obj, const char *key, const char *defval) +const char *j_string_at(struct json_object *obj, const char *key, const char *defval) { - struct json_object *o; - return json_object_object_get_ex(obj, key, &o) - && json_object_get_type(o) == json_type_string - ? json_object_get_string(o) : defval; + struct json_object *data; + return j_read_object_at(obj, key, &data) ? j_string(data, defval) : defval; } -int j_get_boolean(struct json_object *obj, const char *key, int defval) +int j_boolean_at(struct json_object *obj, const char *key, int defval) { - struct json_object *o; - return json_object_object_get_ex(obj, key, &o) - && json_object_get_type(o) == json_type_boolean - ? json_object_get_boolean(o) : defval; + struct json_object *data; + return j_read_object_at(obj, key, &data) ? j_boolean(data, defval) : defval; } -int j_get_integer(struct json_object *obj, const char *key, int defval) +int j_integer_at(struct json_object *obj, const char *key, int defval) { - struct json_object *o; - return json_object_object_get_ex(obj, key, &o) - && json_object_get_type(o) == json_type_int - ? json_object_get_int(o) : defval; + struct json_object *data; + return j_read_object_at(obj, key, &data) ? j_integer(data, defval) : defval; } int j_add(struct json_object *obj, const char *key, struct json_object *val) { - json_object_object_add(obj, key, val); + if (key) + json_object_object_add(obj, key, val); + else + json_object_array_add(obj, val); return 1; } @@ -99,3 +120,23 @@ int j_add_integer(struct json_object *obj, const char *key, int val) return str ? j_add(obj, key, str) : (errno = ENOMEM, 0); } +struct json_object *j_add_new_array(struct json_object *obj, const char *key) +{ + struct json_object *result = json_object_new_array(); + if (result != NULL && !j_add(obj, key, result)) { + json_object_put(result); + result = NULL; + } + return result; +} + +struct json_object *j_add_new_object(struct json_object *obj, const char *key) +{ + struct json_object *result = json_object_new_object(); + if (result != NULL && !j_add(obj, key, result)) { + json_object_put(result); + result = NULL; + } + return result; +} +