[retro-gtk/wip/aplazas/recursive-core-search: 2/2] module-query: Allow to iterate recursively



commit 411fa345f77a882e3ed43bad62581e851e6075be
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Thu Mar 9 12:30:38 2017 +0100

    module-query: Allow to iterate recursively
    
    Allow ModuleQuery and ModuleIterator to iterate recursively on the
    Libretro core search paths.
    
    This is needed to support Flatpak extension points and hence to have
    Libretro cores as extensions.

 retro-gtk/retro-module-iterator.vala |   32 +++++++++++++++++++++++++++++++-
 retro-gtk/retro-module-query.vala    |    8 +++++++-
 2 files changed, 38 insertions(+), 2 deletions(-)
---
diff --git a/retro-gtk/retro-module-iterator.vala b/retro-gtk/retro-module-iterator.vala
index 88dae34..01957e5 100644
--- a/retro-gtk/retro-module-iterator.vala
+++ b/retro-gtk/retro-module-iterator.vala
@@ -2,12 +2,15 @@
 
 public class Retro.ModuleIterator {
        private string[] directories;
+       private bool recursive;
        private int current_directory;
        private FileEnumerator file_enumerator;
        private CoreDescriptor? core_descriptor;
+       private ModuleIterator? sub_directory;
 
-       internal ModuleIterator (string[] lookup_paths) {
+       internal ModuleIterator (string[] lookup_paths, bool recursive) {
                directories = lookup_paths;
+               this.recursive = recursive;
        }
 
        public new CoreDescriptor? get () {
@@ -29,11 +32,15 @@ public class Retro.ModuleIterator {
 
                file_enumerator = null;
                core_descriptor = null;
+               sub_directory = null;
 
                return false;
        }
 
        private bool next_in_current_path () throws Error {
+               if (sub_directory != null && next_in_sub_directory ())
+                       return true;
+
                var directory = File.new_for_path (directories[current_directory]);
 
                if (file_enumerator == null)
@@ -43,6 +50,17 @@ public class Retro.ModuleIterator {
                        return false;
 
                for (var info = file_enumerator.next_file () ; info != null ; info = 
file_enumerator.next_file ()) {
+                       if (recursive && info.get_file_type () == FileType.DIRECTORY && sub_directory == 
null) {
+                               var sub_directory_basename = info.get_name ();
+                               var sub_directory_file = directory.get_child (sub_directory_basename);
+                               var sub_directory_path = sub_directory_file.get_path ();
+                               sub_directory = new ModuleIterator ({ sub_directory_path }, recursive);
+                               if (next_in_sub_directory ())
+                                       return true;
+                               else
+                                       continue;
+                       }
+
                        var core_descriptor_basename = info.get_name ();
                        if (!core_descriptor_basename.has_suffix (".libretro"))
                                continue;
@@ -63,5 +81,17 @@ public class Retro.ModuleIterator {
 
                return false;
        }
+
+       private bool next_in_sub_directory () throws Error {
+               if (sub_directory.next ()) {
+                       core_descriptor = sub_directory.get ();
+
+                       return true;
+               }
+
+               sub_directory = null;
+
+               return false;
+       }
 }
 
diff --git a/retro-gtk/retro-module-query.vala b/retro-gtk/retro-module-query.vala
index 8b6437b..2f11d0a 100644
--- a/retro-gtk/retro-module-query.vala
+++ b/retro-gtk/retro-module-query.vala
@@ -3,10 +3,16 @@
 public class Retro.ModuleQuery {
        private const string ENV_PLUGIN_PATH = "LIBRETRO_PLUGIN_PATH";
 
+       private bool recursive;
+
+       public ModuleQuery (bool recursive) {
+               this.recursive = recursive;
+       }
+
        public ModuleIterator iterator () {
                var paths = get_plugin_lookup_paths ();
 
-               return new ModuleIterator (paths);
+               return new ModuleIterator (paths, recursive);
        }
 
        private static string[] get_plugin_lookup_paths () {


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