From 291d3cd9a2ef20ffd478ff1516fd02265c02121e Mon Sep 17 00:00:00 2001 From: Julian Bouzas Date: Fri, 22 Mar 2024 20:26:42 -0400 Subject: [PATCH] m-settings: remove all persistent settings if key is null The wp_settings_delete_all() API internally uses wp_metadata_clear() to clear all the keys in the persistent-sm-settings metadata object. This call emits the metadata changed signal with both 'key' and 'value' set to NULL. When that happens, we need to clear all settings from the state file. --- modules/module-settings.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/modules/module-settings.c b/modules/module-settings.c index f656e8af..f13aa77a 100644 --- a/modules/module-settings.c +++ b/modules/module-settings.c @@ -64,12 +64,21 @@ on_persistent_metadata_changed (WpMetadata *m, guint32 subject, WpSettingsPlugin *self = WP_SETTINGS_PLUGIN (d); g_autoptr (WpCore) core = wp_object_get_core (WP_OBJECT (self)); - /* Update persistent settings with new value and timeout save it */ - wp_properties_set (self->persistent_settings, key, value); - if (value) - wp_info_object (self, "persistent setting updated: %s = %s", key, value); - else - wp_info_object (self, "persistent setting removed: %s", key); + /* Update persistent settings with new value. If key is null it means all + * settings need to be removed */ + if (key) { + wp_properties_set (self->persistent_settings, key, value); + if (value) + wp_info_object (self, "persistent setting updated: %s = %s", key, value); + else + wp_info_object (self, "persistent setting removed: %s", key); + } else { + g_clear_pointer (&self->persistent_settings, wp_properties_unref); + self->persistent_settings = wp_properties_new_empty (); + wp_info_object (self, "all persistent settings removed"); + } + + /* Save changes */ wp_state_save_after_timeout (self->state, core, self->persistent_settings); /* Also update current settings with new value */