[rygel] server: Try harder to find compatible container
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel] server: Try harder to find compatible container
- Date: Tue, 6 Aug 2013 13:18:04 +0000 (UTC)
commit 9b48586af250aef7769a1289daa9992c42023089
Author: Jens Georg <jensg openismus com>
Date: Tue Aug 6 15:03:11 2013 +0200
server: Try harder to find compatible container
Just grabbing the first container and then validate the create classes
doesn't really work; we search for compatible create classes right away.
Fixes issue introduced with 3fae8be1 if MediaExport has virtual folders
enabled.
src/librygel-server/rygel-object-creator.vala | 45 ++++++++++++++++++++++++-
1 files changed, 44 insertions(+), 1 deletions(-)
---
diff --git a/src/librygel-server/rygel-object-creator.vala b/src/librygel-server/rygel-object-creator.vala
index ce5789c..58b193c 100644
--- a/src/librygel-server/rygel-object-creator.vala
+++ b/src/librygel-server/rygel-object-creator.vala
@@ -287,6 +287,44 @@ internal class Rygel.ObjectCreator: GLib.Object, Rygel.StateMachine {
}
}
+ private async SearchExpression build_create_class_expression
+ (SearchExpression expression) {
+ // Take create-classes into account
+ if (!(this.didl_object is DIDLLiteContainer)) {
+ return expression;
+ }
+
+ var didl_container = this.didl_object as DIDLLiteContainer;
+ var create_classes = didl_container.get_create_classes ();
+ if (create_classes == null) {
+ return expression;
+ }
+
+ var builder = new StringBuilder ("(");
+ foreach (var create_class in create_classes) {
+ builder.append_printf ("(upnp:createClass derivedfrom \"%s\") AND",
+ create_class);
+ }
+
+ // remove dangeling AND
+ builder.truncate (builder.len - 3);
+ builder.append (")");
+
+ try {
+ var parser = new SearchCriteriaParser (builder.str);
+ yield parser.run ();
+
+ var rel = new LogicalExpression ();
+ rel.operand1 = expression;
+ rel.op = LogicalOperator.AND;
+ rel.operand2 = parser.expression;
+
+ return rel;
+ } catch (Error error) {
+ assert_not_reached ();
+ }
+ }
+
/**
* Find a container that can create items matching the UPnP class of the
* requested item.
@@ -311,11 +349,16 @@ internal class Rygel.ObjectCreator: GLib.Object, Rygel.StateMachine {
expression.op = SearchCriteriaOp.DERIVED_FROM;
expression.operand1 = "upnp:createClass";
+ // Add container's create classes to the search expression if there
+ // are some
+ var search_expression = yield this.build_create_class_expression
+ (expression);
+
while (upnp_class != "object") {
expression.operand2 = upnp_class;
uint total_matches;
- var result = yield root_container.search (expression,
+ var result = yield root_container.search (search_expression,
0,
1,
out total_matches,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]