From: Philipp Zabel Date: Sat, 10 Jul 2010 19:55:27 +0000 (+0200) Subject: Plugins: allow returning multiple movies per callback invocation X-Git-Url: https://vcs.maemo.org/git/?p=cinaest;a=commitdiff_plain;h=d3bbd5f87a7a48f6aa2e2d43bb440a77ab4ef749 Plugins: allow returning multiple movies per callback invocation --- diff --git a/src/movie-list-store.vala b/src/movie-list-store.vala index 7a9d208..09d6c1d 100644 --- a/src/movie-list-store.vala +++ b/src/movie-list-store.vala @@ -160,17 +160,19 @@ public class MovieListStore : ListStore, TreeModel { } } - private void receive_movie (Movie movie) { + private void receive_movie (SList movies) { TreeIter iter; if (cancellable.is_cancelled ()) return; - add (movie, out iter); - try { - poster_factory.queue_thumbnail (movie, 64, 64, false, receive_poster_thumbnail); - } catch (Error e) { - warning ("Failed to queue poster request: %s\n", e.message); + foreach (Movie movie in movies) { + add (movie, out iter); + try { + poster_factory.queue_thumbnail (movie, 64, 64, false, receive_poster_thumbnail); + } catch (Error e) { + warning ("Failed to queue poster request: %s\n", e.message); + } } } diff --git a/src/plugin-interface.vala b/src/plugin-interface.vala index c1012ff..0c76178 100644 --- a/src/plugin-interface.vala +++ b/src/plugin-interface.vala @@ -35,7 +35,7 @@ public enum SourceFlags { public abstract class MovieSource : Object { public abstract bool active { get; set construct; } - public delegate void ReceiveMovieFunction (Movie movie); + public delegate void ReceiveMovieFunction (SList movie); public abstract async int get_movies (MovieFilter filter, ReceiveMovieFunction callback, int limit, GLib.Cancellable? cancellable); diff --git a/src/plugins/catalog-sqlite.vala b/src/plugins/catalog-sqlite.vala index be05605..c2bfbbc 100644 --- a/src/plugins/catalog-sqlite.vala +++ b/src/plugins/catalog-sqlite.vala @@ -20,6 +20,8 @@ using Sqlite; class CatalogSqlite : Object { Database db; + SList result; + int results_waiting; public delegate void ReceiveMovieFunction (string title, int year, int rating, int genres); @@ -235,6 +237,9 @@ class CatalogSqlite : Object { return 1; } + result = new SList (); + results_waiting = 0; + do { Idle.add (query.callback); yield; @@ -247,10 +252,19 @@ class CatalogSqlite : Object { movie.genres.field = stmt.column_int (3); // TODO - depending on settings, this could be something else, like director info or runtime movie.secondary = movie.genres.to_string (); - callback (movie); + result.append (movie); + if (++results_waiting >= 10) { + callback (result); + result = new SList (); + results_waiting = 0; + } } } while (rc == Sqlite.ROW); + if (results_waiting > 0) + callback (result); + result = new SList (); + db.progress_handler (0, null); return 0; } diff --git a/src/plugins/google-plugin.vala b/src/plugins/google-plugin.vala index f8b17b4..65abc6f 100644 --- a/src/plugins/google-plugin.vala +++ b/src/plugins/google-plugin.vala @@ -250,6 +250,7 @@ class GoogleSource : MovieSource { private void on_movies_found (DBus.Object sender, string[] movies, bool finished) { print ("found %d movies\n", movies.length); var parser = new Json.Parser (); + var result = new SList (); for (int i = 0; i < movies.length; i++) { var movie = new GoogleMovie (); @@ -271,9 +272,11 @@ class GoogleSource : MovieSource { else movie.secondary = movie.cinema_name + " - " + movie.showtimes; - callback (movie); + result.append (movie); } + callback (result); + if (finished) { search = null; Idle.add (get_movies_callback); diff --git a/src/plugins/imdb-plugin.vala b/src/plugins/imdb-plugin.vala index 5c5e31b..1fb5d8e 100644 --- a/src/plugins/imdb-plugin.vala +++ b/src/plugins/imdb-plugin.vala @@ -206,6 +206,9 @@ class IMDbMovie : Movie { } class IMDBSource : MovieSource { + SList result; + int results_waiting; + public override bool active { get; set construct; } public IMDBSource () { @@ -218,7 +221,12 @@ class IMDBSource : MovieSource { "cinaest", "imdb.db", null)); _get_callback = callback; + result = new SList (); + results_waiting = 0; int n = yield sqlite.query (filter, receive_movie, limit, cancellable); + if (results_waiting > 0) + _get_callback (result); + result = new SList (); return n; } @@ -234,7 +242,12 @@ class IMDBSource : MovieSource { } else { movie.secondary = movie.genres.to_string (); } - _get_callback (movie); + result.append (movie); + if (++results_waiting >= 10) { + _get_callback (result); + result = new SList (); + results_waiting = 0; + } } public override void add_movie (Movie movie) { diff --git a/src/plugins/moviepilot-plugin.vala b/src/plugins/moviepilot-plugin.vala index 43cf94b..27fe167 100644 --- a/src/plugins/moviepilot-plugin.vala +++ b/src/plugins/moviepilot-plugin.vala @@ -132,6 +132,7 @@ class MoviePilotSource : MovieSource { private void on_movies_found (DBus.Object sender, string[] movies, bool finished) { print ("found %d movies\n", movies.length); var parser = new Json.Parser (); + var result = new SList (); for (int i = 0; i < movies.length; i++) { var movie = new Movie (); @@ -147,9 +148,11 @@ class MoviePilotSource : MovieSource { movie.rating = (int) object.get_double_member ("rating"); movie.secondary = object.get_string_member ("genres").replace (",", ", "); - callback (movie); + result.append (movie); } + callback (result); + if (finished) { search = null; Idle.add (get_movies_callback);