[rygel] external: Use static client D-Bus syntax
- From: Zeeshan Ali Khattak <zeeshanak src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [rygel] external: Use static client D-Bus syntax
- Date: Fri, 16 Oct 2009 16:24:11 +0000 (UTC)
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]