[rygel/wip/track-changes: 19/21] wip: Implement search for upnp:*UpdateID



commit 06b5d572157bd6f84592c4fe2f8dc0c3bd6dfc55
Author: Jens Georg <jensg openismus com>
Date:   Mon Oct 22 14:48:25 2012 +0200

    wip: Implement search for upnp:*UpdateID

 src/librygel-server/rygel-content-directory.vala   |    8 +++
 src/librygel-server/rygel-media-object.vala        |    3 -
 .../rygel-relational-expression.vala               |   57 +++++++++++++++++---
 3 files changed, 57 insertions(+), 11 deletions(-)
---
diff --git a/src/librygel-server/rygel-content-directory.vala b/src/librygel-server/rygel-content-directory.vala
index 123d321..66dd4bc 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-media-object.vala b/src/librygel-server/rygel-media-object.vala
index a4b78d1..2421c56 100644
--- a/src/librygel-server/rygel-media-object.vala
+++ b/src/librygel-server/rygel-media-object.vala
@@ -42,9 +42,6 @@ public abstract class Rygel.MediaObject : GLib.Object {
     public string ref_id;
     public string upnp_class;
     public uint64 modified;
-    // TODO: Spec says that upnp.objectUpdateID is unsigned int.
-    // Should I add a compare_uint to RelationalExpression or just use
-    // signed int?
     public uint object_update_id;
     public Gee.ArrayList<string> uris;
 
diff --git a/src/librygel-server/rygel-relational-expression.vala b/src/librygel-server/rygel-relational-expression.vala
index 5949f5d..119eed3 100644
--- a/src/librygel-server/rygel-relational-expression.vala
+++ b/src/librygel-server/rygel-relational-expression.vala
@@ -31,8 +31,7 @@ public class Rygel.RelationalExpression :
              Rygel.SearchExpression<SearchCriteriaOp,string,string> {
     internal const string CAPS = "@id,@parentID,@refID,upnp:class," +
                                  "dc:title,upnp:artist,upnp:album," +
-                                 "dc:creator,upnp:createClass,@childCount," +
-                                 "upnp:objectUpdateID,upnp:containerUpdateID";
+                                 "dc:creator,upnp:createClass,@childCount";
 
     public override bool satisfied_by (MediaObject media_object) {
         switch (this.operand1) {
@@ -46,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;
@@ -78,12 +104,6 @@ public class Rygel.RelationalExpression :
 
             var container = media_object as MediaContainer;
             return this.compare_int (container.child_count);
-            /*
-        case "upnp:objectUpdateID":
-            return this.compare_int ();
-        case "upnp:containerUpdateID":
-            return this.compare_int ();
-            */
         default:
             return false;
         }
@@ -156,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;
+        }
+    }
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]