diff options
Diffstat (limited to 'src/librygel-server/rygel-relational-expression.vala')
-rw-r--r-- | src/librygel-server/rygel-relational-expression.vala | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/librygel-server/rygel-relational-expression.vala b/src/librygel-server/rygel-relational-expression.vala new file mode 100644 index 00000000..8b1295e5 --- /dev/null +++ b/src/librygel-server/rygel-relational-expression.vala @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2009 Nokia Corporation. + * + * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org> + * + * This file is part of Rygel. + * + * Rygel is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Rygel is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +using GUPnP; + +// Represents a search expression that consists of two strings joined by a +// relational operator. +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"; + + public override bool satisfied_by (MediaObject media_object) { + switch (this.operand1) { + case "@id": + return this.compare_string (media_object.id); + case "@refID": + return this.compare_string (media_object.ref_id); + case "@parentID": + return this.compare_string (media_object.parent.id); + case "upnp:class": + return this.compare_string (media_object.upnp_class); + case "dc:title": + return this.compare_string (media_object.title); + case "upnp:createClass": + if (!(media_object is WritableContainer)) { + return false; + } + + return this.compare_create_class + (media_object as WritableContainer); + case "dc:creator": + if (!(media_object is PhotoItem)) { + return false; + } + + return this.compare_string ((media_object as PhotoItem).creator); + case "upnp:artist": + if (!(media_object is MusicItem)) { + return false; + } + + return this.compare_string ((media_object as MusicItem).artist); + case "upnp:album": + if (!(media_object is MusicItem)) { + return false; + } + + return this.compare_string ((media_object as MusicItem).album); + case "@childCount": + if (!(media_object is MediaContainer)) { + return false; + } + + var container = media_object as MediaContainer; + return this.compare_int (container.child_count); + default: + return false; + } + } + + public override string to_string () { + return "%s %d %s".printf (this.operand1, this.op, this.operand2); + } + + private bool compare_create_class (WritableContainer container) { + var ret = false; + + foreach (var create_class in container.create_classes) { + if (this.compare_string (create_class)) { + ret = true; + + break; + } + } + + return ret; + } + + public bool compare_string (string? str) { + var up_operand2 = this.operand2.up (); + string up_str; + if (str != null) { + up_str = str.up (); + } else { + up_str = null; + } + + switch (this.op) { + case SearchCriteriaOp.EXISTS: + if (this.operand2 == "true") { + return up_str != null; + } else { + return up_str == null; + } + case SearchCriteriaOp.EQ: + return up_operand2 == up_str; + case SearchCriteriaOp.NEQ: + return up_operand2 != up_str; + case SearchCriteriaOp.CONTAINS: + return up_str.contains (up_operand2); + case SearchCriteriaOp.DERIVED_FROM: + return up_str.has_prefix (up_operand2); + default: + return false; + } + } + + public bool compare_int (int integer) { + var operand2 = int.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; + } + } +} |