diff options
author | Thomas Haller <thaller@redhat.com> | 2020-07-01 16:44:55 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-07-09 11:47:05 +0200 |
commit | a9e3987e7cf189d81540e0db675c79bee1c6ca0f (patch) | |
tree | 875219d744343a1b8a1d9004fa65921bf6f5203e | |
parent | 125d362177eeabf49d04216bb62ae4c31c55e94c (diff) | |
download | NetworkManager-a9e3987e7cf189d81540e0db675c79bee1c6ca0f.tar.gz |
libnm: merge "shared/nm-glib-aux/nm-jansson.h" into "libnm-core/nm-json.h"
"shared/nm-glib-aux/nm-jansson.h" is a compat header for <jansson.h>. It
includes <jansson.h> and adds some compatibility workarounds and helper
functions.
We want that "libnm-core/nm-json.h" no longer includes <jansson.h>, so
that we don't accidentally use symbols from there.
Hence, "libnm-core/nm-json.h" must no longer include "nm-jansson.h".
In preparation of that, copy the content of "shared/nm-glib-aux/nm-jansson.h"
also to "libnm-core/nm-json.h". It will be reworked later.
-rw-r--r-- | libnm-core/nm-json.h | 131 |
1 files changed, 130 insertions, 1 deletions
diff --git a/libnm-core/nm-json.h b/libnm-core/nm-json.h index 3f99609e37..e1b4786eba 100644 --- a/libnm-core/nm-json.h +++ b/libnm-core/nm-json.h @@ -30,7 +30,11 @@ #define json_string_value nm_json_string_value #define json_true nm_json_true -#include "nm-glib-aux/nm-jansson.h" +/*****************************************************************************/ + +#if WITH_JANSSON + +#include <jansson.h> typedef struct { gboolean loaded; @@ -97,6 +101,8 @@ nm_json_vt_assert (void) const NMJsonVt *nmtst_json_vt_reset (gboolean loaded); +/*****************************************************************************/ + #define nm_json_boolean(vt, val) \ ((val) ? (vt)->nm_json_true () : (vt)->nm_json_false ()) @@ -129,4 +135,127 @@ nm_json_decref (const NMJsonVt *vt, json_t *json) #define nm_json_object_foreach(a, b, c) json_object_foreach (a, b, c) #define nm_json_object_foreach_safe(a, b, c, d) json_object_foreach_safe (a, b, c, d) +/*****************************************************************************/ + +/* Added in Jansson v2.7 */ +#ifndef json_boolean_value +#define json_boolean_value json_is_true +#endif + +/* Added in Jansson v2.8 */ +#ifndef json_object_foreach_safe +#define json_object_foreach_safe(object, n, key, value) \ + for (key = json_object_iter_key(json_object_iter(object)), \ + n = json_object_iter_next(object, json_object_key_to_iter(key)); \ + key && (value = json_object_iter_value(json_object_key_to_iter(key))); \ + key = json_object_iter_key(n), \ + n = json_object_iter_next(object, json_object_key_to_iter(key))) +#endif + +NM_AUTO_DEFINE_FCN0 (json_t *, _nm_auto_decref_json, json_decref) +#define nm_auto_decref_json nm_auto(_nm_auto_decref_json) + +/*****************************************************************************/ + +static inline int +nm_jansson_json_as_bool (const json_t *elem, + bool *out_val) +{ + if (!elem) + return 0; + + if (!json_is_boolean (elem)) + return -EINVAL; + + NM_SET_OUT (out_val, json_boolean_value (elem)); + return 1; +} + +static inline int +nm_jansson_json_as_int32 (const json_t *elem, + gint32 *out_val) +{ + json_int_t v; + + if (!elem) + return 0; + + if (!json_is_integer (elem)) + return -EINVAL; + + v = json_integer_value (elem); + if ( v < (gint64) G_MININT32 + || v > (gint64) G_MAXINT32) + return -ERANGE; + + NM_SET_OUT (out_val, v); + return 1; +} + +static inline int +nm_jansson_json_as_int (const json_t *elem, + int *out_val) +{ + json_int_t v; + + if (!elem) + return 0; + + if (!json_is_integer (elem)) + return -EINVAL; + + v = json_integer_value (elem); + if ( v < (gint64) G_MININT + || v > (gint64) G_MAXINT) + return -ERANGE; + + NM_SET_OUT (out_val, v); + return 1; +} + +static inline int +nm_jansson_json_as_string (const json_t *elem, + const char **out_val) +{ + if (!elem) + return 0; + + if (!json_is_string (elem)) + return -EINVAL; + + NM_SET_OUT (out_val, json_string_value (elem)); + return 1; +} + +/*****************************************************************************/ + +#ifdef NM_VALUE_TYPE_DEFINE_FUNCTIONS + +#include "nm-glib-aux/nm-value-type.h" + +static inline gboolean +nm_value_type_from_json (NMValueType value_type, + const json_t *elem, + gpointer out_val) +{ + switch (value_type) { + case NM_VALUE_TYPE_BOOL: return (nm_jansson_json_as_bool (elem, out_val) > 0); + case NM_VALUE_TYPE_INT32: return (nm_jansson_json_as_int32 (elem, out_val) > 0); + case NM_VALUE_TYPE_INT: return (nm_jansson_json_as_int (elem, out_val) > 0); + + /* warning: this overwrites/leaks the previous value. You better have *out_val + * point to uninitialized memory or NULL. */ + case NM_VALUE_TYPE_STRING: return (nm_jansson_json_as_string (elem, out_val) > 0); + + case NM_VALUE_TYPE_UNSPEC: + break; + } + nm_assert_not_reached (); + return FALSE; +} + +#endif /* NM_VALUE_TYPE_DEFINE_FUNCTIONS */ + +#endif /* WITH_JANSSON */ + #endif /* __NM_JSON_H__ */ |