[rygel] server: Implement search for upnp:*UpdateID



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]