nm-setting: add internal gendata API to clear value(s)

The filter function in nm_setting_gendata_clear_all() is useful
for when you want to only clear values according to a predicate,
if no such function is supplied all values will be cleared.

https://bugzilla.redhat.com/show_bug.cgi?id=1614700
This commit is contained in:
Antonio Cardace 2020-05-15 15:26:30 +02:00
parent 572f82a77b
commit e08c3a6e18
No known key found for this signature in database
GPG key ID: 6BF80ABD43E377D3
2 changed files with 50 additions and 0 deletions

View file

@ -310,6 +310,8 @@ gboolean _nm_setting_get_property (NMSetting *setting, const char *name, GValue
/*****************************************************************************/
typedef gboolean (*nm_setting_gendata_filter_fcn)(const char *name);
GHashTable *_nm_setting_gendata_hash (NMSetting *setting,
gboolean create_if_necessary);
@ -334,6 +336,12 @@ const char *const*nm_setting_gendata_get_all_names (NMSetting *setting,
GVariant *const*nm_setting_gendata_get_all_values (NMSetting *setting);
gboolean nm_setting_gendata_clear (NMSetting *setting,
const char *optname);
gboolean nm_setting_gendata_clear_all (NMSetting *setting,
nm_setting_gendata_filter_fcn filter);
gboolean nm_setting_gendata_get_uint32 (NMSetting *setting,
const char *optname,
guint32 *out_value);

View file

@ -2649,6 +2649,48 @@ nm_setting_gendata_set_uint32 (NMSetting *setting,
g_variant_ref_sink (g_variant_new_uint32 (value)));
}
gboolean
nm_setting_gendata_clear (NMSetting *setting,
const char *optname)
{
GHashTable *ht;
nm_assert (NM_IS_SETTING (setting));
nm_assert (nm_str_not_empty (optname));
ht = _nm_setting_gendata_hash (setting, FALSE);
if (!ht)
return FALSE;
return g_hash_table_remove (ht, optname);
}
gboolean
nm_setting_gendata_clear_all (NMSetting *setting,
nm_setting_gendata_filter_fcn filter)
{
GHashTable *ht;
const char *name;
GHashTableIter iter;
gboolean changed = FALSE;
nm_assert (NM_IS_SETTING (setting));
ht = _nm_setting_gendata_hash (setting, FALSE);
if (!ht)
return FALSE;
g_hash_table_iter_init (&iter, ht);
while (g_hash_table_iter_next (&iter, (gpointer *) &name, NULL)) {
if (!filter || filter (name)) {
g_hash_table_iter_remove (&iter);
changed = TRUE;
}
}
return changed;
}
/*****************************************************************************/
static void