tracker: Update containers on changes to subjects
authorZeeshan Ali (Khattak) <zeeshanak@gnome.org>
Wed, 23 Dec 2009 14:05:26 +0000 (16:05 +0200)
committerZeeshan Ali (Khattak) <zeeshanak@gnome.org>
Wed, 23 Dec 2009 14:05:26 +0000 (16:05 +0200)
For the moment we are only doing this in MetadataValues but since all
top-level containers are instances of MetadataValues (or subclass), we
are safe.

src/plugins/tracker/rygel-tracker-item-factory.vala
src/plugins/tracker/rygel-tracker-metadata-values.vala
src/plugins/tracker/rygel-tracker-music-item-factory.vala
src/plugins/tracker/rygel-tracker-picture-item-factory.vala
src/plugins/tracker/rygel-tracker-search-container.vala
src/plugins/tracker/rygel-tracker-video-item-factory.vala

index acbb9c9..3f27f7a 100644 (file)
@@ -39,13 +39,16 @@ public abstract class Rygel.TrackerItemFactory {
 
     public string category;
     public string upnp_class;
+    public string resources_class_path;
 
     public ArrayList<ArrayList<string>> key_chains;
 
     public TrackerItemFactory (string category,
-                               string upnp_class) {
+                               string upnp_class,
+                               string resources_class_path) {
         this.category = category;
         this.upnp_class = upnp_class;
+        this.resources_class_path = resources_class_path;
 
         this.key_chains = new ArrayList<ArrayList<string>> ();
 
index 7c9d4f9..315cfbb 100644 (file)
@@ -48,6 +48,7 @@ public class Rygel.TrackerMetadataValues : Rygel.SimpleContainer {
     public FilterFunc filter_func;
 
     private TrackerResourcesIface resources;
+    private TrackerResourcesClassIface resources_class;
 
     public TrackerMetadataValues (string             id,
                                   MediaContainer     parent,
@@ -78,9 +79,14 @@ public class Rygel.TrackerMetadataValues : Rygel.SimpleContainer {
         }
 
         this.fetch_metadata_values.begin ();
+
+        this.hook_to_changes ();
     }
 
     private async void fetch_metadata_values () {
+        // First thing, clear the existing hierarchy, if any
+        this.clear ();
+
         int i;
         var mandatory = new TrackerQueryTriplets ();
 
@@ -123,9 +129,6 @@ public class Rygel.TrackerMetadataValues : Rygel.SimpleContainer {
 
         string[,] values;
         try {
-            /* FIXME: We need to hook to some tracker signals to keep
-             *        this field up2date at all times
-             */
             values = yield query.execute (this.resources);
         } catch (DBus.Error error) {
             critical ("error getting all values for '%s': %s",
@@ -186,6 +189,23 @@ public class Rygel.TrackerMetadataValues : Rygel.SimpleContainer {
         this.resources = connection.get_object (TRACKER_SERVICE,
                                                 RESOURCES_PATH)
                                                 as TrackerResourcesIface;
+        this.resources_class = connection.get_object (
+                                        TRACKER_SERVICE,
+                                        this.item_factory.resources_class_path)
+                                        as TrackerResourcesClassIface;
+    }
+
+    private void hook_to_changes () {
+        // For any changes in subjects, just recreate hierarchy
+        this.resources_class.subjects_added.connect ((subjects) => {
+            this.fetch_metadata_values.begin ();
+        });
+        this.resources_class.subjects_removed.connect ((subjects) => {
+            this.fetch_metadata_values.begin ();
+        });
+        this.resources_class.subjects_changed.connect ((before, after) => {
+            this.fetch_metadata_values.begin ();
+        });
     }
 
     private bool is_child_id_unique (string child_id) {
index 99b4712..a10d2e3 100644 (file)
@@ -39,7 +39,7 @@ public class Rygel.TrackerMusicItemFactory : Rygel.TrackerItemFactory {
     private const string CATEGORY = "nmm:MusicPiece";
 
     public TrackerMusicItemFactory () {
-        base (CATEGORY, MediaItem.MUSIC_CLASS);
+        base (CATEGORY, MediaItem.MUSIC_CLASS, MUSIC_RESOURCES_CLASS_PATH);
 
         for (var i = this.key_chains.size; i < MusicMetadata.LAST_KEY; i++) {
             this.key_chains.add (new ArrayList<string> ());
index 737b5a2..d5abebe 100644 (file)
@@ -37,7 +37,7 @@ public class Rygel.TrackerPictureItemFactory : Rygel.TrackerItemFactory {
     private const string CATEGORY = "nmm:Photo";
 
     public TrackerPictureItemFactory () {
-        base (CATEGORY, MediaItem.IMAGE_CLASS);
+        base (CATEGORY, MediaItem.IMAGE_CLASS, PHOTO_RESOURCES_CLASS_PATH);
 
         for (var i = this.key_chains.size; i < PictureMetadata.LAST_KEY; i++) {
             this.key_chains.add (new ArrayList<string> ());
index a30d875..3224d01 100644 (file)
@@ -96,9 +96,6 @@ public class Rygel.TrackerSearchContainer : Rygel.MediaContainer {
         try {
             this.create_proxies ();
 
-            /* FIXME: We need to hook to some tracker signals to keep
-             *        this field up2date at all times
-             */
             this.get_children_count.begin ();
         } catch (DBus.Error error) {
             critical ("Failed to connect to session bus: %s\n", error.message);
index 680381e..cb1accf 100644 (file)
@@ -38,7 +38,7 @@ public class Rygel.TrackerVideoItemFactory : Rygel.TrackerItemFactory {
     private const string CATEGORY = "nmm:Video";
 
     public TrackerVideoItemFactory () {
-        base (CATEGORY, MediaItem.VIDEO_CLASS);
+        base (CATEGORY, MediaItem.VIDEO_CLASS, VIDEO_RESOURCES_CLASS_PATH);
 
         for (var i = this.key_chains.size; i < VideoMetadata.LAST_KEY; i++) {
             this.key_chains.add (new ArrayList<string> ());