Movie poster factory: add unqueue support
authorPhilipp Zabel <philipp.zabel@gmail.com>
Tue, 10 Nov 2009 19:23:55 +0000 (20:23 +0100)
committerPhilipp Zabel <philipp.zabel@gmail.com>
Thu, 12 Nov 2009 18:23:24 +0000 (19:23 +0100)
When a search is aborted, all queued requests should be cancelled.

src/poster/movie-poster-factory.vala

index d7cff95..4068354 100644 (file)
@@ -6,8 +6,8 @@ namespace MoviePoster {
 
        public class Factory : Object {
                private static Factory the_factory = null;
-               private List<Request> requests;
-               dynamic DBus.Object server;
+               internal List<Request> requests;
+               internal dynamic DBus.Object server;
                internal bool download_posters;
                private GConf.Client gc;
                private uint cxnid;
@@ -80,19 +80,24 @@ namespace MoviePoster {
                }
 
                private void on_poster_fetched (dynamic DBus.Object server, int handle, string path) {
-                       foreach (Request request in requests) {
-                               if (request.handle != handle)
-                                       continue;
-                               try {
-                                       var pixbuf = new Gdk.Pixbuf.from_file_at_size (path, request.width, request.height);
-
-                                       requests.remove (request);
-                                       request.callback (pixbuf, request.movie);
-                                       return;
-                               } catch (Error e) {
-                                       warning ("Failed to open poster: %s\n", e.message);
+                       Request request = null;
+                       foreach (Request r in requests) {
+                               if (r.handle == handle) {
+                                       request = r;
+                                       break;
                                }
                        }
+                       if (request == null)
+                               return;
+                       try {
+                               var pixbuf = new Gdk.Pixbuf.from_file_at_size (path, request.width, request.height);
+
+                               requests.remove (request);
+                               request.callback (pixbuf, request.movie);
+                               return;
+                       } catch (Error e) {
+                               warning ("Failed to open poster: %s\n", e.message);
+                       }
                }
 
                public void join () {
@@ -103,6 +108,15 @@ namespace MoviePoster {
 
                public static void factory_clean_cache (int max_size, time_t min_mtime) {
                }
+
+               public void clear_queue () {
+
+                       // FIXME
+                       if (server != null)
+                               server.unqueue (0);
+
+                       requests = null;
+               }
        }
 
        public class Request {
@@ -113,6 +127,10 @@ namespace MoviePoster {
                public int height;
 
                public void unqueue () {
+                       if (Factory.get_instance ().server != null)
+                               Factory.get_instance ().server.unqueue (this.handle);
+
+                       Factory.get_instance ().requests.remove (this);
                }
 
                public void join () {