[retro-gtk] Add ModuleIterator
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk] Add ModuleIterator
- Date: Sun, 26 Feb 2017 13:19:24 +0000 (UTC)
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]