diff --git a/src/fu-config.c b/src/fu-config.c index a2bfaef3a..4e4bb6d4b 100644 --- a/src/fu-config.c +++ b/src/fu-config.c @@ -20,6 +20,14 @@ #include "fwupd-error.h" #include "fwupd-remote-private.h" + +enum { + SIGNAL_CHANGED, + SIGNAL_LAST +}; + +static guint signals[SIGNAL_LAST] = { 0 }; + static void fu_config_finalize (GObject *obj); struct _FuConfig @@ -40,6 +48,13 @@ struct _FuConfig G_DEFINE_TYPE (FuConfig, fu_config, G_TYPE_OBJECT) +static void +fu_config_emit_changed (FuConfig *self) +{ + g_debug ("::configuration changed"); + g_signal_emit (self, signals[SIGNAL_CHANGED], 0); +} + static GPtrArray * fu_config_get_config_paths (void) { @@ -80,6 +95,7 @@ fu_config_monitor_changed_cb (GFileMonitor *monitor, g_debug ("%s changed, reloading all configs", filename); if (!fu_config_load (self, FU_CONFIG_LOAD_FLAG_NONE, &error)) g_warning ("failed to rescan config: %s", error->message); + fu_config_emit_changed (self); } static guint64 @@ -603,6 +619,12 @@ fu_config_class_init (FuConfigClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = fu_config_finalize; + + signals[SIGNAL_CHANGED] = + g_signal_new ("changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static void diff --git a/src/fu-engine.c b/src/fu-engine.c index 88b6d96ef..d07843c3a 100644 --- a/src/fu-engine.c +++ b/src/fu-engine.c @@ -2362,6 +2362,16 @@ fu_engine_load_metadata_store (FuEngine *self, FuEngineLoadFlags flags, GError * return TRUE; } +static void +fu_engine_config_changed_cb (FuConfig *config, FuEngine *self) +{ + g_autoptr(GError) error_local = NULL; + if (!fu_engine_load_metadata_store (self, FU_ENGINE_LOAD_FLAG_NONE, + &error_local)) + g_warning ("Failed to reload metadata store: %s", + error_local->message); +} + static FuKeyringResult * fu_engine_get_existing_keyring_result (FuEngine *self, FuKeyring *kr, @@ -4670,6 +4680,10 @@ fu_engine_init (FuEngine *self) self->compile_versions = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); self->approved_firmware = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + g_signal_connect (self->config, "changed", + G_CALLBACK (fu_engine_config_changed_cb), + self); + g_signal_connect (self->idle, "notify::status", G_CALLBACK (fu_engine_idle_status_notify_cb), self);