[retro-gtk] retro-gobject: Add CoreDescriptor



commit 4c381a2b864685c0cd661029631a6b63438e8128
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Sat Dec 3 09:28:33 2016 +0100

    retro-gobject: Add CoreDescriptor
    
    This will be used in the next commit to look for Libretro cores via
    their Libretro Core Descriptor file.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=778446

 retro-gobject/Makefile.am                      |    2 +
 retro-gobject/retro-core-descriptor-error.vala |    8 ++
 retro-gobject/retro-core-descriptor.vala       |  106 ++++++++++++++++++++++++
 3 files changed, 116 insertions(+), 0 deletions(-)
---
diff --git a/retro-gobject/Makefile.am b/retro-gobject/Makefile.am
index 710c577..9947728 100644
--- a/retro-gobject/Makefile.am
+++ b/retro-gobject/Makefile.am
@@ -46,6 +46,8 @@ libretro_gobject_la_SOURCES = \
        memory.vala \
        module.vala \
        retro.vala \
+       retro-core-descriptor.vala \
+       retro-core-descriptor-error.vala \
        retro-module-query.vala \
        rumble.vala \
        system-info.vala \
diff --git a/retro-gobject/retro-core-descriptor-error.vala b/retro-gobject/retro-core-descriptor-error.vala
new file mode 100644
index 0000000..80d655d
--- /dev/null
+++ b/retro-gobject/retro-core-descriptor-error.vala
@@ -0,0 +1,8 @@
+// This file is part of Retro. License: GPLv3
+
+public errordomain Retro.CoreDescriptorError {
+       REQUIRED_GROUP_NOT_FOUND,
+       REQUIRED_KEY_NOT_FOUND,
+       FIRMWARE_NOT_FOUND,
+}
+
diff --git a/retro-gobject/retro-core-descriptor.vala b/retro-gobject/retro-core-descriptor.vala
new file mode 100644
index 0000000..ce393e9
--- /dev/null
+++ b/retro-gobject/retro-core-descriptor.vala
@@ -0,0 +1,106 @@
+// This file is part of Retro. License: GPLv3
+
+public class Retro.CoreDescriptor : Object {
+       public class Platform : Object {
+
+               private KeyFile key_file;
+               private string group;
+
+               private Platform (KeyFile key_file, string platform) {
+                       this.key_file = key_file;
+                       group = PLATFORM_GROUP_PREFIX + platform;
+               }
+       }
+
+       private const string LIBRETRO_GROUP = "Libretro";
+       private const string PLATFORM_GROUP_PREFIX = "Platform:";
+       private const string FIRMWARE_GROUP_PREFIX = "Firmware:";
+
+       private const string TYPE_KEY = "Type";
+       private const string NAME_KEY = "Name";
+       private const string MODULE_KEY = "Module";
+       private const string LIBRETRO_VERSION_KEY = "LibretroVersion";
+
+       private const string PLATFORM_MIME_TYPE_KEY = "MimeType";
+       private const string PLATFORM_FIRMWARES_KEY = "Firmwares";
+
+       private const string FIRMWARE_PATH_KEY = "Path";
+       private const string FIRMWARE_MANDATORY_KEY = "Mandatory";
+
+       private const string TYPE_EMULATOR = "Emulator";
+
+       private string filename;
+       private KeyFile key_file;
+
+       public CoreDescriptor (string filename) throws CoreDescriptorError, KeyFileError, FileError {
+               this.filename = filename;
+               key_file = new KeyFile ();
+               key_file.load_from_file (filename, KeyFileFlags.NONE);
+
+               check_libretro_group ();
+
+               foreach (var group in key_file.get_groups ()) {
+                       if (group.has_prefix (PLATFORM_GROUP_PREFIX))
+                               check_platform_group (group);
+                       else if (group.has_prefix (FIRMWARE_GROUP_PREFIX))
+                               check_firmware_group (group);
+               }
+       }
+
+       public bool get_is_emulator () throws KeyFileError {
+               return key_file.get_string (LIBRETRO_GROUP, TYPE_KEY) == TYPE_EMULATOR;
+       }
+
+       public string get_module () throws KeyFileError {
+               return key_file.get_string (LIBRETRO_GROUP, MODULE_KEY);
+       }
+
+       public File? get_module_file () throws KeyFileError {
+               var file = File.new_for_path (filename);
+               var dir = file.get_parent ();
+               if (dir == null)
+                       return null;
+
+               var module = get_module ();
+
+               return dir.get_child (module);
+       }
+
+       public bool has_platform (string platform) {
+               return key_file.has_group (PLATFORM_GROUP_PREFIX + platform);
+       }
+
+       public string[] get_mime_type (string platform) throws KeyFileError {
+               return key_file.get_string_list (PLATFORM_GROUP_PREFIX + platform, PLATFORM_MIME_TYPE_KEY);
+       }
+
+       public string[] get_firmwares (string platform) throws KeyFileError {
+               return key_file.get_string_list (PLATFORM_GROUP_PREFIX + platform, PLATFORM_FIRMWARES_KEY);
+       }
+
+       private void check_libretro_group () {
+               check_has_required_key (LIBRETRO_GROUP, TYPE_KEY);
+               check_has_required_key (LIBRETRO_GROUP, NAME_KEY);
+               check_has_required_key (LIBRETRO_GROUP, MODULE_KEY);
+               check_has_required_key (LIBRETRO_GROUP, LIBRETRO_VERSION_KEY);
+       }
+
+       private void check_platform_group (string group) {
+               check_has_required_key (group, PLATFORM_MIME_TYPE_KEY);
+               if (key_file.has_key (group, PLATFORM_FIRMWARES_KEY))
+                       foreach (var firmware in key_file.get_string_list (group, PLATFORM_FIRMWARES_KEY))
+                               if (!key_file.has_group (FIRMWARE_GROUP_PREFIX + firmware))
+                                       throw new CoreDescriptorError.FIRMWARE_NOT_FOUND ("%s isn't a valid 
Libretro core descriptor: [%s] mentioned in [%s] not found.", filename, FIRMWARE_GROUP_PREFIX + firmware, 
group);
+       }
+
+       private void check_firmware_group (string group) {
+               check_has_required_key (group, FIRMWARE_PATH_KEY);
+               check_has_required_key (group, FIRMWARE_MANDATORY_KEY);
+       }
+
+       private void check_has_required_key (string group, string key) throws CoreDescriptorError, 
KeyFileError {
+               if (!key_file.has_key (LIBRETRO_GROUP, TYPE_KEY))
+                       throw new CoreDescriptorError.REQUIRED_KEY_NOT_FOUND ("%s isn't a valid Libretro core 
descriptor: required key %s not found in group [%s].", filename, key, group);
+       }
+}
+


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