[gnome-games/wip/exalm/rebrand: 76/124] sega-cd: Migrate to a game parser
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-games/wip/exalm/rebrand: 76/124] sega-cd: Migrate to a game parser
- Date: Sat, 19 Jun 2021 14:37:45 +0000 (UTC)
commit b916df06073f8fcd5a596c19cd20a88e130e73f1
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Tue Mar 30 02:21:50 2021 +0500
sega-cd: Migrate to a game parser
plugins/sega-cd/src/meson.build | 1 +
plugins/sega-cd/src/sega-cd-header.vala | 1 +
plugins/sega-cd/src/sega-cd-parser.vala | 71 ++++++++++++++++++++++++++
plugins/sega-cd/src/sega-cd-plugin.vala | 88 ++++++---------------------------
4 files changed, 89 insertions(+), 72 deletions(-)
---
diff --git a/plugins/sega-cd/src/meson.build b/plugins/sega-cd/src/meson.build
index 4ce81020..740405c0 100644
--- a/plugins/sega-cd/src/meson.build
+++ b/plugins/sega-cd/src/meson.build
@@ -1,5 +1,6 @@
vala_sources = [
'sega-cd-header.vala',
+ 'sega-cd-parser.vala',
'sega-cd-plugin.vala',
'sega-cd-system.vala',
]
diff --git a/plugins/sega-cd/src/sega-cd-header.vala b/plugins/sega-cd/src/sega-cd-header.vala
index 9d75ae4d..fcefcc2c 100644
--- a/plugins/sega-cd/src/sega-cd-header.vala
+++ b/plugins/sega-cd/src/sega-cd-header.vala
@@ -110,4 +110,5 @@ errordomain Games.SegaCDError {
INVALID_HEADER,
INVALID_CUE_SHEET,
INVALID_FILE_TYPE,
+ INVALID_PLATFORM,
}
diff --git a/plugins/sega-cd/src/sega-cd-parser.vala b/plugins/sega-cd/src/sega-cd-parser.vala
new file mode 100644
index 00000000..51a1de62
--- /dev/null
+++ b/plugins/sega-cd/src/sega-cd-parser.vala
@@ -0,0 +1,71 @@
+// This file is part of GNOME Games. License: GPL-3.0+.
+
+public class Games.SegaCDParser : GameParser {
+ private const string SEGA_CD_PLATFORM_ID = "SegaCD";
+ private const string SEGA_CD_32X_PLATFORM_ID = "SegaCD32X";
+ private const string CUE_MIME_TYPE = "application/x-cue";
+ private const string SEGA_CD_MIME_TYPE = "application/x-sega-cd-rom";
+
+ private string uid;
+
+ public SegaCDParser (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_CD_MIME_TYPE:
+ bin_file = file;
+
+ break;
+ default:
+ throw new SegaCDError.INVALID_FILE_TYPE ("Invalid file type: expected %s or %s but
got %s for file %s.", CUE_MIME_TYPE, SEGA_CD_MIME_TYPE, mime_type, uri.to_string ());
+ }
+
+ var header = new SegaCDHeader (bin_file);
+ header.check_validity ();
+
+ if (platform.get_id () == SEGA_CD_PLATFORM_ID && !header.is_sega_cd ())
+ throw new SegaCDError.INVALID_PLATFORM ("Invalid platform: expected %s\n",
platform.get_id ());
+
+ if (platform.get_id () == SEGA_CD_32X_PLATFORM_ID && !header.is_sega_cd_32x ())
+ throw new SegaCDError.INVALID_PLATFORM ("Invalid platform: expected %s\n",
platform.get_id ());
+
+ var bin_uri = new Uri (bin_file.get_uri ());
+ var header_offset = header.get_offset ();
+ uid = Fingerprint.get_uid_for_chunk (bin_uri, platform.get_uid_prefix (), header_offset,
SegaCDHeader.HEADER_LENGTH);
+ }
+
+ public override string get_uid () {
+ return uid;
+ }
+
+ private static File get_binary_file (CueSheet cue) throws Error {
+ if (cue.tracks_number == 0)
+ throw new SegaCDError.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 SegaCDError.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 SegaCDError.INVALID_CUE_SHEET ("The file “%s” doesn’t have a valid track
mode for track %d.", cue.file.get_uri (), track.track_number);
+
+ var header = new SegaCDHeader (file.file);
+ header.check_validity ();
+
+ return file.file;
+ }
+}
diff --git a/plugins/sega-cd/src/sega-cd-plugin.vala b/plugins/sega-cd/src/sega-cd-plugin.vala
index 506e4779..0489ae22 100644
--- a/plugins/sega-cd/src/sega-cd-plugin.vala
+++ b/plugins/sega-cd/src/sega-cd-plugin.vala
@@ -19,9 +19,12 @@ private class Games.SegaCDPlugin : Object, Plugin {
static construct {
string[] mime_types = { CUE_MIME_TYPE, SEGA_CD_MIME_TYPE };
- string[] mime_types_32x = { CUE_MIME_TYPE, SEGA_CD_MIME_TYPE, 32X_MIME_TYPE };
platform_sega_cd = new Platform.with_mime_types (SEGA_CD_PLATFORM_ID, SEGA_CD_PLATFORM_NAME,
mime_types, SEGA_CD_MIME_TYPE, SEGA_CD_UID_PREFIX);
+ platform_sega_cd.parser_type = typeof (SegaCDParser);
+
+ string[] mime_types_32x = { CUE_MIME_TYPE, SEGA_CD_MIME_TYPE, 32X_MIME_TYPE };
platform_sega_cd_32x = new Platform.with_mime_types (SEGA_CD_32X_PLATFORM_ID,
SEGA_CD_32X_PLATFORM_NAME, mime_types_32x, SEGA_CD_MIME_TYPE, SEGA_CD_32X_UID_PREFIX);
+ platform_sega_cd_32x.parser_type = typeof (SegaCDParser);
}
public Platform[] get_platforms () {
@@ -29,77 +32,18 @@ private class Games.SegaCDPlugin : Object, Plugin {
}
public UriGameFactory[] get_uri_game_factories () {
- var game_uri_adapter = new GenericGameUriAdapter (game_for_uri);
- var factory = new GenericUriGameFactory (game_uri_adapter);
- factory.add_mime_type (CUE_MIME_TYPE);
- factory.add_mime_type (SEGA_CD_MIME_TYPE);
-
- return { factory };
- }
-
- 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_CD_MIME_TYPE:
- bin_file = file;
-
- break;
- default:
- throw new SegaCDError.INVALID_FILE_TYPE ("Invalid file type: expected %s or %s but
got %s for file %s.", CUE_MIME_TYPE, SEGA_CD_MIME_TYPE, mime_type, uri.to_string ());
- }
-
- var header = new SegaCDHeader (bin_file);
- header.check_validity ();
-
- Platform platform;
- if (header.is_sega_cd ())
- platform = platform_sega_cd;
- else if (header.is_sega_cd_32x ())
- platform = platform_sega_cd_32x;
- else
- assert_not_reached ();
-
- var bin_uri = new Uri (bin_file.get_uri ());
- var header_offset = header.get_offset ();
- var uid = new Uid (Fingerprint.get_uid_for_chunk (bin_uri, SEGA_CD_UID_PREFIX, header_offset,
SegaCDHeader.HEADER_LENGTH));
- var title = new FilenameTitle (uri);
- var media = new GriloMedia (title, SEGA_CD_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 SegaCDError.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 SegaCDError.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 SegaCDError.INVALID_CUE_SHEET ("The file “%s” doesn’t have a valid track
mode for track %d.", cue.file.get_uri (), track.track_number);
-
- var header = new SegaCDHeader (file.file);
- header.check_validity ();
-
- return file.file;
+ var sega_cd_adapter = new RetroSimpleGameUriAdapter (platform_sega_cd);
+ var sega_cd_factory = new GenericUriGameFactory (sega_cd_adapter);
+ sega_cd_factory.add_mime_type (CUE_MIME_TYPE);
+ sega_cd_factory.add_mime_type (SEGA_CD_MIME_TYPE);
+
+ var sega_cd_32x_adapter = new RetroSimpleGameUriAdapter (platform_sega_cd_32x);
+ var sega_cd_32x_factory = new GenericUriGameFactory (sega_cd_32x_adapter);
+ sega_cd_32x_factory.add_mime_type (CUE_MIME_TYPE);
+ sega_cd_32x_factory.add_mime_type (SEGA_CD_MIME_TYPE);
+ sega_cd_32x_factory.add_mime_type (32X_MIME_TYPE);
+
+ return { sega_cd_factory, sega_cd_32x_factory };
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]