gemba 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. checksums.yaml +4 -4
  2. data/THIRD_PARTY_NOTICES +37 -2
  3. data/assets/placeholder_boxart.png +0 -0
  4. data/bin/gemba +2 -2
  5. data/ext/gemba/extconf.rb +23 -1
  6. data/ext/gemba/gemba_ext.c +436 -2
  7. data/ext/gemba/gemba_ext.h +2 -0
  8. data/gemba.gemspec +5 -3
  9. data/lib/gemba/achievements/achievement.rb +23 -0
  10. data/lib/gemba/achievements/backend.rb +186 -0
  11. data/lib/gemba/achievements/cache.rb +70 -0
  12. data/lib/gemba/achievements/credentials_presenter.rb +142 -0
  13. data/lib/gemba/achievements/fake_backend.rb +205 -0
  14. data/lib/gemba/achievements/null_backend.rb +11 -0
  15. data/lib/gemba/achievements/offline_backend.rb +168 -0
  16. data/lib/gemba/achievements/retro_achievements/backend.rb +453 -0
  17. data/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb +64 -0
  18. data/lib/gemba/achievements/retro_achievements/ping_worker.rb +27 -0
  19. data/lib/gemba/achievements.rb +19 -0
  20. data/lib/gemba/achievements_window.rb +556 -0
  21. data/lib/gemba/app_controller.rb +1015 -0
  22. data/lib/gemba/bios.rb +54 -0
  23. data/lib/gemba/boxart_fetcher/libretro_backend.rb +39 -0
  24. data/lib/gemba/boxart_fetcher/null_backend.rb +12 -0
  25. data/lib/gemba/boxart_fetcher.rb +79 -0
  26. data/lib/gemba/bus_emitter.rb +13 -0
  27. data/lib/gemba/child_window.rb +24 -1
  28. data/lib/gemba/cli/commands/config_cmd.rb +83 -0
  29. data/lib/gemba/cli/commands/decode.rb +154 -0
  30. data/lib/gemba/cli/commands/patch.rb +78 -0
  31. data/lib/gemba/cli/commands/play.rb +78 -0
  32. data/lib/gemba/cli/commands/record.rb +114 -0
  33. data/lib/gemba/cli/commands/replay.rb +161 -0
  34. data/lib/gemba/cli/commands/retro_achievements.rb +213 -0
  35. data/lib/gemba/cli/commands/version.rb +22 -0
  36. data/lib/gemba/cli.rb +52 -364
  37. data/lib/gemba/config.rb +134 -1
  38. data/lib/gemba/data/gb_games.json +1 -0
  39. data/lib/gemba/data/gb_md5.json +1 -0
  40. data/lib/gemba/data/gba_games.json +1 -0
  41. data/lib/gemba/data/gba_md5.json +1 -0
  42. data/lib/gemba/data/gbc_games.json +1 -0
  43. data/lib/gemba/data/gbc_md5.json +1 -0
  44. data/lib/gemba/emulator_frame.rb +1060 -0
  45. data/lib/gemba/event_bus.rb +48 -0
  46. data/lib/gemba/frame_stack.rb +60 -0
  47. data/lib/gemba/game_index.rb +84 -0
  48. data/lib/gemba/game_picker_frame.rb +268 -0
  49. data/lib/gemba/gamepad_map.rb +103 -0
  50. data/lib/gemba/headless.rb +6 -5
  51. data/lib/gemba/headless_player.rb +33 -3
  52. data/lib/gemba/help_window.rb +61 -0
  53. data/lib/gemba/hotkey_map.rb +3 -1
  54. data/lib/gemba/input_recorder.rb +107 -0
  55. data/lib/gemba/input_replayer.rb +119 -0
  56. data/lib/gemba/keyboard_map.rb +90 -0
  57. data/lib/gemba/locales/en.yml +97 -5
  58. data/lib/gemba/locales/ja.yml +97 -5
  59. data/lib/gemba/main_window.rb +56 -0
  60. data/lib/gemba/modal_stack.rb +81 -0
  61. data/lib/gemba/patcher_window.rb +223 -0
  62. data/lib/gemba/platform/gb.rb +21 -0
  63. data/lib/gemba/platform/gba.rb +21 -0
  64. data/lib/gemba/platform/gbc.rb +23 -0
  65. data/lib/gemba/platform.rb +20 -0
  66. data/lib/gemba/platform_open.rb +19 -0
  67. data/lib/gemba/recorder.rb +4 -3
  68. data/lib/gemba/replay_player.rb +691 -0
  69. data/lib/gemba/rom_info.rb +57 -0
  70. data/lib/gemba/rom_info_window.rb +16 -3
  71. data/lib/gemba/rom_library.rb +106 -0
  72. data/lib/gemba/rom_overrides.rb +47 -0
  73. data/lib/gemba/rom_patcher/bps.rb +161 -0
  74. data/lib/gemba/rom_patcher/ips.rb +101 -0
  75. data/lib/gemba/rom_patcher/ups.rb +118 -0
  76. data/lib/gemba/rom_patcher.rb +109 -0
  77. data/lib/gemba/{rom_loader.rb → rom_resolver.rb} +7 -6
  78. data/lib/gemba/runtime.rb +59 -26
  79. data/lib/gemba/save_state_manager.rb +4 -7
  80. data/lib/gemba/save_state_picker.rb +17 -4
  81. data/lib/gemba/session_logger.rb +64 -0
  82. data/lib/gemba/settings/audio_tab.rb +77 -0
  83. data/lib/gemba/settings/gamepad_tab.rb +351 -0
  84. data/lib/gemba/settings/hotkeys_tab.rb +259 -0
  85. data/lib/gemba/settings/paths.rb +11 -0
  86. data/lib/gemba/settings/recording_tab.rb +83 -0
  87. data/lib/gemba/settings/save_states_tab.rb +91 -0
  88. data/lib/gemba/settings/system_tab.rb +362 -0
  89. data/lib/gemba/settings/video_tab.rb +318 -0
  90. data/lib/gemba/settings_window.rb +162 -1036
  91. data/lib/gemba/version.rb +1 -1
  92. data/lib/gemba/virtual_keyboard.rb +19 -0
  93. data/lib/gemba.rb +2 -12
  94. data/test/achievements_window/test_bulk_sync.rb +218 -0
  95. data/test/achievements_window/test_bus_events.rb +125 -0
  96. data/test/achievements_window/test_close_confirmation.rb +201 -0
  97. data/test/achievements_window/test_initial_state.rb +164 -0
  98. data/test/achievements_window/test_sorting.rb +227 -0
  99. data/test/achievements_window/test_tree_rendering.rb +133 -0
  100. data/test/fixtures/fake_bios.bin +0 -0
  101. data/test/fixtures/pong.gba +0 -0
  102. data/test/fixtures/test.gb +0 -0
  103. data/test/fixtures/test.gbc +0 -0
  104. data/test/fixtures/test_quicksave.ss +0 -0
  105. data/test/screenshots/no_focus.png +0 -0
  106. data/test/shared/teek_test_worker.rb +17 -1
  107. data/test/shared/tk_test_helper.rb +91 -4
  108. data/test/support/achievements_window_helpers.rb +18 -0
  109. data/test/support/fake_core.rb +25 -0
  110. data/test/support/fake_ra_runtime.rb +74 -0
  111. data/test/support/fake_requester.rb +68 -0
  112. data/test/support/player_helpers.rb +20 -5
  113. data/test/test_achievement.rb +32 -0
  114. data/test/{test_player.rb → test_app_controller.rb} +353 -85
  115. data/test/test_bios.rb +123 -0
  116. data/test/test_boxart_fetcher.rb +150 -0
  117. data/test/test_cli.rb +17 -265
  118. data/test/test_cli_config.rb +64 -0
  119. data/test/test_cli_decode.rb +97 -0
  120. data/test/test_cli_patch.rb +58 -0
  121. data/test/test_cli_play.rb +213 -0
  122. data/test/test_cli_ra.rb +175 -0
  123. data/test/test_cli_record.rb +69 -0
  124. data/test/test_cli_replay.rb +72 -0
  125. data/test/test_cli_sync_requester.rb +152 -0
  126. data/test/test_cli_version.rb +27 -0
  127. data/test/test_config.rb +2 -3
  128. data/test/test_config_ra.rb +69 -0
  129. data/test/test_core.rb +62 -1
  130. data/test/test_credentials_presenter.rb +192 -0
  131. data/test/test_event_bus.rb +100 -0
  132. data/test/test_fake_backend_achievements.rb +130 -0
  133. data/test/test_fake_backend_auth.rb +68 -0
  134. data/test/test_game_index.rb +77 -0
  135. data/test/test_game_picker_frame.rb +310 -0
  136. data/test/test_gamepad_map.rb +1 -3
  137. data/test/test_headless_player.rb +17 -3
  138. data/test/test_help_window.rb +82 -0
  139. data/test/test_hotkey_map.rb +22 -1
  140. data/test/test_input_recorder.rb +179 -0
  141. data/test/test_input_replay_determinism.rb +113 -0
  142. data/test/test_input_replayer.rb +162 -0
  143. data/test/test_keyboard_map.rb +1 -3
  144. data/test/test_libretro_backend.rb +41 -0
  145. data/test/test_locale.rb +1 -1
  146. data/test/test_logging.rb +123 -0
  147. data/test/test_null_backend.rb +42 -0
  148. data/test/test_offline_backend.rb +116 -0
  149. data/test/test_overlay_renderer.rb +1 -1
  150. data/test/test_platform.rb +149 -0
  151. data/test/test_ra_backend.rb +313 -0
  152. data/test/test_ra_backend_unlock_gate.rb +56 -0
  153. data/test/test_recorder.rb +0 -3
  154. data/test/test_replay_player.rb +316 -0
  155. data/test/test_rom_info.rb +149 -0
  156. data/test/test_rom_overrides.rb +86 -0
  157. data/test/test_rom_patcher.rb +382 -0
  158. data/test/{test_rom_loader.rb → test_rom_resolver.rb} +25 -26
  159. data/test/test_save_state_manager.rb +2 -4
  160. data/test/test_settings_audio.rb +107 -0
  161. data/test/test_settings_hotkeys.rb +83 -66
  162. data/test/test_settings_recording.rb +49 -0
  163. data/test/test_settings_save_states.rb +97 -0
  164. data/test/test_settings_system.rb +133 -0
  165. data/test/test_settings_video.rb +450 -0
  166. data/test/test_settings_window.rb +76 -507
  167. data/test/test_tip_service.rb +6 -6
  168. data/test/test_toast_overlay.rb +1 -1
  169. data/test/test_virtual_events.rb +156 -0
  170. data/test/test_virtual_keyboard.rb +1 -1
  171. data/vendor/rcheevos/CHANGELOG.md +495 -0
  172. data/vendor/rcheevos/LICENSE +21 -0
  173. data/vendor/rcheevos/Package.swift +33 -0
  174. data/vendor/rcheevos/README.md +67 -0
  175. data/vendor/rcheevos/include/module.modulemap +70 -0
  176. data/vendor/rcheevos/include/rc_api_editor.h +296 -0
  177. data/vendor/rcheevos/include/rc_api_info.h +280 -0
  178. data/vendor/rcheevos/include/rc_api_request.h +77 -0
  179. data/vendor/rcheevos/include/rc_api_runtime.h +417 -0
  180. data/vendor/rcheevos/include/rc_api_user.h +262 -0
  181. data/vendor/rcheevos/include/rc_client.h +877 -0
  182. data/vendor/rcheevos/include/rc_client_raintegration.h +101 -0
  183. data/vendor/rcheevos/include/rc_consoles.h +138 -0
  184. data/vendor/rcheevos/include/rc_error.h +59 -0
  185. data/vendor/rcheevos/include/rc_export.h +100 -0
  186. data/vendor/rcheevos/include/rc_hash.h +200 -0
  187. data/vendor/rcheevos/include/rc_runtime.h +148 -0
  188. data/vendor/rcheevos/include/rc_runtime_types.h +452 -0
  189. data/vendor/rcheevos/include/rc_util.h +51 -0
  190. data/vendor/rcheevos/include/rcheevos.h +8 -0
  191. data/vendor/rcheevos/src/rapi/rc_api_common.c +1379 -0
  192. data/vendor/rcheevos/src/rapi/rc_api_common.h +88 -0
  193. data/vendor/rcheevos/src/rapi/rc_api_editor.c +625 -0
  194. data/vendor/rcheevos/src/rapi/rc_api_info.c +587 -0
  195. data/vendor/rcheevos/src/rapi/rc_api_runtime.c +901 -0
  196. data/vendor/rcheevos/src/rapi/rc_api_user.c +483 -0
  197. data/vendor/rcheevos/src/rc_client.c +6941 -0
  198. data/vendor/rcheevos/src/rc_client_external.c +281 -0
  199. data/vendor/rcheevos/src/rc_client_external.h +177 -0
  200. data/vendor/rcheevos/src/rc_client_external_versions.h +171 -0
  201. data/vendor/rcheevos/src/rc_client_internal.h +409 -0
  202. data/vendor/rcheevos/src/rc_client_raintegration.c +566 -0
  203. data/vendor/rcheevos/src/rc_client_raintegration_internal.h +61 -0
  204. data/vendor/rcheevos/src/rc_client_types.natvis +396 -0
  205. data/vendor/rcheevos/src/rc_compat.c +251 -0
  206. data/vendor/rcheevos/src/rc_compat.h +121 -0
  207. data/vendor/rcheevos/src/rc_libretro.c +915 -0
  208. data/vendor/rcheevos/src/rc_libretro.h +98 -0
  209. data/vendor/rcheevos/src/rc_util.c +199 -0
  210. data/vendor/rcheevos/src/rc_version.c +11 -0
  211. data/vendor/rcheevos/src/rc_version.h +32 -0
  212. data/vendor/rcheevos/src/rcheevos/alloc.c +312 -0
  213. data/vendor/rcheevos/src/rcheevos/condition.c +754 -0
  214. data/vendor/rcheevos/src/rcheevos/condset.c +777 -0
  215. data/vendor/rcheevos/src/rcheevos/consoleinfo.c +1215 -0
  216. data/vendor/rcheevos/src/rcheevos/format.c +330 -0
  217. data/vendor/rcheevos/src/rcheevos/lboard.c +287 -0
  218. data/vendor/rcheevos/src/rcheevos/memref.c +805 -0
  219. data/vendor/rcheevos/src/rcheevos/operand.c +607 -0
  220. data/vendor/rcheevos/src/rcheevos/rc_internal.h +390 -0
  221. data/vendor/rcheevos/src/rcheevos/rc_runtime_types.natvis +541 -0
  222. data/vendor/rcheevos/src/rcheevos/rc_validate.c +1406 -0
  223. data/vendor/rcheevos/src/rcheevos/rc_validate.h +18 -0
  224. data/vendor/rcheevos/src/rcheevos/richpresence.c +922 -0
  225. data/vendor/rcheevos/src/rcheevos/runtime.c +852 -0
  226. data/vendor/rcheevos/src/rcheevos/runtime_progress.c +1073 -0
  227. data/vendor/rcheevos/src/rcheevos/trigger.c +344 -0
  228. data/vendor/rcheevos/src/rcheevos/value.c +935 -0
  229. data/vendor/rcheevos/src/rhash/aes.c +480 -0
  230. data/vendor/rcheevos/src/rhash/aes.h +49 -0
  231. data/vendor/rcheevos/src/rhash/cdreader.c +838 -0
  232. data/vendor/rcheevos/src/rhash/hash.c +1402 -0
  233. data/vendor/rcheevos/src/rhash/hash_disc.c +1340 -0
  234. data/vendor/rcheevos/src/rhash/hash_encrypted.c +566 -0
  235. data/vendor/rcheevos/src/rhash/hash_rom.c +426 -0
  236. data/vendor/rcheevos/src/rhash/hash_zip.c +460 -0
  237. data/vendor/rcheevos/src/rhash/md5.c +382 -0
  238. data/vendor/rcheevos/src/rhash/md5.h +91 -0
  239. data/vendor/rcheevos/src/rhash/rc_hash_internal.h +116 -0
  240. data/vendor/rcheevos/test/libretro.h +205 -0
  241. data/vendor/rcheevos/test/rapi/test_rc_api_common.c +941 -0
  242. data/vendor/rcheevos/test/rapi/test_rc_api_editor.c +931 -0
  243. data/vendor/rcheevos/test/rapi/test_rc_api_info.c +545 -0
  244. data/vendor/rcheevos/test/rapi/test_rc_api_runtime.c +2213 -0
  245. data/vendor/rcheevos/test/rapi/test_rc_api_user.c +998 -0
  246. data/vendor/rcheevos/test/rcheevos/mock_memory.h +32 -0
  247. data/vendor/rcheevos/test/rcheevos/test_condition.c +570 -0
  248. data/vendor/rcheevos/test/rcheevos/test_condset.c +5170 -0
  249. data/vendor/rcheevos/test/rcheevos/test_consoleinfo.c +203 -0
  250. data/vendor/rcheevos/test/rcheevos/test_format.c +112 -0
  251. data/vendor/rcheevos/test/rcheevos/test_lboard.c +746 -0
  252. data/vendor/rcheevos/test/rcheevos/test_memref.c +520 -0
  253. data/vendor/rcheevos/test/rcheevos/test_operand.c +692 -0
  254. data/vendor/rcheevos/test/rcheevos/test_rc_validate.c +502 -0
  255. data/vendor/rcheevos/test/rcheevos/test_richpresence.c +1564 -0
  256. data/vendor/rcheevos/test/rcheevos/test_runtime.c +1667 -0
  257. data/vendor/rcheevos/test/rcheevos/test_runtime_progress.c +1821 -0
  258. data/vendor/rcheevos/test/rcheevos/test_timing.c +166 -0
  259. data/vendor/rcheevos/test/rcheevos/test_trigger.c +2521 -0
  260. data/vendor/rcheevos/test/rcheevos/test_value.c +870 -0
  261. data/vendor/rcheevos/test/rcheevos-test.sln +46 -0
  262. data/vendor/rcheevos/test/rcheevos-test.vcxproj +239 -0
  263. data/vendor/rcheevos/test/rcheevos-test.vcxproj.filters +335 -0
  264. data/vendor/rcheevos/test/rhash/data.c +657 -0
  265. data/vendor/rcheevos/test/rhash/data.h +32 -0
  266. data/vendor/rcheevos/test/rhash/mock_filereader.c +236 -0
  267. data/vendor/rcheevos/test/rhash/mock_filereader.h +31 -0
  268. data/vendor/rcheevos/test/rhash/test_cdreader.c +920 -0
  269. data/vendor/rcheevos/test/rhash/test_hash.c +310 -0
  270. data/vendor/rcheevos/test/rhash/test_hash_disc.c +1450 -0
  271. data/vendor/rcheevos/test/rhash/test_hash_rom.c +899 -0
  272. data/vendor/rcheevos/test/rhash/test_hash_zip.c +551 -0
  273. data/vendor/rcheevos/test/test.c +113 -0
  274. data/vendor/rcheevos/test/test_framework.h +205 -0
  275. data/vendor/rcheevos/test/test_rc_client.c +10509 -0
  276. data/vendor/rcheevos/test/test_rc_client_external.c +2197 -0
  277. data/vendor/rcheevos/test/test_rc_client_raintegration.c +441 -0
  278. data/vendor/rcheevos/test/test_rc_libretro.c +952 -0
  279. data/vendor/rcheevos/test/test_types.natvis +9 -0
  280. data/vendor/rcheevos/validator/validator.c +658 -0
  281. data/vendor/rcheevos/validator/validator.vcxproj +152 -0
  282. data/vendor/rcheevos/validator/validator.vcxproj.filters +82 -0
  283. metadata +274 -11
  284. data/lib/gemba/input_mappings.rb +0 -214
  285. data/lib/gemba/player.rb +0 -1525
