From: Zeeshan Ali (Khattak) Date: Thu, 29 Jul 2010 09:30:42 +0000 (+0300) Subject: core,plugins: Custom ArrayList for MediaObjects X-Git-Tag: RYGEL_0_7_3~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a865b8410498f2bef79281d8a2364fe48fc6a953;p=profile%2Fivi%2Frygel.git core,plugins: Custom ArrayList for MediaObjects This class not only unifies handling of lists of media objects but also handles the UPnP-specific sorting of them. --- diff --git a/src/plugins/external/rygel-external-container.vala b/src/plugins/external/rygel-external-container.vala index 5675c85..014cbc2 100644 --- a/src/plugins/external/rygel-external-container.vala +++ b/src/plugins/external/rygel-external-container.vala @@ -71,11 +71,10 @@ public class Rygel.External.Container : Rygel.MediaContainer { this.update_container.begin (true); } - public override async Gee.List? get_children ( - uint offset, - uint max_count, - Cancellable? cancellable) - throws GLib.Error { + public override async MediaObjects? get_children (uint offset, + uint max_count, + Cancellable? cancellable) + throws GLib.Error { string[] filter = {}; foreach (var object_prop in MediaObjectProxy.PROPERTIES) { @@ -94,13 +93,12 @@ public class Rygel.External.Container : Rygel.MediaContainer { return yield this.create_media_objects (children_props, this); } - public override async Gee.List? search ( - SearchExpression expression, - uint offset, - uint max_count, - out uint total_matches, - Cancellable? cancellable) - throws GLib.Error { + public override async MediaObjects? search (SearchExpression expression, + uint offset, + uint max_count, + out uint total_matches, + Cancellable? cancellable) + throws GLib.Error { if (!this.searchable) { // Backend doesn't implement search :( return yield base.search (expression, @@ -183,11 +181,11 @@ public class Rygel.External.Container : Rygel.MediaContainer { return media_object; } - private async Gee.List create_media_objects ( + private async MediaObjects create_media_objects ( HashTable[] all_props, MediaContainer? parent = null) throws GLib.Error { - var media_objects = new ArrayList (); + var media_objects = new MediaObjects (); foreach (var props in all_props) { var id = props.lookup ("Path").get_string (); diff --git a/src/plugins/external/rygel-external-dummy-container.vala b/src/plugins/external/rygel-external-dummy-container.vala index a15de9d..df64f2f 100644 --- a/src/plugins/external/rygel-external-dummy-container.vala +++ b/src/plugins/external/rygel-external-dummy-container.vala @@ -38,11 +38,10 @@ internal class Rygel.External.DummyContainer : MediaContainer { base (id, parent, title, child_count); } - public override async Gee.List? get_children ( - uint offset, - uint max_count, - Cancellable? cancellable) - throws Error { - return new ArrayList (); + public override async MediaObjects? get_children (uint offset, + uint max_count, + Cancellable? cancellable) + throws Error { + return new MediaObjects (); } } diff --git a/src/plugins/media-export/rygel-media-export-db-container.vala b/src/plugins/media-export/rygel-media-export-db-container.vala index f32783e..0b06dfc 100644 --- a/src/plugins/media-export/rygel-media-export-db-container.vala +++ b/src/plugins/media-export/rygel-media-export-db-container.vala @@ -50,11 +50,10 @@ public class Rygel.MediaExport.DBContainer : MediaContainer { } } - public override async Gee.List? get_children ( - uint offset, - uint max_count, - Cancellable? cancellable) - throws GLib.Error { + public override async MediaObjects? get_children (uint offset, + uint max_count, + Cancellable? cancellable) + throws GLib.Error { var children = this.media_db.get_children (this.id, offset, max_count); @@ -65,14 +64,13 @@ public class Rygel.MediaExport.DBContainer : MediaContainer { return children; } - public override async Gee.List? search ( - SearchExpression expression, - uint offset, - uint max_count, - out uint total_matches, - Cancellable? cancellable) - throws GLib.Error { - Gee.List children = null; + public override async MediaObjects? search (SearchExpression expression, + uint offset, + uint max_count, + out uint total_matches, + Cancellable? cancellable) + throws GLib.Error { + MediaObjects children = null; var max_objects = max_count; if (max_objects == 0) { diff --git a/src/plugins/media-export/rygel-media-export-media-cache.vala b/src/plugins/media-export/rygel-media-export-media-cache.vala index f665aa1..89944fc 100644 --- a/src/plugins/media-export/rygel-media-export-media-cache.vala +++ b/src/plugins/media-export/rygel-media-export-media-cache.vala @@ -325,11 +325,10 @@ public class Rygel.MediaExport.MediaCache : Object { return exists; } - public Gee.ArrayList get_children (string container_id, - long offset, - long max_count) - throws Error { - ArrayList children = new ArrayList (); + public MediaObjects get_children (string container_id, + long offset, + long max_count) throws Error { + MediaObjects children = new MediaObjects (); var parent = get_object (container_id) as MediaContainer; GLib.Value[] values = { container_id, @@ -358,7 +357,7 @@ public class Rygel.MediaExport.MediaCache : Object { } } - public Gee.List get_objects_by_search_expression ( + public MediaObjects get_objects_by_search_expression ( SearchExpression? expression, string container_id, uint offset, @@ -369,7 +368,7 @@ public class Rygel.MediaExport.MediaCache : Object { var filter = this.search_expression_to_sql (expression, args); if (filter == null) { - return new Gee.ArrayList (); + return new MediaObjects (); } debug ("Original search: %s", expression.to_string ()); @@ -449,14 +448,13 @@ public class Rygel.MediaExport.MediaCache : Object { } - public Gee.ArrayList get_objects_by_filter ( - string filter, - GLib.ValueArray args, - string container_id, - long offset, - long max_count) - throws Error { - ArrayList children = new ArrayList (); + public MediaObjects get_objects_by_filter (string filter, + GLib.ValueArray args, + string container_id, + long offset, + long max_count) + throws Error { + var children = new MediaObjects (); GLib.Value v = offset; args.append (v); v = max_count; diff --git a/src/plugins/media-export/rygel-media-export-null-container.vala b/src/plugins/media-export/rygel-media-export-null-container.vala index ac48544..1be8b7c 100644 --- a/src/plugins/media-export/rygel-media-export-null-container.vala +++ b/src/plugins/media-export/rygel-media-export-null-container.vala @@ -30,11 +30,10 @@ internal class Rygel.NullContainer : MediaContainer { base.root ("MediaExport", 0); } - public override async Gee.List? get_children ( - uint offset, - uint max_count, - Cancellable? cancellable) - throws Error { - return new Gee.ArrayList (); + public override async MediaObjects? get_children (uint offset, + uint max_count, + Cancellable? cancellable) + throws Error { + return new MediaObjects (); } } diff --git a/src/plugins/media-export/rygel-media-export-query-container.vala b/src/plugins/media-export/rygel-media-export-query-container.vala index 589f01e..3166173 100644 --- a/src/plugins/media-export/rygel-media-export-query-container.vala +++ b/src/plugins/media-export/rygel-media-export-query-container.vala @@ -146,14 +146,13 @@ internal class Rygel.MediaExport.QueryContainer : DBContainer { } } - public override async Gee.List? search ( - SearchExpression expression, - uint offset, - uint max_count, - out uint total_matches, - Cancellable? cancellable) - throws GLib.Error { - Gee.List children = null; + public override async MediaObjects? search (SearchExpression expression, + uint offset, + uint max_count, + out uint total_matches, + Cancellable? cancellable) + throws GLib.Error { + MediaObjects children = null; var combined_expression = new LogicalExpression (); combined_expression.operand1 = this.expression; @@ -174,7 +173,7 @@ internal class Rygel.MediaExport.QueryContainer : DBContainer { out total_matches); } catch (MediaDBError error) { if (error is MediaDBError.UNSUPPORTED_SEARCH) { - children = new ArrayList (); + children = new MediaObjects (); total_matches = 0; } else { throw error; @@ -184,12 +183,11 @@ internal class Rygel.MediaExport.QueryContainer : DBContainer { return children; } - public override async Gee.List? get_children ( - uint offset, - uint max_count, - Cancellable? cancellable) - throws GLib.Error { - Gee.List children; + public override async MediaObjects? get_children (uint offset, + uint max_count, + Cancellable? cancellable) + throws GLib.Error { + MediaObjects children; if (pattern == "") { // this "duplicates" the search expression but using the same @@ -206,7 +204,7 @@ internal class Rygel.MediaExport.QueryContainer : DBContainer { max_objects = -1; } - children = new ArrayList (); + children = new MediaObjects (); var data = this.media_db.get_object_attribute_by_search_expression ( this.attribute, this.expression, diff --git a/src/plugins/media-export/rygel-media-export-root-container.vala b/src/plugins/media-export/rygel-media-export-root-container.vala index 4755d81..582ae80 100644 --- a/src/plugins/media-export/rygel-media-export-root-container.vala +++ b/src/plugins/media-export/rygel-media-export-root-container.vala @@ -189,14 +189,13 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer { return object; } - public override async Gee.List? search ( - SearchExpression expression, - uint offset, - uint max_count, - out uint total_matches, - Cancellable? cancellable) - throws GLib.Error { - Gee.List list; + public override async MediaObjects? search (SearchExpression expression, + uint offset, + uint max_count, + out uint total_matches, + Cancellable? cancellable) + throws GLib.Error { + MediaObjects list; MediaContainer query_container = null; string upnp_class = null; diff --git a/src/plugins/tracker/rygel-tracker-search-container.vala b/src/plugins/tracker/rygel-tracker-search-container.vala index fff93fa..feb1114 100644 --- a/src/plugins/tracker/rygel-tracker-search-container.vala +++ b/src/plugins/tracker/rygel-tracker-search-container.vala @@ -99,11 +99,10 @@ public class Rygel.Tracker.SearchContainer : Rygel.MediaContainer { } } - public override async Gee.List? get_children ( - uint offset, - uint max_count, - Cancellable? cancellable) - throws GLib.Error { + public override async MediaObjects? get_children (uint offset, + uint max_count, + Cancellable? cancellable) + throws GLib.Error { var expression = new RelationalExpression (); expression.op = SearchCriteriaOp.EQ; expression.operand1 = "@parentID"; @@ -118,14 +117,13 @@ public class Rygel.Tracker.SearchContainer : Rygel.MediaContainer { cancellable); } - public override async Gee.List? search ( - SearchExpression expression, - uint offset, - uint max_count, - out uint total_matches, - Cancellable? cancellable) - throws GLib.Error { - var results = new ArrayList (); + public override async MediaObjects? search (SearchExpression expression, + uint offset, + uint max_count, + out uint total_matches, + Cancellable? cancellable) + throws GLib.Error { + var results = new MediaObjects (); var query = this.create_query (expression, (int) offset, (int) max_count); diff --git a/src/rygel/Makefile.am b/src/rygel/Makefile.am index 0acf3c8..3bba0dc 100644 --- a/src/rygel/Makefile.am +++ b/src/rygel/Makefile.am @@ -77,6 +77,7 @@ VAPI_SOURCE_FILES = rygel-configuration.vala \ rygel-media-renderer-plugin.vala \ rygel-plugin-loader.vala \ rygel-media-object.vala \ + rygel-media-objects.vala \ rygel-media-container.vala \ rygel-simple-container.vala \ rygel-media-item.vala \ diff --git a/src/rygel/rygel-browse.vala b/src/rygel/rygel-browse.vala index 46dfef7..fe4a8a2 100644 --- a/src/rygel/rygel-browse.vala +++ b/src/rygel/rygel-browse.vala @@ -64,7 +64,7 @@ internal class Rygel.Browse: Rygel.MediaQueryAction { } } - protected override async Gee.List fetch_results ( + protected override async MediaObjects fetch_results ( MediaObject media_object) throws Error { if (this.fetch_metadata) { // BrowseMetadata @@ -75,18 +75,17 @@ internal class Rygel.Browse: Rygel.MediaQueryAction { } } - private Gee.List handle_metadata_request ( - MediaObject media_object) - throws Error { + private MediaObjects handle_metadata_request (MediaObject media_object) + throws Error { this.total_matches = 1; - var results = new ArrayList (); + var results = new MediaObjects (); results.add (media_object); return results; } - private async Gee.List handle_children_request ( + private async MediaObjects handle_children_request ( MediaObject media_object) throws Error { if (!(media_object is MediaContainer)) { diff --git a/src/rygel/rygel-media-container.vala b/src/rygel/rygel-media-container.vala index f47d50b..7df24e9 100644 --- a/src/rygel/rygel-media-container.vala +++ b/src/rygel/rygel-media-container.vala @@ -72,11 +72,10 @@ public abstract class Rygel.MediaContainer : MediaObject { * * return A list of media objects. */ - public async abstract Gee.List? get_children ( - uint offset, - uint max_count, - Cancellable? cancellable) - throws Error; + public async abstract MediaObjects? get_children (uint offset, + uint max_count, + Cancellable? cancellable) + throws Error; /** * Recursively searches for all media objects the satisfy the given search @@ -93,14 +92,13 @@ public abstract class Rygel.MediaContainer : MediaObject { * * return A list of media objects. */ - public virtual async Gee.List? search ( - SearchExpression expression, - uint offset, - uint max_count, - out uint total_matches, - Cancellable? cancellable) - throws Error { - var result = new ArrayList (); + public virtual async MediaObjects? search (SearchExpression expression, + uint offset, + uint max_count, + out uint total_matches, + Cancellable? cancellable) + throws Error { + var result = new MediaObjects (); var children = yield this.get_children (0, this.child_count, @@ -154,7 +152,7 @@ public abstract class Rygel.MediaContainer : MediaObject { // actually satisfy the give search expression total_matches = 0; - return result.slice ((int) start, (int) stop); + return result.slice ((int) start, (int) stop) as MediaObjects; } else { total_matches = result.size; @@ -260,13 +258,12 @@ public abstract class Rygel.MediaContainer : MediaObject { } } - private async Gee.List search_in_children ( - SearchExpression expression, - Gee.List children, - uint limit, - Cancellable? cancellable) - throws Error { - var result = new ArrayList (); + private async MediaObjects search_in_children (SearchExpression expression, + MediaObjects children, + uint limit, + Cancellable? cancellable) + throws Error { + var result = new MediaObjects (); foreach (var child in children) { if (child is MediaContainer) { diff --git a/src/rygel/rygel-media-objects.vala b/src/rygel/rygel-media-objects.vala new file mode 100644 index 0000000..204011f --- /dev/null +++ b/src/rygel/rygel-media-objects.vala @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2010 Nokia Corporation. + * + * Author: Zeeshan Ali + * + * 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 Gee; + +/** + * An array list that keeps media objects. + */ +public class Rygel.MediaObjects : ArrayList { + public override Gee.List? slice (int start, int stop) { + var slice = base.slice (start, stop); + var ret = new MediaObjects (); + + ret.add_all (slice); + + return ret; + } + + internal void sort_by_criteria (string sort_criteria) { + var sort_props = sort_criteria.split (","); + if (sort_props.length == 0) { + return; + } + + this.sort_with_data ((a, b) => { + var object_a = a as MediaObject; + var object_b = b as MediaObject; + + return this.compare_media_objects (object_a, object_b, sort_props); + }); + } + + private int compare_media_objects (MediaObject a, + MediaObject b, + string[] sort_props) { + int i; + int ret = 0; + + for (i = 0; ret == 0 && i < sort_props.length; i++) { + var property = sort_props [i].substring (1); + + ret = a.compare_by_property (b, property); + + if (sort_props [i][0] == '-') { + // Need it in descending order so reverse the comparison + ret = 0 - ret; + } + } + + return ret; + } +} diff --git a/src/rygel/rygel-media-query-action.vala b/src/rygel/rygel-media-query-action.vala index 5518a79..875239c 100644 --- a/src/rygel/rygel-media-query-action.vala +++ b/src/rygel/rygel-media-query-action.vala @@ -49,8 +49,6 @@ internal abstract class Rygel.MediaQueryAction : GLib.Object, StateMachine { protected XBoxHacks xbox_hacks; protected string object_id_arg; - private string[] sort_props; - protected MediaQueryAction (ContentDirectory content_dir, owned ServiceAction action) { this.root_container = content_dir.root_container; @@ -79,7 +77,9 @@ internal abstract class Rygel.MediaQueryAction : GLib.Object, StateMachine { this.update_id = uint32.MAX; } - this.sort_media_objects (results); + if (this.sort_criteria != null) { + results.sort_by_criteria (this.sort_criteria); + } foreach (var result in results) { if (result is MediaItem && this.xbox_hacks != null) { @@ -124,7 +124,7 @@ internal abstract class Rygel.MediaQueryAction : GLib.Object, StateMachine { } } - protected abstract async Gee.List fetch_results ( + protected abstract async MediaObjects fetch_results ( MediaObject media_object) throws Error; private async MediaObject fetch_media_object () throws Error { @@ -183,38 +183,4 @@ internal abstract class Rygel.MediaQueryAction : GLib.Object, StateMachine { this.completed (); } - - private void sort_media_objects (Gee.List media_objects) { - if (this.sort_criteria == null) { - return; - } - - this.sort_props = this.sort_criteria.split (","); - if (this.sort_props.length == 0) { - return; - } - - media_objects.sort_with_data (this.compare_media_objects); - } - - private int compare_media_objects (void *a, void *b) { - var object_a = a as MediaObject; - var object_b = b as MediaObject; - - int i; - int ret = 0; - - for (i = 0; ret == 0 && i < this.sort_props.length; i++) { - var property = this.sort_props [i].substring (1); - - ret = object_a.compare_by_property (object_b, property); - - if (this.sort_props [i][0] == '-') { - // Need it in descending order so reverse the comparison - ret = 0 - ret; - } - } - - return ret; - } } diff --git a/src/rygel/rygel-search.vala b/src/rygel/rygel-search.vala index 8ec2fe8..9798a10 100644 --- a/src/rygel/rygel-search.vala +++ b/src/rygel/rygel-search.vala @@ -54,7 +54,7 @@ internal class Rygel.Search: Rygel.MediaQueryAction { debug (_("Executing search request: %s"), this.search_criteria); } - protected override async Gee.List fetch_results ( + protected override async MediaObjects fetch_results ( MediaObject media_object) throws Error { var container = media_object as MediaContainer; diff --git a/src/rygel/rygel-simple-container.vala b/src/rygel/rygel-simple-container.vala index d6806da..0a7875c 100644 --- a/src/rygel/rygel-simple-container.vala +++ b/src/rygel/rygel-simple-container.vala @@ -30,14 +30,14 @@ using Gee; * children ArrayList field. */ public class Rygel.SimpleContainer : Rygel.MediaContainer { - public ArrayList children; + public MediaObjects children; public SimpleContainer (string id, MediaContainer? parent, string title) { base (id, parent, title, 0); - this.children = new ArrayList (); + this.children = new MediaObjects (); } public SimpleContainer.root (string title) { @@ -62,14 +62,13 @@ public class Rygel.SimpleContainer : Rygel.MediaContainer { this.child_count = 0; } - public override async Gee.List? get_children ( - uint offset, - uint max_count, - Cancellable? cancellable) - throws Error { + public override async MediaObjects? get_children (uint offset, + uint max_count, + Cancellable? cancellable) + throws Error { uint stop = offset + max_count; stop = stop.clamp (0, this.child_count); - return this.children.slice ((int) offset, (int) stop); + return this.children.slice ((int) offset, (int) stop) as MediaObjects; } }