[rygel] external: Drop Containers/Items props of MediaContainer
- From: Zeeshan Ali Khattak <zeeshanak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel] external: Drop Containers/Items props of MediaContainer
- Date: Thu, 24 Jun 2010 17:50:26 +0000 (UTC)
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]