[retro-gtk] retro-gobject: Allow to browse cores with CoreDescriptor
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk] retro-gobject: Allow to browse cores with CoreDescriptor
- Date: Fri, 10 Feb 2017 12:01:34 +0000 (UTC)
commit 7011d197ae3820c6ca0bbfe57866b85a4955896c
Author: Adrien Plazas <kekun plazas laposte net>
Date: Sat Dec 3 09:28:33 2016 +0100
retro-gobject: Allow to browse cores with CoreDescriptor
Allow to loop through the available Libretro Core Descriptors, offering
a new way to look for a Libretro core.
https://bugzilla.gnome.org/show_bug.cgi?id=778446
retro-gobject/retro-module-query.vala | 51 +++++++++++++++++++++++++++++++++
1 files changed, 51 insertions(+), 0 deletions(-)
---
diff --git a/retro-gobject/retro-module-query.vala b/retro-gobject/retro-module-query.vala
index 0e14220..82004e1 100644
--- a/retro-gobject/retro-module-query.vala
+++ b/retro-gobject/retro-module-query.vala
@@ -1,6 +1,7 @@
// This file is part of Retro. License: GPLv3
namespace Retro.ModuleQuery {
+ public delegate bool CoreDescriptorQueryCallback (CoreDescriptor core_descriptor);
public delegate bool ModuleInfoQueryCallback (HashTable<string, string> module_info);
private const string ENV_PLUGIN_PATH = "RETRO_PLUGIN_PATH_1_0";
@@ -18,6 +19,45 @@ namespace Retro.ModuleQuery {
return null;
}
+ public void foreach_core_descriptor (CoreDescriptorQueryCallback callback) {
+ foreach (var path in get_plugin_lookup_paths ()) {
+ var directory = File.new_for_path (path);
+ if (!directory.query_exists ())
+ continue;
+
+ if (directory.query_file_type (FileQueryInfoFlags.NOFOLLOW_SYMLINKS) !=
FileType.DIRECTORY)
+ continue;
+
+ bool stop = false;
+ foreach_child (directory, (info) => {
+ var core_descriptor_basename = info.get_name ();
+ if (!core_descriptor_basename.has_suffix (".libretro"))
+ return true;
+
+ var core_descriptor_file = directory.get_child (core_descriptor_basename);
+ var core_descriptor_path = core_descriptor_file.get_path ();
+ CoreDescriptor core_descriptor;
+ try {
+ core_descriptor = new CoreDescriptor (core_descriptor_path);
+ }
+ catch (Error e) {
+ debug (e.message);
+
+ return true;
+ }
+
+ stop = callback (core_descriptor);
+ if (!stop)
+ return true;
+
+ return false;
+ });
+
+ if (stop)
+ break;
+ }
+ }
+
public string? lookup_module_for_info (ModuleInfoQueryCallback callback) throws Error {
foreach (var path in get_plugin_lookup_paths ()) {
var directory = File.new_for_path (path);
@@ -83,5 +123,16 @@ namespace Retro.ModuleQuery {
return module_info;
}
+
+ private delegate bool ForeachChildFunc (FileInfo child_info);
+ private void foreach_child (File file, ForeachChildFunc child_info_callback) {
+ try {
+ var enumerator = file.enumerate_children ("", FileQueryInfoFlags.NOFOLLOW_SYMLINKS);
+ for (var info = enumerator.next_file () ; info != null && child_info_callback (info)
; info = enumerator.next_file ());
+ }
+ catch (Error e) {
+ debug (e.message);
+ }
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]