[retro-gtk] Add ModuleIterator



commit 54cebb221c50049c6861ae068b35fceac3e2dbce
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Sun Feb 26 13:06:33 2017 +0100

    Add ModuleIterator
    
    This will be used in the next commit to allow iterating through all the
    available Libretro modules using Vala's foreach keyword and in a sync or
    async way.

 retro-gtk/Makefile.am                |    1 +
 retro-gtk/retro-module-iterator.vala |   67 ++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 0 deletions(-)
---
diff --git a/retro-gtk/Makefile.am b/retro-gtk/Makefile.am
index 9440dae..5e26206 100644
--- a/retro-gtk/Makefile.am
+++ b/retro-gtk/Makefile.am
@@ -60,6 +60,7 @@ libretro_gtk_la_SOURCES = \
        retro-core-descriptor.vala \
        retro-core-descriptor-error.vala \
        retro-module-query.vala \
+       retro-module-iterator.vala \
        rumble.vala \
        system-info.vala \
        video.vala \
diff --git a/retro-gtk/retro-module-iterator.vala b/retro-gtk/retro-module-iterator.vala
new file mode 100644
index 0000000..9059a3f
--- /dev/null
+++ b/retro-gtk/retro-module-iterator.vala
@@ -0,0 +1,67 @@
+// This file is part of retro-gtk. License: GPLv3
+
+public class Retro.ModuleIterator {
+       private string[] directories;
+       private int current_directory;
+       private FileEnumerator file_enumerator;
+       private CoreDescriptor? core_descriptor;
+
+       internal ModuleIterator (string[] lookup_paths) {
+               directories = lookup_paths;
+       }
+
+       public new CoreDescriptor? get () {
+               return core_descriptor;
+       }
+
+       public bool next () {
+               while (current_directory < directories.length) {
+                       try {
+                               if (next_in_current_path ())
+                                       return true;
+                       }
+                       catch (Error e) {
+                               debug (e.message);
+                       }
+
+                       current_directory++;
+               }
+
+               file_enumerator = null;
+               core_descriptor = null;
+
+               return false;
+       }
+
+       private bool next_in_current_path () throws Error {
+                       var directory = File.new_for_path (directories[current_directory]);
+
+                       if (file_enumerator == null)
+                               file_enumerator = directory.enumerate_children ("", 
FileQueryInfoFlags.NOFOLLOW_SYMLINKS);
+
+                       if (file_enumerator == null)
+                               return false;
+
+                       for (var info = file_enumerator.next_file () ; info != null ; info = 
file_enumerator.next_file ()) {
+                               var core_descriptor_basename = info.get_name ();
+                               if (!core_descriptor_basename.has_suffix (".libretro"))
+                                       continue;
+
+                               var core_descriptor_file = directory.get_child (core_descriptor_basename);
+                               var core_descriptor_path = core_descriptor_file.get_path ();
+                               try {
+                                       core_descriptor = new CoreDescriptor (core_descriptor_path);
+
+                                       return true;
+                               }
+                               catch (Error e) {
+                                       debug (e.message);
+                               }
+                       }
+
+                       file_enumerator = null;
+
+                       return false;
+       }
+}
+


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