[rygel] external: Drop Containers/Items props of MediaContainer



commit 94bef58dffa18b059356571216fc4bb03f02f77c
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Thu Jun 24 20:16:01 2010 +0300

    external: Drop Containers/Items props of MediaContainer
    
    These properties have been remove from the spec in favor of
    'ListContainers' and 'ListItems' methods. Now we make use of
    'ListContainers' and D-Bus Properties interface to asynchronously get all
    the container props at once.

 src/plugins/external/rygel-external-container.vala |   59 ++++++++++++-------
 .../external/rygel-external-content-dir.vala       |   19 +-----
 .../external/rygel-external-interfaces.vala        |   13 +++-
 .../external/rygel-external-plugin-factory.vala    |    5 ++
 src/plugins/external/rygel-external-plugin.vala    |    8 +++
 5 files changed, 63 insertions(+), 41 deletions(-)
---
diff --git a/src/plugins/external/rygel-external-container.vala b/src/plugins/external/rygel-external-container.vala
index bd4c9d6..43eec19 100644
--- a/src/plugins/external/rygel-external-container.vala
+++ b/src/plugins/external/rygel-external-container.vala
@@ -42,22 +42,18 @@ public class Rygel.ExternalContainer : Rygel.MediaContainer {
 
     private bool searchable;
 
-    public ExternalContainer (string                 id,
-                              string                 service_name,
-                              string                 host_ip,
-                              ExternalMediaContainer actual_container,
-                              ExternalContainer?     parent = null) {
-        base (id,
-              parent,
-              actual_container.display_name,
-              (int) actual_container.child_count);
+    public ExternalContainer (string             id,
+                              string             title,
+                              uint               child_count,
+                              bool               searchable,
+                              string             service_name,
+                              string             host_ip,
+                              ExternalContainer? parent = null) {
+        base (id, parent, title, (int) child_count);
 
         this.service_name = service_name;
         this.host_ip = host_ip;
-        this.actual_container = actual_container;
-        this.searchable = actual_container.searchable;
         this.item_factory = new ExternalItemFactory ();
-
         this.containers = new ArrayList<ExternalContainer> ();
 
         try {
@@ -66,6 +62,11 @@ public class Rygel.ExternalContainer : Rygel.MediaContainer {
             critical ("Failed to connect to session bus: %s", err.message);
         }
 
+        // Create proxy to MediaContainer iface
+        this.actual_container = this.connection.get_object (this.service_name,
+                                                            id)
+                                as ExternalMediaContainer;
+
         this.update_container.begin (true);
     }
 
@@ -238,20 +239,34 @@ public class Rygel.ExternalContainer : Rygel.MediaContainer {
     }
 
     private async void refresh_child_containers () throws GLib.Error {
-        this.containers.clear ();
+        string[] filter = {};
 
-        var container_paths = this.actual_container.containers;
-        foreach (var container_path in container_paths) {
-            // Create proxy to MediaContainer iface
-            var actual_container = this.connection.get_object (
-                                        this.service_name,
-                                        container_path)
-                                        as ExternalMediaContainer;
+        foreach (var object_prop in ExternalMediaObject.PROPERTIES) {
+            filter += object_prop;
+        }
 
-            var container = new ExternalContainer (container_path,
+        foreach (var container_prop in ExternalMediaContainer.PROPERTIES) {
+            filter += container_prop;
+        }
+
+        var children_props = yield this.actual_container.list_containers (
+                                        0,
+                                        0,
+                                        filter);
+        this.containers.clear ();
+
+        foreach (var props in children_props) {
+            var id = props.lookup ("Path").get_string ();
+            var title = props.lookup ("DisplayName").get_string ();
+            var child_count = props.lookup ("ChildCount").get_uint ();
+            var searchable = props.lookup ("Searchable").get_boolean ();
+
+            var container = new ExternalContainer (id,
+                                                   title,
+                                                   child_count,
+                                                   searchable,
                                                    this.service_name,
                                                    this.host_ip,
-                                                   actual_container,
                                                    this);
             this.containers.add (container);
         }
diff --git a/src/plugins/external/rygel-external-content-dir.vala b/src/plugins/external/rygel-external-content-dir.vala
index 00fdaa6..99a03bc 100644
--- a/src/plugins/external/rygel-external-content-dir.vala
+++ b/src/plugins/external/rygel-external-content-dir.vala
@@ -34,24 +34,13 @@ public class Rygel.ExternalContentDir : Rygel.ContentDirectory {
     public override MediaContainer? create_root_container () {
         var plugin = (ExternalPlugin) this.root_device.resource_factory;
 
-        Connection connection;
-
-        try {
-            connection = DBus.Bus.get (DBus.BusType.SESSION);
-        } catch (DBus.Error err) {
-            // By this time plugin should have successfully accessed the
-            // the session bus, so this in theory can not fail.
-            assert_not_reached ();
-        }
-
-        var actual_container = connection.get_object (plugin.service_name,
-                                                      plugin.root_object)
-                                                      as ExternalMediaContainer;
-
         return new ExternalContainer ("0",
+                                      plugin.title,
+                                      plugin.child_count,
+                                      plugin.searchable,
                                       plugin.service_name,
                                       this.context.host_ip,
-                                      actual_container);
+                                      null);
     }
 }
 
diff --git a/src/plugins/external/rygel-external-interfaces.vala b/src/plugins/external/rygel-external-interfaces.vala
index e84f158..c8c6973 100644
--- a/src/plugins/external/rygel-external-interfaces.vala
+++ b/src/plugins/external/rygel-external-interfaces.vala
@@ -41,13 +41,10 @@ public interface Rygel.ExternalMediaObject : DBus.Object {
 public interface Rygel.ExternalMediaContainer : DBus.Object,
                                                 ExternalMediaObject {
     public static const string IFACE = "org.gnome.UPnP.MediaContainer2";
-    public static const string[] PROPERTIES = { "ChildCount" };
+    public static const string[] PROPERTIES = { "ChildCount", "Searchable" };
 
     public abstract signal void updated ();
 
-    //public abstract ObjectPath[] items { owned get; set; }
-    public abstract ObjectPath[] containers { owned get; set; }
-
     public abstract uint child_count { get; set; }
     public abstract uint item_count { get; set; }
     public abstract uint container_count { get; set; }
@@ -57,6 +54,14 @@ public interface Rygel.ExternalMediaContainer : DBus.Object,
                                         uint     offset,
                                         uint     max_count,
                                         string[] filter) throws DBus.Error;
+    public abstract async HashTable<string,Value?>[] list_containers (
+                                        uint     offset,
+                                        uint     max_count,
+                                        string[] filter) throws DBus.Error;
+    public abstract async HashTable<string,Value?>[] list_items (
+                                        uint     offset,
+                                        uint     max_count,
+                                        string[] filter) throws DBus.Error;
 
     // Optional API
     public abstract async HashTable<string,Value?>[] search_objects (
diff --git a/src/plugins/external/rygel-external-plugin-factory.vala b/src/plugins/external/rygel-external-plugin-factory.vala
index 34e2d7a..99f051b 100644
--- a/src/plugins/external/rygel-external-plugin-factory.vala
+++ b/src/plugins/external/rygel-external-plugin-factory.vala
@@ -151,8 +151,13 @@ public class Rygel.ExternalPluginFactory {
             title = service_name;
         }
 
+        var child_count = container_props.lookup ("ChildCount").get_uint ();
+        var searchable = container_props.lookup ("Searchable").get_boolean ();
+
         var plugin = new ExternalPlugin (service_name,
                                          title,
+                                         child_count,
+                                         searchable,
                                          root_object,
                                          icon);
 
diff --git a/src/plugins/external/rygel-external-plugin.vala b/src/plugins/external/rygel-external-plugin.vala
index c9eefad..cddd53c 100644
--- a/src/plugins/external/rygel-external-plugin.vala
+++ b/src/plugins/external/rygel-external-plugin.vala
@@ -28,8 +28,14 @@ public class Rygel.ExternalPlugin : Rygel.Plugin {
     public string service_name;
     public string root_object;
 
+    // Root container properties
+    public uint child_count;
+    public bool searchable;
+
     public ExternalPlugin (string    service_name,
                            string    title,
+                           uint      child_count,
+                           bool      searchable,
                            string    root_object,
                            IconInfo? icon) {
         base.MediaServer (service_name,
@@ -38,6 +44,8 @@ public class Rygel.ExternalPlugin : Rygel.Plugin {
                           "Rygel External " + title);
 
         this.service_name = service_name;
+        this.child_count = child_count;
+        this.searchable = searchable;
         this.root_object = root_object;
         if (icon != null) {
             this.add_icon (icon);



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