[retro-gtk] retro-gobject: Allow to browse cores with CoreDescriptor



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]