[rygel] server: Implement search for upnp:*UpdateID
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel] server: Implement search for upnp:*UpdateID
- Date: Mon, 29 Oct 2012 14:53:33 +0000 (UTC)
commit c82024c3ba450787be7875f24b5729a6dbf9176b
Author: Jens Georg <jensg openismus com>
Date: Mon Oct 22 14:48:25 2012 +0200
server: Implement search for upnp:*UpdateID
src/librygel-server/rygel-content-directory.vala | 8 +++
.../rygel-relational-expression.vala | 48 ++++++++++++++++++++
tests/rygel-item-creator-test.vala | 8 +++
3 files changed, 64 insertions(+), 0 deletions(-)
---
diff --git a/src/librygel-server/rygel-content-directory.vala b/src/librygel-server/rygel-content-directory.vala
index df4db64..0826c18 100644
--- a/src/librygel-server/rygel-content-directory.vala
+++ b/src/librygel-server/rygel-content-directory.vala
@@ -76,6 +76,8 @@ internal class Rygel.ContentDirectory: Service {
private string service_reset_token;
+ private string search_caps;
+
public override void constructed () {
this.cancellable = new Cancellable ();
@@ -94,6 +96,12 @@ internal class Rygel.ContentDirectory: Service {
this.last_change = new LastChange ();
+ this.search_caps = RelationalExpression.CAPS;
+
+ if (PluginCapabilities.TRACK_CHANGES in plugin.capabilities) {
+ this.search_caps += ",upnp:objectUpdateID,upnp:containerUpdateID";
+ }
+
this.feature_list =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<Features xmlns=\"urn:schemas-upnp-org:av:avs\" " +
diff --git a/src/librygel-server/rygel-relational-expression.vala b/src/librygel-server/rygel-relational-expression.vala
index 744d37a..119eed3 100644
--- a/src/librygel-server/rygel-relational-expression.vala
+++ b/src/librygel-server/rygel-relational-expression.vala
@@ -45,6 +45,33 @@ public class Rygel.RelationalExpression :
return this.compare_string (media_object.upnp_class);
case "dc:title":
return this.compare_string (media_object.title);
+ case "upnp:objectUpdateID":
+ if (this.op == SearchCriteriaOp.EXISTS) {
+ if (this.operand2 == "true") {
+ return media_object is TrackableContainer ||
+ media_object is TrackableItem;
+ } else {
+ return !(media_object is TrackableContainer ||
+ media_object is TrackableItem);
+ }
+ } else {
+ return this.compare_uint (media_object.object_update_id);
+ }
+ case "upnp:containerUpdateID":
+ if (!(media_object is MediaContainer)) {
+ return false;
+ }
+
+ if (this.op == SearchCriteriaOp.EXISTS) {
+ if (this.operand2 == "true") {
+ return media_object is TrackableContainer;
+ } else {
+ return !(media_object is TrackableContainer);
+ }
+ } else {
+ var container = media_object as MediaContainer;
+ return this.compare_uint (container.update_id);
+ }
case "upnp:createClass":
if (!(media_object is WritableContainer)) {
return false;
@@ -149,4 +176,25 @@ public class Rygel.RelationalExpression :
return false;
}
}
+
+ public bool compare_uint (uint integer) {
+ var operand2 = uint64.parse (this.operand2);
+
+ switch (this.op) {
+ case SearchCriteriaOp.EQ:
+ return integer == operand2;
+ case SearchCriteriaOp.NEQ:
+ return integer != operand2;
+ case SearchCriteriaOp.LESS:
+ return integer < operand2;
+ case SearchCriteriaOp.LEQ:
+ return integer <= operand2;
+ case SearchCriteriaOp.GREATER:
+ return integer > operand2;
+ case SearchCriteriaOp.GEQ:
+ return integer >= operand2;
+ default:
+ return false;
+ }
+ }
}
diff --git a/tests/rygel-item-creator-test.vala b/tests/rygel-item-creator-test.vala
index cf41b92..973a7f0 100644
--- a/tests/rygel-item-creator-test.vala
+++ b/tests/rygel-item-creator-test.vala
@@ -114,12 +114,19 @@ public class Rygel.MediaObject : GLib.Object {
public string title;
public GUPnP.OCMFlags ocm_flags;
public Gee.ArrayList<string> uris;
+ public uint object_update_id;
public void add_uri (string uri) {
this.uris.add (uri);
}
}
+public interface Rygel.TrackableContainer : Rygel.MediaContainer {
+}
+
+public interface Rygel.TrackableItem : Rygel.MediaItem {
+}
+
public class Rygel.MediaItem : Rygel.MediaObject {
public string dlna_profile;
public string mime_type;
@@ -186,6 +193,7 @@ public class Rygel.MediaContainer : Rygel.MediaObject {
public Gee.ArrayList<string> create_classes = new Gee.ArrayList<string> ();
public int child_count;
public string sort_criteria = "+dc:title";
+ public uint update_id;
// mockable elements
public MediaObject found_object = null;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]