From 5d3b033072fe754a0fd46ba9bce60cefd955a406 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 22 May 2019 11:30:28 +0200 Subject: [PATCH] shared: add nm_utils_gvariant_vardict_filter*() helpers Usually, such an operation does not make much sense. It's also not good performance wise. But for unit testing this becomes very interesting. --- shared/nm-glib-aux/nm-shared-utils.c | 61 ++++++++++++++++++++++++++++ shared/nm-glib-aux/nm-shared-utils.h | 14 +++++++ 2 files changed, 75 insertions(+) diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c index be37465113..f2c59808ad 100644 --- a/shared/nm-glib-aux/nm-shared-utils.c +++ b/shared/nm-glib-aux/nm-shared-utils.c @@ -3046,3 +3046,64 @@ fail: NM_SET_OUT (out_len, 0); return NULL; } + +/*****************************************************************************/ + +GVariant * +nm_utils_gvariant_vardict_filter (GVariant *src, + gboolean (*filter_fcn) (const char *key, + GVariant *val, + char **out_key, + GVariant **out_val, + gpointer user_data), + gpointer user_data) +{ + GVariantIter iter; + GVariantBuilder builder; + const char *key; + GVariant *val; + + g_return_val_if_fail (src && g_variant_is_of_type (src, G_VARIANT_TYPE_VARDICT), NULL); + g_return_val_if_fail (filter_fcn, NULL); + + g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT); + + g_variant_iter_init (&iter, src); + while (g_variant_iter_next (&iter, "{&sv}", &key, &val)) { + _nm_unused gs_unref_variant GVariant *val_free = val; + gs_free char *key2 = NULL; + gs_unref_variant GVariant *val2 = NULL; + + if (filter_fcn (key, + val, + &key2, + &val2, + user_data)) { + g_variant_builder_add (&builder, + "{sv}", + key2 ?: key, + val2 ?: val); + } + } + + return g_variant_builder_end (&builder); +} + +static gboolean +_gvariant_vardict_filter_drop_one (const char *key, + GVariant *val, + char **out_key, + GVariant **out_val, + gpointer user_data) +{ + return !nm_streq (key, user_data); +} + +GVariant * +nm_utils_gvariant_vardict_filter_drop_one (GVariant *src, + const char *key) +{ + return nm_utils_gvariant_vardict_filter (src, + _gvariant_vardict_filter_drop_one, + (gpointer) key); +} diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h index 51c284d499..7840516b48 100644 --- a/shared/nm-glib-aux/nm-shared-utils.h +++ b/shared/nm-glib-aux/nm-shared-utils.h @@ -312,6 +312,20 @@ GVariant *nm_utils_gbytes_to_variant_ay (GBytes *bytes); /*****************************************************************************/ +GVariant *nm_utils_gvariant_vardict_filter (GVariant *src, + gboolean (*filter_fcn) (const char *key, + GVariant *val, + char **out_key, + GVariant **out_val, + gpointer user_data), + gpointer user_data); + +GVariant * +nm_utils_gvariant_vardict_filter_drop_one (GVariant *src, + const char *key); + +/*****************************************************************************/ + static inline int nm_utils_hexchar_to_int (char ch) {