@@ -0,0 +1,236 @@
1
+ #include "rc_hash.h"
2
+
3
+ #include "../rc_compat.h"
4
+
5
+ #include <stdlib.h>
6
+ #include <string.h>
7
+
8
+ typedef struct mock_file_data
9
+ {
10
+ const char* path;
11
+ const uint8_t* data;
12
+ int64_t size;
13
+ int64_t pos;
14
+ int first_sector;
15
+ } mock_file_data;
16
+
17
+ static mock_file_data mock_file_instance[16];
18
+ static int mock_cd_tracks;
19
+
20
+ static void* _mock_file_open(const char* path)
21
+ {
22
+ size_t i;
23
+ for (i = 0; i < sizeof(mock_file_instance) / sizeof(mock_file_instance[0]); ++i)
24
+ {
25
+ if (strcmp(path, mock_file_instance[i].path) == 0)
26
+ {
27
+ mock_file_instance[i].pos = 0;
28
+ return &mock_file_instance[i];
29
+ }
30
+ }
31
+
32
+ return NULL;
33
+ }
34
+
35
+ static void _mock_file_seek(void* file_handle, int64_t offset, int origin)
36
+ {
37
+ mock_file_data* file = (mock_file_data*)file_handle;
38
+ switch (origin)
39
+ {
40
+ case SEEK_SET:
41
+ file->pos = offset;
42
+ break;
43
+ case SEEK_CUR:
44
+ file->pos += offset;
45
+ break;
46
+ case SEEK_END:
47
+ file->pos = file->size - offset;
48
+ break;
49
+ }
50
+
51
+ if (file->pos > file->size)
52
+ file->pos = file->size;
53
+ }
54
+
55
+ static int64_t _mock_file_tell(void* file_handle)
56
+ {
57
+ mock_file_data* file = (mock_file_data*)file_handle;
58
+ return file->pos;
59
+ }
60
+
61
+ static size_t _mock_file_read(void* file_handle, void* buffer, size_t count)
62
+ {
63
+ mock_file_data* file = (mock_file_data*)file_handle;
64
+ const size_t remaining = (size_t)(file->size - file->pos);
65
+ if (count > remaining)
66
+ count = remaining;
67
+
68
+ if (count > 0)
69
+ {
70
+ if (file->data)
71
+ memcpy(buffer, &file->data[file->pos], count);
72
+ else
73
+ memset(buffer, 0, count);
74
+
75
+ file->pos += count;
76
+ }
77
+
78
+ return count;
79
+ }
80
+
81
+ static void _mock_file_close(void* file_handle)
82
+ {
83
+ (void)file_handle;
84
+ }
85
+
86
+ static void reset_mock_files()
87
+ {
88
+ size_t i;
89
+
90
+ memset(&mock_file_instance, 0, sizeof(mock_file_instance));
91
+ for (i = 0; i < sizeof(mock_file_instance) / sizeof(mock_file_instance[0]); ++i)
92
+ mock_file_instance[i].path = "";
93
+
94
+ mock_cd_tracks = 0;
95
+ }
96
+
97
+ void get_mock_filereader(struct rc_hash_filereader* reader)
98
+ {
99
+ reader->open = _mock_file_open;
100
+ reader->seek = _mock_file_seek;
101
+ reader->tell = _mock_file_tell;
102
+ reader->read = _mock_file_read;
103
+ reader->close = _mock_file_close;
104
+
105
+ reset_mock_files();
106
+ }
107
+
108
+ void init_mock_filereader()
109
+ {
110
+ struct rc_hash_filereader reader;
111
+ get_mock_filereader(&reader);
112
+
113
+ rc_hash_init_custom_filereader(&reader);
114
+ }
115
+
116
+ void mock_file(int index, const char* filename, const uint8_t* buffer, size_t buffer_size)
117
+ {
118
+ if (index == 0)
119
+ reset_mock_files();
120
+
121
+ mock_file_instance[index].path = filename;
122
+ mock_file_instance[index].data = buffer;
123
+ mock_file_instance[index].size = buffer_size;
124
+ mock_file_instance[index].pos = 0;
125
+ mock_file_instance[index].first_sector = 0;
126
+ }
127
+
128
+ void mock_file_text(int index, const char* filename, const char* contents)
129
+ {
130
+ mock_file(index, filename, (const uint8_t*)contents, strlen(contents));
131
+ }
132
+
133
+ void mock_file_first_sector(int index, int first_sector)
134
+ {
135
+ mock_file_instance[index].first_sector = first_sector;
136
+ }
137
+
138
+ void mock_file_size(int index, size_t mock_size)
139
+ {
140
+ mock_file_instance[index].size = mock_size;
141
+ }
142
+
143
+ void mock_empty_file(int index, const char* filename, size_t mock_size)
144
+ {
145
+ mock_file(index, filename, NULL, mock_size);
146
+ }
147
+
148
+ #ifndef RC_HASH_NO_DISC
149
+
150
+ static void* _mock_cd_open_track(const char* path, uint32_t track)
151
+ {
152
+ if (track == RC_HASH_CDTRACK_LAST)
153
+ track = mock_cd_tracks;
154
+
155
+ if (track == 1 || track == RC_HASH_CDTRACK_FIRST_DATA || track == RC_HASH_CDTRACK_LARGEST)
156
+ {
157
+ if (strstr(path, ".cue"))
158
+ {
159
+ mock_file_data* file = (mock_file_data*)_mock_file_open(path);
160
+ if (!file)
161
+ return file;
162
+
163
+ return _mock_file_open((const char*)file->data);
164
+ }
165
+
166
+ return _mock_file_open(path);
167
+ }
168
+ else if (strstr(path, ".cue"))
169
+ {
170
+ mock_file_data* file = (mock_file_data*)_mock_file_open(path);
171
+ if (file)
172
+ {
173
+ char buffer[256];
174
+
175
+ const size_t file_len = strlen((const char*)file->data);
176
+ memcpy(buffer, file->data, file_len - 4);
177
+ snprintf(&buffer[file_len - 4], sizeof(buffer) - (file_len - 4), "%d%s", track, &file->data[file_len - 4]);
178
+
179
+ return _mock_file_open(buffer);
180
+ }
181
+ }
182
+ else if (strstr(path, ".gdi"))
183
+ {
184
+ mock_file_data* file = (mock_file_data*)_mock_file_open(path);
185
+ if (file)
186
+ {
187
+ char buffer[32];
188
+ snprintf(buffer, sizeof(buffer), "track%02d.bin", track);
189
+ return _mock_file_open(buffer);
190
+ }
191
+ }
192
+
193
+ return NULL;
194
+ }
195
+
196
+ static size_t _mock_cd_read_sector(void* track_handle, uint32_t sector, void* buffer, size_t requested_bytes)
197
+ {
198
+ mock_file_data* file = (mock_file_data*)track_handle;
199
+ sector -= file->first_sector;
200
+
201
+ _mock_file_seek(track_handle, sector * 2048, SEEK_SET);
202
+ return _mock_file_read(track_handle, buffer, requested_bytes);
203
+ }
204
+
205
+ static uint32_t _mock_cd_first_track_sector(void* track_handle)
206
+ {
207
+ mock_file_data* file = (mock_file_data*)track_handle;
208
+ return file->first_sector;
209
+ }
210
+
211
+ void mock_cd_num_tracks(int num_tracks)
212
+ {
213
+ mock_cd_tracks = num_tracks;
214
+ }
215
+
216
+ void init_mock_cdreader()
217
+ {
218
+ struct rc_hash_cdreader cdreader;
219
+ memset(&cdreader, 0, sizeof(cdreader));
220
+ cdreader.open_track = _mock_cd_open_track;
221
+ cdreader.close_track = _mock_file_close;
222
+ cdreader.read_sector = _mock_cd_read_sector;
223
+ cdreader.first_track_sector = _mock_cd_first_track_sector;
224
+
225
+ rc_hash_init_custom_cdreader(&cdreader);
226
+
227
+ mock_cd_tracks = 0;
228
+ }
229
+
230
+ #endif
231
+
232
+ const char* get_mock_filename(void* file_handle)
233
+ {
234
+ mock_file_data* file = (mock_file_data*)file_handle;
235
+ return file->path;
236
+ }
@@ -0,0 +1,31 @@
1
+ #ifndef RHASH_MOCK_FILEREADER_H
2
+ #define RHASH_MOCK_FILEREADER_H
3
+
4
+ #include "rc_export.h"
5
+
6
+ #include <stdint.h>
7
+ #include <stddef.h>
8
+
9
+ RC_BEGIN_C_DECLS
10
+
11
+ void init_mock_filereader();
12
+ void get_mock_filereader(struct rc_hash_filereader* reader);
13
+
14
+ #ifndef RC_HASH_NO_DISC
15
+ void init_mock_cdreader();
16
+ void mock_cd_num_tracks(int num_tracks);
17
+ #endif
18
+
19
+ void rc_hash_reset_filereader();
20
+
21
+ void mock_file(int index, const char* filename, const uint8_t* buffer, size_t buffer_size);
22
+ void mock_file_text(int index, const char* filename, const char* contents);
23
+ void mock_empty_file(int index, const char* filename, size_t mock_size);
24
+ void mock_file_size(int index, size_t mock_size);
25
+ void mock_file_first_sector(int index, int first_sector);
26
+
27
+ const char* get_mock_filename(void* file_handle);
28
+
29
+ RC_END_C_DECLS
30
+
31
+ #endif /* RHASH_MOCK_FILEREADER_H */