[dconf] engine: filter change signals properly



commit a06fbabc24c0eedc5ccae5e527e4fed6823b65c2
Author: Ryan Lortie <desrt desrt ca>
Date:   Wed Nov 27 13:03:51 2013 -0500

    engine: filter change signals properly
    
    Testing revealed that we were transmitting any change signal that came
    in from the bus up to user code, even if the engine in question was not
    interested in receiving the signal.
    
    This is a problem in the case that two DConfClient objects exist for
    different profiles.  In that case, we'd get crosstalk between the
    subscriptions that each client had made and change notifications would
    appear in both clients even if the change only affected one.

 engine/dconf-engine.c |   25 +++++++++++++++++++++++--
 1 files changed, 23 insertions(+), 2 deletions(-)
---
diff --git a/engine/dconf-engine.c b/engine/dconf-engine.c
index c3e5707..33ffd57 100644
--- a/engine/dconf-engine.c
+++ b/engine/dconf-engine.c
@@ -1181,6 +1181,25 @@ dconf_engine_change_sync (DConfEngine     *engine,
   return TRUE;
 }
 
+static gboolean
+dconf_engine_is_interested_in_signal (DConfEngine *engine,
+                                      GBusType     bus_type,
+                                      const gchar *sender,
+                                      const gchar *path)
+{
+  gint i;
+
+  for (i = 0; i < engine->n_sources; i++)
+    {
+      DConfEngineSource *source = engine->sources[i];
+
+      if (source->bus_type == bus_type && g_str_equal (source->object_path, path))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
 void
 dconf_engine_handle_dbus_signal (GBusType     type,
                                  const gchar *sender,
@@ -1215,7 +1234,8 @@ dconf_engine_handle_dbus_signal (GBusType     type,
            * Check last_handled to determine if we should ignore it.
            */
           if (!engine->last_handled || !g_str_equal (engine->last_handled, tag))
-            dconf_engine_change_notify (engine, prefix, changes, tag, FALSE, NULL, engine->user_data);
+            if (dconf_engine_is_interested_in_signal (engine, type, sender, path))
+              dconf_engine_change_notify (engine, prefix, changes, tag, FALSE, NULL, engine->user_data);
 
           engines = g_slist_delete_link (engines, engines);
 
@@ -1244,7 +1264,8 @@ dconf_engine_handle_dbus_signal (GBusType     type,
         {
           DConfEngine *engine = engines->data;
 
-          dconf_engine_change_notify (engine, path, empty_str_list, "", TRUE, NULL, engine->user_data);
+          if (dconf_engine_is_interested_in_signal (engine, type, sender, path))
+            dconf_engine_change_notify (engine, path, empty_str_list, "", TRUE, NULL, engine->user_data);
 
           engines = g_slist_delete_link (engines, engines);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]