[rygel] make it work with gvfs (non-local directories)



commit 6664567cc9b136abb5410c6ee6ccf7caee9ece42
Author: Jens Georg <mail jensge org>
Date:   Fri May 1 02:09:39 2009 +0200

    make it work with gvfs (non-local directories)
---
 .../folder/rygel-folder-directorysearch.vala       |   79 ++++++++++++++-----
 .../folder/rygel-folder-foldercontainer.vala       |    3 +-
 src/plugins/folder/rygel-folder-plugin.vala        |    3 +-
 src/plugins/folder/rygel-folder-rootcontainer.vala |    6 +-
 4 files changed, 65 insertions(+), 26 deletions(-)

diff --git a/src/plugins/folder/rygel-folder-directorysearch.vala b/src/plugins/folder/rygel-folder-directorysearch.vala
index 1a1ef89..3de32ef 100644
--- a/src/plugins/folder/rygel-folder-directorysearch.vala
+++ b/src/plugins/folder/rygel-folder-directorysearch.vala
@@ -25,6 +25,9 @@ using GLib;
 public class Folder.DirectorySearchResult : Rygel.SimpleAsyncResult<Gee.List<MediaObject>> {
     private uint max_count;
     private uint offset;
+    private File file;
+
+    private const int MAX_CHILDREN = 10;
 
     public DirectorySearchResult(MediaContainer parent, uint offset, uint max_count, AsyncReadyCallback callback) {
         base(parent, callback);
@@ -34,36 +37,70 @@ public class Folder.DirectorySearchResult : Rygel.SimpleAsyncResult<Gee.List<Med
         this.max_count = max_count;
     }
 
-    public void enumerate_children_ready(Object obj, AsyncResult res) {
-        File file = (File)obj;
+    public void enumerator_closed(Object obj, AsyncResult res) {
+        var enumerator = (FileEnumerator)obj;
         try {
-            var enumerator = file.enumerate_children_finish(res);
-            var file_info = enumerator.next_file(null);
-            while (file_info != null) {
-                var f = file.get_child(file_info.get_name());
-                try {
-                    MediaObject item = null;
-                    if (file_info.get_file_type() == FileType.DIRECTORY) {
-                        item = new FolderContainer((MediaContainer)source_object, 
-                                                   Checksum.compute_for_string(ChecksumType.MD5, f.get_path()),
-                                                   f.get_path(), false);
+            enumerator.close_finish(res);
+        }
+        catch (Error e) {
+            this.error = e;
+        }
+        this.complete();
+    }
 
+    public void enumerate_next_ready(Object obj, AsyncResult res) {
+        var enumerator = (FileEnumerator)obj;
+        try {
+            var list = enumerator.next_files_finish(res);
+            if (list != null) {
+                foreach (FileInfo file_info in list) {
+                    debug("new file info");
+                    var f = file.get_child(file_info.get_name());
+                    try {
+                        MediaObject item = null;
+                        if (file_info.get_file_type() == FileType.DIRECTORY) {
+                            item = new FolderContainer((MediaContainer)source_object, 
+                                                       Checksum.compute_for_string(ChecksumType.MD5, f.get_uri()),
+                                                       f.get_uri(), false);
+
+                        }
+                        else {
+                            item = new FilesystemMediaItem((MediaContainer)source_object, f, file_info);
+                        }
+                        if (item != null)
+                            data.add(item);
+                    } catch (MediaItemError err) {
+                        // most likely invalid content type
                     }
-                    else {
-                        item = new FilesystemMediaItem((MediaContainer)source_object, f, file_info);
-                    }
-                    if (item != null)
-                        data.add(item);
-                } catch (MediaItemError err) {
-                    // most likely invalid content type
+
                 }
-                file_info = enumerator.next_file(null);
+                enumerator.next_files_async(MAX_CHILDREN,
+                                            Priority.DEFAULT,
+                                            null, enumerate_next_ready);
             }
-
+            else {
+                enumerator.close_async(Priority.DEFAULT,
+                                       null, enumerator_closed);
+            }
+        }
+        catch (Error e) {
+            this.error = e;
             this.complete();
         }
+    }
+
+    public void enumerate_children_ready(Object obj, AsyncResult res) {
+        file = (File)obj;
+        debug("enumerate ready");
+        try {
+            var enumerator = file.enumerate_children_finish(res);
+            enumerator.next_files_async(MAX_CHILDREN,
+                                        Priority.DEFAULT,
+                                        null, enumerate_next_ready);
+        }
         catch (Error error) {
             this.error = error;
+            debug("Error %s", error.message);
             this.complete();
         }
     }
diff --git a/src/plugins/folder/rygel-folder-foldercontainer.vala b/src/plugins/folder/rygel-folder-foldercontainer.vala
index 210fb75..8dbd926 100644
--- a/src/plugins/folder/rygel-folder-foldercontainer.vala
+++ b/src/plugins/folder/rygel-folder-foldercontainer.vala
@@ -49,6 +49,7 @@ public class Folder.FolderContainer : MediaContainer {
                                       Cancellable? cancellable, 
                                       AsyncReadyCallback callback)
     {
+        debug("GetChildren called");
         if (items.size == 0) {
             DirectorySearchResult res = new DirectorySearchResult(this, offset, max_count, callback);
             root_dir.enumerate_children_async(FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE + "," +
@@ -141,7 +142,7 @@ public class Folder.FolderContainer : MediaContainer {
      */
     public FolderContainer (MediaContainer parent, string id, string directory_path, bool full) {
         base(id, parent, directory_path, 0);
-        this.root_dir = GLib.File.new_for_path(directory_path);
+        this.root_dir = GLib.File.new_for_uri(directory_path);
 
         if (!full && parent is FolderContainer) {
             this.title = ((FolderContainer)parent).strip_parent(root_dir);
diff --git a/src/plugins/folder/rygel-folder-plugin.vala b/src/plugins/folder/rygel-folder-plugin.vala
index b133df1..da4a7b0 100644
--- a/src/plugins/folder/rygel-folder-plugin.vala
+++ b/src/plugins/folder/rygel-folder-plugin.vala
@@ -55,7 +55,8 @@ public class Folder.FolderContentDir : ContentDirectory {
         try {
             string dir = client.get_string("/apps/rygel/Folder/folder");
             message("Using folder %s", dir);
-            return new FolderRootContainer (dir);
+            File f = File.new_for_commandline_arg(dir);
+            return new FolderRootContainer (f.get_uri());
         }
         catch (GLib.Error error) {
             return null;
diff --git a/src/plugins/folder/rygel-folder-rootcontainer.vala b/src/plugins/folder/rygel-folder-rootcontainer.vala
index 1b8287f..1b05952 100644
--- a/src/plugins/folder/rygel-folder-rootcontainer.vala
+++ b/src/plugins/folder/rygel-folder-rootcontainer.vala
@@ -90,10 +90,10 @@ public class Folder.FolderRootContainer : MediaContainer {
      * 
      * @parameter directory_path, directory you want to expose
      */
-    public FolderRootContainer (string directory_path) {
-        base.root(directory_path, 0);
+    public FolderRootContainer (string uri) {
+        base.root(uri, 0);
         this.items = new ArrayList<FolderContainer> ();
-        items.add(new FolderContainer(this, "12", directory_path, true));
+        items.add(new FolderContainer(this, "12", uri, true));
         this.child_count = 1;
     }
 }



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