------------------------------------------------------------
revno: 460
committer: Michal Hruby <michal....@gmail.com>
branch nick: zeitgeist
timestamp: Wed 2012-04-04 19:25:15 +0200
message:
  We can't auto-discard events from disabled data sources based on bus address, 
cause there can be multiple sources registered for the same address - fixes an 
issue with datahub
modified:
  extensions/ds-registry.vala


--
lp:zeitgeist
https://code.launchpad.net/~zeitgeist/zeitgeist/bluebird

Your team Zeitgeist Framework Team is subscribed to branch lp:zeitgeist.
To unsubscribe from this branch go to 
https://code.launchpad.net/~zeitgeist/zeitgeist/bluebird/+edit-subscription
=== modified file 'extensions/ds-registry.vala'
--- extensions/ds-registry.vala	2012-03-26 18:12:03 +0000
+++ extensions/ds-registry.vala	2012-04-04 17:25:15 +0000
@@ -166,8 +166,10 @@
 
     class DataSourceRegistry: Extension, RemoteRegistry
     {
+        private const string MULTIPLE_MARKER = "<multiple>";
         private HashTable<string, DataSource> sources;
-        private HashTable<string, GenericArray<BusName>> running;
+        private HashTable<string, GenericArray<BusName>> running_ds;
+        private HashTable<string, string> bus_name_2_ds;
         private uint registration_id;
         private bool dirty;
 
@@ -180,7 +182,8 @@
 
         construct
         {
-            running = new HashTable<string, GenericArray<BusName?>>(
+            bus_name_2_ds = new HashTable<string, string> (str_hash, str_equal);
+            running_ds = new HashTable<string, GenericArray<BusName?>>(
                 str_hash, str_equal);
 
             Variant? registry = retrieve_config ("registry",
@@ -272,15 +275,26 @@
             }
 
 
-            var sender_array = running.lookup (unique_id);
+            var sender_array = running_ds.lookup (unique_id);
             if (sender_array == null)
             {
-                running.insert (unique_id, new GenericArray<BusName?>());
-                running.lookup (unique_id).add (sender);
-            }
-            else if (is_sender_known (sender, sender_array))
-            {
-                running.lookup (unique_id).add (sender);
+                sender_array = new GenericArray<BusName?>();
+                sender_array.add (sender);
+                running_ds.insert (unique_id, sender_array);
+            }
+            else if (!is_sender_known (sender, sender_array))
+            {
+                sender_array.add (sender);
+            }
+
+            unowned string ds_id = bus_name_2_ds.lookup (sender);
+            if (ds_id == null)
+            {
+                bus_name_2_ds.insert (sender, unique_id);
+            }
+            else if (ds_id != unique_id && ds_id != MULTIPLE_MARKER)
+            {
+                bus_name_2_ds.insert (sender, MULTIPLE_MARKER);
             }
 
             unowned DataSource? ds = sources.lookup (unique_id);
@@ -350,17 +364,21 @@
         public override void pre_insert_events (GenericArray<Event?> events,
             BusName? sender)
         {
-            foreach (string unique_id in running.get_keys())
+            foreach (unowned string unique_id in running_ds.get_keys())
             {
-                GenericArray<BusName?> bus_names = running.lookup (unique_id);
+                GenericArray<BusName?> bus_names = running_ds.lookup (unique_id);
                 if (is_sender_known (sender, bus_names))
                 {
                     var data_source = sources.lookup (unique_id);
 
-                    data_source.timestamp =  Timestamp.now ();
+                    data_source.timestamp = Timestamp.now ();
                     dirty = true;
 
-                    if (!data_source.enabled)
+                    // if one sender registers multiple unique data sources,
+                    // we have to rely that it's the correct thing, otherwise
+                    // we can just ignore the events
+                    unowned string ds_id = bus_name_2_ds.lookup (sender);
+                    if (!data_source.enabled && ds_id != MULTIPLE_MARKER)
                     {
                         for (int i = 0; i < events.length; i++)
                             events[i] = null;
@@ -386,7 +404,7 @@
             var disconnected_ds = new GenericArray<DataSource> ();
             {
                 var iter = HashTableIter<string, GenericArray<BusName?>> (
-                    running);
+                    running_ds);
                 unowned string uid;
                 unowned GenericArray<BusName> name_arr;
                 while (iter.next (out uid, out name_arr))
@@ -414,11 +432,11 @@
                 ds.timestamp = Timestamp.now ();
                 dirty = true;
 
-                if (running.lookup (uid).length == 0)
+                if (running_ds.lookup (uid).length == 0)
                 {
                     debug ("No remaining client running: %s [%s]",
                         ds.name, uid);
-                    running.remove (uid);
+                    running_ds.remove (uid);
                     ds.running = false;
 
                     data_source_disconnected (ds.to_variant ());

_______________________________________________
Mailing list: https://launchpad.net/~zeitgeist
Post to     : zeitgeist@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zeitgeist
More help   : https://help.launchpad.net/ListHelp

Reply via email to