Make search thread cancellable
authorPhilipp Zabel <philipp.zabel@gmail.com>
Tue, 10 Nov 2009 19:11:42 +0000 (20:11 +0100)
committerPhilipp Zabel <philipp.zabel@gmail.com>
Wed, 11 Nov 2009 18:36:21 +0000 (19:36 +0100)
src/movie-list-store.vala
src/plugin-interface.vala
src/plugins/google-parser.vala
src/plugins/google-plugin.vala
src/plugins/imdb-plugin.vala

index e75894d..1ad805f 100644 (file)
@@ -41,6 +41,8 @@ public class MovieListStore : ListStore, TreeModel {
        public MovieSource source;
        private MovieFilter filter;
        public bool update_running { get; set; }
+       private weak Thread thread;
+       private Cancellable cancellable;
 
        construct {
                set_column_types (base_type);
@@ -83,12 +85,19 @@ public class MovieListStore : ListStore, TreeModel {
        }
 
        public bool start_search (MovieFilter _filter) {
-               if (update_running)
-                       return false;
+               if (update_running) {
+                       stdout.printf ("aborting search thread (%p)...\n", thread);
+                       cancellable.cancel ();
+               //      poster_factory.clear_queue ();
+                       thread.join ();
+                       stdout.printf ("search thread aborted\n");
+               }
+               if (cancellable == null || cancellable.is_cancelled ())
+                       cancellable = new Cancellable ();
 
                filter = _filter;
                try {
-                       Thread.create (search_thread, false);
+                       thread = Thread.create (search_thread, true);
                        update_running = true;
                } catch (ThreadError e) {
                        warning ("Failed to start search thread: %s", e.message);
@@ -106,7 +115,7 @@ public class MovieListStore : ListStore, TreeModel {
 
                if (source != null)
                        // FIXME - arbitrary limit
-                       source.get_movies (filter, receive_movie, 100);
+                       source.get_movies (filter, receive_movie, 100, cancellable);
 
                Gdk.threads_enter ();
                update_running = false;
@@ -119,6 +128,9 @@ public class MovieListStore : ListStore, TreeModel {
        private void receive_movie (Movie movie) {
                TreeIter iter;
 
+               if (cancellable.is_cancelled ())
+                       return;
+
                Gdk.threads_enter ();
                add (movie, out iter);
                Gdk.threads_leave ();
index df453b0..2d14e4a 100644 (file)
@@ -29,7 +29,7 @@ public abstract class Plugin : Object {
 public abstract class MovieSource : Object {
        public delegate void ReceiveMovieFunction (Movie movie);
 
-       public abstract void get_movies (MovieFilter filter, ReceiveMovieFunction callback, int limit);
+       public abstract void get_movies (MovieFilter filter, ReceiveMovieFunction callback, int limit, GLib.Cancellable? cancellable);
 
        public abstract void add_movie (Movie movie);
 
index e36cce5..b9dc1d5 100644 (file)
@@ -253,7 +253,7 @@ public class GoogleParser : Object {
                }
        }
 
-       public GoogleParser (MovieFilter filter, string? location, MovieSource.ReceiveMovieFunction callback) {
+       public GoogleParser (MovieFilter filter, string? location, MovieSource.ReceiveMovieFunction callback, Cancellable? cancellable) {
                _get_callback = callback;
                _filter = filter;
                if (filter.title.chr(filter.title.length, '*') != null) {
@@ -271,7 +271,7 @@ public class GoogleParser : Object {
 
                        char[] buf = new char[256*1024];
                        size_t nread;
-                       bool ok = stream.read_all (buf, buf.length, out nread, null);
+                       bool ok = stream.read_all (buf, buf.length, out nread, cancellable);
 
                        buf[nread] = 0;
                        parse (ref buf);
index 2b88eef..7a165f1 100644 (file)
@@ -74,8 +74,8 @@ class GoogleSource : MovieSource {
        public string location;
        public string description;
 
-       public override void get_movies (MovieFilter filter, MovieSource.ReceiveMovieFunction callback, int limit) {
-               var parser = new GoogleParser (filter, location, callback);
+       public override void get_movies (MovieFilter filter, MovieSource.ReceiveMovieFunction callback, int limit, Cancellable? cancellable) {
+               var parser = new GoogleParser (filter, location, callback, cancellable);
        }
 
        public override void add_movie (Movie movie) {
index 8c82ccd..e9cf4f9 100644 (file)
@@ -125,7 +125,7 @@ class IMDbPlugin : Plugin {
 
 class IMDBSource : MovieSource {
        MovieSource.ReceiveMovieFunction _get_callback;
-       public override void get_movies (MovieFilter filter, MovieSource.ReceiveMovieFunction callback, int limit) {
+       public override void get_movies (MovieFilter filter, MovieSource.ReceiveMovieFunction callback, int limit, Cancellable? cancellable) {
                // IMDb has too many movies
                if (filter.title == "")
                        return;