[rygel] external: Use static client D-Bus syntax



commit eb2065349fec4a870968ede478c47fba24d09b7d
Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
Date:   Wed Oct 14 17:38:39 2009 +0300

    external: Use static client D-Bus syntax

 src/plugins/external/Makefile.am                   |    1 +
 src/plugins/external/rygel-external-container.vala |   77 +++++-----------
 .../external/rygel-external-interfaces.vala        |   95 ++++++++++++++++++++
 src/plugins/external/rygel-external-item.vala      |   13 ++--
 .../external/rygel-external-plugin-factory.vala    |   55 ++++++------
 src/plugins/external/rygel-external-plugin.vala    |   21 ++---
 6 files changed, 160 insertions(+), 102 deletions(-)
---
diff --git a/src/plugins/external/Makefile.am b/src/plugins/external/Makefile.am
index 1725cb7..89c7af7 100644
--- a/src/plugins/external/Makefile.am
+++ b/src/plugins/external/Makefile.am
@@ -13,6 +13,7 @@ librygel_external_la_SOURCES = rygel-external-content-dir.vala \
 			       rygel-external-container.vala \
 			       rygel-external-item.vala \
 			       rygel-external-plugin.vala \
+			       rygel-external-interfaces.vala \
 			       rygel-external-plugin-factory.vala
 
 rygel-external.stamp: $(librygel_external_la_VALASOURCES)
