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);
}
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);
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;
private void receive_movie (Movie movie) {
TreeIter iter;
+ if (cancellable.is_cancelled ())
+ return;
+
Gdk.threads_enter ();
add (movie, out iter);
Gdk.threads_leave ();
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);
}
}
- 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) {
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);
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) {
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;