[gnome-games/wip/exalm/rebrand: 59/102] sega-saturn: Migrate to a game parser




commit 8cdd833a5c6a2651ff49117e543780ba9037f5cb
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Tue Mar 30 03:54:00 2021 +0500

    sega-saturn: Migrate to a game parser

 plugins/sega-saturn/src/meson.build             |  1 +
 plugins/sega-saturn/src/sega-saturn-parser.vala | 66 +++++++++++++++++++++++++
 plugins/sega-saturn/src/sega-saturn-plugin.vala | 66 +------------------------
 3 files changed, 69 insertions(+), 64 deletions(-)
---
diff --git a/plugins/sega-saturn/src/meson.build b/plugins/sega-saturn/src/meson.build
index 7d39aca4..9278d69d 100644
--- a/plugins/sega-saturn/src/meson.build
+++ b/plugins/sega-saturn/src/meson.build
@@ -1,6 +1,7 @@
 vala_sources = [
   'sega-saturn-error.vala',
   'sega-saturn-header.vala',
+  'sega-saturn-parser.vala',
   'sega-saturn-plugin.vala',
 ]
 
diff --git a/plugins/sega-saturn/src/sega-saturn-parser.vala b/plugins/sega-saturn/src/sega-saturn-parser.vala
new file mode 100644
index 00000000..1c79f560
--- /dev/null
+++ b/plugins/sega-saturn/src/sega-saturn-parser.vala
@@ -0,0 +1,66 @@
+// This file is part of GNOME Games. License: GPL-3.0+.
+
+public class Games.SegaSaturnParser : GameParser {
+       private const string CUE_MIME_TYPE = "application/x-cue";
+       private const string SEGA_SATURN_MIME_TYPE = "application/x-saturn-rom";
+
+       private string uid;
+
+       public SegaSaturnParser (Platform platform, Uri uri) {
+               base (platform, uri);
+       }
+
+       public override void parse () throws Error {
+               var file = uri.to_file ();
+               var file_info = file.query_info (FileAttribute.STANDARD_CONTENT_TYPE, 
FileQueryInfoFlags.NONE);
+               var mime_type = file_info.get_content_type ();
+
+               File bin_file;
+               switch (mime_type) {
+               case CUE_MIME_TYPE:
+                       var cue = new CueSheet (file);
+                       bin_file = get_binary_file (cue);
+
+                       break;
+               case SEGA_SATURN_MIME_TYPE:
+                       bin_file = file;
+
+                       break;
+               default:
+                       throw new SegaSaturnError.INVALID_FILE_TYPE ("Invalid file type: expected %s or %s 
but got %s for file %s.", CUE_MIME_TYPE, SEGA_SATURN_MIME_TYPE, mime_type, uri.to_string ());
+               }
+
+               var header = new SegaSaturnHeader (bin_file);
+               header.check_validity ();
+
+               var prefix = platform.get_uid_prefix ();
+               var product_number = header.get_product_number ();
+               var areas = header.get_areas ();
+
+               uid = @"$prefix-$product_number-$areas".down ();
+       }
+
+       public override string get_uid () {
+               return uid;
+       }
+
+       private static File get_binary_file (CueSheet cue) throws Error {
+               if (cue.tracks_number == 0)
+                       throw new SegaSaturnError.INVALID_CUE_SHEET ("The file “%s” doesn’t have a track.", 
cue.file.get_uri ());
+
+               var track = cue.get_track (0);
+               var file = track.file;
+
+               if (file.file_format != CueSheetFileFormat.BINARY && file.file_format != 
CueSheetFileFormat.UNKNOWN)
+                       throw new SegaSaturnError.INVALID_CUE_SHEET ("The file “%s” doesn’t have a valid 
binary file format.", cue.file.get_uri ());
+
+               if (!track.track_mode.is_mode1 ())
+                       throw new SegaSaturnError.INVALID_CUE_SHEET ("The file “%s” doesn’t have a valid 
track mode for track %d.", cue.file.get_uri (), track.track_number);
+
+               var file_info = file.file.query_info ("*", FileQueryInfoFlags.NONE);
+               if (file_info.get_content_type () != SEGA_SATURN_MIME_TYPE)
+                       throw new SegaSaturnError.INVALID_FILE_TYPE ("The file “%s” doesn’t have a valid Sega 
Saturn binary file.", cue.file.get_uri ());
+
+               return file.file;
+       }
+}
diff --git a/plugins/sega-saturn/src/sega-saturn-plugin.vala b/plugins/sega-saturn/src/sega-saturn-plugin.vala
index 743b43be..bf5e9492 100644
--- a/plugins/sega-saturn/src/sega-saturn-plugin.vala
+++ b/plugins/sega-saturn/src/sega-saturn-plugin.vala
@@ -12,6 +12,7 @@ private class Games.SegaSaturnPlugin : Object, Plugin {
        static construct {
                string[] mime_types = { CUE_MIME_TYPE, SEGA_SATURN_MIME_TYPE };
                platform = new Platform.with_mime_types (PLATFORM_ID, PLATFORM_NAME, mime_types, 
SEGA_SATURN_MIME_TYPE, PLATFORM_UID_PREFIX);
+               platform.parser_type = typeof (SegaSaturnParser);
        }
 
        public Platform[] get_platforms () {
@@ -19,76 +20,13 @@ private class Games.SegaSaturnPlugin : Object, Plugin {
        }
 
        public UriGameFactory[] get_uri_game_factories () {
-               var game_uri_adapter = new GenericGameUriAdapter (game_for_uri);
+               var game_uri_adapter = new RetroSimpleGameUriAdapter (platform);
                var factory = new GenericUriGameFactory (game_uri_adapter);
                factory.add_mime_type (CUE_MIME_TYPE);
                factory.add_mime_type (SEGA_SATURN_MIME_TYPE);
 
                return { factory };
        }
-
-       private static string get_uid (SegaSaturnHeader header) throws Error {
-               var product_number = header.get_product_number ();
-               var areas = header.get_areas ();
-
-               return @"$PLATFORM_UID_PREFIX-$product_number-$areas".down ();
-       }
-
-       private static Game game_for_uri (Uri uri) throws Error {
-               var file = uri.to_file ();
-               var file_info = file.query_info (FileAttribute.STANDARD_CONTENT_TYPE, 
FileQueryInfoFlags.NONE);
-               var mime_type = file_info.get_content_type ();
-
-               File bin_file;
-               switch (mime_type) {
-               case CUE_MIME_TYPE:
-                       var cue = new CueSheet (file);
-                       bin_file = get_binary_file (cue);
-
-                       break;
-               case SEGA_SATURN_MIME_TYPE:
-                       bin_file = file;
-
-                       break;
-               default:
-                       throw new SegaSaturnError.INVALID_FILE_TYPE ("Invalid file type: expected %s or %s 
but got %s for file %s.", CUE_MIME_TYPE, SEGA_SATURN_MIME_TYPE, mime_type, uri.to_string ());
-               }
-
-               var header = new SegaSaturnHeader (bin_file);
-               header.check_validity ();
-
-               var uid = new Uid (get_uid (header));
-               var title = new FilenameTitle (uri);
-               var media = new GriloMedia (title, SEGA_SATURN_MIME_TYPE);
-               var cover = new CompositeCover ({
-                       new LocalCover (uri),
-                       new GriloCover (media, uid)});
-
-               var game = new Game (uid, uri, title, platform);
-               game.set_cover (cover);
-
-               return game;
-       }
-
-       private static File get_binary_file (CueSheet cue) throws Error {
-               if (cue.tracks_number == 0)
-                       throw new SegaSaturnError.INVALID_CUE_SHEET ("The file “%s” doesn’t have a track.", 
cue.file.get_uri ());
-
-               var track = cue.get_track (0);
-               var file = track.file;
-
-               if (file.file_format != CueSheetFileFormat.BINARY && file.file_format != 
CueSheetFileFormat.UNKNOWN)
-                       throw new SegaSaturnError.INVALID_CUE_SHEET ("The file “%s” doesn’t have a valid 
binary file format.", cue.file.get_uri ());
-
-               if (!track.track_mode.is_mode1 ())
-                       throw new SegaSaturnError.INVALID_CUE_SHEET ("The file “%s” doesn’t have a valid 
track mode for track %d.", cue.file.get_uri (), track.track_number);
-
-               var file_info = file.file.query_info ("*", FileQueryInfoFlags.NONE);
-               if (file_info.get_content_type () != SEGA_SATURN_MIME_TYPE)
-                       throw new SegaSaturnError.INVALID_FILE_TYPE ("The file “%s” doesn’t have a valid Sega 
Saturn binary file.", cue.file.get_uri ());
-
-               return file.file;
-       }
 }
 
 [ModuleInit]


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