Adds 2017 to copyrights
[src/app-framework-main.git] / src / utils-json.c
index 82908f4..96da660 100644 (file)
@@ -1,5 +1,5 @@
 /*
- Copyright 2015 IoT.bzh
+ Copyright 2015, 2016, 2017 IoT.bzh
 
  author: José Bollo <jose.bollo@iot.bzh>
 
 
 #include <errno.h>
 
-#include <json.h>
+#include <json-c/json.h>
 
 #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;
+}
+