[rygel] media-export: Move file handling to harvester



commit 0e4f37d82fd525f83d423a4f7a01f729d9fee51c
Author: Jens Georg <mail jensge org>
Date:   Mon Aug 2 22:57:39 2010 +0300

    media-export: Move file handling to harvester
    
    Reacting to changes is now also done in the Harvester class. No more
    filesystem stuff in root container

 .../media-export/rygel-media-export-harvester.vala |   61 +++++++++++++++++++-
 .../rygel-media-export-root-container.vala         |   54 +-----------------
 2 files changed, 59 insertions(+), 56 deletions(-)
---
diff --git a/src/plugins/media-export/rygel-media-export-harvester.vala b/src/plugins/media-export/rygel-media-export-harvester.vala
index d77d89f..754263c 100644
--- a/src/plugins/media-export/rygel-media-export-harvester.vala
+++ b/src/plugins/media-export/rygel-media-export-harvester.vala
@@ -37,10 +37,13 @@ internal class Rygel.MediaExport.Harvester : GLib.Object {
      * @param monitor intance of a RecursiveFileMonitor which is used to keep
      *                track of the file changes
      */
-    public Harvester (MetadataExtractor    extractor,
-                      RecursiveFileMonitor monitor) {
+    public Harvester (MetadataExtractor    extractor) {
         this.extractor = extractor;
-        this.monitor = monitor;
+        this.monitor = new RecursiveFileMonitor (null);
+        if (this.monitor != null) {
+            this.monitor.changed.connect (this.on_file_changed);
+        }
+
         this.tasks = new HashMap<File, HarvestingTask> (file_hash, file_equal);
         this.create_file_filter ();
     }
@@ -130,4 +133,56 @@ internal class Rygel.MediaExport.Harvester : GLib.Object {
             this.file_filter = null;
         }
     }
+
+    private void on_file_changed (File             file,
+                                  File?            other,
+                                  FileMonitorEvent event) {
+        try {
+            var cache = MediaCache.get_default ();
+            switch (event) {
+                case FileMonitorEvent.CREATED:
+                case FileMonitorEvent.CHANGES_DONE_HINT:
+                    debug (_("Trying to harvest %s because of %d"),
+                           file.get_uri (),
+                           event);
+                    var id = MediaCache.get_id (file.get_parent ());
+                    try {
+                        var parent_container = cache.get_object (id)
+                                            as MediaContainer;
+                        assert (parent_container != null);
+
+                        this.schedule (file, parent_container);
+                    } catch (DatabaseError error) {
+                        warning (_("Error fetching object '%s' from database: %s"),
+                                 id,
+                                 error.message);
+                    }
+                    break;
+                case FileMonitorEvent.DELETED:
+                    this.cancel (file);
+                    try {
+                        // the full object is fetched instead of simply calling
+                        // exists because we need the parent to signalize the
+                        // change
+                        var id = MediaCache.get_id (file);
+                        var obj = cache.get_object (id);
+
+                        // it may be that files removed are files that are not
+                        // in the database, because they're not media files
+                        if (obj != null) {
+                            cache.remove_object (obj);
+                            if (obj.parent != null) {
+                                obj.parent.updated ();
+                            }
+                        }
+                    } catch (Error error) {
+                        warning (_("Error removing object from database: %s"),
+                                 error.message);
+                    }
+                    break;
+                default:
+                    break;
+            }
+        } catch (Error error) { }
+    }
 }
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 7caceb2..4b50150 100644
--- a/src/plugins/media-export/rygel-media-export-root-container.vala
+++ b/src/plugins/media-export/rygel-media-export-root-container.vala
@@ -26,7 +26,6 @@ using GUPnP;
  */
 public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
     private MetadataExtractor extractor;
-    private RecursiveFileMonitor monitor;
     private DBusService service;
     private Harvester harvester;
 
@@ -266,10 +265,7 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
         base (db, "0", "MediaExportRoot");
 
         this.extractor = new MetadataExtractor ();
-        this.monitor = new RecursiveFileMonitor (null);
-        this.monitor.changed.connect (this.on_file_changed);
-
-        this.harvester = new Harvester (this.extractor, this.monitor);
+        this.harvester = new Harvester (this.extractor);
 
         try {
             this.service = new DBusService (this);
@@ -341,52 +337,4 @@ public class Rygel.MediaExport.RootContainer : Rygel.MediaExport.DBContainer {
         this.updated ();
     }
 
-    private void on_file_changed (File             file,
-                                  File?            other,
-                                  FileMonitorEvent event) {
-        switch (event) {
-            case FileMonitorEvent.CREATED:
-            case FileMonitorEvent.CHANGES_DONE_HINT:
-                debug (_("Trying to harvest %s because of %d"),
-                       file.get_uri (),
-                       event);
-                try {
-                    var id = MediaCache.get_id (file.get_parent ());
-                    var parent_container = this.media_db.get_object (id)
-                                           as MediaContainer;
-                    assert (parent_container != null);
-
-                    this.harvester.schedule (file, parent_container);
-                } catch (DatabaseError error) {
-                    warning (_("Error fetching object '%s' from database: %s"),
-                             id,
-                             error.message);
-                }
-                break;
-            case FileMonitorEvent.DELETED:
-                this.harvester.cancel (file);
-                try {
-                    // the full object is fetched instead of simply calling
-                    // exists because we need the parent to signalize the
-                    // change
-                    var id = MediaCache.get_id (file);
-                    var obj = this.media_db.get_object (id);
-
-                    // it may be that files removed are files that are not
-                    // in the database, because they're not media files
-                    if (obj != null) {
-                        this.media_db.remove_object (obj);
-                        if (obj.parent != null) {
-                            obj.parent.updated ();
-                        }
-                    }
-                } catch (Error error) {
-                    warning (_("Error removing object from database: %s"),
-                             error.message);
-                }
-                break;
-            default:
-                break;
-        }
-    }
 }



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