[rygel] media-export: Cancel harvester before starting new one



commit a64f9be97834f5217f10665394ac02e09115b3a8
Author: Jens Georg <mail jensge org>
Date:   Sat Feb 20 17:26:13 2010 +0100

    media-export: Cancel harvester before starting new one
    
    When uploading or changing files, multiple CHANGES_DONE event hints may be
    sent. With this commit the already running harvester is cancelled and a
    new one is started on this occasion.

 .../rygel-media-export-root-container.vala         |   39 +++++++++++++-------
 1 files changed, 26 insertions(+), 13 deletions(-)
---
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 20a80e5..12b94c7 100644
--- a/src/plugins/media-export/rygel-media-export-root-container.vala
+++ b/src/plugins/media-export/rygel-media-export-root-container.vala
@@ -54,6 +54,7 @@ public class Rygel.MediaExportRootContainer : Rygel.MediaDBContainer {
     private MediaExportRecursiveFileMonitor monitor;
     private MediaExportDBusService service;
     private MediaExportDynamicContainer dynamic_elements;
+    private Gee.List<MediaExportHarvester> harvester_trash;
 
     private static MediaContainer instance = null;
 
@@ -150,6 +151,7 @@ public class Rygel.MediaExportRootContainer : Rygel.MediaDBContainer {
 
         this.harvester = new HashMap<File,MediaExportHarvester> (file_hash,
                                                                  file_equal);
+        this.harvester_trash = new ArrayList<MediaExportHarvester> ();
 
         this.monitor = new MediaExportRecursiveFileMonitor (null);
         this.monitor.changed.connect (this.on_file_changed);
@@ -209,31 +211,40 @@ public class Rygel.MediaExportRootContainer : Rygel.MediaDBContainer {
         this.updated ();
     }
 
-    private void on_file_harvested (File file) {
+    private void on_file_harvested (MediaExportHarvester harvester,
+                                    File                 file) {
         message ("'%s' harvested", file.get_uri ());
 
         this.harvester.remove (file);
     }
 
+    private void on_remove_cancelled_harvester (MediaExportHarvester harvester,
+                                                File                 file) {
+        this.harvester_trash.remove (harvester);
+    }
+
     private void harvest (File file, MediaContainer parent = this) {
         if (this.extractor == null) {
             warning ("No Metadata extractor available. Will not crawl");
             return;
         }
 
-        if (!this.harvester.contains (file)) {
-            var harvester = new MediaExportHarvester (parent,
-                                                      this.media_db,
-                                                      this.extractor,
-                                                      this.monitor);
-            harvester.harvested.connect (this.on_file_harvested);
-            this.harvester[file] = harvester;
-            harvester.harvest (file);
-        } else {
-            warning ("%s already scheduled for harvesting. Check config " +
-                     "for duplicates.",
-                     file.get_uri ());
+        if (this.harvester.contains (file)) {
+            debug ("Already harvesting; cancelling");
+            var harvester = this.harvester[file];
+            harvester.harvested.disconnect (this.on_file_harvested);
+            harvester.cancellable.cancel ();
+            harvester.harvested.connect (this.on_remove_cancelled_harvester);
+            this.harvester_trash.add (harvester);
         }
+
+        var harvester = new MediaExportHarvester (parent,
+                                                  this.media_db,
+                                                  this.extractor,
+                                                  this.monitor);
+        harvester.harvested.connect (this.on_file_harvested);
+        this.harvester[file] = harvester;
+        harvester.harvest (file);
     }
 
     private void on_file_changed (File             file,
@@ -242,6 +253,8 @@ public class Rygel.MediaExportRootContainer : Rygel.MediaDBContainer {
         switch (event) {
             case FileMonitorEvent.CREATED:
             case FileMonitorEvent.CHANGES_DONE_HINT:
+                debug ("Trying to harvest %s because of %d", file.get_uri (),
+                        event);
                 var parent = file.get_parent ();
                 var id = Checksum.compute_for_string (ChecksumType.MD5,
                                                       parent.get_uri ());



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]