diff --git a/src/plugins/external/rygel-external-container.vala b/src/plugins/external/rygel-external-container.vala
index 69c7130..4a869de 100644
--- a/src/plugins/external/rygel-external-container.vala
+++ b/src/plugins/external/rygel-external-container.vala
@@ -30,14 +30,7 @@ using Gee;
  * Represents an external container.
  */
 public class Rygel.ExternalContainer : Rygel.MediaContainer {
-    // class-wide constants
-    private static string PROPS_IFACE = "org.freedesktop.DBus.Properties";
-    private const string OBJECT_IFACE = "org.gnome.UPnP.MediaObject1";
-    private const string CONTAINER_IFACE = "org.gnome.UPnP.MediaContainer1";
-    private const string ITEM_IFACE = "org.gnome.UPnP.MediaItem1";
-
-    public dynamic DBus.Object actual_container;
-    public dynamic DBus.Object props;
+    public ExternalMediaContainer actual_container;
 
     public string host_ip;
 
@@ -62,22 +55,16 @@ public class Rygel.ExternalContainer : Rygel.MediaContainer {
         try {
             DBus.Connection connection = DBus.Bus.get (DBus.BusType.SESSION);
 
-            // Create proxy to MediaObject iface to get the display name through
-            this.props = connection.get_object (service_name,
-                                                object_path,
-                                                PROPS_IFACE);
-            Value value;
-            this.props.Get (OBJECT_IFACE, "DisplayName", out value);
-            this.title = this.substitute_keywords (value.get_string ());
-
-            // Now proxy to MediaContainer iface for the rest of the stuff
-            this.actual_container = connection.get_object (service_name,
-                                                           object_path,
-                                                           CONTAINER_IFACE);
+            // Create proxy to MediaContainer iface
+            this.actual_container = connection.get_object (
+                                        service_name,
+                                        object_path)
+                                        as ExternalMediaContainer;
+            this.title = this.actual_container.display_name;
 
             this.update_container ();
 
-            this.actual_container.Updated += this.on_container_updated;
+            this.actual_container.updated += this.on_updated;
         } catch (GLib.Error err) {
             critical ("Failed to fetch information about container '%s': %s\n",
                       this.id,
@@ -95,23 +82,16 @@ public class Rygel.ExternalContainer : Rygel.MediaContainer {
         media_objects.add_all (this.containers);
 
         // Then get and add the child items
-        Value value;
-        this.props.Get (CONTAINER_IFACE, "Items", out value);
-
-        unowned PtrArray obj_paths = (PtrArray) value.get_boxed ();
-        if (obj_paths.len > 0) {
-            for (var i = 0; i < obj_paths.len; i++) {
-                var obj_path = (ObjectPath) obj_paths.pdata[i];
-
-                try {
-                    var item = new ExternalItem.for_path (obj_path, this);
-
-                    media_objects.add (item);
-                } catch (GLib.Error err) {
-                    warning ("Error initializable item at '%s': %s. Ignoring..",
-                             obj_path,
-                             err.message);
-                }
+        var obj_paths = this.actual_container.items;
+        foreach (var obj_path in obj_paths) {
+            try {
+                var item = new ExternalItem.for_path (obj_path, this);
+
+                media_objects.add (item);
+            } catch (GLib.Error err) {
+                warning ("Error initializable item at '%s': %s. Ignoring..",
+                        obj_path,
+                        err.message);
             }
         }
 
@@ -196,29 +176,22 @@ public class Rygel.ExternalContainer : Rygel.MediaContainer {
     private void update_container () throws GLib.Error {
         this.containers.clear ();
 
-        Value value;
-        this.props.Get (CONTAINER_IFACE, "Containers", out value);
-
-        unowned PtrArray obj_paths = (PtrArray) value.get_boxed ();
-        if (obj_paths.len > 0) {
-            for (var i = 0; i < obj_paths.len; i++) {
-                var obj_path = (ObjectPath) obj_paths.pdata[i];
-                var container = new ExternalContainer (
+        var obj_paths = this.actual_container.containers;
+        foreach (var obj_path in obj_paths) {
+            var container = new ExternalContainer (
                                         "container:" + (string) obj_path,
                                         this.service_name,
                                         obj_path,
                                         this.host_ip,
                                         this);
-                this.containers.add (container);
-            }
+            this.containers.add (container);
         }
 
-        this.child_count = this.containers.size;
-        this.props.Get (CONTAINER_IFACE, "ItemCount", out value);
-        this.child_count += value.get_uint ();
+        this.child_count = this.containers.size +
+                           this.actual_container.item_count;
     }
 
-    private void on_container_updated (dynamic DBus.Object actual_container) {
+    private void on_updated (ExternalMediaContainer actual_container) {
         try {
             // Update our information about the container
             this.update_container ();
diff --git a/src/plugins/external/rygel-external-interfaces.vala b/src/plugins/external/rygel-external-interfaces.vala
new file mode 100644
index 0000000..110dfcd
--- /dev/null
+++ b/src/plugins/external/rygel-external-interfaces.vala
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation.
+ *
+ * Author: Zeeshan Ali (Khattak) <zeeshanak gnome org>
+ *                               <zeeshan ali nokia com>
+ *
+ * This file is part of Rygel.
+ *
+ * Rygel is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Rygel is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+using DBus;
+
+[DBus (name = "org.gnome.UPnP.MediaObject1")]
+public interface Rygel.ExternalMediaObject : DBus.Object {
+    public abstract ObjectPath parent { owned get; set; }
+    public abstract string display_name { owned get; set; }
+}
+
+[DBus (name = "org.gnome.UPnP.MediaContainer1")]
+public interface Rygel.ExternalMediaContainer : DBus.Object,
+                                                ExternalMediaObject {
+    public abstract signal void updated ();
+
+    public abstract ObjectPath[] items { owned get; set; }
+    public abstract ObjectPath[] containers { owned get; set; }
+
+    public abstract uint item_count { get; set; }
+    public abstract uint container_count { get; set; }
+
+    // Optional API
+    public abstract ObjectPath icon { owned get; set; }
+}
+
+[DBus (name = "org.gnome.UPnP.MediaItem1")]
+public interface Rygel.ExternalMediaItem : DBus.Object, ExternalMediaObject {
+    [DBus (name = "URLs")]
+    public abstract string[] urls { owned get; set; }
+    public abstract string mime_type { owned get; set; }
+    [DBus (name = "Type")]
+    public abstract string media_type { owned get; set; }
+
+    // Optional API
+    public abstract int size { get; set; }
+    public abstract string artist { owned get; set; }
+    public abstract string album { owned get; set; }
+    public abstract string date { owned get; set; }
+    public abstract string genre { owned get; set; }
+    public abstract string dlna_profile { owned get; set; }
+
+    // video and audio/music
+    // in seconds
+    public abstract int duration { get; set; }
+    // in bytes/second (braindead, yes but tell that to UPnP authors)
+    public abstract int bitrate { get; set; }
+    public abstract int sample_rate { get; set; }
+    public abstract int bits_per_sample { get; set; }
+
+    // video and images
+    public abstract int width { get; set; }
+    public abstract int height { get; set; }
+    public abstract int color_depth { get; set; }
+    public abstract ObjectPath thumbnail { owned get; set; }
+
+    // audio and music
+    public abstract ObjectPath album_art { owned get; set; }
+}
+
+[DBus (name = "org.freedesktop.DBus")]
+public interface FreeDesktop.DBusObject: DBus.Object {
+    public abstract signal void name_owner_changed (string name,
+                                                    string old_owner,
+                                                    string new_owner);
+
+    public abstract string[] list_names () throws DBus.Error;
+    public abstract string[] list_activatable_names () throws DBus.Error;
+}
+
+[DBus (name = "org.freedesktop.DBus.Properties")]
+public interface FreeDesktop.Properties: DBus.Object {
+    public abstract HashTable<string,Value?> get_all (string iface)
+                                                      throws DBus.Error;
+}
diff --git a/src/plugins/external/rygel-external-item.vala b/src/plugins/external/rygel-external-item.vala
index f3faf7d..a0cf8e5 100644
--- a/src/plugins/external/rygel-external-item.vala
+++ b/src/plugins/external/rygel-external-item.vala
@@ -24,12 +24,12 @@
 
 using GUPnP;
 using DBus;
+using FreeDesktop;
 
 /**
  * Represents External item.
  */
 public class Rygel.ExternalItem : Rygel.MediaItem {
-    private static string PROPS_IFACE = "org.freedesktop.DBus.Properties";
     private static string OBJECT_IFACE = "org.gnome.UPnP.MediaObject1";
     private static string ITEM_IFACE = "org.gnome.UPnP.MediaItem1";
 
@@ -57,17 +57,16 @@ public class Rygel.ExternalItem : Rygel.MediaItem {
 
         DBus.Connection connection = DBus.Bus.get (DBus.BusType.SESSION);
 
-        dynamic DBus.Object props = connection.get_object (parent.service_name,
-                                                           object_path,
-                                                           PROPS_IFACE);
+        var props = connection.get_object (parent.service_name,
+                                           object_path)
+                                          as Properties;
 
-        HashTable<string,Value?> object_props = props.GetAll (OBJECT_IFACE);
+        var object_props = props.get_all (OBJECT_IFACE);
 
         var value = object_props.lookup ("DisplayName");
         this.title = parent.substitute_keywords (value.get_string ());
 
-        HashTable<string,Value?> item_props;
-        props.GetAll (ITEM_IFACE, out item_props);
+        var item_props = props.get_all (ITEM_IFACE);
 
         value = item_props.lookup ("Type");
         string type = value.get_string ();
diff --git a/src/plugins/external/rygel-external-plugin-factory.vala b/src/plugins/external/rygel-external-plugin-factory.vala
index d1d7e5e..82995e2 100644
--- a/src/plugins/external/rygel-external-plugin-factory.vala
+++ b/src/plugins/external/rygel-external-plugin-factory.vala
@@ -25,6 +25,7 @@
 using Rygel;
 using Gee;
 using CStuff;
+using FreeDesktop;
 
 private ExternalPluginFactory plugin_factory;
 
@@ -41,37 +42,41 @@ public void module_init (PluginLoader loader) {
 public class ExternalPluginFactory {
     private const string DBUS_SERVICE = "org.freedesktop.DBus";
     private const string DBUS_OBJECT = "/org/freedesktop/DBus";
-    private const string DBUS_IFACE = "org.freedesktop.DBus";
 
     private const string SERVICE_PREFIX = "org.gnome.UPnP.MediaServer1.";
 
-    dynamic DBus.Object dbus_obj;
-    DBus.Connection     connection;
-    PluginLoader        loader;
-
-    bool activatable; // Indicated if we have listed activatable services yet
+    DBusObject dbus_obj;
+    DBus.Connection  connection;
+    PluginLoader     loader;
 
     public ExternalPluginFactory (PluginLoader loader) throws DBus.Error {
         this.connection = DBus.Bus.get (DBus.BusType.SESSION);
 
         this.dbus_obj = connection.get_object (DBUS_SERVICE,
-                                               DBUS_OBJECT,
-                                               DBUS_IFACE);
+                                               DBUS_OBJECT)
+                                               as DBusObject;
         this.loader = loader;
 
-        this.activatable = false;
-        dbus_obj.ListNames (this.list_names_cb);
+        this.load_plugins ();
     }
 
-    private void list_names_cb (string[]   services,
-                                GLib.Error err) {
-        if (err != null) {
-            critical ("Failed to fetch list of external services: %s\n",
-                      err.message);
+    private void load_plugins () throws DBus.Error {
+        var services = this.dbus_obj.list_names ();
 
-            return;
+        foreach (var service in services) {
+            if (service.has_prefix (SERVICE_PREFIX) &&
+                this.loader.get_plugin_by_name (service) == null) {
+                this.loader.add_plugin (new ExternalPlugin (this.connection,
+                                                            service));
+            }
         }
 
+        this.load_activatable_plugins ();
+    }
+
+    private void load_activatable_plugins () throws DBus.Error {
+        var services = this.dbus_obj.list_activatable_names ();
+
         foreach (var service in services) {
             if (service.has_prefix (SERVICE_PREFIX) &&
                 this.loader.get_plugin_by_name (service) == null) {
@@ -80,21 +85,13 @@ public class ExternalPluginFactory {
             }
         }
 
-        if (this.activatable) {
-            // Activatable services are already taken-care of, now we can
-            // just relax but keep a watch on bus for plugins coming and
-            // going away on the fly.
-            dbus_obj.NameOwnerChanged += this.name_owner_changed;
-        } else {
-            dbus_obj.ListActivatableNames (this.list_names_cb);
-            this.activatable = true;
-        }
+        this.dbus_obj.name_owner_changed += this.name_owner_changed;
     }
 
-    private void name_owner_changed (dynamic DBus.Object dbus_obj,
-                                     string              name,
-                                     string              old_owner,
-                                     string              new_owner) {
+    private void name_owner_changed (DBusObject dbus_obj,
+                                     string     name,
+                                     string     old_owner,
+                                     string     new_owner) {
         var plugin = this.loader.get_plugin_by_name (name);
 
         if (plugin != null) {
diff --git a/src/plugins/external/rygel-external-plugin.vala b/src/plugins/external/rygel-external-plugin.vala
index a518ef8..896f133 100644
--- a/src/plugins/external/rygel-external-plugin.vala
+++ b/src/plugins/external/rygel-external-plugin.vala
@@ -23,27 +23,20 @@
  */
 
 public class Rygel.ExternalPlugin : Rygel.Plugin {
-    // class-wide constants
-    private const string PROPS_IFACE = "org.freedesktop.DBus.Properties";
-    private const string OBJECT_IFACE = "org.gnome.UPnP.MediaObject1";
-
     public string service_name;
     public string root_object;
 
-    public ExternalPlugin (DBus.Connection     connection,
-                           string              service_name) {
+    public ExternalPlugin (DBus.Connection connection,
+                           string          service_name) {
         // org.gnome.UPnP.MediaServer1.NAME => /org/gnome/UPnP/MediaServer1/NAME
         var root_object = "/" + service_name.replace (".", "/");
 
         // Create proxy to MediaObject iface to get the display name through
-        dynamic DBus.Object props = connection.get_object (service_name,
-                                                           root_object,
-                                                           PROPS_IFACE);
-        Value value;
-        props.Get (OBJECT_IFACE, "DisplayName", out value);
-        var title = value.get_string ();
-
-        base.MediaServer (service_name, title, typeof (ExternalContentDir));
+        var obj = (ExternalMediaObject) connection.get_object (service_name,
+                                                               root_object);
+        base.MediaServer (service_name,
+                          obj.display_name,
+                          typeof (ExternalContentDir));
 
         this.service_name = service_name;
         this.root_object = root_object;



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