aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-10-13 04:38:36 +0200
committercrueter <crueter@eden-emu.dev>2026-10-13 04:38:36 +0200
commit218c6705d950635bc18f8458d738a1996fb592b6 (patch)
tree2478ed42021c8f0624209fbb4821d4ee30265f63 /src/core
parent4dc69c06f764a235bccd01afbfc765d9ddbebc9f (diff)
[hle] constexpr handler dispatch maps, introduce version gating (#4480)
This PR primarily focuses on upbringing constexpr maps for handlers. Each time an HLE object of a service is construed, it registers it's own handlers, over and over. Regardless of whetever it needs them at the moment or not. Additionally we don't require to keep track of different function pointers amongst each object. This can be done by overriding the given function instead, as opposed to having a separate hash map for every given object. In other words: Remove handlers (and handlers_tipc) map for every instance then read from a static defined per-class. - [x] Migrate all HLE functions to new `frozen::map` constexpr time finder - [ ] Measure if this approach actually makes better codegen Optional: - [x] Properly gate all functions (that have versions commented next to them) - [x] Maybe store `HandlerFnP<>` and `const char*` separately, version gating can go in a different map as well Information such as name can be used on debug builds, but doesn't particularly help on release as one can consult an external reference (or have an annotated IPC map) Signed-off-by: lizzie <lizzie@eden-emu.dev> - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Co-authored-by: Maufeat <sahyno1996@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4480 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/CMakeLists.txt70
-rw-r--r--src/core/hle/service/acc/acc.cpp1931
-rw-r--r--src/core/hle/service/acc/acc.h64
-rw-r--r--src/core/hle/service/acc/async_context.cpp11
-rw-r--r--src/core/hle/service/acc/async_context.h13
-rw-r--r--src/core/hle/service/am/am.cpp1341
-rw-r--r--src/core/hle/service/am/service/all_system_applet_proxies_service.cpp135
-rw-r--r--src/core/hle/service/am/service/all_system_applet_proxies_service.h56
-rw-r--r--src/core/hle/service/am/service/applet_common_functions.cpp98
-rw-r--r--src/core/hle/service/am/service/applet_common_functions.h33
-rw-r--r--src/core/hle/service/am/service/application_accessor.cpp64
-rw-r--r--src/core/hle/service/am/service/application_accessor.h4
-rw-r--r--src/core/hle/service/am/service/application_creator.cpp20
-rw-r--r--src/core/hle/service/am/service/application_creator.h3
-rw-r--r--src/core/hle/service/am/service/application_functions.cpp153
-rw-r--r--src/core/hle/service/am/service/application_functions.h1
-rw-r--r--src/core/hle/service/am/service/application_proxy.cpp106
-rw-r--r--src/core/hle/service/am/service/application_proxy.h49
-rw-r--r--src/core/hle/service/am/service/application_proxy_service.cpp44
-rw-r--r--src/core/hle/service/am/service/application_proxy_service.h33
-rw-r--r--src/core/hle/service/am/service/audio_controller.cpp26
-rw-r--r--src/core/hle/service/am/service/audio_controller.h4
-rw-r--r--src/core/hle/service/am/service/common_state_getter.cpp209
-rw-r--r--src/core/hle/service/am/service/common_state_getter.h1
-rw-r--r--src/core/hle/service/am/service/cradle_firmware_updater.cpp28
-rw-r--r--src/core/hle/service/am/service/cradle_firmware_updater.h4
-rw-r--r--src/core/hle/service/am/service/debug_functions.cpp43
-rw-r--r--src/core/hle/service/am/service/debug_functions.h16
-rw-r--r--src/core/hle/service/am/service/display_controller.cpp68
-rw-r--r--src/core/hle/service/am/service/display_controller.h3
-rw-r--r--src/core/hle/service/am/service/global_state_controller.cpp41
-rw-r--r--src/core/hle/service/am/service/global_state_controller.h7
-rw-r--r--src/core/hle/service/am/service/home_menu_functions.cpp42
-rw-r--r--src/core/hle/service/am/service/home_menu_functions.h1
-rw-r--r--src/core/hle/service/am/service/library_applet_accessor.cpp64
-rw-r--r--src/core/hle/service/am/service/library_applet_accessor.h22
-rw-r--r--src/core/hle/service/am/service/library_applet_creator.cpp287
-rw-r--r--src/core/hle/service/am/service/library_applet_creator.h44
-rw-r--r--src/core/hle/service/am/service/library_applet_proxy.cpp134
-rw-r--r--src/core/hle/service/am/service/library_applet_proxy.h56
-rw-r--r--src/core/hle/service/am/service/library_applet_self_accessor.cpp332
-rw-r--r--src/core/hle/service/am/service/library_applet_self_accessor.h87
-rw-r--r--src/core/hle/service/am/service/lock_accessor.cpp78
-rw-r--r--src/core/hle/service/am/service/lock_accessor.h32
-rw-r--r--src/core/hle/service/am/service/overlay_applet_proxy.cpp120
-rw-r--r--src/core/hle/service/am/service/overlay_applet_proxy.h55
-rw-r--r--src/core/hle/service/am/service/overlay_functions.cpp52
-rw-r--r--src/core/hle/service/am/service/overlay_functions.h35
-rw-r--r--src/core/hle/service/am/service/process_winding_controller.cpp28
-rw-r--r--src/core/hle/service/am/service/process_winding_controller.h1
-rw-r--r--src/core/hle/service/am/service/self_controller.cpp113
-rw-r--r--src/core/hle/service/am/service/self_controller.h1
-rw-r--r--src/core/hle/service/am/service/storage.cpp78
-rw-r--r--src/core/hle/service/am/service/storage.h4
-rw-r--r--src/core/hle/service/am/service/storage_accessor.cpp68
-rw-r--r--src/core/hle/service/am/service/storage_accessor.h38
-rw-r--r--src/core/hle/service/am/service/system_applet_proxy.cpp133
-rw-r--r--src/core/hle/service/am/service/system_applet_proxy.h58
-rw-r--r--src/core/hle/service/am/service/window_controller.cpp31
-rw-r--r--src/core/hle/service/am/service/window_controller.h4
-rw-r--r--src/core/hle/service/aoc/addon_content_manager.cpp57
-rw-r--r--src/core/hle/service/aoc/addon_content_manager.h5
-rw-r--r--src/core/hle/service/aoc/purchase_event_manager.cpp30
-rw-r--r--src/core/hle/service/aoc/purchase_event_manager.h5
-rw-r--r--src/core/hle/service/apm/apm_interface.cpp38
-rw-r--r--src/core/hle/service/apm/apm_interface.h24
-rw-r--r--src/core/hle/service/audio/audio.cpp208
-rw-r--r--src/core/hle/service/audio/audio_controller.cpp140
-rw-r--r--src/core/hle/service/audio/audio_controller.h4
-rw-r--r--src/core/hle/service/audio/audio_device.cpp52
-rw-r--r--src/core/hle/service/audio/audio_device.h1
-rw-r--r--src/core/hle/service/audio/audio_in.cpp50
-rw-r--r--src/core/hle/service/audio/audio_in.h4
-rw-r--r--src/core/hle/service/audio/audio_in_manager.cpp33
-rw-r--r--src/core/hle/service/audio/audio_in_manager.h4
-rw-r--r--src/core/hle/service/audio/audio_out.cpp40
-rw-r--r--src/core/hle/service/audio/audio_out.h5
-rw-r--r--src/core/hle/service/audio/audio_out_manager.cpp20
-rw-r--r--src/core/hle/service/audio/audio_out_manager.h1
-rw-r--r--src/core/hle/service/audio/audio_renderer.cpp51
-rw-r--r--src/core/hle/service/audio/audio_renderer.h4
-rw-r--r--src/core/hle/service/audio/audio_renderer_manager.cpp22
-rw-r--r--src/core/hle/service/audio/audio_renderer_manager.h1
-rw-r--r--src/core/hle/service/audio/final_output_recorder_manager.cpp44
-rw-r--r--src/core/hle/service/audio/final_output_recorder_manager.h10
-rw-r--r--src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp11
-rw-r--r--src/core/hle/service/audio/final_output_recorder_manager_for_applet.h11
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder.cpp35
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder.h4
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder_manager.cpp34
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder_manager.h4
-rw-r--r--src/core/hle/service/bcat/bcat_service.cpp75
-rw-r--r--src/core/hle/service/bcat/bcat_service.h1
-rw-r--r--src/core/hle/service/bcat/delivery_cache_directory_service.cpp18
-rw-r--r--src/core/hle/service/bcat/delivery_cache_directory_service.h4
-rw-r--r--src/core/hle/service/bcat/delivery_cache_file_service.cpp23
-rw-r--r--src/core/hle/service/bcat/delivery_cache_file_service.h4
-rw-r--r--src/core/hle/service/bcat/delivery_cache_progress_service.cpp19
-rw-r--r--src/core/hle/service/bcat/delivery_cache_progress_service.h4
-rw-r--r--src/core/hle/service/bcat/delivery_cache_storage_service.cpp20
-rw-r--r--src/core/hle/service/bcat/delivery_cache_storage_service.h4
-rw-r--r--src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp22
-rw-r--r--src/core/hle/service/bcat/news/newly_arrived_event_holder.h4
-rw-r--r--src/core/hle/service/bcat/news/news_data_service.cpp19
-rw-r--r--src/core/hle/service/bcat/news/news_data_service.h3
-rw-r--r--src/core/hle/service/bcat/news/news_database_service.cpp25
-rw-r--r--src/core/hle/service/bcat/news/news_database_service.h4
-rw-r--r--src/core/hle/service/bcat/news/news_service.cpp52
-rw-r--r--src/core/hle/service/bcat/news/news_service.h11
-rw-r--r--src/core/hle/service/bcat/news/overwrite_event_holder.cpp21
-rw-r--r--src/core/hle/service/bcat/news/overwrite_event_holder.h4
-rw-r--r--src/core/hle/service/bcat/news/service_creator.cpp25
-rw-r--r--src/core/hle/service/bcat/news/service_creator.h4
-rw-r--r--src/core/hle/service/bcat/service_creator.cpp26
-rw-r--r--src/core/hle/service/bcat/service_creator.h4
-rw-r--r--src/core/hle/service/bpc/bpc.cpp142
-rw-r--r--src/core/hle/service/btdrv/btdrv.cpp312
-rw-r--r--src/core/hle/service/btm/btm.cpp499
-rw-r--r--src/core/hle/service/btm/btm_debug.cpp40
-rw-r--r--src/core/hle/service/btm/btm_debug.h21
-rw-r--r--src/core/hle/service/btm/btm_system.cpp34
-rw-r--r--src/core/hle/service/btm/btm_system.h25
-rw-r--r--src/core/hle/service/btm/btm_system_core.cpp135
-rw-r--r--src/core/hle/service/btm/btm_system_core.h62
-rw-r--r--src/core/hle/service/btm/btm_user.cpp33
-rw-r--r--src/core/hle/service/btm/btm_user.h25
-rw-r--r--src/core/hle/service/btm/btm_user_core.cpp106
-rw-r--r--src/core/hle/service/btm/btm_user_core.h47
-rw-r--r--src/core/hle/service/caps/caps.cpp218
-rw-r--r--src/core/hle/service/caps/caps_a.cpp211
-rw-r--r--src/core/hle/service/caps/caps_a.h63
-rw-r--r--src/core/hle/service/caps/caps_c.cpp50
-rw-r--r--src/core/hle/service/caps/caps_c.h12
-rw-r--r--src/core/hle/service/caps/caps_sc.cpp29
-rw-r--r--src/core/hle/service/caps/caps_sc.h29
-rw-r--r--src/core/hle/service/caps/caps_ss.cpp26
-rw-r--r--src/core/hle/service/caps/caps_ss.h4
-rw-r--r--src/core/hle/service/caps/caps_su.cpp22
-rw-r--r--src/core/hle/service/caps/caps_su.h5
-rw-r--r--src/core/hle/service/caps/caps_u.cpp40
-rw-r--r--src/core/hle/service/caps/caps_u.h4
-rw-r--r--src/core/hle/service/erpt/erpt.cpp68
-rw-r--r--src/core/hle/service/es/es.cpp342
-rw-r--r--src/core/hle/service/eupld/eupld.cpp51
-rw-r--r--src/core/hle/service/fatal/fatal.cpp31
-rw-r--r--src/core/hle/service/fatal/fatal_p.cpp19
-rw-r--r--src/core/hle/service/fatal/fatal_p.h16
-rw-r--r--src/core/hle/service/fatal/fatal_u.cpp20
-rw-r--r--src/core/hle/service/fatal/fatal_u.h16
-rw-r--r--src/core/hle/service/fgm/fgm.cpp58
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_directory.cpp16
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_directory.h5
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_file.cpp12
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_file.h16
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp43
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_filesystem.h1
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp8
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h10
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp7
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h9
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_storage.cpp9
-rw-r--r--src/core/hle/service/filesystem/fsp/fs_i_storage.h18
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_ldr.cpp12
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_ldr.h12
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_pr.cpp13
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_pr.h13
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_srv.cpp271
-rw-r--r--src/core/hle/service/filesystem/fsp/fsp_srv.h1
-rw-r--r--src/core/hle/service/friend/friend.cpp378
-rw-r--r--src/core/hle/service/friend/friend_interface.cpp20
-rw-r--r--src/core/hle/service/friend/friend_interface.h16
-rw-r--r--src/core/hle/service/glue/arp.cpp44
-rw-r--r--src/core/hle/service/glue/arp.h26
-rw-r--r--src/core/hle/service/glue/bgtc.cpp43
-rw-r--r--src/core/hle/service/glue/bgtc.h42
-rw-r--r--src/core/hle/service/glue/ectx.cpp38
-rw-r--r--src/core/hle/service/glue/ectx.h26
-rw-r--r--src/core/hle/service/glue/notif.cpp98
-rw-r--r--src/core/hle/service/glue/notif.h5
-rw-r--r--src/core/hle/service/glue/time/static.cpp59
-rw-r--r--src/core/hle/service/glue/time/static.h6
-rw-r--r--src/core/hle/service/glue/time/time_zone.cpp40
-rw-r--r--src/core/hle/service/glue/time/time_zone.h1
-rw-r--r--src/core/hle/service/gpio/gpio.cpp16
-rw-r--r--src/core/hle/service/grc/grc.cpp41
-rw-r--r--src/core/hle/service/hid/active_vibration_device_list.cpp14
-rw-r--r--src/core/hle/service/hid/active_vibration_device_list.h5
-rw-r--r--src/core/hle/service/hid/applet_resource.cpp11
-rw-r--r--src/core/hle/service/hid/applet_resource.h4
-rw-r--r--src/core/hle/service/hid/hid.cpp365
-rw-r--r--src/core/hle/service/hid/hid_debug_server.cpp296
-rw-r--r--src/core/hle/service/hid/hid_debug_server.h29
-rw-r--r--src/core/hle/service/hid/hid_server.cpp396
-rw-r--r--src/core/hle/service/hid/hid_server.h2
-rw-r--r--src/core/hle/service/hid/hid_system_server.cpp246
-rw-r--r--src/core/hle/service/hid/hid_system_server.h249
-rw-r--r--src/core/hle/service/hid/hidbus.cpp42
-rw-r--r--src/core/hle/service/hid/hidbus.h5
-rw-r--r--src/core/hle/service/hid/irs.cpp58
-rw-r--r--src/core/hle/service/hid/irs.h15
-rw-r--r--src/core/hle/service/hid/xcd.cpp30
-rw-r--r--src/core/hle/service/hid/xcd.h30
-rw-r--r--src/core/hle/service/i2c/i2c.cpp54
-rw-r--r--src/core/hle/service/jit/jit.cpp37
-rw-r--r--src/core/hle/service/lbl/lbl.cpp73
-rw-r--r--src/core/hle/service/ldn/ldn.cpp138
-rw-r--r--src/core/hle/service/ldn/monitor_service.cpp31
-rw-r--r--src/core/hle/service/ldn/monitor_service.h4
-rw-r--r--src/core/hle/service/ldn/sf_monitor_service.cpp21
-rw-r--r--src/core/hle/service/ldn/sf_monitor_service.h4
-rw-r--r--src/core/hle/service/ldn/sf_service.cpp37
-rw-r--r--src/core/hle/service/ldn/sf_service.h21
-rw-r--r--src/core/hle/service/ldn/sf_service_monitor.cpp41
-rw-r--r--src/core/hle/service/ldn/sf_service_monitor.h7
-rw-r--r--src/core/hle/service/ldn/system_local_communication_service.cpp75
-rw-r--r--src/core/hle/service/ldn/system_local_communication_service.h4
-rw-r--r--src/core/hle/service/ldn/user_local_communication_service.cpp72
-rw-r--r--src/core/hle/service/ldn/user_local_communication_service.h3
-rw-r--r--src/core/hle/service/ldr/ldr.cpp53
-rw-r--r--src/core/hle/service/lm/lm.cpp55
-rw-r--r--src/core/hle/service/mig/mig.cpp86
-rw-r--r--src/core/hle/service/mii/mii.cpp136
-rw-r--r--src/core/hle/service/mii/mii.h4
-rw-r--r--src/core/hle/service/mm/mm_u.cpp29
-rw-r--r--src/core/hle/service/mnpp/mnpp.cpp64
-rw-r--r--src/core/hle/service/ncm/ncm.cpp228
-rw-r--r--src/core/hle/service/nfc/nfc.cpp246
-rw-r--r--src/core/hle/service/nfp/nfp.cpp276
-rw-r--r--src/core/hle/service/ngc/ngc.cpp160
-rw-r--r--src/core/hle/service/nifm/nifm.cpp227
-rw-r--r--src/core/hle/service/nifm/nifm.h3
-rw-r--r--src/core/hle/service/nim/nim.cpp685
-rw-r--r--src/core/hle/service/npns/npns.cpp200
-rw-r--r--src/core/hle/service/ns/account_proxy_interface.cpp10
-rw-r--r--src/core/hle/service/ns/account_proxy_interface.h10
-rw-r--r--src/core/hle/service/ns/application_manager_interface.cpp904
-rw-r--r--src/core/hle/service/ns/application_manager_interface.h1
-rw-r--r--src/core/hle/service/ns/application_version_interface.cpp22
-rw-r--r--src/core/hle/service/ns/application_version_interface.h22
-rw-r--r--src/core/hle/service/ns/async_result.cpp18
-rw-r--r--src/core/hle/service/ns/async_result.h1
-rw-r--r--src/core/hle/service/ns/content_management_interface.cpp16
-rw-r--r--src/core/hle/service/ns/content_management_interface.h16
-rw-r--r--src/core/hle/service/ns/develop_interface.cpp28
-rw-r--r--src/core/hle/service/ns/develop_interface.h28
-rw-r--r--src/core/hle/service/ns/document_interface.cpp12
-rw-r--r--src/core/hle/service/ns/document_interface.h12
-rw-r--r--src/core/hle/service/ns/download_task_interface.cpp18
-rw-r--r--src/core/hle/service/ns/download_task_interface.h18
-rw-r--r--src/core/hle/service/ns/dynamic_rights_interface.cpp70
-rw-r--r--src/core/hle/service/ns/dynamic_rights_interface.h2
-rw-r--r--src/core/hle/service/ns/ecommerce_interface.cpp16
-rw-r--r--src/core/hle/service/ns/ecommerce_interface.h16
-rw-r--r--src/core/hle/service/ns/factory_reset_interface.cpp29
-rw-r--r--src/core/hle/service/ns/factory_reset_interface.h4
-rw-r--r--src/core/hle/service/ns/ns.cpp63
-rw-r--r--src/core/hle/service/ns/platform_service_manager.cpp44
-rw-r--r--src/core/hle/service/ns/platform_service_manager.h12
-rw-r--r--src/core/hle/service/ns/query_service.cpp64
-rw-r--r--src/core/hle/service/ns/query_service.h1
-rw-r--r--src/core/hle/service/ns/read_only_application_control_data_interface.cpp48
-rw-r--r--src/core/hle/service/ns/read_only_application_control_data_interface.h2
-rw-r--r--src/core/hle/service/ns/read_only_application_record_interface.cpp19
-rw-r--r--src/core/hle/service/ns/read_only_application_record_interface.h4
-rw-r--r--src/core/hle/service/ns/service_getter_interface.cpp37
-rw-r--r--src/core/hle/service/ns/service_getter_interface.h5
-rw-r--r--src/core/hle/service/ns/system_update_control.cpp32
-rw-r--r--src/core/hle/service/ns/system_update_control.h32
-rw-r--r--src/core/hle/service/ns/system_update_interface.cpp49
-rw-r--r--src/core/hle/service/ns/system_update_interface.h5
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.cpp74
-rw-r--r--src/core/hle/service/nvdrv/nvdrv_interface.cpp18
-rw-r--r--src/core/hle/service/nvdrv/nvdrv_interface.h24
-rw-r--r--src/core/hle/service/nvdrv/nvmemp.cpp5
-rw-r--r--src/core/hle/service/nvdrv/nvmemp.h11
-rw-r--r--src/core/hle/service/nvnflinger/hos_binder_driver.cpp20
-rw-r--r--src/core/hle/service/nvnflinger/hos_binder_driver.h1
-rw-r--r--src/core/hle/service/olsc/daemon_controller.cpp36
-rw-r--r--src/core/hle/service/olsc/daemon_controller.h2
-rw-r--r--src/core/hle/service/olsc/native_handle_holder.cpp14
-rw-r--r--src/core/hle/service/olsc/native_handle_holder.h1
-rw-r--r--src/core/hle/service/olsc/olsc.cpp173
-rw-r--r--src/core/hle/service/olsc/olsc_service_for_application.cpp59
-rw-r--r--src/core/hle/service/olsc/olsc_service_for_application.h2
-rw-r--r--src/core/hle/service/olsc/olsc_service_for_system_service.cpp144
-rw-r--r--src/core/hle/service/olsc/olsc_service_for_system_service.h53
-rw-r--r--src/core/hle/service/olsc/remote_storage_controller.cpp72
-rw-r--r--src/core/hle/service/olsc/remote_storage_controller.h2
-rw-r--r--src/core/hle/service/olsc/transfer_task_list_controller.cpp74
-rw-r--r--src/core/hle/service/olsc/transfer_task_list_controller.h2
-rw-r--r--src/core/hle/service/omm/operation_mode_manager.cpp38
-rw-r--r--src/core/hle/service/omm/operation_mode_manager.h38
-rw-r--r--src/core/hle/service/omm/policy_manager_system.cpp15
-rw-r--r--src/core/hle/service/omm/policy_manager_system.h15
-rw-r--r--src/core/hle/service/omm/power_state_interface.cpp21
-rw-r--r--src/core/hle/service/omm/power_state_interface.h21
-rw-r--r--src/core/hle/service/pcie/pcie.cpp90
-rw-r--r--src/core/hle/service/pctl/parental_control_service.cpp498
-rw-r--r--src/core/hle/service/pctl/parental_control_service.h99
-rw-r--r--src/core/hle/service/pctl/parental_control_service_factory.cpp44
-rw-r--r--src/core/hle/service/pctl/parental_control_service_factory.h31
-rw-r--r--src/core/hle/service/pctl/pctl.cpp636
-rw-r--r--src/core/hle/service/pctl/pctl_results.h15
-rw-r--r--src/core/hle/service/pctl/pctl_types.h73
-rw-r--r--src/core/hle/service/pcv/pcv.cpp178
-rw-r--r--src/core/hle/service/pm/pm.cpp100
-rw-r--r--src/core/hle/service/prepo/prepo.cpp93
-rw-r--r--src/core/hle/service/psc/ovln/receiver.cpp118
-rw-r--r--src/core/hle/service/psc/ovln/receiver.h46
-rw-r--r--src/core/hle/service/psc/ovln/receiver_service.cpp123
-rw-r--r--src/core/hle/service/psc/ovln/receiver_service.h5
-rw-r--r--src/core/hle/service/psc/ovln/sender.cpp32
-rw-r--r--src/core/hle/service/psc/ovln/sender.h21
-rw-r--r--src/core/hle/service/psc/ovln/sender_service.cpp43
-rw-r--r--src/core/hle/service/psc/ovln/sender_service.h8
-rw-r--r--src/core/hle/service/psc/pm_control.cpp28
-rw-r--r--src/core/hle/service/psc/pm_control.h16
-rw-r--r--src/core/hle/service/psc/pm_module.cpp24
-rw-r--r--src/core/hle/service/psc/pm_module.h16
-rw-r--r--src/core/hle/service/psc/pm_service.cpp28
-rw-r--r--src/core/hle/service/psc/pm_service.h22
-rw-r--r--src/core/hle/service/psc/psc.cpp181
-rw-r--r--src/core/hle/service/psc/time/alarms.cpp24
-rw-r--r--src/core/hle/service/psc/time/alarms.h21
-rw-r--r--src/core/hle/service/psc/time/manager.h31
-rw-r--r--src/core/hle/service/psc/time/power_state_service.cpp19
-rw-r--r--src/core/hle/service/psc/time/power_state_service.h1
-rw-r--r--src/core/hle/service/psc/time/service_manager.cpp48
-rw-r--r--src/core/hle/service/psc/time/service_manager.h2
-rw-r--r--src/core/hle/service/psc/time/static.cpp50
-rw-r--r--src/core/hle/service/psc/time/static.h2
-rw-r--r--src/core/hle/service/psc/time/steady_clock.cpp28
-rw-r--r--src/core/hle/service/psc/time/steady_clock.h2
-rw-r--r--src/core/hle/service/psc/time/system_clock.cpp24
-rw-r--r--src/core/hle/service/psc/time/system_clock.h1
-rw-r--r--src/core/hle/service/psc/time/time_zone_service.cpp42
-rw-r--r--src/core/hle/service/psc/time/time_zone_service.h1
-rw-r--r--src/core/hle/service/ptm/psm.cpp53
-rw-r--r--src/core/hle/service/ptm/psm.h25
-rw-r--r--src/core/hle/service/ptm/ptm.cpp32
-rw-r--r--src/core/hle/service/ptm/ts.cpp31
-rw-r--r--src/core/hle/service/ptm/ts.h14
-rw-r--r--src/core/hle/service/ro/ro.cpp371
-rw-r--r--src/core/hle/service/ro/ro_nro_utils.cpp185
-rw-r--r--src/core/hle/service/ro/ro_nro_utils.h26
-rw-r--r--src/core/hle/service/ro/ro_results.h29
-rw-r--r--src/core/hle/service/ro/ro_types.h142
-rw-r--r--src/core/hle/service/service.cpp69
-rw-r--r--src/core/hle/service/service.h133
-rw-r--r--src/core/hle/service/set/factory_settings_server.cpp52
-rw-r--r--src/core/hle/service/set/factory_settings_server.h52
-rw-r--r--src/core/hle/service/set/firmware_debug_settings_server.cpp19
-rw-r--r--src/core/hle/service/set/firmware_debug_settings_server.h20
-rw-r--r--src/core/hle/service/set/settings_server.cpp38
-rw-r--r--src/core/hle/service/set/settings_server.h25
-rw-r--r--src/core/hle/service/set/system_settings_server.cpp465
-rw-r--r--src/core/hle/service/set/system_settings_server.h2
-rw-r--r--src/core/hle/service/sm/sm.cpp205
-rw-r--r--src/core/hle/service/sm/sm.h24
-rw-r--r--src/core/hle/service/sm/sm_controller.cpp128
-rw-r--r--src/core/hle/service/sm/sm_controller.h27
-rw-r--r--src/core/hle/service/sockets/bsd.cpp81
-rw-r--r--src/core/hle/service/sockets/bsd.h81
-rw-r--r--src/core/hle/service/sockets/nsd.cpp32
-rw-r--r--src/core/hle/service/sockets/nsd.h32
-rw-r--r--src/core/hle/service/sockets/sfdnsres.cpp27
-rw-r--r--src/core/hle/service/sockets/sfdnsres.h31
-rw-r--r--src/core/hle/service/sockets/sockets.cpp62
-rw-r--r--src/core/hle/service/spl/spl.cpp171
-rw-r--r--src/core/hle/service/spl/spl.h141
-rw-r--r--src/core/hle/service/spl/spl_module.cpp15
-rw-r--r--src/core/hle/service/ssl/ssl.cpp369
-rw-r--r--src/core/hle/service/tma/tma.cpp12
-rw-r--r--src/core/hle/service/usb/usb.cpp310
-rw-r--r--src/core/hle/service/vi/application_display_service.cpp56
-rw-r--r--src/core/hle/service/vi/application_display_service.h2
-rw-r--r--src/core/hle/service/vi/application_root_service.cpp16
-rw-r--r--src/core/hle/service/vi/application_root_service.h4
-rw-r--r--src/core/hle/service/vi/manager_display_service.cpp176
-rw-r--r--src/core/hle/service/vi/manager_display_service.h3
-rw-r--r--src/core/hle/service/vi/manager_root_service.cpp24
-rw-r--r--src/core/hle/service/vi/manager_root_service.h4
-rw-r--r--src/core/hle/service/vi/shared_buffer_manager.h4
-rw-r--r--src/core/hle/service/vi/system_display_service.cpp112
-rw-r--r--src/core/hle/service/vi/system_display_service.h1
-rw-r--r--src/core/hle/service/vi/system_root_service.cpp20
-rw-r--r--src/core/hle/service/vi/system_root_service.h4
-rw-r--r--src/core/hle/service/wlan/wlan.cpp368
388 files changed, 12840 insertions, 14060 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 31f9931d3a..f1d4bdae42 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -444,28 +444,18 @@ add_library(core STATIC
hle/service/am/process_creation.h
hle/service/am/process_holder.cpp
hle/service/am/process_holder.h
- hle/service/am/service/all_system_applet_proxies_service.cpp
- hle/service/am/service/all_system_applet_proxies_service.h
- hle/service/am/service/applet_common_functions.cpp
- hle/service/am/service/applet_common_functions.h
hle/service/am/service/application_accessor.cpp
hle/service/am/service/application_accessor.h
hle/service/am/service/application_creator.cpp
hle/service/am/service/application_creator.h
hle/service/am/service/application_functions.cpp
hle/service/am/service/application_functions.h
- hle/service/am/service/application_proxy.cpp
- hle/service/am/service/application_proxy.h
- hle/service/am/service/application_proxy_service.cpp
- hle/service/am/service/application_proxy_service.h
hle/service/am/service/audio_controller.cpp
hle/service/am/service/audio_controller.h
hle/service/am/service/common_state_getter.cpp
hle/service/am/service/common_state_getter.h
hle/service/am/service/cradle_firmware_updater.cpp
hle/service/am/service/cradle_firmware_updater.h
- hle/service/am/service/debug_functions.cpp
- hle/service/am/service/debug_functions.h
hle/service/am/service/display_controller.cpp
hle/service/am/service/display_controller.h
hle/service/am/service/global_state_controller.cpp
@@ -474,28 +464,14 @@ add_library(core STATIC
hle/service/am/service/home_menu_functions.h
hle/service/am/service/library_applet_accessor.cpp
hle/service/am/service/library_applet_accessor.h
- hle/service/am/service/library_applet_creator.cpp
- hle/service/am/service/library_applet_creator.h
- hle/service/am/service/library_applet_proxy.cpp
- hle/service/am/service/library_applet_proxy.h
- hle/service/am/service/library_applet_self_accessor.cpp
- hle/service/am/service/library_applet_self_accessor.h
- hle/service/am/service/lock_accessor.cpp
- hle/service/am/service/lock_accessor.h
hle/service/am/service/overlay_functions.cpp
hle/service/am/service/overlay_functions.h
- hle/service/am/service/overlay_applet_proxy.cpp
- hle/service/am/service/overlay_applet_proxy.h
hle/service/am/service/process_winding_controller.cpp
hle/service/am/service/process_winding_controller.h
hle/service/am/service/self_controller.cpp
hle/service/am/service/self_controller.h
hle/service/am/service/storage.cpp
hle/service/am/service/storage.h
- hle/service/am/service/storage_accessor.cpp
- hle/service/am/service/storage_accessor.h
- hle/service/am/service/system_applet_proxy.cpp
- hle/service/am/service/system_applet_proxy.h
hle/service/am/service/window_controller.cpp
hle/service/am/service/window_controller.h
hle/service/am/window_system.cpp
@@ -580,20 +556,8 @@ add_library(core STATIC
hle/service/btdrv/btdrv.h
hle/service/btm/btm.cpp
hle/service/btm/btm.h
- hle/service/btm/btm_debug.cpp
- hle/service/btm/btm_debug.h
- hle/service/btm/btm_system.cpp
- hle/service/btm/btm_system.h
- hle/service/btm/btm_system_core.cpp
- hle/service/btm/btm_system_core.h
- hle/service/btm/btm_user.cpp
- hle/service/btm/btm_user.h
- hle/service/btm/btm_user_core.cpp
- hle/service/btm/btm_user_core.h
hle/service/caps/caps.cpp
hle/service/caps/caps.h
- hle/service/caps/caps_a.cpp
- hle/service/caps/caps_a.h
hle/service/caps/caps_c.cpp
hle/service/caps/caps_c.h
hle/service/caps/caps_manager.cpp
@@ -618,10 +582,6 @@ add_library(core STATIC
hle/service/eupld/eupld.h
hle/service/fatal/fatal.cpp
hle/service/fatal/fatal.h
- hle/service/fatal/fatal_p.cpp
- hle/service/fatal/fatal_p.h
- hle/service/fatal/fatal_u.cpp
- hle/service/fatal/fatal_u.h
hle/service/fgm/fgm.cpp
hle/service/fgm/fgm.h
hle/service/filesystem/filesystem.cpp
@@ -653,8 +613,6 @@ add_library(core STATIC
hle/service/filesystem/save_data_controller.h
hle/service/friend/friend.cpp
hle/service/friend/friend.h
- hle/service/friend/friend_interface.cpp
- hle/service/friend/friend_interface.h
hle/service/glue/arp.cpp
hle/service/glue/arp.h
hle/service/glue/bgtc.cpp
@@ -723,8 +681,6 @@ add_library(core STATIC
hle/service/ldn/monitor_service.h
hle/service/ldn/sf_monitor_service.cpp
hle/service/ldn/sf_monitor_service.h
- hle/service/ldn/sf_service.cpp
- hle/service/ldn/sf_service.h
hle/service/ldn/sf_service_monitor.cpp
hle/service/ldn/sf_service_monitor.h
hle/service/ldn/system_local_communication_service.cpp
@@ -913,8 +869,6 @@ add_library(core STATIC
hle/service/olsc/native_handle_holder.h
hle/service/olsc/olsc_service_for_application.cpp
hle/service/olsc/olsc_service_for_application.h
- hle/service/olsc/olsc_service_for_system_service.cpp
- hle/service/olsc/olsc_service_for_system_service.h
hle/service/olsc/olsc.cpp
hle/service/olsc/olsc.h
hle/service/olsc/remote_storage_controller.cpp
@@ -944,14 +898,8 @@ add_library(core STATIC
hle/service/os/process.h
hle/service/pcie/pcie.cpp
hle/service/pcie/pcie.h
- hle/service/pctl/parental_control_service_factory.cpp
- hle/service/pctl/parental_control_service_factory.h
- hle/service/pctl/parental_control_service.cpp
- hle/service/pctl/parental_control_service.h
hle/service/pctl/pctl.cpp
hle/service/pctl/pctl.h
- hle/service/pctl/pctl_results.h
- hle/service/pctl/pctl_types.h
hle/service/pcv/pcv.cpp
hle/service/pcv/pcv.h
hle/service/pm/pm.cpp
@@ -961,18 +909,8 @@ add_library(core STATIC
hle/service/psc/ovln/ovln_types.h
hle/service/psc/ovln/receiver_service.cpp
hle/service/psc/ovln/receiver_service.h
- hle/service/psc/ovln/receiver.cpp
- hle/service/psc/ovln/receiver.h
hle/service/psc/ovln/sender_service.cpp
hle/service/psc/ovln/sender_service.h
- hle/service/psc/ovln/sender.cpp
- hle/service/psc/ovln/sender.h
- hle/service/psc/pm_control.cpp
- hle/service/psc/pm_control.h
- hle/service/psc/pm_module.cpp
- hle/service/psc/pm_module.h
- hle/service/psc/pm_service.cpp
- hle/service/psc/pm_service.h
hle/service/psc/psc.cpp
hle/service/psc/psc.h
hle/service/psc/time/alarms.cpp
@@ -1023,10 +961,6 @@ add_library(core STATIC
hle/service/ptm/ts.h
hle/service/ro/ro.cpp
hle/service/ro/ro.h
- hle/service/ro/ro_nro_utils.cpp
- hle/service/ro/ro_nro_utils.h
- hle/service/ro/ro_results.h
- hle/service/ro/ro_types.h
hle/service/server_manager.cpp
hle/service/server_manager.h
hle/service/service.cpp
@@ -1055,8 +989,6 @@ add_library(core STATIC
hle/service/set/system_settings_server.h
hle/service/sm/sm.cpp
hle/service/sm/sm.h
- hle/service/sm/sm_controller.cpp
- hle/service/sm/sm_controller.h
hle/service/sockets/bsd.cpp
hle/service/sockets/bsd.h
hle/service/sockets/nsd.cpp
@@ -1222,7 +1154,7 @@ target_link_libraries(core PRIVATE
RenderDoc::API
ZLIB::ZLIB)
-target_link_libraries(core PUBLIC httplib::httplib zstd::zstd)
+target_link_libraries(core PUBLIC httplib::httplib zstd::zstd frozen::frozen-headers)
if (ENABLE_WEB_SERVICE)
target_compile_definitions(core PUBLIC ENABLE_WEB_SERVICE)
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp
index d68b6bde0d..9b29a7773c 100644
--- a/src/core/hle/service/acc/acc.cpp
+++ b/src/core/hle/service/acc/acc.cpp
@@ -75,41 +75,6 @@ class IManagerForSystemService final : public ServiceFramework<IManagerForSystem
public:
explicit IManagerForSystemService(Core::System& system_, Common::UUID uuid)
: ServiceFramework{system_, "IManagerForSystemService"}, account_id{uuid} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IManagerForSystemService::CheckAvailability>, "CheckAvailability"},
- {1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"},
- {2, nullptr, "EnsureIdTokenCacheAsync"},
- {3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated"}, // 19.0.0+
- {4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache"}, // 19.0.0+
- {100, nullptr, "SetSystemProgramIdentification"},
- {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+
- {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+
- {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+
- {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0
- {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+
- {120, nullptr, "GetNintendoAccountId"},
- {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+
- {130, nullptr, "GetNintendoAccountUserResourceCache"},
- {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
- {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
- {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+
- {134, nullptr, "RefreshNintendoAccountVerificationUrlCache"}, // 9.0.0+
- {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+
- {136, nullptr, "GetNintendoAccountUserResourceCache"}, // 19.0.0+
- {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+
- {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
- {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
- {143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx"}, // 15.0.0+
- {150, nullptr, "CreateAuthorizationRequest"},
- {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
- {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
- {170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+
- {180, nullptr, "GetRequestForNintendoAccountReauthentication"} // 18.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
private:
@@ -143,6 +108,40 @@ private:
R_SUCCEED();
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IManagerForSystemService::CheckAvailability>, "CheckAvailability"},
+ FunctionInfo{1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"},
+ FunctionInfo{2, nullptr, "EnsureIdTokenCacheAsync"},
+ FunctionInfo{3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated", MakeVersionGate({19,0,0})},
+ FunctionInfo{4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache", MakeVersionGate({19,0,0})},
+ FunctionInfo{100, nullptr, "SetSystemProgramIdentification"},
+ FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})},
+ FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
+ FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
+ FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})},
+ FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})},
+ FunctionInfo{120, nullptr, "GetNintendoAccountId"},
+ FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})},
+ FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"},
+ FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
+ FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
+ FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})},
+ FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})},
+ FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})},
+ FunctionInfo{136, nullptr, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})},
+ FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})},
+ FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})},
+ FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})},
+ FunctionInfo{143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx", MakeVersionGate({15,0,0})},
+ FunctionInfo{150, nullptr, "CreateAuthorizationRequest"},
+ FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
+ FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
+ FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})},
+ FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
Common::UUID account_id;
};
@@ -151,25 +150,25 @@ class IFloatingRegistrationRequest final : public ServiceFramework<IFloatingRegi
public:
explicit IFloatingRegistrationRequest(Core::System& system_, Common::UUID)
: ServiceFramework{system_, "IFloatingRegistrationRequest"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetSessionId"},
- {12, nullptr, "GetAccountId"},
- {13, nullptr, "GetLinkedNintendoAccountId"},
- {14, nullptr, "GetNickname"},
- {15, nullptr, "GetProfileImage"},
- {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+
- {21, nullptr, "LoadIdTokenCache"},
- {100, nullptr, "RegisterUser"}, // [1.0.0-3.0.2] RegisterAsync
- {101, nullptr, "RegisterUserWithUid"}, // [1.0.0-3.0.2] RegisterWithUidAsync
- {102, nullptr, "RegisterNetworkServiceAccountAsync"}, // 4.0.0+
- {103, nullptr, "RegisterNetworkServiceAccountWithUidAsync"}, // 4.0.0+
- {110, nullptr, "SetSystemProgramIdentification"},
- {111, nullptr, "EnsureIdTokenCacheAsync"},
- };
- // clang-format on
+ }
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetSessionId"},
+ FunctionInfo{12, nullptr, "GetAccountId"},
+ FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"},
+ FunctionInfo{14, nullptr, "GetNickname"},
+ FunctionInfo{15, nullptr, "GetProfileImage"},
+ FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})},
+ FunctionInfo{21, nullptr, "LoadIdTokenCache"},
+ FunctionInfo{100, nullptr, "RegisterUser"}, // [1.0.0-3.0.2] RegisterAsync
+ FunctionInfo{101, nullptr, "RegisterUserWithUid"}, // [1.0.0-3.0.2] RegisterWithUidAsync
+ FunctionInfo{102, nullptr, "RegisterNetworkServiceAccountAsync", MakeVersionGate({4,0,0})},
+ FunctionInfo{103, nullptr, "RegisterNetworkServiceAccountWithUidAsync", MakeVersionGate({4,0,0})},
+ FunctionInfo{110, nullptr, "SetSystemProgramIdentification"},
+ FunctionInfo{111, nullptr, "EnsureIdTokenCacheAsync"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
@@ -177,62 +176,6 @@ class IAdministrator final : public ServiceFramework<IAdministrator> {
public:
explicit IAdministrator(Core::System& system_, Common::UUID)
: ServiceFramework{system_, "IAdministrator"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CheckAvailability"},
- {1, nullptr, "GetAccountId"},
- {2, nullptr, "EnsureIdTokenCacheAsync"},
- {3, nullptr, "LoadIdTokenCache"},
- {100, nullptr, "SetSystemProgramIdentification"},
- {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+
- {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+
- {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+
- {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0
- {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+
- {120, nullptr, "GetNintendoAccountId"},
- {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+
- {130, nullptr, "GetNintendoAccountUserResourceCache"},
- {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
- {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
- {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+
- {134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync"}, // 9.0.0+
- {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+
- {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+
- {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
- {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
- {143, nullptr, "GetNetworkServiceLicenseCacheEx"},
- {150, nullptr, "CreateAuthorizationRequest"},
- {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
- {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
- {170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+
- {180, nullptr, "GetRequestForNintendoAccountReauthentication"}, // 18.0.0+
- {200, nullptr, "IsRegistered"},
- {201, nullptr, "RegisterAsync"},
- {202, nullptr, "UnregisterAsync"},
- {203, nullptr, "DeleteRegistrationInfoLocally"},
- {220, nullptr, "SynchronizeProfileAsync"},
- {221, nullptr, "UploadProfileAsync"},
- {222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"},
- {250, &IAdministrator::IsLinkedWithNintendoAccount, "IsLinkedWithNintendoAccount"},
- {251, nullptr, "CreateProcedureToLinkWithNintendoAccount"},
- {252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"},
- {255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"},
- {256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"},
- {260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+
- {261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+
- {280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"},
- {290, nullptr, "GetRequestForNintendoAccountUserResourceView"}, // 8.0.0+
- {300, nullptr, "TryRecoverNintendoAccountUserStateAsync"}, // 6.0.0+
- {400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay"}, // 6.1.0+
- {401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync"}, // 6.1.0+
- {900, nullptr, "GetAuthenticationInfoForWin"}, // 9.0.0+
- {901, nullptr, "ImportAsyncForWin"}, // 9.0.0+
- {997, nullptr, "DebugUnlinkNintendoAccountAsync"},
- {998, nullptr, "DebugSetAvailabilityErrorDetail"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
private:
@@ -241,42 +184,97 @@ private:
rb.Push(ResultSuccess);
rb.Push(false);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CheckAvailability"},
+ FunctionInfo{1, nullptr, "GetAccountId"},
+ FunctionInfo{2, nullptr, "EnsureIdTokenCacheAsync"},
+ FunctionInfo{3, nullptr, "LoadIdTokenCache"},
+ FunctionInfo{100, nullptr, "SetSystemProgramIdentification"},
+ FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})},
+ FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
+ FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})},
+ FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})},
+ FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})},
+ FunctionInfo{120, nullptr, "GetNintendoAccountId"},
+ FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})},
+ FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"},
+ FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"},
+ FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"},
+ FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})},
+ FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync", MakeVersionGate({9,0,0})},
+ FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})},
+ FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})},
+ FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})},
+ FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})},
+ FunctionInfo{143, nullptr, "GetNetworkServiceLicenseCacheEx"},
+ FunctionInfo{150, nullptr, "CreateAuthorizationRequest"},
+ FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
+ FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
+ FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})},
+ FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})},
+ FunctionInfo{200, nullptr, "IsRegistered"},
+ FunctionInfo{201, nullptr, "RegisterAsync"},
+ FunctionInfo{202, nullptr, "UnregisterAsync"},
+ FunctionInfo{203, nullptr, "DeleteRegistrationInfoLocally"},
+ FunctionInfo{220, nullptr, "SynchronizeProfileAsync"},
+ FunctionInfo{221, nullptr, "UploadProfileAsync"},
+ FunctionInfo{222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"},
+ FunctionInfo{250, &IAdministrator::IsLinkedWithNintendoAccount, "IsLinkedWithNintendoAccount"},
+ FunctionInfo{251, nullptr, "CreateProcedureToLinkWithNintendoAccount"},
+ FunctionInfo{252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"},
+ FunctionInfo{255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"},
+ FunctionInfo{256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"},
+ FunctionInfo{260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})},
+ FunctionInfo{261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})},
+ FunctionInfo{280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"},
+ FunctionInfo{290, nullptr, "GetRequestForNintendoAccountUserResourceView", MakeVersionGate({8,0,0})},
+ FunctionInfo{300, nullptr, "TryRecoverNintendoAccountUserStateAsync", MakeVersionGate({6,0,0})},
+ FunctionInfo{400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay", MakeVersionGate({6,1,0})},
+ FunctionInfo{401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync", MakeVersionGate({6,1,0})},
+ FunctionInfo{900, nullptr, "GetAuthenticationInfoForWin", MakeVersionGate({9,0,0})},
+ FunctionInfo{901, nullptr, "ImportAsyncForWin", MakeVersionGate({9,0,0})},
+ FunctionInfo{997, nullptr, "DebugUnlinkNintendoAccountAsync"},
+ FunctionInfo{998, nullptr, "DebugSetAvailabilityErrorDetail"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
};
class IAuthorizationRequest final : public ServiceFramework<IAuthorizationRequest> {
public:
explicit IAuthorizationRequest(Core::System& system_, Common::UUID)
: ServiceFramework{system_, "IAuthorizationRequest"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetSessionId"},
- {10, nullptr, "InvokeWithoutInteractionAsync"},
- {19, nullptr, "IsAuthorized"},
- {20, nullptr, "GetAuthorizationCode"},
- {21, nullptr, "GetIdToken"},
- {22, nullptr, "GetState"},
- };
- // clang-format on
+ }
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetSessionId"},
+ FunctionInfo{10, nullptr, "InvokeWithoutInteractionAsync"},
+ FunctionInfo{19, nullptr, "IsAuthorized"},
+ FunctionInfo{20, nullptr, "GetAuthorizationCode"},
+ FunctionInfo{21, nullptr, "GetIdToken"},
+ FunctionInfo{22, nullptr, "GetState"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IOAuthProcedure final : public ServiceFramework<IOAuthProcedure> {
public:
explicit IOAuthProcedure(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IOAuthProcedure"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "PrepareAsync"},
- {1, nullptr, "GetRequest"},
- {2, nullptr, "ApplyResponse"},
- {3, nullptr, "ApplyResponseAsync"},
- {10, nullptr, "Suspend"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IOAuthProcedure"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "PrepareAsync"},
+ FunctionInfo{1, nullptr, "GetRequest"},
+ FunctionInfo{2, nullptr, "ApplyResponse"},
+ FunctionInfo{3, nullptr, "ApplyResponseAsync"},
+ FunctionInfo{10, nullptr, "Suspend"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
@@ -284,96 +282,69 @@ public:
class IOAuthProcedureForExternalNsa final : public ServiceFramework<IOAuthProcedureForExternalNsa> {
public:
explicit IOAuthProcedureForExternalNsa(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IOAuthProcedureForExternalNsa"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "PrepareAsync"},
- {1, nullptr, "GetRequest"},
- {2, nullptr, "ApplyResponse"},
- {3, nullptr, "ApplyResponseAsync"},
- {10, nullptr, "Suspend"},
- {100, nullptr, "GetAccountId"},
- {101, nullptr, "GetLinkedNintendoAccountId"},
- {102, nullptr, "GetNickname"},
- {103, nullptr, "GetProfileImage"},
- {104, nullptr, "GetProfileLargeImage"} // 18.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IOAuthProcedureForExternalNsa"}
+ {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "PrepareAsync"},
+ FunctionInfo{1, nullptr, "GetRequest"},
+ FunctionInfo{2, nullptr, "ApplyResponse"},
+ FunctionInfo{3, nullptr, "ApplyResponseAsync"},
+ FunctionInfo{10, nullptr, "Suspend"},
+ FunctionInfo{100, nullptr, "GetAccountId"},
+ FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"},
+ FunctionInfo{102, nullptr, "GetNickname"},
+ FunctionInfo{103, nullptr, "GetProfileImage"},
+ FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
-class IOAuthProcedureForNintendoAccountLinkage final
- : public ServiceFramework<IOAuthProcedureForNintendoAccountLinkage> {
+class IOAuthProcedureForNintendoAccountLinkage final : public ServiceFramework<IOAuthProcedureForNintendoAccountLinkage> {
public:
explicit IOAuthProcedureForNintendoAccountLinkage(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IOAuthProcedureForNintendoAccountLinkage"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "PrepareAsync"},
- {1, nullptr, "GetRequest"},
- {2, nullptr, "ApplyResponse"},
- {3, nullptr, "ApplyResponseAsync"},
- {10, nullptr, "Suspend"},
- {100, nullptr, "GetRequestWithTheme"},
- {101, nullptr, "IsNetworkServiceAccountReplaced"},
- {199, nullptr, "GetUrlForIntroductionOfExtraMembership"}, // 2.0.0 - 5.1.0
- {200, nullptr, "ApplyAsyncWithAuthorizedToken"},
- {210, nullptr, "IsProfileAvailable"}, // 17.0.0+
- {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+
- {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+
- {230, nullptr, "RegisterUserWithLargeImageProfileAsync"}, // 18.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IOAuthProcedureForNintendoAccountLinkage"}
+ {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "PrepareAsync"},
+ FunctionInfo{1, nullptr, "GetRequest"},
+ FunctionInfo{2, nullptr, "ApplyResponse"},
+ FunctionInfo{3, nullptr, "ApplyResponseAsync"},
+ FunctionInfo{10, nullptr, "Suspend"},
+ FunctionInfo{100, nullptr, "GetRequestWithTheme"},
+ FunctionInfo{101, nullptr, "IsNetworkServiceAccountReplaced"},
+ FunctionInfo{199, nullptr, "GetUrlForIntroductionOfExtraMembership", MakeVersionGate({2,0,0}, {5,1,0})},
+ FunctionInfo{200, nullptr, "ApplyAsyncWithAuthorizedToken"},
+ FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})},
+ FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})},
+ FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})},
+ FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class INotifier final : public ServiceFramework<INotifier> {
public:
explicit INotifier(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "INotifier"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetSystemEvent"},
- };
- // clang-format on
+ : ServiceFramework{system_, "INotifier"} {}
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetSystemEvent"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IProfileCommon : public ServiceFramework<IProfileCommon> {
public:
- explicit IProfileCommon(Core::System& system_, const char* name, bool editor_commands,
- Common::UUID user_id_, ProfileManager& profile_manager_)
+ explicit IProfileCommon(Core::System& system_, const char* name, bool editor_commands, Common::UUID user_id_, ProfileManager& profile_manager_)
: ServiceFramework{system_, name}, profile_manager{profile_manager_}, user_id{user_id_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IProfileCommon::Get, "Get"},
- {1, &IProfileCommon::GetBase, "GetBase"},
- {10, &IProfileCommon::GetImageSize, "GetImageSize"},
- {11, &IProfileCommon::LoadImage, "LoadImage"},
- {20, &IProfileCommon::Unknown20, "Unknown20"},
- {21, &IProfileCommon::Unknown21, "Unknown21"},
- {30, &IProfileCommon::Unknown30, "Unknown30"}
- };
- // clang-format on
- RegisterHandlers(functions);
-
- if (editor_commands) {
- // clang-format off
- static const FunctionInfo editor_functions[] = {
- {100, &IProfileCommon::Store, "Store"},
- {101, &IProfileCommon::StoreWithImage, "StoreWithImage"},
- {110, &IProfileCommon::Unknown110, "Unknown110"}
- };
- // clang-format on
-
- RegisterHandlers(editor_functions);
- }
}
protected:
@@ -600,6 +571,22 @@ protected:
rb.Push(ResultSuccess);
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IProfileCommon::Get, "Get"},
+ FunctionInfo{1, &IProfileCommon::GetBase, "GetBase"},
+ FunctionInfo{10, &IProfileCommon::GetImageSize, "GetImageSize"},
+ FunctionInfo{11, &IProfileCommon::LoadImage, "LoadImage"},
+ FunctionInfo{20, &IProfileCommon::Unknown20, "Unknown20"},
+ FunctionInfo{21, &IProfileCommon::Unknown21, "Unknown21"},
+ FunctionInfo{30, &IProfileCommon::Unknown30, "Unknown30"},
+ // Editor commands
+ FunctionInfo{100, &IProfileCommon::Store, "Store"},
+ FunctionInfo{101, &IProfileCommon::StoreWithImage, "StoreWithImage"},
+ FunctionInfo{110, &IProfileCommon::Unknown110, "Unknown110"}
+ );
ProfileManager& profile_manager;
Common::UUID user_id{}; ///< The user id this profile refers to.
};
@@ -621,35 +608,33 @@ public:
class ISessionObject final : public ServiceFramework<ISessionObject> {
public:
explicit ISessionObject(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "ISessionObject"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {999, nullptr, "Dummy"},
- };
- // clang-format on
+ : ServiceFramework{system_, "ISessionObject"} {}
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{999, nullptr, "Dummy"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IGuestLoginRequest final : public ServiceFramework<IGuestLoginRequest> {
public:
explicit IGuestLoginRequest(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IGuestLoginRequest"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetSessionId"},
- {11, nullptr, "Unknown"}, // 1.0.0 - 2.3.0 (the name is blank on Switchbrew)
- {12, nullptr, "GetAccountId"},
- {13, nullptr, "GetLinkedNintendoAccountId"},
- {14, nullptr, "GetNickname"},
- {15, nullptr, "GetProfileImage"},
- {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+
- {21, nullptr, "LoadIdTokenCache"}, // 3.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IGuestLoginRequest"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetSessionId"},
+ FunctionInfo{11, nullptr, "Unknown", MakeVersionGate({1,0,0}, {2,3,0})}, // the name is blank on Switchbrew
+ FunctionInfo{12, nullptr, "GetAccountId"},
+ FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"},
+ FunctionInfo{14, nullptr, "GetNickname"},
+ FunctionInfo{15, nullptr, "GetProfileImage"},
+ FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})},
+ FunctionInfo{21, nullptr, "LoadIdTokenCache", MakeVersionGate({3,0,0})}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
@@ -686,23 +671,10 @@ public:
const std::shared_ptr<ProfileManager>& profile_manager_)
: ServiceFramework{system_, "IManagerForApplication"},
ensure_token_id{std::make_shared<EnsureTokenIdCacheAsyncInterface>(system)},
- profile_manager{profile_manager_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"},
- {1, &IManagerForApplication::GetAccountId, "GetAccountId"},
- {2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"},
- {3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"},
- {4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"},
- {130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"},
- {136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache"}, // 19.0.0+
- {150, nullptr, "CreateAuthorizationRequest"},
- {160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"},
- {170, nullptr, "LoadNetworkServiceLicenseKindAsync"},
- };
- // clang-format on
+ profile_manager{profile_manager_} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -772,6 +744,18 @@ private:
rb.Push(ResultSuccess);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IManagerForApplication::CheckAvailability, "CheckAvailability"},
+ FunctionInfo{1, &IManagerForApplication::GetAccountId, "GetAccountId"},
+ FunctionInfo{2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"},
+ FunctionInfo{3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"},
+ FunctionInfo{4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"},
+ FunctionInfo{130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"},
+ FunctionInfo{136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})},
+ FunctionInfo{150, nullptr, "CreateAuthorizationRequest"},
+ FunctionInfo{160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"},
+ FunctionInfo{170, nullptr, "LoadNetworkServiceLicenseKindAsync"}
+ );
std::shared_ptr<EnsureTokenIdCacheAsyncInterface> ensure_token_id{};
std::shared_ptr<ProfileManager> profile_manager;
};
@@ -781,18 +765,17 @@ class IAsyncNetworkServiceLicenseKindContext final
: public ServiceFramework<IAsyncNetworkServiceLicenseKindContext> {
public:
explicit IAsyncNetworkServiceLicenseKindContext(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IAsyncNetworkServiceLicenseKindContext"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetSystemEvent"},
- {1, nullptr, "Cancel"},
- {2, nullptr, "HasDone"},
- {3, nullptr, "GetResult"},
- {4, nullptr, "GetNetworkServiceLicenseKind"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IAsyncNetworkServiceLicenseKindContext"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetSystemEvent"},
+ FunctionInfo{1, nullptr, "Cancel"},
+ FunctionInfo{2, nullptr, "HasDone"},
+ FunctionInfo{3, nullptr, "GetResult"},
+ FunctionInfo{4, nullptr, "GetNetworkServiceLicenseKind"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
@@ -801,56 +784,54 @@ class IOAuthProcedureForUserRegistration final
: public ServiceFramework<IOAuthProcedureForUserRegistration> {
public:
explicit IOAuthProcedureForUserRegistration(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IOAuthProcedureForUserRegistration"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "PrepareAsync"},
- {1, nullptr, "GetRequest"},
- {2, nullptr, "ApplyResponse"},
- {3, nullptr, "ApplyResponseAsync"},
- {10, nullptr, "Suspend"},
- {100, nullptr, "GetAccountId"},
- {101, nullptr, "GetLinkedNintendoAccountId"},
- {102, nullptr, "GetNickname"},
- {103, nullptr, "GetProfileImage"},
- {104, nullptr, "GetProfileLargeImage"}, // 18.0.0+
- {110, nullptr, "RegisterUserAsync"},
- {111, nullptr, "GetUid"},
- {200, nullptr, "ApplyResponseForUserCreationAsync"}, // 17.0.0+
- {205, nullptr, "SuspendAfterApplyResponse"}, // 17.0.0+
- {210, nullptr, "IsProfileAvailable"}, // 17.0.0+
- {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+
- {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+
- {230, nullptr, "RegisterUserWithLargeImageProfileAsync"} // 18.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IOAuthProcedureForUserRegistration"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "PrepareAsync"},
+ FunctionInfo{1, nullptr, "GetRequest"},
+ FunctionInfo{2, nullptr, "ApplyResponse"},
+ FunctionInfo{3, nullptr, "ApplyResponseAsync"},
+ FunctionInfo{10, nullptr, "Suspend"},
+ FunctionInfo{100, nullptr, "GetAccountId"},
+ FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"},
+ FunctionInfo{102, nullptr, "GetNickname"},
+ FunctionInfo{103, nullptr, "GetProfileImage"},
+ FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})},
+ FunctionInfo{110, nullptr, "RegisterUserAsync"},
+ FunctionInfo{111, nullptr, "GetUid"},
+ FunctionInfo{200, nullptr, "ApplyResponseForUserCreationAsync", MakeVersionGate({17,0,0})},
+ FunctionInfo{205, nullptr, "SuspendAfterApplyResponse", MakeVersionGate({17,0,0})},
+ FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})},
+ FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})},
+ FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})},
+ FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class DAUTH_O final : public ServiceFramework<DAUTH_O> {
public:
- explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "EnsureAuthenticationTokenCacheAsync"},
- {1, nullptr, "LoadAuthenticationTokenCache"},
- {2, nullptr, "InvalidateAuthenticationTokenCache"},
- {3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"},
- {10, nullptr, "EnsureEdgeTokenCacheAsync"},
- {11, nullptr, "LoadEdgeTokenCache"},
- {12, nullptr, "InvalidateEdgeTokenCache"},
- {13, nullptr, "IsEdgeTokenCacheAvailable"},
- {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"},
- {21, nullptr, "LoadApplicationAuthenticationTokenCache"},
- {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"},
- {23, nullptr, "IsApplicationAuthenticationCacheAvailable"},
- {24, nullptr, "InvalidateApplicationAuthenticationCache"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "EnsureAuthenticationTokenCacheAsync"},
+ FunctionInfo{1, nullptr, "LoadAuthenticationTokenCache"},
+ FunctionInfo{2, nullptr, "InvalidateAuthenticationTokenCache"},
+ FunctionInfo{3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"},
+ FunctionInfo{10, nullptr, "EnsureEdgeTokenCacheAsync"},
+ FunctionInfo{11, nullptr, "LoadEdgeTokenCache"},
+ FunctionInfo{12, nullptr, "InvalidateEdgeTokenCache"},
+ FunctionInfo{13, nullptr, "IsEdgeTokenCacheAvailable"},
+ FunctionInfo{20, nullptr, "EnsureApplicationAuthenticationCacheAsync"},
+ FunctionInfo{21, nullptr, "LoadApplicationAuthenticationTokenCache"},
+ FunctionInfo{22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"},
+ FunctionInfo{23, nullptr, "IsApplicationAuthenticationCacheAvailable"},
+ FunctionInfo{24, nullptr, "InvalidateApplicationAuthenticationCache"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
@@ -858,781 +839,809 @@ public:
class IAsyncResult final : public ServiceFramework<IAsyncResult> {
public:
explicit IAsyncResult(Core::System& system_, Common::UUID)
- : ServiceFramework{system_, "IAsyncResult"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetResult"},
- {1, nullptr, "Cancel"},
- {2, nullptr, "IsAvailable"},
- {3, nullptr, "GetSystemEvent"},
- };
- // clang-format on
+ : ServiceFramework{system_, "IAsyncResult"} {}
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetResult"},
+ FunctionInfo{1, nullptr, "Cancel"},
+ FunctionInfo{2, nullptr, "IsAvailable"},
+ FunctionInfo{3, nullptr, "GetSystemEvent"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
-void Module::Interface::GetUserCount(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push<u32>(static_cast<u32>(profile_manager->GetUserCount()));
-}
-
-void Module::Interface::GetUserExistence(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
- LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString());
-
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push(profile_manager->UserExists(user_id));
-}
-
-void Module::Interface::ListAllUsers(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- ctx.WriteBuffer(profile_manager->GetAllUsers());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
-}
-
-void Module::Interface::ListOpenUsers(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- ctx.WriteBuffer(profile_manager->GetOpenUsers());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
-}
-
-void Module::Interface::GetLastOpenedUser(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- IPC::ResponseBuilder rb{ctx, 6};
- rb.Push(ResultSuccess);
- rb.PushRaw<Common::UUID>(profile_manager->GetLastOpenedUser());
-}
-
-void Module::Interface::GetProfile(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
- LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString());
-
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<IProfile>(ctx, system, user_id, *profile_manager);
-}
-
-void Module::Interface::IsUserRegistrationRequestPermitted(HLERequestContext& ctx) {
- LOG_WARNING(Service_ACC, "(STUBBED) called");
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push(profile_manager->CanSystemRegisterUser());
-}
-
-void Module::Interface::InitializeApplicationInfo(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(InitializeApplicationInfoBase());
-}
-
-void Module::Interface::InitializeApplicationInfoRestricted(HLERequestContext& ctx) {
- LOG_WARNING(Service_ACC, "(Partial implementation) called");
+class Module final {
+public:
+ class Interface : public ServiceFramework<Interface> {
+ public:
+ explicit Interface(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_, const char* name)
+ : ServiceFramework{system_, name}
+ , module{std::move(module_)}
+ , profile_manager{std::move(profile_manager_)}
+ {}
+ ~Interface() override = default;
+
+ void GetUserCount(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push<u32>(static_cast<u32>(profile_manager->GetUserCount()));
+ }
- // TODO(ogniK): We require checking if the user actually owns the title and what not. As of
- // currently, we assume the user owns the title. InitializeApplicationInfoBase SHOULD be called
- // first then we do extra checks if the game is a digital copy.
+ void GetUserExistence(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(InitializeApplicationInfoBase());
-}
-
-Result Module::Interface::InitializeApplicationInfoBase() {
- if (application_info) {
- LOG_ERROR(Service_ACC, "Application already initialized");
- return Account::ResultApplicationInfoAlreadyInitialized;
- }
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push(profile_manager->UserExists(user_id));
+ }
- // TODO(ogniK): This should be changed to reflect the target process for when we have multiple
- // processes emulated. As we don't actually have pid support we should assume we're just using
- // our own process
- Glue::ApplicationLaunchProperty launch_property{};
- const auto result = system.GetARPManager().GetLaunchProperty(
- &launch_property, system.GetApplicationProcessProgramID());
+ void ListAllUsers(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ ctx.WriteBuffer(profile_manager->GetAllUsers());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
- if (result != ResultSuccess) {
- LOG_ERROR(Service_ACC, "Failed to get launch property");
- return Account::ResultInvalidApplication;
- }
+ void ListOpenUsers(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ ctx.WriteBuffer(profile_manager->GetOpenUsers());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
- switch (launch_property.base_game_storage_id) {
- case FileSys::StorageId::GameCard:
- application_info.application_type = ApplicationType::GameCard;
- break;
- case FileSys::StorageId::Host:
- case FileSys::StorageId::NandSystem:
- case FileSys::StorageId::NandUser:
- case FileSys::StorageId::SdCard:
- case FileSys::StorageId::None: // Yuzu specific, differs from hardware
- application_info.application_type = ApplicationType::Digital;
- break;
- default:
- LOG_ERROR(Service_ACC, "Invalid game storage ID! storage_id={}",
- launch_property.base_game_storage_id);
- return Account::ResultInvalidApplication;
- }
+ void GetLastOpenedUser(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 6};
+ rb.Push(ResultSuccess);
+ rb.PushRaw<Common::UUID>(profile_manager->GetLastOpenedUser());
+ }
- LOG_WARNING(Service_ACC, "ApplicationInfo init required");
- // TODO(ogniK): Actual initialization here
+ void GetProfile(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString());
- return ResultSuccess;
-}
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<Service::Account::IProfile>(ctx, system, user_id, *profile_manager);
+ }
-void Module::Interface::GetBaasAccountManagerForApplication(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<IManagerForApplication>(ctx, system, profile_manager);
-}
+ void IsUserRegistrationRequestPermitted(HLERequestContext& ctx) {
+ LOG_WARNING(Service_ACC, "(STUBBED) called");
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push(profile_manager->CanSystemRegisterUser());
+ }
-void Module::Interface::IsUserAccountSwitchLocked(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- FileSys::NACP nacp;
- const auto res = system.GetAppLoader().ReadControlData(nacp);
+ void InitializeApplicationInfo(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(InitializeApplicationInfoBase());
+ }
- bool is_locked = false;
+ void InitializeApplicationInfoRestricted(HLERequestContext& ctx) {
+ LOG_WARNING(Service_ACC, "(Partial implementation) called");
- if (res != Loader::ResultStatus::Success) {
- const FileSys::PatchManager pm{system.GetApplicationProcessProgramID(),
- system.GetFileSystemController(),
- system.GetContentProvider()};
- const auto nacp_unique = pm.GetControlMetadata().first;
+ // TODO(ogniK): We require checking if the user actually owns the title and what not. As of
+ // currently, we assume the user owns the title. InitializeApplicationInfoBase SHOULD be called
+ // first then we do extra checks if the game is a digital copy.
- if (nacp_unique != nullptr) {
- is_locked = nacp_unique->GetUserAccountSwitchLock();
- } else {
- LOG_ERROR(Service_ACC, "nacp_unique is null!");
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(InitializeApplicationInfoBase());
}
- } else {
- is_locked = nacp.GetUserAccountSwitchLock();
- }
-
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push(is_locked);
-}
-
-void Module::Interface::InitializeApplicationInfoV2(HLERequestContext& ctx) {
- LOG_WARNING(Service_ACC, "(STUBBED) called");
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
-}
+ void GetBaasAccountManagerForApplication(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<IManagerForApplication>(ctx, system, profile_manager);
+ }
-void Module::Interface::BeginUserRegistration(HLERequestContext& ctx) {
- const auto user_id = Common::UUID::MakeRandom();
- profile_manager->CreateNewUser(user_id, "Eden");
+ void IsUserAccountSwitchLocked(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ FileSys::NACP nacp;
+ const auto res = system.GetAppLoader().ReadControlData(nacp);
+
+ bool is_locked = false;
+
+ if (res != Loader::ResultStatus::Success) {
+ const FileSys::PatchManager pm{system.GetApplicationProcessProgramID(),
+ system.GetFileSystemController(),
+ system.GetContentProvider()};
+ const auto nacp_unique = pm.GetControlMetadata().first;
+
+ if (nacp_unique != nullptr) {
+ is_locked = nacp_unique->GetUserAccountSwitchLock();
+ } else {
+ LOG_ERROR(Service_ACC, "nacp_unique is null!");
+ }
+ } else {
+ is_locked = nacp.GetUserAccountSwitchLock();
+ }
+
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push(is_locked);
+ }
- LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
+ void InitializeApplicationInfoV2(HLERequestContext& ctx) {
+ LOG_WARNING(Service_ACC, "(STUBBED) called");
- IPC::ResponseBuilder rb{ctx, 6};
- rb.Push(ResultSuccess);
- rb.PushRaw(user_id);
-}
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
-void Module::Interface::CompleteUserRegistration(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ void BeginUserRegistration(HLERequestContext& ctx) {
+ const auto user_id = Common::UUID::MakeRandom();
+ profile_manager->CreateNewUser(user_id, "Eden");
- LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
+ LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
- profile_manager->WriteUserSaveFile();
+ IPC::ResponseBuilder rb{ctx, 6};
+ rb.Push(ResultSuccess);
+ rb.PushRaw(user_id);
+ }
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
-}
+ void CompleteUserRegistration(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
-void Module::Interface::DeleteUser(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
- LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
- if (!profile_manager->RemoveUser(user_id)) {
- LOG_ERROR(Service_ACC, "Failed to delete user with uuid={}", user_id.RawString());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(1U);
- return;
- }
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
-}
+ LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
-void Module::Interface::SetUserPosition(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
+ profile_manager->WriteUserSaveFile();
- u64 position = rp.Pop<u64>();
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
- LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString());
+ void DeleteUser(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString());
+ if (!profile_manager->RemoveUser(user_id)) {
+ LOG_ERROR(Service_ACC, "Failed to delete user with uuid={}", user_id.RawString());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(1U);
+ return;
+ }
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
- profile_manager->SetUserPosition(position, user_id);
+ void SetUserPosition(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
-}
+ u64 position = rp.Pop<u64>();
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
-void Module::Interface::GetProfileEditor(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- Common::UUID user_id = rp.PopRaw<Common::UUID>();
+ LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString());
- LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString());
+ profile_manager->SetUserPosition(position, user_id);
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<IProfileEditor>(ctx, system, user_id, *profile_manager);
-}
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
-void Module::Interface::GetBaasAccountAdministrator(HLERequestContext &ctx) {
- IPC::RequestParser rp{ctx};
- const auto uuid = rp.PopRaw<Common::UUID>();
+ void GetProfileEditor(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ Common::UUID user_id = rp.PopRaw<Common::UUID>();
- LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString());
+ LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString());
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<IAdministrator>(ctx, system, uuid);
-}
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<IProfileEditor>(ctx, system, user_id, *profile_manager);
+ }
-void Module::Interface::ListQualifiedUsers(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
+ void GetBaasAccountAdministrator(HLERequestContext &ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto uuid = rp.PopRaw<Common::UUID>();
- // All users should be qualified. We don't actually have parental control or anything to do with
- // nintendo online currently. We're just going to assume the user running the game has access to
- // the game regardless of parental control settings.
- ctx.WriteBuffer(profile_manager->GetAllUsers());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
-}
+ LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString());
-void Module::Interface::ListOpenContextStoredUsers(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<IAdministrator>(ctx, system, uuid);
+ }
- ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers());
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
-}
+ void ListQualifiedUsers(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
-void Module::Interface::StoreSaveDataThumbnailApplication(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- const auto uuid = rp.PopRaw<Common::UUID>();
+ // All users should be qualified. We don't actually have parental control or anything to do with
+ // nintendo online currently. We're just going to assume the user running the game has access to
+ // the game regardless of parental control settings.
+ ctx.WriteBuffer(profile_manager->GetAllUsers());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
- LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString());
+ void ListOpenContextStoredUsers(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
- // TODO(ogniK): Check if application ID is zero on acc initialize. As we don't have a reliable
- // way of confirming things like the TID, we're going to assume a non zero value for the time
- // being.
- constexpr u64 tid{1};
- StoreSaveDataThumbnail(ctx, uuid, tid);
-}
+ ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers());
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
-void Module::Interface::GetBaasAccountManagerForSystemService(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- const auto uuid = rp.PopRaw<Common::UUID>();
+ void StoreSaveDataThumbnailApplication(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto uuid = rp.PopRaw<Common::UUID>();
- LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString());
+ LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString());
- IPC::ResponseBuilder rb{ctx, 2, 0, 1};
- rb.Push(ResultSuccess);
- rb.PushIpcInterface<IManagerForSystemService>(ctx, system, uuid);
-}
+ // TODO(ogniK): Check if application ID is zero on acc initialize. As we don't have a reliable
+ // way of confirming things like the TID, we're going to assume a non zero value for the time
+ // being.
+ constexpr u64 tid{1};
+ StoreSaveDataThumbnail(ctx, uuid, tid);
+ }
-void Module::Interface::StoreSaveDataThumbnailSystem(HLERequestContext& ctx) {
- IPC::RequestParser rp{ctx};
- const auto uuid = rp.PopRaw<Common::UUID>();
- const auto tid = rp.Pop<u64_le>();
+ void GetBaasAccountManagerForSystemService(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto uuid = rp.PopRaw<Common::UUID>();
- LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid);
- StoreSaveDataThumbnail(ctx, uuid, tid);
-}
+ LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString());
-void Module::Interface::GetPinCodeLength(HLERequestContext& ctx) {
- LOG_WARNING(Service_ACC, "(STUBBED) called");
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+ rb.Push(ResultSuccess);
+ rb.PushIpcInterface<IManagerForSystemService>(ctx, system, uuid);
+ }
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push<u32>(0);
-}
+ void StoreSaveDataThumbnailSystem(HLERequestContext& ctx) {
+ IPC::RequestParser rp{ctx};
+ const auto uuid = rp.PopRaw<Common::UUID>();
+ const auto tid = rp.Pop<u64_le>();
-void Module::Interface::StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid,
- const u64 tid) {
- IPC::ResponseBuilder rb{ctx, 2};
+ LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid);
+ StoreSaveDataThumbnail(ctx, uuid, tid);
+ }
- if (tid == 0) {
- LOG_ERROR(Service_ACC, "TitleID is not valid!");
- rb.Push(Account::ResultInvalidApplication);
- return;
- }
+ void GetPinCodeLength(HLERequestContext& ctx) {
+ LOG_WARNING(Service_ACC, "(STUBBED) called");
- if (uuid.IsInvalid()) {
- LOG_ERROR(Service_ACC, "User ID is not valid!");
- rb.Push(Account::ResultInvalidUserId);
- return;
- }
- const auto thumbnail_size = ctx.GetReadBufferSize();
- if (thumbnail_size != THUMBNAIL_SIZE) {
- LOG_ERROR(Service_ACC, "Buffer size is empty! size={:X} expecting {:X}", thumbnail_size,
- THUMBNAIL_SIZE);
- rb.Push(Account::ResultInvalidArrayLength);
- return;
- }
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push<u32>(0);
+ }
- // TODO(ogniK): Construct save data thumbnail
- rb.Push(ResultSuccess);
-}
+ void TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ // A u8 is passed into this function which we can safely ignore. It's to determine if we have
+ // access to use the network or not by the looks of it
+ IPC::ResponseBuilder rb{ctx, 6};
+ if (profile_manager->GetUserCount() != 1) {
+ rb.Push(ResultSuccess);
+ rb.PushRaw(Common::InvalidUUID);
+ return;
+ }
+
+ const auto user_list = profile_manager->GetAllUsers();
+ if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) {
+ rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code
+ rb.PushRaw(Common::InvalidUUID);
+ return;
+ }
+
+ // Select the first user we have
+ rb.Push(ResultSuccess);
+ rb.PushRaw(profile_manager->GetUser(0)->uuid);
+ }
-void Module::Interface::TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- // A u8 is passed into this function which we can safely ignore. It's to determine if we have
- // access to use the network or not by the looks of it
- IPC::ResponseBuilder rb{ctx, 6};
- if (profile_manager->GetUserCount() != 1) {
- rb.Push(ResultSuccess);
- rb.PushRaw(Common::InvalidUUID);
- return;
- }
+ void TrySelectUserWithoutInteraction(HLERequestContext& ctx) {
+ LOG_DEBUG(Service_ACC, "called");
+ // A u8 is passed into this function which we can safely ignore. It's to determine if we have
+ // access to use the network or not by the looks of it
+ IPC::ResponseBuilder rb{ctx, 6};
+ if (profile_manager->GetUserCount() != 1) {
+ rb.Push(ResultSuccess);
+ rb.PushRaw(Common::InvalidUUID);
+ return;
+ }
+
+ const auto user_list = profile_manager->GetAllUsers();
+ if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) {
+ rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code
+ rb.PushRaw(Common::InvalidUUID);
+ return;
+ }
+
+ // Select the first user we have
+ rb.Push(ResultSuccess);
+ rb.PushRaw(profile_manager->GetUser(0)->uuid);
+ }
- const auto user_list = profile_manager->GetAllUsers();
- if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) {
- rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code
- rb.PushRaw(Common::InvalidUUID);
- return;
- }
+ private:
+ Result InitializeApplicationInfoBase() {
+ if (application_info) {
+ LOG_ERROR(Service_ACC, "Application already initialized");
+ return Account::ResultApplicationInfoAlreadyInitialized;
+ }
+
+ // TODO(ogniK): This should be changed to reflect the target process for when we have multiple
+ // processes emulated. As we don't actually have pid support we should assume we're just using
+ // our own process
+ Glue::ApplicationLaunchProperty launch_property{};
+ const auto result = system.GetARPManager().GetLaunchProperty(
+ &launch_property, system.GetApplicationProcessProgramID());
+
+ if (result != ResultSuccess) {
+ LOG_ERROR(Service_ACC, "Failed to get launch property");
+ return Account::ResultInvalidApplication;
+ }
+
+ switch (launch_property.base_game_storage_id) {
+ case FileSys::StorageId::GameCard:
+ application_info.application_type = ApplicationType::GameCard;
+ break;
+ case FileSys::StorageId::Host:
+ case FileSys::StorageId::NandSystem:
+ case FileSys::StorageId::NandUser:
+ case FileSys::StorageId::SdCard:
+ case FileSys::StorageId::None: // Yuzu specific, differs from hardware
+ application_info.application_type = ApplicationType::Digital;
+ break;
+ default:
+ LOG_ERROR(Service_ACC, "Invalid game storage ID! storage_id={}",
+ launch_property.base_game_storage_id);
+ return Account::ResultInvalidApplication;
+ }
+
+ LOG_WARNING(Service_ACC, "ApplicationInfo init required");
+ // TODO(ogniK): Actual initialization here
+
+ return ResultSuccess;
+ }
- // Select the first user we have
- rb.Push(ResultSuccess);
- rb.PushRaw(profile_manager->GetUser(0)->uuid);
-}
+ void StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid,
+ const u64 tid) {
+ IPC::ResponseBuilder rb{ctx, 2};
-void Module::Interface::TrySelectUserWithoutInteraction(HLERequestContext& ctx) {
- LOG_DEBUG(Service_ACC, "called");
- // A u8 is passed into this function which we can safely ignore. It's to determine if we have
- // access to use the network or not by the looks of it
- IPC::ResponseBuilder rb{ctx, 6};
- if (profile_manager->GetUserCount() != 1) {
- rb.Push(ResultSuccess);
- rb.PushRaw(Common::InvalidUUID);
- return;
- }
+ if (tid == 0) {
+ LOG_ERROR(Service_ACC, "TitleID is not valid!");
+ rb.Push(Account::ResultInvalidApplication);
+ return;
+ }
+
+ if (uuid.IsInvalid()) {
+ LOG_ERROR(Service_ACC, "User ID is not valid!");
+ rb.Push(Account::ResultInvalidUserId);
+ return;
+ }
+ const auto thumbnail_size = ctx.GetReadBufferSize();
+ if (thumbnail_size != THUMBNAIL_SIZE) {
+ LOG_ERROR(Service_ACC, "Buffer size is empty! size={:X} expecting {:X}", thumbnail_size,
+ THUMBNAIL_SIZE);
+ rb.Push(Account::ResultInvalidArrayLength);
+ return;
+ }
+
+ // TODO(ogniK): Construct save data thumbnail
+ rb.Push(ResultSuccess);
+ }
- const auto user_list = profile_manager->GetAllUsers();
- if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) {
- rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code
- rb.PushRaw(Common::InvalidUUID);
- return;
- }
+ enum class ApplicationType : u32_le {
+ GameCard = 0,
+ Digital = 1,
+ Unknown = 3,
+ };
- // Select the first user we have
- rb.Push(ResultSuccess);
- rb.PushRaw(profile_manager->GetUser(0)->uuid);
-}
+ struct ApplicationInfo {
+ Service::Glue::ApplicationLaunchProperty launch_property;
+ ApplicationType application_type;
-Module::Interface::Interface(std::shared_ptr<Module> module_,
- std::shared_ptr<ProfileManager> profile_manager_,
- Core::System& system_, const char* name)
- : ServiceFramework{system_, name}, module{std::move(module_)},
- profile_manager{std::move(profile_manager_)} {}
+ constexpr explicit operator bool() const {
+ return launch_property.title_id != 0x0;
+ }
+ };
-Module::Interface::~Interface() = default;
+ ApplicationInfo application_info{};
+ protected:
+ std::shared_ptr<Module> module;
+ std::shared_ptr<ProfileManager> profile_manager;
+ };
+};
class ACC_AA final : public Module::Interface {
public:
explicit ACC_AA(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:aa") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "EnsureCacheAsync"},
- {1, nullptr, "LoadCache"},
- {2, nullptr, "GetDeviceAccountId"},
- {50, nullptr, "RegisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0
- {51, nullptr, "UnregisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0
- };
- // clang-format on
- RegisterHandlers(functions);
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:aa") {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~ACC_AA() override = default;
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "EnsureCacheAsync"},
+ FunctionInfo{1, nullptr, "LoadCache"},
+ FunctionInfo{2, nullptr, "GetDeviceAccountId"},
+ FunctionInfo{50, nullptr, "RegisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})},
+ FunctionInfo{51, nullptr, "UnregisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})}
+ );
};
class ACC_SU final : public Module::Interface {
public:
explicit ACC_SU(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:su") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &ACC_SU::GetUserCount, "GetUserCount"},
- {1, &ACC_SU::GetUserExistence, "GetUserExistence"},
- {2, &ACC_SU::ListAllUsers, "ListAllUsers"},
- {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"},
- {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"},
- {5, &ACC_SU::GetProfile, "GetProfile"},
- {6, nullptr, "GetProfileDigest"},
- {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
- {51, &ACC_SU::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
- {52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, // 19.0.0+
- {60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"},
- {99, nullptr, "DebugActivateOpenContextRetention"},
- {100, nullptr, "GetUserRegistrationNotifier"},
- {101, nullptr, "GetUserStateChangeNotifier"},
- {102, &ACC_SU::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"},
- {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- {104, nullptr, "GetProfileUpdateNotifier"},
- {105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- {106, nullptr, "GetProfileSyncNotifier"},
- {110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"},
- {111, nullptr, "ClearSaveDataThumbnail"},
- {112, nullptr, "LoadSaveDataThumbnail"},
- {113, nullptr, "GetSaveDataThumbnailExistence"},
- {120, nullptr, "ListOpenUsersInApplication"},
- {130, nullptr, "ActivateOpenContextRetention"},
- {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"},
- {150, nullptr, "AuthenticateApplicationAsync"},
- {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- {190, nullptr, "GetUserLastOpenedApplication"},
- {191, nullptr, "ActivateOpenContextHolder"},
- {200, &ACC_SU::BeginUserRegistration, "BeginUserRegistration"},
- {201, &ACC_SU::CompleteUserRegistration, "CompleteUserRegistration"},
- {202, nullptr, "CancelUserRegistration"},
- {203, &ACC_SU::DeleteUser, "DeleteUser"},
- {204, &ACC_SU::SetUserPosition, "SetUserPosition"},
- {205, &ACC_SU::GetProfileEditor, "GetProfileEditor"},
- {206, nullptr, "CompleteUserRegistrationForcibly"},
- {210, nullptr, "CreateFloatingRegistrationRequest"},
- {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"},
- {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},
- {230, nullptr, "AuthenticateServiceAsync"},
- {250, &ACC_SU::GetBaasAccountAdministrator, "GetBaasAccountAdministrator"},
- {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
- {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
- {299, nullptr, "SuspendBackgroundDaemon"},
- {400, nullptr, "SetPinCode"}, // 18.0.0+
- {401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+
- {402, nullptr, "GetPinCode"}, // 18.0.0+
- {403, nullptr, "GetPinCodeParity"},
- {404, nullptr, "VerifyPinCode"},
- {405, nullptr, "IsPinCodeVerificationForbidden"},
- {410, nullptr, "GetPinCodeErrorCount"}, // 18.0.0+
- {411, nullptr, "ResetPinCodeErrorCount"}, // 18.0.0+
- {412, nullptr, "IncrementPinCodeErrorCount"}, // 18.0.0+
- {900, nullptr, "SetUserUnqualifiedForDebug"},
- {901, nullptr, "UnsetUserUnqualifiedForDebug"},
- {902, nullptr, "ListUsersUnqualifiedForDebug"},
- {910, nullptr, "RefreshFirmwareSettingsForDebug"},
- {997, nullptr, "DebugInvalidateTokenCacheForUser"},
- {998, nullptr, "DebugSetUserStateClose"},
- {999, nullptr, "DebugSetUserStateOpen"},
- };
- // clang-format on
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:su") {}
- RegisterHandlers(functions);
- }
~ACC_SU() override = default;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ACC_SU::GetUserCount, "GetUserCount"},
+ FunctionInfo{1, &ACC_SU::GetUserExistence, "GetUserExistence"},
+ FunctionInfo{2, &ACC_SU::ListAllUsers, "ListAllUsers"},
+ FunctionInfo{3, &ACC_SU::ListOpenUsers, "ListOpenUsers"},
+ FunctionInfo{4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"},
+ FunctionInfo{5, &ACC_SU::GetProfile, "GetProfile"},
+ FunctionInfo{6, nullptr, "GetProfileDigest"},
+ FunctionInfo{50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
+ FunctionInfo{51, &ACC_SU::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
+ FunctionInfo{52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction", MakeVersionGate({19,0,0})},
+ FunctionInfo{60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"},
+ FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
+ FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
+ FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
+ FunctionInfo{102, &ACC_SU::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"},
+ FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
+ FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
+ FunctionInfo{110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"},
+ FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
+ FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
+ FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
+ FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
+ FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
+ FunctionInfo{140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"},
+ FunctionInfo{150, nullptr, "AuthenticateApplicationAsync"},
+ FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ FunctionInfo{190, nullptr, "GetUserLastOpenedApplication"},
+ FunctionInfo{191, nullptr, "ActivateOpenContextHolder"},
+ FunctionInfo{200, &ACC_SU::BeginUserRegistration, "BeginUserRegistration"},
+ FunctionInfo{201, &ACC_SU::CompleteUserRegistration, "CompleteUserRegistration"},
+ FunctionInfo{202, nullptr, "CancelUserRegistration"},
+ FunctionInfo{203, &ACC_SU::DeleteUser, "DeleteUser"},
+ FunctionInfo{204, &ACC_SU::SetUserPosition, "SetUserPosition"},
+ FunctionInfo{205, &ACC_SU::GetProfileEditor, "GetProfileEditor"},
+ FunctionInfo{206, nullptr, "CompleteUserRegistrationForcibly"},
+ FunctionInfo{210, nullptr, "CreateFloatingRegistrationRequest"},
+ FunctionInfo{211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"},
+ FunctionInfo{212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},
+ FunctionInfo{230, nullptr, "AuthenticateServiceAsync"},
+ FunctionInfo{250, &ACC_SU::GetBaasAccountAdministrator, "GetBaasAccountAdministrator"},
+ FunctionInfo{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
+ FunctionInfo{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
+ FunctionInfo{299, nullptr, "SuspendBackgroundDaemon"},
+ FunctionInfo{400, nullptr, "SetPinCode", MakeVersionGate({18,0,0})},
+ FunctionInfo{401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})},
+ FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})},
+ FunctionInfo{403, nullptr, "GetPinCodeParity"},
+ FunctionInfo{404, nullptr, "VerifyPinCode"},
+ FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"},
+ FunctionInfo{410, nullptr, "GetPinCodeErrorCount", MakeVersionGate({18,0,0})},
+ FunctionInfo{411, nullptr, "ResetPinCodeErrorCount", MakeVersionGate({18,0,0})},
+ FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount", MakeVersionGate({18,0,0})},
+ FunctionInfo{900, nullptr, "SetUserUnqualifiedForDebug"},
+ FunctionInfo{901, nullptr, "UnsetUserUnqualifiedForDebug"},
+ FunctionInfo{902, nullptr, "ListUsersUnqualifiedForDebug"},
+ FunctionInfo{910, nullptr, "RefreshFirmwareSettingsForDebug"},
+ FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
+ FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}
+ );
};
class ACC_U0 final : public Module::Interface {
public:
ACC_U0(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u0") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &ACC_U0::GetUserCount, "GetUserCount"},
- {1, &ACC_U0::GetUserExistence, "GetUserExistence"},
- {2, &ACC_U0::ListAllUsers, "ListAllUsers"},
- {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"},
- {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"},
- {5, &ACC_U0::GetProfile, "GetProfile"},
- {6, nullptr, "GetProfileDigest"}, // 3.0.0+
- {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
- {51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
- {52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"},
- {60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0
- {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+
- {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"},
- {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"},
- {102, nullptr, "AuthenticateApplicationAsync"},
- {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+
- {110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
- {111, nullptr, "ClearSaveDataThumbnail"},
- {120, nullptr, "CreateGuestLoginRequest"},
- {130, nullptr, "LoadOpenContext"}, // 5.0.0+
- {131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 6.0.0+
- {140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, // 6.0.0+
- {141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+
- {150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, // 6.0.0+
- {160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"},
- };
- // clang-format on
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u0") {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~ACC_U0() override = default;
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ACC_U0::GetUserCount, "GetUserCount"},
+ FunctionInfo{1, &ACC_U0::GetUserExistence, "GetUserExistence"},
+ FunctionInfo{2, &ACC_U0::ListAllUsers, "ListAllUsers"},
+ FunctionInfo{3, &ACC_U0::ListOpenUsers, "ListOpenUsers"},
+ FunctionInfo{4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"},
+ FunctionInfo{5, &ACC_U0::GetProfile, "GetProfile"},
+ FunctionInfo{6, nullptr, "GetProfileDigest", MakeVersionGate({3,0,0})},
+ FunctionInfo{50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
+ FunctionInfo{51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
+ FunctionInfo{52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"},
+ FunctionInfo{60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({5,0,0}, {5,1,0})},
+ FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention", MakeVersionGate({6,0,0})},
+ FunctionInfo{100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"},
+ FunctionInfo{101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"},
+ FunctionInfo{102, nullptr, "AuthenticateApplicationAsync"},
+ FunctionInfo{103, nullptr, "CheckNetworkServiceAvailabilityAsync", MakeVersionGate({4,0,0})},
+ FunctionInfo{110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
+ FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
+ FunctionInfo{120, nullptr, "CreateGuestLoginRequest"},
+ FunctionInfo{130, nullptr, "LoadOpenContext", MakeVersionGate({5,0,0})},
+ FunctionInfo{131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({6,0,0})},
+ FunctionInfo{140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted", MakeVersionGate({6,0,0})},
+ FunctionInfo{141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers", MakeVersionGate({6,0,0})},
+ FunctionInfo{150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked", MakeVersionGate({6,0,0})},
+ FunctionInfo{160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"}
+ );
};
class ACC_U1 final : public Module::Interface {
public:
ACC_U1(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u1") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &ACC_U1::GetUserCount, "GetUserCount"},
- {1, &ACC_U1::GetUserExistence, "GetUserExistence"},
- {2, &ACC_U1::ListAllUsers, "ListAllUsers"},
- {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"},
- {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"},
- {5, &ACC_U1::GetProfile, "GetProfile"},
- {6, nullptr, "GetProfileDigest"},
- {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
- {51, &ACC_U1::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
- {52, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"},
- {60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"},
- {99, nullptr, "DebugActivateOpenContextRetention"},
- {100, nullptr, "GetUserRegistrationNotifier"},
- {101, nullptr, "GetUserStateChangeNotifier"},
- {102, &ACC_U1::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"},
- {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- {104, nullptr, "GetProfileUpdateNotifier"},
- {105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- {106, nullptr, "GetProfileSyncNotifier"},
- {110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
- {111, nullptr, "ClearSaveDataThumbnail"},
- {112, nullptr, "LoadSaveDataThumbnail"},
- {113, nullptr, "GetSaveDataThumbnailExistence"},
- {120, nullptr, "ListOpenUsersInApplication"},
- {130, nullptr, "ActivateOpenContextRetention"},
- {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"},
- {150, nullptr, "AuthenticateApplicationAsync"},
- {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- {190, nullptr, "GetUserLastOpenedApplication"},
- {191, nullptr, "ActivateOpenContextHolder"},
- {401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+
- {402, nullptr, "GetPinCode"}, // 18.0.0+
- {997, nullptr, "DebugInvalidateTokenCacheForUser"},
- {998, nullptr, "DebugSetUserStateClose"},
- {999, nullptr, "DebugSetUserStateOpen"},
- };
- // clang-format on
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u1") {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~ACC_U1() override = default;
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ACC_U1::GetUserCount, "GetUserCount"},
+ FunctionInfo{1, &ACC_U1::GetUserExistence, "GetUserExistence"},
+ FunctionInfo{2, &ACC_U1::ListAllUsers, "ListAllUsers"},
+ FunctionInfo{3, &ACC_U1::ListOpenUsers, "ListOpenUsers"},
+ FunctionInfo{4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"},
+ FunctionInfo{5, &ACC_U1::GetProfile, "GetProfile"},
+ FunctionInfo{6, nullptr, "GetProfileDigest"},
+ FunctionInfo{50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"},
+ FunctionInfo{51, &ACC_U1::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"},
+ FunctionInfo{52, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"},
+ FunctionInfo{60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"},
+ FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
+ FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
+ FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
+ FunctionInfo{102, &ACC_U1::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"},
+ FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
+ FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
+ FunctionInfo{110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
+ FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
+ FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
+ FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
+ FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
+ FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
+ FunctionInfo{140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"},
+ FunctionInfo{150, nullptr, "AuthenticateApplicationAsync"},
+ FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ FunctionInfo{190, nullptr, "GetUserLastOpenedApplication"},
+ FunctionInfo{191, nullptr, "ActivateOpenContextHolder"},
+ FunctionInfo{401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})},
+ FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})},
+ FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
+ FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}
+ );
};
class DAUTH_0 final : public ServiceFramework<DAUTH_0> {
public:
- explicit DAUTH_0(Core::System& system_) : ServiceFramework{system_, "dauth:0"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "EnsureAuthenticationTokenCacheAsync"},
- {1, nullptr, "LoadAuthenticationTokenCache"},
- {2, nullptr, "InvalidateAuthenticationTokenCache"},
- {3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"},
- {10, nullptr, "EnsureEdgeTokenCacheAsync"},
- {11, nullptr, "LoadEdgeTokenCache"},
- {12, nullptr, "InvalidateEdgeTokenCache"},
- {13, nullptr, "IsEdgeTokenCacheAvailable"},
- {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"},
- {21, nullptr, "LoadApplicationAuthenticationTokenCache"},
- {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"},
- {23, nullptr, "IsApplicationAuthenticationCacheAvailable"},
- {24, nullptr, "InvalidateApplicationAuthenticationCache"},
- {30, nullptr, "EnsureGameCardAuthenticationCacheAsync"},
- {31, nullptr, "LoadGameCardAuthenticationTokenCache"},
- {32, nullptr, "IsGameCardAuthenticationCacheAvailable"},
- {33, nullptr, "InvalidateGameCardAuthenticationCache"},
- {1000, nullptr, "GetInactiveElicenseUsedEvent"},
- {9000, nullptr, "ImportVirtualClientCertificate"},
- {9010, nullptr, "DeleteVirtualClientCertificate"},
- };
- // clang-format on
- RegisterHandlers(functions);
- }
+ explicit DAUTH_0(Core::System& system_) : ServiceFramework{system_, "dauth:0"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "EnsureAuthenticationTokenCacheAsync"},
+ FunctionInfo{1, nullptr, "LoadAuthenticationTokenCache"},
+ FunctionInfo{2, nullptr, "InvalidateAuthenticationTokenCache"},
+ FunctionInfo{3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"},
+ FunctionInfo{10, nullptr, "EnsureEdgeTokenCacheAsync"},
+ FunctionInfo{11, nullptr, "LoadEdgeTokenCache"},
+ FunctionInfo{12, nullptr, "InvalidateEdgeTokenCache"},
+ FunctionInfo{13, nullptr, "IsEdgeTokenCacheAvailable"},
+ FunctionInfo{20, nullptr, "EnsureApplicationAuthenticationCacheAsync"},
+ FunctionInfo{21, nullptr, "LoadApplicationAuthenticationTokenCache"},
+ FunctionInfo{22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"},
+ FunctionInfo{23, nullptr, "IsApplicationAuthenticationCacheAvailable"},
+ FunctionInfo{24, nullptr, "InvalidateApplicationAuthenticationCache"},
+ FunctionInfo{30, nullptr, "EnsureGameCardAuthenticationCacheAsync"},
+ FunctionInfo{31, nullptr, "LoadGameCardAuthenticationTokenCache"},
+ FunctionInfo{32, nullptr, "IsGameCardAuthenticationCacheAvailable"},
+ FunctionInfo{33, nullptr, "InvalidateGameCardAuthenticationCache"},
+ FunctionInfo{1000, nullptr, "GetInactiveElicenseUsedEvent"},
+ FunctionInfo{9000, nullptr, "ImportVirtualClientCertificate"},
+ FunctionInfo{9010, nullptr, "DeleteVirtualClientCertificate"}
+ );
};
class ACC_E final : public Module::Interface {
public:
explicit ACC_E(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e") {
- // clang-format off
- static const FunctionInfo functions[] = {
- { 0, nullptr, "GetUserCount"},
- { 1, nullptr, "GetUserExistence"},
- { 2, nullptr, "ListAllUsers"},
- { 3, nullptr, "ListOpenUsers"},
- { 4, nullptr, "GetLastOpenedUser"},
- { 5, nullptr, "GetProfile"},
- { 6, nullptr, "GetProfileDigest"},
- { 50, nullptr, "IsUserRegistrationRequestPermitted"},
- { 51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
- { 52, nullptr, "TrySelectUserWithoutInteraction"},
- { 99, nullptr, "DebugActivateOpenContextRetention"},
- { 100, nullptr, "GetUserRegistrationNotifier"},
- { 101, nullptr, "GetUserStateChangeNotifier"},
- { 102, nullptr, "GetBaasAccountManagerForSystemService"},
- { 103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- { 104, nullptr, "GetProfileUpdateNotifier"},
- { 105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- { 106, nullptr, "GetProfileSyncNotifier"},
- { 110, nullptr, "StoreSaveDataThumbnail"},
- { 111, nullptr, "ClearSaveDataThumbnail"},
- { 112, nullptr, "LoadSaveDataThumbnail"},
- { 113, nullptr, "GetSaveDataThumbnailExistence"},
- { 120, nullptr, "ListOpenUsersInApplication"},
- { 130, nullptr, "ActivateOpenContextRetention"},
- { 140, nullptr, "ListQualifiedUsers"},
- { 151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- { 152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- { 170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
- { 191, nullptr, "UpdateNotificationReceiverInfo"},
- { 200, nullptr, "BeginUserRegistration"},
- { 201, nullptr, "CompleteUserRegistration"},
- { 202, nullptr, "CancelUserRegistration"},
- { 203, nullptr, "DeleteUser"},
- { 204, nullptr, "SetUserPosition"},
- { 205, nullptr, "GetProfileEditor"},
- { 206, nullptr, "CompleteUserRegistrationForcibly"},
- { 210, nullptr, "CreateFloatingRegistrationRequest"},
- { 211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"},
- { 212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},
- { 213, nullptr, "CreateProcedureToCreateUserWithNintendoAccount"},
- { 214, nullptr, "ResumeProcedureToCreateUserWithNintendoAccount"},
- { 215, nullptr, "ResumeProcedureToCreateUserWithNintendoAccountAfterApplyResponse"},
- { 230, nullptr, "AuthenticateServiceAsync"},
- { 250, nullptr, "GetBaasAccountAdministrator"},
- { 251, nullptr, "SynchronizeNetworkServiceAccountsSnapshotAsync"},
- { 290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
- { 291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
- { 292, nullptr, "ProxyProcedureForDeviceMigrationAuthenticatingOperatingUser"},
- { 293, nullptr, "ProxyProcedureForDeviceMigrationDownload"},
- { 299, nullptr, "SuspendBackgroundDaemon"},
- { 350, nullptr, "CreateDeviceMigrationUserExportRequest"},
- { 351, nullptr, "UploadNasCredential"},
- { 352, nullptr, "CreateDeviceMigrationUserImportRequest"},
- { 353, nullptr, "DeleteUserMigrationSaveData"},
- { 400, nullptr, "SetPinCode"},
- { 401, nullptr, "GetPinCodeLength"},
- { 402, nullptr, "GetPinCode"},
- { 403, nullptr, "GetPinCodeParity"},
- { 404, nullptr, "VerifyPinCode"},
- { 405, nullptr, "IsPinCodeVerificationForbidden"},
- { 410, nullptr, "GetPinCodeErrorCount"},
- { 411, nullptr, "ResetPinCodeErrorCount"},
- { 412, nullptr, "IncrementPinCodeErrorCount"},
- { 413, nullptr, "SetPinCodeErrorCount"},
- { 420, nullptr, "SetStartPenaltyTime"},
- { 421, nullptr, "GetStartPenaltyTime"},
- { 900, nullptr, "SetUserUnqualifiedForDebug"},
- { 901, nullptr, "UnsetUserUnqualifiedForDebug"},
- { 902, nullptr, "ListUsersUnqualifiedForDebug"},
- { 910, nullptr, "RefreshFirmwareSettingsForDebug"},
- { 997, nullptr, "DebugInvalidateTokenCacheForUser"},
- { 998, nullptr, "DebugSetUserStateClose"},
- { 999, nullptr, "DebugSetUserStateOpen"},
- { 1000, nullptr, "CreateIAccountEntityServiceForApplication"},
- { 1100, nullptr, "CreateIUserStateManager"},
- { 10050, nullptr, "IsUserRegistrationRequestPermittedForAccountPolicy"},
- { 10105, nullptr, "CheckNetworkServiceAvailabilityAsyncForAccountPolicy"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e") {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetUserCount"},
+ FunctionInfo{1, nullptr, "GetUserExistence"},
+ FunctionInfo{2, nullptr, "ListAllUsers"},
+ FunctionInfo{3, nullptr, "ListOpenUsers"},
+ FunctionInfo{4, nullptr, "GetLastOpenedUser"},
+ FunctionInfo{5, nullptr, "GetProfile"},
+ FunctionInfo{6, nullptr, "GetProfileDigest"},
+ FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"},
+ FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
+ FunctionInfo{52, nullptr, "TrySelectUserWithoutInteraction"},
+ FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
+ FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
+ FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
+ FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"},
+ FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
+ FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
+ FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"},
+ FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
+ FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
+ FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
+ FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
+ FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
+ FunctionInfo{140, nullptr, "ListQualifiedUsers"},
+ FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
+ FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"},
+ FunctionInfo{200, nullptr, "BeginUserRegistration"},
+ FunctionInfo{201, nullptr, "CompleteUserRegistration"},
+ FunctionInfo{202, nullptr, "CancelUserRegistration"},
+ FunctionInfo{203, nullptr, "DeleteUser"},
+ FunctionInfo{204, nullptr, "SetUserPosition"},
+ FunctionInfo{205, nullptr, "GetProfileEditor"},
+ FunctionInfo{206, nullptr, "CompleteUserRegistrationForcibly"},
+ FunctionInfo{210, nullptr, "CreateFloatingRegistrationRequest"},
+ FunctionInfo{211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"},
+ FunctionInfo{212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"},
+ FunctionInfo{213, nullptr, "CreateProcedureToCreateUserWithNintendoAccount"},
+ FunctionInfo{214, nullptr, "ResumeProcedureToCreateUserWithNintendoAccount"},
+ FunctionInfo{215, nullptr, "ResumeProcedureToCreateUserWithNintendoAccountAfterApplyResponse"},
+ FunctionInfo{230, nullptr, "AuthenticateServiceAsync"},
+ FunctionInfo{250, nullptr, "GetBaasAccountAdministrator"},
+ FunctionInfo{251, nullptr, "SynchronizeNetworkServiceAccountsSnapshotAsync"},
+ FunctionInfo{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"},
+ FunctionInfo{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"},
+ FunctionInfo{292, nullptr, "ProxyProcedureForDeviceMigrationAuthenticatingOperatingUser"},
+ FunctionInfo{293, nullptr, "ProxyProcedureForDeviceMigrationDownload"},
+ FunctionInfo{299, nullptr, "SuspendBackgroundDaemon"},
+ FunctionInfo{350, nullptr, "CreateDeviceMigrationUserExportRequest"},
+ FunctionInfo{351, nullptr, "UploadNasCredential"},
+ FunctionInfo{352, nullptr, "CreateDeviceMigrationUserImportRequest"},
+ FunctionInfo{353, nullptr, "DeleteUserMigrationSaveData"},
+ FunctionInfo{400, nullptr, "SetPinCode"},
+ FunctionInfo{401, nullptr, "GetPinCodeLength"},
+ FunctionInfo{402, nullptr, "GetPinCode"},
+ FunctionInfo{403, nullptr, "GetPinCodeParity"},
+ FunctionInfo{404, nullptr, "VerifyPinCode"},
+ FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"},
+ FunctionInfo{410, nullptr, "GetPinCodeErrorCount"},
+ FunctionInfo{411, nullptr, "ResetPinCodeErrorCount"},
+ FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount"},
+ FunctionInfo{413, nullptr, "SetPinCodeErrorCount"},
+ FunctionInfo{420, nullptr, "SetStartPenaltyTime"},
+ FunctionInfo{421, nullptr, "GetStartPenaltyTime"},
+ FunctionInfo{900, nullptr, "SetUserUnqualifiedForDebug"},
+ FunctionInfo{901, nullptr, "UnsetUserUnqualifiedForDebug"},
+ FunctionInfo{902, nullptr, "ListUsersUnqualifiedForDebug"},
+ FunctionInfo{910, nullptr, "RefreshFirmwareSettingsForDebug"},
+ FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
+ FunctionInfo{999, nullptr, "DebugSetUserStateOpen"},
+ FunctionInfo{1000, nullptr, "CreateIAccountEntityServiceForApplication"},
+ FunctionInfo{1100, nullptr, "CreateIUserStateManager"},
+ FunctionInfo{10050, nullptr, "IsUserRegistrationRequestPermittedForAccountPolicy"},
+ FunctionInfo{10105, nullptr, "CheckNetworkServiceAvailabilityAsyncForAccountPolicy"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class ACC_E_U1 final : public Module::Interface {
public:
explicit ACC_E_U1(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u1") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetUserCount"},
- {1, nullptr, "GetUserExistence"},
- {2, nullptr, "ListAllUsers"},
- {3, nullptr, "ListOpenUsers"},
- {4, nullptr, "GetLastOpenedUser"},
- {5, nullptr, "GetProfile"},
- {6, nullptr, "GetProfileDigest"},
- {50, nullptr, "IsUserRegistrationRequestPermitted"},
- {51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
- {99, nullptr, "DebugActivateOpenContextRetention"},
- {100, nullptr, "GetUserRegistrationNotifier"},
- {101, nullptr, "GetUserStateChangeNotifier"},
- {102, nullptr, "GetBaasAccountManagerForSystemService"},
- {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- {104, nullptr, "GetProfileUpdateNotifier"},
- {105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- {106, nullptr, "GetProfileSyncNotifier"},
- {110, nullptr, "StoreSaveDataThumbnail"},
- {111, nullptr, "ClearSaveDataThumbnail"},
- {112, nullptr, "LoadSaveDataThumbnail"},
- {113, nullptr, "GetSaveDataThumbnailExistence"},
- {120, nullptr, "ListOpenUsersInApplication"},
- {130, nullptr, "ActivateOpenContextRetention"},
- {140, nullptr, "ListQualifiedUsers"},
- {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- {170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
- {191, nullptr, "UpdateNotificationReceiverInfo"},
- {997, nullptr, "DebugInvalidateTokenCacheForUser"},
- {998, nullptr, "DebugSetUserStateClose"},
- {999, nullptr, "DebugSetUserStateOpen"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u1") {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetUserCount"},
+ FunctionInfo{1, nullptr, "GetUserExistence"},
+ FunctionInfo{2, nullptr, "ListAllUsers"},
+ FunctionInfo{3, nullptr, "ListOpenUsers"},
+ FunctionInfo{4, nullptr, "GetLastOpenedUser"},
+ FunctionInfo{5, nullptr, "GetProfile"},
+ FunctionInfo{6, nullptr, "GetProfileDigest"},
+ FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"},
+ FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
+ FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
+ FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
+ FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
+ FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"},
+ FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
+ FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
+ FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"},
+ FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
+ FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
+ FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
+ FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
+ FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
+ FunctionInfo{140, nullptr, "ListQualifiedUsers"},
+ FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
+ FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"},
+ FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
+ FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class ACC_E_U2 final : public Module::Interface {
public:
explicit ACC_E_U2(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_)
- : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u2") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetUserCount"},
- {1, nullptr, "GetUserExistence"},
- {2, nullptr, "ListAllUsers"},
- {3, nullptr, "ListOpenUsers"},
- {4, nullptr, "GetLastOpenedUser"},
- {5, nullptr, "GetProfile"},
- {6, nullptr, "GetProfileDigest"},
- {50, nullptr, "#IsUserRegistrationRequestPermitted"},
- {51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
- {52, nullptr, "TrySelectUserWithoutInteraction"},
- {99, nullptr, "DebugActivateOpenContextRetention"},
- {100, nullptr, "GetUserRegistrationNotifier"},
- {101, nullptr, "GetUserStateChangeNotifier"},
- {102, nullptr, "GetBaasAccountManagerForSystemService"},
- {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
- {104, nullptr, "GetProfileUpdateNotifier"},
- {105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
- {106, nullptr, "GetProfileSyncNotifier"},
- {110, nullptr, "StoreSaveDataThumbnail"},
- {111, nullptr, "ClearSaveDataThumbnail"},
- {112, nullptr, "LoadSaveDataThumbnail"},
- {113, nullptr, "GetSaveDataThumbnailExistence"},
- {120, nullptr, "ListOpenUsersInApplication"},
- {130, nullptr, "ActivateOpenContextRetention"},
- {140, nullptr, "ListQualifiedUsers"},
- {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
- {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
- {170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
- {191, nullptr, "UpdateNotificationReceiverInfo"},
- {205, nullptr, "GetProfileEditor"},
- {401, nullptr, "GetPinCodeLength"},
- {402, nullptr, "GetPinCode"},
- {403, nullptr, "GetPinCodeParity"},
- {404, nullptr, "VerifyPinCode"},
- {405, nullptr, "IsPinCodeVerificationForbidden"},
- {997, nullptr, "DebugInvalidateTokenCacheForUser"},
- {998, nullptr, "DebugSetUserStateClose"},
- {999, nullptr, "DebugSetUserStateOpen"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u2") {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetUserCount"},
+ FunctionInfo{1, nullptr, "GetUserExistence"},
+ FunctionInfo{2, nullptr, "ListAllUsers"},
+ FunctionInfo{3, nullptr, "ListOpenUsers"},
+ FunctionInfo{4, nullptr, "GetLastOpenedUser"},
+ FunctionInfo{5, nullptr, "GetProfile"},
+ FunctionInfo{6, nullptr, "GetProfileDigest"},
+ FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"},
+ FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"},
+ FunctionInfo{52, nullptr, "TrySelectUserWithoutInteraction"},
+ FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"},
+ FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"},
+ FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"},
+ FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"},
+ FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"},
+ FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"},
+ FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
+ FunctionInfo{106, nullptr, "GetProfileSyncNotifier"},
+ FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"},
+ FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"},
+ FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"},
+ FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"},
+ FunctionInfo{120, nullptr, "ListOpenUsersInApplication"},
+ FunctionInfo{130, nullptr, "ActivateOpenContextRetention"},
+ FunctionInfo{140, nullptr, "ListQualifiedUsers"},
+ FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"},
+ FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"},
+ FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"},
+ FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"},
+ FunctionInfo{205, nullptr, "GetProfileEditor"},
+ FunctionInfo{401, nullptr, "GetPinCodeLength"},
+ FunctionInfo{402, nullptr, "GetPinCode"},
+ FunctionInfo{403, nullptr, "GetPinCodeParity"},
+ FunctionInfo{404, nullptr, "VerifyPinCode"},
+ FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"},
+ FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"},
+ FunctionInfo{998, nullptr, "DebugSetUserStateClose"},
+ FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/acc/acc.h b/src/core/hle/service/acc/acc.h
index 19af7c74c9..9c2c96acdb 100644
--- a/src/core/hle/service/acc/acc.h
+++ b/src/core/hle/service/acc/acc.h
@@ -14,70 +14,6 @@ namespace Service::Account {
class ProfileManager;
-class Module final {
-public:
- class Interface : public ServiceFramework<Interface> {
- public:
- explicit Interface(std::shared_ptr<Module> module_,
- std::shared_ptr<ProfileManager> profile_manager_, Core::System& system_,
- const char* name);
- ~Interface() override;
-
- void GetUserCount(HLERequestContext& ctx);
- void GetUserExistence(HLERequestContext& ctx);
- void ListAllUsers(HLERequestContext& ctx);
- void ListOpenUsers(HLERequestContext& ctx);
- void GetLastOpenedUser(HLERequestContext& ctx);
- void GetProfile(HLERequestContext& ctx);
- void InitializeApplicationInfo(HLERequestContext& ctx);
- void InitializeApplicationInfoRestricted(HLERequestContext& ctx);
- void GetBaasAccountManagerForApplication(HLERequestContext& ctx);
- void IsUserRegistrationRequestPermitted(HLERequestContext& ctx);
- void TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx);
- void TrySelectUserWithoutInteraction(HLERequestContext& ctx);
- void IsUserAccountSwitchLocked(HLERequestContext& ctx);
- void InitializeApplicationInfoV2(HLERequestContext& ctx);
- void BeginUserRegistration(HLERequestContext& ctx);
- void CompleteUserRegistration(HLERequestContext& ctx);
- void DeleteUser(HLERequestContext& ctx);
- void SetUserPosition(HLERequestContext& ctx);
- void GetProfileEditor(HLERequestContext& ctx);
- void GetBaasAccountAdministrator(HLERequestContext &ctx);
- void ListQualifiedUsers(HLERequestContext& ctx);
- void ListOpenContextStoredUsers(HLERequestContext& ctx);
- void StoreSaveDataThumbnailApplication(HLERequestContext& ctx);
- void GetBaasAccountManagerForSystemService(HLERequestContext& ctx);
- void StoreSaveDataThumbnailSystem(HLERequestContext& ctx);
- void GetPinCodeLength(HLERequestContext& ctx);
-
- private:
- Result InitializeApplicationInfoBase();
- void StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid,
- const u64 tid);
-
- enum class ApplicationType : u32_le {
- GameCard = 0,
- Digital = 1,
- Unknown = 3,
- };
-
- struct ApplicationInfo {
- Service::Glue::ApplicationLaunchProperty launch_property;
- ApplicationType application_type;
-
- constexpr explicit operator bool() const {
- return launch_property.title_id != 0x0;
- }
- };
-
- ApplicationInfo application_info{};
-
- protected:
- std::shared_ptr<Module> module;
- std::shared_ptr<ProfileManager> profile_manager;
- };
-};
-
void LoopProcess(Core::System& system);
} // namespace Service::Account
diff --git a/src/core/hle/service/acc/async_context.cpp b/src/core/hle/service/acc/async_context.cpp
index 8dec886ad7..a7f751d756 100644
--- a/src/core/hle/service/acc/async_context.cpp
+++ b/src/core/hle/service/acc/async_context.cpp
@@ -12,17 +12,6 @@
namespace Service::Account {
IAsyncContext::IAsyncContext(Core::System& system_)
: ServiceFramework{system_, "IAsyncContext"}, service_context{system_, "IAsyncContext"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"},
- {1, &IAsyncContext::Cancel, "Cancel"},
- {2, &IAsyncContext::HasDone, "HasDone"},
- {3, &IAsyncContext::GetResult, "GetResult"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
completion_event = service_context.CreateEvent("IAsyncContext:CompletionEvent");
}
diff --git a/src/core/hle/service/acc/async_context.h b/src/core/hle/service/acc/async_context.h
index d7bffc055e..0137567d11 100644
--- a/src/core/hle/service/acc/async_context.h
+++ b/src/core/hle/service/acc/async_context.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -30,6 +33,16 @@ protected:
void MarkComplete();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"},
+ FunctionInfo{1, &IAsyncContext::Cancel, "Cancel"},
+ FunctionInfo{2, &IAsyncContext::HasDone, "HasDone"},
+ FunctionInfo{3, &IAsyncContext::GetResult, "GetResult"}
+ );
+
KernelHelpers::ServiceContext service_context;
std::atomic<bool> is_complete{false};
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index 2ef393439b..472be8f0f0 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -1,16 +1,1343 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
+#include "common/settings.h"
+#include "core/core.h"
+#include "core/file_sys/common_funcs.h"
+#include "core/file_sys/patch_manager.h"
+#include "core/file_sys/romfs_factory.h"
+#include "core/file_sys/control_metadata.h"
+#include "core/hle/api_version.h"
+#include "core/hle/kernel/k_transfer_memory.h"
+#include "core/hle/service/server_manager.h"
+#include "core/hle/service/am/applet_manager.h"
+#include "core/hle/service/am/window_system.h"
#include "core/hle/service/am/am.h"
#include "core/hle/service/am/button_poller.h"
#include "core/hle/service/am/event_observer.h"
-#include "core/hle/service/am/service/all_system_applet_proxies_service.h"
-#include "core/hle/service/am/service/application_proxy_service.h"
-#include "core/hle/service/am/window_system.h"
-#include "core/hle/service/server_manager.h"
+#include "core/hle/service/am/service/application_creator.h"
+#include "core/hle/service/am/service/audio_controller.h"
+#include "core/hle/service/am/service/common_state_getter.h"
+#include "core/hle/service/am/service/display_controller.h"
+#include "core/hle/service/am/service/global_state_controller.h"
+#include "core/hle/service/am/service/home_menu_functions.h"
+#include "core/hle/service/am/service/process_winding_controller.h"
+#include "core/hle/service/am/service/self_controller.h"
+#include "core/hle/service/am/service/window_controller.h"
+#include "core/hle/service/am/service/application_functions.h"
+#include "core/hle/service/am/applet_data_broker.h"
+#include "core/hle/service/am/frontend/applets.h"
+#include "core/hle/service/am/library_applet_storage.h"
+#include "core/hle/service/am/process_creation.h"
+#include "core/hle/service/am/service/library_applet_accessor.h"
+#include "core/hle/service/am/service/overlay_functions.h"
+#include "core/hle/service/am/service/storage.h"
+#include "core/hle/service/ns/language.h"
+#include "core/hle/service/ns/application_manager_interface.h"
+#include "core/hle/service/ns/service_getter_interface.h"
+#include "core/hle/service/glue/glue_manager.h"
+#include "core/hle/service/sm/sm.h"
+#include "core/hle/service/acc/profile_manager.h"
+#include "core/hle/service/am/frontend/applet_profile_select.h"
+#include "core/hle/service/cmif_serialization.h"
namespace Service::AM {
+struct Applet;
+class IAppletCommonFunctions;
+class IApplicationCreator;
+class IAudioController;
+class ICommonStateGetter;
+class IDebugFunctions;
+class IDisplayController;
+class IHomeMenuFunctions;
+class IGlobalStateController;
+class ILibraryAppletCreator;
+class IProcessWindingController;
+class ISelfController;
+class IWindowController;
+class WindowSystem;
+
+class IDebugFunctions final : public ServiceFramework<IDebugFunctions> {
+public:
+ explicit IDebugFunctions(Core::System& system_) : ServiceFramework{system_, "IDebugFunctions"} {}
+ ~IDebugFunctions() override = default;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "NotifyMessageToHomeMenuForDebug"},
+ FunctionInfo{1, nullptr, "OpenMainApplication"},
+ FunctionInfo{10, nullptr, "PerformSystemButtonPressing"},
+ FunctionInfo{20, nullptr, "InvalidateTransitionLayer"},
+ FunctionInfo{30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"},
+ FunctionInfo{31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"},
+ FunctionInfo{40, nullptr, "GetAppletResourceUsageInfo"},
+ FunctionInfo{50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"},
+ FunctionInfo{51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"},
+ FunctionInfo{100, nullptr, "SetCpuBoostModeForApplet"},
+ FunctionInfo{101, nullptr, "CancelCpuBoostModeForApplet"},
+ FunctionInfo{110, nullptr, "PushToAppletBoundChannelForDebug"},
+ FunctionInfo{111, nullptr, "TryPopFromAppletBoundChannelForDebug"},
+ FunctionInfo{120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"},
+ FunctionInfo{121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"},
+ FunctionInfo{122, nullptr, "AlarmSettingNotificationPushAppEventNotify"},
+ FunctionInfo{130, nullptr, "FriendInvitationSetApplicationParameter"},
+ FunctionInfo{131, nullptr, "FriendInvitationClearApplicationParameter"},
+ FunctionInfo{132, nullptr, "FriendInvitationPushApplicationParameter"},
+ FunctionInfo{140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"},
+ FunctionInfo{200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"},
+ FunctionInfo{300, nullptr, "TerminateAllRunningApplicationsForDebug"},
+ FunctionInfo{900, nullptr, "GetGrcProcessLaunchedSystemEvent"}
+ );
+};
+
+class IApplicationProxy final : public ServiceFramework<IApplicationProxy> {
+public:
+ explicit IApplicationProxy(Core::System& system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess* process, WindowSystem& window_system)
+ : ServiceFramework{system_, "IApplicationProxy"},
+ m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
+ }
+
+ ~IApplicationProxy() override = default;
+
+ Result GetAudioController(
+ Out<SharedPointer<IAudioController>> out_audio_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_audio_controller = std::make_shared<IAudioController>(system);
+ R_SUCCEED();
+ }
+
+ Result GetDisplayController(
+ Out<SharedPointer<IDisplayController>> out_display_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetDebugFunctions(
+ Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_debug_functions = std::make_shared<IDebugFunctions>(system);
+ R_SUCCEED();
+ }
+
+ Result GetWindowController(
+ Out<SharedPointer<IWindowController>> out_window_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetSelfController(
+ Out<SharedPointer<ISelfController>> out_self_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
+ R_SUCCEED();
+ }
+
+ Result GetCommonStateGetter(
+ Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_creator =
+ std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetApplicationFunctions(
+ Out<SharedPointer<IApplicationFunctions>> out_application_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_application_functions = std::make_shared<IApplicationFunctions>(system, m_applet);
+ R_SUCCEED();
+ }
+
+private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IApplicationProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
+ FunctionInfo{1, D<&IApplicationProxy::GetSelfController>, "GetSelfController"},
+ FunctionInfo{2, D<&IApplicationProxy::GetWindowController>, "GetWindowController"},
+ FunctionInfo{3, D<&IApplicationProxy::GetAudioController>, "GetAudioController"},
+ FunctionInfo{4, D<&IApplicationProxy::GetDisplayController>, "GetDisplayController"},
+ FunctionInfo{10, D<&IApplicationProxy::GetProcessWindingController>, "GetProcessWindingController"},
+ FunctionInfo{11, D<&IApplicationProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
+ FunctionInfo{20, D<&IApplicationProxy::GetApplicationFunctions>, "GetApplicationFunctions"},
+ FunctionInfo{1000, D<&IApplicationProxy::GetDebugFunctions>, "GetDebugFunctions"}
+ );
+ WindowSystem& m_window_system;
+ Kernel::KProcess* const m_process;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+class IApplicationProxyService final : public ServiceFramework<IApplicationProxyService> {
+public:
+ explicit IApplicationProxyService(Core::System& system_,
+ WindowSystem& window_system)
+ : ServiceFramework{system_, "appletOE"}, m_window_system{window_system} {
+ }
+
+ ~IApplicationProxyService() override = default;
+
+ Result OpenApplicationProxy(
+ Out<SharedPointer<IApplicationProxy>> out_application_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_DEBUG(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid)) {
+ *out_application_proxy = std::make_shared<IApplicationProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+ }
+
+ std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId process_id) {
+ return m_window_system.GetByAppletResourceUserId(process_id.pid);
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IApplicationProxyService::OpenApplicationProxy>, "OpenApplicationProxy"}
+ );
+ WindowSystem& m_window_system;
+};
+
+class IAppletCommonFunctions final : public ServiceFramework<IAppletCommonFunctions> {
+public:
+ explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr<Applet> applet_) : ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} {}
+ ~IAppletCommonFunctions() override = default;
+
+ Result SetHomeButtonDoubleClickEnabled(
+ bool home_button_double_click_enabled) {
+ LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}", home_button_double_click_enabled);
+ R_SUCCEED();
+ }
+
+ Result GetHomeButtonDoubleClickEnabled(
+ Out<bool> out_home_button_double_click_enabled) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_home_button_double_click_enabled = false;
+ R_SUCCEED();
+ }
+
+ Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) {
+ LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width, height);
+ std::scoped_lock lk{applet->lock};
+ applet->display_magnification = Common::Rectangle<f32>{x, y, x + width, y + height};
+ R_SUCCEED();
+ }
+
+ Result SetCpuBoostRequestPriority(s32 priority) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ std::scoped_lock lk{applet->lock};
+ applet->cpu_boost_request_priority = priority;
+ R_SUCCEED();
+ }
+
+ Result GetCurrentApplicationId(Out<u64> out_application_id) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID());
+ R_SUCCEED();
+ }
+
+ Result SetGpuTimeSliceBoost(s64 time_span) {
+ LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span);
+ R_SUCCEED();
+ }
+
+ Result Unknown350(Out<u16> out_unknown) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_unknown = 0;
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetTerminateResult"},
+ FunctionInfo{10, nullptr, "ReadThemeStorage"},
+ FunctionInfo{11, nullptr, "WriteThemeStorage"},
+ FunctionInfo{20, nullptr, "PushToAppletBoundChannel"},
+ FunctionInfo{21, nullptr, "TryPopFromAppletBoundChannel"},
+ FunctionInfo{40, nullptr, "GetDisplayLogicalResolution"},
+ FunctionInfo{42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"},
+ FunctionInfo{50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"},
+ FunctionInfo{51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"},
+ FunctionInfo{52, nullptr, "IsHomeButtonShortPressedBlocked"},
+ FunctionInfo{60, nullptr, "IsVrModeCurtainRequired"},
+ FunctionInfo{61, nullptr, "IsSleepRequiredByHighTemperature"},
+ FunctionInfo{62, nullptr, "IsSleepRequiredByLowBattery"},
+ FunctionInfo{70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"},
+ FunctionInfo{80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"},
+ FunctionInfo{81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"},
+ FunctionInfo{90, nullptr, "OpenNamedChannelAsParent"},
+ FunctionInfo{91, nullptr, "OpenNamedChannelAsChild"},
+ FunctionInfo{100, nullptr, "SetApplicationCoreUsageMode"},
+ FunctionInfo{300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"},
+ FunctionInfo{310, nullptr, "IsSystemAppletHomeMenu", MakeVersionGate({19,0,0})},
+ FunctionInfo{320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost", MakeVersionGate({19,0,0})},
+ FunctionInfo{321, nullptr, "SetGpuTimeSliceBoostDueToApplication", MakeVersionGate({19,0,0})},
+ FunctionInfo{350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350", MakeVersionGate({20,0,0})}
+ );
+ const std::shared_ptr<Applet> applet;
+};
+
+class ISystemAppletProxy final : public ServiceFramework<ISystemAppletProxy> {
+public:
+ explicit ISystemAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet, Kernel::KProcess* process, WindowSystem& window_system)
+ : ServiceFramework{system_, "ISystemAppletProxy"},
+ m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
+ }
+
+ ~ISystemAppletProxy() override = default;
+
+ Result GetAudioController(
+ Out<SharedPointer<IAudioController>> out_audio_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_audio_controller = std::make_shared<IAudioController>(system);
+ R_SUCCEED();
+ }
+
+ Result GetDisplayController(
+ Out<SharedPointer<IDisplayController>> out_display_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetDebugFunctions(
+ Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_debug_functions = std::make_shared<IDebugFunctions>(system);
+ R_SUCCEED();
+ }
+
+ Result GetWindowController(
+ Out<SharedPointer<IWindowController>> out_window_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetSelfController(
+ Out<SharedPointer<ISelfController>> out_self_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
+ R_SUCCEED();
+ }
+
+ Result GetCommonStateGetter(
+ Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_creator =
+ std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetApplicationCreator(
+ Out<SharedPointer<IApplicationCreator>> out_application_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_application_creator = std::make_shared<IApplicationCreator>(system, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetAppletCommonFunctions(
+ Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetHomeMenuFunctions(
+ Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_home_menu_functions =
+ std::make_shared<IHomeMenuFunctions>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetGlobalStateController(
+ Out<SharedPointer<IGlobalStateController>> out_global_state_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ISystemAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
+ FunctionInfo{1, D<&ISystemAppletProxy::GetSelfController>, "GetSelfController"},
+ FunctionInfo{2, D<&ISystemAppletProxy::GetWindowController>, "GetWindowController"},
+ FunctionInfo{3, D<&ISystemAppletProxy::GetAudioController>, "GetAudioController"},
+ FunctionInfo{4, D<&ISystemAppletProxy::GetDisplayController>, "GetDisplayController"},
+ FunctionInfo{10, D<&ISystemAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
+ FunctionInfo{11, D<&ISystemAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
+ FunctionInfo{20, D<&ISystemAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"},
+ FunctionInfo{21, D<&ISystemAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
+ FunctionInfo{22, D<&ISystemAppletProxy::GetApplicationCreator>, "GetApplicationCreator"},
+ FunctionInfo{23, D<&ISystemAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
+ FunctionInfo{1000, D<&ISystemAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}
+ );
+ WindowSystem& m_window_system;
+ Kernel::KProcess* const m_process;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+static AppletIdentityInfo GetCallerIdentity(Applet& applet) {
+ if (const auto caller_applet = applet.caller_applet.lock(); caller_applet) {
+ // TODO: is this actually the application ID?
+ return {
+ .applet_id = caller_applet->applet_id,
+ .application_id = caller_applet->program_id,
+ };
+ } else {
+ return {
+ .applet_id = AppletId::QLaunch,
+ .application_id = 0x0100000000001000ull,
+ };
+ }
+}
+
+class ILibraryAppletSelfAccessor final : public ServiceFramework<ILibraryAppletSelfAccessor> {
+public:
+ ILibraryAppletSelfAccessor(Core::System& system_,
+ std::shared_ptr<Applet> applet)
+ : ServiceFramework{system_, "ILibraryAppletSelfAccessor"}, m_applet{std::move(applet)},
+ m_broker{m_applet->caller_applet_broker} {
+ }
+
+ ~ILibraryAppletSelfAccessor() = default;
+
+ Result PopInData(Out<SharedPointer<IStorage>> out_storage) {
+ LOG_INFO(Service_AM, "called");
+ R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage));
+ }
+
+ Result PushOutData(SharedPointer<IStorage> storage) {
+ LOG_INFO(Service_AM, "called");
+ m_broker->GetOutData().Push(system.Kernel(), storage);
+ R_SUCCEED();
+ }
+
+ Result PopInteractiveInData(Out<SharedPointer<IStorage>> out_storage) {
+ LOG_INFO(Service_AM, "called");
+ R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage));
+ }
+
+ Result PushInteractiveOutData(SharedPointer<IStorage> storage) {
+ LOG_INFO(Service_AM, "called");
+ m_broker->GetInteractiveOutData().Push(system.Kernel(), storage);
+ R_SUCCEED();
+ }
+
+ Result GetPopInDataEvent(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_AM, "called");
+ *out_event = m_broker->GetInData().GetEvent();
+ R_SUCCEED();
+ }
+
+ Result GetPopInteractiveInDataEvent(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_AM, "called");
+ *out_event = m_broker->GetInteractiveInData().GetEvent();
+ R_SUCCEED();
+ }
+
+ Result GetLibraryAppletInfo(
+ Out<LibraryAppletInfo> out_library_applet_info) {
+ LOG_INFO(Service_AM, "called");
+ *out_library_applet_info = {
+ .applet_id = m_applet->applet_id,
+ .library_applet_mode = m_applet->library_applet_mode,
+ };
+ R_SUCCEED();
+ }
+
+ Result GetMainAppletIdentityInfo(
+ Out<AppletIdentityInfo> out_identity_info) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_identity_info = {
+ .applet_id = AppletId::QLaunch,
+ .application_id = 0x0100000000001000ull,
+ };
+ R_SUCCEED();
+ }
+
+ Result CanUseApplicationCore(Out<bool> out_can_use_application_core) {
+ // TODO: This appears to read the NPDM from state and check the core mask of the applet.
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_can_use_application_core = false;
+ R_SUCCEED();
+ }
+
+ Result GetMainAppletApplicationControlProperty(
+ OutLargeData<std::array<u8, 0x4000>, BufferAttr_HipcMapAlias> out_nacp) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+
+ // TODO: this should be the main applet, not the caller applet
+ const auto application = GetCallerIdentity(*m_applet);
+ std::vector<u8> nacp;
+ const auto result =
+ system.GetARPManager().GetControlProperty(&nacp, application.application_id);
+
+ if (R_SUCCEEDED(result)) {
+ std::memcpy(out_nacp->data(), nacp.data(), (std::min)(nacp.size(), out_nacp->size()));
+ }
+
+ R_RETURN(result);
+ }
+
+ Result GetMainAppletStorageId(Out<FileSys::StorageId> out_storage_id) {
+ LOG_INFO(Service_AM, "(STUBBED) called");
+ *out_storage_id = FileSys::StorageId::NandUser;
+ R_SUCCEED();
+ }
+
+ Result ExitProcessAndReturn() {
+ LOG_INFO(Service_AM, "called");
+
+ if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) {
+ m_applet->process->Terminate();
+ } else {
+ system.GetUserChannel() = m_applet->user_channel_launch_parameter;
+ system.ExecuteProgram(0);
+ }
+
+ R_SUCCEED();
+ }
+
+ Result GetCallerAppletIdentityInfo(
+ Out<AppletIdentityInfo> out_identity_info) {
+ LOG_INFO(Service_AM, "called");
+ *out_identity_info = GetCallerIdentity(*m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetCallerAppletIdentityInfoStack(
+ Out<s32> out_count, OutArray<AppletIdentityInfo, BufferAttr_HipcMapAlias> out_identity_info) {
+ LOG_INFO(Service_AM, "called");
+
+ std::shared_ptr<Applet> applet = m_applet;
+ *out_count = 0;
+
+ do {
+ if (*out_count >= static_cast<s32>(out_identity_info.size())) {
+ break;
+ }
+ out_identity_info[(*out_count)++] = GetCallerIdentity(*applet);
+ } while ((applet = applet->caller_applet.lock()));
+
+ R_SUCCEED();
+ }
+
+ Result GetDesirableKeyboardLayout(Out<u32> out_desirable_layout) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+ *out_desirable_layout = 0;
+ R_SUCCEED();
+ }
+
+ Result ReportVisibleError(ErrorCode error_code) {
+ LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category,
+ error_code.number);
+ R_SUCCEED();
+ }
+
+ Result ReportVisibleErrorWithErrorContext(
+ ErrorCode error_code, InLargeData<ErrorContext, BufferAttr_HipcMapAlias> error_context) {
+ LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category,
+ error_code.number);
+ R_SUCCEED();
+ }
+
+ Result UnpopInData(SharedPointer<IStorage> storage) {
+ LOG_INFO(Service_AM, "called");
+ m_broker->GetInData().Unpop(system.Kernel(), storage);
+ R_SUCCEED();
+ }
+
+ Result GetMainAppletApplicationDesiredLanguage(
+ Out<u64> out_desired_language) {
+ // FIXME: this is copied from IApplicationFunctions::GetDesiredLanguage
+ // FIXME: all of this stuff belongs to ns
+ auto identity = GetCallerIdentity(*m_applet);
+
+ // TODO(bunnei): This should be configurable
+ LOG_DEBUG(Service_AM, "called");
+
+ // Get supported languages from NACP, if possible
+ // Default to 0 (all languages supported)
+ u32 supported_languages = 0;
+
+ const auto res = FileSys::PatchManager::GetMetadataFromBaseOrUpdate(system, identity.application_id);
+
+ if (res.first != nullptr) {
+ supported_languages = res.first->GetSupportedLanguages();
+ }
+
+ // Call IApplicationManagerInterface implementation.
+ auto& service_manager = system.ServiceManager();
+ auto ns_am2 = service_manager.GetService<NS::IServiceGetterInterface>("ns:am2");
+
+ std::shared_ptr<NS::IApplicationManagerInterface> app_man;
+ R_TRY(ns_am2->GetApplicationManagerInterface(&app_man));
+
+ // Get desired application language
+ NS::ApplicationLanguage desired_language{};
+ R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
+
+ // Convert to settings language code.
+ u64 language_code{};
+ R_TRY(app_man->ConvertApplicationLanguageToLanguageCode(&language_code, desired_language));
+
+ LOG_DEBUG(Service_AM, "got desired_language={:016X}", language_code);
+
+ *out_desired_language = language_code;
+ R_SUCCEED();
+ }
+
+ Result GetCurrentApplicationId(Out<u64> out_application_id) {
+ LOG_WARNING(Service_AM, "(STUBBED) called");
+
+ // TODO: this should be the main applet, not the caller applet
+ const auto main_applet = GetCallerIdentity(*m_applet);
+ *out_application_id = main_applet.application_id;
+
+ R_SUCCEED();
+ }
+
+ Result GetMainAppletAvailableUsers(
+ Out<bool> out_can_select_any_user, Out<s32> out_users_count,
+ OutArray<Common::UUID, BufferAttr_HipcMapAlias> out_users) {
+ const Service::Account::ProfileManager manager{};
+
+ *out_can_select_any_user = false;
+ *out_users_count = -1;
+
+ LOG_INFO(Service_AM, "called");
+
+ if (manager.GetUserCount() > 0) {
+ *out_can_select_any_user = true;
+ *out_users_count = static_cast<s32>(manager.GetUserCount());
+
+ const auto users = manager.GetAllUsers();
+ for (size_t i = 0; i < users.size() && i < out_users.size(); i++) {
+ out_users[i] = users[i];
+ }
+ }
+
+ R_SUCCEED();
+ }
+
+ Result ShouldSetGpuTimeSliceManually(
+ Out<bool> out_should_set_gpu_time_slice_manually) {
+ LOG_INFO(Service_AM, "(STUBBED) called");
+ *out_should_set_gpu_time_slice_manually = false;
+ R_SUCCEED();
+ }
+
+ Result GetLibraryAppletInfoEx(
+ Out<LibraryAppletInfo> out_library_applet_info) {
+ LOG_INFO(Service_AM, "called");
+ *out_library_applet_info = {
+ .applet_id = m_applet->applet_id,
+ .library_applet_mode = m_applet->library_applet_mode,
+ };
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ILibraryAppletSelfAccessor::PopInData>, "PopInData"},
+ FunctionInfo{1, D<&ILibraryAppletSelfAccessor::PushOutData>, "PushOutData"},
+ FunctionInfo{2, D<&ILibraryAppletSelfAccessor::PopInteractiveInData>, "PopInteractiveInData"},
+ FunctionInfo{3, D<&ILibraryAppletSelfAccessor::PushInteractiveOutData>, "PushInteractiveOutData"},
+ FunctionInfo{5, D<&ILibraryAppletSelfAccessor::GetPopInDataEvent>, "GetPopInDataEvent"},
+ FunctionInfo{6, D<&ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent>, "GetPopInteractiveInDataEvent"},
+ FunctionInfo{10, D<&ILibraryAppletSelfAccessor::ExitProcessAndReturn>, "ExitProcessAndReturn"},
+ FunctionInfo{11, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"},
+ FunctionInfo{12, D<&ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo>, "GetMainAppletIdentityInfo"},
+ FunctionInfo{13, D<&ILibraryAppletSelfAccessor::CanUseApplicationCore>, "CanUseApplicationCore"},
+ FunctionInfo{14, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo>, "GetCallerAppletIdentityInfo"},
+ FunctionInfo{15, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty>, "GetMainAppletApplicationControlProperty"},
+ FunctionInfo{16, D<&ILibraryAppletSelfAccessor::GetMainAppletStorageId>, "GetMainAppletStorageId"},
+ FunctionInfo{17, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack>, "GetCallerAppletIdentityInfoStack"},
+ FunctionInfo{18, nullptr, "GetNextReturnDestinationAppletIdentityInfo"},
+ FunctionInfo{19, D<&ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout>, "GetDesirableKeyboardLayout"},
+ FunctionInfo{20, nullptr, "PopExtraStorage"},
+ FunctionInfo{25, nullptr, "GetPopExtraStorageEvent"},
+ FunctionInfo{30, D<&ILibraryAppletSelfAccessor::UnpopInData>, "UnpopInData"},
+ FunctionInfo{31, nullptr, "UnpopExtraStorage"},
+ FunctionInfo{40, nullptr, "GetIndirectLayerProducerHandle"},
+ FunctionInfo{50, D<&ILibraryAppletSelfAccessor::ReportVisibleError>, "ReportVisibleError"},
+ FunctionInfo{51, D<&ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext>, "ReportVisibleErrorWithErrorContext"},
+ FunctionInfo{60, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage>, "GetMainAppletApplicationDesiredLanguage"},
+ FunctionInfo{70, D<&ILibraryAppletSelfAccessor::GetCurrentApplicationId>, "GetCurrentApplicationId"},
+ FunctionInfo{80, nullptr, "RequestExitToSelf"},
+ FunctionInfo{90, nullptr, "CreateApplicationAndPushAndRequestToLaunch"},
+ FunctionInfo{100, nullptr, "CreateGameMovieTrimmer"},
+ FunctionInfo{101, nullptr, "ReserveResourceForMovieOperation"},
+ FunctionInfo{102, nullptr, "UnreserveResourceForMovieOperation"},
+ FunctionInfo{110, D<&ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers>, "GetMainAppletAvailableUsers"},
+ FunctionInfo{120, nullptr, "GetLaunchStorageInfoForDebug"},
+ FunctionInfo{130, nullptr, "GetGpuErrorDetectedSystemEvent"},
+ FunctionInfo{140, nullptr, "SetApplicationMemoryReservation"},
+ FunctionInfo{150, D<&ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually>, "ShouldSetGpuTimeSliceManually"},
+ FunctionInfo{160, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx>, "GetLibraryAppletInfoEx"}
+ );
+ const std::shared_ptr<Applet> m_applet;
+ const std::shared_ptr<AppletDataBroker> m_broker;
+};
+
+class ILibraryAppletProxy final : public ServiceFramework<ILibraryAppletProxy> {
+public:
+ explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess* process, WindowSystem& window_system)
+ : ServiceFramework{system_, "ILibraryAppletProxy"},
+ m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
+ }
+ ~ILibraryAppletProxy() override = default;
+
+ Result GetAudioController(
+ Out<SharedPointer<IAudioController>> out_audio_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_audio_controller = std::make_shared<IAudioController>(system);
+ R_SUCCEED();
+ }
+
+ Result GetDisplayController(
+ Out<SharedPointer<IDisplayController>> out_display_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetDebugFunctions(
+ Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_debug_functions = std::make_shared<IDebugFunctions>(system);
+ R_SUCCEED();
+ }
+
+ Result GetWindowController(
+ Out<SharedPointer<IWindowController>> out_window_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetSelfController(
+ Out<SharedPointer<ISelfController>> out_self_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
+ R_SUCCEED();
+ }
+
+ Result GetCommonStateGetter(
+ Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_creator =
+ std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result OpenLibraryAppletSelfAccessor(
+ Out<SharedPointer<ILibraryAppletSelfAccessor>> out_library_applet_self_accessor) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_self_accessor =
+ std::make_shared<ILibraryAppletSelfAccessor>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetAppletCommonFunctions(
+ Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetHomeMenuFunctions(
+ Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_home_menu_functions =
+ std::make_shared<IHomeMenuFunctions>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetGlobalStateController(
+ Out<SharedPointer<IGlobalStateController>> out_global_state_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ILibraryAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
+ FunctionInfo{1, D<&ILibraryAppletProxy::GetSelfController>, "GetSelfController"},
+ FunctionInfo{2, D<&ILibraryAppletProxy::GetWindowController>, "GetWindowController"},
+ FunctionInfo{3, D<&ILibraryAppletProxy::GetAudioController>, "GetAudioController"},
+ FunctionInfo{4, D<&ILibraryAppletProxy::GetDisplayController>, "GetDisplayController"},
+ FunctionInfo{10, D<&ILibraryAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
+ FunctionInfo{11, D<&ILibraryAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
+ FunctionInfo{20, D<&ILibraryAppletProxy::OpenLibraryAppletSelfAccessor>, "OpenLibraryAppletSelfAccessor"},
+ FunctionInfo{21, D<&ILibraryAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
+ FunctionInfo{22, D<&ILibraryAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"},
+ FunctionInfo{23, D<&ILibraryAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
+ FunctionInfo{1000, D<&ILibraryAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}
+ );
+ WindowSystem& m_window_system;
+ Kernel::KProcess* const m_process;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+class IOverlayAppletProxy final : public ServiceFramework<IOverlayAppletProxy> {
+public:
+ explicit IOverlayAppletProxy(Core::System &system_, std::shared_ptr<Applet> applet,
+ Kernel::KProcess *process, WindowSystem &window_system)
+ : ServiceFramework{system_, "IOverlayAppletProxy"},
+ m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
+ }
+
+ ~IOverlayAppletProxy() override = default;
+
+ Result GetCommonStateGetter(
+ Out<SharedPointer<ICommonStateGetter> > out_common_state_getter) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetSelfController(
+ Out<SharedPointer<ISelfController> > out_self_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
+ R_SUCCEED();
+ }
+
+ Result GetWindowController(
+ Out<SharedPointer<IWindowController> > out_window_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetAudioController(
+ Out<SharedPointer<IAudioController> > out_audio_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_audio_controller = std::make_shared<IAudioController>(system);
+ R_SUCCEED();
+ }
+
+ Result GetDisplayController(
+ Out<SharedPointer<IDisplayController> > out_display_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetProcessWindingController(
+ Out<SharedPointer<IProcessWindingController> > out_process_winding_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetLibraryAppletCreator(
+ Out<SharedPointer<ILibraryAppletCreator> > out_library_applet_creator) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_library_applet_creator =
+ std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
+ R_SUCCEED();
+ }
+
+ Result GetOverlayFunctions(
+ Out<SharedPointer<IOverlayFunctions> > out_overlay_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_overlay_functions = std::make_shared<IOverlayFunctions>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetAppletCommonFunctions(
+ Out<SharedPointer<IAppletCommonFunctions> > out_applet_common_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
+ R_SUCCEED();
+ }
+
+ Result GetGlobalStateController(
+ Out<SharedPointer<IGlobalStateController> > out_global_state_controller) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
+ R_SUCCEED();
+ }
+
+ Result GetDebugFunctions(
+ Out<SharedPointer<IDebugFunctions> > out_debug_functions) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_debug_functions = std::make_shared<IDebugFunctions>(system);
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
+ FunctionInfo{1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"},
+ FunctionInfo{2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"},
+ FunctionInfo{3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"},
+ FunctionInfo{4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"},
+ FunctionInfo{10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
+ FunctionInfo{11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
+ FunctionInfo{20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"},
+ FunctionInfo{21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
+ FunctionInfo{23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
+ FunctionInfo{1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}
+ );
+ WindowSystem& m_window_system;
+ Kernel::KProcess* const m_process;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+static bool ShouldCreateGuestApplet(AppletId applet_id) {
+#define X(Name, name) \
+ if (applet_id == AppletId::Name && \
+ Settings::values.name##_applet_mode.GetValue() != Settings::AppletMode::LLE) { \
+ return false; \
+ }
+
+ X(Cabinet, cabinet)
+ X(Controller, controller)
+ X(DataErase, data_erase)
+ X(Error, error)
+ X(NetConnect, net_connect)
+ X(ProfileSelect, player_select)
+ X(SoftwareKeyboard, swkbd)
+ X(MiiEdit, mii_edit)
+ X(Web, web)
+ X(Shop, shop)
+ X(PhotoViewer, photo_viewer)
+ X(OfflineWeb, offline_web)
+ X(LoginShare, login_share)
+ X(WebAuth, wifi_web_auth)
+ X(MyPage, my_page)
+
+#undef X
+
+ return true;
+}
+
+static AppletProgramId AppletIdToProgramId(AppletId applet_id) {
+ switch (applet_id) {
+ case AppletId::OverlayDisplay:
+ return AppletProgramId::OverlayDisplay;
+ case AppletId::QLaunch:
+ return AppletProgramId::QLaunch;
+ case AppletId::Starter:
+ return AppletProgramId::Starter;
+ case AppletId::Auth:
+ return AppletProgramId::Auth;
+ case AppletId::Cabinet:
+ return AppletProgramId::Cabinet;
+ case AppletId::Controller:
+ return AppletProgramId::Controller;
+ case AppletId::DataErase:
+ return AppletProgramId::DataErase;
+ case AppletId::Error:
+ return AppletProgramId::Error;
+ case AppletId::NetConnect:
+ return AppletProgramId::NetConnect;
+ case AppletId::ProfileSelect:
+ return AppletProgramId::ProfileSelect;
+ case AppletId::SoftwareKeyboard:
+ return AppletProgramId::SoftwareKeyboard;
+ case AppletId::MiiEdit:
+ return AppletProgramId::MiiEdit;
+ case AppletId::Web:
+ return AppletProgramId::Web;
+ case AppletId::Shop:
+ return AppletProgramId::Shop;
+ case AppletId::PhotoViewer:
+ return AppletProgramId::PhotoViewer;
+ case AppletId::Settings:
+ return AppletProgramId::Settings;
+ case AppletId::OfflineWeb:
+ return AppletProgramId::OfflineWeb;
+ case AppletId::LoginShare:
+ return AppletProgramId::LoginShare;
+ case AppletId::WebAuth:
+ return AppletProgramId::WebAuth;
+ case AppletId::MyPage:
+ return AppletProgramId::MyPage;
+ default:
+ return static_cast<AppletProgramId>(0);
+ }
+}
+
+static std::shared_ptr<ILibraryAppletAccessor> CreateGuestApplet(Core::System& system,
+ WindowSystem& window_system,
+ std::shared_ptr<Applet> caller_applet,
+ AppletId applet_id,
+ LibraryAppletMode mode) {
+ const auto program_id = static_cast<u64>(AppletIdToProgramId(applet_id));
+ if (program_id == 0) {
+ // Unknown applet
+ return {};
+ }
+
+ auto process = CreateProcess(system, program_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR);
+ if (process) {
+ const auto applet = std::make_shared<Applet>(system, std::move(process), false);
+ applet->program_id = program_id;
+ applet->applet_id = applet_id;
+ applet->type = AppletType::LibraryApplet;
+ applet->library_applet_mode = mode;
+ applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden;
+
+ auto broker = std::make_shared<AppletDataBroker>(system);
+ applet->caller_applet = caller_applet;
+ applet->caller_applet_broker = broker;
+ {
+ std::scoped_lock lk{caller_applet->lock};
+ caller_applet->child_applets.push_back(applet);
+ }
+ window_system.TrackApplet(applet, false);
+ return std::make_shared<ILibraryAppletAccessor>(system, broker, applet);
+ }
+ // Couldn't initialize the guest process
+ return {};
+}
+
+static std::shared_ptr<ILibraryAppletAccessor> CreateFrontendApplet(Core::System& system,
+ WindowSystem& window_system,
+ std::shared_ptr<Applet> caller_applet,
+ AppletId applet_id,
+ LibraryAppletMode mode) {
+ const auto program_id = static_cast<u64>(AppletIdToProgramId(applet_id));
+
+ auto process = std::make_unique<Process>(system);
+ auto applet = std::make_shared<Applet>(system, std::move(process), false);
+ applet->program_id = program_id;
+ applet->applet_id = applet_id;
+ applet->type = AppletType::LibraryApplet;
+ applet->library_applet_mode = mode;
+
+ auto storage = std::make_shared<AppletDataBroker>(system);
+ applet->caller_applet = caller_applet;
+ applet->caller_applet_broker = storage;
+ applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode);
+ {
+ std::scoped_lock lk{caller_applet->lock};
+ caller_applet->child_applets.push_back(applet);
+ }
+ return std::make_shared<ILibraryAppletAccessor>(system, storage, applet);
+}
+
+class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> {
+public:
+ explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet, WindowSystem& window_system)
+ : ServiceFramework{system_, "ILibraryAppletCreator"}
+ , m_window_system{window_system}, m_applet{std::move(applet)} {
+ }
+ ~ILibraryAppletCreator() override = default;
+
+ Result CreateLibraryApplet(
+ Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
+ LibraryAppletMode library_applet_mode) {
+ LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={}", applet_id,
+ library_applet_mode);
+
+ std::shared_ptr<ILibraryAppletAccessor> library_applet;
+ if (ShouldCreateGuestApplet(applet_id)) {
+ library_applet =
+ CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
+ }
+ if (!library_applet) {
+ library_applet =
+ CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
+ }
+ if (!library_applet) {
+ LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id);
+ R_THROW(ResultUnknown);
+ }
+
+ // Applet is created, can now be launched.
+ m_applet->library_applet_launchable_event.Signal(system.Kernel());
+ *out_library_applet_accessor = library_applet;
+ R_SUCCEED();
+ }
+
+ Result CreateLibraryAppletEx(
+ Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
+ LibraryAppletMode library_applet_mode, u64 thread_id) {
+ LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={} thread_id={}", applet_id,
+ library_applet_mode, thread_id);
+
+ std::shared_ptr<ILibraryAppletAccessor> library_applet;
+ if (ShouldCreateGuestApplet(applet_id)) {
+ library_applet =
+ CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
+ }
+ if (!library_applet) {
+ library_applet =
+ CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
+ }
+ if (!library_applet) {
+ LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id);
+ R_THROW(ResultUnknown);
+ }
+
+ // Applet is created, can now be launched.
+ m_applet->library_applet_launchable_event.Signal(system.Kernel());
+ *out_library_applet_accessor = library_applet;
+ R_SUCCEED();
+ }
+
+ Result CreateStorage(Out<SharedPointer<IStorage>> out_storage, s64 size) {
+ LOG_DEBUG(Service_AM, "called, size={}", size);
+
+ if (size <= 0) {
+ LOG_ERROR(Service_AM, "size is less than or equal to 0");
+ R_THROW(ResultUnknown);
+ }
+
+ *out_storage = std::make_shared<IStorage>(system, AM::CreateStorage(std::vector<u8>(size)));
+ R_SUCCEED();
+ }
+
+ Result CreateTransferMemoryStorage(
+ Out<SharedPointer<IStorage>> out_storage, bool is_writable, s64 size,
+ InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
+ LOG_DEBUG(Service_AM, "called, is_writable={} size={}", is_writable, size);
+
+ if (size <= 0) {
+ LOG_ERROR(Service_AM, "size is less than or equal to 0");
+ R_THROW(ResultUnknown);
+ }
+
+ if (!transfer_memory_handle) {
+ LOG_ERROR(Service_AM, "transfer_memory_handle is null");
+ R_THROW(ResultUnknown);
+ }
+
+ *out_storage = std::make_shared<IStorage>(
+ system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(),
+ transfer_memory_handle.Get(), is_writable, size));
+ R_SUCCEED();
+ }
+
+ Result CreateHandleStorage(
+ Out<SharedPointer<IStorage>> out_storage, s64 size,
+ InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
+ LOG_DEBUG(Service_AM, "called, size={}", size);
+
+ if (size <= 0) {
+ LOG_ERROR(Service_AM, "size is less than or equal to 0");
+ R_THROW(ResultUnknown);
+ }
+
+ if (!transfer_memory_handle) {
+ LOG_ERROR(Service_AM, "transfer_memory_handle is null");
+ R_THROW(ResultUnknown);
+ }
+
+ *out_storage = std::make_shared<IStorage>(
+ system, AM::CreateHandleStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(),
+ transfer_memory_handle.Get(), size));
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"},
+ FunctionInfo{1, nullptr, "TerminateAllLibraryApplets"},
+ FunctionInfo{2, nullptr, "AreAnyLibraryAppletsLeft"},
+ FunctionInfo{3, D<&ILibraryAppletCreator::CreateLibraryAppletEx>, "CreateLibraryAppletEx"},
+ FunctionInfo{10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"},
+ FunctionInfo{11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"},
+ FunctionInfo{12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"}
+ );
+ WindowSystem& m_window_system;
+ const std::shared_ptr<Applet> m_applet;
+};
+
+class IAllSystemAppletProxiesService final
+ : public ServiceFramework<IAllSystemAppletProxiesService> {
+public:
+ explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system)
+ : ServiceFramework{system_, "appletAE"}, m_window_system{window_system} {
+ }
+
+ ~IAllSystemAppletProxiesService() override = default;
+
+ Result OpenSystemAppletProxy(
+ Out<SharedPointer<ISystemAppletProxy>> out_system_applet_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_DEBUG(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
+ *out_system_applet_proxy = std::make_shared<ISystemAppletProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+ }
+
+ Result OpenLibraryAppletProxy(
+ Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle,
+ InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute) {
+ LOG_DEBUG(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
+ *out_library_applet_proxy = std::make_shared<ILibraryAppletProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+ }
+
+ Result OpenOverlayAppletProxy(
+ Out<SharedPointer<IOverlayAppletProxy>> out_overlay_applet_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_WARNING(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
+ *out_overlay_applet_proxy = std::make_shared<IOverlayAppletProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+ }
+
+ Result OpenSystemApplicationProxy(
+ Out<SharedPointer<IApplicationProxy>> out_system_application_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_DEBUG(Service_AM, "called");
+
+ if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
+ *out_system_application_proxy = std::make_shared<IApplicationProxy>(
+ system, applet, process_handle.Get(), m_window_system);
+ R_SUCCEED();
+ } else {
+ UNIMPLEMENTED();
+ R_THROW(ResultUnknown);
+ }
+ }
+
+ Result OpenLibraryAppletProxyOld(
+ Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
+ InCopyHandle<Kernel::KProcess> process_handle) {
+ LOG_DEBUG(Service_AM, "called");
+
+ AppletAttribute attribute{};
+ R_RETURN(this->OpenLibraryAppletProxy(out_library_applet_proxy, pid, process_handle, attribute));
+ }
+
+ Result GetSystemProcessCommonFunctions() {
+ LOG_DEBUG(Service_AM, "(STUBBED) called.");
+ // TODO (jarrodnorwell)
+ R_SUCCEED();
+ }
+
+ Result GetAppletAlternativeFunctions() {
+ LOG_DEBUG(Service_AM, "(STUBBED) called.");
+ // TODO (maufeat)
+ R_SUCCEED();
+ }
+
+ std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId process_id) {
+ return m_window_system.GetByAppletResourceUserId(process_id.pid);
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"},
+ FunctionInfo{110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"},
+ FunctionInfo{200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"},
+ FunctionInfo{201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"},
+ FunctionInfo{300, D<&IAllSystemAppletProxiesService::OpenOverlayAppletProxy>, "OpenOverlayAppletProxy"},
+ FunctionInfo{350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"},
+ FunctionInfo{400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"},
+ FunctionInfo{410, nullptr, "GetSystemAppletControllerForDebug"},
+ FunctionInfo{450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions", MakeVersionGate({19,0,0})},
+ FunctionInfo{460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions", MakeVersionGate({20,0,0})},
+ FunctionInfo{1000, nullptr, "GetDebugFunctions"}
+ );
+ WindowSystem& m_window_system;
+};
+
void LoopProcess(Core::System& system) {
WindowSystem window_system(system);
ButtonPoller button_poller(system, window_system);
@@ -18,10 +1345,8 @@ void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
- server_manager->RegisterNamedService(
- "appletAE", std::make_shared<IAllSystemAppletProxiesService>(system, window_system));
- server_manager->RegisterNamedService(
- "appletOE", std::make_shared<IApplicationProxyService>(system, window_system));
+ server_manager->RegisterNamedService("appletAE", std::make_shared<IAllSystemAppletProxiesService>(system, window_system));
+ server_manager->RegisterNamedService("appletOE", std::make_shared<IApplicationProxyService>(system, window_system));
ServerManager::RunServer(std::move(server_manager));
}
diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp
deleted file mode 100644
index 437032c2f4..0000000000
--- a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/core.h"
-#include "core/hle/service/am/applet_manager.h"
-#include "core/hle/service/am/service/all_system_applet_proxies_service.h"
-#include "core/hle/service/am/service/application_proxy.h"
-#include "core/hle/service/am/service/library_applet_proxy.h"
-#include "core/hle/service/am/service/system_applet_proxy.h"
-#include "core/hle/service/am/service/overlay_applet_proxy.h"
-#include "core/hle/service/am/window_system.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::AM {
-
-IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(Core::System& system_,
- WindowSystem& window_system)
- : ServiceFramework{system_, "appletAE"}, m_window_system{window_system} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"},
- {110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"},
- {200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"},
- {201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"},
- {300, D<&IAllSystemAppletProxiesService::OpenOverlayAppletProxy>, "OpenOverlayAppletProxy"},
- {350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"},
- {400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"},
- {410, nullptr, "GetSystemAppletControllerForDebug"},
- {450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions"}, // 19.0.0+
- {460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions"}, // 20.0.0+
- {1000, nullptr, "GetDebugFunctions"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IAllSystemAppletProxiesService::~IAllSystemAppletProxiesService() = default;
-
-Result IAllSystemAppletProxiesService::OpenSystemAppletProxy(
- Out<SharedPointer<ISystemAppletProxy>> out_system_applet_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_DEBUG(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
- *out_system_applet_proxy = std::make_shared<ISystemAppletProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
-}
-
-Result IAllSystemAppletProxiesService::OpenLibraryAppletProxy(
- Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle,
- InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute) {
- LOG_DEBUG(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
- *out_library_applet_proxy = std::make_shared<ILibraryAppletProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
-}
-
-Result IAllSystemAppletProxiesService::OpenOverlayAppletProxy(
- Out<SharedPointer<IOverlayAppletProxy>> out_overlay_applet_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_WARNING(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
- *out_overlay_applet_proxy = std::make_shared<IOverlayAppletProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
-}
-
-Result IAllSystemAppletProxiesService::OpenSystemApplicationProxy(
- Out<SharedPointer<IApplicationProxy>> out_system_application_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_DEBUG(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid); applet) {
- *out_system_application_proxy = std::make_shared<IApplicationProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
-}
-
-Result IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld(
- Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_DEBUG(Service_AM, "called");
-
- AppletAttribute attribute{};
- R_RETURN(
- this->OpenLibraryAppletProxy(out_library_applet_proxy, pid, process_handle, attribute));
-}
-
-Result IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions() {
- LOG_DEBUG(Service_AM, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- R_SUCCEED();
-}
-
-Result IAllSystemAppletProxiesService::GetAppletAlternativeFunctions() {
- LOG_DEBUG(Service_AM, "(STUBBED) called.");
-
- // TODO (maufeat)
-
- R_SUCCEED();
-}
-
-std::shared_ptr<Applet> IAllSystemAppletProxiesService::GetAppletFromProcessId(
- ProcessId process_id) {
- return m_window_system.GetByAppletResourceUserId(process_id.pid);
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.h b/src/core/hle/service/am/service/all_system_applet_proxies_service.h
deleted file mode 100644
index 73cb8a09ac..0000000000
--- a/src/core/hle/service/am/service/all_system_applet_proxies_service.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-#include "core/hle/service/am/service/overlay_applet_proxy.h"
-
-namespace Service {
-
-namespace AM {
-
-struct Applet;
-struct AppletAttribute;
-class IApplicationProxy;
-class ILibraryAppletProxy;
-class ISystemAppletProxy;
-class WindowSystem;
-
-class IAllSystemAppletProxiesService final
- : public ServiceFramework<IAllSystemAppletProxiesService> {
-public:
- explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system);
- ~IAllSystemAppletProxiesService() override;
-
-private:
- Result OpenSystemAppletProxy(Out<SharedPointer<ISystemAppletProxy>> out_system_applet_proxy,
- ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle);
- Result OpenLibraryAppletProxy(Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy,
- ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle,
- InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute);
- Result OpenOverlayAppletProxy(Out<SharedPointer<IOverlayAppletProxy>> out_overlay_applet_proxy,
- ClientProcessId pid, InCopyHandle<Kernel::KProcess> process_handle);
- Result OpenLibraryAppletProxyOld(
- Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle);
- Result OpenSystemApplicationProxy(
- Out<SharedPointer<IApplicationProxy>> out_system_application_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle);
- Result GetSystemProcessCommonFunctions();
- Result GetAppletAlternativeFunctions();
-
-private:
- std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId pid);
-
- WindowSystem& m_window_system;
-};
-
-} // namespace AM
-} // namespace Service
diff --git a/src/core/hle/service/am/service/applet_common_functions.cpp b/src/core/hle/service/am/service/applet_common_functions.cpp
deleted file mode 100644
index 5ffec23b3e..0000000000
--- a/src/core/hle/service/am/service/applet_common_functions.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/core.h"
-#include "core/file_sys/common_funcs.h"
-#include "core/hle/service/am/applet.h"
-#include "core/hle/service/am/service/applet_common_functions.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::AM {
-
-IAppletCommonFunctions::IAppletCommonFunctions(Core::System& system_,
- std::shared_ptr<Applet> applet_)
- : ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetTerminateResult"},
- {10, nullptr, "ReadThemeStorage"},
- {11, nullptr, "WriteThemeStorage"},
- {20, nullptr, "PushToAppletBoundChannel"},
- {21, nullptr, "TryPopFromAppletBoundChannel"},
- {40, nullptr, "GetDisplayLogicalResolution"},
- {42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"},
- {50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"},
- {51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"},
- {52, nullptr, "IsHomeButtonShortPressedBlocked"},
- {60, nullptr, "IsVrModeCurtainRequired"},
- {61, nullptr, "IsSleepRequiredByHighTemperature"},
- {62, nullptr, "IsSleepRequiredByLowBattery"},
- {70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"},
- {80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"},
- {81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"},
- {90, nullptr, "OpenNamedChannelAsParent"},
- {91, nullptr, "OpenNamedChannelAsChild"},
- {100, nullptr, "SetApplicationCoreUsageMode"},
- {300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"},
- {310, nullptr, "IsSystemAppletHomeMenu"}, //19.0.0+
- {320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost"}, //19.0.0+
- {321, nullptr, "SetGpuTimeSliceBoostDueToApplication"}, //19.0.0+
- {350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350"} //20.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IAppletCommonFunctions::~IAppletCommonFunctions() = default;
-
-Result IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled(
- bool home_button_double_click_enabled) {
- LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}",
- home_button_double_click_enabled);
- R_SUCCEED();
-}
-
-Result IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled(
- Out<bool> out_home_button_double_click_enabled) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_home_button_double_click_enabled = false;
- R_SUCCEED();
-}
-
-Result IAppletCommonFunctions::SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) {
- LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width,
- height);
- std::scoped_lock lk{applet->lock};
- applet->display_magnification = Common::Rectangle<f32>{x, y, x + width, y + height};
- R_SUCCEED();
-}
-
-Result IAppletCommonFunctions::SetCpuBoostRequestPriority(s32 priority) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- std::scoped_lock lk{applet->lock};
- applet->cpu_boost_request_priority = priority;
- R_SUCCEED();
-}
-
-Result IAppletCommonFunctions::GetCurrentApplicationId(Out<u64> out_application_id) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID());
- R_SUCCEED();
-}
-
-Result IAppletCommonFunctions::SetGpuTimeSliceBoost(s64 time_span) {
- LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span);
- R_SUCCEED();
-}
-
-Result IAppletCommonFunctions::Unknown350(Out<u16> out_unknown) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_unknown = 0;
- R_SUCCEED();
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/applet_common_functions.h b/src/core/hle/service/am/service/applet_common_functions.h
deleted file mode 100644
index 696fcd5bd1..0000000000
--- a/src/core/hle/service/am/service/applet_common_functions.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::AM {
-
-struct Applet;
-
-class IAppletCommonFunctions final : public ServiceFramework<IAppletCommonFunctions> {
-public:
- explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr<Applet> applet_);
- ~IAppletCommonFunctions() override;
-
-private:
- Result SetHomeButtonDoubleClickEnabled(bool home_button_double_click_enabled);
- Result GetHomeButtonDoubleClickEnabled(Out<bool> out_home_button_double_click_enabled);
- Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height);
- Result SetCpuBoostRequestPriority(s32 priority);
- Result GetCurrentApplicationId(Out<u64> out_application_id);
- Result SetGpuTimeSliceBoost(s64 time_span);
- Result Unknown350(Out<u16> out_unknown);
-
- const std::shared_ptr<Applet> applet;
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/application_accessor.cpp b/src/core/hle/service/am/service/application_accessor.cpp
index f357871706..d24c2616dc 100644
--- a/src/core/hle/service/am/service/application_accessor.cpp
+++ b/src/core/hle/service/am/service/application_accessor.cpp
@@ -18,42 +18,42 @@
namespace Service::AM {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationAccessor::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IApplicationAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"},
+ FunctionInfo{1, nullptr, "IsCompleted"},
+ FunctionInfo{10, D<&IApplicationAccessor::Start>, "Start"},
+ FunctionInfo{20, D<&IApplicationAccessor::RequestExit>, "RequestExit"},
+ FunctionInfo{25, D<&IApplicationAccessor::Terminate>, "Terminate"},
+ FunctionInfo{30, D<&IApplicationAccessor::GetResult>, "GetResult"},
+ FunctionInfo{101, D<&IApplicationAccessor::RequestForApplicationToGetForeground>, "RequestForApplicationToGetForeground"},
+ FunctionInfo{110, nullptr, "TerminateAllLibraryApplets"},
+ FunctionInfo{111, nullptr, "AreAnyLibraryAppletsLeft"},
+ FunctionInfo{112, D<&IApplicationAccessor::GetCurrentLibraryApplet>, "GetCurrentLibraryApplet"},
+ FunctionInfo{120, nullptr, "GetApplicationId"},
+ FunctionInfo{121, D<&IApplicationAccessor::PushLaunchParameter>, "PushLaunchParameter"},
+ FunctionInfo{122, D<&IApplicationAccessor::GetApplicationControlProperty>, "GetApplicationControlProperty"},
+ FunctionInfo{123, nullptr, "GetApplicationLaunchProperty"},
+ FunctionInfo{124, nullptr, "GetApplicationLaunchRequestInfo"},
+ FunctionInfo{130, D<&IApplicationAccessor::SetUsers>, "SetUsers"},
+ FunctionInfo{131, D<&IApplicationAccessor::CheckRightsEnvironmentAvailable>, "CheckRightsEnvironmentAvailable"},
+ FunctionInfo{132, D<&IApplicationAccessor::GetNsRightsEnvironmentHandle>, "GetNsRightsEnvironmentHandle"},
+ FunctionInfo{140, nullptr, "GetDesirableUids"},
+ FunctionInfo{150, D<&IApplicationAccessor::ReportApplicationExitTimeout>, "ReportApplicationExitTimeout"},
+ FunctionInfo{160, nullptr, "SetApplicationAttribute"},
+ FunctionInfo{170, nullptr, "HasSaveDataAccessPermission"},
+ FunctionInfo{180, nullptr, "PushToFriendInvitationStorageChannel"},
+ FunctionInfo{190, nullptr, "PushToNotificationStorageChannel"},
+ FunctionInfo{200, nullptr, "RequestApplicationSoftReset"},
+ FunctionInfo{201, nullptr, "RestartApplicationTimer"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IApplicationAccessor::IApplicationAccessor(Core::System& system_, std::shared_ptr<Applet> applet,
WindowSystem& window_system)
: ServiceFramework{system_, "IApplicationAccessor"}, m_window_system(window_system),
m_applet(std::move(applet)) {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IApplicationAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"},
- {1, nullptr, "IsCompleted"},
- {10, D<&IApplicationAccessor::Start>, "Start"},
- {20, D<&IApplicationAccessor::RequestExit>, "RequestExit"},
- {25, D<&IApplicationAccessor::Terminate>, "Terminate"},
- {30, D<&IApplicationAccessor::GetResult>, "GetResult"},
- {101, D<&IApplicationAccessor::RequestForApplicationToGetForeground>, "RequestForApplicationToGetForeground"},
- {110, nullptr, "TerminateAllLibraryApplets"},
- {111, nullptr, "AreAnyLibraryAppletsLeft"},
- {112, D<&IApplicationAccessor::GetCurrentLibraryApplet>, "GetCurrentLibraryApplet"},
- {120, nullptr, "GetApplicationId"},
- {121, D<&IApplicationAccessor::PushLaunchParameter>, "PushLaunchParameter"},
- {122, D<&IApplicationAccessor::GetApplicationControlProperty>, "GetApplicationControlProperty"},
- {123, nullptr, "GetApplicationLaunchProperty"},
- {124, nullptr, "GetApplicationLaunchRequestInfo"},
- {130, D<&IApplicationAccessor::SetUsers>, "SetUsers"},
- {131, D<&IApplicationAccessor::CheckRightsEnvironmentAvailable>, "CheckRightsEnvironmentAvailable"},
- {132, D<&IApplicationAccessor::GetNsRightsEnvironmentHandle>, "GetNsRightsEnvironmentHandle"},
- {140, nullptr, "GetDesirableUids"},
- {150, D<&IApplicationAccessor::ReportApplicationExitTimeout>, "ReportApplicationExitTimeout"},
- {160, nullptr, "SetApplicationAttribute"},
- {170, nullptr, "HasSaveDataAccessPermission"},
- {180, nullptr, "PushToFriendInvitationStorageChannel"},
- {190, nullptr, "PushToNotificationStorageChannel"},
- {200, nullptr, "RequestApplicationSoftReset"},
- {201, nullptr, "RestartApplicationTimer"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IApplicationAccessor::~IApplicationAccessor() = default;
diff --git a/src/core/hle/service/am/service/application_accessor.h b/src/core/hle/service/am/service/application_accessor.h
index b9797bcc0a..57b222fc19 100644
--- a/src/core/hle/service/am/service/application_accessor.h
+++ b/src/core/hle/service/am/service/application_accessor.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -36,6 +39,7 @@ private:
Result GetNsRightsEnvironmentHandle(Out<u64> out_handle);
Result ReportApplicationExitTimeout();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
WindowSystem& m_window_system;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/application_creator.cpp b/src/core/hle/service/am/service/application_creator.cpp
index 4eb2f29e22..8d57f917fb 100644
--- a/src/core/hle/service/am/service/application_creator.cpp
+++ b/src/core/hle/service/am/service/application_creator.cpp
@@ -20,6 +20,16 @@
namespace Service::AM {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationCreator::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IApplicationCreator::CreateApplication>, "CreateApplication"},
+ FunctionInfo{1, nullptr, "PopLaunchRequestedApplication"},
+ FunctionInfo{10, D<&IApplicationCreator::CreateSystemApplication>, "CreateSystemApplication"},
+ FunctionInfo{100, nullptr, "PopFloatingApplicationForDevelopment"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
namespace {
Result CreateGuestApplication(SharedPointer<IApplicationAccessor>* out_application_accessor, Core::System& system, WindowSystem& window_system, u64 program_id) {
@@ -54,16 +64,6 @@ Result CreateGuestApplication(SharedPointer<IApplicationAccessor>* out_applicati
IApplicationCreator::IApplicationCreator(Core::System& system_, WindowSystem& window_system)
: ServiceFramework{system_, "IApplicationCreator"}, m_window_system{window_system} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IApplicationCreator::CreateApplication>, "CreateApplication"},
- {1, nullptr, "PopLaunchRequestedApplication"},
- {10, D<&IApplicationCreator::CreateSystemApplication>, "CreateSystemApplication"},
- {100, nullptr, "PopFloatingApplicationForDevelopment"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IApplicationCreator::~IApplicationCreator() = default;
diff --git a/src/core/hle/service/am/service/application_creator.h b/src/core/hle/service/am/service/application_creator.h
index 75975b9596..64434af542 100644
--- a/src/core/hle/service/am/service/application_creator.h
+++ b/src/core/hle/service/am/service/application_creator.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -24,6 +24,7 @@ private:
Result CreateApplication(Out<SharedPointer<IApplicationAccessor>>, u64 application_id);
Result CreateSystemApplication(Out<SharedPointer<IApplicationAccessor>>, u64 application_id);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
WindowSystem& m_window_system;
};
diff --git a/src/core/hle/service/am/service/application_functions.cpp b/src/core/hle/service/am/service/application_functions.cpp
index 90d292c4a2..4fda5eedd6 100644
--- a/src/core/hle/service/am/service/application_functions.cpp
+++ b/src/core/hle/service/am/service/application_functions.cpp
@@ -51,84 +51,85 @@ FileSys::PatchManager::Metadata GetApplicationMetadata(Core::System& system, u64
} // Anonymous namespace
-IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_ptr<Applet> applet)
- : ServiceFramework{system_, "IApplicationFunctions"}, m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, D<&IApplicationFunctions::PopLaunchParameter>, "PopLaunchParameter"},
- {10, nullptr, "CreateApplicationAndPushAndRequestToStart"},
- {11, nullptr, "CreateApplicationAndPushAndRequestToStartForQuest"},
- {12, D<&IApplicationFunctions::CreateApplicationAndRequestToStart>, "CreateApplicationAndRequestToStart"},
- {13, nullptr, "CreateApplicationAndRequestToStartForQuest"},
- {14, nullptr, "CreateApplicationWithAttributeAndPushAndRequestToStartForQuest"},
- {15, nullptr, "CreateApplicationWithAttributeAndRequestToStartForQuest"},
- {20, D<&IApplicationFunctions::EnsureSaveData>, "EnsureSaveData"},
- {21, D<&IApplicationFunctions::GetDesiredLanguage>, "GetDesiredLanguage"},
- {22, D<&IApplicationFunctions::SetTerminateResult>, "SetTerminateResult"},
- {23, D<&IApplicationFunctions::GetDisplayVersion>, "GetDisplayVersion"},
- {24, nullptr, "GetLaunchStorageInfoForDebug"},
- {25, D<&IApplicationFunctions::ExtendSaveData>, "ExtendSaveData"},
- {26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"},
- {27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"},
- {28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"},
- {29, D<&IApplicationFunctions::GetCacheStorageMax>, "GetCacheStorageMax"},
- {30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"},
- {31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"},
- {32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"},
- {33, D<&IApplicationFunctions::EndBlockingHomeButton>, "EndBlockingHomeButton"},
- {34, nullptr, "SelectApplicationLicense"},
- {35, nullptr, "GetDeviceSaveDataSizeMax"},
- {36, nullptr, "GetLimitedApplicationLicense"},
- {37, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
- {40, D<&IApplicationFunctions::NotifyRunning>, "NotifyRunning"},
- {50, D<&IApplicationFunctions::GetPseudoDeviceId>, "GetPseudoDeviceId"},
- {60, D<&IApplicationFunctions::SetMediaPlaybackStateForApplication>, "SetMediaPlaybackStateForApplication"},
- {65, D<&IApplicationFunctions::IsGamePlayRecordingSupported>, "IsGamePlayRecordingSupported"},
- {66, D<&IApplicationFunctions::InitializeGamePlayRecording>, "InitializeGamePlayRecording"},
- {67, D<&IApplicationFunctions::SetGamePlayRecordingState>, "SetGamePlayRecordingState"},
- {68, nullptr, "RequestFlushGamePlayingMovieForDebug"},
- {70, nullptr, "RequestToShutdown"},
- {71, nullptr, "RequestToReboot"},
- {72, nullptr, "RequestToSleep"},
- {80, nullptr, "ExitAndRequestToShowThanksMessage"},
- {90, D<&IApplicationFunctions::EnableApplicationCrashReport>, "EnableApplicationCrashReport"},
- {100, D<&IApplicationFunctions::InitializeApplicationCopyrightFrameBuffer>, "InitializeApplicationCopyrightFrameBuffer"},
- {101, D<&IApplicationFunctions::SetApplicationCopyrightImage>, "SetApplicationCopyrightImage"},
- {102, D<&IApplicationFunctions::SetApplicationCopyrightVisibility>, "SetApplicationCopyrightVisibility"},
- {110, D<&IApplicationFunctions::QueryApplicationPlayStatistics>, "QueryApplicationPlayStatistics"},
- {111, D<&IApplicationFunctions::QueryApplicationPlayStatisticsByUid>, "QueryApplicationPlayStatisticsByUid"},
- {120, D<&IApplicationFunctions::ExecuteProgram>, "ExecuteProgram"},
- {121, D<&IApplicationFunctions::ClearUserChannel>, "ClearUserChannel"},
- {122, D<&IApplicationFunctions::UnpopToUserChannel>, "UnpopToUserChannel"},
- {123, D<&IApplicationFunctions::GetPreviousProgramIndex>, "GetPreviousProgramIndex"},
- {124, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
- {130, D<&IApplicationFunctions::GetGpuErrorDetectedSystemEvent>, "GetGpuErrorDetectedSystemEvent"},
- {131, nullptr, "SetDelayTimeToAbortOnGpuError"},
- {140, D<&IApplicationFunctions::GetFriendInvitationStorageChannelEvent>, "GetFriendInvitationStorageChannelEvent"},
- {141, D<&IApplicationFunctions::TryPopFromFriendInvitationStorageChannel>, "TryPopFromFriendInvitationStorageChannel"},
- {150, D<&IApplicationFunctions::GetNotificationStorageChannelEvent>, "GetNotificationStorageChannelEvent"},
- {151, nullptr, "TryPopFromNotificationStorageChannel"},
- {160, D<&IApplicationFunctions::GetHealthWarningDisappearedSystemEvent>, "GetHealthWarningDisappearedSystemEvent"},
- {170, nullptr, "SetHdcpAuthenticationActivated"},
- {180, nullptr, "GetLaunchRequiredVersion"},
- {181, nullptr, "UpgradeLaunchRequiredVersion"},
- {190, nullptr, "SendServerMaintenanceOverlayNotification"},
- {200, nullptr, "GetLastApplicationExitReason"},
- {210, D<&IApplicationFunctions::GetUnknownEvent210>, "Unknown210"},
- {220, nullptr, "Unknown220"}, // [20.0.0+]
- {300, nullptr, "CreateMovieWriter"}, // [19.0.0+]
- {310, nullptr, "Unknown310"}, // [20.0.0+]
- {320, nullptr, "Unknown320"}, // [20.0.0+]
- {330, D<&IApplicationFunctions::Unknown330>, "Unknown330"}, // [20.0.0+]
- {500, nullptr, "StartContinuousRecordingFlushForDebug"},
- {1000, nullptr, "CreateMovieMaker"},
- {1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationFunctions::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, D<&IApplicationFunctions::PopLaunchParameter>, "PopLaunchParameter"},
+ FunctionInfo{10, nullptr, "CreateApplicationAndPushAndRequestToStart"},
+ FunctionInfo{11, nullptr, "CreateApplicationAndPushAndRequestToStartForQuest"},
+ FunctionInfo{12, D<&IApplicationFunctions::CreateApplicationAndRequestToStart>, "CreateApplicationAndRequestToStart"},
+ FunctionInfo{13, nullptr, "CreateApplicationAndRequestToStartForQuest"},
+ FunctionInfo{14, nullptr, "CreateApplicationWithAttributeAndPushAndRequestToStartForQuest"},
+ FunctionInfo{15, nullptr, "CreateApplicationWithAttributeAndRequestToStartForQuest"},
+ FunctionInfo{20, D<&IApplicationFunctions::EnsureSaveData>, "EnsureSaveData"},
+ FunctionInfo{21, D<&IApplicationFunctions::GetDesiredLanguage>, "GetDesiredLanguage"},
+ FunctionInfo{22, D<&IApplicationFunctions::SetTerminateResult>, "SetTerminateResult"},
+ FunctionInfo{23, D<&IApplicationFunctions::GetDisplayVersion>, "GetDisplayVersion"},
+ FunctionInfo{24, nullptr, "GetLaunchStorageInfoForDebug"},
+ FunctionInfo{25, D<&IApplicationFunctions::ExtendSaveData>, "ExtendSaveData"},
+ FunctionInfo{26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"},
+ FunctionInfo{27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"},
+ FunctionInfo{28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"},
+ FunctionInfo{29, D<&IApplicationFunctions::GetCacheStorageMax>, "GetCacheStorageMax"},
+ FunctionInfo{30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"},
+ FunctionInfo{31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"},
+ FunctionInfo{32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"},
+ FunctionInfo{33, D<&IApplicationFunctions::EndBlockingHomeButton>, "EndBlockingHomeButton"},
+ FunctionInfo{34, nullptr, "SelectApplicationLicense"},
+ FunctionInfo{35, nullptr, "GetDeviceSaveDataSizeMax"},
+ FunctionInfo{36, nullptr, "GetLimitedApplicationLicense"},
+ FunctionInfo{37, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
+ FunctionInfo{40, D<&IApplicationFunctions::NotifyRunning>, "NotifyRunning"},
+ FunctionInfo{50, D<&IApplicationFunctions::GetPseudoDeviceId>, "GetPseudoDeviceId"},
+ FunctionInfo{60, D<&IApplicationFunctions::SetMediaPlaybackStateForApplication>, "SetMediaPlaybackStateForApplication"},
+ FunctionInfo{65, D<&IApplicationFunctions::IsGamePlayRecordingSupported>, "IsGamePlayRecordingSupported"},
+ FunctionInfo{66, D<&IApplicationFunctions::InitializeGamePlayRecording>, "InitializeGamePlayRecording"},
+ FunctionInfo{67, D<&IApplicationFunctions::SetGamePlayRecordingState>, "SetGamePlayRecordingState"},
+ FunctionInfo{68, nullptr, "RequestFlushGamePlayingMovieForDebug"},
+ FunctionInfo{70, nullptr, "RequestToShutdown"},
+ FunctionInfo{71, nullptr, "RequestToReboot"},
+ FunctionInfo{72, nullptr, "RequestToSleep"},
+ FunctionInfo{80, nullptr, "ExitAndRequestToShowThanksMessage"},
+ FunctionInfo{90, D<&IApplicationFunctions::EnableApplicationCrashReport>, "EnableApplicationCrashReport"},
+ FunctionInfo{100, D<&IApplicationFunctions::InitializeApplicationCopyrightFrameBuffer>, "InitializeApplicationCopyrightFrameBuffer"},
+ FunctionInfo{101, D<&IApplicationFunctions::SetApplicationCopyrightImage>, "SetApplicationCopyrightImage"},
+ FunctionInfo{102, D<&IApplicationFunctions::SetApplicationCopyrightVisibility>, "SetApplicationCopyrightVisibility"},
+ FunctionInfo{110, D<&IApplicationFunctions::QueryApplicationPlayStatistics>, "QueryApplicationPlayStatistics"},
+ FunctionInfo{111, D<&IApplicationFunctions::QueryApplicationPlayStatisticsByUid>, "QueryApplicationPlayStatisticsByUid"},
+ FunctionInfo{120, D<&IApplicationFunctions::ExecuteProgram>, "ExecuteProgram"},
+ FunctionInfo{121, D<&IApplicationFunctions::ClearUserChannel>, "ClearUserChannel"},
+ FunctionInfo{122, D<&IApplicationFunctions::UnpopToUserChannel>, "UnpopToUserChannel"},
+ FunctionInfo{123, D<&IApplicationFunctions::GetPreviousProgramIndex>, "GetPreviousProgramIndex"},
+ FunctionInfo{124, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
+ FunctionInfo{130, D<&IApplicationFunctions::GetGpuErrorDetectedSystemEvent>, "GetGpuErrorDetectedSystemEvent"},
+ FunctionInfo{131, nullptr, "SetDelayTimeToAbortOnGpuError"},
+ FunctionInfo{140, D<&IApplicationFunctions::GetFriendInvitationStorageChannelEvent>, "GetFriendInvitationStorageChannelEvent"},
+ FunctionInfo{141, D<&IApplicationFunctions::TryPopFromFriendInvitationStorageChannel>, "TryPopFromFriendInvitationStorageChannel"},
+ FunctionInfo{150, D<&IApplicationFunctions::GetNotificationStorageChannelEvent>, "GetNotificationStorageChannelEvent"},
+ FunctionInfo{151, nullptr, "TryPopFromNotificationStorageChannel"},
+ FunctionInfo{160, D<&IApplicationFunctions::GetHealthWarningDisappearedSystemEvent>, "GetHealthWarningDisappearedSystemEvent"},
+ FunctionInfo{170, nullptr, "SetHdcpAuthenticationActivated"},
+ FunctionInfo{180, nullptr, "GetLaunchRequiredVersion"},
+ FunctionInfo{181, nullptr, "UpgradeLaunchRequiredVersion"},
+ FunctionInfo{190, nullptr, "SendServerMaintenanceOverlayNotification"},
+ FunctionInfo{200, nullptr, "GetLastApplicationExitReason"},
+ FunctionInfo{210, D<&IApplicationFunctions::GetUnknownEvent210>, "Unknown210"},
+ FunctionInfo{220, nullptr, "Unknown220"}, // [20.0.0+]
+ FunctionInfo{300, nullptr, "CreateMovieWriter"}, // [19.0.0+]
+ FunctionInfo{310, nullptr, "Unknown310"}, // [20.0.0+]
+ FunctionInfo{320, nullptr, "Unknown320"}, // [20.0.0+]
+ FunctionInfo{330, D<&IApplicationFunctions::Unknown330>, "Unknown330"}, // [20.0.0+]
+ FunctionInfo{500, nullptr, "StartContinuousRecordingFlushForDebug"},
+ FunctionInfo{1000, nullptr, "CreateMovieMaker"},
+ FunctionInfo{1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
}
+IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_ptr<Applet> applet)
+ : ServiceFramework{system_, "IApplicationFunctions"}
+ , m_applet{std::move(applet)}
+{}
+
IApplicationFunctions::~IApplicationFunctions() = default;
Result IApplicationFunctions::PopLaunchParameter(Out<SharedPointer<IStorage>> out_storage,
diff --git a/src/core/hle/service/am/service/application_functions.h b/src/core/hle/service/am/service/application_functions.h
index b97ed7e25e..7093d13f82 100644
--- a/src/core/hle/service/am/service/application_functions.h
+++ b/src/core/hle/service/am/service/application_functions.h
@@ -84,6 +84,7 @@ private:
Result GetUnknownEvent210(OutCopyHandle<Kernel::KReadableEvent> out_event);
Result Unknown330(Out<u8> out);
Result PrepareForJit();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/application_proxy.cpp b/src/core/hle/service/am/service/application_proxy.cpp
deleted file mode 100644
index 6e1328fee7..0000000000
--- a/src/core/hle/service/am/service/application_proxy.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/am/service/applet_common_functions.h"
-#include "core/hle/service/am/service/application_functions.h"
-#include "core/hle/service/am/service/application_proxy.h"
-#include "core/hle/service/am/service/audio_controller.h"
-#include "core/hle/service/am/service/common_state_getter.h"
-#include "core/hle/service/am/service/debug_functions.h"
-#include "core/hle/service/am/service/display_controller.h"
-#include "core/hle/service/am/service/library_applet_creator.h"
-#include "core/hle/service/am/service/process_winding_controller.h"
-#include "core/hle/service/am/service/self_controller.h"
-#include "core/hle/service/am/service/window_controller.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::AM {
-
-IApplicationProxy::IApplicationProxy(Core::System& system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess* process, WindowSystem& window_system)
- : ServiceFramework{system_, "IApplicationProxy"},
- m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IApplicationProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
- {1, D<&IApplicationProxy::GetSelfController>, "GetSelfController"},
- {2, D<&IApplicationProxy::GetWindowController>, "GetWindowController"},
- {3, D<&IApplicationProxy::GetAudioController>, "GetAudioController"},
- {4, D<&IApplicationProxy::GetDisplayController>, "GetDisplayController"},
- {10, D<&IApplicationProxy::GetProcessWindingController>, "GetProcessWindingController"},
- {11, D<&IApplicationProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
- {20, D<&IApplicationProxy::GetApplicationFunctions>, "GetApplicationFunctions"},
- {1000, D<&IApplicationProxy::GetDebugFunctions>, "GetDebugFunctions"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IApplicationProxy::~IApplicationProxy() = default;
-
-Result IApplicationProxy::GetAudioController(
- Out<SharedPointer<IAudioController>> out_audio_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_audio_controller = std::make_shared<IAudioController>(system);
- R_SUCCEED();
-}
-
-Result IApplicationProxy::GetDisplayController(
- Out<SharedPointer<IDisplayController>> out_display_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
- R_SUCCEED();
-}
-
-Result IApplicationProxy::GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
- R_SUCCEED();
-}
-
-Result IApplicationProxy::GetDebugFunctions(
- Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_debug_functions = std::make_shared<IDebugFunctions>(system);
- R_SUCCEED();
-}
-
-Result IApplicationProxy::GetWindowController(
- Out<SharedPointer<IWindowController>> out_window_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
- R_SUCCEED();
-}
-
-Result IApplicationProxy::GetSelfController(
- Out<SharedPointer<ISelfController>> out_self_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
- R_SUCCEED();
-}
-
-Result IApplicationProxy::GetCommonStateGetter(
- Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
- LOG_DEBUG(Service_AM, "called");
- *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
- R_SUCCEED();
-}
-
-Result IApplicationProxy::GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_creator =
- std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
- R_SUCCEED();
-}
-
-Result IApplicationProxy::GetApplicationFunctions(
- Out<SharedPointer<IApplicationFunctions>> out_application_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_application_functions = std::make_shared<IApplicationFunctions>(system, m_applet);
- R_SUCCEED();
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/application_proxy.h b/src/core/hle/service/am/service/application_proxy.h
deleted file mode 100644
index 8c62459c45..0000000000
--- a/src/core/hle/service/am/service/application_proxy.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::AM {
-
-struct Applet;
-class IAudioController;
-class IApplicationFunctions;
-class ICommonStateGetter;
-class IDebugFunctions;
-class IDisplayController;
-class ILibraryAppletCreator;
-class IProcessWindingController;
-class ISelfController;
-class IWindowController;
-class WindowSystem;
-
-class IApplicationProxy final : public ServiceFramework<IApplicationProxy> {
-public:
- explicit IApplicationProxy(Core::System& system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess* process, WindowSystem& window_system);
- ~IApplicationProxy();
-
-private:
- Result GetAudioController(Out<SharedPointer<IAudioController>> out_audio_controller);
- Result GetDisplayController(Out<SharedPointer<IDisplayController>> out_display_controller);
- Result GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller);
- Result GetDebugFunctions(Out<SharedPointer<IDebugFunctions>> out_debug_functions);
- Result GetWindowController(Out<SharedPointer<IWindowController>> out_window_controller);
- Result GetSelfController(Out<SharedPointer<ISelfController>> out_self_controller);
- Result GetCommonStateGetter(Out<SharedPointer<ICommonStateGetter>> out_common_state_getter);
- Result GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator);
- Result GetApplicationFunctions(
- Out<SharedPointer<IApplicationFunctions>> out_application_functions);
-
-private:
- WindowSystem& m_window_system;
- Kernel::KProcess* const m_process;
- const std::shared_ptr<Applet> m_applet;
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/application_proxy_service.cpp b/src/core/hle/service/am/service/application_proxy_service.cpp
deleted file mode 100644
index b7d7b3c2d9..0000000000
--- a/src/core/hle/service/am/service/application_proxy_service.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/core.h"
-#include "core/hle/service/am/am.h"
-#include "core/hle/service/am/applet_manager.h"
-#include "core/hle/service/am/service/application_proxy.h"
-#include "core/hle/service/am/service/application_proxy_service.h"
-#include "core/hle/service/am/window_system.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::AM {
-
-IApplicationProxyService::IApplicationProxyService(Core::System& system_,
- WindowSystem& window_system)
- : ServiceFramework{system_, "appletOE"}, m_window_system{window_system} {
- static const FunctionInfo functions[] = {
- {0, D<&IApplicationProxyService::OpenApplicationProxy>, "OpenApplicationProxy"},
- };
- RegisterHandlers(functions);
-}
-
-IApplicationProxyService::~IApplicationProxyService() = default;
-
-Result IApplicationProxyService::OpenApplicationProxy(
- Out<SharedPointer<IApplicationProxy>> out_application_proxy, ClientProcessId pid,
- InCopyHandle<Kernel::KProcess> process_handle) {
- LOG_DEBUG(Service_AM, "called");
-
- if (const auto applet = this->GetAppletFromProcessId(pid)) {
- *out_application_proxy = std::make_shared<IApplicationProxy>(
- system, applet, process_handle.Get(), m_window_system);
- R_SUCCEED();
- } else {
- UNIMPLEMENTED();
- R_THROW(ResultUnknown);
- }
-}
-
-std::shared_ptr<Applet> IApplicationProxyService::GetAppletFromProcessId(ProcessId process_id) {
- return m_window_system.GetByAppletResourceUserId(process_id.pid);
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/application_proxy_service.h b/src/core/hle/service/am/service/application_proxy_service.h
deleted file mode 100644
index e5f4ea345b..0000000000
--- a/src/core/hle/service/am/service/application_proxy_service.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service {
-
-namespace AM {
-
-struct Applet;
-class IApplicationProxy;
-class WindowSystem;
-
-class IApplicationProxyService final : public ServiceFramework<IApplicationProxyService> {
-public:
- explicit IApplicationProxyService(Core::System& system_, WindowSystem& window_system);
- ~IApplicationProxyService() override;
-
-private:
- Result OpenApplicationProxy(Out<SharedPointer<IApplicationProxy>> out_application_proxy,
- ClientProcessId pid, InCopyHandle<Kernel::KProcess> process_handle);
-
-private:
- std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId pid);
-
- WindowSystem& m_window_system;
-};
-
-} // namespace AM
-} // namespace Service
diff --git a/src/core/hle/service/am/service/audio_controller.cpp b/src/core/hle/service/am/service/audio_controller.cpp
index f627b1df0e..2c8494e056 100644
--- a/src/core/hle/service/am/service/audio_controller.cpp
+++ b/src/core/hle/service/am/service/audio_controller.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -9,20 +9,20 @@
namespace Service::AM {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAudioController::SetExpectedMasterVolume>, "SetExpectedMasterVolume"},
+ FunctionInfo{1, D<&IAudioController::GetMainAppletExpectedMasterVolume>, "GetMainAppletExpectedMasterVolume"},
+ FunctionInfo{2, D<&IAudioController::GetLibraryAppletExpectedMasterVolume>, "GetLibraryAppletExpectedMasterVolume"},
+ FunctionInfo{3, D<&IAudioController::ChangeMainAppletMasterVolume>, "ChangeMainAppletMasterVolume"},
+ FunctionInfo{4, D<&IAudioController::SetTransparentVolumeRate>, "SetTransparentVolumeRate"},
+ FunctionInfo{5, nullptr, "Unknown5", MakeVersionGate({20,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAudioController::IAudioController(Core::System& system_)
: ServiceFramework{system_, "IAudioController"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IAudioController::SetExpectedMasterVolume>, "SetExpectedMasterVolume"},
- {1, D<&IAudioController::GetMainAppletExpectedMasterVolume>, "GetMainAppletExpectedMasterVolume"},
- {2, D<&IAudioController::GetLibraryAppletExpectedMasterVolume>, "GetLibraryAppletExpectedMasterVolume"},
- {3, D<&IAudioController::ChangeMainAppletMasterVolume>, "ChangeMainAppletMasterVolume"},
- {4, D<&IAudioController::SetTransparentVolumeRate>, "SetTransparentVolumeRate"},
- {5, nullptr, "Unknown5"}, //20.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IAudioController::~IAudioController() = default;
diff --git a/src/core/hle/service/am/service/audio_controller.h b/src/core/hle/service/am/service/audio_controller.h
index 4b0f3f9aed..9cdb33820d 100644
--- a/src/core/hle/service/am/service/audio_controller.h
+++ b/src/core/hle/service/am/service/audio_controller.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -20,6 +23,7 @@ private:
Result ChangeMainAppletMasterVolume(f32 volume, s64 fade_time_ns);
Result SetTransparentVolumeRate(f32 transparent_volume_rate);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
static constexpr float MinAllowedVolume = 0.0f;
static constexpr float MaxAllowedVolume = 1.0f;
diff --git a/src/core/hle/service/am/service/common_state_getter.cpp b/src/core/hle/service/am/service/common_state_getter.cpp
index 044929e434..6a6a51f42e 100644
--- a/src/core/hle/service/am/service/common_state_getter.cpp
+++ b/src/core/hle/service/am/service/common_state_getter.cpp
@@ -8,7 +8,6 @@
#include "core/hle/service/am/am_results.h"
#include "core/hle/service/am/applet.h"
#include "core/hle/service/am/service/common_state_getter.h"
-#include "core/hle/service/am/service/lock_accessor.h"
#include "core/hle/service/am/service/storage.h"
#include "core/hle/service/apm/apm_interface.h"
#include "core/hle/service/cmif_serialization.h"
@@ -18,77 +17,147 @@
namespace Service::AM {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ICommonStateGetter::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ICommonStateGetter::GetEventHandle>, "GetEventHandle"},
+ FunctionInfo{1, D<&ICommonStateGetter::ReceiveMessage>, "ReceiveMessage"},
+ FunctionInfo{2, nullptr, "GetThisAppletKind"},
+ FunctionInfo{3, nullptr, "AllowToEnterSleep"},
+ FunctionInfo{4, nullptr, "DisallowToEnterSleep"},
+ FunctionInfo{5, D<&ICommonStateGetter::GetOperationMode>, "GetOperationMode"},
+ FunctionInfo{6, D<&ICommonStateGetter::GetPerformanceMode>, "GetPerformanceMode"},
+ FunctionInfo{7, nullptr, "GetCradleStatus"},
+ FunctionInfo{8, D<&ICommonStateGetter::GetBootMode>, "GetBootMode"},
+ FunctionInfo{9, D<&ICommonStateGetter::GetCurrentFocusState>, "GetCurrentFocusState"},
+ FunctionInfo{10, D<&ICommonStateGetter::RequestToAcquireSleepLock>, "RequestToAcquireSleepLock"},
+ FunctionInfo{11, D<&ICommonStateGetter::ReleaseSleepLock>, "ReleaseSleepLock"},
+ FunctionInfo{12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"},
+ FunctionInfo{13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"},
+ FunctionInfo{14, nullptr, "GetWakeupCount", MakeVersionGate({11,0,0})},
+ FunctionInfo{15, nullptr, "Unknown15", MakeVersionGate({19,0,0})},
+ FunctionInfo{20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"},
+ FunctionInfo{30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"},
+ FunctionInfo{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx", MakeVersionGate({2,0,0})},
+ FunctionInfo{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx", MakeVersionGate({7,0,0})},
+ FunctionInfo{40, nullptr, "GetCradleFwVersion", MakeVersionGate({2,0,0})},
+ FunctionInfo{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled", MakeVersionGate({3,0,0})},
+ FunctionInfo{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled", MakeVersionGate({3,0,0})},
+ FunctionInfo{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled", MakeVersionGate({4,0,0})},
+ FunctionInfo{53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx", MakeVersionGate({7,0,0})},
+ FunctionInfo{54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx", MakeVersionGate({7,0,0})},
+ FunctionInfo{55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection", MakeVersionGate({3,0,0})},
+ FunctionInfo{59, nullptr, "SetVrPositionForDebug", MakeVersionGate({1,0,0})},
+ FunctionInfo{60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"},
+ FunctionInfo{61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"},
+ FunctionInfo{62, D<&ICommonStateGetter::GetHdcpAuthenticationState>, "GetHdcpAuthenticationState"},
+ FunctionInfo{63, D<&ICommonStateGetter::GetHdcpAuthenticationStateChangeEvent>, "GetHdcpAuthenticationStateChangeEvent"},
+ FunctionInfo{64, nullptr, "SetTvPowerStateMatchingMode"},
+ FunctionInfo{65, nullptr, "GetApplicationIdByContentActionName"},
+ FunctionInfo{66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"},
+ FunctionInfo{67, nullptr, "CancelCpuBoostMode"},
+ FunctionInfo{68, D<&ICommonStateGetter::GetBuiltInDisplayType>, "GetBuiltInDisplayType"},
+ FunctionInfo{80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"},
+ FunctionInfo{90, nullptr, "SetPerformanceConfigurationChangedNotification"},
+ FunctionInfo{91, nullptr, "GetCurrentPerformanceConfiguration"},
+ FunctionInfo{100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
+ FunctionInfo{110, nullptr, "OpenMyGpuErrorHandler"},
+ FunctionInfo{120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory", MakeVersionGate({13,0,0})},
+ FunctionInfo{130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage", MakeVersionGate({21,0,0})},
+ FunctionInfo{200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"},
+ FunctionInfo{300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"},
+ FunctionInfo{400, nullptr, "ActivateMigrationService"},
+ FunctionInfo{401, nullptr, "DeactivateMigrationService"},
+ FunctionInfo{500, nullptr, "DisableSleepTillShutdown"},
+ FunctionInfo{501, nullptr, "SuppressDisablingSleepTemporarily"},
+ FunctionInfo{502, nullptr, "IsSleepEnabled"},
+ FunctionInfo{503, nullptr, "IsDisablingSleepSuppressed"},
+ FunctionInfo{600, nullptr, "SetHidInputMagnificationForApplication", MakeVersionGate({20,0,0})},
+ FunctionInfo{610, D<&ICommonStateGetter::Unknown610>, "Unknown610", MakeVersionGate({21,0,0})},
+ FunctionInfo{611, D<&ICommonStateGetter::Unknown611>, "Unknown611", MakeVersionGate({22,0,0})},
+ FunctionInfo{900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled", MakeVersionGate({11,0,0})},
+ FunctionInfo{910, nullptr, "GetLaunchRequiredTick", MakeVersionGate({17,0,0})},
+ FunctionInfo{1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d", MakeVersionGate({19,0,0})},
+ FunctionInfo{1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d", MakeVersionGate({19,0,0})},
+ FunctionInfo{1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d", MakeVersionGate({19,0,0})},
+ FunctionInfo{1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport", MakeVersionGate({21,0,0})},
+ FunctionInfo{1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle", MakeVersionGate({21,0,0})},
+ FunctionInfo{1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle", MakeVersionGate({21,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
+class ILockAccessor final : public ServiceFramework<ILockAccessor> {
+public:
+ explicit ILockAccessor(Core::System& system_)
+ : ServiceFramework{system_, "ILockAccessor"}, m_context{system_, "ILockAccessor"},
+ m_event{m_context} {
+ m_event.Signal(system.Kernel());
+ }
+ ~ILockAccessor() override = default;
+
+ Result TryLock(Out<bool> out_is_locked, OutCopyHandle<Kernel::KReadableEvent> out_handle, bool return_handle) {
+ LOG_INFO(Service_AM, "called, return_handle={}", return_handle);
+
+ {
+ std::scoped_lock lk{m_mutex};
+ if (m_is_locked) {
+ *out_is_locked = false;
+ } else {
+ m_is_locked = true;
+ *out_is_locked = true;
+ }
+ }
+
+ if (return_handle) {
+ *out_handle = m_event.GetHandle();
+ }
+
+ R_SUCCEED();
+ }
+
+ Result Unlock() {
+ LOG_INFO(Service_AM, "called");
+
+ {
+ std::scoped_lock lk{m_mutex};
+ m_is_locked = false;
+ }
+
+ m_event.Signal(system.Kernel());
+ R_SUCCEED();
+ }
+
+ Result GetEvent(OutCopyHandle<Kernel::KReadableEvent> out_handle) {
+ LOG_INFO(Service_AM, "called");
+ *out_handle = m_event.GetHandle();
+ R_SUCCEED();
+ }
+
+ Result IsLocked(Out<bool> out_is_locked) {
+ LOG_INFO(Service_AM, "called");
+ std::scoped_lock lk{m_mutex};
+ *out_is_locked = m_is_locked;
+ R_SUCCEED();
+ }
+
+private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, D<&ILockAccessor::TryLock>, "TryLock"},
+ FunctionInfo{2, D<&ILockAccessor::Unlock>, "Unlock"},
+ FunctionInfo{3, D<&ILockAccessor::GetEvent>, "GetEvent"},
+ FunctionInfo{4, D<&ILockAccessor::IsLocked>, "IsLocked"}
+ );
+ KernelHelpers::ServiceContext m_context;
+ Event m_event;
+ std::mutex m_mutex{};
+ bool m_is_locked{};
+};
+
ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr<Applet> applet)
: ServiceFramework{system_, "ICommonStateGetter"}, m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ICommonStateGetter::GetEventHandle>, "GetEventHandle"},
- {1, D<&ICommonStateGetter::ReceiveMessage>, "ReceiveMessage"},
- {2, nullptr, "GetThisAppletKind"},
- {3, nullptr, "AllowToEnterSleep"},
- {4, nullptr, "DisallowToEnterSleep"},
- {5, D<&ICommonStateGetter::GetOperationMode>, "GetOperationMode"},
- {6, D<&ICommonStateGetter::GetPerformanceMode>, "GetPerformanceMode"},
- {7, nullptr, "GetCradleStatus"},
- {8, D<&ICommonStateGetter::GetBootMode>, "GetBootMode"},
- {9, D<&ICommonStateGetter::GetCurrentFocusState>, "GetCurrentFocusState"},
- {10, D<&ICommonStateGetter::RequestToAcquireSleepLock>, "RequestToAcquireSleepLock"},
- {11, D<&ICommonStateGetter::ReleaseSleepLock>, "ReleaseSleepLock"},
- {12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"},
- {13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"},
- {14, nullptr, "GetWakeupCount"}, //11.0.0+
- {15, nullptr, "Unknown15"}, //19.0.0+
- {20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"},
- {30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"},
- {31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"}, //2.0.0+
- {32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"}, //7.0.0+
- {40, nullptr, "GetCradleFwVersion"}, //2.0.0+
- {50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"}, //3.0.0+
- {51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"}, //3.0.0+
- {52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"}, //4.0.0+
- {53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx"}, //7.0.0+
- {54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx"}, //7.0.0+
- {55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection"}, //3.0.0+
- {59, nullptr, "SetVrPositionForDebug"}, //1.0.0+
- {60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"},
- {61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"},
- {62, D<&ICommonStateGetter::GetHdcpAuthenticationState>, "GetHdcpAuthenticationState"},
- {63, D<&ICommonStateGetter::GetHdcpAuthenticationStateChangeEvent>, "GetHdcpAuthenticationStateChangeEvent"},
- {64, nullptr, "SetTvPowerStateMatchingMode"},
- {65, nullptr, "GetApplicationIdByContentActionName"},
- {66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"},
- {67, nullptr, "CancelCpuBoostMode"},
- {68, D<&ICommonStateGetter::GetBuiltInDisplayType>, "GetBuiltInDisplayType"},
- {80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"},
- {90, nullptr, "SetPerformanceConfigurationChangedNotification"},
- {91, nullptr, "GetCurrentPerformanceConfiguration"},
- {100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
- {110, nullptr, "OpenMyGpuErrorHandler"},
- {120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory"}, //13.0.0+
- {130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage"}, //21.0.0+
- {200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"},
- {300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"},
- {400, nullptr, "ActivateMigrationService"},
- {401, nullptr, "DeactivateMigrationService"},
- {500, nullptr, "DisableSleepTillShutdown"},
- {501, nullptr, "SuppressDisablingSleepTemporarily"},
- {502, nullptr, "IsSleepEnabled"},
- {503, nullptr, "IsDisablingSleepSuppressed"},
- {600, nullptr, "SetHidInputMagnificationForApplication"}, //20.0.0+
- {610, D<&ICommonStateGetter::Unknown610>, "Unknown610"}, //21.0.0+
- {611, D<&ICommonStateGetter::Unknown611>, "Unknown611"}, //22.0.0+
- {900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled"}, //11.0.0+
- {910, nullptr, "GetLaunchRequiredTick"}, //17.0.0+
- {1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d"}, //19.0.0+
- {1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d"}, //19.0.0+
- {1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d"}, //19.0.0+
- {1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport"}, //21.0.0+
- {1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle"}, //21.0.0+
- {1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle"}, //21.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ICommonStateGetter::~ICommonStateGetter() = default;
diff --git a/src/core/hle/service/am/service/common_state_getter.h b/src/core/hle/service/am/service/common_state_getter.h
index da86b5d079..ad782ca48e 100644
--- a/src/core/hle/service/am/service/common_state_getter.h
+++ b/src/core/hle/service/am/service/common_state_getter.h
@@ -76,6 +76,7 @@ private:
void SetCpuBoostMode(HLERequestContext& ctx);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/cradle_firmware_updater.cpp b/src/core/hle/service/am/service/cradle_firmware_updater.cpp
index 0a8af0858d..a8097ea209 100644
--- a/src/core/hle/service/am/service/cradle_firmware_updater.cpp
+++ b/src/core/hle/service/am/service/cradle_firmware_updater.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -6,22 +9,21 @@
namespace Service::AM {
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> ICradleFirmwareUpdater::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ICradleFirmwareUpdater::StartUpdate>, "StartUpdate"},
+ FunctionInfo{1, D<&ICradleFirmwareUpdater::FinishUpdate>, "FinishUpdate"},
+ FunctionInfo{2, D<&ICradleFirmwareUpdater::GetCradleDeviceInfo>, "GetCradleDeviceInfo"},
+ FunctionInfo{3, D<&ICradleFirmwareUpdater::GetCradleDeviceInfoChangeEvent>, "GetCradleDeviceInfoChangeEvent"},
+ FunctionInfo{4, nullptr, "GetUpdateProgressInfo"},
+ FunctionInfo{5, nullptr, "GetLastInternalResult"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
ICradleFirmwareUpdater::ICradleFirmwareUpdater(Core::System& system_)
: ServiceFramework{system_, "ICradleFirmwareUpdater"},
m_context{system, "ICradleFirmwareUpdater"}, m_cradle_device_info_event{m_context} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ICradleFirmwareUpdater::StartUpdate>, "StartUpdate"},
- {1, D<&ICradleFirmwareUpdater::FinishUpdate>, "FinishUpdate"},
- {2, D<&ICradleFirmwareUpdater::GetCradleDeviceInfo>, "GetCradleDeviceInfo"},
- {3, D<&ICradleFirmwareUpdater::GetCradleDeviceInfoChangeEvent>, "GetCradleDeviceInfoChangeEvent"},
- {4, nullptr, "GetUpdateProgressInfo"},
- {5, nullptr, "GetLastInternalResult"},
-
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ICradleFirmwareUpdater::~ICradleFirmwareUpdater() = default;
diff --git a/src/core/hle/service/am/service/cradle_firmware_updater.h b/src/core/hle/service/am/service/cradle_firmware_updater.h
index 3e803f0ae9..f8e4b93b27 100644
--- a/src/core/hle/service/am/service/cradle_firmware_updater.h
+++ b/src/core/hle/service/am/service/cradle_firmware_updater.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -30,6 +33,7 @@ private:
Result GetCradleDeviceInfoChangeEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext m_context;
Event m_cradle_device_info_event;
};
diff --git a/src/core/hle/service/am/service/debug_functions.cpp b/src/core/hle/service/am/service/debug_functions.cpp
deleted file mode 100644
index fcac4776db..0000000000
--- a/src/core/hle/service/am/service/debug_functions.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/am/service/debug_functions.h"
-
-namespace Service::AM {
-
-IDebugFunctions::IDebugFunctions(Core::System& system_)
- : ServiceFramework{system_, "IDebugFunctions"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "NotifyMessageToHomeMenuForDebug"},
- {1, nullptr, "OpenMainApplication"},
- {10, nullptr, "PerformSystemButtonPressing"},
- {20, nullptr, "InvalidateTransitionLayer"},
- {30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"},
- {31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"},
- {40, nullptr, "GetAppletResourceUsageInfo"},
- {50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"},
- {51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"},
- {100, nullptr, "SetCpuBoostModeForApplet"},
- {101, nullptr, "CancelCpuBoostModeForApplet"},
- {110, nullptr, "PushToAppletBoundChannelForDebug"},
- {111, nullptr, "TryPopFromAppletBoundChannelForDebug"},
- {120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"},
- {121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"},
- {122, nullptr, "AlarmSettingNotificationPushAppEventNotify"},
- {130, nullptr, "FriendInvitationSetApplicationParameter"},
- {131, nullptr, "FriendInvitationClearApplicationParameter"},
- {132, nullptr, "FriendInvitationPushApplicationParameter"},
- {140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"},
- {200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"},
- {300, nullptr, "TerminateAllRunningApplicationsForDebug"},
- {900, nullptr, "GetGrcProcessLaunchedSystemEvent"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IDebugFunctions::~IDebugFunctions() = default;
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/debug_functions.h b/src/core/hle/service/am/service/debug_functions.h
deleted file mode 100644
index d559687439..0000000000
--- a/src/core/hle/service/am/service/debug_functions.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/service.h"
-
-namespace Service::AM {
-
-class IDebugFunctions final : public ServiceFramework<IDebugFunctions> {
-public:
- explicit IDebugFunctions(Core::System& system_);
- ~IDebugFunctions() override;
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/display_controller.cpp b/src/core/hle/service/am/service/display_controller.cpp
index 8f87327b17..eb95dd1b86 100644
--- a/src/core/hle/service/am/service/display_controller.cpp
+++ b/src/core/hle/service/am/service/display_controller.cpp
@@ -12,42 +12,42 @@
namespace Service::AM {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IDisplayController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetLastForegroundCaptureImage"},
+ FunctionInfo{1, nullptr, "UpdateLastForegroundCaptureImage"},
+ FunctionInfo{2, nullptr, "GetLastApplicationCaptureImage"},
+ FunctionInfo{3, nullptr, "GetCallerAppletCaptureImage"},
+ FunctionInfo{4, nullptr, "UpdateCallerAppletCaptureImage"},
+ FunctionInfo{5, D<&IDisplayController::GetLastForegroundCaptureImageEx>, "GetLastForegroundCaptureImageEx"},
+ FunctionInfo{6, nullptr, "GetLastApplicationCaptureImageEx"},
+ FunctionInfo{7, D<&IDisplayController::GetCallerAppletCaptureImageEx>, "GetCallerAppletCaptureImageEx"},
+ FunctionInfo{8, D<&IDisplayController::TakeScreenShotOfOwnLayer>, "TakeScreenShotOfOwnLayer"},
+ FunctionInfo{9, nullptr, "CopyBetweenCaptureBuffers"},
+ FunctionInfo{10, nullptr, "AcquireLastApplicationCaptureBuffer"},
+ FunctionInfo{11, nullptr, "ReleaseLastApplicationCaptureBuffer"},
+ FunctionInfo{12, nullptr, "AcquireLastForegroundCaptureBuffer"},
+ FunctionInfo{13, nullptr, "ReleaseLastForegroundCaptureBuffer"},
+ FunctionInfo{14, nullptr, "AcquireCallerAppletCaptureBuffer"},
+ FunctionInfo{15, nullptr, "ReleaseCallerAppletCaptureBuffer"},
+ FunctionInfo{16, nullptr, "AcquireLastApplicationCaptureBufferEx"},
+ FunctionInfo{17, nullptr, "AcquireLastForegroundCaptureBufferEx"},
+ FunctionInfo{18, nullptr, "AcquireCallerAppletCaptureBufferEx"},
+ FunctionInfo{20, D<&IDisplayController::ClearCaptureBuffer>, "ClearCaptureBuffer"},
+ FunctionInfo{21, nullptr, "ClearAppletTransitionBuffer"},
+ FunctionInfo{22, D<&IDisplayController::AcquireLastApplicationCaptureSharedBuffer>, "AcquireLastApplicationCaptureSharedBuffer"},
+ FunctionInfo{23, D<&IDisplayController::ReleaseLastApplicationCaptureSharedBuffer>, "ReleaseLastApplicationCaptureSharedBuffer"},
+ FunctionInfo{24, D<&IDisplayController::AcquireLastForegroundCaptureSharedBuffer>, "AcquireLastForegroundCaptureSharedBuffer"},
+ FunctionInfo{25, D<&IDisplayController::ReleaseLastForegroundCaptureSharedBuffer>, "ReleaseLastForegroundCaptureSharedBuffer"},
+ FunctionInfo{26, D<&IDisplayController::AcquireCallerAppletCaptureSharedBuffer>, "AcquireCallerAppletCaptureSharedBuffer"},
+ FunctionInfo{27, D<&IDisplayController::ReleaseCallerAppletCaptureSharedBuffer>, "ReleaseCallerAppletCaptureSharedBuffer"},
+ FunctionInfo{28, nullptr, "TakeScreenShotOfOwnLayerEx"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IDisplayController::IDisplayController(Core::System& system_, std::shared_ptr<Applet> applet_)
: ServiceFramework{system_, "IDisplayController"}, applet(std::move(applet_)) {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetLastForegroundCaptureImage"},
- {1, nullptr, "UpdateLastForegroundCaptureImage"},
- {2, nullptr, "GetLastApplicationCaptureImage"},
- {3, nullptr, "GetCallerAppletCaptureImage"},
- {4, nullptr, "UpdateCallerAppletCaptureImage"},
- {5, D<&IDisplayController::GetLastForegroundCaptureImageEx>, "GetLastForegroundCaptureImageEx"},
- {6, nullptr, "GetLastApplicationCaptureImageEx"},
- {7, D<&IDisplayController::GetCallerAppletCaptureImageEx>, "GetCallerAppletCaptureImageEx"},
- {8, D<&IDisplayController::TakeScreenShotOfOwnLayer>, "TakeScreenShotOfOwnLayer"},
- {9, nullptr, "CopyBetweenCaptureBuffers"},
- {10, nullptr, "AcquireLastApplicationCaptureBuffer"},
- {11, nullptr, "ReleaseLastApplicationCaptureBuffer"},
- {12, nullptr, "AcquireLastForegroundCaptureBuffer"},
- {13, nullptr, "ReleaseLastForegroundCaptureBuffer"},
- {14, nullptr, "AcquireCallerAppletCaptureBuffer"},
- {15, nullptr, "ReleaseCallerAppletCaptureBuffer"},
- {16, nullptr, "AcquireLastApplicationCaptureBufferEx"},
- {17, nullptr, "AcquireLastForegroundCaptureBufferEx"},
- {18, nullptr, "AcquireCallerAppletCaptureBufferEx"},
- {20, D<&IDisplayController::ClearCaptureBuffer>, "ClearCaptureBuffer"},
- {21, nullptr, "ClearAppletTransitionBuffer"},
- {22, D<&IDisplayController::AcquireLastApplicationCaptureSharedBuffer>, "AcquireLastApplicationCaptureSharedBuffer"},
- {23, D<&IDisplayController::ReleaseLastApplicationCaptureSharedBuffer>, "ReleaseLastApplicationCaptureSharedBuffer"},
- {24, D<&IDisplayController::AcquireLastForegroundCaptureSharedBuffer>, "AcquireLastForegroundCaptureSharedBuffer"},
- {25, D<&IDisplayController::ReleaseLastForegroundCaptureSharedBuffer>, "ReleaseLastForegroundCaptureSharedBuffer"},
- {26, D<&IDisplayController::AcquireCallerAppletCaptureSharedBuffer>, "AcquireCallerAppletCaptureSharedBuffer"},
- {27, D<&IDisplayController::ReleaseCallerAppletCaptureSharedBuffer>, "ReleaseCallerAppletCaptureSharedBuffer"},
- {28, nullptr, "TakeScreenShotOfOwnLayerEx"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IDisplayController::~IDisplayController() = default;
diff --git a/src/core/hle/service/am/service/display_controller.h b/src/core/hle/service/am/service/display_controller.h
index 171feace6e..03d29f93c5 100644
--- a/src/core/hle/service/am/service/display_controller.h
+++ b/src/core/hle/service/am/service/display_controller.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -35,6 +35,7 @@ private:
Out<s32> out_fbshare_layer_index);
Result ReleaseLastApplicationCaptureSharedBuffer();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Applet> applet;
};
diff --git a/src/core/hle/service/am/service/global_state_controller.cpp b/src/core/hle/service/am/service/global_state_controller.cpp
index 3e3b61b0a0..be080ffcb3 100644
--- a/src/core/hle/service/am/service/global_state_controller.cpp
+++ b/src/core/hle/service/am/service/global_state_controller.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,28 +10,28 @@
namespace Service::AM {
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> IGlobalStateController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestToEnterSleep"},
+ FunctionInfo{1, nullptr, "EnterSleep"},
+ FunctionInfo{2, nullptr, "StartSleepSequence"},
+ FunctionInfo{3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"},
+ FunctionInfo{4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"},
+ FunctionInfo{9, nullptr, "IsAutoPowerDownRequested"},
+ FunctionInfo{10, D<&IGlobalStateController::LoadAndApplyIdlePolicySettings>, "LoadAndApplyIdlePolicySettings"},
+ FunctionInfo{11, nullptr, "NotifyCecSettingsChanged"},
+ FunctionInfo{12, nullptr, "SetDefaultHomeButtonLongPressTime"},
+ FunctionInfo{13, nullptr, "UpdateDefaultDisplayResolution"},
+ FunctionInfo{14, D<&IGlobalStateController::ShouldSleepOnBoot>, "ShouldSleepOnBoot"},
+ FunctionInfo{15, D<&IGlobalStateController::GetHdcpAuthenticationFailedEvent>, "GetHdcpAuthenticationFailedEvent"},
+ FunctionInfo{30, D<&IGlobalStateController::OpenCradleFirmwareUpdater>, "OpenCradleFirmwareUpdater"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
IGlobalStateController::IGlobalStateController(Core::System& system_)
: ServiceFramework{system_, "IGlobalStateController"},
m_context{system_, "IGlobalStateController"}, m_hdcp_authentication_failed_event{m_context} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestToEnterSleep"},
- {1, nullptr, "EnterSleep"},
- {2, nullptr, "StartSleepSequence"},
- {3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"},
- {4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"},
- {9, nullptr, "IsAutoPowerDownRequested"},
- {10, D<&IGlobalStateController::LoadAndApplyIdlePolicySettings>, "LoadAndApplyIdlePolicySettings"},
- {11, nullptr, "NotifyCecSettingsChanged"},
- {12, nullptr, "SetDefaultHomeButtonLongPressTime"},
- {13, nullptr, "UpdateDefaultDisplayResolution"},
- {14, D<&IGlobalStateController::ShouldSleepOnBoot>, "ShouldSleepOnBoot"},
- {15, D<&IGlobalStateController::GetHdcpAuthenticationFailedEvent>, "GetHdcpAuthenticationFailedEvent"},
- {30, D<&IGlobalStateController::OpenCradleFirmwareUpdater>, "OpenCradleFirmwareUpdater"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
Result IGlobalStateController::StartShutdownSequence() {
diff --git a/src/core/hle/service/am/service/global_state_controller.h b/src/core/hle/service/am/service/global_state_controller.h
index 83efb57dfc..0de1415295 100644
--- a/src/core/hle/service/am/service/global_state_controller.h
+++ b/src/core/hle/service/am/service/global_state_controller.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -23,9 +26,9 @@ private:
Result LoadAndApplyIdlePolicySettings();
Result ShouldSleepOnBoot(Out<bool> out_should_sleep_on_boot);
Result GetHdcpAuthenticationFailedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
- Result OpenCradleFirmwareUpdater(
- Out<SharedPointer<ICradleFirmwareUpdater>> out_cradle_firmware_updater);
+ Result OpenCradleFirmwareUpdater(Out<SharedPointer<ICradleFirmwareUpdater>> out_cradle_firmware_updater);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext m_context;
Event m_hdcp_authentication_failed_event;
};
diff --git a/src/core/hle/service/am/service/home_menu_functions.cpp b/src/core/hle/service/am/service/home_menu_functions.cpp
index f9d402ca99..5f61c842a2 100644
--- a/src/core/hle/service/am/service/home_menu_functions.cpp
+++ b/src/core/hle/service/am/service/home_menu_functions.cpp
@@ -14,31 +14,31 @@
namespace Service::AM {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IHomeMenuFunctions::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{10, D<&IHomeMenuFunctions::RequestToGetForeground>, "RequestToGetForeground"},
+ FunctionInfo{11, D<&IHomeMenuFunctions::LockForeground>, "LockForeground"},
+ FunctionInfo{12, D<&IHomeMenuFunctions::UnlockForeground>, "UnlockForeground"},
+ FunctionInfo{20, D<&IHomeMenuFunctions::PopFromGeneralChannel>, "PopFromGeneralChannel"},
+ FunctionInfo{21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"},
+ FunctionInfo{30, nullptr, "GetHomeButtonWriterLockAccessor"},
+ FunctionInfo{31, nullptr, "GetWriterLockAccessorEx"},
+ FunctionInfo{40, D<&IHomeMenuFunctions::IsSleepEnabled>, "IsSleepEnabled"},
+ FunctionInfo{41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"},
+ FunctionInfo{50, nullptr, "LaunchSystemApplet"},
+ FunctionInfo{51, nullptr, "LaunchStarter"},
+ FunctionInfo{100, nullptr, "PopRequestLaunchApplicationForDebug"},
+ FunctionInfo{110, D<&IHomeMenuFunctions::IsForceTerminateApplicationDisabledForDebug>, "IsForceTerminateApplicationDisabledForDebug"},
+ FunctionInfo{200, nullptr, "LaunchDevMenu"},
+ FunctionInfo{1000, nullptr, "SetLastApplicationExitReason"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_, std::shared_ptr<Applet> applet,
WindowSystem& window_system)
: ServiceFramework{system_, "IHomeMenuFunctions"}, m_window_system{window_system},
m_applet{std::move(applet)}, m_context{system, "IHomeMenuFunctions"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {10, D<&IHomeMenuFunctions::RequestToGetForeground>, "RequestToGetForeground"},
- {11, D<&IHomeMenuFunctions::LockForeground>, "LockForeground"},
- {12, D<&IHomeMenuFunctions::UnlockForeground>, "UnlockForeground"},
- {20, D<&IHomeMenuFunctions::PopFromGeneralChannel>, "PopFromGeneralChannel"},
- {21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"},
- {30, nullptr, "GetHomeButtonWriterLockAccessor"},
- {31, nullptr, "GetWriterLockAccessorEx"},
- {40, D<&IHomeMenuFunctions::IsSleepEnabled>, "IsSleepEnabled"},
- {41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"},
- {50, nullptr, "LaunchSystemApplet"},
- {51, nullptr, "LaunchStarter"},
- {100, nullptr, "PopRequestLaunchApplicationForDebug"},
- {110, D<&IHomeMenuFunctions::IsForceTerminateApplicationDisabledForDebug>, "IsForceTerminateApplicationDisabledForDebug"},
- {200, nullptr, "LaunchDevMenu"},
- {1000, nullptr, "SetLastApplicationExitReason"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IHomeMenuFunctions::~IHomeMenuFunctions() = default;
diff --git a/src/core/hle/service/am/service/home_menu_functions.h b/src/core/hle/service/am/service/home_menu_functions.h
index 2c3ef54375..25eb9db45e 100644
--- a/src/core/hle/service/am/service/home_menu_functions.h
+++ b/src/core/hle/service/am/service/home_menu_functions.h
@@ -34,6 +34,7 @@ private:
Result IsForceTerminateApplicationDisabledForDebug(
Out<bool> out_is_force_terminate_application_disabled_for_debug);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
WindowSystem& m_window_system;
const std::shared_ptr<Applet> m_applet;
KernelHelpers::ServiceContext m_context;
diff --git a/src/core/hle/service/am/service/library_applet_accessor.cpp b/src/core/hle/service/am/service/library_applet_accessor.cpp
index 849e5794cf..c5386fb1a1 100644
--- a/src/core/hle/service/am/service/library_applet_accessor.cpp
+++ b/src/core/hle/service/am/service/library_applet_accessor.cpp
@@ -17,9 +17,7 @@
namespace Service::AM {
-namespace {
-
-void EnableSingleUserPlay(const std::shared_ptr<LibraryAppletStorage>& impl) {
+static void EnableSingleUserPlay(const std::shared_ptr<LibraryAppletStorage>& impl) {
constexpr s64 DisplayOptionsOffset = 0x90;
constexpr s64 IsSkipEnabledOffset = 1;
constexpr s64 ShowSkipButtonOffset = 4;
@@ -29,7 +27,7 @@ void EnableSingleUserPlay(const std::shared_ptr<LibraryAppletStorage>& impl) {
impl->Write(DisplayOptionsOffset + ShowSkipButtonOffset, &enabled, sizeof(enabled));
}
-void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr<LibraryAppletStorage>& impl) {
+static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr<LibraryAppletStorage>& impl) {
Frontend::UiReturnArg return_arg{};
impl->Read(0, &return_arg, sizeof(return_arg));
@@ -47,42 +45,40 @@ void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr<LibraryAppletStorage>
}
}
-} // namespace
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> ILibraryAppletAccessor::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ILibraryAppletAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"},
+ FunctionInfo{1, D<&ILibraryAppletAccessor::IsCompleted>, "IsCompleted"},
+ FunctionInfo{10, D<&ILibraryAppletAccessor::Start>, "Start"},
+ FunctionInfo{20, D<&ILibraryAppletAccessor::RequestExit>, "RequestExit"},
+ FunctionInfo{25, D<&ILibraryAppletAccessor::Terminate>, "Terminate"},
+ FunctionInfo{30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"},
+ FunctionInfo{50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"},
+ FunctionInfo{60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero", MakeVersionGate({10,0,0})},
+ FunctionInfo{80, nullptr, "RequestForLibraryAppletToGetForeground", MakeVersionGate({19,0,0})},
+ FunctionInfo{81, nullptr, "GetCurrentChildLibraryApplet", MakeVersionGate({19,0,0})},
+ FunctionInfo{90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90", MakeVersionGate({20,0,0})},
+ FunctionInfo{100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"},
+ FunctionInfo{101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"},
+ FunctionInfo{102, nullptr, "PushExtraStorage"},
+ FunctionInfo{103, D<&ILibraryAppletAccessor::PushInteractiveInData>, "PushInteractiveInData"},
+ FunctionInfo{104, D<&ILibraryAppletAccessor::PopInteractiveOutData>, "PopInteractiveOutData"},
+ FunctionInfo{105, D<&ILibraryAppletAccessor::GetPopOutDataEvent>, "GetPopOutDataEvent"},
+ FunctionInfo{106, D<&ILibraryAppletAccessor::GetPopInteractiveOutDataEvent>, "GetPopInteractiveOutDataEvent"},
+ FunctionInfo{110, nullptr, "NeedsToExitProcess"},
+ FunctionInfo{120, D<&ILibraryAppletAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"},
+ FunctionInfo{150, nullptr, "RequestForAppletToGetForeground"},
+ FunctionInfo{160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle", MakeVersionGate({2,0,0})},
+ FunctionInfo{170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170", MakeVersionGate({22,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
ILibraryAppletAccessor::ILibraryAppletAccessor(Core::System& system_,
std::shared_ptr<AppletDataBroker> broker,
std::shared_ptr<Applet> applet)
: ServiceFramework{system_, "ILibraryAppletAccessor"}, m_broker{std::move(broker)},
m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ILibraryAppletAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"},
- {1, D<&ILibraryAppletAccessor::IsCompleted>, "IsCompleted"},
- {10, D<&ILibraryAppletAccessor::Start>, "Start"},
- {20, D<&ILibraryAppletAccessor::RequestExit>, "RequestExit"},
- {25, D<&ILibraryAppletAccessor::Terminate>, "Terminate"},
- {30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"},
- {50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"},
- {60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero"}, //10.0.0+
- {80, nullptr, "RequestForLibraryAppletToGetForeground"}, //19.0.0+
- {81, nullptr, "GetCurrentChildLibraryApplet"}, //19.0.0+
- {90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90"}, //20.0.0+
- {100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"},
- {101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"},
- {102, nullptr, "PushExtraStorage"},
- {103, D<&ILibraryAppletAccessor::PushInteractiveInData>, "PushInteractiveInData"},
- {104, D<&ILibraryAppletAccessor::PopInteractiveOutData>, "PopInteractiveOutData"},
- {105, D<&ILibraryAppletAccessor::GetPopOutDataEvent>, "GetPopOutDataEvent"},
- {106, D<&ILibraryAppletAccessor::GetPopInteractiveOutDataEvent>, "GetPopInteractiveOutDataEvent"},
- {110, nullptr, "NeedsToExitProcess"},
- {120, D<&ILibraryAppletAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"},
- {150, nullptr, "RequestForAppletToGetForeground"},
- {160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle"}, //2.0.0+
- {170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170"}, //22.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ILibraryAppletAccessor::~ILibraryAppletAccessor() = default;
diff --git a/src/core/hle/service/am/service/library_applet_accessor.h b/src/core/hle/service/am/service/library_applet_accessor.h
index ad40bc76c7..e14ddb3bde 100644
--- a/src/core/hle/service/am/service/library_applet_accessor.h
+++ b/src/core/hle/service/am/service/library_applet_accessor.h
@@ -6,7 +6,6 @@
#pragma once
-#include "core/hle/service/am/service/library_applet_self_accessor.h"
#include "core/hle/service/cmif_types.h"
#include "core/hle/service/service.h"
@@ -16,6 +15,26 @@ class AppletDataBroker;
struct Applet;
class IStorage;
+struct LibraryAppletInfo {
+ AppletId applet_id;
+ LibraryAppletMode library_applet_mode;
+};
+static_assert(sizeof(LibraryAppletInfo) == 0x8, "LibraryAppletInfo has incorrect size.");
+
+struct ErrorCode {
+ u32 category;
+ u32 number;
+};
+static_assert(sizeof(ErrorCode) == 0x8, "ErrorCode has incorrect size.");
+
+struct ErrorContext {
+ u8 type;
+ INSERT_PADDING_BYTES_NOINIT(0x7);
+ std::array<u8, 0x1f4> data;
+ Result result;
+};
+static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size.");
+
class ILibraryAppletAccessor final : public ServiceFramework<ILibraryAppletAccessor> {
public:
explicit ILibraryAppletAccessor(Core::System& system_, std::shared_ptr<AppletDataBroker> broker,
@@ -49,6 +68,7 @@ private:
void FrontendExecuteInteractive();
void FrontendRequestExit();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<AppletDataBroker> m_broker;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp
deleted file mode 100644
index 4ee92908b5..0000000000
--- a/src/core/hle/service/am/service/library_applet_creator.cpp
+++ /dev/null
@@ -1,287 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "common/settings.h"
-#include "core/hle/kernel/k_transfer_memory.h"
-#include "core/hle/service/am/applet_data_broker.h"
-#include "core/hle/service/am/applet_manager.h"
-#include "core/hle/service/am/frontend/applets.h"
-#include "core/hle/service/am/library_applet_storage.h"
-#include "core/hle/service/am/process_creation.h"
-#include "core/hle/service/am/service/library_applet_accessor.h"
-#include "core/hle/service/am/service/library_applet_creator.h"
-
-#include "core/hle/api_version.h"
-#include "core/hle/service/am/service/storage.h"
-#include "core/hle/service/am/window_system.h"
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/sm/sm.h"
-
-namespace Service::AM {
-
-namespace {
-
-bool ShouldCreateGuestApplet(AppletId applet_id) {
-#define X(Name, name) \
- if (applet_id == AppletId::Name && \
- Settings::values.name##_applet_mode.GetValue() != Settings::AppletMode::LLE) { \
- return false; \
- }
-
- X(Cabinet, cabinet)
- X(Controller, controller)
- X(DataErase, data_erase)
- X(Error, error)
- X(NetConnect, net_connect)
- X(ProfileSelect, player_select)
- X(SoftwareKeyboard, swkbd)
- X(MiiEdit, mii_edit)
- X(Web, web)
- X(Shop, shop)
- X(PhotoViewer, photo_viewer)
- X(OfflineWeb, offline_web)
- X(LoginShare, login_share)
- X(WebAuth, wifi_web_auth)
- X(MyPage, my_page)
-
-#undef X
-
- return true;
-}
-
-AppletProgramId AppletIdToProgramId(AppletId applet_id) {
- switch (applet_id) {
- case AppletId::OverlayDisplay:
- return AppletProgramId::OverlayDisplay;
- case AppletId::QLaunch:
- return AppletProgramId::QLaunch;
- case AppletId::Starter:
- return AppletProgramId::Starter;
- case AppletId::Auth:
- return AppletProgramId::Auth;
- case AppletId::Cabinet:
- return AppletProgramId::Cabinet;
- case AppletId::Controller:
- return AppletProgramId::Controller;
- case AppletId::DataErase:
- return AppletProgramId::DataErase;
- case AppletId::Error:
- return AppletProgramId::Error;
- case AppletId::NetConnect:
- return AppletProgramId::NetConnect;
- case AppletId::ProfileSelect:
- return AppletProgramId::ProfileSelect;
- case AppletId::SoftwareKeyboard:
- return AppletProgramId::SoftwareKeyboard;
- case AppletId::MiiEdit:
- return AppletProgramId::MiiEdit;
- case AppletId::Web:
- return AppletProgramId::Web;
- case AppletId::Shop:
- return AppletProgramId::Shop;
- case AppletId::PhotoViewer:
- return AppletProgramId::PhotoViewer;
- case AppletId::Settings:
- return AppletProgramId::Settings;
- case AppletId::OfflineWeb:
- return AppletProgramId::OfflineWeb;
- case AppletId::LoginShare:
- return AppletProgramId::LoginShare;
- case AppletId::WebAuth:
- return AppletProgramId::WebAuth;
- case AppletId::MyPage:
- return AppletProgramId::MyPage;
- default:
- return static_cast<AppletProgramId>(0);
- }
-}
-
-std::shared_ptr<ILibraryAppletAccessor> CreateGuestApplet(Core::System& system,
- WindowSystem& window_system,
- std::shared_ptr<Applet> caller_applet,
- AppletId applet_id,
- LibraryAppletMode mode) {
- const auto program_id = static_cast<u64>(AppletIdToProgramId(applet_id));
- if (program_id == 0) {
- // Unknown applet
- return {};
- }
-
- auto process = CreateProcess(system, program_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR);
- if (process) {
- const auto applet = std::make_shared<Applet>(system, std::move(process), false);
- applet->program_id = program_id;
- applet->applet_id = applet_id;
- applet->type = AppletType::LibraryApplet;
- applet->library_applet_mode = mode;
- applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden;
-
- auto broker = std::make_shared<AppletDataBroker>(system);
- applet->caller_applet = caller_applet;
- applet->caller_applet_broker = broker;
- {
- std::scoped_lock lk{caller_applet->lock};
- caller_applet->child_applets.push_back(applet);
- }
- window_system.TrackApplet(applet, false);
- return std::make_shared<ILibraryAppletAccessor>(system, broker, applet);
- }
- // Couldn't initialize the guest process
- return {};
-}
-
-std::shared_ptr<ILibraryAppletAccessor> CreateFrontendApplet(Core::System& system,
- WindowSystem& window_system,
- std::shared_ptr<Applet> caller_applet,
- AppletId applet_id,
- LibraryAppletMode mode) {
- const auto program_id = static_cast<u64>(AppletIdToProgramId(applet_id));
-
- auto process = std::make_unique<Process>(system);
- auto applet = std::make_shared<Applet>(system, std::move(process), false);
- applet->program_id = program_id;
- applet->applet_id = applet_id;
- applet->type = AppletType::LibraryApplet;
- applet->library_applet_mode = mode;
-
- auto storage = std::make_shared<AppletDataBroker>(system);
- applet->caller_applet = caller_applet;
- applet->caller_applet_broker = storage;
- applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode);
- {
- std::scoped_lock lk{caller_applet->lock};
- caller_applet->child_applets.push_back(applet);
- }
- return std::make_shared<ILibraryAppletAccessor>(system, storage, applet);
-}
-
-} // namespace
-
-ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet,
- WindowSystem& window_system)
- : ServiceFramework{system_, "ILibraryAppletCreator"},
- m_window_system{window_system}, m_applet{std::move(applet)} {
- static const FunctionInfo functions[] = {
- {0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"},
- {1, nullptr, "TerminateAllLibraryApplets"},
- {2, nullptr, "AreAnyLibraryAppletsLeft"},
- {3, D<&ILibraryAppletCreator::CreateLibraryAppletEx>, "CreateLibraryAppletEx"},
- {10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"},
- {11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"},
- {12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"},
- };
- RegisterHandlers(functions);
-}
-
-ILibraryAppletCreator::~ILibraryAppletCreator() = default;
-
-Result ILibraryAppletCreator::CreateLibraryApplet(
- Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
- LibraryAppletMode library_applet_mode) {
- LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={}", applet_id,
- library_applet_mode);
-
- std::shared_ptr<ILibraryAppletAccessor> library_applet;
- if (ShouldCreateGuestApplet(applet_id)) {
- library_applet =
- CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
- }
- if (!library_applet) {
- library_applet =
- CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
- }
- if (!library_applet) {
- LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id);
- R_THROW(ResultUnknown);
- }
-
- // Applet is created, can now be launched.
- m_applet->library_applet_launchable_event.Signal(system.Kernel());
- *out_library_applet_accessor = library_applet;
- R_SUCCEED();
-}
-
-Result ILibraryAppletCreator::CreateLibraryAppletEx(
- Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
- LibraryAppletMode library_applet_mode, u64 thread_id) {
- LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={} thread_id={}", applet_id,
- library_applet_mode, thread_id);
-
- std::shared_ptr<ILibraryAppletAccessor> library_applet;
- if (ShouldCreateGuestApplet(applet_id)) {
- library_applet =
- CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
- }
- if (!library_applet) {
- library_applet =
- CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode);
- }
- if (!library_applet) {
- LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id);
- R_THROW(ResultUnknown);
- }
-
- // Applet is created, can now be launched.
- m_applet->library_applet_launchable_event.Signal(system.Kernel());
- *out_library_applet_accessor = library_applet;
- R_SUCCEED();
-}
-
-Result ILibraryAppletCreator::CreateStorage(Out<SharedPointer<IStorage>> out_storage, s64 size) {
- LOG_DEBUG(Service_AM, "called, size={}", size);
-
- if (size <= 0) {
- LOG_ERROR(Service_AM, "size is less than or equal to 0");
- R_THROW(ResultUnknown);
- }
-
- *out_storage = std::make_shared<IStorage>(system, AM::CreateStorage(std::vector<u8>(size)));
- R_SUCCEED();
-}
-
-Result ILibraryAppletCreator::CreateTransferMemoryStorage(
- Out<SharedPointer<IStorage>> out_storage, bool is_writable, s64 size,
- InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
- LOG_DEBUG(Service_AM, "called, is_writable={} size={}", is_writable, size);
-
- if (size <= 0) {
- LOG_ERROR(Service_AM, "size is less than or equal to 0");
- R_THROW(ResultUnknown);
- }
-
- if (!transfer_memory_handle) {
- LOG_ERROR(Service_AM, "transfer_memory_handle is null");
- R_THROW(ResultUnknown);
- }
-
- *out_storage = std::make_shared<IStorage>(
- system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(),
- transfer_memory_handle.Get(), is_writable, size));
- R_SUCCEED();
-}
-
-Result ILibraryAppletCreator::CreateHandleStorage(
- Out<SharedPointer<IStorage>> out_storage, s64 size,
- InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle) {
- LOG_DEBUG(Service_AM, "called, size={}", size);
-
- if (size <= 0) {
- LOG_ERROR(Service_AM, "size is less than or equal to 0");
- R_THROW(ResultUnknown);
- }
-
- if (!transfer_memory_handle) {
- LOG_ERROR(Service_AM, "transfer_memory_handle is null");
- R_THROW(ResultUnknown);
- }
-
- *out_storage = std::make_shared<IStorage>(
- system, AM::CreateHandleStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(),
- transfer_memory_handle.Get(), size));
- R_SUCCEED();
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_creator.h b/src/core/hle/service/am/service/library_applet_creator.h
deleted file mode 100644
index 34e7586e8f..0000000000
--- a/src/core/hle/service/am/service/library_applet_creator.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/am/am_types.h"
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::AM {
-
-struct Applet;
-class ILibraryAppletAccessor;
-class IStorage;
-class WindowSystem;
-
-class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> {
-public:
- explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr<Applet> applet,
- WindowSystem& window_system);
- ~ILibraryAppletCreator() override;
-
-private:
- Result CreateLibraryApplet(
- Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
- LibraryAppletMode library_applet_mode);
- Result CreateLibraryAppletEx(
- Out<SharedPointer<ILibraryAppletAccessor>> out_library_applet_accessor, AppletId applet_id,
- LibraryAppletMode library_applet_mode, u64 thread_id);
- Result CreateStorage(Out<SharedPointer<IStorage>> out_storage, s64 size);
- Result CreateTransferMemoryStorage(
- Out<SharedPointer<IStorage>> out_storage, bool is_writable, s64 size,
- InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle);
- Result CreateHandleStorage(Out<SharedPointer<IStorage>> out_storage, s64 size,
- InCopyHandle<Kernel::KTransferMemory> transfer_memory_handle);
-
- WindowSystem& m_window_system;
- const std::shared_ptr<Applet> m_applet;
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_proxy.cpp b/src/core/hle/service/am/service/library_applet_proxy.cpp
deleted file mode 100644
index f9cfb82a90..0000000000
--- a/src/core/hle/service/am/service/library_applet_proxy.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/am/service/applet_common_functions.h"
-#include "core/hle/service/am/service/audio_controller.h"
-#include "core/hle/service/am/service/common_state_getter.h"
-#include "core/hle/service/am/service/debug_functions.h"
-#include "core/hle/service/am/service/display_controller.h"
-#include "core/hle/service/am/service/global_state_controller.h"
-#include "core/hle/service/am/service/home_menu_functions.h"
-#include "core/hle/service/am/service/library_applet_creator.h"
-#include "core/hle/service/am/service/library_applet_proxy.h"
-#include "core/hle/service/am/service/library_applet_self_accessor.h"
-#include "core/hle/service/am/service/process_winding_controller.h"
-#include "core/hle/service/am/service/self_controller.h"
-#include "core/hle/service/am/service/window_controller.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::AM {
-
-ILibraryAppletProxy::ILibraryAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess* process, WindowSystem& window_system)
- : ServiceFramework{system_, "ILibraryAppletProxy"},
- m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ILibraryAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
- {1, D<&ILibraryAppletProxy::GetSelfController>, "GetSelfController"},
- {2, D<&ILibraryAppletProxy::GetWindowController>, "GetWindowController"},
- {3, D<&ILibraryAppletProxy::GetAudioController>, "GetAudioController"},
- {4, D<&ILibraryAppletProxy::GetDisplayController>, "GetDisplayController"},
- {10, D<&ILibraryAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
- {11, D<&ILibraryAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
- {20, D<&ILibraryAppletProxy::OpenLibraryAppletSelfAccessor>, "OpenLibraryAppletSelfAccessor"},
- {21, D<&ILibraryAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
- {22, D<&ILibraryAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"},
- {23, D<&ILibraryAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
- {1000, D<&ILibraryAppletProxy::GetDebugFunctions>, "GetDebugFunctions"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-ILibraryAppletProxy::~ILibraryAppletProxy() = default;
-
-Result ILibraryAppletProxy::GetAudioController(
- Out<SharedPointer<IAudioController>> out_audio_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_audio_controller = std::make_shared<IAudioController>(system);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetDisplayController(
- Out<SharedPointer<IDisplayController>> out_display_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetDebugFunctions(
- Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_debug_functions = std::make_shared<IDebugFunctions>(system);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetWindowController(
- Out<SharedPointer<IWindowController>> out_window_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetSelfController(
- Out<SharedPointer<ISelfController>> out_self_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetCommonStateGetter(
- Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
- LOG_DEBUG(Service_AM, "called");
- *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_creator =
- std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::OpenLibraryAppletSelfAccessor(
- Out<SharedPointer<ILibraryAppletSelfAccessor>> out_library_applet_self_accessor) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_self_accessor =
- std::make_shared<ILibraryAppletSelfAccessor>(system, m_applet);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetAppletCommonFunctions(
- Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetHomeMenuFunctions(
- Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_home_menu_functions =
- std::make_shared<IHomeMenuFunctions>(system, m_applet, m_window_system);
- R_SUCCEED();
-}
-
-Result ILibraryAppletProxy::GetGlobalStateController(
- Out<SharedPointer<IGlobalStateController>> out_global_state_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
- R_SUCCEED();
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_proxy.h b/src/core/hle/service/am/service/library_applet_proxy.h
deleted file mode 100644
index 792d585827..0000000000
--- a/src/core/hle/service/am/service/library_applet_proxy.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::AM {
-
-struct Applet;
-class IAppletCommonFunctions;
-class IAudioController;
-class ICommonStateGetter;
-class IDebugFunctions;
-class IDisplayController;
-class IHomeMenuFunctions;
-class IGlobalStateController;
-class ILibraryAppletCreator;
-class ILibraryAppletSelfAccessor;
-class IProcessWindingController;
-class ISelfController;
-class IWindowController;
-class WindowSystem;
-
-class ILibraryAppletProxy final : public ServiceFramework<ILibraryAppletProxy> {
-public:
- explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess* process, WindowSystem& window_system);
- ~ILibraryAppletProxy();
-
-private:
- Result GetAudioController(Out<SharedPointer<IAudioController>> out_audio_controller);
- Result GetDisplayController(Out<SharedPointer<IDisplayController>> out_display_controller);
- Result GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller);
- Result GetDebugFunctions(Out<SharedPointer<IDebugFunctions>> out_debug_functions);
- Result GetWindowController(Out<SharedPointer<IWindowController>> out_window_controller);
- Result GetSelfController(Out<SharedPointer<ISelfController>> out_self_controller);
- Result GetCommonStateGetter(Out<SharedPointer<ICommonStateGetter>> out_common_state_getter);
- Result GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator);
- Result OpenLibraryAppletSelfAccessor(
- Out<SharedPointer<ILibraryAppletSelfAccessor>> out_library_applet_self_accessor);
- Result GetAppletCommonFunctions(
- Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions);
- Result GetHomeMenuFunctions(Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions);
- Result GetGlobalStateController(
- Out<SharedPointer<IGlobalStateController>> out_global_state_controller);
-
- WindowSystem& m_window_system;
- Kernel::KProcess* const m_process;
- const std::shared_ptr<Applet> m_applet;
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.cpp b/src/core/hle/service/am/service/library_applet_self_accessor.cpp
deleted file mode 100644
index 907be49204..0000000000
--- a/src/core/hle/service/am/service/library_applet_self_accessor.cpp
+++ /dev/null
@@ -1,332 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/core_timing.h"
-#include "core/file_sys/control_metadata.h"
-#include "core/file_sys/patch_manager.h"
-#include "core/file_sys/registered_cache.h"
-#include "core/hle/service/acc/profile_manager.h"
-#include "core/hle/service/am/applet_data_broker.h"
-#include "core/hle/service/am/applet_manager.h"
-#include "core/hle/service/am/frontend/applets.h"
-#include "core/hle/service/am/service/library_applet_self_accessor.h"
-#include "core/hle/service/am/service/storage.h"
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/filesystem/filesystem.h"
-#include "core/hle/service/glue/glue_manager.h"
-#include "core/hle/service/ns/application_manager_interface.h"
-#include "core/hle/service/ns/service_getter_interface.h"
-#include "core/hle/service/sm/sm.h"
-
-namespace Service::AM {
-
-namespace {
-
-AppletIdentityInfo GetCallerIdentity(Applet& applet) {
- if (const auto caller_applet = applet.caller_applet.lock(); caller_applet) {
- // TODO: is this actually the application ID?
- return {
- .applet_id = caller_applet->applet_id,
- .application_id = caller_applet->program_id,
- };
- } else {
- return {
- .applet_id = AppletId::QLaunch,
- .application_id = 0x0100000000001000ull,
- };
- }
-}
-
-} // namespace
-
-ILibraryAppletSelfAccessor::ILibraryAppletSelfAccessor(Core::System& system_,
- std::shared_ptr<Applet> applet)
- : ServiceFramework{system_, "ILibraryAppletSelfAccessor"}, m_applet{std::move(applet)},
- m_broker{m_applet->caller_applet_broker} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ILibraryAppletSelfAccessor::PopInData>, "PopInData"},
- {1, D<&ILibraryAppletSelfAccessor::PushOutData>, "PushOutData"},
- {2, D<&ILibraryAppletSelfAccessor::PopInteractiveInData>, "PopInteractiveInData"},
- {3, D<&ILibraryAppletSelfAccessor::PushInteractiveOutData>, "PushInteractiveOutData"},
- {5, D<&ILibraryAppletSelfAccessor::GetPopInDataEvent>, "GetPopInDataEvent"},
- {6, D<&ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent>, "GetPopInteractiveInDataEvent"},
- {10, D<&ILibraryAppletSelfAccessor::ExitProcessAndReturn>, "ExitProcessAndReturn"},
- {11, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"},
- {12, D<&ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo>, "GetMainAppletIdentityInfo"},
- {13, D<&ILibraryAppletSelfAccessor::CanUseApplicationCore>, "CanUseApplicationCore"},
- {14, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo>, "GetCallerAppletIdentityInfo"},
- {15, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty>, "GetMainAppletApplicationControlProperty"},
- {16, D<&ILibraryAppletSelfAccessor::GetMainAppletStorageId>, "GetMainAppletStorageId"},
- {17, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack>, "GetCallerAppletIdentityInfoStack"},
- {18, nullptr, "GetNextReturnDestinationAppletIdentityInfo"},
- {19, D<&ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout>, "GetDesirableKeyboardLayout"},
- {20, nullptr, "PopExtraStorage"},
- {25, nullptr, "GetPopExtraStorageEvent"},
- {30, D<&ILibraryAppletSelfAccessor::UnpopInData>, "UnpopInData"},
- {31, nullptr, "UnpopExtraStorage"},
- {40, nullptr, "GetIndirectLayerProducerHandle"},
- {50, D<&ILibraryAppletSelfAccessor::ReportVisibleError>, "ReportVisibleError"},
- {51, D<&ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext>, "ReportVisibleErrorWithErrorContext"},
- {60, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage>, "GetMainAppletApplicationDesiredLanguage"},
- {70, D<&ILibraryAppletSelfAccessor::GetCurrentApplicationId>, "GetCurrentApplicationId"},
- {80, nullptr, "RequestExitToSelf"},
- {90, nullptr, "CreateApplicationAndPushAndRequestToLaunch"},
- {100, nullptr, "CreateGameMovieTrimmer"},
- {101, nullptr, "ReserveResourceForMovieOperation"},
- {102, nullptr, "UnreserveResourceForMovieOperation"},
- {110, D<&ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers>, "GetMainAppletAvailableUsers"},
- {120, nullptr, "GetLaunchStorageInfoForDebug"},
- {130, nullptr, "GetGpuErrorDetectedSystemEvent"},
- {140, nullptr, "SetApplicationMemoryReservation"},
- {150, D<&ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually>, "ShouldSetGpuTimeSliceManually"},
- {160, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx>, "GetLibraryAppletInfoEx"},
- };
- // clang-format on
- RegisterHandlers(functions);
-}
-
-ILibraryAppletSelfAccessor::~ILibraryAppletSelfAccessor() = default;
-
-Result ILibraryAppletSelfAccessor::PopInData(Out<SharedPointer<IStorage>> out_storage) {
- LOG_INFO(Service_AM, "called");
- R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage));
-}
-
-Result ILibraryAppletSelfAccessor::PushOutData(SharedPointer<IStorage> storage) {
- LOG_INFO(Service_AM, "called");
- m_broker->GetOutData().Push(system.Kernel(), storage);
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::PopInteractiveInData(Out<SharedPointer<IStorage>> out_storage) {
- LOG_INFO(Service_AM, "called");
- R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage));
-}
-
-Result ILibraryAppletSelfAccessor::PushInteractiveOutData(SharedPointer<IStorage> storage) {
- LOG_INFO(Service_AM, "called");
- m_broker->GetInteractiveOutData().Push(system.Kernel(), storage);
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetPopInDataEvent(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_AM, "called");
- *out_event = m_broker->GetInData().GetEvent();
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_AM, "called");
- *out_event = m_broker->GetInteractiveInData().GetEvent();
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetLibraryAppletInfo(
- Out<LibraryAppletInfo> out_library_applet_info) {
- LOG_INFO(Service_AM, "called");
- *out_library_applet_info = {
- .applet_id = m_applet->applet_id,
- .library_applet_mode = m_applet->library_applet_mode,
- };
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo(
- Out<AppletIdentityInfo> out_identity_info) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_identity_info = {
- .applet_id = AppletId::QLaunch,
- .application_id = 0x0100000000001000ull,
- };
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::CanUseApplicationCore(Out<bool> out_can_use_application_core) {
- // TODO: This appears to read the NPDM from state and check the core mask of the applet.
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_can_use_application_core = false;
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty(
- OutLargeData<std::array<u8, 0x4000>, BufferAttr_HipcMapAlias> out_nacp) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
-
- // TODO: this should be the main applet, not the caller applet
- const auto application = GetCallerIdentity(*m_applet);
- std::vector<u8> nacp;
- const auto result =
- system.GetARPManager().GetControlProperty(&nacp, application.application_id);
-
- if (R_SUCCEEDED(result)) {
- std::memcpy(out_nacp->data(), nacp.data(), (std::min)(nacp.size(), out_nacp->size()));
- }
-
- R_RETURN(result);
-}
-
-Result ILibraryAppletSelfAccessor::GetMainAppletStorageId(Out<FileSys::StorageId> out_storage_id) {
- LOG_INFO(Service_AM, "(STUBBED) called");
- *out_storage_id = FileSys::StorageId::NandUser;
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::ExitProcessAndReturn() {
- LOG_INFO(Service_AM, "called");
-
- if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) {
- m_applet->process->Terminate();
- } else {
- system.GetUserChannel() = m_applet->user_channel_launch_parameter;
- system.ExecuteProgram(0);
- }
-
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo(
- Out<AppletIdentityInfo> out_identity_info) {
- LOG_INFO(Service_AM, "called");
- *out_identity_info = GetCallerIdentity(*m_applet);
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack(
- Out<s32> out_count, OutArray<AppletIdentityInfo, BufferAttr_HipcMapAlias> out_identity_info) {
- LOG_INFO(Service_AM, "called");
-
- std::shared_ptr<Applet> applet = m_applet;
- *out_count = 0;
-
- do {
- if (*out_count >= static_cast<s32>(out_identity_info.size())) {
- break;
- }
- out_identity_info[(*out_count)++] = GetCallerIdentity(*applet);
- } while ((applet = applet->caller_applet.lock()));
-
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout(Out<u32> out_desirable_layout) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
- *out_desirable_layout = 0;
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::ReportVisibleError(ErrorCode error_code) {
- LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category,
- error_code.number);
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext(
- ErrorCode error_code, InLargeData<ErrorContext, BufferAttr_HipcMapAlias> error_context) {
- LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category,
- error_code.number);
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::UnpopInData(SharedPointer<IStorage> storage) {
- LOG_INFO(Service_AM, "called");
- m_broker->GetInData().Unpop(system.Kernel(), storage);
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage(
- Out<u64> out_desired_language) {
- // FIXME: this is copied from IApplicationFunctions::GetDesiredLanguage
- // FIXME: all of this stuff belongs to ns
- auto identity = GetCallerIdentity(*m_applet);
-
- // TODO(bunnei): This should be configurable
- LOG_DEBUG(Service_AM, "called");
-
- // Get supported languages from NACP, if possible
- // Default to 0 (all languages supported)
- u32 supported_languages = 0;
-
- const auto res = FileSys::PatchManager::GetMetadataFromBaseOrUpdate(system, identity.application_id);
-
- if (res.first != nullptr) {
- supported_languages = res.first->GetSupportedLanguages();
- }
-
- // Call IApplicationManagerInterface implementation.
- auto& service_manager = system.ServiceManager();
- auto ns_am2 = service_manager.GetService<NS::IServiceGetterInterface>("ns:am2");
-
- std::shared_ptr<NS::IApplicationManagerInterface> app_man;
- R_TRY(ns_am2->GetApplicationManagerInterface(&app_man));
-
- // Get desired application language
- NS::ApplicationLanguage desired_language{};
- R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
-
- // Convert to settings language code.
- u64 language_code{};
- R_TRY(app_man->ConvertApplicationLanguageToLanguageCode(&language_code, desired_language));
-
- LOG_DEBUG(Service_AM, "got desired_language={:016X}", language_code);
-
- *out_desired_language = language_code;
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetCurrentApplicationId(Out<u64> out_application_id) {
- LOG_WARNING(Service_AM, "(STUBBED) called");
-
- // TODO: this should be the main applet, not the caller applet
- const auto main_applet = GetCallerIdentity(*m_applet);
- *out_application_id = main_applet.application_id;
-
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers(
- Out<bool> out_can_select_any_user, Out<s32> out_users_count,
- OutArray<Common::UUID, BufferAttr_HipcMapAlias> out_users) {
- const Service::Account::ProfileManager manager{};
-
- *out_can_select_any_user = false;
- *out_users_count = -1;
-
- LOG_INFO(Service_AM, "called");
-
- if (manager.GetUserCount() > 0) {
- *out_can_select_any_user = true;
- *out_users_count = static_cast<s32>(manager.GetUserCount());
-
- const auto users = manager.GetAllUsers();
- for (size_t i = 0; i < users.size() && i < out_users.size(); i++) {
- out_users[i] = users[i];
- }
- }
-
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually(
- Out<bool> out_should_set_gpu_time_slice_manually) {
- LOG_INFO(Service_AM, "(STUBBED) called");
- *out_should_set_gpu_time_slice_manually = false;
- R_SUCCEED();
-}
-
-Result ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx(
- Out<LibraryAppletInfo> out_library_applet_info) {
- LOG_INFO(Service_AM, "called");
- *out_library_applet_info = {
- .applet_id = m_applet->applet_id,
- .library_applet_mode = m_applet->library_applet_mode,
- };
- R_SUCCEED();
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.h b/src/core/hle/service/am/service/library_applet_self_accessor.h
deleted file mode 100644
index d287f6b403..0000000000
--- a/src/core/hle/service/am/service/library_applet_self_accessor.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "common/uuid.h"
-#include "core/hle/service/am/am_types.h"
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace FileSys {
-enum class StorageId : u8;
-}
-
-namespace Kernel {
-class KReadableEvent;
-}
-
-namespace Service::AM {
-
-class AppletDataBroker;
-struct Applet;
-class IStorage;
-
-struct LibraryAppletInfo {
- AppletId applet_id;
- LibraryAppletMode library_applet_mode;
-};
-static_assert(sizeof(LibraryAppletInfo) == 0x8, "LibraryAppletInfo has incorrect size.");
-
-struct ErrorCode {
- u32 category;
- u32 number;
-};
-static_assert(sizeof(ErrorCode) == 0x8, "ErrorCode has incorrect size.");
-
-struct ErrorContext {
- u8 type;
- INSERT_PADDING_BYTES_NOINIT(0x7);
- std::array<u8, 0x1f4> data;
- Result result;
-};
-static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size.");
-
-class ILibraryAppletSelfAccessor final : public ServiceFramework<ILibraryAppletSelfAccessor> {
-public:
- explicit ILibraryAppletSelfAccessor(Core::System& system_, std::shared_ptr<Applet> applet);
- ~ILibraryAppletSelfAccessor() override;
-
-private:
- Result PopInData(Out<SharedPointer<IStorage>> out_storage);
- Result PushOutData(SharedPointer<IStorage> storage);
- Result PopInteractiveInData(Out<SharedPointer<IStorage>> out_storage);
- Result PushInteractiveOutData(SharedPointer<IStorage> storage);
- Result GetPopInDataEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
- Result GetPopInteractiveInDataEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
- Result GetLibraryAppletInfo(Out<LibraryAppletInfo> out_library_applet_info);
- Result GetMainAppletIdentityInfo(Out<AppletIdentityInfo> out_identity_info);
- Result CanUseApplicationCore(Out<bool> out_can_use_application_core);
- Result GetMainAppletApplicationControlProperty(
- OutLargeData<std::array<u8, 0x4000>, BufferAttr_HipcMapAlias> out_nacp);
- Result GetMainAppletStorageId(Out<FileSys::StorageId> out_storage_id);
- Result ExitProcessAndReturn();
- Result GetCallerAppletIdentityInfo(Out<AppletIdentityInfo> out_identity_info);
- Result GetCallerAppletIdentityInfoStack(
- Out<s32> out_count,
- OutArray<AppletIdentityInfo, BufferAttr_HipcMapAlias> out_identity_info);
- Result GetDesirableKeyboardLayout(Out<u32> out_desirable_layout);
- Result ReportVisibleError(ErrorCode error_code);
- Result ReportVisibleErrorWithErrorContext(
- ErrorCode error_code, InLargeData<ErrorContext, BufferAttr_HipcMapAlias> error_context);
- Result UnpopInData(SharedPointer<IStorage> storage);
- Result GetMainAppletApplicationDesiredLanguage(Out<u64> out_desired_language);
- Result GetCurrentApplicationId(Out<u64> out_application_id);
- Result GetMainAppletAvailableUsers(Out<bool> out_can_select_any_user, Out<s32> out_users_count,
- OutArray<Common::UUID, BufferAttr_HipcMapAlias> out_users);
- Result ShouldSetGpuTimeSliceManually(Out<bool> out_should_set_gpu_time_slice_manually);
- Result GetLibraryAppletInfoEx(Out<LibraryAppletInfo> out_library_applet_info);
-
- const std::shared_ptr<Applet> m_applet;
- const std::shared_ptr<AppletDataBroker> m_broker;
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/lock_accessor.cpp b/src/core/hle/service/am/service/lock_accessor.cpp
deleted file mode 100644
index 0341254449..0000000000
--- a/src/core/hle/service/am/service/lock_accessor.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/am/service/lock_accessor.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::AM {
-
-ILockAccessor::ILockAccessor(Core::System& system_)
- : ServiceFramework{system_, "ILockAccessor"}, m_context{system_, "ILockAccessor"},
- m_event{m_context} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, D<&ILockAccessor::TryLock>, "TryLock"},
- {2, D<&ILockAccessor::Unlock>, "Unlock"},
- {3, D<&ILockAccessor::GetEvent>, "GetEvent"},
- {4, D<&ILockAccessor::IsLocked>, "IsLocked"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
- m_event.Signal(system.Kernel());
-}
-
-ILockAccessor::~ILockAccessor() = default;
-
-Result ILockAccessor::TryLock(Out<bool> out_is_locked,
- OutCopyHandle<Kernel::KReadableEvent> out_handle,
- bool return_handle) {
- LOG_INFO(Service_AM, "called, return_handle={}", return_handle);
-
- {
- std::scoped_lock lk{m_mutex};
- if (m_is_locked) {
- *out_is_locked = false;
- } else {
- m_is_locked = true;
- *out_is_locked = true;
- }
- }
-
- if (return_handle) {
- *out_handle = m_event.GetHandle();
- }
-
- R_SUCCEED();
-}
-
-Result ILockAccessor::Unlock() {
- LOG_INFO(Service_AM, "called");
-
- {
- std::scoped_lock lk{m_mutex};
- m_is_locked = false;
- }
-
- m_event.Signal(system.Kernel());
- R_SUCCEED();
-}
-
-Result ILockAccessor::GetEvent(OutCopyHandle<Kernel::KReadableEvent> out_handle) {
- LOG_INFO(Service_AM, "called");
- *out_handle = m_event.GetHandle();
- R_SUCCEED();
-}
-
-Result ILockAccessor::IsLocked(Out<bool> out_is_locked) {
- LOG_INFO(Service_AM, "called");
- std::scoped_lock lk{m_mutex};
- *out_is_locked = m_is_locked;
- R_SUCCEED();
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/lock_accessor.h b/src/core/hle/service/am/service/lock_accessor.h
deleted file mode 100644
index 9bfb5c0502..0000000000
--- a/src/core/hle/service/am/service/lock_accessor.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/kernel_helpers.h"
-#include "core/hle/service/os/event.h"
-#include "core/hle/service/service.h"
-
-namespace Service::AM {
-
-class ILockAccessor final : public ServiceFramework<ILockAccessor> {
-public:
- explicit ILockAccessor(Core::System& system_);
- ~ILockAccessor() override;
-
-private:
- Result TryLock(Out<bool> out_is_locked, OutCopyHandle<Kernel::KReadableEvent> out_handle,
- bool return_handle);
- Result Unlock();
- Result GetEvent(OutCopyHandle<Kernel::KReadableEvent> out_handle);
- Result IsLocked(Out<bool> out_is_locked);
-
-private:
- KernelHelpers::ServiceContext m_context;
- Event m_event;
- std::mutex m_mutex{};
- bool m_is_locked{};
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/overlay_applet_proxy.cpp b/src/core/hle/service/am/service/overlay_applet_proxy.cpp
deleted file mode 100644
index 5e140fe031..0000000000
--- a/src/core/hle/service/am/service/overlay_applet_proxy.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#include "core/hle/service/am/service/common_state_getter.h"
-#include "core/hle/service/am/service/display_controller.h"
-#include "core/hle/service/am/service/global_state_controller.h"
-#include "core/hle/service/am/service/audio_controller.h"
-#include "core/hle/service/am/service/applet_common_functions.h"
-#include "core/hle/service/am/service/overlay_applet_proxy.h"
-#include "core/hle/service/am/service/library_applet_creator.h"
-#include "core/hle/service/am/service/process_winding_controller.h"
-#include "core/hle/service/am/service/self_controller.h"
-#include "core/hle/service/am/service/window_controller.h"
-#include "core/hle/service/am/service/debug_functions.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::AM {
- IOverlayAppletProxy::IOverlayAppletProxy(Core::System &system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess *process, WindowSystem &window_system)
- : ServiceFramework{system_, "IOverlayAppletProxy"},
- m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
- {1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"},
- {2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"},
- {3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"},
- {4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"},
- {10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
- {11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
- {20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"},
- {21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
- {23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
- {1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
- }
-
- IOverlayAppletProxy::~IOverlayAppletProxy() = default;
-
- Result IOverlayAppletProxy::GetCommonStateGetter(
- Out<SharedPointer<ICommonStateGetter> > out_common_state_getter) {
- LOG_DEBUG(Service_AM, "called");
- *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetSelfController(
- Out<SharedPointer<ISelfController> > out_self_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetWindowController(
- Out<SharedPointer<IWindowController> > out_window_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetAudioController(
- Out<SharedPointer<IAudioController> > out_audio_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_audio_controller = std::make_shared<IAudioController>(system);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetDisplayController(
- Out<SharedPointer<IDisplayController> > out_display_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController> > out_process_winding_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator> > out_library_applet_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_creator =
- std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetOverlayFunctions(
- Out<SharedPointer<IOverlayFunctions> > out_overlay_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_overlay_functions = std::make_shared<IOverlayFunctions>(system, m_applet);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetAppletCommonFunctions(
- Out<SharedPointer<IAppletCommonFunctions> > out_applet_common_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetGlobalStateController(
- Out<SharedPointer<IGlobalStateController> > out_global_state_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
- R_SUCCEED();
- }
-
- Result IOverlayAppletProxy::GetDebugFunctions(
- Out<SharedPointer<IDebugFunctions> > out_debug_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_debug_functions = std::make_shared<IDebugFunctions>(system);
- R_SUCCEED();
- }
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/overlay_applet_proxy.h b/src/core/hle/service/am/service/overlay_applet_proxy.h
deleted file mode 100644
index 2c7fa57dfd..0000000000
--- a/src/core/hle/service/am/service/overlay_applet_proxy.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-#include "core/hle/service/am/service/overlay_functions.h"
-
-namespace Service::AM {
-
-struct Applet;
-class IAppletCommonFunctions;
-class IAudioController;
-class ICommonStateGetter;
-class IDebugFunctions;
-class IDisplayController;
-class IHomeMenuFunctions;
-class IGlobalStateController;
-class ILibraryAppletCreator;
-class ILibraryAppletSelfAccessor;
-class IProcessWindingController;
-class ISelfController;
-class IWindowController;
-class WindowSystem;
-
-class IOverlayAppletProxy final : public ServiceFramework<IOverlayAppletProxy> {
-public:
- explicit IOverlayAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess* process, WindowSystem& window_system);
- ~IOverlayAppletProxy();
-
-private:
- Result GetCommonStateGetter(Out<SharedPointer<ICommonStateGetter>> out_common_state_getter);
- Result GetSelfController(Out<SharedPointer<ISelfController>> out_self_controller);
- Result GetWindowController(Out<SharedPointer<IWindowController>> out_window_controller);
- Result GetAudioController(Out<SharedPointer<IAudioController>> out_audio_controller);
- Result GetDisplayController(Out<SharedPointer<IDisplayController>> out_display_controller);
- Result GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller);
- Result GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator);
- Result GetOverlayFunctions(Out<SharedPointer<IOverlayFunctions>> out_overlay_functions);
- Result GetAppletCommonFunctions(
- Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions);
- Result GetGlobalStateController(
- Out<SharedPointer<IGlobalStateController>> out_global_state_controller);
- Result GetDebugFunctions(Out<SharedPointer<IDebugFunctions>> out_debug_functions);
-
- WindowSystem& m_window_system;
- Kernel::KProcess* const m_process;
- const std::shared_ptr<Applet> m_applet;
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/overlay_functions.cpp b/src/core/hle/service/am/service/overlay_functions.cpp
index 8150b5dd07..006610bd47 100644
--- a/src/core/hle/service/am/service/overlay_functions.cpp
+++ b/src/core/hle/service/am/service/overlay_functions.cpp
@@ -8,34 +8,34 @@
#include "core/hle/service/am/window_system.h"
namespace Service::AM {
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> IOverlayFunctions::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IOverlayFunctions::BeginToWatchShortHomeButtonMessage>, "BeginToWatchShortHomeButtonMessage"},
+ FunctionInfo{1, D<&IOverlayFunctions::EndToWatchShortHomeButtonMessage>, "EndToWatchShortHomeButtonMessage"},
+ FunctionInfo{2, D<&IOverlayFunctions::GetApplicationIdForLogo>, "GetApplicationIdForLogo"},
+ FunctionInfo{3, nullptr, "SetGpuTimeSliceBoost"},
+ FunctionInfo{4, D<&IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled>, "SetAutoSleepTimeAndDimmingTimeEnabled"},
+ FunctionInfo{5, nullptr, "TerminateApplicationAndSetReason"},
+ FunctionInfo{6, nullptr, "SetScreenShotPermissionGlobally"},
+ FunctionInfo{10, nullptr, "StartShutdownSequenceForOverlay"},
+ FunctionInfo{11, nullptr, "StartRebootSequenceForOverlay"},
+ FunctionInfo{20, D<&IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
+ FunctionInfo{21, D<&IOverlayFunctions::SetHandlingTouchScreenInputEnabled>, "SetHandlingTouchScreenInputEnabled"},
+ FunctionInfo{30, nullptr, "SetHealthWarningShowingState"},
+ FunctionInfo{31, D<&IOverlayFunctions::IsHealthWarningRequired>, "IsHealthWarningRequired"},
+ FunctionInfo{40, nullptr, "GetApplicationNintendoLogo"},
+ FunctionInfo{41, nullptr, "GetApplicationStartupMovie"},
+ FunctionInfo{50, nullptr, "SetGpuTimeSliceBoostForApplication"},
+ FunctionInfo{60, nullptr, "Unknown60"},
+ FunctionInfo{70, D<&IOverlayFunctions::Unknown70>, "Unknown70"},
+ FunctionInfo{90, nullptr, "SetRequiresGpuResourceUse"},
+ FunctionInfo{101, nullptr, "BeginToObserveHidInputForDevelop"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
IOverlayFunctions::IOverlayFunctions(Core::System &system_, std::shared_ptr<Applet> applet)
: ServiceFramework{system_, "IOverlayFunctions"}, m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IOverlayFunctions::BeginToWatchShortHomeButtonMessage>, "BeginToWatchShortHomeButtonMessage"},
- {1, D<&IOverlayFunctions::EndToWatchShortHomeButtonMessage>, "EndToWatchShortHomeButtonMessage"},
- {2, D<&IOverlayFunctions::GetApplicationIdForLogo>, "GetApplicationIdForLogo"},
- {3, nullptr, "SetGpuTimeSliceBoost"},
- {4, D<&IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled>, "SetAutoSleepTimeAndDimmingTimeEnabled"},
- {5, nullptr, "TerminateApplicationAndSetReason"},
- {6, nullptr, "SetScreenShotPermissionGlobally"},
- {10, nullptr, "StartShutdownSequenceForOverlay"},
- {11, nullptr, "StartRebootSequenceForOverlay"},
- {20, D<&IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"},
- {21, D<&IOverlayFunctions::SetHandlingTouchScreenInputEnabled>, "SetHandlingTouchScreenInputEnabled"},
- {30, nullptr, "SetHealthWarningShowingState"},
- {31, D<&IOverlayFunctions::IsHealthWarningRequired>, "IsHealthWarningRequired"},
- {40, nullptr, "GetApplicationNintendoLogo"},
- {41, nullptr, "GetApplicationStartupMovie"},
- {50, nullptr, "SetGpuTimeSliceBoostForApplication"},
- {60, nullptr, "Unknown60"},
- {70, D<&IOverlayFunctions::Unknown70>, "Unknown70"},
- {90, nullptr, "SetRequiresGpuResourceUse"},
- {101, nullptr, "BeginToObserveHidInputForDevelop"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IOverlayFunctions::~IOverlayFunctions() = default;
diff --git a/src/core/hle/service/am/service/overlay_functions.h b/src/core/hle/service/am/service/overlay_functions.h
index eefd8d862b..b94f0cc0d5 100644
--- a/src/core/hle/service/am/service/overlay_functions.h
+++ b/src/core/hle/service/am/service/overlay_functions.h
@@ -6,24 +6,25 @@
#include "core/hle/service/service.h"
namespace Service::AM {
- struct Applet;
+struct Applet;
- class IOverlayFunctions final : public ServiceFramework<IOverlayFunctions> {
- public:
- explicit IOverlayFunctions(Core::System &system_, std::shared_ptr<Applet> applet);
- ~IOverlayFunctions() override;
+class IOverlayFunctions final : public ServiceFramework<IOverlayFunctions> {
+public:
+ explicit IOverlayFunctions(Core::System &system_, std::shared_ptr<Applet> applet);
+ ~IOverlayFunctions() override;
- private:
- Result BeginToWatchShortHomeButtonMessage();
- Result EndToWatchShortHomeButtonMessage();
- Result GetApplicationIdForLogo(Out<u64> out_application_id);
- Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled);
- Result IsHealthWarningRequired(Out<bool> is_required);
- Result SetHandlingHomeButtonShortPressedEnabled(bool enabled);
- Result SetHandlingTouchScreenInputEnabled(bool enabled);
- Result Unknown70();
+private:
+ Result BeginToWatchShortHomeButtonMessage();
+ Result EndToWatchShortHomeButtonMessage();
+ Result GetApplicationIdForLogo(Out<u64> out_application_id);
+ Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled);
+ Result IsHealthWarningRequired(Out<bool> is_required);
+ Result SetHandlingHomeButtonShortPressedEnabled(bool enabled);
+ Result SetHandlingTouchScreenInputEnabled(bool enabled);
+ Result Unknown70();
- private:
- const std::shared_ptr<Applet> m_applet;
- };
+private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+ const std::shared_ptr<Applet> m_applet;
+};
} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/process_winding_controller.cpp b/src/core/hle/service/am/service/process_winding_controller.cpp
index e284aa2d89..159f4dfd5c 100644
--- a/src/core/hle/service/am/service/process_winding_controller.cpp
+++ b/src/core/hle/service/am/service/process_winding_controller.cpp
@@ -13,23 +13,23 @@
namespace Service::AM {
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> IProcessWindingController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"},
+ FunctionInfo{11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"},
+ FunctionInfo{21, D<&IProcessWindingController::PushContext>, "PushContext"},
+ FunctionInfo{22, D<&IProcessWindingController::PopContext>, "PopContext"},
+ FunctionInfo{23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"},
+ FunctionInfo{30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"},
+ FunctionInfo{40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"},
+ FunctionInfo{41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
IProcessWindingController::IProcessWindingController(Core::System& system_,
std::shared_ptr<Applet> applet)
: ServiceFramework{system_, "IProcessWindingController"}, m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"},
- {11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"},
- {21, D<&IProcessWindingController::PushContext>, "PushContext"},
- {22, D<&IProcessWindingController::PopContext>, "PopContext"},
- {23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"},
- {30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"},
- {40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"},
- {41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IProcessWindingController::~IProcessWindingController() = default;
diff --git a/src/core/hle/service/am/service/process_winding_controller.h b/src/core/hle/service/am/service/process_winding_controller.h
index f3417bcd97..91b29ac04b 100644
--- a/src/core/hle/service/am/service/process_winding_controller.h
+++ b/src/core/hle/service/am/service/process_winding_controller.h
@@ -33,6 +33,7 @@ private:
SharedPointer<ILibraryAppletAccessor> reserved_applet_accessor);
Result ReserveToStartAndWait(SharedPointer<ILibraryAppletAccessor> reserved_applet_accessor);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/self_controller.cpp b/src/core/hle/service/am/service/self_controller.cpp
index 3a654b9daa..ce8a308d6a 100644
--- a/src/core/hle/service/am/service/self_controller.cpp
+++ b/src/core/hle/service/am/service/self_controller.cpp
@@ -17,67 +17,66 @@
namespace Service::AM {
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> ISelfController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ISelfController::Exit>, "Exit"},
+ FunctionInfo{1, D<&ISelfController::LockExit>, "LockExit"},
+ FunctionInfo{2, D<&ISelfController::UnlockExit>, "UnlockExit"},
+ FunctionInfo{3, D<&ISelfController::EnterFatalSection>, "EnterFatalSection"},
+ FunctionInfo{4, D<&ISelfController::LeaveFatalSection>, "LeaveFatalSection"},
+ FunctionInfo{9, D<&ISelfController::GetLibraryAppletLaunchableEvent>, "GetLibraryAppletLaunchableEvent"},
+ FunctionInfo{10, D<&ISelfController::SetScreenShotPermission>, "SetScreenShotPermission"},
+ FunctionInfo{11, D<&ISelfController::SetOperationModeChangedNotification>, "SetOperationModeChangedNotification"},
+ FunctionInfo{12, D<&ISelfController::SetPerformanceModeChangedNotification>, "SetPerformanceModeChangedNotification"},
+ FunctionInfo{13, D<&ISelfController::SetFocusHandlingMode>, "SetFocusHandlingMode"},
+ FunctionInfo{14, D<&ISelfController::SetRestartMessageEnabled>, "SetRestartMessageEnabled"},
+ FunctionInfo{15, D<&ISelfController::SetScreenShotAppletIdentityInfo>, "SetScreenShotAppletIdentityInfo"},
+ FunctionInfo{16, D<&ISelfController::SetOutOfFocusSuspendingEnabled>, "SetOutOfFocusSuspendingEnabled"},
+ FunctionInfo{17, nullptr, "SetControllerFirmwareUpdateSection"},
+ FunctionInfo{18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"},
+ FunctionInfo{19, D<&ISelfController::SetAlbumImageOrientation>, "SetAlbumImageOrientation"},
+ FunctionInfo{20, nullptr, "SetDesirableKeyboardLayout"},
+ FunctionInfo{21, nullptr, "GetScreenShotProgramId"},
+ FunctionInfo{40, D<&ISelfController::CreateManagedDisplayLayer>, "CreateManagedDisplayLayer"},
+ FunctionInfo{41, D<&ISelfController::IsSystemBufferSharingEnabled>, "IsSystemBufferSharingEnabled"},
+ FunctionInfo{42, D<&ISelfController::GetSystemSharedLayerHandle>, "GetSystemSharedLayerHandle"},
+ FunctionInfo{43, D<&ISelfController::GetSystemSharedBufferHandle>, "GetSystemSharedBufferHandle"},
+ FunctionInfo{44, D<&ISelfController::CreateManagedDisplaySeparableLayer>, "CreateManagedDisplaySeparableLayer"},
+ FunctionInfo{45, nullptr, "SetManagedDisplayLayerSeparationMode"},
+ FunctionInfo{46, nullptr, "SetRecordingLayerCompositionEnabled"},
+ FunctionInfo{50, D<&ISelfController::SetHandlesRequestToDisplay>, "SetHandlesRequestToDisplay"},
+ FunctionInfo{51, D<&ISelfController::ApproveToDisplay>, "ApproveToDisplay"},
+ FunctionInfo{60, D<&ISelfController::OverrideAutoSleepTimeAndDimmingTime>, "OverrideAutoSleepTimeAndDimmingTime"},
+ FunctionInfo{61, D<&ISelfController::SetMediaPlaybackState>, "SetMediaPlaybackState"},
+ FunctionInfo{62, D<&ISelfController::SetIdleTimeDetectionExtension>, "SetIdleTimeDetectionExtension"},
+ FunctionInfo{63, D<&ISelfController::GetIdleTimeDetectionExtension>, "GetIdleTimeDetectionExtension"},
+ FunctionInfo{64, nullptr, "SetInputDetectionSourceSet"},
+ FunctionInfo{65, D<&ISelfController::ReportUserIsActive>, "ReportUserIsActive"},
+ FunctionInfo{66, nullptr, "GetCurrentIlluminance"},
+ FunctionInfo{67, D<&ISelfController::IsIlluminanceAvailable>, "IsIlluminanceAvailable"},
+ FunctionInfo{68, D<&ISelfController::SetAutoSleepDisabled>, "SetAutoSleepDisabled"},
+ FunctionInfo{69, D<&ISelfController::IsAutoSleepDisabled>, "IsAutoSleepDisabled"},
+ FunctionInfo{70, nullptr, "ReportMultimediaError"},
+ FunctionInfo{71, nullptr, "GetCurrentIlluminanceEx"},
+ FunctionInfo{72, D<&ISelfController::SetInputDetectionPolicy>, "SetInputDetectionPolicy"},
+ FunctionInfo{80, nullptr, "SetWirelessPriorityMode"},
+ FunctionInfo{90, D<&ISelfController::GetAccumulatedSuspendedTickValue>, "GetAccumulatedSuspendedTickValue"},
+ FunctionInfo{91, D<&ISelfController::GetAccumulatedSuspendedTickChangedEvent>, "GetAccumulatedSuspendedTickChangedEvent"},
+ FunctionInfo{100, D<&ISelfController::SetAlbumImageTakenNotificationEnabled>, "SetAlbumImageTakenNotificationEnabled"},
+ FunctionInfo{110, nullptr, "SetApplicationAlbumUserData"},
+ FunctionInfo{120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"},
+ FunctionInfo{130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"},
+ FunctionInfo{230, D<&ISelfController::Unknown230>, "Unknown230"},
+ FunctionInfo{240, D<&ISelfController::Unknown240>, "Unknown240"},
+ FunctionInfo{1000, nullptr, "GetDebugStorageChannel"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
ISelfController::ISelfController(Core::System& system_, std::shared_ptr<Applet> applet,
Kernel::KProcess* process)
: ServiceFramework{system_, "ISelfController"}, m_process{process}, m_applet{
std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ISelfController::Exit>, "Exit"},
- {1, D<&ISelfController::LockExit>, "LockExit"},
- {2, D<&ISelfController::UnlockExit>, "UnlockExit"},
- {3, D<&ISelfController::EnterFatalSection>, "EnterFatalSection"},
- {4, D<&ISelfController::LeaveFatalSection>, "LeaveFatalSection"},
- {9, D<&ISelfController::GetLibraryAppletLaunchableEvent>, "GetLibraryAppletLaunchableEvent"},
- {10, D<&ISelfController::SetScreenShotPermission>, "SetScreenShotPermission"},
- {11, D<&ISelfController::SetOperationModeChangedNotification>, "SetOperationModeChangedNotification"},
- {12, D<&ISelfController::SetPerformanceModeChangedNotification>, "SetPerformanceModeChangedNotification"},
- {13, D<&ISelfController::SetFocusHandlingMode>, "SetFocusHandlingMode"},
- {14, D<&ISelfController::SetRestartMessageEnabled>, "SetRestartMessageEnabled"},
- {15, D<&ISelfController::SetScreenShotAppletIdentityInfo>, "SetScreenShotAppletIdentityInfo"},
- {16, D<&ISelfController::SetOutOfFocusSuspendingEnabled>, "SetOutOfFocusSuspendingEnabled"},
- {17, nullptr, "SetControllerFirmwareUpdateSection"},
- {18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"},
- {19, D<&ISelfController::SetAlbumImageOrientation>, "SetAlbumImageOrientation"},
- {20, nullptr, "SetDesirableKeyboardLayout"},
- {21, nullptr, "GetScreenShotProgramId"},
- {40, D<&ISelfController::CreateManagedDisplayLayer>, "CreateManagedDisplayLayer"},
- {41, D<&ISelfController::IsSystemBufferSharingEnabled>, "IsSystemBufferSharingEnabled"},
- {42, D<&ISelfController::GetSystemSharedLayerHandle>, "GetSystemSharedLayerHandle"},
- {43, D<&ISelfController::GetSystemSharedBufferHandle>, "GetSystemSharedBufferHandle"},
- {44, D<&ISelfController::CreateManagedDisplaySeparableLayer>, "CreateManagedDisplaySeparableLayer"},
- {45, nullptr, "SetManagedDisplayLayerSeparationMode"},
- {46, nullptr, "SetRecordingLayerCompositionEnabled"},
- {50, D<&ISelfController::SetHandlesRequestToDisplay>, "SetHandlesRequestToDisplay"},
- {51, D<&ISelfController::ApproveToDisplay>, "ApproveToDisplay"},
- {60, D<&ISelfController::OverrideAutoSleepTimeAndDimmingTime>, "OverrideAutoSleepTimeAndDimmingTime"},
- {61, D<&ISelfController::SetMediaPlaybackState>, "SetMediaPlaybackState"},
- {62, D<&ISelfController::SetIdleTimeDetectionExtension>, "SetIdleTimeDetectionExtension"},
- {63, D<&ISelfController::GetIdleTimeDetectionExtension>, "GetIdleTimeDetectionExtension"},
- {64, nullptr, "SetInputDetectionSourceSet"},
- {65, D<&ISelfController::ReportUserIsActive>, "ReportUserIsActive"},
- {66, nullptr, "GetCurrentIlluminance"},
- {67, D<&ISelfController::IsIlluminanceAvailable>, "IsIlluminanceAvailable"},
- {68, D<&ISelfController::SetAutoSleepDisabled>, "SetAutoSleepDisabled"},
- {69, D<&ISelfController::IsAutoSleepDisabled>, "IsAutoSleepDisabled"},
- {70, nullptr, "ReportMultimediaError"},
- {71, nullptr, "GetCurrentIlluminanceEx"},
- {72, D<&ISelfController::SetInputDetectionPolicy>, "SetInputDetectionPolicy"},
- {80, nullptr, "SetWirelessPriorityMode"},
- {90, D<&ISelfController::GetAccumulatedSuspendedTickValue>, "GetAccumulatedSuspendedTickValue"},
- {91, D<&ISelfController::GetAccumulatedSuspendedTickChangedEvent>, "GetAccumulatedSuspendedTickChangedEvent"},
- {100, D<&ISelfController::SetAlbumImageTakenNotificationEnabled>, "SetAlbumImageTakenNotificationEnabled"},
- {110, nullptr, "SetApplicationAlbumUserData"},
- {120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"},
- {130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"},
- {230, D<&ISelfController::Unknown230>, "Unknown230"},
- {240, D<&ISelfController::Unknown240>, "Unknown240"},
- {1000, nullptr, "GetDebugStorageChannel"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
std::scoped_lock lk{m_applet->lock};
m_applet->display_layer_manager.Initialize(system, m_process, m_applet->applet_id,
m_applet->library_applet_mode);
diff --git a/src/core/hle/service/am/service/self_controller.h b/src/core/hle/service/am/service/self_controller.h
index c9f480f575..ce77769da2 100644
--- a/src/core/hle/service/am/service/self_controller.h
+++ b/src/core/hle/service/am/service/self_controller.h
@@ -70,6 +70,7 @@ private:
Result Unknown230(u32 in_val, Out<u16> out_val);
Result Unknown240(u32 in_val);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KProcess* const m_process;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/am/service/storage.cpp b/src/core/hle/service/am/service/storage.cpp
index 5fe191bf2f..110a9f5a42 100644
--- a/src/core/hle/service/am/service/storage.cpp
+++ b/src/core/hle/service/am/service/storage.cpp
@@ -4,22 +4,86 @@
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
+#include "core/hle/kernel/k_transfer_memory.h"
#include "core/hle/service/am/am_results.h"
#include "core/hle/service/am/library_applet_storage.h"
#include "core/hle/service/am/service/storage.h"
-#include "core/hle/service/am/service/storage_accessor.h"
#include "core/hle/service/cmif_serialization.h"
namespace Service::AM {
+class IStorageAccessor final : public ServiceFramework<IStorageAccessor> {
+public:
+ explicit IStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl) : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} {}
+ ~IStorageAccessor() override = default;
+
+ Result GetSize(Out<s64> out_size) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_size = m_impl->GetSize();
+ R_SUCCEED();
+ }
+
+ Result Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset) {
+ LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size());
+ R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size()));
+ }
+
+ Result Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset) {
+ LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size());
+ R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size()));
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IStorageAccessor::GetSize>, "GetSize"},
+ FunctionInfo{10, D<&IStorageAccessor::Write>, "Write"},
+ FunctionInfo{11, D<&IStorageAccessor::Read>, "Read"}
+ );
+
+ const std::shared_ptr<LibraryAppletStorage> m_impl;
+};
+
+class ITransferStorageAccessor final : public ServiceFramework<ITransferStorageAccessor> {
+public:
+ explicit ITransferStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl) : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} {}
+ ~ITransferStorageAccessor() override = default;
+
+ Result GetSize(Out<s64> out_size) {
+ LOG_DEBUG(Service_AM, "called");
+ *out_size = m_impl->GetSize();
+ R_SUCCEED();
+ }
+
+ Result GetHandle(Out<s64> out_size, OutCopyHandle<Kernel::KTransferMemory> out_handle) {
+ LOG_INFO(Service_AM, "called");
+ *out_size = m_impl->GetSize();
+ *out_handle = m_impl->GetHandle();
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ITransferStorageAccessor::GetSize>, "GetSize"},
+ FunctionInfo{1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"}
+ );
+
+ const std::shared_ptr<LibraryAppletStorage> m_impl;
+};
+
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IStorage::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IStorage::Open>, "Open"},
+ FunctionInfo{1, D<&IStorage::OpenTransferStorage>, "OpenTransferStorage"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IStorage::IStorage(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl)
: ServiceFramework{system_, "IStorage"}, m_impl{std::move(impl)} {
- static const FunctionInfo functions[] = {
- {0, D<&IStorage::Open>, "Open"},
- {1, D<&IStorage::OpenTransferStorage>, "OpenTransferStorage"},
- };
-
- RegisterHandlers(functions);
}
IStorage::IStorage(Core::System& system_, std::vector<u8>&& data)
diff --git a/src/core/hle/service/am/service/storage.h b/src/core/hle/service/am/service/storage.h
index cde2ed0ead..63b7a0ad4c 100644
--- a/src/core/hle/service/am/service/storage.h
+++ b/src/core/hle/service/am/service/storage.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -29,6 +32,7 @@ private:
Result OpenTransferStorage(
Out<SharedPointer<ITransferStorageAccessor>> out_transfer_storage_accessor);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<LibraryAppletStorage> m_impl;
};
diff --git a/src/core/hle/service/am/service/storage_accessor.cpp b/src/core/hle/service/am/service/storage_accessor.cpp
deleted file mode 100644
index 84577fee45..0000000000
--- a/src/core/hle/service/am/service/storage_accessor.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/kernel/k_transfer_memory.h"
-#include "core/hle/service/am/library_applet_storage.h"
-#include "core/hle/service/am/service/storage_accessor.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::AM {
-
-IStorageAccessor::IStorageAccessor(Core::System& system_,
- std::shared_ptr<LibraryAppletStorage> impl)
- : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} {
- static const FunctionInfo functions[] = {
- {0, D<&IStorageAccessor::GetSize>, "GetSize"},
- {10, D<&IStorageAccessor::Write>, "Write"},
- {11, D<&IStorageAccessor::Read>, "Read"},
- };
-
- RegisterHandlers(functions);
-}
-
-IStorageAccessor::~IStorageAccessor() = default;
-
-Result IStorageAccessor::GetSize(Out<s64> out_size) {
- LOG_DEBUG(Service_AM, "called");
- *out_size = m_impl->GetSize();
- R_SUCCEED();
-}
-
-Result IStorageAccessor::Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset) {
- LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size());
- R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size()));
-}
-
-Result IStorageAccessor::Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset) {
- LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size());
- R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size()));
-}
-
-ITransferStorageAccessor::ITransferStorageAccessor(Core::System& system_,
- std::shared_ptr<LibraryAppletStorage> impl)
- : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} {
- static const FunctionInfo functions[] = {
- {0, D<&ITransferStorageAccessor::GetSize>, "GetSize"},
- {1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"},
- };
-
- RegisterHandlers(functions);
-}
-
-ITransferStorageAccessor::~ITransferStorageAccessor() = default;
-
-Result ITransferStorageAccessor::GetSize(Out<s64> out_size) {
- LOG_DEBUG(Service_AM, "called");
- *out_size = m_impl->GetSize();
- R_SUCCEED();
-}
-
-Result ITransferStorageAccessor::GetHandle(Out<s64> out_size,
- OutCopyHandle<Kernel::KTransferMemory> out_handle) {
- LOG_INFO(Service_AM, "called");
- *out_size = m_impl->GetSize();
- *out_handle = m_impl->GetHandle();
- R_SUCCEED();
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/storage_accessor.h b/src/core/hle/service/am/service/storage_accessor.h
deleted file mode 100644
index 1a01730e00..0000000000
--- a/src/core/hle/service/am/service/storage_accessor.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/am/library_applet_storage.h"
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::AM {
-
-class IStorageAccessor final : public ServiceFramework<IStorageAccessor> {
-public:
- explicit IStorageAccessor(Core::System& system_, std::shared_ptr<LibraryAppletStorage> impl);
- ~IStorageAccessor() override;
-
-private:
- Result GetSize(Out<s64> out_size);
- Result Write(InBuffer<BufferAttr_HipcAutoSelect> buffer, s64 offset);
- Result Read(OutBuffer<BufferAttr_HipcAutoSelect> out_buffer, s64 offset);
-
- const std::shared_ptr<LibraryAppletStorage> m_impl;
-};
-
-class ITransferStorageAccessor final : public ServiceFramework<ITransferStorageAccessor> {
-public:
- explicit ITransferStorageAccessor(Core::System& system_,
- std::shared_ptr<LibraryAppletStorage> impl);
- ~ITransferStorageAccessor() override;
-
-private:
- Result GetSize(Out<s64> out_size);
- Result GetHandle(Out<s64> out_size, OutCopyHandle<Kernel::KTransferMemory> out_handle);
-
- const std::shared_ptr<LibraryAppletStorage> m_impl;
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/system_applet_proxy.cpp b/src/core/hle/service/am/service/system_applet_proxy.cpp
deleted file mode 100644
index c435288a26..0000000000
--- a/src/core/hle/service/am/service/system_applet_proxy.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/am/service/applet_common_functions.h"
-#include "core/hle/service/am/service/application_creator.h"
-#include "core/hle/service/am/service/audio_controller.h"
-#include "core/hle/service/am/service/common_state_getter.h"
-#include "core/hle/service/am/service/debug_functions.h"
-#include "core/hle/service/am/service/display_controller.h"
-#include "core/hle/service/am/service/global_state_controller.h"
-#include "core/hle/service/am/service/home_menu_functions.h"
-#include "core/hle/service/am/service/library_applet_creator.h"
-#include "core/hle/service/am/service/process_winding_controller.h"
-#include "core/hle/service/am/service/self_controller.h"
-#include "core/hle/service/am/service/system_applet_proxy.h"
-#include "core/hle/service/am/service/window_controller.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::AM {
-
-ISystemAppletProxy::ISystemAppletProxy(Core::System& system_, std::shared_ptr<Applet> applet,
- Kernel::KProcess* process, WindowSystem& window_system)
- : ServiceFramework{system_, "ISystemAppletProxy"},
- m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ISystemAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"},
- {1, D<&ISystemAppletProxy::GetSelfController>, "GetSelfController"},
- {2, D<&ISystemAppletProxy::GetWindowController>, "GetWindowController"},
- {3, D<&ISystemAppletProxy::GetAudioController>, "GetAudioController"},
- {4, D<&ISystemAppletProxy::GetDisplayController>, "GetDisplayController"},
- {10, D<&ISystemAppletProxy::GetProcessWindingController>, "GetProcessWindingController"},
- {11, D<&ISystemAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"},
- {20, D<&ISystemAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"},
- {21, D<&ISystemAppletProxy::GetGlobalStateController>, "GetGlobalStateController"},
- {22, D<&ISystemAppletProxy::GetApplicationCreator>, "GetApplicationCreator"},
- {23, D<&ISystemAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"},
- {1000, D<&ISystemAppletProxy::GetDebugFunctions>, "GetDebugFunctions"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-ISystemAppletProxy::~ISystemAppletProxy() = default;
-
-Result ISystemAppletProxy::GetAudioController(
- Out<SharedPointer<IAudioController>> out_audio_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_audio_controller = std::make_shared<IAudioController>(system);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetDisplayController(
- Out<SharedPointer<IDisplayController>> out_display_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_display_controller = std::make_shared<IDisplayController>(system, m_applet);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_process_winding_controller = std::make_shared<IProcessWindingController>(system, m_applet);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetDebugFunctions(
- Out<SharedPointer<IDebugFunctions>> out_debug_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_debug_functions = std::make_shared<IDebugFunctions>(system);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetWindowController(
- Out<SharedPointer<IWindowController>> out_window_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_window_controller = std::make_shared<IWindowController>(system, m_applet, m_window_system);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetSelfController(
- Out<SharedPointer<ISelfController>> out_self_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_self_controller = std::make_shared<ISelfController>(system, m_applet, m_process);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetCommonStateGetter(
- Out<SharedPointer<ICommonStateGetter>> out_common_state_getter) {
- LOG_DEBUG(Service_AM, "called");
- *out_common_state_getter = std::make_shared<ICommonStateGetter>(system, m_applet);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_library_applet_creator =
- std::make_shared<ILibraryAppletCreator>(system, m_applet, m_window_system);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetApplicationCreator(
- Out<SharedPointer<IApplicationCreator>> out_application_creator) {
- LOG_DEBUG(Service_AM, "called");
- *out_application_creator = std::make_shared<IApplicationCreator>(system, m_window_system);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetAppletCommonFunctions(
- Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_applet_common_functions = std::make_shared<IAppletCommonFunctions>(system, m_applet);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetHomeMenuFunctions(
- Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions) {
- LOG_DEBUG(Service_AM, "called");
- *out_home_menu_functions =
- std::make_shared<IHomeMenuFunctions>(system, m_applet, m_window_system);
- R_SUCCEED();
-}
-
-Result ISystemAppletProxy::GetGlobalStateController(
- Out<SharedPointer<IGlobalStateController>> out_global_state_controller) {
- LOG_DEBUG(Service_AM, "called");
- *out_global_state_controller = std::make_shared<IGlobalStateController>(system);
- R_SUCCEED();
-}
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/system_applet_proxy.h b/src/core/hle/service/am/service/system_applet_proxy.h
deleted file mode 100644
index ab9769b3d9..0000000000
--- a/src/core/hle/service/am/service/system_applet_proxy.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::AM {
-
-struct Applet;
-class IAppletCommonFunctions;
-class IApplicationCreator;
-class IAudioController;
-class ICommonStateGetter;
-class IDebugFunctions;
-class IDisplayController;
-class IHomeMenuFunctions;
-class IGlobalStateController;
-class ILibraryAppletCreator;
-class IProcessWindingController;
-class ISelfController;
-class IWindowController;
-class WindowSystem;
-
-class ISystemAppletProxy final : public ServiceFramework<ISystemAppletProxy> {
-public:
- explicit ISystemAppletProxy(Core::System& system, std::shared_ptr<Applet> applet,
- Kernel::KProcess* process, WindowSystem& window_system);
- ~ISystemAppletProxy();
-
-private:
- Result GetCommonStateGetter(Out<SharedPointer<ICommonStateGetter>> out_common_state_getter);
- Result GetSelfController(Out<SharedPointer<ISelfController>> out_self_controller);
- Result GetWindowController(Out<SharedPointer<IWindowController>> out_window_controller);
- Result GetAudioController(Out<SharedPointer<IAudioController>> out_audio_controller);
- Result GetDisplayController(Out<SharedPointer<IDisplayController>> out_display_controller);
- Result GetProcessWindingController(
- Out<SharedPointer<IProcessWindingController>> out_process_winding_controller);
- Result GetDebugFunctions(Out<SharedPointer<IDebugFunctions>> out_debug_functions);
- Result GetLibraryAppletCreator(
- Out<SharedPointer<ILibraryAppletCreator>> out_library_applet_creator);
- Result GetApplicationCreator(Out<SharedPointer<IApplicationCreator>> out_application_creator);
- Result GetAppletCommonFunctions(
- Out<SharedPointer<IAppletCommonFunctions>> out_applet_common_functions);
- Result GetHomeMenuFunctions(Out<SharedPointer<IHomeMenuFunctions>> out_home_menu_functions);
- Result GetGlobalStateController(
- Out<SharedPointer<IGlobalStateController>> out_global_state_controller);
-
- WindowSystem& m_window_system;
- Kernel::KProcess* const m_process;
- const std::shared_ptr<Applet> m_applet;
-};
-
-} // namespace Service::AM
diff --git a/src/core/hle/service/am/service/window_controller.cpp b/src/core/hle/service/am/service/window_controller.cpp
index 54396affbe..d07aba0c79 100644
--- a/src/core/hle/service/am/service/window_controller.cpp
+++ b/src/core/hle/service/am/service/window_controller.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -9,24 +12,24 @@
namespace Service::AM {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IWindowController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateWindow"},
+ FunctionInfo{1, D<&IWindowController::GetAppletResourceUserId>, "GetAppletResourceUserId"},
+ FunctionInfo{2, D<&IWindowController::GetAppletResourceUserIdOfCallerApplet>, "GetAppletResourceUserIdOfCallerApplet"},
+ FunctionInfo{10, D<&IWindowController::AcquireForegroundRights>, "AcquireForegroundRights"},
+ FunctionInfo{11, D<&IWindowController::ReleaseForegroundRights>, "ReleaseForegroundRights"},
+ FunctionInfo{12, D<&IWindowController::RejectToChangeIntoBackground>, "RejectToChangeIntoBackground"},
+ FunctionInfo{20, D<&IWindowController::SetAppletWindowVisibility>, "SetAppletWindowVisibility"},
+ FunctionInfo{21, D<&IWindowController::SetAppletGpuTimeSlice>, "SetAppletGpuTimeSlice"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IWindowController::IWindowController(Core::System& system_, std::shared_ptr<Applet> applet,
WindowSystem& window_system)
: ServiceFramework{system_, "IWindowController"},
m_window_system{window_system}, m_applet{std::move(applet)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CreateWindow"},
- {1, D<&IWindowController::GetAppletResourceUserId>, "GetAppletResourceUserId"},
- {2, D<&IWindowController::GetAppletResourceUserIdOfCallerApplet>, "GetAppletResourceUserIdOfCallerApplet"},
- {10, D<&IWindowController::AcquireForegroundRights>, "AcquireForegroundRights"},
- {11, D<&IWindowController::ReleaseForegroundRights>, "ReleaseForegroundRights"},
- {12, D<&IWindowController::RejectToChangeIntoBackground>, "RejectToChangeIntoBackground"},
- {20, D<&IWindowController::SetAppletWindowVisibility>, "SetAppletWindowVisibility"},
- {21, D<&IWindowController::SetAppletGpuTimeSlice>, "SetAppletGpuTimeSlice"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IWindowController::~IWindowController() = default;
diff --git a/src/core/hle/service/am/service/window_controller.h b/src/core/hle/service/am/service/window_controller.h
index a784dd4a49..29fd723421 100644
--- a/src/core/hle/service/am/service/window_controller.h
+++ b/src/core/hle/service/am/service/window_controller.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -26,6 +29,7 @@ private:
Result SetAppletWindowVisibility(bool visible);
Result SetAppletGpuTimeSlice(s64 time_slice);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
WindowSystem& m_window_system;
const std::shared_ptr<Applet> m_applet;
};
diff --git a/src/core/hle/service/aoc/addon_content_manager.cpp b/src/core/hle/service/aoc/addon_content_manager.cpp
index be2aa34baa..0222d9c52b 100644
--- a/src/core/hle/service/aoc/addon_content_manager.cpp
+++ b/src/core/hle/service/aoc/addon_content_manager.cpp
@@ -28,6 +28,34 @@
namespace Service::AOC {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAddOnContentManager::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CountAddOnContentByApplicationId"},
+ FunctionInfo{1, nullptr, "ListAddOnContentByApplicationId"},
+ FunctionInfo{2, D<&IAddOnContentManager::CountAddOnContent>, "CountAddOnContent"},
+ FunctionInfo{3, D<&IAddOnContentManager::ListAddOnContent>, "ListAddOnContent"},
+ FunctionInfo{4, nullptr, "GetAddOnContentBaseIdByApplicationId"},
+ FunctionInfo{5, D<&IAddOnContentManager::GetAddOnContentBaseId>, "GetAddOnContentBaseId"},
+ FunctionInfo{6, nullptr, "PrepareAddOnContentByApplicationId"},
+ FunctionInfo{7, D<&IAddOnContentManager::PrepareAddOnContent>, "PrepareAddOnContent"},
+ FunctionInfo{8, D<&IAddOnContentManager::GetAddOnContentListChangedEvent>, "GetAddOnContentListChangedEvent"},
+ FunctionInfo{9, nullptr, "GetAddOnContentLostErrorCode"},
+ FunctionInfo{10, D<&IAddOnContentManager::GetAddOnContentListChangedEventWithProcessId>, "GetAddOnContentListChangedEventWithProcessId"},
+ FunctionInfo{11, D<&IAddOnContentManager::NotifyMountAddOnContent>, "NotifyMountAddOnContent"},
+ FunctionInfo{12, D<&IAddOnContentManager::NotifyUnmountAddOnContent>, "NotifyUnmountAddOnContent"},
+ FunctionInfo{13, nullptr, "IsAddOnContentMountedForDebug"},
+ FunctionInfo{50, D<&IAddOnContentManager::CheckAddOnContentMountStatus>, "CheckAddOnContentMountStatus"},
+ FunctionInfo{100, D<&IAddOnContentManager::CreateEcPurchasedEventManager>, "CreateEcPurchasedEventManager"},
+ FunctionInfo{101, D<&IAddOnContentManager::CreatePermanentEcPurchasedEventManager>, "CreatePermanentEcPurchasedEventManager"},
+ FunctionInfo{110, nullptr, "CreateContentsServiceManager"},
+ FunctionInfo{200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
+ FunctionInfo{300, nullptr, "SetupHostAddOnContent"},
+ FunctionInfo{301, nullptr, "GetRegisteredAddOnContentPath"},
+ FunctionInfo{302, nullptr, "UpdateCachedList"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
static bool CheckAOCTitleIDMatchesBase(u64 title_id, u64 base) {
return FileSys::GetBaseTitleID(title_id) == base;
}
@@ -57,35 +85,6 @@ static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) {
IAddOnContentManager::IAddOnContentManager(Core::System& system_)
: ServiceFramework{system_, "aoc:u"}, add_on_content{AccumulateAOCTitleIDs(system)},
service_context{system_, "aoc:u"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CountAddOnContentByApplicationId"},
- {1, nullptr, "ListAddOnContentByApplicationId"},
- {2, D<&IAddOnContentManager::CountAddOnContent>, "CountAddOnContent"},
- {3, D<&IAddOnContentManager::ListAddOnContent>, "ListAddOnContent"},
- {4, nullptr, "GetAddOnContentBaseIdByApplicationId"},
- {5, D<&IAddOnContentManager::GetAddOnContentBaseId>, "GetAddOnContentBaseId"},
- {6, nullptr, "PrepareAddOnContentByApplicationId"},
- {7, D<&IAddOnContentManager::PrepareAddOnContent>, "PrepareAddOnContent"},
- {8, D<&IAddOnContentManager::GetAddOnContentListChangedEvent>, "GetAddOnContentListChangedEvent"},
- {9, nullptr, "GetAddOnContentLostErrorCode"},
- {10, D<&IAddOnContentManager::GetAddOnContentListChangedEventWithProcessId>, "GetAddOnContentListChangedEventWithProcessId"},
- {11, D<&IAddOnContentManager::NotifyMountAddOnContent>, "NotifyMountAddOnContent"},
- {12, D<&IAddOnContentManager::NotifyUnmountAddOnContent>, "NotifyUnmountAddOnContent"},
- {13, nullptr, "IsAddOnContentMountedForDebug"},
- {50, D<&IAddOnContentManager::CheckAddOnContentMountStatus>, "CheckAddOnContentMountStatus"},
- {100, D<&IAddOnContentManager::CreateEcPurchasedEventManager>, "CreateEcPurchasedEventManager"},
- {101, D<&IAddOnContentManager::CreatePermanentEcPurchasedEventManager>, "CreatePermanentEcPurchasedEventManager"},
- {110, nullptr, "CreateContentsServiceManager"},
- {200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
- {300, nullptr, "SetupHostAddOnContent"},
- {301, nullptr, "GetRegisteredAddOnContentPath"},
- {302, nullptr, "UpdateCachedList"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
aoc_change_event = service_context.CreateEvent("GetAddOnContentListChanged:Event");
}
diff --git a/src/core/hle/service/aoc/addon_content_manager.h b/src/core/hle/service/aoc/addon_content_manager.h
index 91857df4c7..8ddb86cf19 100644
--- a/src/core/hle/service/aoc/addon_content_manager.h
+++ b/src/core/hle/service/aoc/addon_content_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -40,9 +43,9 @@ public:
OutInterface<IPurchaseEventManager> out_interface);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::vector<u64> add_on_content;
KernelHelpers::ServiceContext service_context;
-
Kernel::KEvent* aoc_change_event;
};
diff --git a/src/core/hle/service/aoc/purchase_event_manager.cpp b/src/core/hle/service/aoc/purchase_event_manager.cpp
index 9e718510b4..eded803b25 100644
--- a/src/core/hle/service/aoc/purchase_event_manager.cpp
+++ b/src/core/hle/service/aoc/purchase_event_manager.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,21 +11,20 @@ namespace Service::AOC {
constexpr Result ResultNoPurchasedProductInfoAvailable{ErrorModule::NIMShop, 400};
-IPurchaseEventManager::IPurchaseEventManager(Core::System& system_)
- : ServiceFramework{system_, "IPurchaseEventManager"}, service_context{system,
- "IPurchaseEventManager"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"},
- {1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"},
- {2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"},
- {3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"},
- {4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IPurchaseEventManager::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"},
+ FunctionInfo{1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"},
+ FunctionInfo{2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"},
+ FunctionInfo{3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"},
+ FunctionInfo{4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+IPurchaseEventManager::IPurchaseEventManager(Core::System& system_)
+ : ServiceFramework{system_, "IPurchaseEventManager"}
+ , service_context{system, "IPurchaseEventManager"} {
purchased_event = service_context.CreateEvent("IPurchaseEventManager:PurchasedEvent");
}
diff --git a/src/core/hle/service/aoc/purchase_event_manager.h b/src/core/hle/service/aoc/purchase_event_manager.h
index ea3836bc93..d11089e567 100644
--- a/src/core/hle/service/aoc/purchase_event_manager.h
+++ b/src/core/hle/service/aoc/purchase_event_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -22,6 +25,8 @@ public:
Result PopPurchasedProductInfo();
Result PopPurchasedProductInfoWithUid();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
private:
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* purchased_event;
diff --git a/src/core/hle/service/apm/apm_interface.cpp b/src/core/hle/service/apm/apm_interface.cpp
index 51c01e2f25..2b4768478e 100644
--- a/src/core/hle/service/apm/apm_interface.cpp
+++ b/src/core/hle/service/apm/apm_interface.cpp
@@ -14,15 +14,7 @@ namespace Service::APM {
class ISession final : public ServiceFramework<ISession> {
public:
- explicit ISession(Core::System& system_, Controller& controller_)
- : ServiceFramework{system_, "ISession"}, controller{controller_} {
- static const FunctionInfo functions[] = {
- {0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"},
- {1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"},
- {2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"},
- };
- RegisterHandlers(functions);
- }
+ explicit ISession(Core::System& system_, Controller& controller_) : ServiceFramework{system_, "ISession"}, controller{controller_} {}
private:
void SetPerformanceConfiguration(HLERequestContext& ctx) {
@@ -61,18 +53,20 @@ private:
rb.Push(ResultSuccess);
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"},
+ FunctionInfo{1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"},
+ FunctionInfo{2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"}
+ );
Controller& controller;
};
APM::APM(Core::System& system_, std::shared_ptr<Module> apm_, Controller& controller_,
const char* name)
: ServiceFramework{system_, name}, apm(std::move(apm_)), controller{controller_} {
- static const FunctionInfo functions[] = {
- {0, &APM::OpenSession, "OpenSession"},
- {1, &APM::GetPerformanceMode, "GetPerformanceMode"},
- {6, &APM::IsCpuOverclockEnabled, "IsCpuOverclockEnabled"},
- };
- RegisterHandlers(functions);
}
APM::~APM() = default;
@@ -102,20 +96,6 @@ void APM::IsCpuOverclockEnabled(HLERequestContext& ctx) {
APM_Sys::APM_Sys(Core::System& system_, Controller& controller_)
: ServiceFramework{system_, "apm:sys"}, controller{controller_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestPerformanceMode"},
- {1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"},
- {2, nullptr, "GetThrottlingState"},
- {3, nullptr, "GetLastThrottlingState"},
- {4, nullptr, "ClearLastThrottlingState"},
- {5, nullptr, "LoadAndApplySettings"},
- {6, &APM_Sys::SetCpuBoostMode, "SetCpuBoostMode"},
- {7, &APM_Sys::GetCurrentPerformanceConfiguration, "GetCurrentPerformanceConfiguration"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
APM_Sys::~APM_Sys() = default;
diff --git a/src/core/hle/service/apm/apm_interface.h b/src/core/hle/service/apm/apm_interface.h
index 58718453b6..0bbcd185a3 100644
--- a/src/core/hle/service/apm/apm_interface.h
+++ b/src/core/hle/service/apm/apm_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -21,6 +24,14 @@ private:
void GetPerformanceMode(HLERequestContext& ctx);
void IsCpuOverclockEnabled(HLERequestContext& ctx);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &APM::OpenSession, "OpenSession"},
+ FunctionInfo{1, &APM::GetPerformanceMode, "GetPerformanceMode"},
+ FunctionInfo{6, &APM::IsCpuOverclockEnabled, "IsCpuOverclockEnabled"}
+ );
std::shared_ptr<Module> apm;
Controller& controller;
};
@@ -36,6 +47,19 @@ private:
void GetPerformanceEvent(HLERequestContext& ctx);
void GetCurrentPerformanceConfiguration(HLERequestContext& ctx);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestPerformanceMode"},
+ FunctionInfo{1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"},
+ FunctionInfo{2, nullptr, "GetThrottlingState"},
+ FunctionInfo{3, nullptr, "GetLastThrottlingState"},
+ FunctionInfo{4, nullptr, "ClearLastThrottlingState"},
+ FunctionInfo{5, nullptr, "LoadAndApplySettings"},
+ FunctionInfo{6, &APM_Sys::SetCpuBoostMode, "SetCpuBoostMode"},
+ FunctionInfo{7, &APM_Sys::GetCurrentPerformanceConfiguration, "GetCurrentPerformanceConfiguration"}
+ );
Controller& controller;
};
diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp
index fde766a275..6177efd46c 100644
--- a/src/core/hle/service/audio/audio.cpp
+++ b/src/core/hle/service/audio/audio.cpp
@@ -21,164 +21,164 @@ namespace Service::Audio {
class IAudioOutManagerForApplet final : public ServiceFramework<IAudioOutManagerForApplet> {
public:
explicit IAudioOutManagerForApplet(Core::System& system_)
- : ServiceFramework{system_, "audout:a"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestSuspend"},
- {1, nullptr, "RequestResume"},
- {2, nullptr, "GetProcessMasterVolume"},
- {3, nullptr, "SetProcessMasterVolume"},
- {4, nullptr, "GetProcessRecordVolume"},
- {5, nullptr, "SetProcessRecordVolume"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "audout:a"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestSuspend"},
+ FunctionInfo{1, nullptr, "RequestResume"},
+ FunctionInfo{2, nullptr, "GetProcessMasterVolume"},
+ FunctionInfo{3, nullptr, "SetProcessMasterVolume"},
+ FunctionInfo{4, nullptr, "GetProcessRecordVolume"},
+ FunctionInfo{5, nullptr, "SetProcessRecordVolume"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IAudioSnoopManager final : public ServiceFramework<IAudioSnoopManager> {
public:
explicit IAudioSnoopManager(Core::System& system_)
- : ServiceFramework{system_, "auddev"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetDspStatistics"},
- {1, nullptr, "GetAppletStateSummaries"},
- {2, nullptr, "SetDspStatisticsParameter"},
- {3, nullptr, "GetDspStatisticsParameter"},
- {6, nullptr, "GetDspUsage"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "auddev"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetDspStatistics"},
+ FunctionInfo{1, nullptr, "GetAppletStateSummaries"},
+ FunctionInfo{2, nullptr, "SetDspStatisticsParameter"},
+ FunctionInfo{3, nullptr, "GetDspStatisticsParameter"},
+ FunctionInfo{6, nullptr, "GetDspUsage"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IAudioInManagerForApplet final : public ServiceFramework<IAudioInManagerForApplet> {
public:
explicit IAudioInManagerForApplet(Core::System& system_)
- : ServiceFramework{system_, "audin:a"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestSuspend"},
- {1, nullptr, "RequestResume"},
- {2, nullptr, "GetProcessMasterVolume"},
- {3, nullptr, "SetProcessMasterVolume"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "audin:a"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestSuspend"},
+ FunctionInfo{1, nullptr, "RequestResume"},
+ FunctionInfo{2, nullptr, "GetProcessMasterVolume"},
+ FunctionInfo{3, nullptr, "SetProcessMasterVolume"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IAudioRendererManagerForApplet final : public ServiceFramework<IAudioRendererManagerForApplet> {
public:
explicit IAudioRendererManagerForApplet(Core::System& system_)
- : ServiceFramework{system_, "audren:a"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestSuspend"},
- {1, nullptr, "RequestResume"},
- {2, nullptr, "GetProcessMasterVolume"},
- {3, nullptr, "SetProcessMasterVolume"},
- {4, nullptr, "RegisterAppletResourceUserId"},
- {5, nullptr, "UnregisterAppletResourceUserId"},
- {6, nullptr, "GetProcessRecordVolume"},
- {7, nullptr, "SetProcessRecordVolume"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "audren:a"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestSuspend"},
+ FunctionInfo{1, nullptr, "RequestResume"},
+ FunctionInfo{2, nullptr, "GetProcessMasterVolume"},
+ FunctionInfo{3, nullptr, "SetProcessMasterVolume"},
+ FunctionInfo{4, nullptr, "RegisterAppletResourceUserId"},
+ FunctionInfo{5, nullptr, "UnregisterAppletResourceUserId"},
+ FunctionInfo{6, nullptr, "GetProcessRecordVolume"},
+ FunctionInfo{7, nullptr, "SetProcessRecordVolume"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IAudioOutManagerForDebugger final : public ServiceFramework<IAudioOutManagerForDebugger> {
public:
explicit IAudioOutManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "audout:d"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestSuspend"},
- {1, nullptr, "RequestResume"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "audout:d"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestSuspend"},
+ FunctionInfo{1, nullptr, "RequestResume"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IAudioInManagerForDebugger final : public ServiceFramework<IAudioInManagerForDebugger> {
public:
explicit IAudioInManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "audin:d"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestSuspend"},
- {1, nullptr, "RequestResume"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "audin:d"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestSuspend"},
+ FunctionInfo{1, nullptr, "RequestResume"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IFinalOutputRecorderManagerForDebugger final : public ServiceFramework<IFinalOutputRecorderManagerForDebugger> {
public:
explicit IFinalOutputRecorderManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "audrec:d"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestSuspend"},
- {1, nullptr, "RequestResume"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "audrec:d"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestSuspend"},
+ FunctionInfo{1, nullptr, "RequestResume"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IAudioRendererManagerForDebugger final : public ServiceFramework<IAudioRendererManagerForDebugger> {
public:
explicit IAudioRendererManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "audren:d"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestSuspend"},
- {1, nullptr, "RequestResume"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "audren:d"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestSuspend"},
+ FunctionInfo{1, nullptr, "RequestResume"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IAudioSystemManagerForApplet final : public ServiceFramework<IAudioSystemManagerForApplet> {
public:
explicit IAudioSystemManagerForApplet(Core::System& system_)
- : ServiceFramework{system_, "aud:a"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RegisterAppletResourceUserId"},
- {1, nullptr, "UnregisterAppletResourceUserId"},
- {2, nullptr, "RequestSuspendAudio"},
- {3, nullptr, "RequestResumeAudio"},
- {4, nullptr, "GetAudioOutputProcessMasterVolume"},
- {5, nullptr, "SetAudioOutputProcessMasterVolume"},
- {6, nullptr, "GetAudioInputProcessMasterVolume"},
- {7, nullptr, "SetAudioInputProcessMasterVolume"},
- {8, nullptr, "GetAudioOutputProcessRecordVolume"},
- {9, nullptr, "SetAudioOutputProcessRecordVolume"},
- {10, nullptr, "GetAppletStateSummaries"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "aud:a"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RegisterAppletResourceUserId"},
+ FunctionInfo{1, nullptr, "UnregisterAppletResourceUserId"},
+ FunctionInfo{2, nullptr, "RequestSuspendAudio"},
+ FunctionInfo{3, nullptr, "RequestResumeAudio"},
+ FunctionInfo{4, nullptr, "GetAudioOutputProcessMasterVolume"},
+ FunctionInfo{5, nullptr, "SetAudioOutputProcessMasterVolume"},
+ FunctionInfo{6, nullptr, "GetAudioInputProcessMasterVolume"},
+ FunctionInfo{7, nullptr, "SetAudioInputProcessMasterVolume"},
+ FunctionInfo{8, nullptr, "GetAudioOutputProcessRecordVolume"},
+ FunctionInfo{9, nullptr, "SetAudioOutputProcessRecordVolume"},
+ FunctionInfo{10, nullptr, "GetAppletStateSummaries"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IAudioSystemManagerForDebugger final : public ServiceFramework<IAudioSystemManagerForDebugger> {
public:
explicit IAudioSystemManagerForDebugger(Core::System& system_)
- : ServiceFramework{system_, "aud:d"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestSuspendAudioForDebug"},
- {1, nullptr, "RequestResumeAudioForDebug"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "aud:d"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestSuspendAudioForDebug"},
+ FunctionInfo{1, nullptr, "RequestResumeAudioForDebug"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/audio/audio_controller.cpp b/src/core/hle/service/audio/audio_controller.cpp
index 611e48e8ba..d912a5e86a 100644
--- a/src/core/hle/service/audio/audio_controller.cpp
+++ b/src/core/hle/service/audio/audio_controller.cpp
@@ -1,7 +1,7 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -20,77 +20,75 @@
namespace Service::Audio {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAudioController::GetTargetVolume>, "GetTargetVolume"},
+ FunctionInfo{1, D<&IAudioController::SetTargetVolume>, "SetTargetVolume"},
+ FunctionInfo{2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"},
+ FunctionInfo{3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"},
+ FunctionInfo{4, D<&IAudioController::IsTargetMute>, "IsTargetMute"},
+ FunctionInfo{5, D<&IAudioController::SetTargetMute>, "SetTargetMute"},
+ FunctionInfo{6, nullptr, "IsTargetConnected", MakeVersionGate({20,0,0})},
+ FunctionInfo{7, nullptr, "SetDefaultTarget"},
+ FunctionInfo{8, nullptr, "GetDefaultTarget"},
+ FunctionInfo{9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"},
+ FunctionInfo{10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"},
+ FunctionInfo{11, nullptr, "SetForceMutePolicy"},
+ FunctionInfo{12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"},
+ FunctionInfo{13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"},
+ FunctionInfo{14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"},
+ FunctionInfo{15, nullptr, "SetOutputTarget"},
+ FunctionInfo{16, nullptr, "SetInputTargetForceEnabled"},
+ FunctionInfo{17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"},
+ FunctionInfo{18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"},
+ FunctionInfo{19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"},
+ FunctionInfo{20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"},
+ FunctionInfo{21, nullptr, "GetAudioOutputTargetForPlayReport"},
+ FunctionInfo{22, D<&IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent>, "NotifyHeadphoneVolumeWarningDisplayedEvent"},
+ FunctionInfo{23, nullptr, "SetSystemOutputMasterVolume"},
+ FunctionInfo{24, nullptr, "GetSystemOutputMasterVolume"},
+ FunctionInfo{25, nullptr, "GetAudioVolumeDataForPlayReport"},
+ FunctionInfo{26, nullptr, "UpdateHeadphoneSettings"},
+ FunctionInfo{27, nullptr, "SetVolumeMappingTableForDev"},
+ FunctionInfo{28, nullptr, "GetAudioOutputChannelCountForPlayReport"},
+ FunctionInfo{29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
+ FunctionInfo{30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"},
+ FunctionInfo{31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"},
+ FunctionInfo{32, D<&IAudioController::GetActiveOutputTarget>, "GetActiveOutputTarget"},
+ FunctionInfo{33, nullptr, "GetTargetDeviceInfo"},
+ FunctionInfo{34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"},
+ FunctionInfo{35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
+ FunctionInfo{36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
+ FunctionInfo{37, nullptr, "SetHearingProtectionSafeguardEnabled"},
+ FunctionInfo{38, nullptr, "IsHearingProtectionSafeguardEnabled"},
+ FunctionInfo{39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"},
+ FunctionInfo{40, nullptr, "GetSystemInformationForDebug"},
+ FunctionInfo{41, nullptr, "SetVolumeButtonLongPressTime"},
+ FunctionInfo{42, nullptr, "SetNativeVolumeForDebug"},
+ FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})},
+ FunctionInfo{5000, D<&IAudioController::Unknown5000>, "Unknown5000", MakeVersionGate({19,0,0})},
+ FunctionInfo{10000, nullptr, "NotifyAudioOutputTargetForPlayReport"},
+ FunctionInfo{10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"},
+ FunctionInfo{10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"},
+ FunctionInfo{10100, nullptr, "GetAudioVolumeDataForPlayReport"},
+ FunctionInfo{10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"},
+ FunctionInfo{10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"},
+ FunctionInfo{10103, nullptr, "GetAudioOutputTargetForPlayReport"},
+ FunctionInfo{10104, nullptr, "GetAudioOutputChannelCountForPlayReport"},
+ FunctionInfo{10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})},
+ FunctionInfo{10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})},
+ FunctionInfo{10200, nullptr, "Unknown10200", MakeVersionGate({20,0,0})},
+ FunctionInfo{50000, nullptr, "SetAnalogInputBoostGainForPrototyping", MakeVersionGate({15,0,0}, {18,1,0})},
+ FunctionInfo{50001, nullptr, "OverrideDefaultTargetForDebug", MakeVersionGate({19,0,0}, {19,0,1})},
+ FunctionInfo{50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})},
+ FunctionInfo{50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAudioController::IAudioController(Core::System& system_)
: ServiceFramework{system_, "audctl"}, service_context{system, "audctl"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IAudioController::GetTargetVolume>, "GetTargetVolume"},
- {1, D<&IAudioController::SetTargetVolume>, "SetTargetVolume"},
- {2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"},
- {3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"},
- {4, D<&IAudioController::IsTargetMute>, "IsTargetMute"},
- {5, D<&IAudioController::SetTargetMute>, "SetTargetMute"},
- {6, nullptr, "IsTargetConnected"}, //20.0.0+
- {7, nullptr, "SetDefaultTarget"},
- {8, nullptr, "GetDefaultTarget"},
- {9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"},
- {10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"},
- {11, nullptr, "SetForceMutePolicy"},
- {12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"},
- {13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"},
- {14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"},
- {15, nullptr, "SetOutputTarget"},
- {16, nullptr, "SetInputTargetForceEnabled"},
- {17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"},
- {18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"},
- {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"},
- {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"},
- {21, nullptr, "GetAudioOutputTargetForPlayReport"},
- {22, D<&IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent>, "NotifyHeadphoneVolumeWarningDisplayedEvent"},
- {23, nullptr, "SetSystemOutputMasterVolume"},
- {24, nullptr, "GetSystemOutputMasterVolume"},
- {25, nullptr, "GetAudioVolumeDataForPlayReport"},
- {26, nullptr, "UpdateHeadphoneSettings"},
- {27, nullptr, "SetVolumeMappingTableForDev"},
- {28, nullptr, "GetAudioOutputChannelCountForPlayReport"},
- {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
- {30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"},
- {31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"},
- {32, D<&IAudioController::GetActiveOutputTarget>, "GetActiveOutputTarget"},
- {33, nullptr, "GetTargetDeviceInfo"},
- {34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"},
- {35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
- {36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
- {37, nullptr, "SetHearingProtectionSafeguardEnabled"},
- {38, nullptr, "IsHearingProtectionSafeguardEnabled"},
- {39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"},
- {40, nullptr, "GetSystemInformationForDebug"},
- {41, nullptr, "SetVolumeButtonLongPressTime"},
- {42, nullptr, "SetNativeVolumeForDebug"},
- {43, nullptr, "Unknown43"}, //21.0.0+
- {5000, D<&IAudioController::Unknown5000>, "Unknown5000"}, //19.0.0+
- {10000, nullptr, "NotifyAudioOutputTargetForPlayReport"},
- {10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"},
- {10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"},
- {10100, nullptr, "GetAudioVolumeDataForPlayReport"},
- {10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"},
- {10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"},
- {10103, nullptr, "GetAudioOutputTargetForPlayReport"},
- {10104, nullptr, "GetAudioOutputChannelCountForPlayReport"},
- {10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, //14.0.0-19.0.1
- {10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport"}, //14.0.0-19.0.1
- {10200, nullptr, "Unknown10200"}, //20.0.0+
- {50000, nullptr, "SetAnalogInputBoostGainForPrototyping"}, //15.0.0-18.1.0
- {50001, nullptr, "OverrideDefaultTargetForDebug"}, //19.0.0-19.0.1
- {50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug"}, //19.0.0+
- {50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug"} //19.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
- m_set_sys =
- system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
+ m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
notification_event = service_context.CreateEvent("IAudioController:NotificationEvent");
// Probably shouldn't do this in constructor?
diff --git a/src/core/hle/service/audio/audio_controller.h b/src/core/hle/service/audio/audio_controller.h
index ff51f4c244..e5c615fa21 100644
--- a/src/core/hle/service/audio/audio_controller.h
+++ b/src/core/hle/service/audio/audio_controller.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -59,8 +59,8 @@ private:
Result AcquireTargetNotification(OutCopyHandle<Kernel::KReadableEvent> out_notification_event);
Result Unknown5000(Out<SharedPointer<IAudioController>> out_audio_controller);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext service_context;
-
Kernel::KEvent* notification_event;
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
std::array<s32, 6> m_target_volumes{{15, 15, 15, 15, 15, 15}};
diff --git a/src/core/hle/service/audio/audio_device.cpp b/src/core/hle/service/audio/audio_device.cpp
index e9f7e074a1..fc24bf3ccd 100644
--- a/src/core/hle/service/audio/audio_device.cpp
+++ b/src/core/hle/service/audio/audio_device.cpp
@@ -12,36 +12,38 @@
namespace Service::Audio {
using namespace AudioCore::Renderer;
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioDevice::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"},
+ FunctionInfo{1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"},
+ FunctionInfo{2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"},
+ FunctionInfo{3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"},
+ FunctionInfo{4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"},
+ FunctionInfo{5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"},
+ FunctionInfo{6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"},
+ FunctionInfo{7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"},
+ FunctionInfo{8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"},
+ FunctionInfo{10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"},
+ FunctionInfo{11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"},
+ FunctionInfo{12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"},
+ FunctionInfo{13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"},
+ FunctionInfo{14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"},
+ FunctionInfo{15, nullptr, "AcquireAudioInputDeviceNotification", MakeVersionGate({17,0,0})},
+ FunctionInfo{16, nullptr, "ReleaseAudioInputDeviceNotification", MakeVersionGate({17,0,0})},
+ FunctionInfo{17, nullptr, "AcquireAudioOutputDeviceNotification", MakeVersionGate({17,0,0})},
+ FunctionInfo{18, nullptr, "ReleaseAudioOutputDeviceNotification", MakeVersionGate({17,0,0})},
+ FunctionInfo{19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})},
+ FunctionInfo{20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})},
+ FunctionInfo{21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency", MakeVersionGate({21,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u32 revision,
u32 device_num)
: ServiceFramework{system_, "IAudioDevice"}, service_context{system_, "IAudioDevice"},
impl{std::make_unique<AudioDevice>(system_, applet_resource_user_id, revision)},
event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} {
- static const FunctionInfo functions[] = {
- {0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"},
- {1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"},
- {2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"},
- {3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"},
- {4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"},
- {5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"},
- {6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"},
- {7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"},
- {8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"},
- {10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"},
- {11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"},
- {12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"},
- {13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"},
- {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"},
- {15, nullptr, "AcquireAudioInputDeviceNotification"}, //17.0.0+
- {16, nullptr, "ReleaseAudioInputDeviceNotification"}, //17.0.0+
- {17, nullptr, "AcquireAudioOutputDeviceNotification"}, //17.0.0+
- {18, nullptr, "ReleaseAudioOutputDeviceNotification"}, //17.0.0+
- {19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+
- {20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+
- {21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency"} //21.0.0+
- };
- RegisterHandlers(functions);
-
event->Signal(system.Kernel());
}
diff --git a/src/core/hle/service/audio/audio_device.h b/src/core/hle/service/audio/audio_device.h
index f6c12fbfeb..bd0aaa5f7c 100644
--- a/src/core/hle/service/audio/audio_device.h
+++ b/src/core/hle/service/audio/audio_device.h
@@ -55,6 +55,7 @@ private:
Result SetAudioDeviceOutputVolumeAutoTuneEnabled(bool enabled);
Result IsAudioDeviceOutputVolumeAutoTuneEnabled(Out<bool> out_enabled);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext service_context;
std::unique_ptr<AudioCore::Renderer::AudioDevice> impl;
Kernel::KEvent* event;
diff --git a/src/core/hle/service/audio/audio_in.cpp b/src/core/hle/service/audio/audio_in.cpp
index 6208c2d104..068574dbd2 100644
--- a/src/core/hle/service/audio/audio_in.cpp
+++ b/src/core/hle/service/audio/audio_in.cpp
@@ -11,35 +11,33 @@
namespace Service::Audio {
using namespace AudioCore::AudioIn;
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioIn::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"},
+ FunctionInfo{1, D<&IAudioIn::Start>, "Start"},
+ FunctionInfo{2, D<&IAudioIn::Stop>, "Stop"},
+ FunctionInfo{3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"},
+ FunctionInfo{4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"},
+ FunctionInfo{5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"},
+ FunctionInfo{6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"},
+ FunctionInfo{7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"},
+ FunctionInfo{8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"},
+ FunctionInfo{9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"},
+ FunctionInfo{10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"},
+ FunctionInfo{11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"},
+ FunctionInfo{12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"},
+ FunctionInfo{13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"},
+ FunctionInfo{14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAudioIn::IAudioIn(Core::System& system_, Manager& manager, size_t session_id,
const std::string& device_name, const AudioInParameter& in_params,
Kernel::KProcess* handle, u64 applet_resource_user_id)
- : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"},
- event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared<In>(system_,
- manager, event,
- session_id)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"},
- {1, D<&IAudioIn::Start>, "Start"},
- {2, D<&IAudioIn::Stop>, "Stop"},
- {3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"},
- {4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"},
- {5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"},
- {6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"},
- {7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"},
- {8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"},
- {9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"},
- {10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"},
- {11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"},
- {12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"},
- {13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"},
- {14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
+ : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"}
+ , event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared<In>(system_, manager, event, session_id)}
+{
process->Open(system.Kernel());
if (impl->GetSystem()
diff --git a/src/core/hle/service/audio/audio_in.h b/src/core/hle/service/audio/audio_in.h
index 3fe1e1e870..dd7a41f300 100644
--- a/src/core/hle/service/audio/audio_in.h
+++ b/src/core/hle/service/audio/audio_in.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -43,6 +46,7 @@ public:
Result FlushAudioInBuffers(Out<bool> out_flushed);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KProcess* process;
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* event;
diff --git a/src/core/hle/service/audio/audio_in_manager.cpp b/src/core/hle/service/audio/audio_in_manager.cpp
index 2675a57735..422e72148b 100644
--- a/src/core/hle/service/audio/audio_in_manager.cpp
+++ b/src/core/hle/service/audio/audio_in_manager.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -9,23 +12,23 @@
namespace Service::Audio {
using namespace AudioCore::AudioIn;
-IAudioInManager::IAudioInManager(Core::System& system_)
- : ServiceFramework{system_, "audin:u"}, impl{std::make_unique<AudioCore::AudioIn::Manager>(
- system_)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"},
- {1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"},
- {2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"},
- {3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"},
- {4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"},
- {5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioInManager::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"},
+ FunctionInfo{1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"},
+ FunctionInfo{2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"},
+ FunctionInfo{3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"},
+ FunctionInfo{4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"},
+ FunctionInfo{5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
}
+IAudioInManager::IAudioInManager(Core::System& system_)
+ : ServiceFramework{system_, "audin:u"}
+ , impl{std::make_unique<AudioCore::AudioIn::Manager>(system_)}
+{}
+
IAudioInManager::~IAudioInManager() = default;
Result IAudioInManager::ListAudioIns(
diff --git a/src/core/hle/service/audio/audio_in_manager.h b/src/core/hle/service/audio/audio_in_manager.h
index 2a983bc607..0ee0badba7 100644
--- a/src/core/hle/service/audio/audio_in_manager.h
+++ b/src/core/hle/service/audio/audio_in_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -51,6 +54,7 @@ private:
AudioCore::AudioIn::AudioInParameter parameter,
InCopyHandle<Kernel::KProcess> process_handle, ClientAppletResourceUserId aruid);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<AudioCore::AudioIn::Manager> impl;
};
diff --git a/src/core/hle/service/audio/audio_out.cpp b/src/core/hle/service/audio/audio_out.cpp
index 996eeede58..a5f06faab8 100644
--- a/src/core/hle/service/audio/audio_out.cpp
+++ b/src/core/hle/service/audio/audio_out.cpp
@@ -15,6 +15,26 @@
namespace Service::Audio {
using namespace AudioCore::AudioOut;
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioOut::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"},
+ FunctionInfo{1, D<&IAudioOut::Start>, "Start"},
+ FunctionInfo{2, D<&IAudioOut::Stop>, "Stop"},
+ FunctionInfo{3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"},
+ FunctionInfo{4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"},
+ FunctionInfo{5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"},
+ FunctionInfo{6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"},
+ FunctionInfo{7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"},
+ FunctionInfo{8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"},
+ FunctionInfo{9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"},
+ FunctionInfo{10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"},
+ FunctionInfo{11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"},
+ FunctionInfo{12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"},
+ FunctionInfo{13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id,
const std::string& device_name, const AudioOutParameter& in_params,
Kernel::KProcess* handle, u64 applet_resource_user_id)
@@ -22,26 +42,6 @@ IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id,
event{service_context.CreateEvent("AudioOutEvent")}, process{handle},
impl{std::make_shared<AudioCore::AudioOut::Out>(system_, manager, event, session_id)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"},
- {1, D<&IAudioOut::Start>, "Start"},
- {2, D<&IAudioOut::Stop>, "Stop"},
- {3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"},
- {4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"},
- {5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"},
- {6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"},
- {7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"},
- {8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"},
- {9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"},
- {10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"},
- {11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"},
- {12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"},
- {13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"},
- };
- // clang-format on
- RegisterHandlers(functions);
-
process->Open(system.Kernel());
}
diff --git a/src/core/hle/service/audio/audio_out.h b/src/core/hle/service/audio/audio_out.h
index 779b213e78..311eb84afe 100644
--- a/src/core/hle/service/audio/audio_out.h
+++ b/src/core/hle/service/audio/audio_out.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -49,6 +52,8 @@ public:
Result GetAudioOutVolume(Out<f32> out_volume);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* event;
Kernel::KProcess* process;
diff --git a/src/core/hle/service/audio/audio_out_manager.cpp b/src/core/hle/service/audio/audio_out_manager.cpp
index 3b2087932c..9f24bc3513 100644
--- a/src/core/hle/service/audio/audio_out_manager.cpp
+++ b/src/core/hle/service/audio/audio_out_manager.cpp
@@ -13,20 +13,20 @@
namespace Service::Audio {
using namespace AudioCore::AudioOut;
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioOutManager::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"},
+ FunctionInfo{1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"},
+ FunctionInfo{2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"},
+ FunctionInfo{3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAudioOutManager::IAudioOutManager(Core::System& system_)
: ServiceFramework{system_, "audout:u"}
, impl(system_)
{
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"},
- {1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"},
- {2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"},
- {3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IAudioOutManager::~IAudioOutManager() = default;
diff --git a/src/core/hle/service/audio/audio_out_manager.h b/src/core/hle/service/audio/audio_out_manager.h
index ec974aaba4..4c71c12cdf 100644
--- a/src/core/hle/service/audio/audio_out_manager.h
+++ b/src/core/hle/service/audio/audio_out_manager.h
@@ -43,6 +43,7 @@ private:
AudioCore::AudioOut::AudioOutParameter parameter,
InCopyHandle<Kernel::KProcess> process_handle, ClientAppletResourceUserId aruid);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::optional<AudioCore::AudioOut::Manager> impl;
};
diff --git a/src/core/hle/service/audio/audio_renderer.cpp b/src/core/hle/service/audio/audio_renderer.cpp
index dd76544094..bcb2adaf61 100644
--- a/src/core/hle/service/audio/audio_renderer.cpp
+++ b/src/core/hle/service/audio/audio_renderer.cpp
@@ -10,38 +10,37 @@
namespace Service::Audio {
using namespace AudioCore::Renderer;
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioRenderer::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"},
+ FunctionInfo{1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"},
+ FunctionInfo{2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"},
+ FunctionInfo{3, D<&IAudioRenderer::GetState>, "GetState"},
+ FunctionInfo{4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"},
+ FunctionInfo{5, D<&IAudioRenderer::Start>, "Start"},
+ FunctionInfo{6, D<&IAudioRenderer::Stop>, "Stop"},
+ FunctionInfo{7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"},
+ FunctionInfo{8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"},
+ FunctionInfo{9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"},
+ FunctionInfo{10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto", MakeVersionGate({3,0,0})},
+ FunctionInfo{11, nullptr, "ExecuteAudioRendererRendering", MakeVersionGate({3,0,0})},
+ FunctionInfo{12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter", MakeVersionGate({15,0,0})},
+ FunctionInfo{13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter", MakeVersionGate({15,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_,
AudioCore::AudioRendererParameterInternal& params,
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
Kernel::KProcess* process_handle_, u64 applet_resource_user_id,
s32 session_id)
- : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"},
- rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_},
- impl{std::make_unique<Renderer>(system_, manager, rendered_event)}, process_handle{
- process_handle_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"},
- {1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"},
- {2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"},
- {3, D<&IAudioRenderer::GetState>, "GetState"},
- {4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"},
- {5, D<&IAudioRenderer::Start>, "Start"},
- {6, D<&IAudioRenderer::Stop>, "Stop"},
- {7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"},
- {8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"},
- {9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"},
- {10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"}, //3.0.0+
- {11, nullptr, "ExecuteAudioRendererRendering"}, //3.0.0+
- {12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"}, //15.0.0+
- {13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"}, //15.0.0+
- };
- // clang-format on
- RegisterHandlers(functions);
-
+ : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}
+ , rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}
+ , impl{std::make_unique<Renderer>(system_, manager, rendered_event)}
+ , process_handle{process_handle_} {
process_handle->Open(system_.Kernel());
- impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle,
- applet_resource_user_id, session_id);
+ impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, applet_resource_user_id, session_id);
}
IAudioRenderer::~IAudioRenderer() {
diff --git a/src/core/hle/service/audio/audio_renderer.h b/src/core/hle/service/audio/audio_renderer.h
index f25c50ce8d..e03fc6551d 100644
--- a/src/core/hle/service/audio/audio_renderer.h
+++ b/src/core/hle/service/audio/audio_renderer.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -42,6 +45,7 @@ private:
Result SetVoiceDropParameter(f32 voice_drop_parameter);
Result GetVoiceDropParameter(Out<f32> out_voice_drop_parameter);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* rendered_event;
AudioCore::Renderer::Manager& manager;
diff --git a/src/core/hle/service/audio/audio_renderer_manager.cpp b/src/core/hle/service/audio/audio_renderer_manager.cpp
index 4756802eeb..98701c79c1 100644
--- a/src/core/hle/service/audio/audio_renderer_manager.cpp
+++ b/src/core/hle/service/audio/audio_renderer_manager.cpp
@@ -18,21 +18,21 @@ namespace Service::Audio {
using namespace AudioCore::Renderer;
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAudioRendererManager::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"},
+ FunctionInfo{1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"},
+ FunctionInfo{2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"},
+ FunctionInfo{3, nullptr, "OpenAudioRendererForManualExecution"},
+ FunctionInfo{4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAudioRendererManager::IAudioRendererManager(Core::System& system_)
: ServiceFramework{system_, "audren:u"}
, impl(system_)
{
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"},
- {1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"},
- {2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"},
- {3, nullptr, "OpenAudioRendererForManualExecution"},
- {4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IAudioRendererManager::~IAudioRendererManager() = default;
diff --git a/src/core/hle/service/audio/audio_renderer_manager.h b/src/core/hle/service/audio/audio_renderer_manager.h
index fdce8b6ffa..bd3ea06326 100644
--- a/src/core/hle/service/audio/audio_renderer_manager.h
+++ b/src/core/hle/service/audio/audio_renderer_manager.h
@@ -33,6 +33,7 @@ private:
Result GetAudioDeviceServiceWithRevisionInfo(Out<SharedPointer<IAudioDevice>> out_audio_device,
u32 revision, ClientAppletResourceUserId aruid);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::optional<AudioCore::Renderer::Manager> impl;
u32 num_audio_devices{0};
};
diff --git a/src/core/hle/service/audio/final_output_recorder_manager.cpp b/src/core/hle/service/audio/final_output_recorder_manager.cpp
index f70a0e62d7..9c51613de6 100644
--- a/src/core/hle/service/audio/final_output_recorder_manager.cpp
+++ b/src/core/hle/service/audio/final_output_recorder_manager.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,34 +11,29 @@ namespace Service::Audio {
class IFinalOutputRecorder final : public ServiceFramework<IFinalOutputRecorder> {
public:
explicit IFinalOutputRecorder(Core::System& system_)
- : ServiceFramework{system_, "IFinalOutputRecorder"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetFinalOutputRecorderState"},
- {1, nullptr, "Start"},
- {2, nullptr, "Stop"},
- {3, nullptr, "AppendFinalOutputRecorderBuffer"},
- {4, nullptr, "RegisterBufferEvent"},
- {5, nullptr, "GetReleasedFinalOutputRecorderBuffers"},
- {6, nullptr, "ContainsFinalOutputRecorderBuffer"},
- {7, nullptr, "GetFinalOutputRecorderBufferEndTime"},
- {8, nullptr, "AppendFinalOutputRecorderBufferAuto"},
- {9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"},
- {10, nullptr, "FlushFinalOutputRecorderBuffers"},
- {11, nullptr, "AttachWorkBuffer"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IFinalOutputRecorder"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetFinalOutputRecorderState"},
+ FunctionInfo{1, nullptr, "Start"},
+ FunctionInfo{2, nullptr, "Stop"},
+ FunctionInfo{3, nullptr, "AppendFinalOutputRecorderBuffer"},
+ FunctionInfo{4, nullptr, "RegisterBufferEvent"},
+ FunctionInfo{5, nullptr, "GetReleasedFinalOutputRecorderBuffers"},
+ FunctionInfo{6, nullptr, "ContainsFinalOutputRecorderBuffer"},
+ FunctionInfo{7, nullptr, "GetFinalOutputRecorderBufferEndTime"},
+ FunctionInfo{8, nullptr, "AppendFinalOutputRecorderBufferAuto"},
+ FunctionInfo{9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"},
+ FunctionInfo{10, nullptr, "FlushFinalOutputRecorderBuffers"},
+ FunctionInfo{11, nullptr, "AttachWorkBuffer"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
IFinalOutputRecorderManager::IFinalOutputRecorderManager(Core::System& system_)
: ServiceFramework{system_, "audrec:u"} {
- static const FunctionInfo functions[] = {
- {0, nullptr, "OpenFinalOutputRecorder"},
- };
- RegisterHandlers(functions);
}
IFinalOutputRecorderManager::~IFinalOutputRecorderManager() = default;
diff --git a/src/core/hle/service/audio/final_output_recorder_manager.h b/src/core/hle/service/audio/final_output_recorder_manager.h
index 0663b894e7..ee392b2ada 100644
--- a/src/core/hle/service/audio/final_output_recorder_manager.h
+++ b/src/core/hle/service/audio/final_output_recorder_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,13 @@ class IFinalOutputRecorderManager final : public ServiceFramework<IFinalOutputRe
public:
explicit IFinalOutputRecorderManager(Core::System& system_);
~IFinalOutputRecorderManager() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenFinalOutputRecorder"}
+ );
};
} // namespace Service::Audio
diff --git a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp
index 7e2e42bbe7..42c08d90ec 100644
--- a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp
+++ b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,14 +10,6 @@ namespace Service::Audio {
IFinalOutputRecorderManagerForApplet::IFinalOutputRecorderManagerForApplet(Core::System& system_)
: ServiceFramework{system_, "audrec:a"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestSuspend"},
- {1, nullptr, "RequestResume"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IFinalOutputRecorderManagerForApplet::~IFinalOutputRecorderManagerForApplet() = default;
diff --git a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h
index 27940f7e0d..7beaa888ff 100644
--- a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h
+++ b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -16,6 +19,14 @@ class IFinalOutputRecorderManagerForApplet final
public:
explicit IFinalOutputRecorderManagerForApplet(Core::System& system_);
~IFinalOutputRecorderManagerForApplet() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestSuspend"},
+ FunctionInfo{1, nullptr, "RequestResume"}
+ );
};
} // namespace Service::Audio
diff --git a/src/core/hle/service/audio/hardware_opus_decoder.cpp b/src/core/hle/service/audio/hardware_opus_decoder.cpp
index 03d3374c14..f0dde63e14 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder.cpp
+++ b/src/core/hle/service/audio/hardware_opus_decoder.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,25 +11,25 @@ namespace Service::Audio {
using namespace AudioCore::OpusDecoder;
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> IHardwareOpusDecoder::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IHardwareOpusDecoder::DecodeInterleavedOld>, "DecodeInterleavedOld"},
+ FunctionInfo{1, D<&IHardwareOpusDecoder::SetContext>, "SetContext"},
+ FunctionInfo{2, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld>, "DecodeInterleavedForMultiStreamOld"},
+ FunctionInfo{3, D<&IHardwareOpusDecoder::SetContextForMultiStream>, "SetContextForMultiStream"},
+ FunctionInfo{4, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfOld>, "DecodeInterleavedWithPerfOld"},
+ FunctionInfo{5, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld>, "DecodeInterleavedForMultiStreamWithPerfOld"},
+ FunctionInfo{6, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld>, "DecodeInterleavedWithPerfAndResetOld"},
+ FunctionInfo{7, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld>, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"},
+ FunctionInfo{8, D<&IHardwareOpusDecoder::DecodeInterleaved>, "DecodeInterleaved"},
+ FunctionInfo{9, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStream>, "DecodeInterleavedForMultiStream"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
IHardwareOpusDecoder::IHardwareOpusDecoder(Core::System& system_, HardwareOpus& hardware_opus)
: ServiceFramework{system_, "IHardwareOpusDecoder"},
impl{std::make_unique<AudioCore::OpusDecoder::OpusDecoder>(system_, hardware_opus)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IHardwareOpusDecoder::DecodeInterleavedOld>, "DecodeInterleavedOld"},
- {1, D<&IHardwareOpusDecoder::SetContext>, "SetContext"},
- {2, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld>, "DecodeInterleavedForMultiStreamOld"},
- {3, D<&IHardwareOpusDecoder::SetContextForMultiStream>, "SetContextForMultiStream"},
- {4, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfOld>, "DecodeInterleavedWithPerfOld"},
- {5, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld>, "DecodeInterleavedForMultiStreamWithPerfOld"},
- {6, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld>, "DecodeInterleavedWithPerfAndResetOld"},
- {7, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld>, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"},
- {8, D<&IHardwareOpusDecoder::DecodeInterleaved>, "DecodeInterleaved"},
- {9, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStream>, "DecodeInterleavedForMultiStream"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IHardwareOpusDecoder::~IHardwareOpusDecoder() = default;
diff --git a/src/core/hle/service/audio/hardware_opus_decoder.h b/src/core/hle/service/audio/hardware_opus_decoder.h
index 511bf46bdb..9f9b17bc81 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder.h
+++ b/src/core/hle/service/audio/hardware_opus_decoder.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -55,6 +58,7 @@ private:
Out<u32> out_data_size, Out<u32> out_sample_count, Out<u64> out_time_taken,
InBuffer<BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> opus_data,
bool reset);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<AudioCore::OpusDecoder::OpusDecoder> impl;
Common::ScratchBuffer<u8> output_data;
diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
index 9de72e30fe..3000ba8c60 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
+++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -9,23 +12,24 @@ namespace Service::Audio {
using namespace AudioCore::OpusDecoder;
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IHardwareOpusDecoderManager::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"},
+ FunctionInfo{1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"},
+ FunctionInfo{2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"},
+ FunctionInfo{3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"},
+ FunctionInfo{4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"},
+ FunctionInfo{5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"},
+ FunctionInfo{6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"},
+ FunctionInfo{7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"},
+ FunctionInfo{8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"},
+ FunctionInfo{9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IHardwareOpusDecoderManager::IHardwareOpusDecoderManager(Core::System& system_)
: ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"},
- {1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"},
- {2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"},
- {3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"},
- {4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"},
- {5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"},
- {6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"},
- {7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"},
- {8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"},
- {9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"},
- };
- // clang-format on
- RegisterHandlers(functions);
}
IHardwareOpusDecoderManager::~IHardwareOpusDecoderManager() = default;
diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.h b/src/core/hle/service/audio/hardware_opus_decoder_manager.h
index 4f869c5174..1dbac9addb 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder_manager.h
+++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -46,6 +49,7 @@ private:
Result GetWorkBufferSizeForMultiStreamExEx(
Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Core::System& system;
AudioCore::OpusDecoder::OpusDecoderManager impl;
};
diff --git a/src/core/hle/service/bcat/bcat_service.cpp b/src/core/hle/service/bcat/bcat_service.cpp
index bc2a3e3457..85f262f6eb 100644
--- a/src/core/hle/service/bcat/bcat_service.cpp
+++ b/src/core/hle/service/bcat/bcat_service.cpp
@@ -24,45 +24,46 @@ static u64 GetCurrentBuildID(const Core::System::CurrentBuildProcessID& id) {
return out;
}
-IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_, u64 program_id_)
- : ServiceFramework{system_, "IBcatService"}, backend{backend_}, program_id{program_id_},
- progress{{
- ProgressServiceBackend{system_, "Normal"},
- ProgressServiceBackend{system_, "Directory"},
- }} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"},
- {10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"},
- {10200, nullptr, "CancelSyncDeliveryCacheRequest"},
- {20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"},
- {20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"},
- {20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"},
- {20301, nullptr, "RequestSuspendDeliveryTask"},
- {20400, nullptr, "RegisterSystemApplicationDeliveryTask"},
- {20401, nullptr, "UnregisterSystemApplicationDeliveryTask"},
- {20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"},
- {30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"},
- {30101, nullptr, "Unknown30101"}, //2.0.0-2.3.0
- {30102, nullptr, "Unknown30102"}, //2.0.0-2.3.0
- {30200, nullptr, "RegisterBackgroundDeliveryTask"},
- {30201, nullptr, "UnregisterBackgroundDeliveryTask"},
- {30202, nullptr, "BlockDeliveryTask"},
- {30203, nullptr, "UnblockDeliveryTask"},
- {30210, nullptr, "SetDeliveryTaskTimer"},
- {30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"},
- {90100, nullptr, "GetDeliveryTaskList"},
- {90101, nullptr, "GetDeliveryTaskListForSystem"}, //11.0.0+
- {90200, nullptr, "GetDeliveryList"},
- {90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"},
- {90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"},
- {90300, nullptr, "GetPushNotificationLog"},
- {90301, nullptr, "GetDeliveryCacheStorageUsage"}, //11.0.0+
- };
- // clang-format on
- RegisterHandlers(functions);
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IBcatService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"},
+ FunctionInfo{10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"},
+ FunctionInfo{10200, nullptr, "CancelSyncDeliveryCacheRequest"},
+ FunctionInfo{20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"},
+ FunctionInfo{20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"},
+ FunctionInfo{20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"},
+ FunctionInfo{20301, nullptr, "RequestSuspendDeliveryTask"},
+ FunctionInfo{20400, nullptr, "RegisterSystemApplicationDeliveryTask"},
+ FunctionInfo{20401, nullptr, "UnregisterSystemApplicationDeliveryTask"},
+ FunctionInfo{20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"},
+ FunctionInfo{30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"},
+ FunctionInfo{30101, nullptr, "Unknown30101", MakeVersionGate({2,0,0}, {2,3,0})},
+ FunctionInfo{30102, nullptr, "Unknown30102", MakeVersionGate({2,0,0}, {2,3,0})},
+ FunctionInfo{30200, nullptr, "RegisterBackgroundDeliveryTask"},
+ FunctionInfo{30201, nullptr, "UnregisterBackgroundDeliveryTask"},
+ FunctionInfo{30202, nullptr, "BlockDeliveryTask"},
+ FunctionInfo{30203, nullptr, "UnblockDeliveryTask"},
+ FunctionInfo{30210, nullptr, "SetDeliveryTaskTimer"},
+ FunctionInfo{30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"},
+ FunctionInfo{90100, nullptr, "GetDeliveryTaskList"},
+ FunctionInfo{90101, nullptr, "GetDeliveryTaskListForSystem", MakeVersionGate({11,0,0})},
+ FunctionInfo{90200, nullptr, "GetDeliveryList"},
+ FunctionInfo{90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"},
+ FunctionInfo{90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"},
+ FunctionInfo{90300, nullptr, "GetPushNotificationLog"},
+ FunctionInfo{90301, nullptr, "GetDeliveryCacheStorageUsage", MakeVersionGate({11,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
}
+IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_, u64 program_id_)
+ : ServiceFramework{system_, "IBcatService"}, backend{backend_}, program_id{program_id_}
+ , progress{{
+ ProgressServiceBackend{system_, "Normal"},
+ ProgressServiceBackend{system_, "Directory"},
+ }}
+{}
+
IBcatService::~IBcatService() = default;
Result IBcatService::RequestSyncDeliveryCache(
diff --git a/src/core/hle/service/bcat/bcat_service.h b/src/core/hle/service/bcat/bcat_service.h
index 5e11059a78..ed95f021d0 100644
--- a/src/core/hle/service/bcat/bcat_service.h
+++ b/src/core/hle/service/bcat/bcat_service.h
@@ -41,6 +41,7 @@ private:
ProgressServiceBackend& GetProgressBackend(SyncType type);
const ProgressServiceBackend& GetProgressBackend(SyncType type) const;
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
BcatBackend& backend;
u64 program_id;
std::array<ProgressServiceBackend, static_cast<size_t>(SyncType::Count)> progress;
diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp
index 8ead0bae99..0d464a2fdc 100644
--- a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp
+++ b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp
@@ -27,18 +27,18 @@ static BcatDigest DigestFile(const FileSys::VirtualFile& file) {
return out;
}
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IDeliveryCacheDirectoryService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IDeliveryCacheDirectoryService::Open>, "Open"},
+ FunctionInfo{1, D<&IDeliveryCacheDirectoryService::Read>, "Read"},
+ FunctionInfo{2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IDeliveryCacheDirectoryService::IDeliveryCacheDirectoryService(Core::System& system_,
FileSys::VirtualDir root_)
: ServiceFramework{system_, "IDeliveryCacheDirectoryService"}, root(std::move(root_)) {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IDeliveryCacheDirectoryService::Open>, "Open"},
- {1, D<&IDeliveryCacheDirectoryService::Read>, "Read"},
- {2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IDeliveryCacheDirectoryService::~IDeliveryCacheDirectoryService() = default;
diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.h b/src/core/hle/service/bcat/delivery_cache_directory_service.h
index b902c64959..af90680390 100644
--- a/src/core/hle/service/bcat/delivery_cache_directory_service.h
+++ b/src/core/hle/service/bcat/delivery_cache_directory_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -26,6 +29,7 @@ private:
OutArray<DeliveryCacheDirectoryEntry, BufferAttr_HipcMapAlias> out_buffer);
Result GetCount(Out<s32> out_count);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
FileSys::VirtualDir root;
FileSys::VirtualDir current_dir;
};
diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.cpp b/src/core/hle/service/bcat/delivery_cache_file_service.cpp
index b75fac4bfe..d9b6ff77ee 100644
--- a/src/core/hle/service/bcat/delivery_cache_file_service.cpp
+++ b/src/core/hle/service/bcat/delivery_cache_file_service.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -9,19 +12,19 @@
namespace Service::BCAT {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IDeliveryCacheFileService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IDeliveryCacheFileService::Open>, "Open"},
+ FunctionInfo{1, D<&IDeliveryCacheFileService::Read>, "Read"},
+ FunctionInfo{2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"},
+ FunctionInfo{3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IDeliveryCacheFileService::IDeliveryCacheFileService(Core::System& system_,
FileSys::VirtualDir root_)
: ServiceFramework{system_, "IDeliveryCacheFileService"}, root(std::move(root_)) {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IDeliveryCacheFileService::Open>, "Open"},
- {1, D<&IDeliveryCacheFileService::Read>, "Read"},
- {2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"},
- {3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IDeliveryCacheFileService::~IDeliveryCacheFileService() = default;
diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.h b/src/core/hle/service/bcat/delivery_cache_file_service.h
index e1012e6873..176c8eb3e5 100644
--- a/src/core/hle/service/bcat/delivery_cache_file_service.h
+++ b/src/core/hle/service/bcat/delivery_cache_file_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -26,6 +29,7 @@ private:
Result GetSize(Out<u64> out_size);
Result GetDigest(Out<BcatDigest> out_digest);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
FileSys::VirtualDir root;
FileSys::VirtualFile current_file;
};
diff --git a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp
index 79e7e0d957..4de42dd580 100644
--- a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp
+++ b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -7,18 +10,18 @@
namespace Service::BCAT {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IDeliveryCacheProgressService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IDeliveryCacheProgressService::GetEvent>, "GetEvent"},
+ FunctionInfo{1, D<&IDeliveryCacheProgressService::GetImpl>, "GetImpl"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IDeliveryCacheProgressService::IDeliveryCacheProgressService(Core::System& system_,
Kernel::KReadableEvent& event_,
const DeliveryCacheProgressImpl& impl_)
: ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{event_}, impl{impl_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IDeliveryCacheProgressService::GetEvent>, "Get"},
- {1, D<&IDeliveryCacheProgressService::GetImpl>, "Get"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IDeliveryCacheProgressService::~IDeliveryCacheProgressService() = default;
diff --git a/src/core/hle/service/bcat/delivery_cache_progress_service.h b/src/core/hle/service/bcat/delivery_cache_progress_service.h
index f81a139806..88f49cea85 100644
--- a/src/core/hle/service/bcat/delivery_cache_progress_service.h
+++ b/src/core/hle/service/bcat/delivery_cache_progress_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -28,6 +31,7 @@ private:
Result GetEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
Result GetImpl(OutLargeData<DeliveryCacheProgressImpl, BufferAttr_HipcPointer> out_impl);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KReadableEvent& event;
const DeliveryCacheProgressImpl& impl;
};
diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp
index 46ed4dae67..67dc857642 100644
--- a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp
+++ b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -12,18 +12,18 @@
namespace Service::BCAT {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IDeliveryCacheStorageService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"},
+ FunctionInfo{1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"},
+ FunctionInfo{10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IDeliveryCacheStorageService::IDeliveryCacheStorageService(Core::System& system_,
FileSys::VirtualDir root_)
: ServiceFramework{system_, "IDeliveryCacheStorageService"}, root(std::move(root_)) {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"},
- {1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"},
- {10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IDeliveryCacheStorageService::~IDeliveryCacheStorageService() = default;
diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.h b/src/core/hle/service/bcat/delivery_cache_storage_service.h
index 3b8dfb1a39..b30f24fb47 100644
--- a/src/core/hle/service/bcat/delivery_cache_storage_service.h
+++ b/src/core/hle/service/bcat/delivery_cache_storage_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -28,6 +31,7 @@ private:
Out<s32> out_directory_count,
OutArray<DirectoryName, BufferAttr_HipcMapAlias> out_directories);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
FileSys::VirtualDir root;
std::vector<DirectoryName> entries;
std::size_t next_read_index = 0;
diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp
index ed393f7a26..57d71c49d8 100644
--- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp
+++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -6,17 +9,16 @@
namespace Service::News {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> INewlyArrivedEventHolder::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&INewlyArrivedEventHolder::Get>, "Get"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_)
- : ServiceFramework{system_, "INewlyArrivedEventHolder"}, service_context{
- system_,
- "INewlyArrivedEventHolder"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&INewlyArrivedEventHolder::Get>, "Get"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "INewlyArrivedEventHolder"}
+ , service_context{system_, "INewlyArrivedEventHolder"} {
arrived_event = service_context.CreateEvent("INewlyArrivedEventHolder::ArrivedEvent");
}
diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h
index 6cc9ae0997..fccc8d6e55 100644
--- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h
+++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -26,6 +29,7 @@ public:
private:
Result Get(OutCopyHandle<Kernel::KReadableEvent> out_event);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KEvent* arrived_event;
KernelHelpers::ServiceContext service_context;
};
diff --git a/src/core/hle/service/bcat/news/news_data_service.cpp b/src/core/hle/service/bcat/news/news_data_service.cpp
index 200d00e785..f5de93db49 100644
--- a/src/core/hle/service/bcat/news/news_data_service.cpp
+++ b/src/core/hle/service/bcat/news/news_data_service.cpp
@@ -24,16 +24,19 @@ std::string_view ToStringView(std::span<const char> buf) {
} // namespace
+std::optional<ServiceFrameworkBase::FunctionInfoBase> INewsDataService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&INewsDataService::Open>, "Open"},
+ FunctionInfo{1, D<&INewsDataService::OpenWithNewsRecordV1>, "OpenWithNewsRecordV1"},
+ FunctionInfo{2, D<&INewsDataService::Read>, "Read"},
+ FunctionInfo{3, D<&INewsDataService::GetSize>, "GetSize"},
+ FunctionInfo{1001, D<&INewsDataService::OpenWithNewsRecord>, "OpenWithNewsRecord"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
INewsDataService::INewsDataService(Core::System& system_)
: ServiceFramework{system_, "INewsDataService"} {
- static const FunctionInfo functions[] = {
- {0, D<&INewsDataService::Open>, "Open"},
- {1, D<&INewsDataService::OpenWithNewsRecordV1>, "OpenWithNewsRecordV1"},
- {2, D<&INewsDataService::Read>, "Read"},
- {3, D<&INewsDataService::GetSize>, "GetSize"},
- {1001, D<&INewsDataService::OpenWithNewsRecord>, "OpenWithNewsRecord"},
- };
- RegisterHandlers(functions);
}
INewsDataService::~INewsDataService() = default;
diff --git a/src/core/hle/service/bcat/news/news_data_service.h b/src/core/hle/service/bcat/news/news_data_service.h
index 8f5e031701..8ce10c045d 100644
--- a/src/core/hle/service/bcat/news/news_data_service.h
+++ b/src/core/hle/service/bcat/news/news_data_service.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -31,6 +31,7 @@ private:
Result Read(Out<u64> out_size, s64 offset, OutBuffer<BufferAttr_HipcMapAlias> out_buffer);
Result GetSize(Out<s64> out_size);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::vector<u8> opened_payload;
};
diff --git a/src/core/hle/service/bcat/news/news_database_service.cpp b/src/core/hle/service/bcat/news/news_database_service.cpp
index 3580ceb0f7..08fdfcb58b 100644
--- a/src/core/hle/service/bcat/news/news_database_service.cpp
+++ b/src/core/hle/service/bcat/news/news_database_service.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -45,18 +45,21 @@ bool UpdateField(NewsRecord& rec, std::string_view column, s32 value, bool addit
} // namespace
+std::optional<ServiceFrameworkBase::FunctionInfoBase> INewsDatabaseService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&INewsDatabaseService::GetListV1>, "GetListV1"},
+ FunctionInfo{1, D<&INewsDatabaseService::Count>, "Count"},
+ FunctionInfo{2, D<&INewsDatabaseService::CountWithKey>, "CountWithKey"},
+ FunctionInfo{3, D<&INewsDatabaseService::UpdateIntegerValue>, "UpdateIntegerValue"},
+ FunctionInfo{4, D<&INewsDatabaseService::UpdateIntegerValueWithAddition>, "UpdateIntegerValueWithAddition"},
+ FunctionInfo{5, D<&INewsDatabaseService::UpdateStringValue>, "UpdateStringValue"},
+ FunctionInfo{1000, D<&INewsDatabaseService::GetList>, "GetList"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
INewsDatabaseService::INewsDatabaseService(Core::System& system_)
: ServiceFramework{system_, "INewsDatabaseService"} {
- static const FunctionInfo functions[] = {
- {0, D<&INewsDatabaseService::GetListV1>, "GetListV1"},
- {1, D<&INewsDatabaseService::Count>, "Count"},
- {2, D<&INewsDatabaseService::CountWithKey>, "CountWithKey"},
- {3, D<&INewsDatabaseService::UpdateIntegerValue>, "UpdateIntegerValue"},
- {4, D<&INewsDatabaseService::UpdateIntegerValueWithAddition>, "UpdateIntegerValueWithAddition"},
- {5, D<&INewsDatabaseService::UpdateStringValue>, "UpdateStringValue"},
- {1000, D<&INewsDatabaseService::GetList>, "GetList"},
- };
- RegisterHandlers(functions);
}
INewsDatabaseService::~INewsDatabaseService() = default;
diff --git a/src/core/hle/service/bcat/news/news_database_service.h b/src/core/hle/service/bcat/news/news_database_service.h
index 143864e80e..0a097b97bc 100644
--- a/src/core/hle/service/bcat/news/news_database_service.h
+++ b/src/core/hle/service/bcat/news/news_database_service.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -49,6 +49,8 @@ private:
InBuffer<BufferAttr_HipcPointer> where_phrase,
InBuffer<BufferAttr_HipcPointer> order_by_phrase,
s32 offset);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::News
diff --git a/src/core/hle/service/bcat/news/news_service.cpp b/src/core/hle/service/bcat/news/news_service.cpp
index aed1536bfe..7cb931896c 100644
--- a/src/core/hle/service/bcat/news/news_service.cpp
+++ b/src/core/hle/service/bcat/news/news_service.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -12,32 +12,32 @@
namespace Service::News {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> INewsService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{10100, D<&INewsService::PostLocalNews>, "PostLocalNews"},
+ FunctionInfo{20100, D<&INewsService::SetPassphrase>, "SetPassphrase"},
+ FunctionInfo{30100, D<&INewsService::GetSubscriptionStatus>, "GetSubscriptionStatus"},
+ FunctionInfo{30101, D<&INewsService::GetTopicList>, "GetTopicList", MakeVersionGate({3,0,0})},
+ FunctionInfo{30110, D<&INewsService::GetTopicList>, "Unknown30110", MakeVersionGate({6,0,0})}, // stub
+ FunctionInfo{30200, D<&INewsService::IsSystemUpdateRequired>, "IsSystemUpdateRequired"},
+ FunctionInfo{30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201", MakeVersionGate({8,0,0})}, // stub
+ FunctionInfo{30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210", MakeVersionGate({10,0,0})}, // stub
+ FunctionInfo{30300, nullptr, "RequestImmediateReception"},
+ FunctionInfo{30400, nullptr, "DecodeArchiveFile", MakeVersionGate({3,0,0}, {18,1,0})}, // stub
+ FunctionInfo{30500, nullptr, "Unknown30500", MakeVersionGate({8,0,0})}, // stub
+ FunctionInfo{30900, nullptr, "Unknown30900", MakeVersionGate({1,0,0})}, // stub
+ FunctionInfo{30901, nullptr, "Unknown30901", MakeVersionGate({1,0,0})}, // stub
+ FunctionInfo{30902, nullptr, "Unknown30902", MakeVersionGate({1,0,0})}, // stub
+ FunctionInfo{40100, nullptr, "SetSubscriptionStatus"},
+ FunctionInfo{40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription", MakeVersionGate({3,0,0})},
+ FunctionInfo{40200, D<&INewsService::ClearStorage>, "ClearStorage"},
+ FunctionInfo{40201, D<&INewsService::ClearSubscriptionStatusAll>, "ClearSubscriptionStatusAll"},
+ FunctionInfo{90100, D<&INewsService::GetNewsDatabaseDump>, "GetNewsDatabaseDump"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
INewsService::INewsService(Core::System& system_) : ServiceFramework{system_, "INewsService"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {10100, D<&INewsService::PostLocalNews>, "PostLocalNews"},
- {20100, D<&INewsService::SetPassphrase>, "SetPassphrase"},
- {30100, D<&INewsService::GetSubscriptionStatus>, "GetSubscriptionStatus"},
- {30101, D<&INewsService::GetTopicList>, "GetTopicList"}, //3.0.0+
- {30110, D<&INewsService::GetTopicList>, "Unknown30110"}, //6.0.0+ (stub)
- {30200, D<&INewsService::IsSystemUpdateRequired>, "IsSystemUpdateRequired"},
- {30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201"}, //8.0.0+ (stub)
- {30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210"}, //10.0.0+ (stub)
- {30300, nullptr, "RequestImmediateReception"},
- {30400, nullptr, "DecodeArchiveFile"}, //3.0.0-18.1.0 (stub)
- {30500, nullptr, "Unknown30500"}, //8.0.0+ (stub)
- {30900, nullptr, "Unknown30900"}, //1.0.0 (stub)
- {30901, nullptr, "Unknown30901"}, //1.0.0 (stub)
- {30902, nullptr, "Unknown30902"}, //1.0.0 (stub)
- {40100, nullptr, "SetSubscriptionStatus"},
- {40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription"}, //3.0.0+
- {40200, D<&INewsService::ClearStorage>, "ClearStorage"},
- {40201, D<&INewsService::ClearSubscriptionStatusAll>, "ClearSubscriptionStatusAll"},
- {90100, D<&INewsService::GetNewsDatabaseDump>, "GetNewsDatabaseDump"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
INewsService::~INewsService() = default;
diff --git a/src/core/hle/service/bcat/news/news_service.h b/src/core/hle/service/bcat/news/news_service.h
index 1a320df02f..577147e604 100644
--- a/src/core/hle/service/bcat/news/news_service.h
+++ b/src/core/hle/service/bcat/news/news_service.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -22,22 +22,15 @@ public:
private:
Result PostLocalNews(InBuffer<BufferAttr_HipcAutoSelect> buffer_data);
-
Result SetPassphrase(InBuffer<BufferAttr_HipcPointer> buffer_data);
-
Result GetSubscriptionStatus(Out<u32> out_status, InBuffer<BufferAttr_HipcPointer> buffer_data);
-
Result GetTopicList(Out<s32> out_count, OutBuffer<BufferAttr_HipcMapAlias> out_topics, s32 filter);
-
Result IsSystemUpdateRequired(Out<bool> out_is_system_update_required);
-
Result RequestAutoSubscription(u64 value);
-
Result ClearStorage();
-
Result ClearSubscriptionStatusAll();
-
Result GetNewsDatabaseDump();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::News
diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp
index 1712971e4d..a6b3029e83 100644
--- a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp
+++ b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -6,16 +9,16 @@
namespace Service::News {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IOverwriteEventHolder::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IOverwriteEventHolder::Get>, "Get"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_)
- : ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{system_,
- "IOverwriteEventHolder"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IOverwriteEventHolder::Get>, "Get"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IOverwriteEventHolder"}
+ , service_context{system_, "IOverwriteEventHolder"} {
overwrite_event = service_context.CreateEvent("IOverwriteEventHolder::OverwriteEvent");
}
diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.h b/src/core/hle/service/bcat/news/overwrite_event_holder.h
index cdc87d782c..ba52a36527 100644
--- a/src/core/hle/service/bcat/news/overwrite_event_holder.h
+++ b/src/core/hle/service/bcat/news/overwrite_event_holder.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -26,6 +29,7 @@ public:
private:
Result Get(OutCopyHandle<Kernel::KReadableEvent> out_event);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Kernel::KEvent* overwrite_event;
KernelHelpers::ServiceContext service_context;
};
diff --git a/src/core/hle/service/bcat/news/service_creator.cpp b/src/core/hle/service/bcat/news/service_creator.cpp
index a1b22c0044..66e3b1277e 100644
--- a/src/core/hle/service/bcat/news/service_creator.cpp
+++ b/src/core/hle/service/bcat/news/service_creator.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -11,19 +14,19 @@
namespace Service::News {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IServiceCreator::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IServiceCreator::CreateNewsService>, "CreateNewsService"},
+ FunctionInfo{1, D<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"},
+ FunctionInfo{2, D<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"},
+ FunctionInfo{3, D<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"},
+ FunctionInfo{4, D<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IServiceCreator::IServiceCreator(Core::System& system_, u32 permissions_, const char* name_)
: ServiceFramework{system_, name_}, permissions{permissions_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IServiceCreator::CreateNewsService>, "CreateNewsService"},
- {1, D<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"},
- {2, D<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"},
- {3, D<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"},
- {4, D<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IServiceCreator::~IServiceCreator() = default;
diff --git a/src/core/hle/service/bcat/news/service_creator.h b/src/core/hle/service/bcat/news/service_creator.h
index 5a62e7c1a9..a87f30b67e 100644
--- a/src/core/hle/service/bcat/news/service_creator.h
+++ b/src/core/hle/service/bcat/news/service_creator.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -29,6 +32,7 @@ private:
Result CreateNewsDatabaseService(OutInterface<INewsDatabaseService> out_interface);
Result CreateOverwriteEventHolder(OutInterface<IOverwriteEventHolder> out_interface);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
u32 permissions;
};
diff --git a/src/core/hle/service/bcat/service_creator.cpp b/src/core/hle/service/bcat/service_creator.cpp
index 15f59d3056..83f97bb17a 100644
--- a/src/core/hle/service/bcat/service_creator.cpp
+++ b/src/core/hle/service/bcat/service_creator.cpp
@@ -13,6 +13,17 @@
namespace Service::BCAT {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IServiceCreator::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"},
+ FunctionInfo{1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"},
+ FunctionInfo{2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"},
+ FunctionInfo{3, nullptr, "CreateDeliveryCacheProgressService"},
+ FunctionInfo{4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
std::unique_ptr<BcatBackend> CreateBackendFromSettings([[maybe_unused]] Core::System& system,
DirectoryGetter getter) {
return std::make_unique<NullBcatBackend>(std::move(getter));
@@ -20,20 +31,7 @@ std::unique_ptr<BcatBackend> CreateBackendFromSettings([[maybe_unused]] Core::Sy
IServiceCreator::IServiceCreator(Core::System& system_, const char* name_)
: ServiceFramework{system_, name_}, fsc{system.GetFileSystemController()} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"},
- {1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"},
- {2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"},
- {3, nullptr, "CreateDeliveryCacheProgressService"},
- {4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
- backend =
- CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); });
+ backend = CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); });
}
IServiceCreator::~IServiceCreator() = default;
diff --git a/src/core/hle/service/bcat/service_creator.h b/src/core/hle/service/bcat/service_creator.h
index 50e6633248..02527574dc 100644
--- a/src/core/hle/service/bcat/service_creator.h
+++ b/src/core/hle/service/bcat/service_creator.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -33,6 +36,7 @@ private:
Result CreateDeliveryCacheStorageServiceWithApplicationId(
u64 application_id, OutInterface<IDeliveryCacheStorageService> out_interface);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<BcatBackend> backend;
Service::FileSystem::FileSystemController& fsc;
};
diff --git a/src/core/hle/service/bpc/bpc.cpp b/src/core/hle/service/bpc/bpc.cpp
index 6f2e00b22b..7c31cd190d 100644
--- a/src/core/hle/service/bpc/bpc.cpp
+++ b/src/core/hle/service/bpc/bpc.cpp
@@ -14,103 +14,101 @@ namespace Service::BPC {
class BPC final : public ServiceFramework<BPC> {
public:
- explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "ShutdownSystem"},
- {1, nullptr, "RebootSystem"},
- {2, nullptr, "GetWakeupReason"},
- {3, nullptr, "GetShutdownReason"},
- {4, nullptr, "GetAcOk"},
- {5, nullptr, "GetBoardPowerControlEvent"},
- {6, nullptr, "GetSleepButtonState"},
- {7, nullptr, "GetPowerEvent"},
- {8, nullptr, "CreateWakeupTimer"},
- {9, nullptr, "CancelWakeupTimer"},
- {10, nullptr, "EnableWakeupTimerOnDevice"},
- {11, nullptr, "CreateWakeupTimerEx"},
- {12, nullptr, "GetLastEnabledWakeupTimerType"},
- {13, nullptr, "CleanAllWakeupTimers"},
- {14, nullptr, "GetPowerButton"},
- {15, nullptr, "SetEnableWakeupTimer"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "ShutdownSystem"},
+ FunctionInfo{1, nullptr, "RebootSystem"},
+ FunctionInfo{2, nullptr, "GetWakeupReason"},
+ FunctionInfo{3, nullptr, "GetShutdownReason"},
+ FunctionInfo{4, nullptr, "GetAcOk"},
+ FunctionInfo{5, nullptr, "GetBoardPowerControlEvent"},
+ FunctionInfo{6, nullptr, "GetSleepButtonState"},
+ FunctionInfo{7, nullptr, "GetPowerEvent"},
+ FunctionInfo{8, nullptr, "CreateWakeupTimer"},
+ FunctionInfo{9, nullptr, "CancelWakeupTimer"},
+ FunctionInfo{10, nullptr, "EnableWakeupTimerOnDevice"},
+ FunctionInfo{11, nullptr, "CreateWakeupTimerEx"},
+ FunctionInfo{12, nullptr, "GetLastEnabledWakeupTimerType"},
+ FunctionInfo{13, nullptr, "CleanAllWakeupTimers"},
+ FunctionInfo{14, nullptr, "GetPowerButton"},
+ FunctionInfo{15, nullptr, "SetEnableWakeupTimer"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class BPC_R final : public ServiceFramework<BPC_R> {
public:
- explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetRtcTime"},
- {1, nullptr, "SetRtcTime"},
- {2, nullptr, "GetRtcResetDetected"},
- {3, nullptr, "ClearRtcResetDetected"},
- {4, nullptr, "SetUpRtcResetOnShutdown"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetRtcTime"},
+ FunctionInfo{1, nullptr, "SetRtcTime"},
+ FunctionInfo{2, nullptr, "GetRtcResetDetected"},
+ FunctionInfo{3, nullptr, "ClearRtcResetDetected"},
+ FunctionInfo{4, nullptr, "SetUpRtcResetOnShutdown"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class BPC_C final : public ServiceFramework<BPC_C> {
public:
- explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "ShutdownSystem"},
- {1, nullptr, "RebootSystem"},
- {2, nullptr, "GetWakeupReason"},
- {3, nullptr, "GetShutdownReason"},
- {4, nullptr, "GetAcOk"},
- {5, nullptr, "GetPowerEvent"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "ShutdownSystem"},
+ FunctionInfo{1, nullptr, "RebootSystem"},
+ FunctionInfo{2, nullptr, "GetWakeupReason"},
+ FunctionInfo{3, nullptr, "GetShutdownReason"},
+ FunctionInfo{4, nullptr, "GetAcOk"},
+ FunctionInfo{5, nullptr, "GetPowerEvent"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class BPC_B final : public ServiceFramework<BPC_B> {
public:
- explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetSleepButtonState"},
- {1, nullptr, "GetPowerButtonEvent"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetSleepButtonState"},
+ FunctionInfo{1, nullptr, "GetPowerButtonEvent"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class BPC_W final : public ServiceFramework<BPC_W> {
public:
- explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CreateWakeupTimer"},
- {1, nullptr, "CancelWakeupTimer"},
- {2, nullptr, "EnableWakeupTimerOnDevice"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateWakeupTimer"},
+ FunctionInfo{1, nullptr, "CancelWakeupTimer"},
+ FunctionInfo{2, nullptr, "EnableWakeupTimerOnDevice"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class BPC_AMS final : public ServiceFramework<BPC_AMS> {
public:
- explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {65000, nullptr, "RebootToFatalError"},
- {65001, nullptr, "SetRebootPayload"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{65000, nullptr, "RebootToFatalError"},
+ FunctionInfo{65001, nullptr, "SetRebootPayload"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp
index 256a722a84..913c9475e9 100644
--- a/src/core/hle/service/btdrv/btdrv.cpp
+++ b/src/core/hle/service/btdrv/btdrv.cpp
@@ -20,26 +20,15 @@ namespace Service::BtDrv {
class IBluetoothUser final : public ServiceFramework<IBluetoothUser> {
public:
explicit IBluetoothUser(Core::System& system_)
- : ServiceFramework{system_, "bt"}, service_context{system_, "bt"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "LeClientReadCharacteristic"},
- {1, nullptr, "LeClientReadDescriptor"},
- {2, nullptr, "LeClientWriteCharacteristic"},
- {3, nullptr, "LeClientWriteDescriptor"},
- {4, nullptr, "LeClientRegisterNotification"},
- {5, nullptr, "LeClientDeregisterNotification"},
- {6, nullptr, "SetLeResponse"},
- {7, nullptr, "LeSendIndication"},
- {8, nullptr, "GetLeEventInfo"},
- {9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"},
- };
- // clang-format on
- RegisterHandlers(functions);
-
+ : ServiceFramework{system_, "bt"}
+ , service_context{system_, "bt"} {
register_event = service_context.CreateEvent("BT:RegisterEvent");
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
~IBluetoothUser() override {
service_context.CloseEvent(register_event);
}
@@ -52,151 +41,28 @@ private:
R_SUCCEED();
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "LeClientReadCharacteristic"},
+ FunctionInfo{1, nullptr, "LeClientReadDescriptor"},
+ FunctionInfo{2, nullptr, "LeClientWriteCharacteristic"},
+ FunctionInfo{3, nullptr, "LeClientWriteDescriptor"},
+ FunctionInfo{4, nullptr, "LeClientRegisterNotification"},
+ FunctionInfo{5, nullptr, "LeClientDeregisterNotification"},
+ FunctionInfo{6, nullptr, "SetLeResponse"},
+ FunctionInfo{7, nullptr, "LeSendIndication"},
+ FunctionInfo{8, nullptr, "GetLeEventInfo"},
+ FunctionInfo{9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"}
+ );
KernelHelpers::ServiceContext service_context;
-
Kernel::KEvent* register_event;
};
class IBluetoothDriver final : public ServiceFramework<IBluetoothDriver> {
public:
- explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "InitializeBluetoothDriver"},
- {1, nullptr, "InitializeBluetooth"},
- {2, nullptr, "EnableBluetooth"},
- {3, nullptr, "DisableBluetooth"},
- {4, nullptr, "FinalizeBluetooth"},
- {5, nullptr, "GetAdapterProperties"},
- {6, nullptr, "GetAdapterProperty"},
- {7, nullptr, "SetAdapterProperty"},
- {8, nullptr, "StartInquiry"},
- {9, nullptr, "StopInquiry"},
- {10, nullptr, "CreateBond"},
- {11, nullptr, "RemoveBond"},
- {12, nullptr, "CancelBond"},
- {13, nullptr, "RespondToPinRequest"},
- {14, nullptr, "RespondToSspRequest"},
- {15, nullptr, "GetEventInfo"},
- {16, nullptr, "InitializeHid"},
- {17, nullptr, "OpenHidConnection"},
- {18, nullptr, "CloseHidConnection"},
- {19, nullptr, "WriteHidData"},
- {20, nullptr, "WriteHidData2"},
- {21, nullptr, "SetHidReport"},
- {22, nullptr, "GetHidReport"},
- {23, nullptr, "TriggerConnection"},
- {24, nullptr, "AddPairedDeviceInfo"},
- {25, nullptr, "GetPairedDeviceInfo"},
- {26, nullptr, "FinalizeHid"},
- {27, nullptr, "GetHidEventInfo"},
- {28, nullptr, "SetTsi"},
- {29, nullptr, "EnableBurstMode"},
- {30, nullptr, "SetZeroRetransmission"},
- {31, nullptr, "EnableMcMode"},
- {32, nullptr, "EnableLlrScan"},
- {33, nullptr, "DisableLlrScan"},
- {34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"},
- {35, nullptr, "SetVisibility"},
- {36, nullptr, "EnableTbfcScan"},
- {37, nullptr, "RegisterHidReportEvent"},
- {38, nullptr, "GetHidReportEventInfo"},
- {39, nullptr, "GetLatestPlr"},
- {40, nullptr, "GetPendingConnections"},
- {41, nullptr, "GetChannelMap"},
- {42, nullptr, "EnableTxPowerBoostSetting"},
- {43, nullptr, "IsTxPowerBoostSettingEnabled"},
- {44, nullptr, "EnableAfhSetting"},
- {45, nullptr, "IsAfhSettingEnabled"},
- {46, nullptr, "InitializeBle"},
- {47, nullptr, "EnableBle"},
- {48, nullptr, "DisableBle"},
- {49, nullptr, "FinalizeBle"},
- {50, nullptr, "SetBleVisibility"},
- {51, nullptr, "SetBleConnectionParameter"},
- {52, nullptr, "SetBleDefaultConnectionParameter"},
- {53, nullptr, "SetBleAdvertiseData"},
- {54, nullptr, "SetBleAdvertiseParameter"},
- {55, nullptr, "StartBleScan"},
- {56, nullptr, "StopBleScan"},
- {57, nullptr, "AddBleScanFilterCondition"},
- {58, nullptr, "DeleteBleScanFilterCondition"},
- {59, nullptr, "DeleteBleScanFilter"},
- {60, nullptr, "ClearBleScanFilters"},
- {61, nullptr, "EnableBleScanFilter"},
- {62, nullptr, "RegisterGattClient"},
- {63, nullptr, "UnregisterGattClient"},
- {64, nullptr, "UnregisterAllGattClients"},
- {65, nullptr, "ConnectGattServer"},
- {66, nullptr, "CancelConnectGattServer"},
- {67, nullptr, "DisconnectGattServer"},
- {68, nullptr, "GetGattAttribute"},
- {69, nullptr, "GetGattService"},
- {70, nullptr, "ConfigureAttMtu"},
- {71, nullptr, "RegisterGattServer"},
- {72, nullptr, "UnregisterGattServer"},
- {73, nullptr, "ConnectGattClient"},
- {74, nullptr, "DisconnectGattClient"},
- {75, nullptr, "AddGattService"},
- {76, nullptr, "EnableGattService"},
- {77, nullptr, "AddGattCharacteristic"},
- {78, nullptr, "AddGattDescriptor"},
- {79, nullptr, "GetBleManagedEventInfo"},
- {80, nullptr, "GetGattFirstCharacteristic"},
- {81, nullptr, "GetGattNextCharacteristic"},
- {82, nullptr, "GetGattFirstDescriptor"},
- {83, nullptr, "GetGattNextDescriptor"},
- {84, nullptr, "RegisterGattManagedDataPath"},
- {85, nullptr, "UnregisterGattManagedDataPath"},
- {86, nullptr, "RegisterGattHidDataPath"},
- {87, nullptr, "UnregisterGattHidDataPath"},
- {88, nullptr, "RegisterGattDataPath"},
- {89, nullptr, "UnregisterGattDataPath"},
- {90, nullptr, "ReadGattCharacteristic"},
- {91, nullptr, "ReadGattDescriptor"},
- {92, nullptr, "WriteGattCharacteristic"},
- {93, nullptr, "WriteGattDescriptor"},
- {94, nullptr, "RegisterGattNotification"},
- {95, nullptr, "UnregisterGattNotification"},
- {96, nullptr, "GetLeHidEventInfo"},
- {97, nullptr, "RegisterBleHidEvent"},
- {98, nullptr, "SetBleScanParameter"},
- {99, nullptr, "MoveToSecondaryPiconet"},
- {100, nullptr, "IsBluetoothEnabled"},
- {128, nullptr, "AcquireAudioEvent"},
- {129, nullptr, "GetAudioEventInfo"},
- {130, nullptr, "OpenAudioConnection"},
- {131, nullptr, "CloseAudioConnection"},
- {132, nullptr, "OpenAudioOut"},
- {133, nullptr, "CloseAudioOut"},
- {134, nullptr, "AcquireAudioOutStateChangedEvent"},
- {135, nullptr, "StartAudioOut"},
- {136, nullptr, "StopAudioOut"},
- {137, nullptr, "GetAudioOutState"},
- {138, nullptr, "GetAudioOutFeedingCodec"},
- {139, nullptr, "GetAudioOutFeedingParameter"},
- {140, nullptr, "AcquireAudioOutBufferAvailableEvent"},
- {141, nullptr, "SendAudioData"},
- {142, nullptr, "AcquireAudioControlInputStateChangedEvent"},
- {143, nullptr, "GetAudioControlInputState"},
- {144, nullptr, "AcquireAudioConnectionStateChangedEvent"},
- {145, nullptr, "GetConnectedAudioDevice"},
- {146, nullptr, "CloseAudioControlInput"},
- {147, nullptr, "RegisterAudioControlNotification"},
- {148, nullptr, "SendAudioControlPassthroughCommand"},
- {149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"},
- {150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"},
- {151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"},
- {152, nullptr, "GetAudioSinkVolume"},
- {153, nullptr, "RequestUpdateAudioSinkVolume"},
- {154, nullptr, "IsAudioSinkVolumeSupported"},
- {256, nullptr, "IsManufacturingMode"},
- {257, nullptr, "EmulateBluetoothCrash"},
- {258, nullptr, "GetBleChannelMap"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -204,6 +70,140 @@ private:
LOG_WARNING(Service_BTDRV, "(STUBBED) called");
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "InitializeBluetoothDriver"},
+ FunctionInfo{1, nullptr, "InitializeBluetooth"},
+ FunctionInfo{2, nullptr, "EnableBluetooth"},
+ FunctionInfo{3, nullptr, "DisableBluetooth"},
+ FunctionInfo{4, nullptr, "FinalizeBluetooth"},
+ FunctionInfo{5, nullptr, "GetAdapterProperties"},
+ FunctionInfo{6, nullptr, "GetAdapterProperty"},
+ FunctionInfo{7, nullptr, "SetAdapterProperty"},
+ FunctionInfo{8, nullptr, "StartInquiry"},
+ FunctionInfo{9, nullptr, "StopInquiry"},
+ FunctionInfo{10, nullptr, "CreateBond"},
+ FunctionInfo{11, nullptr, "RemoveBond"},
+ FunctionInfo{12, nullptr, "CancelBond"},
+ FunctionInfo{13, nullptr, "RespondToPinRequest"},
+ FunctionInfo{14, nullptr, "RespondToSspRequest"},
+ FunctionInfo{15, nullptr, "GetEventInfo"},
+ FunctionInfo{16, nullptr, "InitializeHid"},
+ FunctionInfo{17, nullptr, "OpenHidConnection"},
+ FunctionInfo{18, nullptr, "CloseHidConnection"},
+ FunctionInfo{19, nullptr, "WriteHidData"},
+ FunctionInfo{20, nullptr, "WriteHidData2"},
+ FunctionInfo{21, nullptr, "SetHidReport"},
+ FunctionInfo{22, nullptr, "GetHidReport"},
+ FunctionInfo{23, nullptr, "TriggerConnection"},
+ FunctionInfo{24, nullptr, "AddPairedDeviceInfo"},
+ FunctionInfo{25, nullptr, "GetPairedDeviceInfo"},
+ FunctionInfo{26, nullptr, "FinalizeHid"},
+ FunctionInfo{27, nullptr, "GetHidEventInfo"},
+ FunctionInfo{28, nullptr, "SetTsi"},
+ FunctionInfo{29, nullptr, "EnableBurstMode"},
+ FunctionInfo{30, nullptr, "SetZeroRetransmission"},
+ FunctionInfo{31, nullptr, "EnableMcMode"},
+ FunctionInfo{32, nullptr, "EnableLlrScan"},
+ FunctionInfo{33, nullptr, "DisableLlrScan"},
+ FunctionInfo{34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"},
+ FunctionInfo{35, nullptr, "SetVisibility"},
+ FunctionInfo{36, nullptr, "EnableTbfcScan"},
+ FunctionInfo{37, nullptr, "RegisterHidReportEvent"},
+ FunctionInfo{38, nullptr, "GetHidReportEventInfo"},
+ FunctionInfo{39, nullptr, "GetLatestPlr"},
+ FunctionInfo{40, nullptr, "GetPendingConnections"},
+ FunctionInfo{41, nullptr, "GetChannelMap"},
+ FunctionInfo{42, nullptr, "EnableTxPowerBoostSetting"},
+ FunctionInfo{43, nullptr, "IsTxPowerBoostSettingEnabled"},
+ FunctionInfo{44, nullptr, "EnableAfhSetting"},
+ FunctionInfo{45, nullptr, "IsAfhSettingEnabled"},
+ FunctionInfo{46, nullptr, "InitializeBle"},
+ FunctionInfo{47, nullptr, "EnableBle"},
+ FunctionInfo{48, nullptr, "DisableBle"},
+ FunctionInfo{49, nullptr, "FinalizeBle"},
+ FunctionInfo{50, nullptr, "SetBleVisibility"},
+ FunctionInfo{51, nullptr, "SetBleConnectionParameter"},
+ FunctionInfo{52, nullptr, "SetBleDefaultConnectionParameter"},
+ FunctionInfo{53, nullptr, "SetBleAdvertiseData"},
+ FunctionInfo{54, nullptr, "SetBleAdvertiseParameter"},
+ FunctionInfo{55, nullptr, "StartBleScan"},
+ FunctionInfo{56, nullptr, "StopBleScan"},
+ FunctionInfo{57, nullptr, "AddBleScanFilterCondition"},
+ FunctionInfo{58, nullptr, "DeleteBleScanFilterCondition"},
+ FunctionInfo{59, nullptr, "DeleteBleScanFilter"},
+ FunctionInfo{60, nullptr, "ClearBleScanFilters"},
+ FunctionInfo{61, nullptr, "EnableBleScanFilter"},
+ FunctionInfo{62, nullptr, "RegisterGattClient"},
+ FunctionInfo{63, nullptr, "UnregisterGattClient"},
+ FunctionInfo{64, nullptr, "UnregisterAllGattClients"},
+ FunctionInfo{65, nullptr, "ConnectGattServer"},
+ FunctionInfo{66, nullptr, "CancelConnectGattServer"},
+ FunctionInfo{67, nullptr, "DisconnectGattServer"},
+ FunctionInfo{68, nullptr, "GetGattAttribute"},
+ FunctionInfo{69, nullptr, "GetGattService"},
+ FunctionInfo{70, nullptr, "ConfigureAttMtu"},
+ FunctionInfo{71, nullptr, "RegisterGattServer"},
+ FunctionInfo{72, nullptr, "UnregisterGattServer"},
+ FunctionInfo{73, nullptr, "ConnectGattClient"},
+ FunctionInfo{74, nullptr, "DisconnectGattClient"},
+ FunctionInfo{75, nullptr, "AddGattService"},
+ FunctionInfo{76, nullptr, "EnableGattService"},
+ FunctionInfo{77, nullptr, "AddGattCharacteristic"},
+ FunctionInfo{78, nullptr, "AddGattDescriptor"},
+ FunctionInfo{79, nullptr, "GetBleManagedEventInfo"},
+ FunctionInfo{80, nullptr, "GetGattFirstCharacteristic"},
+ FunctionInfo{81, nullptr, "GetGattNextCharacteristic"},
+ FunctionInfo{82, nullptr, "GetGattFirstDescriptor"},
+ FunctionInfo{83, nullptr, "GetGattNextDescriptor"},
+ FunctionInfo{84, nullptr, "RegisterGattManagedDataPath"},
+ FunctionInfo{85, nullptr, "UnregisterGattManagedDataPath"},
+ FunctionInfo{86, nullptr, "RegisterGattHidDataPath"},
+ FunctionInfo{87, nullptr, "UnregisterGattHidDataPath"},
+ FunctionInfo{88, nullptr, "RegisterGattDataPath"},
+ FunctionInfo{89, nullptr, "UnregisterGattDataPath"},
+ FunctionInfo{90, nullptr, "ReadGattCharacteristic"},
+ FunctionInfo{91, nullptr, "ReadGattDescriptor"},
+ FunctionInfo{92, nullptr, "WriteGattCharacteristic"},
+ FunctionInfo{93, nullptr, "WriteGattDescriptor"},
+ FunctionInfo{94, nullptr, "RegisterGattNotification"},
+ FunctionInfo{95, nullptr, "UnregisterGattNotification"},
+ FunctionInfo{96, nullptr, "GetLeHidEventInfo"},
+ FunctionInfo{97, nullptr, "RegisterBleHidEvent"},
+ FunctionInfo{98, nullptr, "SetBleScanParameter"},
+ FunctionInfo{99, nullptr, "MoveToSecondaryPiconet"},
+ FunctionInfo{100, nullptr, "IsBluetoothEnabled"},
+ FunctionInfo{128, nullptr, "AcquireAudioEvent"},
+ FunctionInfo{129, nullptr, "GetAudioEventInfo"},
+ FunctionInfo{130, nullptr, "OpenAudioConnection"},
+ FunctionInfo{131, nullptr, "CloseAudioConnection"},
+ FunctionInfo{132, nullptr, "OpenAudioOut"},
+ FunctionInfo{133, nullptr, "CloseAudioOut"},
+ FunctionInfo{134, nullptr, "AcquireAudioOutStateChangedEvent"},
+ FunctionInfo{135, nullptr, "StartAudioOut"},
+ FunctionInfo{136, nullptr, "StopAudioOut"},
+ FunctionInfo{137, nullptr, "GetAudioOutState"},
+ FunctionInfo{138, nullptr, "GetAudioOutFeedingCodec"},
+ FunctionInfo{139, nullptr, "GetAudioOutFeedingParameter"},
+ FunctionInfo{140, nullptr, "AcquireAudioOutBufferAvailableEvent"},
+ FunctionInfo{141, nullptr, "SendAudioData"},
+ FunctionInfo{142, nullptr, "AcquireAudioControlInputStateChangedEvent"},
+ FunctionInfo{143, nullptr, "GetAudioControlInputState"},
+ FunctionInfo{144, nullptr, "AcquireAudioConnectionStateChangedEvent"},
+ FunctionInfo{145, nullptr, "GetConnectedAudioDevice"},
+ FunctionInfo{146, nullptr, "CloseAudioControlInput"},
+ FunctionInfo{147, nullptr, "RegisterAudioControlNotification"},
+ FunctionInfo{148, nullptr, "SendAudioControlPassthroughCommand"},
+ FunctionInfo{149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"},
+ FunctionInfo{150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"},
+ FunctionInfo{151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"},
+ FunctionInfo{152, nullptr, "GetAudioSinkVolume"},
+ FunctionInfo{153, nullptr, "RequestUpdateAudioSinkVolume"},
+ FunctionInfo{154, nullptr, "IsAudioSinkVolumeSupported"},
+ FunctionInfo{256, nullptr, "IsManufacturingMode"},
+ FunctionInfo{257, nullptr, "EmulateBluetoothCrash"},
+ FunctionInfo{258, nullptr, "GetBleChannelMap"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp
index 327c2d2ddb..e8fa29af7c 100644
--- a/src/core/hle/service/btm/btm.cpp
+++ b/src/core/hle/service/btm/btm.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -6,111 +6,414 @@
#include <memory>
+#include "common/logging.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/set/system_settings_server.h"
+#include "core/hle/service/sm/sm.h"
#include "core/hle/service/btm/btm.h"
-#include "core/hle/service/btm/btm_debug.h"
-#include "core/hle/service/btm/btm_system.h"
-#include "core/hle/service/btm/btm_user.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h"
+namespace Kernel {
+class KEvent;
+class KReadableEvent;
+} // namespace Kernel
+
+namespace Core {
+class System;
+}
+
+namespace Service::Set {
+class ISystemSettingsServer;
+}
+
namespace Service::BTM {
+class IBtmSystemCore final : public ServiceFramework<IBtmSystemCore> {
+public:
+ explicit IBtmSystemCore(Core::System& system_)
+ : ServiceFramework{system_, "IBtmSystemCore"}, service_context{system_, "IBtmSystemCore"} {
+ radio_event = service_context.CreateEvent("IBtmSystemCore:RadioEvent");
+ audio_device_connection_event = service_context.CreateEvent("IBtmSystemCore:AudioDeviceConnectionEvent");
+ m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
+ }
+
+ ~IBtmSystemCore() override {
+ service_context.CloseEvent(radio_event);
+ service_context.CloseEvent(audio_device_connection_event);
+ }
+
+ Result StartGamepadPairing() {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+ R_SUCCEED();
+ }
+
+ Result CancelGamepadPairing() {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+ R_SUCCEED();
+ }
+
+ Result EnableRadio() {
+ LOG_DEBUG(Service_BTM, "called");
+
+ R_RETURN(m_set_sys->SetBluetoothEnableFlag(true));
+ }
+ Result DisableRadio() {
+ LOG_DEBUG(Service_BTM, "called");
+
+ R_RETURN(m_set_sys->SetBluetoothEnableFlag(false));
+ }
+
+ Result IsRadioEnabled(Out<bool> out_is_enabled) {
+ LOG_DEBUG(Service_BTM, "called");
+
+ R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled));
+ }
+
+ Result AcquireRadioEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &radio_event->GetReadableEvent();
+ R_SUCCEED();
+ }
+
+ Result GetDiscoveredAudioDevice(OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out<s32> out_total) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+ R_SUCCEED();
+ }
+
+ Result AcquireAudioDeviceConnectionEvent(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_event = &audio_device_connection_event->GetReadableEvent();
+ R_SUCCEED();
+ }
+
+ Result GetConnectedAudioDevices(
+ Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_count = 0;
+ R_SUCCEED();
+ }
+
+ Result GetPairedAudioDevices(
+ Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_count = 0;
+ R_SUCCEED();
+ }
+
+ Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
+ R_SUCCEED();
+ }
+
+ Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"},
+ FunctionInfo{1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"},
+ FunctionInfo{2, nullptr, "ClearGamepadPairingDatabase"},
+ FunctionInfo{3, nullptr, "GetPairedGamepadCount"},
+ FunctionInfo{4, C<&IBtmSystemCore::EnableRadio>, "EnableRadio"},
+ FunctionInfo{5, C<&IBtmSystemCore::DisableRadio>, "DisableRadio"},
+ FunctionInfo{6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"},
+ FunctionInfo{7, C<&IBtmSystemCore::AcquireRadioEvent>, "AcquireRadioEvent"},
+ FunctionInfo{8, nullptr, "AcquireGamepadPairingEvent"},
+ FunctionInfo{9, nullptr, "IsGamepadPairingStarted"},
+ FunctionInfo{10, nullptr, "StartAudioDeviceDiscovery"},
+ FunctionInfo{11, nullptr, "StopAudioDeviceDiscovery"},
+ FunctionInfo{12, nullptr, "IsDiscoveryingAudioDevice"},
+ FunctionInfo{13, C<&IBtmSystemCore::GetDiscoveredAudioDevice>, "GetDiscoveredAudioDevice"},
+ FunctionInfo{14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"},
+ FunctionInfo{15, nullptr, "ConnectAudioDevice"},
+ FunctionInfo{16, nullptr, "IsConnectingAudioDevice"},
+ FunctionInfo{17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"},
+ FunctionInfo{18, nullptr, "DisconnectAudioDevice"},
+ FunctionInfo{19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"},
+ FunctionInfo{20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"},
+ FunctionInfo{21, nullptr, "RemoveAudioDevicePairing"},
+ FunctionInfo{22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"},
+ FunctionInfo{23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"}
+ );
+ KernelHelpers::ServiceContext service_context;
+ Kernel::KEvent* radio_event;
+ Kernel::KEvent* audio_device_connection_event;
+ std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
+};
+
+class IBtmSystem final : public ServiceFramework<IBtmSystem> {
+public:
+ explicit IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} {}
+ ~IBtmSystem() override = default;
+
+ Result GetCore(OutInterface<IBtmSystemCore> out_interface) {
+ LOG_WARNING(Service_BTM, "called");
+
+ *out_interface = std::make_shared<IBtmSystemCore>(system);
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IBtmSystem::GetCore>, "GetCore"}
+ );
+};
+
+class IBtmUserCore final : public ServiceFramework<IBtmUserCore> {
+public:
+ explicit IBtmUserCore(Core::System& system_)
+ : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} {
+ scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent");
+ connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent");
+ service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent");
+ config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent");
+ }
+
+ ~IBtmUserCore() override {
+ service_context.CloseEvent(scan_event);
+ service_context.CloseEvent(connection_event);
+ service_context.CloseEvent(service_discovery_event);
+ service_context.CloseEvent(config_event);
+ }
+
+ Result AcquireBleScanEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &scan_event->GetReadableEvent();
+ R_SUCCEED();
+ }
+
+ Result AcquireBleConnectionEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &connection_event->GetReadableEvent();
+ R_SUCCEED();
+ }
+
+ Result AcquireBleServiceDiscoveryEvent(
+ Out<bool> out_is_valid, OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &service_discovery_event->GetReadableEvent();
+ R_SUCCEED();
+ }
+
+ Result AcquireBleMtuConfigEvent(Out<bool> out_is_valid,
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_WARNING(Service_BTM, "(STUBBED) called");
+
+ *out_is_valid = true;
+ *out_event = &config_event->GetReadableEvent();
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"},
+ FunctionInfo{1, nullptr, "GetBleScanFilterParameter"},
+ FunctionInfo{2, nullptr, "GetBleScanFilterParameter2"},
+ FunctionInfo{3, nullptr, "StartBleScanForGeneral"},
+ FunctionInfo{4, nullptr, "StopBleScanForGeneral"},
+ FunctionInfo{5, nullptr, "GetBleScanResultsForGeneral"},
+ FunctionInfo{6, nullptr, "StartBleScanForPaired"},
+ FunctionInfo{7, nullptr, "StopBleScanForPaired"},
+ FunctionInfo{8, nullptr, "StartBleScanForSmartDevice"},
+ FunctionInfo{9, nullptr, "StopBleScanForSmartDevice"},
+ FunctionInfo{10, nullptr, "GetBleScanResultsForSmartDevice"},
+ FunctionInfo{17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"},
+ FunctionInfo{18, nullptr, "BleConnect"},
+ FunctionInfo{19, nullptr, "BleDisconnect"},
+ FunctionInfo{20, nullptr, "BleGetConnectionState"},
+ FunctionInfo{21, nullptr, "AcquireBlePairingEvent"},
+ FunctionInfo{22, nullptr, "BlePairDevice"},
+ FunctionInfo{23, nullptr, "BleUnPairDevice"},
+ FunctionInfo{24, nullptr, "BleUnPairDevice2"},
+ FunctionInfo{25, nullptr, "BleGetPairedDevices"},
+ FunctionInfo{26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"},
+ FunctionInfo{27, nullptr, "GetGattServices"},
+ FunctionInfo{28, nullptr, "GetGattService"},
+ FunctionInfo{29, nullptr, "GetGattIncludedServices"},
+ FunctionInfo{30, nullptr, "GetBelongingGattService"},
+ FunctionInfo{31, nullptr, "GetGattCharacteristics"},
+ FunctionInfo{32, nullptr, "GetGattDescriptors"},
+ FunctionInfo{33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"},
+ FunctionInfo{34, nullptr, "ConfigureBleMtu"},
+ FunctionInfo{35, nullptr, "GetBleMtu"},
+ FunctionInfo{36, nullptr, "RegisterBleGattDataPath"},
+ FunctionInfo{37, nullptr, "UnregisterBleGattDataPath"}
+ );
+ KernelHelpers::ServiceContext service_context;
+ Kernel::KEvent* scan_event;
+ Kernel::KEvent* connection_event;
+ Kernel::KEvent* service_discovery_event;
+ Kernel::KEvent* config_event;
+};
+
+class IBtmUser final : public ServiceFramework<IBtmUser> {
+public:
+ explicit IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} {}
+ ~IBtmUser() override = default;
+
+ Result GetCore(OutInterface<IBtmUserCore> out_interface) {
+ LOG_WARNING(Service_BTM, "called");
+
+ *out_interface = std::make_shared<IBtmUserCore>(system);
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IBtmUser::GetCore>, "GetCore"}
+ );
+};
+
+class IBtmDebug final : public ServiceFramework<IBtmDebug> {
+public:
+ explicit IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} {}
+ ~IBtmDebug() override = default;
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "AcquireDiscoveryEvent"},
+ FunctionInfo{1, nullptr, "StartDiscovery"},
+ FunctionInfo{2, nullptr, "CancelDiscovery"},
+ FunctionInfo{3, nullptr, "GetDeviceProperty"},
+ FunctionInfo{4, nullptr, "CreateBond"},
+ FunctionInfo{5, nullptr, "CancelBond"},
+ FunctionInfo{6, nullptr, "SetTsiMode"},
+ FunctionInfo{7, nullptr, "GeneralTest"},
+ FunctionInfo{8, nullptr, "HidConnect"},
+ FunctionInfo{9, nullptr, "GeneralGet", MakeVersionGate({5,0,0})},
+ FunctionInfo{10, nullptr, "GetGattClientDisconnectionReason", MakeVersionGate({5,0,0})},
+ FunctionInfo{11, nullptr, "GetBleConnectionParameter", MakeVersionGate({5,1,0})},
+ FunctionInfo{12, nullptr, "GetBleConnectionParameterRequest", MakeVersionGate({5,1,0})},
+ FunctionInfo{13, nullptr, "GetDiscoveredDevice", MakeVersionGate({12,0,0})},
+ FunctionInfo{14, nullptr, "SleepAwakeLoopTest", MakeVersionGate({15,0,0})},
+ FunctionInfo{15, nullptr, "SleepTest", MakeVersionGate({15,0,0})},
+ FunctionInfo{16, nullptr, "MinimumAwakeTest", MakeVersionGate({15,0,0})},
+ FunctionInfo{17, nullptr, "ForceEnableBtm", MakeVersionGate({15,0,0})}
+ );
+};
+
class IBtm final : public ServiceFramework<IBtm> {
public:
- explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetState"},
- {1, nullptr, "GetHostDeviceProperty"},
- {2, nullptr, "AcquireDeviceConditionEvent"},
- {3, nullptr, "GetDeviceCondition"},
- {4, nullptr, "SetBurstMode"},
- {5, nullptr, "SetSlotMode"},
- {6, nullptr, "SetBluetoothMode"},
- {7, nullptr, "SetWlanMode"},
- {8, nullptr, "AcquireDeviceInfoEvent"},
- {9, nullptr, "GetDeviceInfo"},
- {10, nullptr, "AddDeviceInfo"},
- {11, nullptr, "RemoveDeviceInfo"},
- {12, nullptr, "IncreaseDeviceInfoOrder"},
- {13, nullptr, "LlrNotify"},
- {14, nullptr, "EnableRadio"},
- {15, nullptr, "DisableRadio"},
- {16, nullptr, "HidDisconnect"},
- {17, nullptr, "HidSetRetransmissionMode"},
- {18, nullptr, "AcquireAwakeReqEvent"},
- {19, nullptr, "AcquireLlrStateEvent"},
- {20, nullptr, "IsLlrStarted"},
- {21, nullptr, "EnableSlotSaving"},
- {22, nullptr, "ProtectDeviceInfo"},
- {23, nullptr, "AcquireBleScanEvent"},
- {24, nullptr, "GetBleScanParameterGeneral"},
- {25, nullptr, "GetBleScanParameterSmartDevice"},
- {26, nullptr, "StartBleScanForGeneral"},
- {27, nullptr, "StopBleScanForGeneral"},
- {28, nullptr, "GetBleScanResultsForGeneral"},
- {29, nullptr, "StartBleScanForPairedDevice"},
- {30, nullptr, "StopBleScanForPairedDevice"},
- {31, nullptr, "StartBleScanForSmartDevice"},
- {32, nullptr, "StopBleScanForSmartDevice"},
- {33, nullptr, "GetBleScanResultsForSmartDevice"},
- {34, nullptr, "AcquireBleConnectionEvent"},
- {35, nullptr, "BleConnect"},
- {36, nullptr, "BleOverrideConnection"},
- {37, nullptr, "BleDisconnect"},
- {38, nullptr, "BleGetConnectionState"},
- {39, nullptr, "BleGetGattClientConditionList"},
- {40, nullptr, "AcquireBlePairingEvent"},
- {41, nullptr, "BlePairDevice"},
- {42, nullptr, "BleUnpairDeviceOnBoth"},
- {43, nullptr, "BleUnpairDevice"},
- {44, nullptr, "BleGetPairedAddresses"},
- {45, nullptr, "AcquireBleServiceDiscoveryEvent"},
- {46, nullptr, "GetGattServices"},
- {47, nullptr, "GetGattService"},
- {48, nullptr, "GetGattIncludedServices"},
- {49, nullptr, "GetBelongingService"},
- {50, nullptr, "GetGattCharacteristics"},
- {51, nullptr, "GetGattDescriptors"},
- {52, nullptr, "AcquireBleMtuConfigEvent"},
- {53, nullptr, "ConfigureBleMtu"},
- {54, nullptr, "GetBleMtu"},
- {55, nullptr, "RegisterBleGattDataPath"},
- {56, nullptr, "UnregisterBleGattDataPath"},
- {57, nullptr, "RegisterAppletResourceUserId"},
- {58, nullptr, "UnregisterAppletResourceUserId"},
- {59, nullptr, "SetAppletResourceUserId"},
- {60, nullptr, "AcquireBleConnectionParameterUpdateEvent"}, //8.0.0+
- {61, nullptr, "SetCeLength"}, //8.0.0+
- {62, nullptr, "EnsureSlotExpansion"}, //9.0.0+
- {63, nullptr, "IsSlotExpansionEnsured"}, //9.0.0+
- {64, nullptr, "CancelConnectionTrigger"}, //10.0.0+
- {65, nullptr, "GetConnectionCapacity"}, //13.0.0+
- {66, nullptr, "GetWlanMode"}, //13.0.0+
- {67, nullptr, "IsSlotSavingEnabled"}, //13.0.0+
- {68, nullptr, "IsSlotSavingForPairingEnabled"}, //13.0.0+
- {69, nullptr, "AcquireAudioDeviceConnectionEvent"}, //13.0.0+
- {70, nullptr, "GetConnectedAudioDevices"}, //13.0.0+
- {71, nullptr, "SetAudioSourceVolume"}, //13.0.0+
- {72, nullptr, "GetAudioSourceVolume"}, //13.0.0+
- {73, nullptr, "RequestAudioDeviceConnectionRejection"}, //13.0.0+
- {74, nullptr, "CancelAudioDeviceConnectionRejection"}, //13.0.0+
- {75, nullptr, "GetPairedAudioDevices"}, //13.0.0+
- {76, nullptr, "SetWlanModeWithOption"}, //13.1.0+
- {100, nullptr, "AcquireConnectionDisallowedEvent"}, //13.0.0+
- {101, nullptr, "GetUsecaseViolationFactor"}, //13.0.0+
- {110, nullptr, "GetShortenedDeviceInfo"}, //13.0.0+
- {111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+
- {112, nullptr, "Unknown112"}, //14.0.0-14.1.2
- {113, nullptr, "Unknown113"}, //14.0.0-14.1.2
- {114, nullptr, "IsFirstAudioControlConnection"}, //14.0.0+
- {115, nullptr, "GetShortenedDeviceCondition"}, //14.0.0+
- {116, nullptr, "SetAudioSinkVolume"}, //15.0.0+
- {117, nullptr, "GetAudioSinkVolume"}, //15.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetState"},
+ FunctionInfo{1, nullptr, "GetHostDeviceProperty"},
+ FunctionInfo{2, nullptr, "AcquireDeviceConditionEvent"},
+ FunctionInfo{3, nullptr, "GetDeviceCondition"},
+ FunctionInfo{4, nullptr, "SetBurstMode"},
+ FunctionInfo{5, nullptr, "SetSlotMode"},
+ FunctionInfo{6, nullptr, "SetBluetoothMode"},
+ FunctionInfo{7, nullptr, "SetWlanMode"},
+ FunctionInfo{8, nullptr, "AcquireDeviceInfoEvent"},
+ FunctionInfo{9, nullptr, "GetDeviceInfo"},
+ FunctionInfo{10, nullptr, "AddDeviceInfo"},
+ FunctionInfo{11, nullptr, "RemoveDeviceInfo"},
+ FunctionInfo{12, nullptr, "IncreaseDeviceInfoOrder"},
+ FunctionInfo{13, nullptr, "LlrNotify"},
+ FunctionInfo{14, nullptr, "EnableRadio"},
+ FunctionInfo{15, nullptr, "DisableRadio"},
+ FunctionInfo{16, nullptr, "HidDisconnect"},
+ FunctionInfo{17, nullptr, "HidSetRetransmissionMode"},
+ FunctionInfo{18, nullptr, "AcquireAwakeReqEvent"},
+ FunctionInfo{19, nullptr, "AcquireLlrStateEvent"},
+ FunctionInfo{20, nullptr, "IsLlrStarted"},
+ FunctionInfo{21, nullptr, "EnableSlotSaving"},
+ FunctionInfo{22, nullptr, "ProtectDeviceInfo"},
+ FunctionInfo{23, nullptr, "AcquireBleScanEvent"},
+ FunctionInfo{24, nullptr, "GetBleScanParameterGeneral"},
+ FunctionInfo{25, nullptr, "GetBleScanParameterSmartDevice"},
+ FunctionInfo{26, nullptr, "StartBleScanForGeneral"},
+ FunctionInfo{27, nullptr, "StopBleScanForGeneral"},
+ FunctionInfo{28, nullptr, "GetBleScanResultsForGeneral"},
+ FunctionInfo{29, nullptr, "StartBleScanForPairedDevice"},
+ FunctionInfo{30, nullptr, "StopBleScanForPairedDevice"},
+ FunctionInfo{31, nullptr, "StartBleScanForSmartDevice"},
+ FunctionInfo{32, nullptr, "StopBleScanForSmartDevice"},
+ FunctionInfo{33, nullptr, "GetBleScanResultsForSmartDevice"},
+ FunctionInfo{34, nullptr, "AcquireBleConnectionEvent"},
+ FunctionInfo{35, nullptr, "BleConnect"},
+ FunctionInfo{36, nullptr, "BleOverrideConnection"},
+ FunctionInfo{37, nullptr, "BleDisconnect"},
+ FunctionInfo{38, nullptr, "BleGetConnectionState"},
+ FunctionInfo{39, nullptr, "BleGetGattClientConditionList"},
+ FunctionInfo{40, nullptr, "AcquireBlePairingEvent"},
+ FunctionInfo{41, nullptr, "BlePairDevice"},
+ FunctionInfo{42, nullptr, "BleUnpairDeviceOnBoth"},
+ FunctionInfo{43, nullptr, "BleUnpairDevice"},
+ FunctionInfo{44, nullptr, "BleGetPairedAddresses"},
+ FunctionInfo{45, nullptr, "AcquireBleServiceDiscoveryEvent"},
+ FunctionInfo{46, nullptr, "GetGattServices"},
+ FunctionInfo{47, nullptr, "GetGattService"},
+ FunctionInfo{48, nullptr, "GetGattIncludedServices"},
+ FunctionInfo{49, nullptr, "GetBelongingService"},
+ FunctionInfo{50, nullptr, "GetGattCharacteristics"},
+ FunctionInfo{51, nullptr, "GetGattDescriptors"},
+ FunctionInfo{52, nullptr, "AcquireBleMtuConfigEvent"},
+ FunctionInfo{53, nullptr, "ConfigureBleMtu"},
+ FunctionInfo{54, nullptr, "GetBleMtu"},
+ FunctionInfo{55, nullptr, "RegisterBleGattDataPath"},
+ FunctionInfo{56, nullptr, "UnregisterBleGattDataPath"},
+ FunctionInfo{57, nullptr, "RegisterAppletResourceUserId"},
+ FunctionInfo{58, nullptr, "UnregisterAppletResourceUserId"},
+ FunctionInfo{59, nullptr, "SetAppletResourceUserId"},
+ FunctionInfo{60, nullptr, "AcquireBleConnectionParameterUpdateEvent", MakeVersionGate({8,0,0})},
+ FunctionInfo{61, nullptr, "SetCeLength", MakeVersionGate({8,0,0})},
+ FunctionInfo{62, nullptr, "EnsureSlotExpansion", MakeVersionGate({9,0,0})},
+ FunctionInfo{63, nullptr, "IsSlotExpansionEnsured", MakeVersionGate({9,0,0})},
+ FunctionInfo{64, nullptr, "CancelConnectionTrigger", MakeVersionGate({10,0,0})},
+ FunctionInfo{65, nullptr, "GetConnectionCapacity", MakeVersionGate({13,0,0})},
+ FunctionInfo{66, nullptr, "GetWlanMode", MakeVersionGate({13,0,0})},
+ FunctionInfo{67, nullptr, "IsSlotSavingEnabled", MakeVersionGate({13,0,0})},
+ FunctionInfo{68, nullptr, "IsSlotSavingForPairingEnabled", MakeVersionGate({13,0,0})},
+ FunctionInfo{69, nullptr, "AcquireAudioDeviceConnectionEvent", MakeVersionGate({13,0,0})},
+ FunctionInfo{70, nullptr, "GetConnectedAudioDevices", MakeVersionGate({13,0,0})},
+ FunctionInfo{71, nullptr, "SetAudioSourceVolume", MakeVersionGate({13,0,0})},
+ FunctionInfo{72, nullptr, "GetAudioSourceVolume", MakeVersionGate({13,0,0})},
+ FunctionInfo{73, nullptr, "RequestAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})},
+ FunctionInfo{74, nullptr, "CancelAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})},
+ FunctionInfo{75, nullptr, "GetPairedAudioDevices", MakeVersionGate({13,0,0})},
+ FunctionInfo{76, nullptr, "SetWlanModeWithOption", MakeVersionGate({13,1,0})},
+ FunctionInfo{100, nullptr, "AcquireConnectionDisallowedEvent", MakeVersionGate({13,0,0})},
+ FunctionInfo{101, nullptr, "GetUsecaseViolationFactor", MakeVersionGate({13,0,0})},
+ FunctionInfo{110, nullptr, "GetShortenedDeviceInfo", MakeVersionGate({13,0,0})},
+ FunctionInfo{111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+
+ FunctionInfo{112, nullptr, "Unknown112", MakeVersionGate({14,0,0}, {14,1,2})},
+ FunctionInfo{113, nullptr, "Unknown113", MakeVersionGate({14,0,0}, {14,1,2})},
+ FunctionInfo{114, nullptr, "IsFirstAudioControlConnection", MakeVersionGate({14,0,0})},
+ FunctionInfo{115, nullptr, "GetShortenedDeviceCondition", MakeVersionGate({14,0,0})},
+ FunctionInfo{116, nullptr, "SetAudioSinkVolume", MakeVersionGate({15,0,0})},
+ FunctionInfo{117, nullptr, "GetAudioSinkVolume", MakeVersionGate({15,0,0})}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/btm/btm_debug.cpp b/src/core/hle/service/btm/btm_debug.cpp
deleted file mode 100644
index 0c9a3a6557..0000000000
--- a/src/core/hle/service/btm/btm_debug.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#include "core/hle/service/btm/btm_debug.h"
-
-namespace Service::BTM {
-
-IBtmDebug::IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "AcquireDiscoveryEvent"},
- {1, nullptr, "StartDiscovery"},
- {2, nullptr, "CancelDiscovery"},
- {3, nullptr, "GetDeviceProperty"},
- {4, nullptr, "CreateBond"},
- {5, nullptr, "CancelBond"},
- {6, nullptr, "SetTsiMode"},
- {7, nullptr, "GeneralTest"},
- {8, nullptr, "HidConnect"},
- {9, nullptr, "GeneralGet"}, //5.0.0+
- {10, nullptr, "GetGattClientDisconnectionReason"}, //5.0.0+
- {11, nullptr, "GetBleConnectionParameter"}, //5.1.0+
- {12, nullptr, "GetBleConnectionParameterRequest"}, //5.1.0+
- {13, nullptr, "GetDiscoveredDevice"}, //12.0.0+
- {14, nullptr, "SleepAwakeLoopTest"}, //15.0.0+
- {15, nullptr, "SleepTest"}, //15.0.0+
- {16, nullptr, "MinimumAwakeTest"}, //15.0.0+
- {17, nullptr, "ForceEnableBtm"}, //15.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IBtmDebug::~IBtmDebug() = default;
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_debug.h b/src/core/hle/service/btm/btm_debug.h
deleted file mode 100644
index bf4f7e14fd..0000000000
--- a/src/core/hle/service/btm/btm_debug.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Core {
-class System;
-}
-
-namespace Service::BTM {
-
-class IBtmDebug final : public ServiceFramework<IBtmDebug> {
-public:
- explicit IBtmDebug(Core::System& system_);
- ~IBtmDebug() override;
-};
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_system.cpp b/src/core/hle/service/btm/btm_system.cpp
deleted file mode 100644
index 1684b0193e..0000000000
--- a/src/core/hle/service/btm/btm_system.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#include "common/logging.h"
-#include "core/hle/service/btm/btm_system.h"
-#include "core/hle/service/btm/btm_system_core.h"
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/service.h"
-
-namespace Service::BTM {
-
-IBtmSystem::IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&IBtmSystem::GetCore>, "GetCore"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IBtmSystem::~IBtmSystem() = default;
-
-Result IBtmSystem::GetCore(OutInterface<IBtmSystemCore> out_interface) {
- LOG_WARNING(Service_BTM, "called");
-
- *out_interface = std::make_shared<IBtmSystemCore>(system);
- R_SUCCEED();
-}
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_system.h b/src/core/hle/service/btm/btm_system.h
deleted file mode 100644
index fe1c6dbd78..0000000000
--- a/src/core/hle/service/btm/btm_system.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Core {
-class System;
-}
-
-namespace Service::BTM {
-class IBtmSystemCore;
-
-class IBtmSystem final : public ServiceFramework<IBtmSystem> {
-public:
- explicit IBtmSystem(Core::System& system_);
- ~IBtmSystem() override;
-
-private:
- Result GetCore(OutInterface<IBtmSystemCore> out_interface);
-};
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_system_core.cpp b/src/core/hle/service/btm/btm_system_core.cpp
deleted file mode 100644
index 318657fc32..0000000000
--- a/src/core/hle/service/btm/btm_system_core.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#include "common/logging.h"
-#include "core/hle/service/btm/btm_system_core.h"
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/set/system_settings_server.h"
-#include "core/hle/service/sm/sm.h"
-
-namespace Service::BTM {
-
-IBtmSystemCore::IBtmSystemCore(Core::System& system_)
- : ServiceFramework{system_, "IBtmSystemCore"}, service_context{system_, "IBtmSystemCore"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"},
- {1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"},
- {2, nullptr, "ClearGamepadPairingDatabase"},
- {3, nullptr, "GetPairedGamepadCount"},
- {4, C<&IBtmSystemCore::EnableRadio>, "EnableRadio"},
- {5, C<&IBtmSystemCore::DisableRadio>, "DisableRadio"},
- {6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"},
- {7, C<&IBtmSystemCore::AcquireRadioEvent>, "AcquireRadioEvent"},
- {8, nullptr, "AcquireGamepadPairingEvent"},
- {9, nullptr, "IsGamepadPairingStarted"},
- {10, nullptr, "StartAudioDeviceDiscovery"},
- {11, nullptr, "StopAudioDeviceDiscovery"},
- {12, nullptr, "IsDiscoveryingAudioDevice"},
- {13, C<&IBtmSystemCore::GetDiscoveredAudioDevice>, "GetDiscoveredAudioDevice"},
- {14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"},
- {15, nullptr, "ConnectAudioDevice"},
- {16, nullptr, "IsConnectingAudioDevice"},
- {17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"},
- {18, nullptr, "DisconnectAudioDevice"},
- {19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"},
- {20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"},
- {21, nullptr, "RemoveAudioDevicePairing"},
- {22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"},
- {23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"}
- };
- // clang-format on
-
- RegisterHandlers(functions);
- radio_event = service_context.CreateEvent("IBtmSystemCore::RadioEvent");
- audio_device_connection_event =
- service_context.CreateEvent("IBtmSystemCore::AudioDeviceConnectionEvent");
-
- m_set_sys =
- system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
-}
-
-IBtmSystemCore::~IBtmSystemCore() {
- service_context.CloseEvent(radio_event);
- service_context.CloseEvent(audio_device_connection_event);
-}
-
-Result IBtmSystemCore::StartGamepadPairing() {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
- R_SUCCEED();
-}
-
-Result IBtmSystemCore::CancelGamepadPairing() {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
- R_SUCCEED();
-}
-
-Result IBtmSystemCore::EnableRadio() {
- LOG_DEBUG(Service_BTM, "called");
-
- R_RETURN(m_set_sys->SetBluetoothEnableFlag(true));
-}
-Result IBtmSystemCore::DisableRadio() {
- LOG_DEBUG(Service_BTM, "called");
-
- R_RETURN(m_set_sys->SetBluetoothEnableFlag(false));
-}
-
-Result IBtmSystemCore::IsRadioEnabled(Out<bool> out_is_enabled) {
- LOG_DEBUG(Service_BTM, "called");
-
- R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled));
-}
-
-Result IBtmSystemCore::AcquireRadioEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &radio_event->GetReadableEvent();
- R_SUCCEED();
-}
-
-Result IBtmSystemCore::GetDiscoveredAudioDevice(OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out<s32> out_total) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
- R_SUCCEED();
-}
-
-Result IBtmSystemCore::AcquireAudioDeviceConnectionEvent(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_event = &audio_device_connection_event->GetReadableEvent();
- R_SUCCEED();
-}
-
-Result IBtmSystemCore::GetConnectedAudioDevices(
- Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_count = 0;
- R_SUCCEED();
-}
-
-Result IBtmSystemCore::GetPairedAudioDevices(
- Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_count = 0;
- R_SUCCEED();
-}
-
-Result IBtmSystemCore::RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
- LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
- R_SUCCEED();
-}
-
-Result IBtmSystemCore::CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
- LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
- R_SUCCEED();
-}
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_system_core.h b/src/core/hle/service/btm/btm_system_core.h
deleted file mode 100644
index 3fc4c0d56c..0000000000
--- a/src/core/hle/service/btm/btm_system_core.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/kernel_helpers.h"
-#include "core/hle/service/service.h"
-
-namespace Kernel {
-class KEvent;
-class KReadableEvent;
-} // namespace Kernel
-
-namespace Core {
-class System;
-}
-
-namespace Service::Set {
-class ISystemSettingsServer;
-}
-
-namespace Service::BTM {
-
-class IBtmSystemCore final : public ServiceFramework<IBtmSystemCore> {
-public:
- explicit IBtmSystemCore(Core::System& system_);
- ~IBtmSystemCore() override;
-
-private:
- Result StartGamepadPairing();
- Result CancelGamepadPairing();
- Result EnableRadio();
- Result DisableRadio();
- Result IsRadioEnabled(Out<bool> out_is_enabled);
-
- Result AcquireRadioEvent(Out<bool> out_is_valid, OutCopyHandle<Kernel::KReadableEvent> out_event);
- Result GetDiscoveredAudioDevice(OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out<s32> out_total);
- Result AcquireAudioDeviceConnectionEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
-
- Result GetConnectedAudioDevices(
- Out<s32> out_count,
- OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices);
-
- Result GetPairedAudioDevices(
- Out<s32> out_count,
- OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices);
-
- Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid);
- Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid);
-
- KernelHelpers::ServiceContext service_context;
-
- Kernel::KEvent* radio_event;
- Kernel::KEvent* audio_device_connection_event;
- std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
-};
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_user.cpp b/src/core/hle/service/btm/btm_user.cpp
deleted file mode 100644
index c380c573fa..0000000000
--- a/src/core/hle/service/btm/btm_user.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#include "common/logging.h"
-#include "core/hle/service/btm/btm_user.h"
-#include "core/hle/service/btm/btm_user_core.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::BTM {
-
-IBtmUser::IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&IBtmUser::GetCore>, "GetCore"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IBtmUser::~IBtmUser() = default;
-
-Result IBtmUser::GetCore(OutInterface<IBtmUserCore> out_interface) {
- LOG_WARNING(Service_BTM, "called");
-
- *out_interface = std::make_shared<IBtmUserCore>(system);
- R_SUCCEED();
-}
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_user.h b/src/core/hle/service/btm/btm_user.h
deleted file mode 100644
index d9ee5db455..0000000000
--- a/src/core/hle/service/btm/btm_user.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Core {
-class System;
-}
-
-namespace Service::BTM {
-class IBtmUserCore;
-
-class IBtmUser final : public ServiceFramework<IBtmUser> {
-public:
- explicit IBtmUser(Core::System& system_);
- ~IBtmUser() override;
-
-private:
- Result GetCore(OutInterface<IBtmUserCore> out_interface);
-};
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_user_core.cpp b/src/core/hle/service/btm/btm_user_core.cpp
deleted file mode 100644
index b120df14c0..0000000000
--- a/src/core/hle/service/btm/btm_user_core.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#include <memory>
-
-#include "common/logging.h"
-#include "core/core.h"
-#include "core/hle/kernel/k_event.h"
-#include "core/hle/service/btm/btm_user_core.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::BTM {
-
-IBtmUserCore::IBtmUserCore(Core::System& system_)
- : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"},
- {1, nullptr, "GetBleScanFilterParameter"},
- {2, nullptr, "GetBleScanFilterParameter2"},
- {3, nullptr, "StartBleScanForGeneral"},
- {4, nullptr, "StopBleScanForGeneral"},
- {5, nullptr, "GetBleScanResultsForGeneral"},
- {6, nullptr, "StartBleScanForPaired"},
- {7, nullptr, "StopBleScanForPaired"},
- {8, nullptr, "StartBleScanForSmartDevice"},
- {9, nullptr, "StopBleScanForSmartDevice"},
- {10, nullptr, "GetBleScanResultsForSmartDevice"},
- {17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"},
- {18, nullptr, "BleConnect"},
- {19, nullptr, "BleDisconnect"},
- {20, nullptr, "BleGetConnectionState"},
- {21, nullptr, "AcquireBlePairingEvent"},
- {22, nullptr, "BlePairDevice"},
- {23, nullptr, "BleUnPairDevice"},
- {24, nullptr, "BleUnPairDevice2"},
- {25, nullptr, "BleGetPairedDevices"},
- {26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"},
- {27, nullptr, "GetGattServices"},
- {28, nullptr, "GetGattService"},
- {29, nullptr, "GetGattIncludedServices"},
- {30, nullptr, "GetBelongingGattService"},
- {31, nullptr, "GetGattCharacteristics"},
- {32, nullptr, "GetGattDescriptors"},
- {33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"},
- {34, nullptr, "ConfigureBleMtu"},
- {35, nullptr, "GetBleMtu"},
- {36, nullptr, "RegisterBleGattDataPath"},
- {37, nullptr, "UnregisterBleGattDataPath"},
- };
- // clang-format on
- RegisterHandlers(functions);
-
- scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent");
- connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent");
- service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent");
- config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent");
-}
-
-IBtmUserCore::~IBtmUserCore() {
- service_context.CloseEvent(scan_event);
- service_context.CloseEvent(connection_event);
- service_context.CloseEvent(service_discovery_event);
- service_context.CloseEvent(config_event);
-}
-
-Result IBtmUserCore::AcquireBleScanEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &scan_event->GetReadableEvent();
- R_SUCCEED();
-}
-
-Result IBtmUserCore::AcquireBleConnectionEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &connection_event->GetReadableEvent();
- R_SUCCEED();
-}
-
-Result IBtmUserCore::AcquireBleServiceDiscoveryEvent(
- Out<bool> out_is_valid, OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &service_discovery_event->GetReadableEvent();
- R_SUCCEED();
-}
-
-Result IBtmUserCore::AcquireBleMtuConfigEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_WARNING(Service_BTM, "(STUBBED) called");
-
- *out_is_valid = true;
- *out_event = &config_event->GetReadableEvent();
- R_SUCCEED();
-}
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/btm/btm_user_core.h b/src/core/hle/service/btm/btm_user_core.h
deleted file mode 100644
index dc0a22e810..0000000000
--- a/src/core/hle/service/btm/btm_user_core.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/kernel_helpers.h"
-#include "core/hle/service/service.h"
-
-namespace Kernel {
-class KEvent;
-class KReadableEvent;
-} // namespace Kernel
-
-namespace Core {
-class System;
-}
-
-namespace Service::BTM {
-
-class IBtmUserCore final : public ServiceFramework<IBtmUserCore> {
-public:
- explicit IBtmUserCore(Core::System& system_);
- ~IBtmUserCore() override;
-
-private:
- Result AcquireBleScanEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event);
-
- Result AcquireBleConnectionEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event);
-
- Result AcquireBleServiceDiscoveryEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event);
-
- Result AcquireBleMtuConfigEvent(Out<bool> out_is_valid,
- OutCopyHandle<Kernel::KReadableEvent> out_event);
-
- KernelHelpers::ServiceContext service_context;
-
- Kernel::KEvent* scan_event;
- Kernel::KEvent* connection_event;
- Kernel::KEvent* service_discovery_event;
- Kernel::KEvent* config_event;
-};
-
-} // namespace Service::BTM
diff --git a/src/core/hle/service/caps/caps.cpp b/src/core/hle/service/caps/caps.cpp
index f07fbd2185..6cc37999f3 100644
--- a/src/core/hle/service/caps/caps.cpp
+++ b/src/core/hle/service/caps/caps.cpp
@@ -5,7 +5,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/hle/service/caps/caps.h"
-#include "core/hle/service/caps/caps_a.h"
#include "core/hle/service/caps/caps_c.h"
#include "core/hle/service/caps/caps_manager.h"
#include "core/hle/service/caps/caps_sc.h"
@@ -14,22 +13,221 @@
#include "core/hle/service/caps/caps_u.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h"
+#include "common/logging.h"
#include "frontend_common/firmware_manager.h"
+#include "core/hle/service/caps/caps_result.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/ipc_helpers.h"
namespace Service::Capture {
class IDecoderControlService final : public ServiceFramework<IDecoderControlService> {
public:
- explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {3001, nullptr, "DecodeJpeg"},
- {4001, nullptr, "ShrinkJpeg"},
- {4002, nullptr, "ShrinkJpegEx"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{3001, nullptr, "DecodeJpeg"},
+ FunctionInfo{4001, nullptr, "ShrinkJpeg"},
+ FunctionInfo{4002, nullptr, "ShrinkJpegEx"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+};
+
+class IAlbumAccessorService final : public ServiceFramework<IAlbumAccessorService> {
+public:
+ explicit IAlbumAccessorService(Core::System& system_, std::shared_ptr<AlbumManager> album_manager) : ServiceFramework{system_, "caps:a"}, manager{album_manager} {}
+ ~IAlbumAccessorService() override = default;
+
+ Result GetAlbumFileList(
+ Out<u64> out_count, AlbumStorage storage,
+ OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
+ LOG_INFO(Service_Capture, "called, storage={}", storage);
+
+ const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0);
+ R_RETURN(TranslateResult(result));
+ }
+
+ Result DeleteAlbumFile(AlbumFileId file_id) {
+ LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}",
+ file_id.application_id, file_id.storage, file_id.type);
+
+ const Result result = manager->DeleteAlbumFile(file_id);
+ R_RETURN(TranslateResult(result));
}
+
+ Result IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage) {
+ LOG_INFO(Service_Capture, "called, storage={}", storage);
+
+ const Result result = manager->IsAlbumMounted(storage);
+ *out_is_mounted = result.IsSuccess();
+ R_RETURN(TranslateResult(result));
+ }
+
+ Result Unknown18(
+ Out<u32> out_buffer_size,
+ OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_buffer) {
+ LOG_WARNING(Service_Capture, "(STUBBED) called");
+ *out_buffer_size = 0;
+ R_SUCCEED();
+ }
+
+ Result GetAlbumFileListEx0(
+ Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
+ OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
+ LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags);
+
+ const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags);
+ R_RETURN(TranslateResult(result));
+ }
+
+ Result GetAutoSavingStorage(Out<bool> out_is_autosaving) {
+ LOG_WARNING(Service_Capture, "(STUBBED) called");
+
+ const Result result = manager->GetAutoSavingStorage(*out_is_autosaving);
+ R_RETURN(TranslateResult(result));
+ }
+
+ Result LoadAlbumScreenShotImageEx1(
+ const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
+ OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
+ OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
+ OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
+ LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
+ file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
+
+ const Result result =
+ manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options);
+ R_RETURN(TranslateResult(result));
+ }
+
+ Result LoadAlbumScreenShotThumbnailImageEx1(
+ const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
+ OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
+ OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
+ OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
+ LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
+ file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
+
+ const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image,
+ file_id, decoder_options);
+ R_RETURN(TranslateResult(result));
+ }
+
+ Result TranslateResult(Result in_result) {
+ if (in_result.IsSuccess()) {
+ return in_result;
+ }
+
+ if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) {
+ if (in_result.GetDescription() - 0x514 < 100) {
+ return ResultInvalidFileData;
+ }
+ if (in_result.GetDescription() - 0x5dc < 100) {
+ return ResultInvalidFileData;
+ }
+
+ if (in_result.GetDescription() - 0x578 < 100) {
+ if (in_result == ResultFileCountLimit) {
+ return ResultUnknown22;
+ }
+ return ResultUnknown25;
+ }
+
+ if (in_result.raw < ResultUnknown1801.raw) {
+ if (in_result == ResultUnknown1202) {
+ return ResultUnknown810;
+ }
+ if (in_result == ResultUnknown1203) {
+ return ResultUnknown810;
+ }
+ if (in_result == ResultUnknown1701) {
+ return ResultUnknown5;
+ }
+ } else if (in_result.raw < ResultUnknown1803.raw) {
+ if (in_result == ResultUnknown1801) {
+ return ResultUnknown5;
+ }
+ if (in_result == ResultUnknown1802) {
+ return ResultUnknown6;
+ }
+ } else {
+ if (in_result == ResultUnknown1803) {
+ return ResultUnknown7;
+ }
+ if (in_result == ResultUnknown1804) {
+ return ResultOutOfRange;
+ }
+ }
+ return ResultUnknown1024;
+ }
+
+ if (in_result.GetModule() == ErrorModule::FS) {
+ if ((in_result.GetDescription() >> 0xc < 0x7d) ||
+ (in_result.GetDescription() - 1000 < 2000) ||
+ (((in_result.GetDescription() - 3000) >> 3) < 0x271)) {
+ // TODO: Translate FS error
+ return in_result;
+ }
+ }
+
+ return in_result;
+ }
+
+ Result GetAlbumAccessResultForDebug(Out<Result> out_result) {
+ LOG_WARNING(Service_Capture, "(STUBBED) called");
+ *out_result = ResultSuccess;
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetAlbumFileCount"},
+ FunctionInfo{1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"},
+ FunctionInfo{2, nullptr, "LoadAlbumFile"},
+ FunctionInfo{3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
+ FunctionInfo{4, nullptr, "StorageCopyAlbumFile"},
+ FunctionInfo{5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"},
+ FunctionInfo{6, nullptr, "GetAlbumUsage"},
+ FunctionInfo{7, nullptr, "GetAlbumFileSize"},
+ FunctionInfo{8, nullptr, "LoadAlbumFileThumbnail"},
+ FunctionInfo{9, nullptr, "LoadAlbumScreenShotImage"},
+ FunctionInfo{10, nullptr, "LoadAlbumScreenShotThumbnailImage"},
+ FunctionInfo{11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"},
+ FunctionInfo{12, nullptr, "LoadAlbumScreenShotImageEx"},
+ FunctionInfo{13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"},
+ FunctionInfo{14, nullptr, "LoadAlbumScreenShotImageEx0"},
+ FunctionInfo{15, nullptr, "GetAlbumUsage3"},
+ FunctionInfo{16, nullptr, "GetAlbumMountResult"},
+ FunctionInfo{17, nullptr, "GetAlbumUsage16"},
+ FunctionInfo{18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"},
+ FunctionInfo{19, nullptr, "Unknown19"},
+ FunctionInfo{100, nullptr, "GetAlbumFileCountEx0"},
+ FunctionInfo{101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"},
+ FunctionInfo{202, nullptr, "SaveEditedScreenShot"},
+ FunctionInfo{301, nullptr, "GetLastThumbnail"},
+ FunctionInfo{302, nullptr, "GetLastOverlayMovieThumbnail"},
+ FunctionInfo{401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"},
+ FunctionInfo{501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"},
+ FunctionInfo{1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"},
+ FunctionInfo{1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"},
+ FunctionInfo{1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"},
+ FunctionInfo{8001, nullptr, "ForceAlbumUnmounted"},
+ FunctionInfo{8002, nullptr, "ResetAlbumMountStatus"},
+ FunctionInfo{8011, nullptr, "RefreshAlbumCache"},
+ FunctionInfo{8012, nullptr, "GetAlbumCache"},
+ FunctionInfo{8013, nullptr, "GetAlbumCacheEx"},
+ FunctionInfo{8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"},
+ FunctionInfo{10011, nullptr, "SetInternalErrorConversionEnabled"},
+ FunctionInfo{50000, nullptr, "LoadMakerNoteInfoForDebug"},
+ FunctionInfo{50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"},
+ FunctionInfo{60002, nullptr, "OpenAccessorSession"}
+ );
+
+ std::shared_ptr<AlbumManager> manager = nullptr;
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/caps/caps_a.cpp b/src/core/hle/service/caps/caps_a.cpp
deleted file mode 100644
index 8f561bfcdc..0000000000
--- a/src/core/hle/service/caps/caps_a.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "common/logging.h"
-#include "core/hle/service/caps/caps_a.h"
-#include "core/hle/service/caps/caps_manager.h"
-#include "core/hle/service/caps/caps_result.h"
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/ipc_helpers.h"
-
-namespace Service::Capture {
-
-IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
- std::shared_ptr<AlbumManager> album_manager)
- : ServiceFramework{system_, "caps:a"}, manager{album_manager} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetAlbumFileCount"},
- {1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"},
- {2, nullptr, "LoadAlbumFile"},
- {3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
- {4, nullptr, "StorageCopyAlbumFile"},
- {5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"},
- {6, nullptr, "GetAlbumUsage"},
- {7, nullptr, "GetAlbumFileSize"},
- {8, nullptr, "LoadAlbumFileThumbnail"},
- {9, nullptr, "LoadAlbumScreenShotImage"},
- {10, nullptr, "LoadAlbumScreenShotThumbnailImage"},
- {11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"},
- {12, nullptr, "LoadAlbumScreenShotImageEx"},
- {13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"},
- {14, nullptr, "LoadAlbumScreenShotImageEx0"},
- {15, nullptr, "GetAlbumUsage3"},
- {16, nullptr, "GetAlbumMountResult"},
- {17, nullptr, "GetAlbumUsage16"},
- {18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"},
- {19, nullptr, "Unknown19"},
- {100, nullptr, "GetAlbumFileCountEx0"},
- {101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"},
- {202, nullptr, "SaveEditedScreenShot"},
- {301, nullptr, "GetLastThumbnail"},
- {302, nullptr, "GetLastOverlayMovieThumbnail"},
- {401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"},
- {501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"},
- {1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"},
- {1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"},
- {1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"},
- {8001, nullptr, "ForceAlbumUnmounted"},
- {8002, nullptr, "ResetAlbumMountStatus"},
- {8011, nullptr, "RefreshAlbumCache"},
- {8012, nullptr, "GetAlbumCache"},
- {8013, nullptr, "GetAlbumCacheEx"},
- {8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"},
- {10011, nullptr, "SetInternalErrorConversionEnabled"},
- {50000, nullptr, "LoadMakerNoteInfoForDebug"},
- {50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"},
- {60002, nullptr, "OpenAccessorSession"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IAlbumAccessorService::~IAlbumAccessorService() = default;
-
-Result IAlbumAccessorService::GetAlbumFileList(
- Out<u64> out_count, AlbumStorage storage,
- OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
- LOG_INFO(Service_Capture, "called, storage={}", storage);
-
- const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0);
- R_RETURN(TranslateResult(result));
-}
-
-Result IAlbumAccessorService::DeleteAlbumFile(AlbumFileId file_id) {
- LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}",
- file_id.application_id, file_id.storage, file_id.type);
-
- const Result result = manager->DeleteAlbumFile(file_id);
- R_RETURN(TranslateResult(result));
-}
-
-Result IAlbumAccessorService::IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage) {
- LOG_INFO(Service_Capture, "called, storage={}", storage);
-
- const Result result = manager->IsAlbumMounted(storage);
- *out_is_mounted = result.IsSuccess();
- R_RETURN(TranslateResult(result));
-}
-
-Result IAlbumAccessorService::Unknown18(
- Out<u32> out_buffer_size,
- OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_buffer) {
- LOG_WARNING(Service_Capture, "(STUBBED) called");
- *out_buffer_size = 0;
- R_SUCCEED();
-}
-
-Result IAlbumAccessorService::GetAlbumFileListEx0(
- Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
- OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
- LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags);
-
- const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags);
- R_RETURN(TranslateResult(result));
-}
-
-Result IAlbumAccessorService::GetAutoSavingStorage(Out<bool> out_is_autosaving) {
- LOG_WARNING(Service_Capture, "(STUBBED) called");
-
- const Result result = manager->GetAutoSavingStorage(*out_is_autosaving);
- R_RETURN(TranslateResult(result));
-}
-
-Result IAlbumAccessorService::LoadAlbumScreenShotImageEx1(
- const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
- OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
- OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
- OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
- LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
- file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
-
- const Result result =
- manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options);
- R_RETURN(TranslateResult(result));
-}
-
-Result IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1(
- const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
- OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
- OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
- OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
- LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}",
- file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
-
- const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image,
- file_id, decoder_options);
- R_RETURN(TranslateResult(result));
-}
-
-Result IAlbumAccessorService::TranslateResult(Result in_result) {
- if (in_result.IsSuccess()) {
- return in_result;
- }
-
- if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) {
- if (in_result.GetDescription() - 0x514 < 100) {
- return ResultInvalidFileData;
- }
- if (in_result.GetDescription() - 0x5dc < 100) {
- return ResultInvalidFileData;
- }
-
- if (in_result.GetDescription() - 0x578 < 100) {
- if (in_result == ResultFileCountLimit) {
- return ResultUnknown22;
- }
- return ResultUnknown25;
- }
-
- if (in_result.raw < ResultUnknown1801.raw) {
- if (in_result == ResultUnknown1202) {
- return ResultUnknown810;
- }
- if (in_result == ResultUnknown1203) {
- return ResultUnknown810;
- }
- if (in_result == ResultUnknown1701) {
- return ResultUnknown5;
- }
- } else if (in_result.raw < ResultUnknown1803.raw) {
- if (in_result == ResultUnknown1801) {
- return ResultUnknown5;
- }
- if (in_result == ResultUnknown1802) {
- return ResultUnknown6;
- }
- } else {
- if (in_result == ResultUnknown1803) {
- return ResultUnknown7;
- }
- if (in_result == ResultUnknown1804) {
- return ResultOutOfRange;
- }
- }
- return ResultUnknown1024;
- }
-
- if (in_result.GetModule() == ErrorModule::FS) {
- if ((in_result.GetDescription() >> 0xc < 0x7d) ||
- (in_result.GetDescription() - 1000 < 2000) ||
- (((in_result.GetDescription() - 3000) >> 3) < 0x271)) {
- // TODO: Translate FS error
- return in_result;
- }
- }
-
- return in_result;
-}
-
-
-Result IAlbumAccessorService::GetAlbumAccessResultForDebug(Out<Result> out_result) {
- LOG_WARNING(Service_Capture, "(STUBBED) called");
- *out_result = ResultSuccess;
- R_SUCCEED();
-}
-
-} // namespace Service::Capture
diff --git a/src/core/hle/service/caps/caps_a.h b/src/core/hle/service/caps/caps_a.h
deleted file mode 100644
index 1885ba6be0..0000000000
--- a/src/core/hle/service/caps/caps_a.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/caps/caps_types.h"
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Core {
-class System;
-}
-
-namespace Service::Capture {
-class AlbumManager;
-
-class IAlbumAccessorService final : public ServiceFramework<IAlbumAccessorService> {
-public:
- explicit IAlbumAccessorService(Core::System& system_,
- std::shared_ptr<AlbumManager> album_manager);
- ~IAlbumAccessorService() override;
-
-private:
- Result GetAlbumFileList(Out<u64> out_count, AlbumStorage storage,
- OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries);
-
- Result DeleteAlbumFile(AlbumFileId file_id);
-
- Result IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage);
-
- Result Unknown18(
- Out<u32> out_buffer_size,
- OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure>
- out_buffer);
-
- Result GetAlbumFileListEx0(Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
- OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries);
-
- Result GetAutoSavingStorage(Out<bool> out_is_autosaving);
-
- Result LoadAlbumScreenShotImageEx1(
- const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
- OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
- OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
- OutArray<u8, BufferAttr_HipcMapAlias> out_buffer);
-
- Result LoadAlbumScreenShotThumbnailImageEx1(
- const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
- OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
- OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
- OutArray<u8, BufferAttr_HipcMapAlias> out_buffer);
-
- Result TranslateResult(Result in_result);
-
- Result GetAlbumAccessResultForDebug(Out<Result> out_result);
-
- std::shared_ptr<AlbumManager> manager = nullptr;
-};
-
-} // namespace Service::Capture
diff --git a/src/core/hle/service/caps/caps_c.cpp b/src/core/hle/service/caps/caps_c.cpp
index 6c9f8e964d..c62c3cd5d3 100644
--- a/src/core/hle/service/caps/caps_c.cpp
+++ b/src/core/hle/service/caps/caps_c.cpp
@@ -14,34 +14,34 @@
namespace Service::Capture {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAlbumControlService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "CaptureRawImage"},
+ FunctionInfo{2, nullptr, "CaptureRawImageWithTimeout"},
+ FunctionInfo{33, C<&IAlbumControlService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
+ FunctionInfo{1001, nullptr, "RequestTakingScreenShot"},
+ FunctionInfo{1002, nullptr, "RequestTakingScreenShotWithTimeout"},
+ FunctionInfo{1011, nullptr, "NotifyTakingScreenShotRefused"},
+ FunctionInfo{2001, nullptr, "NotifyAlbumStorageIsAvailable"},
+ FunctionInfo{2002, nullptr, "NotifyAlbumStorageIsUnavailable"},
+ FunctionInfo{2011, nullptr, "RegisterAppletResourceUserId"},
+ FunctionInfo{2012, nullptr, "UnregisterAppletResourceUserId"},
+ FunctionInfo{2013, nullptr, "GetApplicationIdFromAruid"},
+ FunctionInfo{2014, nullptr, "CheckApplicationIdRegistered"},
+ FunctionInfo{2101, nullptr, "GenerateCurrentAlbumFileId"},
+ FunctionInfo{2102, nullptr, "GenerateApplicationAlbumEntry"},
+ FunctionInfo{2201, nullptr, "SaveAlbumScreenShotFile"},
+ FunctionInfo{2202, nullptr, "SaveAlbumScreenShotFileEx"},
+ FunctionInfo{2301, nullptr, "SetOverlayScreenShotThumbnailData"},
+ FunctionInfo{2302, nullptr, "SetOverlayMovieThumbnailData"},
+ FunctionInfo{60001, nullptr, "OpenControlSession"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAlbumControlService::IAlbumControlService(Core::System& system_,
std::shared_ptr<AlbumManager> album_manager)
: ServiceFramework{system_, "caps:c"}, manager{album_manager} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "CaptureRawImage"},
- {2, nullptr, "CaptureRawImageWithTimeout"},
- {33, C<&IAlbumControlService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
- {1001, nullptr, "RequestTakingScreenShot"},
- {1002, nullptr, "RequestTakingScreenShotWithTimeout"},
- {1011, nullptr, "NotifyTakingScreenShotRefused"},
- {2001, nullptr, "NotifyAlbumStorageIsAvailable"},
- {2002, nullptr, "NotifyAlbumStorageIsUnavailable"},
- {2011, nullptr, "RegisterAppletResourceUserId"},
- {2012, nullptr, "UnregisterAppletResourceUserId"},
- {2013, nullptr, "GetApplicationIdFromAruid"},
- {2014, nullptr, "CheckApplicationIdRegistered"},
- {2101, nullptr, "GenerateCurrentAlbumFileId"},
- {2102, nullptr, "GenerateApplicationAlbumEntry"},
- {2201, nullptr, "SaveAlbumScreenShotFile"},
- {2202, nullptr, "SaveAlbumScreenShotFileEx"},
- {2301, nullptr, "SetOverlayScreenShotThumbnailData"},
- {2302, nullptr, "SetOverlayMovieThumbnailData"},
- {60001, nullptr, "OpenControlSession"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IAlbumControlService::~IAlbumControlService() = default;
diff --git a/src/core/hle/service/caps/caps_c.h b/src/core/hle/service/caps/caps_c.h
index 0ecdfa1147..a1f19bbfc3 100644
--- a/src/core/hle/service/caps/caps_c.h
+++ b/src/core/hle/service/caps/caps_c.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -16,14 +19,11 @@ enum class ShimLibraryVersion : u64;
class IAlbumControlService final : public ServiceFramework<IAlbumControlService> {
public:
- explicit IAlbumControlService(Core::System& system_,
- std::shared_ptr<AlbumManager> album_manager);
+ explicit IAlbumControlService(Core::System& system_, std::shared_ptr<AlbumManager> album_manager);
~IAlbumControlService() override;
-
private:
- Result SetShimLibraryVersion(ShimLibraryVersion library_version,
- ClientAppletResourceUserId aruid);
-
+ Result SetShimLibraryVersion(ShimLibraryVersion library_version, ClientAppletResourceUserId aruid);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<AlbumManager> manager = nullptr;
};
diff --git a/src/core/hle/service/caps/caps_sc.cpp b/src/core/hle/service/caps/caps_sc.cpp
index 6117cb7c6c..59119d8ed7 100644
--- a/src/core/hle/service/caps/caps_sc.cpp
+++ b/src/core/hle/service/caps/caps_sc.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,32 +10,6 @@ namespace Service::Capture {
IScreenShotControlService::IScreenShotControlService(Core::System& system_)
: ServiceFramework{system_, "caps:sc"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "CaptureRawImage"},
- {2, nullptr, "CaptureRawImageWithTimeout"},
- {3, nullptr, "AttachSharedBuffer"},
- {5, nullptr, "CaptureRawImageToAttachedSharedBuffer"},
- {210, nullptr, "Unknown210"},
- {1001, nullptr, "RequestTakingScreenShot"},
- {1002, nullptr, "RequestTakingScreenShotWithTimeout"},
- {1003, nullptr, "RequestTakingScreenShotEx"},
- {1004, nullptr, "RequestTakingScreenShotEx1"},
- {1009, nullptr, "CancelTakingScreenShot"},
- {1010, nullptr, "SetTakingScreenShotCancelState"},
- {1011, nullptr, "NotifyTakingScreenShotRefused"},
- {1012, nullptr, "NotifyTakingScreenShotFailed"},
- {1101, nullptr, "SetupOverlayMovieThumbnail"},
- {1106, nullptr, "Unknown1106"},
- {1107, nullptr, "Unknown1107"},
- {1201, nullptr, "OpenRawScreenShotReadStream"},
- {1202, nullptr, "CloseRawScreenShotReadStream"},
- {1203, nullptr, "ReadRawScreenShotReadStream"},
- {1204, nullptr, "Unknown1204"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IScreenShotControlService::~IScreenShotControlService() = default;
diff --git a/src/core/hle/service/caps/caps_sc.h b/src/core/hle/service/caps/caps_sc.h
index d555f49792..422f062e59 100644
--- a/src/core/hle/service/caps/caps_sc.h
+++ b/src/core/hle/service/caps/caps_sc.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,32 @@ class IScreenShotControlService final : public ServiceFramework<IScreenShotContr
public:
explicit IScreenShotControlService(Core::System& system_);
~IScreenShotControlService() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "CaptureRawImage"},
+ FunctionInfo{2, nullptr, "CaptureRawImageWithTimeout"},
+ FunctionInfo{3, nullptr, "AttachSharedBuffer"},
+ FunctionInfo{5, nullptr, "CaptureRawImageToAttachedSharedBuffer"},
+ FunctionInfo{210, nullptr, "Unknown210"},
+ FunctionInfo{1001, nullptr, "RequestTakingScreenShot"},
+ FunctionInfo{1002, nullptr, "RequestTakingScreenShotWithTimeout"},
+ FunctionInfo{1003, nullptr, "RequestTakingScreenShotEx"},
+ FunctionInfo{1004, nullptr, "RequestTakingScreenShotEx1"},
+ FunctionInfo{1009, nullptr, "CancelTakingScreenShot"},
+ FunctionInfo{1010, nullptr, "SetTakingScreenShotCancelState"},
+ FunctionInfo{1011, nullptr, "NotifyTakingScreenShotRefused"},
+ FunctionInfo{1012, nullptr, "NotifyTakingScreenShotFailed"},
+ FunctionInfo{1101, nullptr, "SetupOverlayMovieThumbnail"},
+ FunctionInfo{1106, nullptr, "Unknown1106"},
+ FunctionInfo{1107, nullptr, "Unknown1107"},
+ FunctionInfo{1201, nullptr, "OpenRawScreenShotReadStream"},
+ FunctionInfo{1202, nullptr, "CloseRawScreenShotReadStream"},
+ FunctionInfo{1203, nullptr, "ReadRawScreenShotReadStream"},
+ FunctionInfo{1204, nullptr, "Unknown1204"}
+ );
};
} // namespace Service::Capture
diff --git a/src/core/hle/service/caps/caps_ss.cpp b/src/core/hle/service/caps/caps_ss.cpp
index 0cd641f551..0c444116b7 100644
--- a/src/core/hle/service/caps/caps_ss.cpp
+++ b/src/core/hle/service/caps/caps_ss.cpp
@@ -12,22 +12,22 @@
namespace Service::Capture {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IScreenShotService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{201, nullptr, "SaveScreenShot"},
+ FunctionInfo{202, nullptr, "SaveEditedScreenShot"},
+ FunctionInfo{203, C<&IScreenShotService::SaveScreenShotEx0>, "SaveScreenShotEx0"},
+ FunctionInfo{204, nullptr, "SaveEditedScreenShotEx0"},
+ FunctionInfo{206, C<&IScreenShotService::SaveEditedScreenShotEx1>, "SaveEditedScreenShotEx1"},
+ FunctionInfo{208, nullptr, "SaveScreenShotOfMovieEx1"},
+ FunctionInfo{1000, nullptr, "Unknown1000"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IScreenShotService::IScreenShotService(Core::System& system_,
std::shared_ptr<AlbumManager> album_manager)
: ServiceFramework{system_, "caps:ss"}, manager{album_manager} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {201, nullptr, "SaveScreenShot"},
- {202, nullptr, "SaveEditedScreenShot"},
- {203, C<&IScreenShotService::SaveScreenShotEx0>, "SaveScreenShotEx0"},
- {204, nullptr, "SaveEditedScreenShotEx0"},
- {206, C<&IScreenShotService::SaveEditedScreenShotEx1>, "SaveEditedScreenShotEx1"},
- {208, nullptr, "SaveScreenShotOfMovieEx1"},
- {1000, nullptr, "Unknown1000"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IScreenShotService::~IScreenShotService() = default;
diff --git a/src/core/hle/service/caps/caps_ss.h b/src/core/hle/service/caps/caps_ss.h
index da4b4cc5fc..8817637fb8 100644
--- a/src/core/hle/service/caps/caps_ss.h
+++ b/src/core/hle/service/caps/caps_ss.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -34,6 +37,7 @@ private:
const InBuffer<BufferAttr_HipcMapTransferAllowsNonSecure | BufferAttr_HipcMapAlias>
thumbnail_image_data_buffer);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<AlbumManager> manager;
};
diff --git a/src/core/hle/service/caps/caps_su.cpp b/src/core/hle/service/caps/caps_su.cpp
index 4ecfc840e4..e708ddbb68 100644
--- a/src/core/hle/service/caps/caps_su.cpp
+++ b/src/core/hle/service/caps/caps_su.cpp
@@ -15,20 +15,20 @@
namespace Service::Capture {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IScreenShotApplicationService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{32, C<&IScreenShotApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
+ FunctionInfo{201, nullptr, "SaveScreenShot"},
+ FunctionInfo{203, C<&IScreenShotApplicationService::SaveScreenShotEx0>, "SaveScreenShotEx0"},
+ FunctionInfo{205, C<&IScreenShotApplicationService::SaveScreenShotEx1>, "SaveScreenShotEx1"},
+ FunctionInfo{210, nullptr, "SaveScreenShotEx2"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IScreenShotApplicationService::IScreenShotApplicationService(
Core::System& system_, std::shared_ptr<AlbumManager> album_manager)
: ServiceFramework{system_, "caps:su"}, manager{album_manager} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {32, C<&IScreenShotApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
- {201, nullptr, "SaveScreenShot"},
- {203, C<&IScreenShotApplicationService::SaveScreenShotEx0>, "SaveScreenShotEx0"},
- {205, C<&IScreenShotApplicationService::SaveScreenShotEx1>, "SaveScreenShotEx1"},
- {210, nullptr, "SaveScreenShotEx2"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IScreenShotApplicationService::~IScreenShotApplicationService() = default;
diff --git a/src/core/hle/service/caps/caps_su.h b/src/core/hle/service/caps/caps_su.h
index 4b4cbd09e6..0fdc994a25 100644
--- a/src/core/hle/service/caps/caps_su.h
+++ b/src/core/hle/service/caps/caps_su.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -42,8 +45,8 @@ private:
const InBuffer<BufferAttr_HipcMapTransferAllowsNonSecure | BufferAttr_HipcMapAlias>
image_data_buffer);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::array<u8, screenshot_width * screenshot_height * bytes_per_pixel> image_data;
-
std::shared_ptr<AlbumManager> manager;
};
diff --git a/src/core/hle/service/caps/caps_u.cpp b/src/core/hle/service/caps/caps_u.cpp
index 6472b2bac6..c1fa418e03 100644
--- a/src/core/hle/service/caps/caps_u.cpp
+++ b/src/core/hle/service/caps/caps_u.cpp
@@ -13,29 +13,29 @@
namespace Service::Capture {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAlbumApplicationService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{32, C<&IAlbumApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
+ FunctionInfo{102, C<&IAlbumApplicationService::GetAlbumFileList0AafeAruidDeprecated>, "GetAlbumFileList0AafeAruidDeprecated"},
+ FunctionInfo{103, nullptr, "DeleteAlbumFileByAruid"},
+ FunctionInfo{104, nullptr, "GetAlbumFileSizeByAruid"},
+ FunctionInfo{105, nullptr, "DeleteAlbumFileByAruidForDebug"},
+ FunctionInfo{110, nullptr, "LoadAlbumScreenShotImageByAruid"},
+ FunctionInfo{120, nullptr, "LoadAlbumScreenShotThumbnailImageByAruid"},
+ FunctionInfo{130, nullptr, "PrecheckToCreateContentsByAruid"},
+ FunctionInfo{140, nullptr, "GetAlbumFileList1AafeAruidDeprecated"},
+ FunctionInfo{141, nullptr, "GetAlbumFileList2AafeUidAruidDeprecated"},
+ FunctionInfo{142, C<&IAlbumApplicationService::GetAlbumFileList3AaeAruid>, "GetAlbumFileList3AaeAruid"},
+ FunctionInfo{143, nullptr, "GetAlbumFileList4AaeUidAruid"},
+ FunctionInfo{144, nullptr, "GetAllAlbumFileList3AaeAruid"},
+ FunctionInfo{60002, nullptr, "OpenAccessorSessionForApplication"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAlbumApplicationService::IAlbumApplicationService(Core::System& system_,
std::shared_ptr<AlbumManager> album_manager)
: ServiceFramework{system_, "caps:u"}, manager{album_manager} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {32, C<&IAlbumApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"},
- {102, C<&IAlbumApplicationService::GetAlbumFileList0AafeAruidDeprecated>, "GetAlbumFileList0AafeAruidDeprecated"},
- {103, nullptr, "DeleteAlbumFileByAruid"},
- {104, nullptr, "GetAlbumFileSizeByAruid"},
- {105, nullptr, "DeleteAlbumFileByAruidForDebug"},
- {110, nullptr, "LoadAlbumScreenShotImageByAruid"},
- {120, nullptr, "LoadAlbumScreenShotThumbnailImageByAruid"},
- {130, nullptr, "PrecheckToCreateContentsByAruid"},
- {140, nullptr, "GetAlbumFileList1AafeAruidDeprecated"},
- {141, nullptr, "GetAlbumFileList2AafeUidAruidDeprecated"},
- {142, C<&IAlbumApplicationService::GetAlbumFileList3AaeAruid>, "GetAlbumFileList3AaeAruid"},
- {143, nullptr, "GetAlbumFileList4AaeUidAruid"},
- {144, nullptr, "GetAllAlbumFileList3AaeAruid"},
- {60002, nullptr, "OpenAccessorSessionForApplication"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IAlbumApplicationService::~IAlbumApplicationService() = default;
diff --git a/src/core/hle/service/caps/caps_u.h b/src/core/hle/service/caps/caps_u.h
index 023ee1fe79..52e151bbe2 100644
--- a/src/core/hle/service/caps/caps_u.h
+++ b/src/core/hle/service/caps/caps_u.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -33,6 +36,7 @@ private:
AlbumFileDateTime end_date_time, ClientAppletResourceUserId aruid,
OutArray<ApplicationAlbumEntry, BufferAttr_HipcMapAlias> out_entries);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<AlbumManager> manager = nullptr;
};
diff --git a/src/core/hle/service/erpt/erpt.cpp b/src/core/hle/service/erpt/erpt.cpp
index 014f1da62f..7bed893bd7 100644
--- a/src/core/hle/service/erpt/erpt.cpp
+++ b/src/core/hle/service/erpt/erpt.cpp
@@ -17,30 +17,10 @@ namespace Service::ERPT {
class ErrorReportContext final : public ServiceFramework<ErrorReportContext> {
public:
- explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"},
- {1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"},
- {2, nullptr, "SetInitialLaunchSettingsCompletionTime"},
- {3, nullptr, "ClearInitialLaunchSettingsCompletionTime"},
- {4, nullptr, "UpdatePowerOnTime"},
- {5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"},
- {6, nullptr, "SubmitMultipleCategoryContext"},
- {7, nullptr, "UpdateApplicationLaunchTime"},
- {8, nullptr, "ClearApplicationLaunchTime"},
- {9, nullptr, "SubmitAttachment"},
- {10, nullptr, "CreateReportWithAttachments"},
- {11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"},
- {12, C<&ErrorReportContext::CreateReport>, "CreateReport"},
- {20, nullptr, "RegisterRunningApplet"},
- {21, nullptr, "UnregisterRunningApplet"},
- {22, nullptr, "UpdateAppletSuspendedDuration"},
- {30, nullptr, "InvalidateForcedShutdownDetection"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -85,21 +65,41 @@ private:
data_a.size(), data_b.size(), flag_a, flag_b);
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"},
+ FunctionInfo{1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"},
+ FunctionInfo{2, nullptr, "SetInitialLaunchSettingsCompletionTime"},
+ FunctionInfo{3, nullptr, "ClearInitialLaunchSettingsCompletionTime"},
+ FunctionInfo{4, nullptr, "UpdatePowerOnTime"},
+ FunctionInfo{5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"},
+ FunctionInfo{6, nullptr, "SubmitMultipleCategoryContext"},
+ FunctionInfo{7, nullptr, "UpdateApplicationLaunchTime"},
+ FunctionInfo{8, nullptr, "ClearApplicationLaunchTime"},
+ FunctionInfo{9, nullptr, "SubmitAttachment"},
+ FunctionInfo{10, nullptr, "CreateReportWithAttachments"},
+ FunctionInfo{11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"},
+ FunctionInfo{12, C<&ErrorReportContext::CreateReport>, "CreateReport"},
+ FunctionInfo{20, nullptr, "RegisterRunningApplet"},
+ FunctionInfo{21, nullptr, "UnregisterRunningApplet"},
+ FunctionInfo{22, nullptr, "UpdateAppletSuspendedDuration"},
+ FunctionInfo{30, nullptr, "InvalidateForcedShutdownDetection"}
+ );
};
class ErrorReportSession final : public ServiceFramework<ErrorReportSession> {
public:
- explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "OpenReport"},
- {1, nullptr, "OpenManager"},
- {2, nullptr, "OpenAttachment"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenReport"},
+ FunctionInfo{1, nullptr, "OpenManager"},
+ FunctionInfo{2, nullptr, "OpenAttachment"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp
index 432783f96e..01d11183c9 100644
--- a/src/core/hle/service/es/es.cpp
+++ b/src/core/hle/service/es/es.cpp
@@ -19,110 +19,14 @@ constexpr Result ERROR_INVALID_RIGHTS_ID{ErrorModule::ETicket, 3};
class ETicket final : public ServiceFramework<ETicket> {
public:
explicit ETicket(Core::System& system_) : ServiceFramework{system_, "es"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, &ETicket::ImportTicket, "ImportTicket"},
- {2, nullptr, "ImportTicketCertificateSet"},
- {3, nullptr, "DeleteTicket"},
- {4, nullptr, "DeletePersonalizedTicket"},
- {5, nullptr, "DeleteAllCommonTicket"},
- {6, nullptr, "DeleteAllPersonalizedTicket"},
- {7, nullptr, "DeleteAllPersonalizedTicketEx"},
- {8, &ETicket::GetTitleKey, "GetTitleKey"},
- {9, &ETicket::CountCommonTicket, "CountCommonTicket"},
- {10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"},
- {11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"},
- {12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"},
- {13, nullptr, "ListMissingPersonalizedTicket"},
- {14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"},
- {15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"},
- {16, &ETicket::GetCommonTicketData, "GetCommonTicketData"},
- {17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"},
- {18, nullptr, "OwnTicket"},
- {19, nullptr, "GetTicketInfo"},
- {20, nullptr, "ListLightTicketInfo"},
- {21, nullptr, "SignData"},
- {22, nullptr, "GetCommonTicketAndCertificateSize"},
- {23, nullptr, "GetCommonTicketAndCertificateData"},
- {24, nullptr, "ImportPrepurchaseRecord"},
- {25, nullptr, "DeletePrepurchaseRecord"},
- {26, nullptr, "DeleteAllPrepurchaseRecord"},
- {27, nullptr, "CountPrepurchaseRecord"},
- {28, nullptr, "ListPrepurchaseRecordRightsIds"},
- {29, nullptr, "ListPrepurchaseRecordInfo"},
- {30, nullptr, "CountTicket"},
- {31, nullptr, "ListTicketRightsIds"},
- {32, nullptr, "CountPrepurchaseRecordEx"},
- {33, nullptr, "ListPrepurchaseRecordRightsIdsEx"},
- {34, nullptr, "GetEncryptedTicketSize"},
- {35, nullptr, "GetEncryptedTicketData"},
- {36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"},
- {37, nullptr, "OwnTicket2"},
- {38, nullptr, "OwnTicket3"},
- {39, nullptr, "DeleteAllInactivePersonalizedTicket"},
- {40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"},
- {101, nullptr, "Unknown101"}, //18.0.0+
- {102, nullptr, "Unknown102"}, //18.0.0+
- {103, nullptr, "Unknown103"}, //18.0.0+
- {104, nullptr, "Unknown104"}, //18.0.0+
- {105, nullptr, "Unknown105"}, //20.0.0+
- {201, nullptr, "Unknown201"}, //18.0.0+
- {202, nullptr, "Unknown202"}, //18.0.0+
- {203, nullptr, "Unknown203"}, //18.0.0+
- {204, nullptr, "Unknown204"}, //18.0.0+
- {205, nullptr, "Unknown205"}, //18.0.0+
- {501, nullptr, "Unknown501"},
- {502, nullptr, "Unknown502"},
- {503, nullptr, "GetTitleKey"},
- {504, nullptr, "Unknown504"},
- {508, nullptr, "Unknown508"},
- {509, nullptr, "Unknown509"},
- {510, nullptr, "Unknown510"},
- {511, nullptr, "Unknown511"},
- {1001, nullptr, "Unknown1001"},
- {1002, nullptr, "Unknown1001"},
- {1003, nullptr, "Unknown1003"},
- {1004, nullptr, "Unknown1004"},
- {1005, nullptr, "Unknown1005"},
- {1006, nullptr, "Unknown1006"},
- {1007, nullptr, "Unknown1007"},
- {1009, nullptr, "Unknown1009"},
- {1010, nullptr, "Unknown1010"},
- {1011, nullptr, "Unknown1011"},
- {1012, nullptr, "Unknown1012"},
- {1013, nullptr, "Unknown1013"},
- {1014, nullptr, "Unknown1014"},
- {1015, nullptr, "Unknown1015"},
- {1016, nullptr, "Unknown1016"},
- {1017, nullptr, "Unknown1017"},
- {1018, nullptr, "Unknown1018"},
- {1019, nullptr, "Unknown1019"},
- {1020, nullptr, "Unknown1020"},
- {1021, nullptr, "Unknown1021"},
- {1501, nullptr, "Unknown1501"},
- {1502, nullptr, "Unknown1502"},
- {1503, nullptr, "Unknown1503"},
- {1504, nullptr, "Unknown1504"},
- {1505, nullptr, "Unknown1505"},
- {1506, nullptr, "Unknown1506"},
- {2000, nullptr, "Unknown2000"},
- {2001, nullptr, "Unknown2001"},
- {2002, nullptr, "Unknown2002"},
- {2003, nullptr, "Unknown2003"},
- {2100, nullptr, "Unknown2100"},
- {2501, nullptr, "Unknown2501"},
- {2502, nullptr, "Unknown2502"},
- {2601, nullptr, "Unknown2601"},
- {3001, nullptr, "Unknown3001"},
- {3002, nullptr, "Unknown3002"},
- };
- // clang-format on
- RegisterHandlers(functions);
-
keys.PopulateTickets();
keys.SynthesizeTickets();
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
private:
bool CheckRightsId(HLERequestContext& ctx, const u128& rights_id) {
if (rights_id == u128{}) {
@@ -317,89 +221,185 @@ private:
rb.Push<u64>(write_size);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, &ETicket::ImportTicket, "ImportTicket"},
+ FunctionInfo{2, nullptr, "ImportTicketCertificateSet"},
+ FunctionInfo{3, nullptr, "DeleteTicket"},
+ FunctionInfo{4, nullptr, "DeletePersonalizedTicket"},
+ FunctionInfo{5, nullptr, "DeleteAllCommonTicket"},
+ FunctionInfo{6, nullptr, "DeleteAllPersonalizedTicket"},
+ FunctionInfo{7, nullptr, "DeleteAllPersonalizedTicketEx"},
+ FunctionInfo{8, &ETicket::GetTitleKey, "GetTitleKey"},
+ FunctionInfo{9, &ETicket::CountCommonTicket, "CountCommonTicket"},
+ FunctionInfo{10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"},
+ FunctionInfo{11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"},
+ FunctionInfo{12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"},
+ FunctionInfo{13, nullptr, "ListMissingPersonalizedTicket"},
+ FunctionInfo{14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"},
+ FunctionInfo{15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"},
+ FunctionInfo{16, &ETicket::GetCommonTicketData, "GetCommonTicketData"},
+ FunctionInfo{17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"},
+ FunctionInfo{18, nullptr, "OwnTicket"},
+ FunctionInfo{19, nullptr, "GetTicketInfo"},
+ FunctionInfo{20, nullptr, "ListLightTicketInfo"},
+ FunctionInfo{21, nullptr, "SignData"},
+ FunctionInfo{22, nullptr, "GetCommonTicketAndCertificateSize"},
+ FunctionInfo{23, nullptr, "GetCommonTicketAndCertificateData"},
+ FunctionInfo{24, nullptr, "ImportPrepurchaseRecord"},
+ FunctionInfo{25, nullptr, "DeletePrepurchaseRecord"},
+ FunctionInfo{26, nullptr, "DeleteAllPrepurchaseRecord"},
+ FunctionInfo{27, nullptr, "CountPrepurchaseRecord"},
+ FunctionInfo{28, nullptr, "ListPrepurchaseRecordRightsIds"},
+ FunctionInfo{29, nullptr, "ListPrepurchaseRecordInfo"},
+ FunctionInfo{30, nullptr, "CountTicket"},
+ FunctionInfo{31, nullptr, "ListTicketRightsIds"},
+ FunctionInfo{32, nullptr, "CountPrepurchaseRecordEx"},
+ FunctionInfo{33, nullptr, "ListPrepurchaseRecordRightsIdsEx"},
+ FunctionInfo{34, nullptr, "GetEncryptedTicketSize"},
+ FunctionInfo{35, nullptr, "GetEncryptedTicketData"},
+ FunctionInfo{36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"},
+ FunctionInfo{37, nullptr, "OwnTicket2"},
+ FunctionInfo{38, nullptr, "OwnTicket3"},
+ FunctionInfo{39, nullptr, "DeleteAllInactivePersonalizedTicket"},
+ FunctionInfo{40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"},
+ FunctionInfo{101, nullptr, "Unknown101", MakeVersionGate({18,0,0})},
+ FunctionInfo{102, nullptr, "Unknown102", MakeVersionGate({18,0,0})},
+ FunctionInfo{103, nullptr, "Unknown103", MakeVersionGate({18,0,0})},
+ FunctionInfo{104, nullptr, "Unknown104", MakeVersionGate({18,0,0})},
+ FunctionInfo{105, nullptr, "Unknown105", MakeVersionGate({20,0,0})},
+ FunctionInfo{201, nullptr, "Unknown201", MakeVersionGate({18,0,0})},
+ FunctionInfo{202, nullptr, "Unknown202", MakeVersionGate({18,0,0})},
+ FunctionInfo{203, nullptr, "Unknown203", MakeVersionGate({18,0,0})},
+ FunctionInfo{204, nullptr, "Unknown204", MakeVersionGate({18,0,0})},
+ FunctionInfo{205, nullptr, "Unknown205", MakeVersionGate({18,0,0})},
+ FunctionInfo{501, nullptr, "Unknown501"},
+ FunctionInfo{502, nullptr, "Unknown502"},
+ FunctionInfo{503, nullptr, "GetTitleKey"},
+ FunctionInfo{504, nullptr, "Unknown504"},
+ FunctionInfo{508, nullptr, "Unknown508"},
+ FunctionInfo{509, nullptr, "Unknown509"},
+ FunctionInfo{510, nullptr, "Unknown510"},
+ FunctionInfo{511, nullptr, "Unknown511"},
+ FunctionInfo{1001, nullptr, "Unknown1001"},
+ FunctionInfo{1002, nullptr, "Unknown1001"},
+ FunctionInfo{1003, nullptr, "Unknown1003"},
+ FunctionInfo{1004, nullptr, "Unknown1004"},
+ FunctionInfo{1005, nullptr, "Unknown1005"},
+ FunctionInfo{1006, nullptr, "Unknown1006"},
+ FunctionInfo{1007, nullptr, "Unknown1007"},
+ FunctionInfo{1009, nullptr, "Unknown1009"},
+ FunctionInfo{1010, nullptr, "Unknown1010"},
+ FunctionInfo{1011, nullptr, "Unknown1011"},
+ FunctionInfo{1012, nullptr, "Unknown1012"},
+ FunctionInfo{1013, nullptr, "Unknown1013"},
+ FunctionInfo{1014, nullptr, "Unknown1014"},
+ FunctionInfo{1015, nullptr, "Unknown1015"},
+ FunctionInfo{1016, nullptr, "Unknown1016"},
+ FunctionInfo{1017, nullptr, "Unknown1017"},
+ FunctionInfo{1018, nullptr, "Unknown1018"},
+ FunctionInfo{1019, nullptr, "Unknown1019"},
+ FunctionInfo{1020, nullptr, "Unknown1020"},
+ FunctionInfo{1021, nullptr, "Unknown1021"},
+ FunctionInfo{1501, nullptr, "Unknown1501"},
+ FunctionInfo{1502, nullptr, "Unknown1502"},
+ FunctionInfo{1503, nullptr, "Unknown1503"},
+ FunctionInfo{1504, nullptr, "Unknown1504"},
+ FunctionInfo{1505, nullptr, "Unknown1505"},
+ FunctionInfo{1506, nullptr, "Unknown1506"},
+ FunctionInfo{2000, nullptr, "Unknown2000"},
+ FunctionInfo{2001, nullptr, "Unknown2001"},
+ FunctionInfo{2002, nullptr, "Unknown2002"},
+ FunctionInfo{2003, nullptr, "Unknown2003"},
+ FunctionInfo{2100, nullptr, "Unknown2100"},
+ FunctionInfo{2501, nullptr, "Unknown2501"},
+ FunctionInfo{2502, nullptr, "Unknown2502"},
+ FunctionInfo{2601, nullptr, "Unknown2601"},
+ FunctionInfo{3001, nullptr, "Unknown3001"},
+ FunctionInfo{3002, nullptr, "Unknown3002"}
+ );
Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance();
};
class NDRM_LU final : public ServiceFramework<NDRM_LU> {
public:
explicit NDRM_LU(Core::System& system_)
- : ServiceFramework{system_, "ndrm:lu"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "Cmd1"},
- {2, nullptr, "Cmd2"},
- {3, nullptr, "Cmd3"},
- {1000, nullptr, "Cmd1000"},
- {8000, nullptr, "Cmd8000"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "ndrm:lu"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "Cmd1"},
+ FunctionInfo{2, nullptr, "Cmd2"},
+ FunctionInfo{3, nullptr, "Cmd3"},
+ FunctionInfo{1000, nullptr, "Cmd1000"},
+ FunctionInfo{8000, nullptr, "Cmd8000"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class NDRM_LA final : public ServiceFramework<NDRM_LA> {
public:
explicit NDRM_LA(Core::System& system_)
- : ServiceFramework{system_, "ndrm:la"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "Cmd1"},
- {2, nullptr, "Cmd2"},
- {3, nullptr, "Cmd3"},
- {4, nullptr, "Cmd4"},
- {5, nullptr, "Cmd5"},
- {6, nullptr, "Cmd6"},
- {7, nullptr, "Cmd7"},
- {8, nullptr, "Cmd8"},
- {9, nullptr, "Cmd9"},
- {10, nullptr, "Cmd10"},
- {11, nullptr, "Cmd11"},
- {12, nullptr, "Cmd12"},
- {13, nullptr, "Cmd13"},
- {14, nullptr, "Cmd14"},
- {15, nullptr, "Cmd15"},
- {16, nullptr, "Cmd16"},
- {17, nullptr, "Cmd17"},
- {18, nullptr, "Cmd18"},
- {19, nullptr, "Cmd19"},
- {20, nullptr, "Cmd20"},
- {21, nullptr, "Cmd21"},
- {22, nullptr, "Cmd22"},
- {23, nullptr, "Cmd23"},
- {24, nullptr, "Cmd24"},
- {25, nullptr, "Cmd25"},
- {26, nullptr, "Cmd26"},
- {27, nullptr, "Cmd27"},
- {28, nullptr, "Cmd28"},
- {29, nullptr, "Cmd29"},
- {30, nullptr, "Cmd30"},
- {31, nullptr, "Cmd31"},
- {32, nullptr, "Cmd32"},
- {33, nullptr, "Cmd33"},
- {34, nullptr, "Cmd34"},
- {35, nullptr, "Cmd35"},
- {36, nullptr, "Cmd36"},
- {37, nullptr, "Cmd37"},
- {38, nullptr, "Cmd38"},
- {39, nullptr, "Cmd39"},
- {40, nullptr, "Cmd40"},
- {42, nullptr, "Cmd42"},
- {43, nullptr, "Cmd43"},
- {44, nullptr, "Cmd44"},
- {45, nullptr, "Cmd45"},
- {46, nullptr, "Cmd46"},
- {47, nullptr, "Cmd47"},
- {48, nullptr, "Cmd48"},
- {49, nullptr, "Cmd49"},
- {50, nullptr, "Cmd50"},
- {51, nullptr, "Cmd51"},
- {8000, nullptr, "Cmd8000"},
- {8001, nullptr, "Cmd8001"},
- {8002, nullptr, "Cmd8002"},
- {8003, nullptr, "Cmd8003"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "ndrm:la"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "Cmd1"},
+ FunctionInfo{2, nullptr, "Cmd2"},
+ FunctionInfo{3, nullptr, "Cmd3"},
+ FunctionInfo{4, nullptr, "Cmd4"},
+ FunctionInfo{5, nullptr, "Cmd5"},
+ FunctionInfo{6, nullptr, "Cmd6"},
+ FunctionInfo{7, nullptr, "Cmd7"},
+ FunctionInfo{8, nullptr, "Cmd8"},
+ FunctionInfo{9, nullptr, "Cmd9"},
+ FunctionInfo{10, nullptr, "Cmd10"},
+ FunctionInfo{11, nullptr, "Cmd11"},
+ FunctionInfo{12, nullptr, "Cmd12"},
+ FunctionInfo{13, nullptr, "Cmd13"},
+ FunctionInfo{14, nullptr, "Cmd14"},
+ FunctionInfo{15, nullptr, "Cmd15"},
+ FunctionInfo{16, nullptr, "Cmd16"},
+ FunctionInfo{17, nullptr, "Cmd17"},
+ FunctionInfo{18, nullptr, "Cmd18"},
+ FunctionInfo{19, nullptr, "Cmd19"},
+ FunctionInfo{20, nullptr, "Cmd20"},
+ FunctionInfo{21, nullptr, "Cmd21"},
+ FunctionInfo{22, nullptr, "Cmd22"},
+ FunctionInfo{23, nullptr, "Cmd23"},
+ FunctionInfo{24, nullptr, "Cmd24"},
+ FunctionInfo{25, nullptr, "Cmd25"},
+ FunctionInfo{26, nullptr, "Cmd26"},
+ FunctionInfo{27, nullptr, "Cmd27"},
+ FunctionInfo{28, nullptr, "Cmd28"},
+ FunctionInfo{29, nullptr, "Cmd29"},
+ FunctionInfo{30, nullptr, "Cmd30"},
+ FunctionInfo{31, nullptr, "Cmd31"},
+ FunctionInfo{32, nullptr, "Cmd32"},
+ FunctionInfo{33, nullptr, "Cmd33"},
+ FunctionInfo{34, nullptr, "Cmd34"},
+ FunctionInfo{35, nullptr, "Cmd35"},
+ FunctionInfo{36, nullptr, "Cmd36"},
+ FunctionInfo{37, nullptr, "Cmd37"},
+ FunctionInfo{38, nullptr, "Cmd38"},
+ FunctionInfo{39, nullptr, "Cmd39"},
+ FunctionInfo{40, nullptr, "Cmd40"},
+ FunctionInfo{42, nullptr, "Cmd42"},
+ FunctionInfo{43, nullptr, "Cmd43"},
+ FunctionInfo{44, nullptr, "Cmd44"},
+ FunctionInfo{45, nullptr, "Cmd45"},
+ FunctionInfo{46, nullptr, "Cmd46"},
+ FunctionInfo{47, nullptr, "Cmd47"},
+ FunctionInfo{48, nullptr, "Cmd48"},
+ FunctionInfo{49, nullptr, "Cmd49"},
+ FunctionInfo{50, nullptr, "Cmd50"},
+ FunctionInfo{51, nullptr, "Cmd51"},
+ FunctionInfo{8000, nullptr, "Cmd8000"},
+ FunctionInfo{8001, nullptr, "Cmd8001"},
+ FunctionInfo{8002, nullptr, "Cmd8002"},
+ FunctionInfo{8003, nullptr, "Cmd8003"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/eupld/eupld.cpp b/src/core/hle/service/eupld/eupld.cpp
index 3cf27513ae..ed1e1c19c5 100644
--- a/src/core/hle/service/eupld/eupld.cpp
+++ b/src/core/hle/service/eupld/eupld.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -11,36 +14,34 @@ namespace Service::EUPLD {
class ErrorUploadContext final : public ServiceFramework<ErrorUploadContext> {
public:
- explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetUrl"},
- {1, nullptr, "ImportCrt"},
- {2, nullptr, "ImportPki"},
- {3, nullptr, "SetAutoUpload"},
- {4, nullptr, "GetAutoUpload"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetUrl"},
+ FunctionInfo{1, nullptr, "ImportCrt"},
+ FunctionInfo{2, nullptr, "ImportPki"},
+ FunctionInfo{3, nullptr, "SetAutoUpload"},
+ FunctionInfo{4, nullptr, "GetAutoUpload"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class ErrorUploadRequest final : public ServiceFramework<ErrorUploadRequest> {
public:
- explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {1, nullptr, "UploadAll"},
- {2, nullptr, "UploadSelected"},
- {3, nullptr, "GetUploadStatus"},
- {4, nullptr, "CancelUpload"},
- {5, nullptr, "GetResult"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{1, nullptr, "UploadAll"},
+ FunctionInfo{2, nullptr, "UploadSelected"},
+ FunctionInfo{3, nullptr, "GetUploadStatus"},
+ FunctionInfo{4, nullptr, "CancelUpload"},
+ FunctionInfo{5, nullptr, "GetResult"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp
index db48526614..4c9eca5d5b 100644
--- a/src/core/hle/service/fatal/fatal.cpp
+++ b/src/core/hle/service/fatal/fatal.cpp
@@ -13,8 +13,6 @@
#include "common/swap.h"
#include "core/core.h"
#include "core/hle/service/fatal/fatal.h"
-#include "core/hle/service/fatal/fatal_p.h"
-#include "core/hle/service/fatal/fatal_u.h"
#include "core/hle/service/ipc_helpers.h"
#include "core/hle/service/server_manager.h"
#include "core/reporter.h"
@@ -167,6 +165,35 @@ void Module::Interface::ThrowFatalWithCpuContext(HLERequestContext& ctx) {
rb.Push(ResultSuccess);
}
+class Fatal_P final : public Module::Interface {
+public:
+ explicit Fatal_P(std::shared_ptr<Module> module_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:p") {}
+ ~Fatal_P() override = default;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetFatalEvent"},
+ FunctionInfo{10, nullptr, "GetFatalContext"}
+ );
+};
+
+class Fatal_U final : public Module::Interface {
+public:
+ explicit Fatal_U(std::shared_ptr<Module> module_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:u") {}
+ ~Fatal_U() override = default;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &Fatal_U::ThrowFatal, "ThrowFatal"},
+ FunctionInfo{1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"},
+ FunctionInfo{2, &Fatal_U::ThrowFatalWithCpuContext, "ThrowFatalWithCpuContext"}
+ );
+};
+
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
auto module = std::make_shared<Module>();
diff --git a/src/core/hle/service/fatal/fatal_p.cpp b/src/core/hle/service/fatal/fatal_p.cpp
deleted file mode 100644
index 4a81bb5e2f..0000000000
--- a/src/core/hle/service/fatal/fatal_p.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/fatal/fatal_p.h"
-
-namespace Service::Fatal {
-
-Fatal_P::Fatal_P(std::shared_ptr<Module> module_, Core::System& system_)
- : Interface(std::move(module_), system_, "fatal:p") {
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetFatalEvent"},
- {10, nullptr, "GetFatalContext"},
- };
- RegisterHandlers(functions);
-}
-
-Fatal_P::~Fatal_P() = default;
-
-} // namespace Service::Fatal
diff --git a/src/core/hle/service/fatal/fatal_p.h b/src/core/hle/service/fatal/fatal_p.h
deleted file mode 100644
index f743368350..0000000000
--- a/src/core/hle/service/fatal/fatal_p.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/fatal/fatal.h"
-
-namespace Service::Fatal {
-
-class Fatal_P final : public Module::Interface {
-public:
- explicit Fatal_P(std::shared_ptr<Module> module_, Core::System& system_);
- ~Fatal_P() override;
-};
-
-} // namespace Service::Fatal
diff --git a/src/core/hle/service/fatal/fatal_u.cpp b/src/core/hle/service/fatal/fatal_u.cpp
deleted file mode 100644
index 3739711fce..0000000000
--- a/src/core/hle/service/fatal/fatal_u.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/fatal/fatal_u.h"
-
-namespace Service::Fatal {
-
-Fatal_U::Fatal_U(std::shared_ptr<Module> module_, Core::System& system_)
- : Interface(std::move(module_), system_, "fatal:u") {
- static const FunctionInfo functions[] = {
- {0, &Fatal_U::ThrowFatal, "ThrowFatal"},
- {1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"},
- {2, &Fatal_U::ThrowFatalWithCpuContext, "ThrowFatalWithCpuContext"},
- };
- RegisterHandlers(functions);
-}
-
-Fatal_U::~Fatal_U() = default;
-
-} // namespace Service::Fatal
diff --git a/src/core/hle/service/fatal/fatal_u.h b/src/core/hle/service/fatal/fatal_u.h
deleted file mode 100644
index 65fbe26961..0000000000
--- a/src/core/hle/service/fatal/fatal_u.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/fatal/fatal.h"
-
-namespace Service::Fatal {
-
-class Fatal_U final : public Module::Interface {
-public:
- explicit Fatal_U(std::shared_ptr<Module> module_, Core::System& system_);
- ~Fatal_U() override;
-};
-
-} // namespace Service::Fatal
diff --git a/src/core/hle/service/fgm/fgm.cpp b/src/core/hle/service/fgm/fgm.cpp
index cac03ae24c..96ea3478ea 100644
--- a/src/core/hle/service/fgm/fgm.cpp
+++ b/src/core/hle/service/fgm/fgm.cpp
@@ -16,30 +16,26 @@ namespace Service::FGM {
class IRequest final : public ServiceFramework<IRequest> {
public:
- explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {1, nullptr, "Set"},
- {2, nullptr, "Get"},
- {3, nullptr, "Cancel"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{1, nullptr, "Set"},
+ FunctionInfo{2, nullptr, "Get"},
+ FunctionInfo{3, nullptr, "Cancel"}
+ );
};
class FGM final : public ServiceFramework<FGM> {
public:
- explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &FGM::Initialize, "Initialize"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -50,21 +46,25 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IRequest>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &FGM::Initialize, "Initialize"}
+ );
};
class FGM_DBG final : public ServiceFramework<FGM_DBG> {
public:
- explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {1, nullptr, "Read"},
- {2, nullptr, "Cancel"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{1, nullptr, "Read"},
+ FunctionInfo{2, nullptr, "Cancel"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
index 8483394d0c..793b86cc51 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,15 +11,18 @@
namespace Service::FileSystem {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IDirectory::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IDirectory::Read>, "Read"},
+ FunctionInfo{1, D<&IDirectory::GetEntryCount>, "GetEntryCount"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IDirectory::IDirectory(Core::System& system_, FileSys::VirtualDir directory_,
FileSys::OpenDirectoryMode mode)
: ServiceFramework{system_, "IDirectory"},
backend(std::make_unique<FileSys::Fsa::IDirectory>(directory_, mode)) {
- static const FunctionInfo functions[] = {
- {0, D<&IDirectory::Read>, "Read"},
- {1, D<&IDirectory::GetEntryCount>, "GetEntryCount"},
- };
- RegisterHandlers(functions);
}
Result IDirectory::Read(
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_directory.h b/src/core/hle/service/filesystem/fsp/fs_i_directory.h
index b6251f7fdb..f2a57260e1 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_directory.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -26,6 +29,8 @@ private:
Result Read(Out<s64> out_count,
const OutArray<FileSys::DirectoryEntry, BufferAttr_HipcMapAlias> out_entries);
Result GetEntryCount(Out<s64> out_count);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp
index 22cbe2be2c..78ca90a4af 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp
@@ -12,18 +12,6 @@ namespace Service::FileSystem {
IFile::IFile(Core::System& system_, FileSys::VirtualFile file_)
: ServiceFramework{system_, "IFile"}, backend{std::make_unique<FileSys::Fsa::IFile>(file_)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IFile::Read>, "Read"},
- {1, D<&IFile::Write>, "Write"},
- {2, D<&IFile::Flush>, "Flush"},
- {3, D<&IFile::SetSize>, "SetSize"},
- {4, D<&IFile::GetSize>, "GetSize"},
- {5, nullptr, "OperateRange"},
- {6, nullptr, "OperateRangeWithBuffer"},
- };
- // clang-format on
- RegisterHandlers(functions);
}
Result IFile::Read(
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.h b/src/core/hle/service/filesystem/fsp/fs_i_file.h
index e8599ee2f8..992330e149 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_file.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_file.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -27,6 +30,19 @@ private:
Result Flush();
Result SetSize(s64 size);
Result GetSize(Out<s64> out_size);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IFile::Read>, "Read"},
+ FunctionInfo{1, D<&IFile::Write>, "Write"},
+ FunctionInfo{2, D<&IFile::Flush>, "Flush"},
+ FunctionInfo{3, D<&IFile::SetSize>, "SetSize"},
+ FunctionInfo{4, D<&IFile::GetSize>, "GetSize"},
+ FunctionInfo{5, nullptr, "OperateRange"},
+ FunctionInfo{6, nullptr, "OperateRangeWithBuffer"}
+ );
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp
index edd381f57c..6ab4916a36 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp
@@ -13,30 +13,33 @@
namespace Service::FileSystem {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IFileSystem::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IFileSystem::CreateFile>, "CreateFile"},
+ FunctionInfo{1, D<&IFileSystem::DeleteFile>, "DeleteFile"},
+ FunctionInfo{2, D<&IFileSystem::CreateDirectory>, "CreateDirectory"},
+ FunctionInfo{3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"},
+ FunctionInfo{4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"},
+ FunctionInfo{5, D<&IFileSystem::RenameFile>, "RenameFile"},
+ FunctionInfo{6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"},
+ FunctionInfo{7, D<&IFileSystem::GetEntryType>, "GetEntryType"},
+ FunctionInfo{8, D<&IFileSystem::OpenFile>, "OpenFile"},
+ FunctionInfo{9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"},
+ FunctionInfo{10, D<&IFileSystem::Commit>, "Commit"},
+ FunctionInfo{11, D<&IFileSystem::GetFreeSpaceSize>, "GetFreeSpaceSize"},
+ FunctionInfo{12, D<&IFileSystem::GetTotalSpaceSize>, "GetTotalSpaceSize"},
+ FunctionInfo{13, D<&IFileSystem::CleanDirectoryRecursively>, "CleanDirectoryRecursively"},
+ FunctionInfo{14, D<&IFileSystem::GetFileTimeStampRaw>, "GetFileTimeStampRaw"},
+ FunctionInfo{15, nullptr, "QueryEntry"},
+ FunctionInfo{16, D<&IFileSystem::GetFileSystemAttribute>, "GetFileSystemAttribute"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IFileSystem::IFileSystem(Core::System& system_, FileSys::VirtualDir dir_, SizeGetter size_getter_)
: ServiceFramework{system_, "IFileSystem"}, backend{std::make_unique<FileSys::Fsa::IFileSystem>(
dir_)},
size_getter{std::move(size_getter_)} {
- static const FunctionInfo functions[] = {
- {0, D<&IFileSystem::CreateFile>, "CreateFile"},
- {1, D<&IFileSystem::DeleteFile>, "DeleteFile"},
- {2, D<&IFileSystem::CreateDirectory>, "CreateDirectory"},
- {3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"},
- {4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"},
- {5, D<&IFileSystem::RenameFile>, "RenameFile"},
- {6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"},
- {7, D<&IFileSystem::GetEntryType>, "GetEntryType"},
- {8, D<&IFileSystem::OpenFile>, "OpenFile"},
- {9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"},
- {10, D<&IFileSystem::Commit>, "Commit"},
- {11, D<&IFileSystem::GetFreeSpaceSize>, "GetFreeSpaceSize"},
- {12, D<&IFileSystem::GetTotalSpaceSize>, "GetTotalSpaceSize"},
- {13, D<&IFileSystem::CleanDirectoryRecursively>, "CleanDirectoryRecursively"},
- {14, D<&IFileSystem::GetFileTimeStampRaw>, "GetFileTimeStampRaw"},
- {15, nullptr, "QueryEntry"},
- {16, D<&IFileSystem::GetFileSystemAttribute>, "GetFileSystemAttribute"},
- };
- RegisterHandlers(functions);
}
Result IFileSystem::CreateFile(const InLargeData<FileSys::Sf::Path, BufferAttr_HipcPointer> path,
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h
index ed03c3ef83..11d3c7fb31 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h
@@ -58,6 +58,7 @@ public:
Result GetFileSystemAttribute(Out<FileSys::FileSystemAttribute> out_attribute);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<FileSys::Fsa::IFileSystem> backend;
SizeGetter size_getter;
};
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp
index 6263282344..f6eac6ca10 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -9,11 +12,6 @@ namespace Service::FileSystem {
IMultiCommitManager::IMultiCommitManager(Core::System& system_)
: ServiceFramework{system_, "IMultiCommitManager"} {
- static const FunctionInfo functions[] = {
- {1, D<&IMultiCommitManager::Add>, "Add"},
- {2, D<&IMultiCommitManager::Commit>, "Commit"},
- };
- RegisterHandlers(functions);
}
IMultiCommitManager::~IMultiCommitManager() = default;
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h
index 8ebf7c7d96..31182e9159 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -17,6 +20,13 @@ private:
Result Add(std::shared_ptr<IFileSystem> filesystem);
Result Commit();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, D<&IMultiCommitManager::Add>, "Add"},
+ FunctionInfo{2, D<&IMultiCommitManager::Commit>, "Commit"}
+ );
FileSys::VirtualFile backend;
};
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp
index 495b131df4..8353b72c24 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -17,11 +17,6 @@ ISaveDataInfoReader::ISaveDataInfoReader(Core::System& system_,
FileSys::SaveDataSpaceId space)
: ServiceFramework{system_, "ISaveDataInfoReader"}, save_data_controller{
save_data_controller_} {
- static const FunctionInfo functions[] = {
- {0, D<&ISaveDataInfoReader::ReadSaveDataInfo>, "ReadSaveDataInfo"},
- };
- RegisterHandlers(functions);
-
FindAllSaves(space);
}
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h
index e45ad852ba..7faa4291c0 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -42,6 +45,12 @@ private:
void FindNormalSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type);
void FindTemporaryStorageSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ISaveDataInfoReader::ReadSaveDataInfo>, "ReadSaveDataInfo"}
+ );
std::shared_ptr<SaveDataController> save_data_controller;
std::vector<SaveDataInfo> info;
u64 next_entry_index = 0;
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp
index 50b7d1e765..ac884b3b28 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp
+++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp
@@ -12,15 +12,6 @@ namespace Service::FileSystem {
IStorage::IStorage(Core::System& system_, FileSys::VirtualFile backend_)
: ServiceFramework{system_, "IStorage"}, backend(std::move(backend_)) {
- static const FunctionInfo functions[] = {
- {0, D<&IStorage::Read>, "Read"},
- {1, nullptr, "Write"},
- {2, nullptr, "Flush"},
- {3, nullptr, "SetSize"},
- {4, D<&IStorage::GetSize>, "GetSize"},
- {5, nullptr, "OperateRange"},
- };
- RegisterHandlers(functions);
}
Result IStorage::Read(
diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.h b/src/core/hle/service/filesystem/fsp/fs_i_storage.h
index 74d879386f..44d5a6c8bb 100644
--- a/src/core/hle/service/filesystem/fsp/fs_i_storage.h
+++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,12 +18,23 @@ public:
explicit IStorage(Core::System& system_, FileSys::VirtualFile backend_);
private:
- FileSys::VirtualFile backend;
-
Result Read(
OutBuffer<BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_bytes,
s64 offset, s64 length);
Result GetSize(Out<u64> out_size);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IStorage::Read>, "Read"},
+ FunctionInfo{1, nullptr, "Write"},
+ FunctionInfo{2, nullptr, "Flush"},
+ FunctionInfo{3, nullptr, "SetSize"},
+ FunctionInfo{4, D<&IStorage::GetSize>, "GetSize"},
+ FunctionInfo{5, nullptr, "OperateRange"}
+ );
+ FileSys::VirtualFile backend;
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp b/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp
index 8ee733f474..1f83d6509b 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp
+++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -6,15 +9,6 @@
namespace Service::FileSystem {
FSP_LDR::FSP_LDR(Core::System& system_) : ServiceFramework{system_, "fsp:ldr"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "OpenCodeFileSystem"},
- {1, nullptr, "IsArchivedProgram"},
- {2, nullptr, "SetCurrentProcess"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
FSP_LDR::~FSP_LDR() = default;
diff --git a/src/core/hle/service/filesystem/fsp/fsp_ldr.h b/src/core/hle/service/filesystem/fsp/fsp_ldr.h
index 358739a872..fe3abeff1d 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_ldr.h
+++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,15 @@ class FSP_LDR final : public ServiceFramework<FSP_LDR> {
public:
explicit FSP_LDR(Core::System& system_);
~FSP_LDR() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenCodeFileSystem"},
+ FunctionInfo{1, nullptr, "IsArchivedProgram"},
+ FunctionInfo{2, nullptr, "SetCurrentProcess"}
+ );
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fsp_pr.cpp b/src/core/hle/service/filesystem/fsp/fsp_pr.cpp
index 7c03ebaeae..9378e6e0c6 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_pr.cpp
+++ b/src/core/hle/service/filesystem/fsp/fsp_pr.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -6,16 +9,6 @@
namespace Service::FileSystem {
FSP_PR::FSP_PR(Core::System& system_) : ServiceFramework{system_, "fsp:pr"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RegisterProgram"},
- {1, nullptr, "UnregisterProgram"},
- {2, nullptr, "SetCurrentProcess"},
- {256, nullptr, "SetEnabledProgramVerification"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
FSP_PR::~FSP_PR() = default;
diff --git a/src/core/hle/service/filesystem/fsp/fsp_pr.h b/src/core/hle/service/filesystem/fsp/fsp_pr.h
index bd4e0a730c..bc692151a5 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_pr.h
+++ b/src/core/hle/service/filesystem/fsp/fsp_pr.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,16 @@ class FSP_PR final : public ServiceFramework<FSP_PR> {
public:
explicit FSP_PR(Core::System& system_);
~FSP_PR() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RegisterProgram"},
+ FunctionInfo{1, nullptr, "UnregisterProgram"},
+ FunctionInfo{2, nullptr, "SetCurrentProcess"},
+ FunctionInfo{256, nullptr, "SetEnabledProgramVerification"}
+ );
};
} // namespace Service::FileSystem
diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp
index 58303a0bd6..cb349636d5 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp
+++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp
@@ -47,143 +47,142 @@
namespace Service::FileSystem {
-FSP_SRV::FSP_SRV(Core::System& system_)
- : ServiceFramework{system_, "fsp-srv"}, fsc{system.GetFileSystemController()},
- content_provider{system.GetContentProvider()}, reporter{system.GetReporter()} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "OpenFileSystem"},
- {1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"},
- {2, D<&FSP_SRV::OpenDataFileSystemByCurrentProcess>, "OpenDataFileSystemByCurrentProcess"},
- {7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"},
- {8, nullptr, "OpenFileSystemWithId"},
- {9, nullptr, "OpenDataFileSystemByApplicationId"},
- {11, nullptr, "OpenBisFileSystem"},
- {12, nullptr, "OpenBisStorage"},
- {13, nullptr, "InvalidateBisCache"},
- {17, nullptr, "OpenHostFileSystem"},
- {18, D<&FSP_SRV::OpenSdCardFileSystem>, "OpenSdCardFileSystem"},
- {19, nullptr, "FormatSdCardFileSystem"},
- {21, nullptr, "DeleteSaveDataFileSystem"},
- {22, D<&FSP_SRV::CreateSaveDataFileSystem>, "CreateSaveDataFileSystem"},
- {23, D<&FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId>, "CreateSaveDataFileSystemBySystemSaveDataId"},
- {24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"},
- {25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"},
- {26, nullptr, "FormatSdCardDryRun"},
- {27, D<&FSP_SRV::IsExFatSupported>, "IsExFatSupported"},
- {28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"},
- {30, nullptr, "OpenGameCardStorage"},
- {31, nullptr, "OpenGameCardFileSystem"},
- {32, D<&FSP_SRV::ExtendSaveDataFileSystem>, "ExtendSaveDataFileSystem"},
- {33, nullptr, "DeleteCacheStorage"},
- {34, D<&FSP_SRV::GetCacheStorageSize>, "GetCacheStorageSize"},
- {35, nullptr, "CreateSaveDataFileSystemByHashSalt"},
- {36, nullptr, "OpenHostFileSystemWithOption"},
- {37, D<&FSP_SRV::CreateSaveDataFileSystemWithCreationInfo2>, "CreateSaveDataFileSystemWithCreationInfo2"},
- {51, D<&FSP_SRV::OpenSaveDataFileSystem>, "OpenSaveDataFileSystem"},
- {52, D<&FSP_SRV::OpenSaveDataFileSystemBySystemSaveDataId>, "OpenSaveDataFileSystemBySystemSaveDataId"},
- {53, D<&FSP_SRV::OpenReadOnlySaveDataFileSystem>, "OpenReadOnlySaveDataFileSystem"},
- {57, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataSpaceId>, "ReadSaveDataFileSystemExtraDataBySaveDataSpaceId"},
- {58, D<&FSP_SRV::ReadSaveDataFileSystemExtraData>, "ReadSaveDataFileSystemExtraData"},
- {59, D<&FSP_SRV::WriteSaveDataFileSystemExtraData>, "WriteSaveDataFileSystemExtraData"},
- {60, nullptr, "OpenSaveDataInfoReader"},
- {61, D<&FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId>, "OpenSaveDataInfoReaderBySaveDataSpaceId"},
- {62, D<&FSP_SRV::OpenSaveDataInfoReaderOnlyCacheStorage>, "OpenSaveDataInfoReaderOnlyCacheStorage"},
- {64, nullptr, "OpenSaveDataInternalStorageFileSystem"},
- {65, nullptr, "UpdateSaveDataMacForDebug"},
- {66, nullptr, "WriteSaveDataFileSystemExtraData2"},
- {67, D<&FSP_SRV::FindSaveDataWithFilter>, "FindSaveDataWithFilter"},
- {68, nullptr, "OpenSaveDataInfoReaderBySaveDataFilter"},
- {69, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataBySaveDataAttribute"},
- {70, D<&FSP_SRV::WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"},
- {71, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"},
- {80, nullptr, "OpenSaveDataMetaFile"},
- {81, nullptr, "OpenSaveDataTransferManager"},
- {82, nullptr, "OpenSaveDataTransferManagerVersion2"},
- {83, D<&FSP_SRV::OpenSaveDataTransferProhibiter>, "OpenSaveDataTransferProhibiter"},
- {84, nullptr, "ListApplicationAccessibleSaveDataOwnerId"},
- {85, nullptr, "OpenSaveDataTransferManagerForSaveDataRepair"},
- {86, nullptr, "OpenSaveDataMover"},
- {87, nullptr, "OpenSaveDataTransferManagerForRepair"},
- {100, nullptr, "OpenImageDirectoryFileSystem"},
- {101, nullptr, "OpenBaseFileSystem"},
- {102, nullptr, "FormatBaseFileSystem"},
- {110, nullptr, "OpenContentStorageFileSystem"},
- {120, nullptr, "OpenCloudBackupWorkStorageFileSystem"},
- {130, nullptr, "OpenCustomStorageFileSystem"},
- {200, D<&FSP_SRV::OpenDataStorageByCurrentProcess>, "OpenDataStorageByCurrentProcess"},
- {201, nullptr, "OpenDataStorageByProgramId"},
- {202, D<&FSP_SRV::OpenDataStorageByDataId>, "OpenDataStorageByDataId"},
- {203, D<&FSP_SRV::OpenPatchDataStorageByCurrentProcess>, "OpenPatchDataStorageByCurrentProcess"},
- {204, nullptr, "OpenDataFileSystemByProgramIndex"},
- {205, D<&FSP_SRV::OpenDataStorageWithProgramIndex>, "OpenDataStorageWithProgramIndex"},
- {206, nullptr, "OpenDataStorageByPath"},
- {210, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"},
- {400, nullptr, "OpenDeviceOperator"},
- {500, nullptr, "OpenSdCardDetectionEventNotifier"},
- {501, nullptr, "OpenGameCardDetectionEventNotifier"},
- {510, nullptr, "OpenSystemDataUpdateEventNotifier"},
- {511, nullptr, "NotifySystemDataUpdateEvent"},
- {520, nullptr, "SimulateGameCardDetectionEvent"},
- {600, nullptr, "SetCurrentPosixTime"},
- {601, nullptr, "QuerySaveDataTotalSize"},
- {602, nullptr, "VerifySaveDataFileSystem"},
- {603, nullptr, "CorruptSaveDataFileSystem"},
- {604, nullptr, "CreatePaddingFile"},
- {605, nullptr, "DeleteAllPaddingFiles"},
- {606, nullptr, "GetRightsId"},
- {607, nullptr, "RegisterExternalKey"},
- {608, nullptr, "UnregisterAllExternalKey"},
- {609, nullptr, "GetRightsIdByPath"},
- {610, nullptr, "GetRightsIdAndKeyGenerationByPath"},
- {611, nullptr, "SetCurrentPosixTimeWithTimeDifference"},
- {612, nullptr, "GetFreeSpaceSizeForSaveData"},
- {613, nullptr, "VerifySaveDataFileSystemBySaveDataSpaceId"},
- {614, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId"},
- {615, nullptr, "QuerySaveDataInternalStorageTotalSize"},
- {616, nullptr, "GetSaveDataCommitId"},
- {617, nullptr, "UnregisterExternalKey"},
- {620, nullptr, "SetSdCardEncryptionSeed"},
- {630, nullptr, "SetSdCardAccessibility"},
- {631, D<&FSP_SRV::IsSdCardAccessible>, "IsSdCardAccessible"},
- {640, nullptr, "IsSignedSystemPartitionOnSdCardValid"},
- {700, nullptr, "OpenAccessFailureResolver"},
- {701, nullptr, "GetAccessFailureDetectionEvent"},
- {702, nullptr, "IsAccessFailureDetected"},
- {710, nullptr, "ResolveAccessFailure"},
- {720, nullptr, "AbandonAccessFailure"},
- {800, nullptr, "GetAndClearFileSystemProxyErrorInfo"},
- {810, nullptr, "RegisterProgramIndexMapInfo"},
- {820, nullptr, "GetContentStorageInfoIndex"},
- {830, nullptr, "EncryptStreamPlaySaveData"},
- {831, nullptr, "DecryptStreamPlaySaveData"},
- {1000, nullptr, "SetBisRootForHost"},
- {1001, nullptr, "SetSaveDataSize"},
- {1002, nullptr, "SetSaveDataRootPath"},
- {1003, D<&FSP_SRV::DisableAutoSaveDataCreation>, "DisableAutoSaveDataCreation"},
- {1004, D<&FSP_SRV::SetGlobalAccessLogMode>, "SetGlobalAccessLogMode"},
- {1005, D<&FSP_SRV::GetGlobalAccessLogMode>, "GetGlobalAccessLogMode"},
- {1006, D<&FSP_SRV::OutputAccessLogToSdCard>, "OutputAccessLogToSdCard"},
- {1007, nullptr, "RegisterUpdatePartition"},
- {1008, nullptr, "OpenRegisteredUpdatePartition"},
- {1009, nullptr, "GetAndClearMemoryReportInfo"},
- {1010, nullptr, "SetDataStorageRedirectTarget"},
- {1011, D<&FSP_SRV::GetProgramIndexForAccessLog>, "GetProgramIndexForAccessLog"},
- {1012, nullptr, "GetFsStackUsage"},
- {1013, nullptr, "UnsetSaveDataRootPath"},
- {1014, nullptr, "OutputMultiProgramTagAccessLog"},
- {1016, D<&FSP_SRV::FlushAccessLogOnSdCard>, "FlushAccessLogOnSdCard"},
- {1017, nullptr, "OutputApplicationInfoAccessLog"},
- {1018, nullptr, "SetDebugOption"},
- {1019, nullptr, "UnsetDebugOption"},
- {1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"},
- {1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"},
- {1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"},
- {1300, nullptr, "OpenBisWiper"},
- };
- // clang-format on
- RegisterHandlers(functions);
+std::optional<ServiceFrameworkBase::FunctionInfoBase> FSP_SRV::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenFileSystem"},
+ FunctionInfo{1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"},
+ FunctionInfo{2, D<&FSP_SRV::OpenDataFileSystemByCurrentProcess>, "OpenDataFileSystemByCurrentProcess"},
+ FunctionInfo{7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"},
+ FunctionInfo{8, nullptr, "OpenFileSystemWithId"},
+ FunctionInfo{9, nullptr, "OpenDataFileSystemByApplicationId"},
+ FunctionInfo{11, nullptr, "OpenBisFileSystem"},
+ FunctionInfo{12, nullptr, "OpenBisStorage"},
+ FunctionInfo{13, nullptr, "InvalidateBisCache"},
+ FunctionInfo{17, nullptr, "OpenHostFileSystem"},
+ FunctionInfo{18, D<&FSP_SRV::OpenSdCardFileSystem>, "OpenSdCardFileSystem"},
+ FunctionInfo{19, nullptr, "FormatSdCardFileSystem"},
+ FunctionInfo{21, nullptr, "DeleteSaveDataFileSystem"},
+ FunctionInfo{22, D<&FSP_SRV::CreateSaveDataFileSystem>, "CreateSaveDataFileSystem"},
+ FunctionInfo{23, D<&FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId>, "CreateSaveDataFileSystemBySystemSaveDataId"},
+ FunctionInfo{24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"},
+ FunctionInfo{25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"},
+ FunctionInfo{26, nullptr, "FormatSdCardDryRun"},
+ FunctionInfo{27, D<&FSP_SRV::IsExFatSupported>, "IsExFatSupported"},
+ FunctionInfo{28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"},
+ FunctionInfo{30, nullptr, "OpenGameCardStorage"},
+ FunctionInfo{31, nullptr, "OpenGameCardFileSystem"},
+ FunctionInfo{32, D<&FSP_SRV::ExtendSaveDataFileSystem>, "ExtendSaveDataFileSystem"},
+ FunctionInfo{33, nullptr, "DeleteCacheStorage"},
+ FunctionInfo{34, D<&FSP_SRV::GetCacheStorageSize>, "GetCacheStorageSize"},
+ FunctionInfo{35, nullptr, "CreateSaveDataFileSystemByHashSalt"},
+ FunctionInfo{36, nullptr, "OpenHostFileSystemWithOption"},
+ FunctionInfo{37, D<&FSP_SRV::CreateSaveDataFileSystemWithCreationInfo2>, "CreateSaveDataFileSystemWithCreationInfo2"},
+ FunctionInfo{51, D<&FSP_SRV::OpenSaveDataFileSystem>, "OpenSaveDataFileSystem"},
+ FunctionInfo{52, D<&FSP_SRV::OpenSaveDataFileSystemBySystemSaveDataId>, "OpenSaveDataFileSystemBySystemSaveDataId"},
+ FunctionInfo{53, D<&FSP_SRV::OpenReadOnlySaveDataFileSystem>, "OpenReadOnlySaveDataFileSystem"},
+ FunctionInfo{57, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataSpaceId>, "ReadSaveDataFileSystemExtraDataBySaveDataSpaceId"},
+ FunctionInfo{58, D<&FSP_SRV::ReadSaveDataFileSystemExtraData>, "ReadSaveDataFileSystemExtraData"},
+ FunctionInfo{59, D<&FSP_SRV::WriteSaveDataFileSystemExtraData>, "WriteSaveDataFileSystemExtraData"},
+ FunctionInfo{60, nullptr, "OpenSaveDataInfoReader"},
+ FunctionInfo{61, D<&FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId>, "OpenSaveDataInfoReaderBySaveDataSpaceId"},
+ FunctionInfo{62, D<&FSP_SRV::OpenSaveDataInfoReaderOnlyCacheStorage>, "OpenSaveDataInfoReaderOnlyCacheStorage"},
+ FunctionInfo{64, nullptr, "OpenSaveDataInternalStorageFileSystem"},
+ FunctionInfo{65, nullptr, "UpdateSaveDataMacForDebug"},
+ FunctionInfo{66, nullptr, "WriteSaveDataFileSystemExtraData2"},
+ FunctionInfo{67, D<&FSP_SRV::FindSaveDataWithFilter>, "FindSaveDataWithFilter"},
+ FunctionInfo{68, nullptr, "OpenSaveDataInfoReaderBySaveDataFilter"},
+ FunctionInfo{69, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataBySaveDataAttribute"},
+ FunctionInfo{70, D<&FSP_SRV::WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"},
+ FunctionInfo{71, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"},
+ FunctionInfo{80, nullptr, "OpenSaveDataMetaFile"},
+ FunctionInfo{81, nullptr, "OpenSaveDataTransferManager"},
+ FunctionInfo{82, nullptr, "OpenSaveDataTransferManagerVersion2"},
+ FunctionInfo{83, D<&FSP_SRV::OpenSaveDataTransferProhibiter>, "OpenSaveDataTransferProhibiter"},
+ FunctionInfo{84, nullptr, "ListApplicationAccessibleSaveDataOwnerId"},
+ FunctionInfo{85, nullptr, "OpenSaveDataTransferManagerForSaveDataRepair"},
+ FunctionInfo{86, nullptr, "OpenSaveDataMover"},
+ FunctionInfo{87, nullptr, "OpenSaveDataTransferManagerForRepair"},
+ FunctionInfo{100, nullptr, "OpenImageDirectoryFileSystem"},
+ FunctionInfo{101, nullptr, "OpenBaseFileSystem"},
+ FunctionInfo{102, nullptr, "FormatBaseFileSystem"},
+ FunctionInfo{110, nullptr, "OpenContentStorageFileSystem"},
+ FunctionInfo{120, nullptr, "OpenCloudBackupWorkStorageFileSystem"},
+ FunctionInfo{130, nullptr, "OpenCustomStorageFileSystem"},
+ FunctionInfo{200, D<&FSP_SRV::OpenDataStorageByCurrentProcess>, "OpenDataStorageByCurrentProcess"},
+ FunctionInfo{201, nullptr, "OpenDataStorageByProgramId"},
+ FunctionInfo{202, D<&FSP_SRV::OpenDataStorageByDataId>, "OpenDataStorageByDataId"},
+ FunctionInfo{203, D<&FSP_SRV::OpenPatchDataStorageByCurrentProcess>, "OpenPatchDataStorageByCurrentProcess"},
+ FunctionInfo{204, nullptr, "OpenDataFileSystemByProgramIndex"},
+ FunctionInfo{205, D<&FSP_SRV::OpenDataStorageWithProgramIndex>, "OpenDataStorageWithProgramIndex"},
+ FunctionInfo{206, nullptr, "OpenDataStorageByPath"},
+ FunctionInfo{210, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"},
+ FunctionInfo{400, nullptr, "OpenDeviceOperator"},
+ FunctionInfo{500, nullptr, "OpenSdCardDetectionEventNotifier"},
+ FunctionInfo{501, nullptr, "OpenGameCardDetectionEventNotifier"},
+ FunctionInfo{510, nullptr, "OpenSystemDataUpdateEventNotifier"},
+ FunctionInfo{511, nullptr, "NotifySystemDataUpdateEvent"},
+ FunctionInfo{520, nullptr, "SimulateGameCardDetectionEvent"},
+ FunctionInfo{600, nullptr, "SetCurrentPosixTime"},
+ FunctionInfo{601, nullptr, "QuerySaveDataTotalSize"},
+ FunctionInfo{602, nullptr, "VerifySaveDataFileSystem"},
+ FunctionInfo{603, nullptr, "CorruptSaveDataFileSystem"},
+ FunctionInfo{604, nullptr, "CreatePaddingFile"},
+ FunctionInfo{605, nullptr, "DeleteAllPaddingFiles"},
+ FunctionInfo{606, nullptr, "GetRightsId"},
+ FunctionInfo{607, nullptr, "RegisterExternalKey"},
+ FunctionInfo{608, nullptr, "UnregisterAllExternalKey"},
+ FunctionInfo{609, nullptr, "GetRightsIdByPath"},
+ FunctionInfo{610, nullptr, "GetRightsIdAndKeyGenerationByPath"},
+ FunctionInfo{611, nullptr, "SetCurrentPosixTimeWithTimeDifference"},
+ FunctionInfo{612, nullptr, "GetFreeSpaceSizeForSaveData"},
+ FunctionInfo{613, nullptr, "VerifySaveDataFileSystemBySaveDataSpaceId"},
+ FunctionInfo{614, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId"},
+ FunctionInfo{615, nullptr, "QuerySaveDataInternalStorageTotalSize"},
+ FunctionInfo{616, nullptr, "GetSaveDataCommitId"},
+ FunctionInfo{617, nullptr, "UnregisterExternalKey"},
+ FunctionInfo{620, nullptr, "SetSdCardEncryptionSeed"},
+ FunctionInfo{630, nullptr, "SetSdCardAccessibility"},
+ FunctionInfo{631, D<&FSP_SRV::IsSdCardAccessible>, "IsSdCardAccessible"},
+ FunctionInfo{640, nullptr, "IsSignedSystemPartitionOnSdCardValid"},
+ FunctionInfo{700, nullptr, "OpenAccessFailureResolver"},
+ FunctionInfo{701, nullptr, "GetAccessFailureDetectionEvent"},
+ FunctionInfo{702, nullptr, "IsAccessFailureDetected"},
+ FunctionInfo{710, nullptr, "ResolveAccessFailure"},
+ FunctionInfo{720, nullptr, "AbandonAccessFailure"},
+ FunctionInfo{800, nullptr, "GetAndClearFileSystemProxyErrorInfo"},
+ FunctionInfo{810, nullptr, "RegisterProgramIndexMapInfo"},
+ FunctionInfo{820, nullptr, "GetContentStorageInfoIndex"},
+ FunctionInfo{830, nullptr, "EncryptStreamPlaySaveData"},
+ FunctionInfo{831, nullptr, "DecryptStreamPlaySaveData"},
+ FunctionInfo{1000, nullptr, "SetBisRootForHost"},
+ FunctionInfo{1001, nullptr, "SetSaveDataSize"},
+ FunctionInfo{1002, nullptr, "SetSaveDataRootPath"},
+ FunctionInfo{1003, D<&FSP_SRV::DisableAutoSaveDataCreation>, "DisableAutoSaveDataCreation"},
+ FunctionInfo{1004, D<&FSP_SRV::SetGlobalAccessLogMode>, "SetGlobalAccessLogMode"},
+ FunctionInfo{1005, D<&FSP_SRV::GetGlobalAccessLogMode>, "GetGlobalAccessLogMode"},
+ FunctionInfo{1006, D<&FSP_SRV::OutputAccessLogToSdCard>, "OutputAccessLogToSdCard"},
+ FunctionInfo{1007, nullptr, "RegisterUpdatePartition"},
+ FunctionInfo{1008, nullptr, "OpenRegisteredUpdatePartition"},
+ FunctionInfo{1009, nullptr, "GetAndClearMemoryReportInfo"},
+ FunctionInfo{1010, nullptr, "SetDataStorageRedirectTarget"},
+ FunctionInfo{1011, D<&FSP_SRV::GetProgramIndexForAccessLog>, "GetProgramIndexForAccessLog"},
+ FunctionInfo{1012, nullptr, "GetFsStackUsage"},
+ FunctionInfo{1013, nullptr, "UnsetSaveDataRootPath"},
+ FunctionInfo{1014, nullptr, "OutputMultiProgramTagAccessLog"},
+ FunctionInfo{1016, D<&FSP_SRV::FlushAccessLogOnSdCard>, "FlushAccessLogOnSdCard"},
+ FunctionInfo{1017, nullptr, "OutputApplicationInfoAccessLog"},
+ FunctionInfo{1018, nullptr, "SetDebugOption"},
+ FunctionInfo{1019, nullptr, "UnsetDebugOption"},
+ FunctionInfo{1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"},
+ FunctionInfo{1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"},
+ FunctionInfo{1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"},
+ FunctionInfo{1300, nullptr, "OpenBisWiper"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+FSP_SRV::FSP_SRV(Core::System& system_)
+ : ServiceFramework{system_, "fsp-srv"}, fsc{system.GetFileSystemController()}, content_provider{system.GetContentProvider()}, reporter{system.GetReporter()} {
if (Settings::values.enable_fs_access_log) {
access_log_mode = AccessLogMode::SdCard;
}
diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.h b/src/core/hle/service/filesystem/fsp/fsp_srv.h
index 156cf4e571..ebda008bcc 100644
--- a/src/core/hle/service/filesystem/fsp/fsp_srv.h
+++ b/src/core/hle/service/filesystem/fsp/fsp_srv.h
@@ -115,6 +115,7 @@ private:
s64 available_size, s64 journal_size);
Result GetCacheStorageSize(s32 index, Out<s64> out_data_size, Out<s64> out_journal_size);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
FileSystemController& fsc;
const FileSys::ContentProvider& content_provider;
const Core::Reporter& reporter;
diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp
index f8690dbb8b..5480d22b83 100644
--- a/src/core/hle/service/friend/friend.cpp
+++ b/src/core/hle/service/friend/friend.cpp
@@ -11,139 +11,38 @@
#include "core/hle/kernel/k_event.h"
#include "core/hle/service/acc/errors.h"
#include "core/hle/service/friend/friend.h"
-#include "core/hle/service/friend/friend_interface.h"
#include "core/hle/service/ipc_helpers.h"
#include "core/hle/service/kernel_helpers.h"
#include "core/hle/service/server_manager.h"
namespace Service::Friend {
+class Friend final : public Module::Interface {
+public:
+ explicit Friend(std::shared_ptr<Module> module_, Core::System& system_, const char* name) : Interface(std::move(module_), system_, name) {}
+ ~Friend() override = default;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &Friend::CreateFriendService, "CreateFriendService"},
+ FunctionInfo{1, &Friend::CreateNotificationService, "CreateNotificationService"},
+ FunctionInfo{2, nullptr, "CreateDaemonSuspendSessionService"}
+ );
+};
+
class IFriendService final : public ServiceFramework<IFriendService> {
public:
explicit IFriendService(Core::System& system_)
: ServiceFramework{system_, "IFriendService"}, service_context{system, "IFriendService"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"},
- {1, &IFriendService::Cancel, "Cancel"},
- {10100, nullptr, "GetFriendListIds"},
- {10101, &IFriendService::GetFriendList, "GetFriendList"},
- {10102, nullptr, "UpdateFriendInfo"},
- {10110, nullptr, "GetFriendProfileImage"},
- {10111, nullptr, "GetFriendProfileImageWithImageSize"}, // 18.0.0+
- {10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"},
- {10121, nullptr, "EnsureFriendListAvailable"},
- {10200, nullptr, "SendFriendRequestForApplication"},
- {10211, nullptr, "AddFacedFriendRequestForApplication"},
- {10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"},
- {10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"},
- {10421, nullptr, "EnsureBlockedUserListAvailable"},
- {10500, nullptr, "GetProfileList"},
- {10501, nullptr, "GetProfileListV2"}, // 18.0.0+
- {10600, nullptr, "DeclareOpenOnlinePlaySession"},
- {10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"},
- {10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"},
- {10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"},
- {10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
- {10702, nullptr, "AddPlayHistory"},
- {11000, nullptr, "GetProfileImageUrl"},
- {11001, nullptr, "GetProfileImageUrlV2"}, // 18.0.0+
- {20100, &IFriendService::GetFriendCount, "GetFriendCount"},
- {20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"},
- {20102, nullptr, "GetFriendDetailedInfo"},
- {20103, nullptr, "SyncFriendList"},
- {20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"},
- {20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"},
- {20106, nullptr, "UpdateFriendInfoForViewerV1"},
- {20107, nullptr, "GetFriendDetailedInfoV2"}, // 20.0.0+
- {20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2"}, // 22.0.0+
- {20109, nullptr, "UpdateFriendInfoForViewerV2"}, // 22.0.0+
- {20110, nullptr, "LoadFriendSettingV1"},
- {20111, nullptr, "LoadFriendSettingV2"}, // 22.0.0+
- {20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"},
- {20201, nullptr, "GetFriendRequestListV1"},
- {20202, nullptr, "GetFriendRequestListV2"}, // 20.0.0+
- {20203, nullptr, "GetFriendRequestReceivedNotificationCount"}, // 22.0.0+
- {20300, nullptr, "GetFriendCandidateList"},
- {20301, nullptr, "GetNintendoNetworkIdInfo"},
- {20302, nullptr, "GetSnsAccountLinkage"}, // 5.0.0-19.0.1
- {20303, nullptr, "GetSnsAccountProfile"}, // 5.0.0-19.0.1
- {20304, nullptr, "GetSnsAccountFriendList"}, // 5.0.0-19.0.1
- {20400, nullptr, "GetBlockedUserListV1"},
- {20401, nullptr, "SyncBlockedUserList"},
- {20402, nullptr, "GetBlockedUserListV2"}, // 20.0.0+
- {20500, nullptr, "GetProfileExtraListV1"},
- {20501, nullptr, "GetRelationship"},
- {20502, nullptr, "GetProfileExtraListV2"}, // 19.0.0+
- {20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"},
- {20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2"}, // 19.0.0+
- {20700, nullptr, "GetPlayHistoryListV1"},
- {20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"},
- {20702, nullptr, "GetPlayHistoryListV2"}, // 19.0.0+
- {20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"},
- {20801, nullptr, "SyncUserSetting"},
- {20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2"}, // 19.0.0+
- {20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"},
- {21000, nullptr, "GetExternalApplicationCatalog"},
- {22000, nullptr, "GetReceivedFriendInvitationListV1"},
- {22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"},
- {22002, nullptr, "GetReceivedFriendInvitationListV2"}, // 19.0.0+
- {22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2"}, // 19.0.0+
- {22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"},
- {30100, nullptr, "DropFriendNewlyFlags"},
- {30101, nullptr, "DeleteFriend"},
- {30110, nullptr, "DropFriendNewlyFlag"},
- {30120, nullptr, "ChangeFriendFavoriteFlag"},
- {30121, nullptr, "ChangeFriendOnlineNotificationFlag"},
- {30130, nullptr, "SetFriendNote"}, // 22.0.0+
- {30131, nullptr, "RequestUploadPendingNote"}, // 22.0.0+
- {30190, nullptr, "RequestSyncLocalUpdates"}, // 22.0.0+
- {30200, nullptr, "SendFriendRequest"},
- {30201, nullptr, "SendFriendRequestWithApplicationInfoV1"},
- {30202, nullptr, "CancelFriendRequest"},
- {30203, nullptr, "AcceptFriendRequest"},
- {30204, nullptr, "RejectFriendRequest"},
- {30205, nullptr, "ReadFriendRequest"},
- {30210, nullptr, "GetFacedFriendRequestRegistrationKey"},
- {30211, nullptr, "AddFacedFriendRequest"},
- {30212, nullptr, "CancelFacedFriendRequest"},
- {30213, nullptr, "GetFacedFriendRequestProfileImage"},
- {30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"},
- {30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"},
- {30216, nullptr, "ResendFacedFriendRequest"},
- {30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"},
- {30218, nullptr, "SendFriendRequestWithApplicationInfoV2"}, // 20.0.0+
- {30300, nullptr, "GetSnsAccountLinkPageUrl"}, // 5.0.0-19.0.1
- {30301, nullptr, "UnlinkSnsAccount"}, // 5.0.0-19.0.1
- {30400, nullptr, "BlockUser"},
- {30401, nullptr, "BlockUserWithApplicationInfoV1"},
- {30402, nullptr, "UnblockUser"},
- {30403, nullptr, "BlockUserWithApplicationInfoV2"}, // 20.0.0+
- {30500, nullptr, "GetProfileExtraFromFriendCodeV1"},
- {30501, nullptr, "GetProfileExtraFromFriendCodeV2"}, // 19.0.0+
- {30700, nullptr, "DeletePlayHistory"},
- {30701, nullptr, "AddPlayHistoryWithApplication"}, // 19.0.0+
- {30810, nullptr, "ChangePresencePermission"},
- {30811, nullptr, "ChangeFriendRequestReception"},
- {30812, nullptr, "ChangePlayLogPermission"},
- {30820, nullptr, "IssueFriendCode"},
- {30830, nullptr, "ClearPlayLog"},
- {30900, nullptr, "SendFriendInvitationV1"},
- {30901, nullptr, "SendFriendInvitationV2"}, // 19.0.0+
- {30910, nullptr, "ReadFriendInvitation"},
- {30911, nullptr, "ReadAllFriendInvitations"},
- {31000, nullptr, "OpenUser"}, // 19.0.0+
- {40100, nullptr, "DeleteFriendListCache"},
- {40400, nullptr, "DeleteBlockedUserListCache"},
- {49900, nullptr, "DeleteNetworkServiceAccountCache"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
completion_event = service_context.CreateEvent("IFriendService:CompletionEvent");
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
~IFriendService() override {
service_context.CloseEvent(completion_event);
}
@@ -367,29 +266,136 @@ private:
rb.Push(0);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"},
+ FunctionInfo{1, &IFriendService::Cancel, "Cancel"},
+ FunctionInfo{10100, nullptr, "GetFriendListIds"},
+ FunctionInfo{10101, &IFriendService::GetFriendList, "GetFriendList"},
+ FunctionInfo{10102, nullptr, "UpdateFriendInfo"},
+ FunctionInfo{10110, nullptr, "GetFriendProfileImage"},
+ FunctionInfo{10111, nullptr, "GetFriendProfileImageWithImageSize", MakeVersionGate({18,0,0})},
+ FunctionInfo{10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"},
+ FunctionInfo{10121, nullptr, "EnsureFriendListAvailable"},
+ FunctionInfo{10200, nullptr, "SendFriendRequestForApplication"},
+ FunctionInfo{10211, nullptr, "AddFacedFriendRequestForApplication"},
+ FunctionInfo{10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"},
+ FunctionInfo{10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"},
+ FunctionInfo{10421, nullptr, "EnsureBlockedUserListAvailable"},
+ FunctionInfo{10500, nullptr, "GetProfileList"},
+ FunctionInfo{10501, nullptr, "GetProfileListV2", MakeVersionGate({18,0,0})},
+ FunctionInfo{10600, nullptr, "DeclareOpenOnlinePlaySession"},
+ FunctionInfo{10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"},
+ FunctionInfo{10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"},
+ FunctionInfo{10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"},
+ FunctionInfo{10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
+ FunctionInfo{10702, nullptr, "AddPlayHistory"},
+ FunctionInfo{11000, nullptr, "GetProfileImageUrl"},
+ FunctionInfo{11001, nullptr, "GetProfileImageUrlV2", MakeVersionGate({18,0,0})},
+ FunctionInfo{20100, &IFriendService::GetFriendCount, "GetFriendCount"},
+ FunctionInfo{20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"},
+ FunctionInfo{20102, nullptr, "GetFriendDetailedInfo"},
+ FunctionInfo{20103, nullptr, "SyncFriendList"},
+ FunctionInfo{20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"},
+ FunctionInfo{20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"},
+ FunctionInfo{20106, nullptr, "UpdateFriendInfoForViewerV1"},
+ FunctionInfo{20107, nullptr, "GetFriendDetailedInfoV2", MakeVersionGate({20,0,0})},
+ FunctionInfo{20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2", MakeVersionGate({22,0,0})},
+ FunctionInfo{20109, nullptr, "UpdateFriendInfoForViewerV2", MakeVersionGate({22,0,0})},
+ FunctionInfo{20110, nullptr, "LoadFriendSettingV1"},
+ FunctionInfo{20111, nullptr, "LoadFriendSettingV2", MakeVersionGate({22,0,0})},
+ FunctionInfo{20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"},
+ FunctionInfo{20201, nullptr, "GetFriendRequestListV1"},
+ FunctionInfo{20202, nullptr, "GetFriendRequestListV2", MakeVersionGate({20,0,0})},
+ FunctionInfo{20203, nullptr, "GetFriendRequestReceivedNotificationCount", MakeVersionGate({22,0,0})},
+ FunctionInfo{20300, nullptr, "GetFriendCandidateList"},
+ FunctionInfo{20301, nullptr, "GetNintendoNetworkIdInfo"},
+ FunctionInfo{20302, nullptr, "GetSnsAccountLinkage", MakeVersionGate({5,0,0}, {19,0,1})},
+ FunctionInfo{20303, nullptr, "GetSnsAccountProfile", MakeVersionGate({5,0,0}, {19,0,1})},
+ FunctionInfo{20304, nullptr, "GetSnsAccountFriendList", MakeVersionGate({5,0,0}, {19,0,1})},
+ FunctionInfo{20400, nullptr, "GetBlockedUserListV1"},
+ FunctionInfo{20401, nullptr, "SyncBlockedUserList"},
+ FunctionInfo{20402, nullptr, "GetBlockedUserListV2", MakeVersionGate({20,0,0})},
+ FunctionInfo{20500, nullptr, "GetProfileExtraListV1"},
+ FunctionInfo{20501, nullptr, "GetRelationship"},
+ FunctionInfo{20502, nullptr, "GetProfileExtraListV2", MakeVersionGate({19,0,0})},
+ FunctionInfo{20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"},
+ FunctionInfo{20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2", MakeVersionGate({19,0,0})},
+ FunctionInfo{20700, nullptr, "GetPlayHistoryListV1"},
+ FunctionInfo{20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"},
+ FunctionInfo{20702, nullptr, "GetPlayHistoryListV2", MakeVersionGate({19,0,0})},
+ FunctionInfo{20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"},
+ FunctionInfo{20801, nullptr, "SyncUserSetting"},
+ FunctionInfo{20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2", MakeVersionGate({19,0,0})},
+ FunctionInfo{20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"},
+ FunctionInfo{21000, nullptr, "GetExternalApplicationCatalog"},
+ FunctionInfo{22000, nullptr, "GetReceivedFriendInvitationListV1"},
+ FunctionInfo{22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"},
+ FunctionInfo{22002, nullptr, "GetReceivedFriendInvitationListV2", MakeVersionGate({19,0,0})},
+ FunctionInfo{22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2", MakeVersionGate({19,0,0})},
+ FunctionInfo{22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"},
+ FunctionInfo{30100, nullptr, "DropFriendNewlyFlags"},
+ FunctionInfo{30101, nullptr, "DeleteFriend"},
+ FunctionInfo{30110, nullptr, "DropFriendNewlyFlag"},
+ FunctionInfo{30120, nullptr, "ChangeFriendFavoriteFlag"},
+ FunctionInfo{30121, nullptr, "ChangeFriendOnlineNotificationFlag"},
+ FunctionInfo{30130, nullptr, "SetFriendNote", MakeVersionGate({22,0,0})},
+ FunctionInfo{30131, nullptr, "RequestUploadPendingNote", MakeVersionGate({22,0,0})},
+ FunctionInfo{30190, nullptr, "RequestSyncLocalUpdates", MakeVersionGate({22,0,0})},
+ FunctionInfo{30200, nullptr, "SendFriendRequest"},
+ FunctionInfo{30201, nullptr, "SendFriendRequestWithApplicationInfoV1"},
+ FunctionInfo{30202, nullptr, "CancelFriendRequest"},
+ FunctionInfo{30203, nullptr, "AcceptFriendRequest"},
+ FunctionInfo{30204, nullptr, "RejectFriendRequest"},
+ FunctionInfo{30205, nullptr, "ReadFriendRequest"},
+ FunctionInfo{30210, nullptr, "GetFacedFriendRequestRegistrationKey"},
+ FunctionInfo{30211, nullptr, "AddFacedFriendRequest"},
+ FunctionInfo{30212, nullptr, "CancelFacedFriendRequest"},
+ FunctionInfo{30213, nullptr, "GetFacedFriendRequestProfileImage"},
+ FunctionInfo{30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"},
+ FunctionInfo{30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"},
+ FunctionInfo{30216, nullptr, "ResendFacedFriendRequest"},
+ FunctionInfo{30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"},
+ FunctionInfo{30218, nullptr, "SendFriendRequestWithApplicationInfoV2", MakeVersionGate({20,0,0})},
+ FunctionInfo{30300, nullptr, "GetSnsAccountLinkPageUrl", MakeVersionGate({5,0,0}, {19,0,1})},
+ FunctionInfo{30301, nullptr, "UnlinkSnsAccount", MakeVersionGate({5,0,0}, {19,0,1})},
+ FunctionInfo{30400, nullptr, "BlockUser"},
+ FunctionInfo{30401, nullptr, "BlockUserWithApplicationInfoV1"},
+ FunctionInfo{30402, nullptr, "UnblockUser"},
+ FunctionInfo{30403, nullptr, "BlockUserWithApplicationInfoV2", MakeVersionGate({20,0,0})},
+ FunctionInfo{30500, nullptr, "GetProfileExtraFromFriendCodeV1"},
+ FunctionInfo{30501, nullptr, "GetProfileExtraFromFriendCodeV2", MakeVersionGate({19,0,0})},
+ FunctionInfo{30700, nullptr, "DeletePlayHistory"},
+ FunctionInfo{30701, nullptr, "AddPlayHistoryWithApplication", MakeVersionGate({19,0,0})},
+ FunctionInfo{30810, nullptr, "ChangePresencePermission"},
+ FunctionInfo{30811, nullptr, "ChangeFriendRequestReception"},
+ FunctionInfo{30812, nullptr, "ChangePlayLogPermission"},
+ FunctionInfo{30820, nullptr, "IssueFriendCode"},
+ FunctionInfo{30830, nullptr, "ClearPlayLog"},
+ FunctionInfo{30900, nullptr, "SendFriendInvitationV1"},
+ FunctionInfo{30901, nullptr, "SendFriendInvitationV2", MakeVersionGate({19,0,0})},
+ FunctionInfo{30910, nullptr, "ReadFriendInvitation"},
+ FunctionInfo{30911, nullptr, "ReadAllFriendInvitations"},
+ FunctionInfo{31000, nullptr, "OpenUser", MakeVersionGate({19,0,0})},
+ FunctionInfo{40100, nullptr, "DeleteFriendListCache"},
+ FunctionInfo{40400, nullptr, "DeleteBlockedUserListCache"},
+ FunctionInfo{49900, nullptr, "DeleteNetworkServiceAccountCache"}
+ );
KernelHelpers::ServiceContext service_context;
-
Kernel::KEvent* completion_event;
};
class INotificationService final : public ServiceFramework<INotificationService> {
public:
explicit INotificationService(Core::System& system_, Common::UUID uuid_)
- : ServiceFramework{system_, "INotificationService"}, uuid{uuid_},
- service_context{system_, "INotificationService"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &INotificationService::GetEvent, "GetEvent"},
- {1, &INotificationService::Clear, "Clear"},
- {2, &INotificationService::Pop, "Pop"}
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
+ : ServiceFramework{system_, "INotificationService"}, uuid{uuid_}
+ , service_context{system_, "INotificationService"} {
notification_event = service_context.CreateEvent("INotificationService:NotifyEvent");
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
~INotificationService() override {
service_context.CloseEvent(notification_event);
}
@@ -465,9 +471,13 @@ private:
bool has_received_friend_request;
};
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &INotificationService::GetEvent, "GetEvent"},
+ FunctionInfo{1, &INotificationService::Clear, "Clear"},
+ FunctionInfo{2, &INotificationService::Pop, "Pop"}
+ );
Common::UUID uuid;
KernelHelpers::ServiceContext service_context;
-
Kernel::KEvent* notification_event;
std::queue<SizedNotificationInfo> notifications;
States states{};
@@ -501,61 +511,67 @@ class IServiceForApplication final : public ServiceFramework<IServiceForApplicat
public:
explicit IServiceForApplication(Core::System& system_)
: ServiceFramework{system_, "nd:app"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetReceivableNeighborInfoCountMax"},
- {10, nullptr, "IsNeighborDetectionEnabled"},
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"},
+ FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"}
+ );
};
class IServiceForSystem final : public ServiceFramework<IServiceForSystem> {
public:
explicit IServiceForSystem(Core::System& system_)
: ServiceFramework{system_, "nd:sys"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetReceivableNeighborInfoCountMax"},
- {10, nullptr, "IsNeighborDetectionEnabled"},
- {200, nullptr, "SetSystemData"},
- {201, nullptr, "ClearSystemData"},
- {203, nullptr, "GetReceivableNeighborInfoCountForSystem"},
- {204, nullptr, "ReceiveNeighborInfoForSystem"},
- {205, nullptr, "SetSender"},
- {206, nullptr, "GetSender"},
- {207, nullptr, "CreateScannerForSystem"},
- {208, nullptr, "CreateReceiveEventHolderForSystem"},
- {223, nullptr, "EnableNeighborDetection"},
- {224, nullptr, "DisableNeighborDetection"},
- {226, nullptr, "EnablePowerSave"},
- {227, nullptr, "DisablePowerSave"},
- {228, nullptr, "IsPowerSaveEnabled"},
- {232, nullptr, "ClearBlockedUsers"},
- {233, nullptr, "GetBlockedUserCount"},
- {234, nullptr, "BlockUserByLocalUserId"},
- {235, nullptr, "BlockUserByNetworkUserId"},
- {236, nullptr, "UnblockUserByLocalUserId"},
- {237, nullptr, "UnblockUserByNetworkUserId"},
- {240, nullptr, "DeleteApplication"},
- {250, nullptr, "InitializeApplicationInfo"},
- {260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"},
- {300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"},
- {301, nullptr, "GetSendDataForDebug"},
- {302, nullptr, "ClearReceiveCounterForDebug"},
- {303, nullptr, "GetNextReceiveCounterForDebug"},
- {304, nullptr, "ListBlockedUsersForDebug"},
- {305, nullptr, "RefreshSendDataIdForDebug"},
- {306, nullptr, "ReloadFwdbgSettingsForDebug"},
- {307, nullptr, "EnableApplicationForDebug"},
- {308, nullptr, "GetNextReceiveCountersForDebug"},
- {309, nullptr, "ListApplicationInfoForDebug"},
- {310, nullptr, "SetApplicationDataForDebug"},
- {400, nullptr, "GetNetworkUserId"},
- {401, nullptr, "DeleteNetworkUserId"},
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"},
+ FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"},
+ FunctionInfo{200, nullptr, "SetSystemData"},
+ FunctionInfo{201, nullptr, "ClearSystemData"},
+ FunctionInfo{203, nullptr, "GetReceivableNeighborInfoCountForSystem"},
+ FunctionInfo{204, nullptr, "ReceiveNeighborInfoForSystem"},
+ FunctionInfo{205, nullptr, "SetSender"},
+ FunctionInfo{206, nullptr, "GetSender"},
+ FunctionInfo{207, nullptr, "CreateScannerForSystem"},
+ FunctionInfo{208, nullptr, "CreateReceiveEventHolderForSystem"},
+ FunctionInfo{223, nullptr, "EnableNeighborDetection"},
+ FunctionInfo{224, nullptr, "DisableNeighborDetection"},
+ FunctionInfo{226, nullptr, "EnablePowerSave"},
+ FunctionInfo{227, nullptr, "DisablePowerSave"},
+ FunctionInfo{228, nullptr, "IsPowerSaveEnabled"},
+ FunctionInfo{232, nullptr, "ClearBlockedUsers"},
+ FunctionInfo{233, nullptr, "GetBlockedUserCount"},
+ FunctionInfo{234, nullptr, "BlockUserByLocalUserId"},
+ FunctionInfo{235, nullptr, "BlockUserByNetworkUserId"},
+ FunctionInfo{236, nullptr, "UnblockUserByLocalUserId"},
+ FunctionInfo{237, nullptr, "UnblockUserByNetworkUserId"},
+ FunctionInfo{240, nullptr, "DeleteApplication"},
+ FunctionInfo{250, nullptr, "InitializeApplicationInfo"},
+ FunctionInfo{260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"},
+ FunctionInfo{300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"},
+ FunctionInfo{301, nullptr, "GetSendDataForDebug"},
+ FunctionInfo{302, nullptr, "ClearReceiveCounterForDebug"},
+ FunctionInfo{303, nullptr, "GetNextReceiveCounterForDebug"},
+ FunctionInfo{304, nullptr, "ListBlockedUsersForDebug"},
+ FunctionInfo{305, nullptr, "RefreshSendDataIdForDebug"},
+ FunctionInfo{306, nullptr, "ReloadFwdbgSettingsForDebug"},
+ FunctionInfo{307, nullptr, "EnableApplicationForDebug"},
+ FunctionInfo{308, nullptr, "GetNextReceiveCountersForDebug"},
+ FunctionInfo{309, nullptr, "ListApplicationInfoForDebug"},
+ FunctionInfo{310, nullptr, "SetApplicationDataForDebug"},
+ FunctionInfo{400, nullptr, "GetNetworkUserId"},
+ FunctionInfo{401, nullptr, "DeleteNetworkUserId"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/friend/friend_interface.cpp b/src/core/hle/service/friend/friend_interface.cpp
deleted file mode 100644
index c8b98b1f0c..0000000000
--- a/src/core/hle/service/friend/friend_interface.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/friend/friend_interface.h"
-
-namespace Service::Friend {
-
-Friend::Friend(std::shared_ptr<Module> module_, Core::System& system_, const char* name)
- : Interface(std::move(module_), system_, name) {
- static const FunctionInfo functions[] = {
- {0, &Friend::CreateFriendService, "CreateFriendService"},
- {1, &Friend::CreateNotificationService, "CreateNotificationService"},
- {2, nullptr, "CreateDaemonSuspendSessionService"},
- };
- RegisterHandlers(functions);
-}
-
-Friend::~Friend() = default;
-
-} // namespace Service::Friend
diff --git a/src/core/hle/service/friend/friend_interface.h b/src/core/hle/service/friend/friend_interface.h
deleted file mode 100644
index 3a2184c347..0000000000
--- a/src/core/hle/service/friend/friend_interface.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/friend/friend.h"
-
-namespace Service::Friend {
-
-class Friend final : public Module::Interface {
-public:
- explicit Friend(std::shared_ptr<Module> module_, Core::System& system_, const char* name);
- ~Friend() override;
-};
-
-} // namespace Service::Friend
diff --git a/src/core/hle/service/glue/arp.cpp b/src/core/hle/service/glue/arp.cpp
index 7eda57ddc3..203adb7ca7 100644
--- a/src/core/hle/service/glue/arp.cpp
+++ b/src/core/hle/service/glue/arp.cpp
@@ -35,22 +35,6 @@ std::optional<u64> GetTitleIDForProcessID(Core::System& system, u64 process_id)
ARP_R::ARP_R(Core::System& system_, const ARPManager& manager_)
: ServiceFramework{system_, "arp:r"}, manager{manager_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"},
- {1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"},
- {2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"},
- {3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"},
- {4, nullptr, "GetApplicationInstanceUnregistrationNotifier"},
- {5, nullptr, "ListApplicationInstanceId"},
- {6, nullptr, "GetMicroApplicationInstanceId"},
- {7, nullptr, "GetApplicationCertificate"},
- {9998, nullptr, "GetPreomiaApplicationLaunchProperty"},
- {9999, nullptr, "GetPreomiaApplicationControlProperty"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ARP_R::~ARP_R() = default;
@@ -164,16 +148,10 @@ public:
using IssuerFn = std::function<Result(u64, ApplicationLaunchProperty, std::vector<u8>)>;
explicit IRegistrar(Core::System& system_, IssuerFn&& issuer)
- : ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IRegistrar::Issue, "Issue"},
- {1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"},
- {2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -238,6 +216,11 @@ private:
rb.Push(ResultSuccess);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IRegistrar::Issue, "Issue"},
+ FunctionInfo{1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"},
+ FunctionInfo{2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"}
+ );
IssuerFn issue_process_id;
bool issued = false;
ApplicationLaunchProperty launch{};
@@ -246,15 +229,6 @@ private:
ARP_W::ARP_W(Core::System& system_, ARPManager& manager_)
: ServiceFramework{system_, "arp:w"}, manager{manager_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"},
- {1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "},
- {2, nullptr, "AcquireUpdater"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ARP_W::~ARP_W() = default;
diff --git a/src/core/hle/service/glue/arp.h b/src/core/hle/service/glue/arp.h
index 5bce801755..de966475f9 100644
--- a/src/core/hle/service/glue/arp.h
+++ b/src/core/hle/service/glue/arp.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -21,6 +24,21 @@ private:
void GetApplicationControlProperty(HLERequestContext& ctx);
void GetApplicationControlPropertyWithApplicationId(HLERequestContext& ctx);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"},
+ FunctionInfo{1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"},
+ FunctionInfo{2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"},
+ FunctionInfo{3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"},
+ FunctionInfo{4, nullptr, "GetApplicationInstanceUnregistrationNotifier"},
+ FunctionInfo{5, nullptr, "ListApplicationInstanceId"},
+ FunctionInfo{6, nullptr, "GetMicroApplicationInstanceId"},
+ FunctionInfo{7, nullptr, "GetApplicationCertificate"},
+ FunctionInfo{9998, nullptr, "GetPreomiaApplicationLaunchProperty"},
+ FunctionInfo{9999, nullptr, "GetPreomiaApplicationControlProperty"}
+ );
const ARPManager& manager;
};
@@ -33,6 +51,14 @@ private:
void AcquireRegistrar(HLERequestContext& ctx);
void UnregisterApplicationInstance(HLERequestContext& ctx);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"},
+ FunctionInfo{1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "},
+ FunctionInfo{2, nullptr, "AcquireUpdater"}
+ );
ARPManager& manager;
std::shared_ptr<IRegistrar> registrar;
};
diff --git a/src/core/hle/service/glue/bgtc.cpp b/src/core/hle/service/glue/bgtc.cpp
index 360f16f0dd..7c7b5ea13c 100644
--- a/src/core/hle/service/glue/bgtc.cpp
+++ b/src/core/hle/service/glue/bgtc.cpp
@@ -11,15 +11,7 @@
namespace Service::Glue {
-BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {100, &BGTC_T::OpenTaskService, "OpenTaskService"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
+BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} {}
BGTC_T::~BGTC_T() = default;
@@ -32,44 +24,11 @@ void BGTC_T::OpenTaskService(HLERequestContext& ctx) {
}
ITaskService::ITaskService(Core::System& system_) : ServiceFramework{system_, "ITaskService"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "NotifyTaskStarting"},
- {2, nullptr, "NotifyTaskFinished"},
- {3, nullptr, "GetTriggerEvent"},
- {4, nullptr, "IsInHalfAwake"},
- {5, nullptr, "NotifyClientName"},
- {6, nullptr, "IsInFullAwake"},
- {11, nullptr, "ScheduleTask"},
- {12, nullptr, "GetScheduledTaskInterval"},
- {13, nullptr, "UnscheduleTask"},
- {14, nullptr, "GetScheduleEvent"},
- {15, nullptr, "SchedulePeriodicTask"},
- {16, nullptr, "Unknown16"},
- {101, nullptr, "GetOperationMode"},
- {102, nullptr, "WillDisconnectNetworkWhenEnteringSleep"},
- {103, nullptr, "WillStayHalfAwakeInsteadSleep"},
- {200, nullptr, "Unknown200"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ITaskService::~ITaskService() = default;
BGTC_SC::BGTC_SC(Core::System& system_) : ServiceFramework{system_, "bgtc:sc"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "GetState"},
- {2, nullptr, "GetStateChangedEvent"},
- {3, nullptr, "NotifyEnteringHalfAwake"},
- {4, nullptr, "NotifyLeavingHalfAwake"},
- {5, nullptr, "SetIsUsingSleepUnsupportedDevices"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
BGTC_SC::~BGTC_SC() = default;
diff --git a/src/core/hle/service/glue/bgtc.h b/src/core/hle/service/glue/bgtc.h
index 5a5d9c9a7a..0ef0ab902f 100644
--- a/src/core/hle/service/glue/bgtc.h
+++ b/src/core/hle/service/glue/bgtc.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -17,18 +20,57 @@ public:
~BGTC_T() override;
void OpenTaskService(HLERequestContext& ctx);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{100, &BGTC_T::OpenTaskService, "OpenTaskService"}
+ );
};
class ITaskService final : public ServiceFramework<ITaskService> {
public:
explicit ITaskService(Core::System& system_);
~ITaskService() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "NotifyTaskStarting"},
+ FunctionInfo{2, nullptr, "NotifyTaskFinished"},
+ FunctionInfo{3, nullptr, "GetTriggerEvent"},
+ FunctionInfo{4, nullptr, "IsInHalfAwake"},
+ FunctionInfo{5, nullptr, "NotifyClientName"},
+ FunctionInfo{6, nullptr, "IsInFullAwake"},
+ FunctionInfo{11, nullptr, "ScheduleTask"},
+ FunctionInfo{12, nullptr, "GetScheduledTaskInterval"},
+ FunctionInfo{13, nullptr, "UnscheduleTask"},
+ FunctionInfo{14, nullptr, "GetScheduleEvent"},
+ FunctionInfo{15, nullptr, "SchedulePeriodicTask"},
+ FunctionInfo{16, nullptr, "Unknown16"},
+ FunctionInfo{101, nullptr, "GetOperationMode"},
+ FunctionInfo{102, nullptr, "WillDisconnectNetworkWhenEnteringSleep"},
+ FunctionInfo{103, nullptr, "WillStayHalfAwakeInsteadSleep"},
+ FunctionInfo{200, nullptr, "Unknown200"}
+ );
};
class BGTC_SC final : public ServiceFramework<BGTC_SC> {
public:
explicit BGTC_SC(Core::System& system_);
~BGTC_SC() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "GetState"},
+ FunctionInfo{2, nullptr, "GetStateChangedEvent"},
+ FunctionInfo{3, nullptr, "NotifyEnteringHalfAwake"},
+ FunctionInfo{4, nullptr, "NotifyLeavingHalfAwake"},
+ FunctionInfo{5, nullptr, "SetIsUsingSleepUnsupportedDevices"}
+ );
};
} // namespace Service::Glue
diff --git a/src/core/hle/service/glue/ectx.cpp b/src/core/hle/service/glue/ectx.cpp
index 322ae45254..80d22a0ca7 100644
--- a/src/core/hle/service/glue/ectx.cpp
+++ b/src/core/hle/service/glue/ectx.cpp
@@ -12,14 +12,10 @@ namespace Service::Glue {
// This is nn::err::context::IContextRegistrar
class IContextRegistrar : public ServiceFramework<IContextRegistrar> {
public:
- IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IContextRegistrar::Complete, "Complete"},
- };
- // clang-format on
+ IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~IContextRegistrar() override = default;
@@ -41,41 +37,21 @@ private:
rb.Push(ResultSuccess);
rb.Push(0);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IContextRegistrar::Complete, "Complete"}
+ );
};
ECTX_W::ECTX_W(Core::System& system_) : ServiceFramework{system_, "ectx:w"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CreateContextRegistrar"},
- {1, nullptr, "CommitContext"},
- {2, nullptr, "RemoveContext"},
- };
- // clang-format on
- RegisterHandlers(functions);
}
ECTX_W::~ECTX_W() = default;
ECTX_R::ECTX_R(Core::System& system_) : ServiceFramework{system_, "ectx:r"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetContextInfo"},
- {1, nullptr, "PullContext"},
- {2, nullptr, "ListContextDescriptorWithResultForDebug"},
- };
- // clang-format on
- RegisterHandlers(functions);
}
ECTX_R::~ECTX_R() = default;
ECTX_AW::ECTX_AW(Core::System& system_) : ServiceFramework{system_, "ectx:aw"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &ECTX_AW::CreateContextRegistrar, "CreateContextRegistrar"},
- {1, nullptr, "CommitContext"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ECTX_AW::~ECTX_AW() = default;
diff --git a/src/core/hle/service/glue/ectx.h b/src/core/hle/service/glue/ectx.h
index ff48075eda..01f109c609 100644
--- a/src/core/hle/service/glue/ectx.h
+++ b/src/core/hle/service/glue/ectx.h
@@ -18,12 +18,30 @@ class ECTX_W final : public ServiceFramework<ECTX_W> {
public:
explicit ECTX_W(Core::System& system_);
~ECTX_W() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateContextRegistrar"},
+ FunctionInfo{1, nullptr, "CommitContext"},
+ FunctionInfo{2, nullptr, "RemoveContext"}
+ );
};
class ECTX_R final : public ServiceFramework<ECTX_R> {
public:
explicit ECTX_R(Core::System& system_);
~ECTX_R() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetContextInfo"},
+ FunctionInfo{1, nullptr, "PullContext"},
+ FunctionInfo{2, nullptr, "ListContextDescriptorWithResultForDebug"}
+ );
};
class ECTX_AW final : public ServiceFramework<ECTX_AW> {
@@ -33,6 +51,14 @@ public:
private:
void CreateContextRegistrar(HLERequestContext& ctx);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ECTX_AW::CreateContextRegistrar, "CreateContextRegistrar"},
+ FunctionInfo{1, nullptr, "CommitContext"}
+ );
};
} // namespace Service::Glue
diff --git a/src/core/hle/service/glue/notif.cpp b/src/core/hle/service/glue/notif.cpp
index 716e4da32d..a369b78ddd 100644
--- a/src/core/hle/service/glue/notif.cpp
+++ b/src/core/hle/service/glue/notif.cpp
@@ -17,9 +17,45 @@
namespace Service::Glue {
namespace {
-
constexpr inline std::size_t MaxAlarms = 8;
+}
+
+std::optional<ServiceFrameworkBase::FunctionInfoBase> INotificationServicesForApplication::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{500, D<&INotificationServicesForApplication::RegisterAlarmSetting>, "RegisterAlarmSetting"},
+ FunctionInfo{510, D<&INotificationServicesForApplication::UpdateAlarmSetting>, "UpdateAlarmSetting"},
+ FunctionInfo{520, D<&INotificationServicesForApplication::ListAlarmSettings>, "ListAlarmSettings"},
+ FunctionInfo{530, D<&INotificationServicesForApplication::LoadApplicationParameter>, "LoadApplicationParameter"},
+ FunctionInfo{540, D<&INotificationServicesForApplication::DeleteAlarmSetting>, "DeleteAlarmSetting"},
+ FunctionInfo{1000, D<&INotificationServicesForApplication::Initialize>, "Initialize"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+std::optional<ServiceFrameworkBase::FunctionInfoBase> INotificationServices::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{500, D<&INotificationServices::RegisterAlarmSetting>, "RegisterAlarmSetting"},
+ FunctionInfo{510, D<&INotificationServices::UpdateAlarmSetting>, "UpdateAlarmSetting"},
+ FunctionInfo{520, D<&INotificationServices::ListAlarmSettings>, "ListAlarmSettings"},
+ FunctionInfo{530, D<&INotificationServices::LoadApplicationParameter>, "LoadApplicationParameter"},
+ FunctionInfo{540, D<&INotificationServices::DeleteAlarmSetting>, "DeleteAlarmSetting"},
+ FunctionInfo{1000, D<&INotificationServices::Initialize>, "Initialize"},
+ FunctionInfo{1010, nullptr, "ListNotifications"},
+ FunctionInfo{1020, nullptr, "DeleteNotification"},
+ FunctionInfo{1030, nullptr, "ClearNotifications"},
+ FunctionInfo{1040, D<&INotificationServices::OpenNotificationSystemEventAccessor>, "OpenNotificationSystemEventAccessor"},
+ FunctionInfo{1500, nullptr, "SetNotificationPresentationSetting"},
+ FunctionInfo{1510, D<&INotificationServices::GetNotificationPresentationSetting>, "GetNotificationPresentationSetting"},
+ FunctionInfo{2000, nullptr, "GetAlarmSetting"},
+ FunctionInfo{2001, nullptr, "GetAlarmSettingWithApplicationParameter"},
+ FunctionInfo{2010, nullptr, "MuteAlarmSetting"},
+ FunctionInfo{2020, nullptr, "IsAlarmSettingReady"},
+ FunctionInfo{8000, nullptr, "RegisterAppletResourceUserId"},
+ FunctionInfo{8010, nullptr, "UnregisterAppletResourceUserId"},
+ FunctionInfo{8999, nullptr, "GetCurrentTime"},
+ FunctionInfo{9000, nullptr, "GetAlarmSettingNextNotificationTime"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
}
Result NotificationServiceImpl::RegisterAlarmSetting(AlarmSettingId* out_alarm_setting_id,
@@ -124,18 +160,6 @@ std::vector<AlarmSetting>::iterator NotificationServiceImpl::GetAlarmFromId(Alar
INotificationServicesForApplication::INotificationServicesForApplication(Core::System& system_)
: ServiceFramework{system_, "notif:a"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {500, D<&INotificationServicesForApplication::RegisterAlarmSetting>, "RegisterAlarmSetting"},
- {510, D<&INotificationServicesForApplication::UpdateAlarmSetting>, "UpdateAlarmSetting"},
- {520, D<&INotificationServicesForApplication::ListAlarmSettings>, "ListAlarmSettings"},
- {530, D<&INotificationServicesForApplication::LoadApplicationParameter>, "LoadApplicationParameter"},
- {540, D<&INotificationServicesForApplication::DeleteAlarmSetting>, "DeleteAlarmSetting"},
- {1000, D<&INotificationServicesForApplication::Initialize>, "Initialize"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
INotificationServicesForApplication::~INotificationServicesForApplication() = default;
@@ -178,18 +202,13 @@ class INotificationSystemEventAccessor final
: public ServiceFramework<INotificationSystemEventAccessor> {
public:
explicit INotificationSystemEventAccessor(Core::System& system_)
- : ServiceFramework{system_, "INotificationSystemEventAccessor"},
- service_context{system_, "INotificationSystemEventAccessor"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
- notification_event =
- service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent");
+ : ServiceFramework{system_, "INotificationSystemEventAccessor"}
+ , service_context{system_, "INotificationSystemEventAccessor"} {
+ notification_event = service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent");
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~INotificationSystemEventAccessor() {
@@ -204,38 +223,15 @@ private:
R_SUCCEED();
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"}
+ );
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* notification_event;
};
INotificationServices::INotificationServices(Core::System& system_)
: ServiceFramework{system_, "notif:s"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {500, D<&INotificationServices::RegisterAlarmSetting>, "RegisterAlarmSetting"},
- {510, D<&INotificationServices::UpdateAlarmSetting>, "UpdateAlarmSetting"},
- {520, D<&INotificationServices::ListAlarmSettings>, "ListAlarmSettings"},
- {530, D<&INotificationServices::LoadApplicationParameter>, "LoadApplicationParameter"},
- {540, D<&INotificationServices::DeleteAlarmSetting>, "DeleteAlarmSetting"},
- {1000, D<&INotificationServices::Initialize>, "Initialize"},
- {1010, nullptr, "ListNotifications"},
- {1020, nullptr, "DeleteNotification"},
- {1030, nullptr, "ClearNotifications"},
- {1040, D<&INotificationServices::OpenNotificationSystemEventAccessor>, "OpenNotificationSystemEventAccessor"},
- {1500, nullptr, "SetNotificationPresentationSetting"},
- {1510, D<&INotificationServices::GetNotificationPresentationSetting>, "GetNotificationPresentationSetting"},
- {2000, nullptr, "GetAlarmSetting"},
- {2001, nullptr, "GetAlarmSettingWithApplicationParameter"},
- {2010, nullptr, "MuteAlarmSetting"},
- {2020, nullptr, "IsAlarmSettingReady"},
- {8000, nullptr, "RegisterAppletResourceUserId"},
- {8010, nullptr, "UnregisterAppletResourceUserId"},
- {8999, nullptr, "GetCurrentTime"},
- {9000, nullptr, "GetAlarmSettingNextNotificationTime"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
INotificationServices::~INotificationServices() = default;
diff --git a/src/core/hle/service/glue/notif.h b/src/core/hle/service/glue/notif.h
index ef2522fdfb..c5367e5da4 100644
--- a/src/core/hle/service/glue/notif.h
+++ b/src/core/hle/service/glue/notif.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -98,6 +101,7 @@ private:
Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id);
Result Initialize(ClientAppletResourceUserId aruid);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
NotificationServiceImpl impl;
};
@@ -127,6 +131,7 @@ private:
Out<NotificationPresentationSetting> out_notification_presentation_setting,
NotificationChannel notification_channel);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
NotificationServiceImpl impl;
};
} // namespace Service::Glue
diff --git a/src/core/hle/service/glue/time/static.cpp b/src/core/hle/service/glue/time/static.cpp
index d8672b7248..dc7651fd1f 100644
--- a/src/core/hle/service/glue/time/static.cpp
+++ b/src/core/hle/service/glue/time/static.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -21,42 +24,42 @@
namespace Service::Glue::Time {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> StaticService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
+ FunctionInfo{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
+ FunctionInfo{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
+ FunctionInfo{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
+ FunctionInfo{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
+ FunctionInfo{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
+ FunctionInfo{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
+ FunctionInfo{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
+ FunctionInfo{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
+ FunctionInfo{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
+ FunctionInfo{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
+ FunctionInfo{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
+ FunctionInfo{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
+ FunctionInfo{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
+ FunctionInfo{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
+ FunctionInfo{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
+ FunctionInfo{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
+ FunctionInfo{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
+ FunctionInfo{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
StaticService::StaticService(Core::System& system_,
Service::PSC::Time::StaticServiceSetupInfo setup_info,
std::shared_ptr<TimeManager> time, const char* name)
- : ServiceFramework{system_, name}, m_system{system_}, m_time_m{time->m_time_m},
+ : ServiceFramework{system_, name}, m_time_m{time->m_time_m},
m_setup_info{setup_info}, m_time_sm{time->m_time_sm},
m_file_timestamp_worker{time->m_file_timestamp_worker},
m_standard_steady_clock_resource{time->m_steady_clock_resource},
m_time_zone_binary{time->m_time_zone_binary} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
- {1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
- {2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
- {3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
- {4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
- {5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
- {20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
- {50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
- {51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
- {100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
- {101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
- {102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
- {200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
- {201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
- {300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
- {400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
- {401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
- {500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
- {501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
m_set_sys =
- m_system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
+ system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
if (m_setup_info.can_write_local_clock && m_setup_info.can_write_user_clock &&
!m_setup_info.can_write_network_clock && m_setup_info.can_write_timezone_device_location &&
@@ -106,7 +109,7 @@ Result StaticService::GetTimeZoneService(OutInterface<TimeZoneService> out_servi
LOG_DEBUG(Service_Time, "called.");
*out_service = std::make_shared<TimeZoneService>(
- m_system, m_file_timestamp_worker, m_setup_info.can_write_timezone_device_location,
+ system, m_file_timestamp_worker, m_setup_info.can_write_timezone_device_location,
m_time_zone_binary, m_time_zone);
R_SUCCEED();
}
diff --git a/src/core/hle/service/glue/time/static.h b/src/core/hle/service/glue/time/static.h
index 7bb0e0b36e..5856553461 100644
--- a/src/core/hle/service/glue/time/static.h
+++ b/src/core/hle/service/glue/time/static.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -69,12 +72,11 @@ public:
Result CalculateSpanBetween(Out<s64> out_time, InClockSnapshot a, InClockSnapshot b);
private:
- Core::System& m_system;
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
std::shared_ptr<Service::PSC::Time::ServiceManager> m_time_m;
std::shared_ptr<Service::PSC::Time::StaticService> m_wrapped_service;
-
Service::PSC::Time::StaticServiceSetupInfo m_setup_info;
std::shared_ptr<Service::PSC::Time::StaticService> m_time_sm;
std::shared_ptr<Service::PSC::Time::TimeZoneService> m_time_zone;
diff --git a/src/core/hle/service/glue/time/time_zone.cpp b/src/core/hle/service/glue/time/time_zone.cpp
index 52bd651f2b..6e861b4060 100644
--- a/src/core/hle/service/glue/time/time_zone.cpp
+++ b/src/core/hle/service/glue/time/time_zone.cpp
@@ -19,6 +19,26 @@
namespace Service::Glue::Time {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> TimeZoneService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"},
+ FunctionInfo{1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"},
+ FunctionInfo{2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"},
+ FunctionInfo{3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"},
+ FunctionInfo{4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"},
+ FunctionInfo{5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"},
+ FunctionInfo{6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"},
+ FunctionInfo{7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"},
+ FunctionInfo{8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"},
+ FunctionInfo{20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"},
+ FunctionInfo{100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"},
+ FunctionInfo{101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"},
+ FunctionInfo{201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"},
+ FunctionInfo{202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
TimeZoneService::TimeZoneService(
Core::System& system_, FileTimestampWorker& file_timestamp_worker,
bool can_write_timezone_device_location, TimeZoneBinary& time_zone_binary,
@@ -30,26 +50,6 @@ TimeZoneService::TimeZoneService(
, m_operation_event{system}
, m_time_zone_binary{time_zone_binary}
{
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"},
- {1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"},
- {2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"},
- {3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"},
- {4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"},
- {5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"},
- {6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"},
- {7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"},
- {8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"},
- {20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"},
- {100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"},
- {101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"},
- {201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"},
- {202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"},
- };
- // clang-format on
- RegisterHandlers(functions);
-
m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
}
diff --git a/src/core/hle/service/glue/time/time_zone.h b/src/core/hle/service/glue/time/time_zone.h
index 635070263b..839d823e67 100644
--- a/src/core/hle/service/glue/time/time_zone.h
+++ b/src/core/hle/service/glue/time/time_zone.h
@@ -80,6 +80,7 @@ public:
const Service::PSC::Time::CalendarTime& calendar_time);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
bool m_can_write_timezone_device_location;
FileTimestampWorker& m_file_timestamp_worker;
diff --git a/src/core/hle/service/gpio/gpio.cpp b/src/core/hle/service/gpio/gpio.cpp
index 8b4aa0f5ab..5441149c65 100644
--- a/src/core/hle/service/gpio/gpio.cpp
+++ b/src/core/hle/service/gpio/gpio.cpp
@@ -13,15 +13,15 @@ namespace Service::GPIO {
class GPIO final : public ServiceFramework<GPIO> {
public:
- explicit GPIO(Core::System& system_)
- : ServiceFramework{system_, "gpio"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "Cmd0"},
- };
- RegisterHandlers(functions);
- }
+ explicit GPIO(Core::System& system_) : ServiceFramework{system_, "gpio"} {}
~GPIO() override = default;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Cmd0"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/grc/grc.cpp b/src/core/hle/service/grc/grc.cpp
index e8e901662d..5f6c84e914 100644
--- a/src/core/hle/service/grc/grc.cpp
+++ b/src/core/hle/service/grc/grc.cpp
@@ -14,32 +14,31 @@ namespace Service::GRC {
class GRC final : public ServiceFramework<GRC> {
public:
- explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "OpenContinuousRecorder"},
- {2, nullptr, "OpenGameMovieTrimmer"},
- {3, nullptr, "OpenOffscreenRecorder"},
- {101, nullptr, "CreateMovieMaker"},
- {9903, nullptr, "SetOffscreenRecordingMarker"}
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "OpenContinuousRecorder"},
+ FunctionInfo{2, nullptr, "OpenGameMovieTrimmer"},
+ FunctionInfo{3, nullptr, "OpenOffscreenRecorder"},
+ FunctionInfo{101, nullptr, "CreateMovieMaker"},
+ FunctionInfo{9903, nullptr, "SetOffscreenRecordingMarker"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class GRC_D final : public ServiceFramework<GRC_D> {
public:
- explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "Initialize"},
- {2, nullptr, "Transfer"},
- {3, nullptr, "Cmd3"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "Initialize"},
+ FunctionInfo{2, nullptr, "Transfer"},
+ FunctionInfo{3, nullptr, "Cmd3"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/hid/active_vibration_device_list.cpp b/src/core/hle/service/hid/active_vibration_device_list.cpp
index e0d6d3f2d9..7a4f4cce2c 100644
--- a/src/core/hle/service/hid/active_vibration_device_list.cpp
+++ b/src/core/hle/service/hid/active_vibration_device_list.cpp
@@ -14,16 +14,16 @@
namespace Service::HID {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IActiveVibrationDeviceList::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IActiveVibrationDeviceList::IActiveVibrationDeviceList(Core::System& system_,
std::shared_ptr<ResourceManager> resource)
: ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IActiveVibrationDeviceList::~IActiveVibrationDeviceList() = default;
diff --git a/src/core/hle/service/hid/active_vibration_device_list.h b/src/core/hle/service/hid/active_vibration_device_list.h
index beaa44d97a..57c31a8df1 100644
--- a/src/core/hle/service/hid/active_vibration_device_list.h
+++ b/src/core/hle/service/hid/active_vibration_device_list.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -26,8 +29,8 @@ public:
private:
static constexpr std::size_t MaxVibrationDevicesHandles{0x100};
-
Result ActivateVibrationDevice(Core::HID::VibrationDeviceHandle vibration_device_handle);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
mutable std::mutex mutex;
std::size_t list_size{};
diff --git a/src/core/hle/service/hid/applet_resource.cpp b/src/core/hle/service/hid/applet_resource.cpp
index 44ae767841..6f658fa875 100644
--- a/src/core/hle/service/hid/applet_resource.cpp
+++ b/src/core/hle/service/hid/applet_resource.cpp
@@ -12,14 +12,17 @@
namespace Service::HID {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAppletResource::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IAppletResource::GetSharedMemoryHandle>, "GetSharedMemoryHandle"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAppletResource::IAppletResource(Core::System& system_, std::shared_ptr<ResourceManager> resource,
u64 applet_resource_user_id)
: ServiceFramework{system_, "IAppletResource"}, aruid{applet_resource_user_id},
resource_manager{resource} {
- static const FunctionInfo functions[] = {
- {0, C<&IAppletResource::GetSharedMemoryHandle>, "GetSharedMemoryHandle"},
- };
- RegisterHandlers(functions);
}
IAppletResource::~IAppletResource() {
diff --git a/src/core/hle/service/hid/applet_resource.h b/src/core/hle/service/hid/applet_resource.h
index d1e7db9b1e..7b5d915218 100644
--- a/src/core/hle/service/hid/applet_resource.h
+++ b/src/core/hle/service/hid/applet_resource.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -29,6 +32,7 @@ public:
private:
Result GetSharedMemoryHandle(OutCopyHandle<Kernel::KSharedMemory> out_shared_memory_handle);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
u64 aruid{};
std::shared_ptr<ResourceManager> resource_manager;
};
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 25096ff36f..0ea587312b 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -16,19 +16,24 @@
#include "core/hle/service/server_manager.h"
#include "hid_core/resource_manager.h"
#include "hid_core/resources/hid_firmware_settings.h"
+#include "core/hle/service/ipc_helpers.h"
+#include "hid_core/hid_types.h"
+#include "hid_core/resources/touch_screen/gesture.h"
+#include "hid_core/resources/touch_screen/touch_screen.h"
+#include "core/hle/service/cmif_serialization.h"
namespace Service::HID {
class IHidTemporaryServer final : public ServiceFramework<IHidTemporaryServer> {
public:
explicit IHidTemporaryServer(Core::System& system_)
- : ServiceFramework{system_, "hid:tmp"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "hid:tmp"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~IHidTemporaryServer() override = default;
};
@@ -36,17 +41,17 @@ public:
class AHID_CD final : public ServiceFramework<AHID_CD> {
public:
explicit AHID_CD(Core::System& system_)
- : ServiceFramework{system_, "ahid:cd"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "AcquireDevice"},
- {1, nullptr, "ReleaseDevice"},
- {2, nullptr, "GetCtrlSession"},
- {3, nullptr, "GetReadSession"},
- {4, nullptr, "GetWriteSession"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "ahid:cd"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "AcquireDevice"},
+ FunctionInfo{1, nullptr, "ReleaseDevice"},
+ FunctionInfo{2, nullptr, "GetCtrlSession"},
+ FunctionInfo{3, nullptr, "GetReadSession"},
+ FunctionInfo{4, nullptr, "GetWriteSession"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~AHID_CD() override = default;
};
@@ -54,22 +59,322 @@ public:
class AHID_HDR final : public ServiceFramework<AHID_HDR> {
public:
explicit AHID_HDR(Core::System& system_)
- : ServiceFramework{system_, "ahid:hdr"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetDeviceEntries"},
- {1, nullptr, "GetDeviceList"},
- {2, nullptr, "GetDeviceParameters"},
- {3, nullptr, "AttachDevice"},
- {4, nullptr, "DetachDevice"},
- {5, nullptr, "SetDeviceFilter"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "ahid:hdr"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetDeviceEntries"},
+ FunctionInfo{1, nullptr, "GetDeviceList"},
+ FunctionInfo{2, nullptr, "GetDeviceParameters"},
+ FunctionInfo{3, nullptr, "AttachDevice"},
+ FunctionInfo{4, nullptr, "DetachDevice"},
+ FunctionInfo{5, nullptr, "SetDeviceFilter"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~AHID_HDR() override = default;
};
+class IHidDebugServer final : public ServiceFramework<IHidDebugServer> {
+public:
+ explicit IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
+ std::shared_ptr<HidFirmwareSettings> settings)
+ : ServiceFramework{system_, "hid:dbg"}
+ , resource_manager{resource}
+ , firmware_settings{settings}
+ {}
+
+ ~IHidDebugServer() override = default;
+
+ Result DeactivateTouchScreen() {
+ LOG_INFO(Service_HID, "called");
+
+ if (!firmware_settings->IsDeviceManaged()) {
+ R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate());
+ }
+
+ R_SUCCEED();
+ }
+
+ Result SetTouchScreenAutoPilotState(
+ InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer) {
+ AutoPilotState auto_pilot{};
+
+ auto_pilot.count =
+ static_cast<u64>((std::min)(auto_pilot_buffer.size(), auto_pilot.state.size()));
+ memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(),
+ auto_pilot.count * sizeof(TouchState));
+
+ LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count);
+
+ R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot));
+ }
+
+ Result UnsetTouchScreenAutoPilotState() {
+ LOG_INFO(Service_HID, "called");
+ R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState());
+ }
+
+ Result GetTouchScreenConfiguration(
+ Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config,
+ ClientAppletResourceUserId aruid) {
+ LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid);
+
+ R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration(
+ *out_touchscreen_config, aruid.pid));
+
+ if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 &&
+ out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) {
+ out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting;
+ }
+
+ R_SUCCEED();
+ }
+
+ Result ProcessTouchScreenAutoTune() {
+ LOG_INFO(Service_HID, "called");
+ R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune());
+ }
+
+ Result ForceStopTouchScreenManagement() {
+ LOG_INFO(Service_HID, "called");
+
+ if (!firmware_settings->IsDeviceManaged()) {
+ R_SUCCEED();
+ }
+
+ auto touch_screen = GetResourceManager()->GetTouchScreen();
+ auto gesture = GetResourceManager()->GetGesture();
+
+ if (firmware_settings->IsTouchI2cManaged()) {
+ bool is_touch_active{};
+ bool is_gesture_active{};
+ R_TRY(touch_screen->IsActive(is_touch_active));
+ R_TRY(gesture->IsActive(is_gesture_active));
+
+ if (is_touch_active) {
+ R_TRY(touch_screen->Deactivate());
+ }
+ if (is_gesture_active) {
+ R_TRY(gesture->Deactivate());
+ }
+ }
+
+ R_SUCCEED();
+ }
+
+ Result ForceRestartTouchScreenManagement(u32 basic_gesture_id,
+ ClientAppletResourceUserId aruid) {
+ LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}",
+ basic_gesture_id, aruid.pid);
+
+ auto touch_screen = GetResourceManager()->GetTouchScreen();
+ auto gesture = GetResourceManager()->GetGesture();
+
+ if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) {
+ R_TRY(gesture->Activate());
+ R_TRY(gesture->Activate(aruid.pid, basic_gesture_id));
+ R_TRY(touch_screen->Activate());
+ R_TRY(touch_screen->Activate(aruid.pid));
+ }
+
+ R_SUCCEED();
+ }
+
+ Result IsTouchScreenManaged(Out<bool> out_is_managed) {
+ LOG_INFO(Service_HID, "called");
+
+ bool is_touch_active{};
+ bool is_gesture_active{};
+ R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active));
+ R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active));
+
+ *out_is_managed = is_touch_active || is_gesture_active;
+ R_SUCCEED();
+ }
+
+ Result DeactivateGesture() {
+ LOG_INFO(Service_HID, "called");
+
+ if (!firmware_settings->IsDeviceManaged()) {
+ R_RETURN(GetResourceManager()->GetGesture()->Deactivate());
+ }
+
+ R_SUCCEED();
+ }
+
+ std::shared_ptr<ResourceManager> GetResourceManager() {
+ resource_manager->Initialize();
+ return resource_manager;
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "DeactivateDebugPad"},
+ FunctionInfo{1, nullptr, "SetDebugPadAutoPilotState"},
+ FunctionInfo{2, nullptr, "UnsetDebugPadAutoPilotState"},
+ FunctionInfo{10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"},
+ FunctionInfo{11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"},
+ FunctionInfo{12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"},
+ FunctionInfo{13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"},
+ FunctionInfo{14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"},
+ FunctionInfo{15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"},
+ FunctionInfo{16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"},
+ FunctionInfo{17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"},
+ FunctionInfo{20, nullptr, "DeactivateMouse"},
+ FunctionInfo{21, nullptr, "SetMouseAutoPilotState"},
+ FunctionInfo{22, nullptr, "UnsetMouseAutoPilotState"},
+ FunctionInfo{23, nullptr, "AddMouseSideWheelDelta"},
+ FunctionInfo{25, nullptr, "SetDebugMouseAutoPilotState"},
+ FunctionInfo{26, nullptr, "UnsetDebugMouseAutoPilotState"},
+ FunctionInfo{30, nullptr, "DeactivateKeyboard"},
+ FunctionInfo{31, nullptr, "SetKeyboardAutoPilotState"},
+ FunctionInfo{32, nullptr, "UnsetKeyboardAutoPilotState"},
+ FunctionInfo{50, nullptr, "DeactivateXpad"},
+ FunctionInfo{51, nullptr, "SetXpadAutoPilotState"},
+ FunctionInfo{52, nullptr, "UnsetXpadAutoPilotState"},
+ FunctionInfo{53, nullptr, "DeactivateJoyXpad"},
+ FunctionInfo{60, nullptr, "ClearNpadSystemCommonPolicy"},
+ FunctionInfo{61, nullptr, "DeactivateNpad"},
+ FunctionInfo{62, nullptr, "ForceDisconnectNpad"},
+ FunctionInfo{91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"},
+ FunctionInfo{110, nullptr, "DeactivateHomeButton"},
+ FunctionInfo{111, nullptr, "SetHomeButtonAutoPilotState"},
+ FunctionInfo{112, nullptr, "UnsetHomeButtonAutoPilotState"},
+ FunctionInfo{120, nullptr, "DeactivateSleepButton"},
+ FunctionInfo{121, nullptr, "SetSleepButtonAutoPilotState"},
+ FunctionInfo{122, nullptr, "UnsetSleepButtonAutoPilotState"},
+ FunctionInfo{123, nullptr, "DeactivateInputDetector"},
+ FunctionInfo{130, nullptr, "DeactivateCaptureButton"},
+ FunctionInfo{131, nullptr, "SetCaptureButtonAutoPilotState"},
+ FunctionInfo{132, nullptr, "UnsetCaptureButtonAutoPilotState"},
+ FunctionInfo{133, nullptr, "SetShiftAccelerometerCalibrationValue"},
+ FunctionInfo{134, nullptr, "GetShiftAccelerometerCalibrationValue"},
+ FunctionInfo{135, nullptr, "SetShiftGyroscopeCalibrationValue"},
+ FunctionInfo{136, nullptr, "GetShiftGyroscopeCalibrationValue"},
+ FunctionInfo{140, nullptr, "DeactivateConsoleSixAxisSensor"},
+ FunctionInfo{141, nullptr, "GetConsoleSixAxisSensorSamplingFrequency"},
+ FunctionInfo{142, nullptr, "DeactivateSevenSixAxisSensor"},
+ FunctionInfo{143, nullptr, "GetConsoleSixAxisSensorCountStates"},
+ FunctionInfo{144, nullptr, "GetAccelerometerFsr"},
+ FunctionInfo{145, nullptr, "SetAccelerometerFsr"},
+ FunctionInfo{146, nullptr, "GetAccelerometerOdr"},
+ FunctionInfo{147, nullptr, "SetAccelerometerOdr"},
+ FunctionInfo{148, nullptr, "GetGyroscopeFsr"},
+ FunctionInfo{149, nullptr, "SetGyroscopeFsr"},
+ FunctionInfo{150, nullptr, "GetGyroscopeOdr"},
+ FunctionInfo{151, nullptr, "SetGyroscopeOdr"},
+ FunctionInfo{152, nullptr, "GetWhoAmI"},
+ FunctionInfo{201, nullptr, "ActivateFirmwareUpdate"},
+ FunctionInfo{202, nullptr, "DeactivateFirmwareUpdate"},
+ FunctionInfo{203, nullptr, "StartFirmwareUpdate"},
+ FunctionInfo{204, nullptr, "GetFirmwareUpdateStage"},
+ FunctionInfo{205, nullptr, "GetFirmwareVersion"},
+ FunctionInfo{206, nullptr, "GetDestinationFirmwareVersion"},
+ FunctionInfo{207, nullptr, "DiscardFirmwareInfoCacheForRevert"},
+ FunctionInfo{208, nullptr, "StartFirmwareUpdateForRevert"},
+ FunctionInfo{209, nullptr, "GetAvailableFirmwareVersionForRevert"},
+ FunctionInfo{210, nullptr, "IsFirmwareUpdatingDevice"},
+ FunctionInfo{211, nullptr, "StartFirmwareUpdateIndividual"},
+ FunctionInfo{212, nullptr, "GetDetailFirmwareVersion", MakeVersionGate({19,0,0})},
+ FunctionInfo{215, nullptr, "SetUsbFirmwareForceUpdateEnabled"},
+ FunctionInfo{216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"},
+ FunctionInfo{221, nullptr, "UpdateControllerColor"},
+ FunctionInfo{222, nullptr, "ConnectUsbPadsAsync"},
+ FunctionInfo{223, nullptr, "DisconnectUsbPadsAsync"},
+ FunctionInfo{224, nullptr, "UpdateDesignInfo"},
+ FunctionInfo{225, nullptr, "GetUniquePadDriverState"},
+ FunctionInfo{226, nullptr, "GetSixAxisSensorDriverStates"},
+ FunctionInfo{227, nullptr, "GetRxPacketHistory"},
+ FunctionInfo{228, nullptr, "AcquireOperationEventHandle"},
+ FunctionInfo{229, nullptr, "ReadSerialFlash"},
+ FunctionInfo{230, nullptr, "WriteSerialFlash"},
+ FunctionInfo{231, nullptr, "GetOperationResult"},
+ FunctionInfo{232, nullptr, "EnableShipmentMode"},
+ FunctionInfo{233, nullptr, "ClearPairingInfo"},
+ FunctionInfo{234, nullptr, "GetUniquePadDeviceTypeSetInternal"},
+ FunctionInfo{235, nullptr, "EnableAnalogStickPower"},
+ FunctionInfo{236, nullptr, "RequestKuinaUartClockCal"},
+ FunctionInfo{237, nullptr, "GetKuinaUartClockCal"},
+ FunctionInfo{238, nullptr, "SetKuinaUartClockTrim"},
+ FunctionInfo{239, nullptr, "KuinaLoopbackTest"},
+ FunctionInfo{240, nullptr, "RequestBatteryVoltage"},
+ FunctionInfo{241, nullptr, "GetBatteryVoltage"},
+ FunctionInfo{242, nullptr, "GetUniquePadPowerInfo"},
+ FunctionInfo{243, nullptr, "RebootUniquePad"},
+ FunctionInfo{244, nullptr, "RequestKuinaFirmwareVersion"},
+ FunctionInfo{245, nullptr, "GetKuinaFirmwareVersion"},
+ FunctionInfo{246, nullptr, "GetVidPid"},
+ FunctionInfo{247, nullptr, "GetAnalogStickCalibrationValue"},
+ FunctionInfo{248, nullptr, "GetUniquePadIdsFull"},
+ FunctionInfo{249, nullptr, "ConnectUniquePad"},
+ FunctionInfo{250, nullptr, "IsVirtual"},
+ FunctionInfo{251, nullptr, "GetAnalogStickModuleParam"},
+ FunctionInfo{253, nullptr, "ClearStorageForShipment", MakeVersionGate({19,0,0})},
+ FunctionInfo{261, nullptr, "UpdateDesignInfo12", MakeVersionGate({21,0,0})},
+ FunctionInfo{262, nullptr, "GetUniquePadButtonCount", MakeVersionGate({21,0,0})},
+ FunctionInfo{267, nullptr, "SetAnalogStickCalibration", MakeVersionGate({21,0,0})},
+ FunctionInfo{268, nullptr, "ResetAnalogStickCalibration", MakeVersionGate({21,0,0})},
+ FunctionInfo{301, nullptr, "GetAbstractedPadHandles"},
+ FunctionInfo{302, nullptr, "GetAbstractedPadState"},
+ FunctionInfo{303, nullptr, "GetAbstractedPadsState"},
+ FunctionInfo{321, nullptr, "SetAutoPilotVirtualPadState"},
+ FunctionInfo{322, nullptr, "UnsetAutoPilotVirtualPadState"},
+ FunctionInfo{323, nullptr, "UnsetAllAutoPilotVirtualPadState"},
+ FunctionInfo{324, nullptr, "AttachHdlsWorkBuffer"},
+ FunctionInfo{325, nullptr, "ReleaseHdlsWorkBuffer"},
+ FunctionInfo{326, nullptr, "DumpHdlsNpadAssignmentState"},
+ FunctionInfo{327, nullptr, "DumpHdlsStates"},
+ FunctionInfo{328, nullptr, "ApplyHdlsNpadAssignmentState"},
+ FunctionInfo{329, nullptr, "ApplyHdlsStateList"},
+ FunctionInfo{330, nullptr, "AttachHdlsVirtualDevice"},
+ FunctionInfo{331, nullptr, "DetachHdlsVirtualDevice"},
+ FunctionInfo{332, nullptr, "SetHdlsState"},
+ FunctionInfo{350, nullptr, "AddRegisteredDevice"},
+ FunctionInfo{351, nullptr, "GetRegisteredDevicesCountDebug", MakeVersionGate({17,0,0}, {18,1,0})},
+ FunctionInfo{352, nullptr, "DeleteRegisteredDevicesDebug", MakeVersionGate({17,0,0}, {18,1,0})},
+ FunctionInfo{400, nullptr, "DisableExternalMcuOnNxDevice"},
+ FunctionInfo{401, nullptr, "DisableRailDeviceFiltering"},
+ FunctionInfo{402, nullptr, "EnableWiredPairing"},
+ FunctionInfo{403, nullptr, "EnableShipmentModeAutoClear"},
+ FunctionInfo{404, nullptr, "SetRailEnabled"},
+ FunctionInfo{500, nullptr, "SetFactoryInt"},
+ FunctionInfo{501, nullptr, "IsFactoryBootEnabled"},
+ FunctionInfo{550, nullptr, "SetAnalogStickModelDataTemporarily"},
+ FunctionInfo{551, nullptr, "GetAnalogStickModelData"},
+ FunctionInfo{552, nullptr, "ResetAnalogStickModelData"},
+ FunctionInfo{600, nullptr, "ConvertPadState"},
+ FunctionInfo{601, nullptr, "IsButtonConfigSupported", MakeVersionGate({18,0,0})},
+ FunctionInfo{602, nullptr, "IsButtonConfigEmbeddedSupported", MakeVersionGate({18,0,0})},
+ FunctionInfo{603, nullptr, "DeleteButtonConfig", MakeVersionGate({18,0,0})},
+ FunctionInfo{604, nullptr, "DeleteButtonConfigEmbedded", MakeVersionGate({18,0,0})},
+ FunctionInfo{605, nullptr, "SetButtonConfigEnabled", MakeVersionGate({18,0,0})},
+ FunctionInfo{606, nullptr, "SetButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})},
+ FunctionInfo{607, nullptr, "IsButtonConfigEnabled", MakeVersionGate({18,0,0})},
+ FunctionInfo{608, nullptr, "IsButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})},
+ FunctionInfo{609, nullptr, "SetButtonConfigEmbedded", MakeVersionGate({18,0,0})},
+ FunctionInfo{610, nullptr, "SetButtonConfigFull", MakeVersionGate({18,0,0})},
+ FunctionInfo{611, nullptr, "SetButtonConfigLeft", MakeVersionGate({18,0,0})},
+ FunctionInfo{612, nullptr, "SetButtonConfigRight", MakeVersionGate({18,0,0})},
+ FunctionInfo{613, nullptr, "GetButtonConfigEmbedded", MakeVersionGate({18,0,0})},
+ FunctionInfo{614, nullptr, "GetButtonConfigFull", MakeVersionGate({18,0,0})},
+ FunctionInfo{615, nullptr, "GetButtonConfigLeft", MakeVersionGate({18,0,0})},
+ FunctionInfo{616, nullptr, "GetButtonConfigRight", MakeVersionGate({18,0,0})},
+ FunctionInfo{650, nullptr, "AddButtonPlayData"},
+ FunctionInfo{651, nullptr, "StartButtonPlayData"},
+ FunctionInfo{652, nullptr, "StopButtonPlayData"},
+ FunctionInfo{700, nullptr, "GetRailAttachEventCount", MakeVersionGate({21,0,0})},
+ FunctionInfo{2000, nullptr, "DeactivateDigitizer"},
+ FunctionInfo{2001, nullptr, "SetDigitizerAutoPilotState"},
+ FunctionInfo{2002, nullptr, "UnsetDigitizerAutoPilotState"},
+ FunctionInfo{3000, nullptr, "ReloadFirmwareDebugSettings"}
+ );
+ std::shared_ptr<ResourceManager> resource_manager;
+ std::shared_ptr<HidFirmwareSettings> firmware_settings;
+};
+
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
auto firmware_settings = std::make_shared<HidFirmwareSettings>(system);
diff --git a/src/core/hle/service/hid/hid_debug_server.cpp b/src/core/hle/service/hid/hid_debug_server.cpp
index 43fe0f3a19..091d09dae5 100644
--- a/src/core/hle/service/hid/hid_debug_server.cpp
+++ b/src/core/hle/service/hid/hid_debug_server.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
@@ -18,298 +18,4 @@
namespace Service::HID {
-IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
- std::shared_ptr<HidFirmwareSettings> settings)
- : ServiceFramework{system_, "hid:dbg"}, resource_manager{resource}, firmware_settings{
- settings} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "DeactivateDebugPad"},
- {1, nullptr, "SetDebugPadAutoPilotState"},
- {2, nullptr, "UnsetDebugPadAutoPilotState"},
- {10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"},
- {11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"},
- {12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"},
- {13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"},
- {14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"},
- {15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"},
- {16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"},
- {17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"},
- {20, nullptr, "DeactivateMouse"},
- {21, nullptr, "SetMouseAutoPilotState"},
- {22, nullptr, "UnsetMouseAutoPilotState"},
- {23, nullptr, "AddMouseSideWheelDelta"},
- {25, nullptr, "SetDebugMouseAutoPilotState"},
- {26, nullptr, "UnsetDebugMouseAutoPilotState"},
- {30, nullptr, "DeactivateKeyboard"},
- {31, nullptr, "SetKeyboardAutoPilotState"},
- {32, nullptr, "UnsetKeyboardAutoPilotState"},
- {50, nullptr, "DeactivateXpad"},
- {51, nullptr, "SetXpadAutoPilotState"},
- {52, nullptr, "UnsetXpadAutoPilotState"},
- {53, nullptr, "DeactivateJoyXpad"},
- {60, nullptr, "ClearNpadSystemCommonPolicy"},
- {61, nullptr, "DeactivateNpad"},
- {62, nullptr, "ForceDisconnectNpad"},
- {91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"},
- {110, nullptr, "DeactivateHomeButton"},
- {111, nullptr, "SetHomeButtonAutoPilotState"},
- {112, nullptr, "UnsetHomeButtonAutoPilotState"},
- {120, nullptr, "DeactivateSleepButton"},
- {121, nullptr, "SetSleepButtonAutoPilotState"},
- {122, nullptr, "UnsetSleepButtonAutoPilotState"},
- {123, nullptr, "DeactivateInputDetector"},
- {130, nullptr, "DeactivateCaptureButton"},
- {131, nullptr, "SetCaptureButtonAutoPilotState"},
- {132, nullptr, "UnsetCaptureButtonAutoPilotState"},
- {133, nullptr, "SetShiftAccelerometerCalibrationValue"},
- {134, nullptr, "GetShiftAccelerometerCalibrationValue"},
- {135, nullptr, "SetShiftGyroscopeCalibrationValue"},
- {136, nullptr, "GetShiftGyroscopeCalibrationValue"},
- {140, nullptr, "DeactivateConsoleSixAxisSensor"},
- {141, nullptr, "GetConsoleSixAxisSensorSamplingFrequency"},
- {142, nullptr, "DeactivateSevenSixAxisSensor"},
- {143, nullptr, "GetConsoleSixAxisSensorCountStates"},
- {144, nullptr, "GetAccelerometerFsr"},
- {145, nullptr, "SetAccelerometerFsr"},
- {146, nullptr, "GetAccelerometerOdr"},
- {147, nullptr, "SetAccelerometerOdr"},
- {148, nullptr, "GetGyroscopeFsr"},
- {149, nullptr, "SetGyroscopeFsr"},
- {150, nullptr, "GetGyroscopeOdr"},
- {151, nullptr, "SetGyroscopeOdr"},
- {152, nullptr, "GetWhoAmI"},
- {201, nullptr, "ActivateFirmwareUpdate"},
- {202, nullptr, "DeactivateFirmwareUpdate"},
- {203, nullptr, "StartFirmwareUpdate"},
- {204, nullptr, "GetFirmwareUpdateStage"},
- {205, nullptr, "GetFirmwareVersion"},
- {206, nullptr, "GetDestinationFirmwareVersion"},
- {207, nullptr, "DiscardFirmwareInfoCacheForRevert"},
- {208, nullptr, "StartFirmwareUpdateForRevert"},
- {209, nullptr, "GetAvailableFirmwareVersionForRevert"},
- {210, nullptr, "IsFirmwareUpdatingDevice"},
- {211, nullptr, "StartFirmwareUpdateIndividual"},
- {212, nullptr, "GetDetailFirmwareVersion"}, // 19.0.0+
- {215, nullptr, "SetUsbFirmwareForceUpdateEnabled"},
- {216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"},
- {221, nullptr, "UpdateControllerColor"},
- {222, nullptr, "ConnectUsbPadsAsync"},
- {223, nullptr, "DisconnectUsbPadsAsync"},
- {224, nullptr, "UpdateDesignInfo"},
- {225, nullptr, "GetUniquePadDriverState"},
- {226, nullptr, "GetSixAxisSensorDriverStates"},
- {227, nullptr, "GetRxPacketHistory"},
- {228, nullptr, "AcquireOperationEventHandle"},
- {229, nullptr, "ReadSerialFlash"},
- {230, nullptr, "WriteSerialFlash"},
- {231, nullptr, "GetOperationResult"},
- {232, nullptr, "EnableShipmentMode"},
- {233, nullptr, "ClearPairingInfo"},
- {234, nullptr, "GetUniquePadDeviceTypeSetInternal"},
- {235, nullptr, "EnableAnalogStickPower"},
- {236, nullptr, "RequestKuinaUartClockCal"},
- {237, nullptr, "GetKuinaUartClockCal"},
- {238, nullptr, "SetKuinaUartClockTrim"},
- {239, nullptr, "KuinaLoopbackTest"},
- {240, nullptr, "RequestBatteryVoltage"},
- {241, nullptr, "GetBatteryVoltage"},
- {242, nullptr, "GetUniquePadPowerInfo"},
- {243, nullptr, "RebootUniquePad"},
- {244, nullptr, "RequestKuinaFirmwareVersion"},
- {245, nullptr, "GetKuinaFirmwareVersion"},
- {246, nullptr, "GetVidPid"},
- {247, nullptr, "GetAnalogStickCalibrationValue"},
- {248, nullptr, "GetUniquePadIdsFull"},
- {249, nullptr, "ConnectUniquePad"},
- {250, nullptr, "IsVirtual"},
- {251, nullptr, "GetAnalogStickModuleParam"},
- {253, nullptr, "ClearStorageForShipment"}, //19.0.0+
- {261, nullptr, "UpdateDesignInfo12"}, //21.0.0+
- {262, nullptr, "GetUniquePadButtonCount"}, //21.0.0+
- {267, nullptr, "SetAnalogStickCalibration"}, //21.0.0+
- {268, nullptr, "ResetAnalogStickCalibration"}, //21.0.0+
- {301, nullptr, "GetAbstractedPadHandles"},
- {302, nullptr, "GetAbstractedPadState"},
- {303, nullptr, "GetAbstractedPadsState"},
- {321, nullptr, "SetAutoPilotVirtualPadState"},
- {322, nullptr, "UnsetAutoPilotVirtualPadState"},
- {323, nullptr, "UnsetAllAutoPilotVirtualPadState"},
- {324, nullptr, "AttachHdlsWorkBuffer"},
- {325, nullptr, "ReleaseHdlsWorkBuffer"},
- {326, nullptr, "DumpHdlsNpadAssignmentState"},
- {327, nullptr, "DumpHdlsStates"},
- {328, nullptr, "ApplyHdlsNpadAssignmentState"},
- {329, nullptr, "ApplyHdlsStateList"},
- {330, nullptr, "AttachHdlsVirtualDevice"},
- {331, nullptr, "DetachHdlsVirtualDevice"},
- {332, nullptr, "SetHdlsState"},
- {350, nullptr, "AddRegisteredDevice"},
- {351, nullptr, "GetRegisteredDevicesCountDebug"}, //17.0.0-18.1.0
- {352, nullptr, "DeleteRegisteredDevicesDebug"}, //17.0.0-18.1.0
- {400, nullptr, "DisableExternalMcuOnNxDevice"},
- {401, nullptr, "DisableRailDeviceFiltering"},
- {402, nullptr, "EnableWiredPairing"},
- {403, nullptr, "EnableShipmentModeAutoClear"},
- {404, nullptr, "SetRailEnabled"},
- {500, nullptr, "SetFactoryInt"},
- {501, nullptr, "IsFactoryBootEnabled"},
- {550, nullptr, "SetAnalogStickModelDataTemporarily"},
- {551, nullptr, "GetAnalogStickModelData"},
- {552, nullptr, "ResetAnalogStickModelData"},
- {600, nullptr, "ConvertPadState"},
- {601, nullptr, "IsButtonConfigSupported"}, //18.0.0+
- {602, nullptr, "IsButtonConfigEmbeddedSupported"}, //18.0.0+
- {603, nullptr, "DeleteButtonConfig"}, //18.0.0+
- {604, nullptr, "DeleteButtonConfigEmbedded"}, //18.0.0+
- {605, nullptr, "SetButtonConfigEnabled"}, //18.0.0+
- {606, nullptr, "SetButtonConfigEmbeddedEnabled"}, //18.0.0+
- {607, nullptr, "IsButtonConfigEnabled"}, //18.0.0+
- {608, nullptr, "IsButtonConfigEmbeddedEnabled"}, //18.0.0+
- {609, nullptr, "SetButtonConfigEmbedded"}, //18.0.0+
- {610, nullptr, "SetButtonConfigFull"}, //18.0.0+
- {611, nullptr, "SetButtonConfigLeft"}, //18.0.0+
- {612, nullptr, "SetButtonConfigRight"}, //18.0.0+
- {613, nullptr, "GetButtonConfigEmbedded"}, //18.0.0+
- {614, nullptr, "GetButtonConfigFull"}, //18.0.0+
- {615, nullptr, "GetButtonConfigLeft"}, //18.0.0+
- {616, nullptr, "GetButtonConfigRight"}, //18.0.0+
- {650, nullptr, "AddButtonPlayData"},
- {651, nullptr, "StartButtonPlayData"},
- {652, nullptr, "StopButtonPlayData"},
- {700, nullptr, "GetRailAttachEventCount"}, //21.0.0+
- {2000, nullptr, "DeactivateDigitizer"},
- {2001, nullptr, "SetDigitizerAutoPilotState"},
- {2002, nullptr, "UnsetDigitizerAutoPilotState"},
- {3000, nullptr, "ReloadFirmwareDebugSettings"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IHidDebugServer::~IHidDebugServer() = default;
-
-Result IHidDebugServer::DeactivateTouchScreen() {
- LOG_INFO(Service_HID, "called");
-
- if (!firmware_settings->IsDeviceManaged()) {
- R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate());
- }
-
- R_SUCCEED();
-}
-
-Result IHidDebugServer::SetTouchScreenAutoPilotState(
- InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer) {
- AutoPilotState auto_pilot{};
-
- auto_pilot.count =
- static_cast<u64>((std::min)(auto_pilot_buffer.size(), auto_pilot.state.size()));
- memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(),
- auto_pilot.count * sizeof(TouchState));
-
- LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count);
-
- R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot));
-}
-
-Result IHidDebugServer::UnsetTouchScreenAutoPilotState() {
- LOG_INFO(Service_HID, "called");
- R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState());
-}
-
-Result IHidDebugServer::GetTouchScreenConfiguration(
- Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config,
- ClientAppletResourceUserId aruid) {
- LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid);
-
- R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration(
- *out_touchscreen_config, aruid.pid));
-
- if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 &&
- out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) {
- out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting;
- }
-
- R_SUCCEED();
-}
-
-Result IHidDebugServer::ProcessTouchScreenAutoTune() {
- LOG_INFO(Service_HID, "called");
- R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune());
-}
-
-Result IHidDebugServer::ForceStopTouchScreenManagement() {
- LOG_INFO(Service_HID, "called");
-
- if (!firmware_settings->IsDeviceManaged()) {
- R_SUCCEED();
- }
-
- auto touch_screen = GetResourceManager()->GetTouchScreen();
- auto gesture = GetResourceManager()->GetGesture();
-
- if (firmware_settings->IsTouchI2cManaged()) {
- bool is_touch_active{};
- bool is_gesture_active{};
- R_TRY(touch_screen->IsActive(is_touch_active));
- R_TRY(gesture->IsActive(is_gesture_active));
-
- if (is_touch_active) {
- R_TRY(touch_screen->Deactivate());
- }
- if (is_gesture_active) {
- R_TRY(gesture->Deactivate());
- }
- }
-
- R_SUCCEED();
-}
-
-Result IHidDebugServer::ForceRestartTouchScreenManagement(u32 basic_gesture_id,
- ClientAppletResourceUserId aruid) {
- LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}",
- basic_gesture_id, aruid.pid);
-
- auto touch_screen = GetResourceManager()->GetTouchScreen();
- auto gesture = GetResourceManager()->GetGesture();
-
- if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) {
- R_TRY(gesture->Activate());
- R_TRY(gesture->Activate(aruid.pid, basic_gesture_id));
- R_TRY(touch_screen->Activate());
- R_TRY(touch_screen->Activate(aruid.pid));
- }
-
- R_SUCCEED();
-}
-
-Result IHidDebugServer::IsTouchScreenManaged(Out<bool> out_is_managed) {
- LOG_INFO(Service_HID, "called");
-
- bool is_touch_active{};
- bool is_gesture_active{};
- R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active));
- R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active));
-
- *out_is_managed = is_touch_active || is_gesture_active;
- R_SUCCEED();
-}
-
-Result IHidDebugServer::DeactivateGesture() {
- LOG_INFO(Service_HID, "called");
-
- if (!firmware_settings->IsDeviceManaged()) {
- R_RETURN(GetResourceManager()->GetGesture()->Deactivate());
- }
-
- R_SUCCEED();
-}
-
-std::shared_ptr<ResourceManager> IHidDebugServer::GetResourceManager() {
- resource_manager->Initialize();
- return resource_manager;
-}
-
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/hid_debug_server.h b/src/core/hle/service/hid/hid_debug_server.h
index 3a483f07e5..20cc1ed541 100644
--- a/src/core/hle/service/hid/hid_debug_server.h
+++ b/src/core/hle/service/hid/hid_debug_server.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -15,31 +18,5 @@ namespace Service::HID {
class ResourceManager;
class HidFirmwareSettings;
-class IHidDebugServer final : public ServiceFramework<IHidDebugServer> {
-public:
- explicit IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
- std::shared_ptr<HidFirmwareSettings> settings);
- ~IHidDebugServer() override;
-
-private:
- Result DeactivateTouchScreen();
- Result SetTouchScreenAutoPilotState(
- InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer);
- Result UnsetTouchScreenAutoPilotState();
- Result GetTouchScreenConfiguration(
- Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config,
- ClientAppletResourceUserId aruid);
- Result ProcessTouchScreenAutoTune();
- Result ForceStopTouchScreenManagement();
- Result ForceRestartTouchScreenManagement(u32 basic_gesture_id,
- ClientAppletResourceUserId aruid);
- Result IsTouchScreenManaged(Out<bool> out_is_managed);
- Result DeactivateGesture();
-
- std::shared_ptr<ResourceManager> GetResourceManager();
-
- std::shared_ptr<ResourceManager> resource_manager;
- std::shared_ptr<HidFirmwareSettings> firmware_settings;
-};
} // namespace Service::HID
diff --git a/src/core/hle/service/hid/hid_server.cpp b/src/core/hle/service/hid/hid_server.cpp
index 9689bce8dd..18e57628d0 100644
--- a/src/core/hle/service/hid/hid_server.cpp
+++ b/src/core/hle/service/hid/hid_server.cpp
@@ -42,207 +42,207 @@
namespace Service::HID {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IHidServer::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IHidServer::CreateAppletResource>, "CreateAppletResource"},
+ FunctionInfo{1, C<&IHidServer::ActivateDebugPad>, "ActivateDebugPad"},
+ FunctionInfo{11, C<&IHidServer::ActivateTouchScreen>, "ActivateTouchScreen"},
+ FunctionInfo{21, C<&IHidServer::ActivateMouse>, "ActivateMouse"},
+ FunctionInfo{26, C<&IHidServer::ActivateDebugMouse>, "ActivateDebugMouse"},
+ FunctionInfo{31, C<&IHidServer::ActivateKeyboard>, "ActivateKeyboard"},
+ FunctionInfo{32, C<&IHidServer::SendKeyboardLockKeyEvent>, "SendKeyboardLockKeyEvent"},
+ FunctionInfo{40, C<&IHidServer::AcquireXpadIdEventHandle>, "AcquireXpadIdEventHandle"},
+ FunctionInfo{41, C<&IHidServer::ReleaseXpadIdEventHandle>, "ReleaseXpadIdEventHandle"},
+ FunctionInfo{51, C<&IHidServer::ActivateXpad>, "ActivateXpad"},
+ FunctionInfo{55, C<&IHidServer::GetXpadIds>, "GetXpadIds"},
+ FunctionInfo{56, C<&IHidServer::ActivateJoyXpad>, "ActivateJoyXpad"},
+ FunctionInfo{58, C<&IHidServer::GetJoyXpadLifoHandle>, "GetJoyXpadLifoHandle"},
+ FunctionInfo{59, C<&IHidServer::GetJoyXpadIds>, "GetJoyXpadIds"},
+ FunctionInfo{60, C<&IHidServer::ActivateSixAxisSensor>, "ActivateSixAxisSensor"},
+ FunctionInfo{61, C<&IHidServer::DeactivateSixAxisSensor>, "DeactivateSixAxisSensor"},
+ FunctionInfo{62, C<&IHidServer::GetSixAxisSensorLifoHandle>, "GetSixAxisSensorLifoHandle"},
+ FunctionInfo{63, C<&IHidServer::ActivateJoySixAxisSensor>, "ActivateJoySixAxisSensor"},
+ FunctionInfo{64, C<&IHidServer::DeactivateJoySixAxisSensor>, "DeactivateJoySixAxisSensor"},
+ FunctionInfo{65, C<&IHidServer::GetJoySixAxisSensorLifoHandle>, "GetJoySixAxisSensorLifoHandle"},
+ FunctionInfo{66, C<&IHidServer::StartSixAxisSensor>, "StartSixAxisSensor"},
+ FunctionInfo{67, C<&IHidServer::StopSixAxisSensor>, "StopSixAxisSensor"},
+ FunctionInfo{68, C<&IHidServer::IsSixAxisSensorFusionEnabled>, "IsSixAxisSensorFusionEnabled"},
+ FunctionInfo{69, C<&IHidServer::EnableSixAxisSensorFusion>, "EnableSixAxisSensorFusion"},
+ FunctionInfo{70, C<&IHidServer::SetSixAxisSensorFusionParameters>, "SetSixAxisSensorFusionParameters"},
+ FunctionInfo{71, C<&IHidServer::GetSixAxisSensorFusionParameters>, "GetSixAxisSensorFusionParameters"},
+ FunctionInfo{72, C<&IHidServer::ResetSixAxisSensorFusionParameters>, "ResetSixAxisSensorFusionParameters"},
+ FunctionInfo{73, nullptr, "SetAccelerometerParameters"},
+ FunctionInfo{74, nullptr, "GetAccelerometerParameters"},
+ FunctionInfo{75, nullptr, "ResetAccelerometerParameters"},
+ FunctionInfo{76, nullptr, "SetAccelerometerPlayMode"},
+ FunctionInfo{77, nullptr, "GetAccelerometerPlayMode"},
+ FunctionInfo{78, nullptr, "ResetAccelerometerPlayMode"},
+ FunctionInfo{79, C<&IHidServer::SetGyroscopeZeroDriftMode>, "SetGyroscopeZeroDriftMode"},
+ FunctionInfo{80, C<&IHidServer::GetGyroscopeZeroDriftMode>, "GetGyroscopeZeroDriftMode"},
+ FunctionInfo{81, C<&IHidServer::ResetGyroscopeZeroDriftMode>, "ResetGyroscopeZeroDriftMode"},
+ FunctionInfo{82, C<&IHidServer::IsSixAxisSensorAtRest>, "IsSixAxisSensorAtRest"},
+ FunctionInfo{83, C<&IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor>, "IsFirmwareUpdateAvailableForSixAxisSensor"},
+ FunctionInfo{84, C<&IHidServer::EnableSixAxisSensorUnalteredPassthrough>, "EnableSixAxisSensorUnalteredPassthrough"},
+ FunctionInfo{85, C<&IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled>, "IsSixAxisSensorUnalteredPassthroughEnabled"},
+ FunctionInfo{86, nullptr, "StoreSixAxisSensorCalibrationParameter"},
+ FunctionInfo{87, C<&IHidServer::LoadSixAxisSensorCalibrationParameter>, "LoadSixAxisSensorCalibrationParameter"},
+ FunctionInfo{88, C<&IHidServer::GetSixAxisSensorIcInformation>, "GetSixAxisSensorIcInformation"},
+ FunctionInfo{89, C<&IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned>, "ResetIsSixAxisSensorDeviceNewlyAssigned"},
+ FunctionInfo{91, C<&IHidServer::ActivateGesture>, "ActivateGesture"},
+ FunctionInfo{92, C<&IHidServer::SetGestureOutputRanges>, "SetGestureOutputRanges"},
+ FunctionInfo{100, C<&IHidServer::SetSupportedNpadStyleSet>, "SetSupportedNpadStyleSet"},
+ FunctionInfo{101, C<&IHidServer::GetSupportedNpadStyleSet>, "GetSupportedNpadStyleSet"},
+ FunctionInfo{102, C<&IHidServer::SetSupportedNpadIdType>, "SetSupportedNpadIdType"},
+ FunctionInfo{103, C<&IHidServer::ActivateNpad>, "ActivateNpad"},
+ FunctionInfo{104, C<&IHidServer::DeactivateNpad>, "DeactivateNpad"},
+ FunctionInfo{106, C<&IHidServer::AcquireNpadStyleSetUpdateEventHandle>, "AcquireNpadStyleSetUpdateEventHandle"},
+ FunctionInfo{107, C<&IHidServer::DisconnectNpad>, "DisconnectNpad"},
+ FunctionInfo{108, C<&IHidServer::GetPlayerLedPattern>, "GetPlayerLedPattern"},
+ FunctionInfo{109, C<&IHidServer::ActivateNpadWithRevision>, "ActivateNpadWithRevision"},
+ FunctionInfo{120, C<&IHidServer::SetNpadJoyHoldType>, "SetNpadJoyHoldType"},
+ FunctionInfo{121, C<&IHidServer::GetNpadJoyHoldType>, "GetNpadJoyHoldType"},
+ FunctionInfo{122, C<&IHidServer::SetNpadJoyAssignmentModeSingleByDefault>, "SetNpadJoyAssignmentModeSingleByDefault"},
+ FunctionInfo{123, C<&IHidServer::SetNpadJoyAssignmentModeSingle>, "SetNpadJoyAssignmentModeSingle"},
+ FunctionInfo{124, C<&IHidServer::SetNpadJoyAssignmentModeDual>, "SetNpadJoyAssignmentModeDual"},
+ FunctionInfo{125, C<&IHidServer::MergeSingleJoyAsDualJoy>, "MergeSingleJoyAsDualJoy"},
+ FunctionInfo{126, C<&IHidServer::StartLrAssignmentMode>, "StartLrAssignmentMode"},
+ FunctionInfo{127, C<&IHidServer::StopLrAssignmentMode>, "StopLrAssignmentMode"},
+ FunctionInfo{128, C<&IHidServer::SetNpadHandheldActivationMode>, "SetNpadHandheldActivationMode"},
+ FunctionInfo{129, C<&IHidServer::GetNpadHandheldActivationMode>, "GetNpadHandheldActivationMode"},
+ FunctionInfo{130, C<&IHidServer::SwapNpadAssignment>, "SwapNpadAssignment"},
+ FunctionInfo{131, C<&IHidServer::IsUnintendedHomeButtonInputProtectionEnabled>, "IsUnintendedHomeButtonInputProtectionEnabled"},
+ FunctionInfo{132, C<&IHidServer::EnableUnintendedHomeButtonInputProtection>, "EnableUnintendedHomeButtonInputProtection"},
+ FunctionInfo{133, C<&IHidServer::SetNpadJoyAssignmentModeSingleWithDestination>, "SetNpadJoyAssignmentModeSingleWithDestination"},
+ FunctionInfo{134, C<&IHidServer::SetNpadAnalogStickUseCenterClamp>, "SetNpadAnalogStickUseCenterClamp"},
+ FunctionInfo{135, C<&IHidServer::SetNpadCaptureButtonAssignment>, "SetNpadCaptureButtonAssignment"},
+ FunctionInfo{136, C<&IHidServer::ClearNpadCaptureButtonAssignment>, "ClearNpadCaptureButtonAssignment"},
+ FunctionInfo{200, C<&IHidServer::GetVibrationDeviceInfo>, "GetVibrationDeviceInfo"},
+ FunctionInfo{201, C<&IHidServer::SendVibrationValue>, "SendVibrationValue"},
+ FunctionInfo{202, C<&IHidServer::GetActualVibrationValue>, "GetActualVibrationValue"},
+ FunctionInfo{203, C<&IHidServer::CreateActiveVibrationDeviceList>, "CreateActiveVibrationDeviceList"},
+ FunctionInfo{204, C<&IHidServer::PermitVibration>, "PermitVibration"},
+ FunctionInfo{205, C<&IHidServer::IsVibrationPermitted>, "IsVibrationPermitted"},
+ FunctionInfo{206, C<&IHidServer::SendVibrationValues>, "SendVibrationValues"},
+ FunctionInfo{207, C<&IHidServer::SendVibrationGcErmCommand>, "SendVibrationGcErmCommand"},
+ FunctionInfo{208, C<&IHidServer::GetActualVibrationGcErmCommand>, "GetActualVibrationGcErmCommand"},
+ FunctionInfo{209, C<&IHidServer::BeginPermitVibrationSession>, "BeginPermitVibrationSession"},
+ FunctionInfo{210, C<&IHidServer::EndPermitVibrationSession>, "EndPermitVibrationSession"},
+ FunctionInfo{211, C<&IHidServer::IsVibrationDeviceMounted>, "IsVibrationDeviceMounted"},
+ FunctionInfo{212, C<&IHidServer::SendVibrationValueInBool>, "SendVibrationValueInBool"},
+ FunctionInfo{300, C<&IHidServer::ActivateConsoleSixAxisSensor>, "ActivateConsoleSixAxisSensor"},
+ FunctionInfo{301, C<&IHidServer::StartConsoleSixAxisSensor>, "StartConsoleSixAxisSensor"},
+ FunctionInfo{302, C<&IHidServer::StopConsoleSixAxisSensor>, "StopConsoleSixAxisSensor"},
+ FunctionInfo{303, C<&IHidServer::ActivateSevenSixAxisSensor>, "ActivateSevenSixAxisSensor"},
+ FunctionInfo{304, C<&IHidServer::StartSevenSixAxisSensor>, "StartSevenSixAxisSensor"},
+ FunctionInfo{305, C<&IHidServer::StopSevenSixAxisSensor>, "StopSevenSixAxisSensor"},
+ FunctionInfo{306, C<&IHidServer::InitializeSevenSixAxisSensor>, "InitializeSevenSixAxisSensor"},
+ FunctionInfo{307, C<&IHidServer::FinalizeSevenSixAxisSensor>, "FinalizeSevenSixAxisSensor"},
+ FunctionInfo{308, nullptr, "SetSevenSixAxisSensorFusionStrength"},
+ FunctionInfo{309, nullptr, "GetSevenSixAxisSensorFusionStrength"},
+ FunctionInfo{310, C<&IHidServer::ResetSevenSixAxisSensorTimestamp>, "ResetSevenSixAxisSensorTimestamp"},
+ FunctionInfo{320, nullptr, "EnableNpadImu", MakeVersionGate({21,0,0})},
+ FunctionInfo{321, nullptr, "DisableNpadImu", MakeVersionGate({21,0,0})},
+ FunctionInfo{400, C<&IHidServer::IsUsbFullKeyControllerEnabled>, "IsUsbFullKeyControllerEnabled"},
+ FunctionInfo{401, nullptr, "EnableUsbFullKeyController"},
+ FunctionInfo{402, nullptr, "IsUsbFullKeyControllerConnected"},
+ FunctionInfo{403, nullptr, "HasBattery"},
+ FunctionInfo{404, nullptr, "HasLeftRightBattery"},
+ FunctionInfo{405, nullptr, "GetNpadInterfaceType"},
+ FunctionInfo{406, nullptr, "GetNpadLeftRightInterfaceType"},
+ FunctionInfo{407, nullptr, "GetNpadOfHighestBatteryLevel"},
+ FunctionInfo{408, nullptr, "GetNpadOfHighestBatteryLevelForJoyRight"},
+ FunctionInfo{500, C<&IHidServer::GetPalmaConnectionHandle>, "GetPalmaConnectionHandle"},
+ FunctionInfo{501, C<&IHidServer::InitializePalma>, "InitializePalma"},
+ FunctionInfo{502, C<&IHidServer::AcquirePalmaOperationCompleteEvent>, "AcquirePalmaOperationCompleteEvent"},
+ FunctionInfo{503, C<&IHidServer::GetPalmaOperationInfo>, "GetPalmaOperationInfo"},
+ FunctionInfo{504, C<&IHidServer::PlayPalmaActivity>, "PlayPalmaActivity"},
+ FunctionInfo{505, C<&IHidServer::SetPalmaFrModeType>, "SetPalmaFrModeType"},
+ FunctionInfo{506, C<&IHidServer::ReadPalmaStep>, "ReadPalmaStep"},
+ FunctionInfo{507, C<&IHidServer::EnablePalmaStep>, "EnablePalmaStep"},
+ FunctionInfo{508, C<&IHidServer::ResetPalmaStep>, "ResetPalmaStep"},
+ FunctionInfo{509, C<&IHidServer::ReadPalmaApplicationSection>, "ReadPalmaApplicationSection"},
+ FunctionInfo{510, C<&IHidServer::WritePalmaApplicationSection>, "WritePalmaApplicationSection"},
+ FunctionInfo{511, C<&IHidServer::ReadPalmaUniqueCode>, "ReadPalmaUniqueCode"},
+ FunctionInfo{512, C<&IHidServer::SetPalmaUniqueCodeInvalid>, "SetPalmaUniqueCodeInvalid"},
+ FunctionInfo{513, C<&IHidServer::WritePalmaActivityEntry>, "WritePalmaActivityEntry"},
+ FunctionInfo{514, C<&IHidServer::WritePalmaRgbLedPatternEntry>, "WritePalmaRgbLedPatternEntry"},
+ FunctionInfo{515, C<&IHidServer::WritePalmaWaveEntry>, "WritePalmaWaveEntry"},
+ FunctionInfo{516, C<&IHidServer::SetPalmaDataBaseIdentificationVersion>, "SetPalmaDataBaseIdentificationVersion"},
+ FunctionInfo{517, C<&IHidServer::GetPalmaDataBaseIdentificationVersion>, "GetPalmaDataBaseIdentificationVersion"},
+ FunctionInfo{518, C<&IHidServer::SuspendPalmaFeature>, "SuspendPalmaFeature"},
+ FunctionInfo{519, C<&IHidServer::GetPalmaOperationResult>, "GetPalmaOperationResult"},
+ FunctionInfo{520, C<&IHidServer::ReadPalmaPlayLog>, "ReadPalmaPlayLog"},
+ FunctionInfo{521, C<&IHidServer::ResetPalmaPlayLog>, "ResetPalmaPlayLog"},
+ FunctionInfo{522, C<&IHidServer::SetIsPalmaAllConnectable>, "SetIsPalmaAllConnectable"},
+ FunctionInfo{523, C<&IHidServer::SetIsPalmaPairedConnectable>, "SetIsPalmaPairedConnectable"},
+ FunctionInfo{524, C<&IHidServer::PairPalma>, "PairPalma"},
+ FunctionInfo{525, C<&IHidServer::SetPalmaBoostMode>, "SetPalmaBoostMode"},
+ FunctionInfo{526, C<&IHidServer::CancelWritePalmaWaveEntry>, "CancelWritePalmaWaveEntry"},
+ FunctionInfo{527, C<&IHidServer::EnablePalmaBoostMode>, "EnablePalmaBoostMode"},
+ FunctionInfo{528, C<&IHidServer::GetPalmaBluetoothAddress>, "GetPalmaBluetoothAddress"},
+ FunctionInfo{529, C<&IHidServer::SetDisallowedPalmaConnection>, "SetDisallowedPalmaConnection"},
+ FunctionInfo{1000, C<&IHidServer::SetNpadCommunicationMode>, "SetNpadCommunicationMode"},
+ FunctionInfo{1001, C<&IHidServer::GetNpadCommunicationMode>, "GetNpadCommunicationMode"},
+ FunctionInfo{1002, C<&IHidServer::SetTouchScreenConfiguration>, "SetTouchScreenConfiguration"},
+ FunctionInfo{1003, C<&IHidServer::IsFirmwareUpdateNeededForNotification>, "IsFirmwareUpdateNeededForNotification"},
+ FunctionInfo{1004, C<&IHidServer::SetTouchScreenResolution>, "SetTouchScreenResolution"},
+ FunctionInfo{1270, nullptr, "DeleteButtonConfigStorageRight"},
+ FunctionInfo{1271, nullptr, "IsUsingCustomButtonConfig"},
+ FunctionInfo{1272, nullptr, "IsAnyCustomButtonConfigEnabled"},
+ FunctionInfo{1273, nullptr, "SetAllCustomButtonConfigEnabled"},
+ FunctionInfo{1274, nullptr, "SetDefaultButtonConfig"},
+ FunctionInfo{1275, nullptr, "SetAllDefaultButtonConfig"},
+ FunctionInfo{1276, nullptr, "SetHidButtonConfigEmbedded"},
+ FunctionInfo{1277, nullptr, "SetHidButtonConfigFull"},
+ FunctionInfo{1278, nullptr, "SetHidButtonConfigLeft"},
+ FunctionInfo{1279, nullptr, "SetHidButtonConfigRight"},
+ FunctionInfo{1280, nullptr, "GetHidButtonConfigEmbedded"},
+ FunctionInfo{1281, nullptr, "GetHidButtonConfigFull"},
+ FunctionInfo{1282, nullptr, "GetHidButtonConfigLeft"},
+ FunctionInfo{1283, nullptr, "GetHidButtonConfigRight"},
+ FunctionInfo{1284, nullptr, "GetButtonConfigStorageEmbedded"},
+ FunctionInfo{1285, nullptr, "GetButtonConfigStorageFull"},
+ FunctionInfo{1286, nullptr, "GetButtonConfigStorageLeft"},
+ FunctionInfo{1287, nullptr, "GetButtonConfigStorageRight"},
+ FunctionInfo{1288, nullptr, "SetButtonConfigStorageEmbedded"},
+ FunctionInfo{1289, nullptr, "SetButtonConfigStorageFull"},
+ FunctionInfo{1290, nullptr, "SetButtonConfigStorageLeft"},
+ FunctionInfo{1291, nullptr, "SetButtonConfigStorageRight"},
+ FunctionInfo{1308, nullptr, "SetButtonConfigVisible"},
+ FunctionInfo{1309, nullptr, "IsButtonConfigVisible"},
+ FunctionInfo{1320, nullptr, "WakeTouchScreenUp"},
+ FunctionInfo{1321, nullptr, "PutTouchScreenToSleep"},
+ FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"},
+ FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"},
+ FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"},
+ FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"},
+ FunctionInfo{1420, nullptr, "GetAppletResourceProperty"},
+ FunctionInfo{2000, nullptr, "ActivateDigitizer"},
+ FunctionInfo{3000, nullptr, "GetDebugPadGenericPadMap"},
+ FunctionInfo{3001, nullptr, "SetDebugPadGenericPadMap"},
+ FunctionInfo{3002, nullptr, "ResetDebugPadGenericPadMap"},
+ FunctionInfo{3003, nullptr, "GetDebugPadKeyboardMap"},
+ FunctionInfo{3004, nullptr, "SetDebugPadKeyboardMap"},
+ FunctionInfo{3005, nullptr, "ResetDebugPadKeyboardMap"},
+ FunctionInfo{3006, nullptr, "GetFullKeyGenericPadMap"},
+ FunctionInfo{3007, nullptr, "SetFullKeyGenericPadMap"},
+ FunctionInfo{3008, nullptr, "ResetFullKeyGenericPadMap"},
+ FunctionInfo{3009, nullptr, "GetFullKeyKeyboardMap"},
+ FunctionInfo{3010, nullptr, "SetFullKeyKeyboardMap"},
+ FunctionInfo{3011, nullptr, "ResetFullKeyKeyboardMap"},
+ FunctionInfo{3012, nullptr, "GetDebugPadGenericPadMap", MakeVersionGate({21,0,0})},
+ FunctionInfo{3013, nullptr, "SetDebugPadGenericPadMap", MakeVersionGate({21,0,0})},
+ FunctionInfo{3014, nullptr, "GetDebugPadKeyboardMap", MakeVersionGate({21,0,0})},
+ FunctionInfo{3015, nullptr, "SetDebugPadKeyboardMap", MakeVersionGate({21,0,0})},
+ FunctionInfo{3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion", MakeVersionGate({21,0,0})}
+ // What? -- {12010, nullptr, "SetButtonConfigLeft"},
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IHidServer::IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> resource,
std::shared_ptr<HidFirmwareSettings> settings)
: ServiceFramework{system_, "hid"}, resource_manager{resource}, firmware_settings{settings} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&IHidServer::CreateAppletResource>, "CreateAppletResource"},
- {1, C<&IHidServer::ActivateDebugPad>, "ActivateDebugPad"},
- {11, C<&IHidServer::ActivateTouchScreen>, "ActivateTouchScreen"},
- {21, C<&IHidServer::ActivateMouse>, "ActivateMouse"},
- {26, C<&IHidServer::ActivateDebugMouse>, "ActivateDebugMouse"},
- {31, C<&IHidServer::ActivateKeyboard>, "ActivateKeyboard"},
- {32, C<&IHidServer::SendKeyboardLockKeyEvent>, "SendKeyboardLockKeyEvent"},
- {40, C<&IHidServer::AcquireXpadIdEventHandle>, "AcquireXpadIdEventHandle"},
- {41, C<&IHidServer::ReleaseXpadIdEventHandle>, "ReleaseXpadIdEventHandle"},
- {51, C<&IHidServer::ActivateXpad>, "ActivateXpad"},
- {55, C<&IHidServer::GetXpadIds>, "GetXpadIds"},
- {56, C<&IHidServer::ActivateJoyXpad>, "ActivateJoyXpad"},
- {58, C<&IHidServer::GetJoyXpadLifoHandle>, "GetJoyXpadLifoHandle"},
- {59, C<&IHidServer::GetJoyXpadIds>, "GetJoyXpadIds"},
- {60, C<&IHidServer::ActivateSixAxisSensor>, "ActivateSixAxisSensor"},
- {61, C<&IHidServer::DeactivateSixAxisSensor>, "DeactivateSixAxisSensor"},
- {62, C<&IHidServer::GetSixAxisSensorLifoHandle>, "GetSixAxisSensorLifoHandle"},
- {63, C<&IHidServer::ActivateJoySixAxisSensor>, "ActivateJoySixAxisSensor"},
- {64, C<&IHidServer::DeactivateJoySixAxisSensor>, "DeactivateJoySixAxisSensor"},
- {65, C<&IHidServer::GetJoySixAxisSensorLifoHandle>, "GetJoySixAxisSensorLifoHandle"},
- {66, C<&IHidServer::StartSixAxisSensor>, "StartSixAxisSensor"},
- {67, C<&IHidServer::StopSixAxisSensor>, "StopSixAxisSensor"},
- {68, C<&IHidServer::IsSixAxisSensorFusionEnabled>, "IsSixAxisSensorFusionEnabled"},
- {69, C<&IHidServer::EnableSixAxisSensorFusion>, "EnableSixAxisSensorFusion"},
- {70, C<&IHidServer::SetSixAxisSensorFusionParameters>, "SetSixAxisSensorFusionParameters"},
- {71, C<&IHidServer::GetSixAxisSensorFusionParameters>, "GetSixAxisSensorFusionParameters"},
- {72, C<&IHidServer::ResetSixAxisSensorFusionParameters>, "ResetSixAxisSensorFusionParameters"},
- {73, nullptr, "SetAccelerometerParameters"},
- {74, nullptr, "GetAccelerometerParameters"},
- {75, nullptr, "ResetAccelerometerParameters"},
- {76, nullptr, "SetAccelerometerPlayMode"},
- {77, nullptr, "GetAccelerometerPlayMode"},
- {78, nullptr, "ResetAccelerometerPlayMode"},
- {79, C<&IHidServer::SetGyroscopeZeroDriftMode>, "SetGyroscopeZeroDriftMode"},
- {80, C<&IHidServer::GetGyroscopeZeroDriftMode>, "GetGyroscopeZeroDriftMode"},
- {81, C<&IHidServer::ResetGyroscopeZeroDriftMode>, "ResetGyroscopeZeroDriftMode"},
- {82, C<&IHidServer::IsSixAxisSensorAtRest>, "IsSixAxisSensorAtRest"},
- {83, C<&IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor>, "IsFirmwareUpdateAvailableForSixAxisSensor"},
- {84, C<&IHidServer::EnableSixAxisSensorUnalteredPassthrough>, "EnableSixAxisSensorUnalteredPassthrough"},
- {85, C<&IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled>, "IsSixAxisSensorUnalteredPassthroughEnabled"},
- {86, nullptr, "StoreSixAxisSensorCalibrationParameter"},
- {87, C<&IHidServer::LoadSixAxisSensorCalibrationParameter>, "LoadSixAxisSensorCalibrationParameter"},
- {88, C<&IHidServer::GetSixAxisSensorIcInformation>, "GetSixAxisSensorIcInformation"},
- {89, C<&IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned>, "ResetIsSixAxisSensorDeviceNewlyAssigned"},
- {91, C<&IHidServer::ActivateGesture>, "ActivateGesture"},
- {92, C<&IHidServer::SetGestureOutputRanges>, "SetGestureOutputRanges"},
- {100, C<&IHidServer::SetSupportedNpadStyleSet>, "SetSupportedNpadStyleSet"},
- {101, C<&IHidServer::GetSupportedNpadStyleSet>, "GetSupportedNpadStyleSet"},
- {102, C<&IHidServer::SetSupportedNpadIdType>, "SetSupportedNpadIdType"},
- {103, C<&IHidServer::ActivateNpad>, "ActivateNpad"},
- {104, C<&IHidServer::DeactivateNpad>, "DeactivateNpad"},
- {106, C<&IHidServer::AcquireNpadStyleSetUpdateEventHandle>, "AcquireNpadStyleSetUpdateEventHandle"},
- {107, C<&IHidServer::DisconnectNpad>, "DisconnectNpad"},
- {108, C<&IHidServer::GetPlayerLedPattern>, "GetPlayerLedPattern"},
- {109, C<&IHidServer::ActivateNpadWithRevision>, "ActivateNpadWithRevision"},
- {120, C<&IHidServer::SetNpadJoyHoldType>, "SetNpadJoyHoldType"},
- {121, C<&IHidServer::GetNpadJoyHoldType>, "GetNpadJoyHoldType"},
- {122, C<&IHidServer::SetNpadJoyAssignmentModeSingleByDefault>, "SetNpadJoyAssignmentModeSingleByDefault"},
- {123, C<&IHidServer::SetNpadJoyAssignmentModeSingle>, "SetNpadJoyAssignmentModeSingle"},
- {124, C<&IHidServer::SetNpadJoyAssignmentModeDual>, "SetNpadJoyAssignmentModeDual"},
- {125, C<&IHidServer::MergeSingleJoyAsDualJoy>, "MergeSingleJoyAsDualJoy"},
- {126, C<&IHidServer::StartLrAssignmentMode>, "StartLrAssignmentMode"},
- {127, C<&IHidServer::StopLrAssignmentMode>, "StopLrAssignmentMode"},
- {128, C<&IHidServer::SetNpadHandheldActivationMode>, "SetNpadHandheldActivationMode"},
- {129, C<&IHidServer::GetNpadHandheldActivationMode>, "GetNpadHandheldActivationMode"},
- {130, C<&IHidServer::SwapNpadAssignment>, "SwapNpadAssignment"},
- {131, C<&IHidServer::IsUnintendedHomeButtonInputProtectionEnabled>, "IsUnintendedHomeButtonInputProtectionEnabled"},
- {132, C<&IHidServer::EnableUnintendedHomeButtonInputProtection>, "EnableUnintendedHomeButtonInputProtection"},
- {133, C<&IHidServer::SetNpadJoyAssignmentModeSingleWithDestination>, "SetNpadJoyAssignmentModeSingleWithDestination"},
- {134, C<&IHidServer::SetNpadAnalogStickUseCenterClamp>, "SetNpadAnalogStickUseCenterClamp"},
- {135, C<&IHidServer::SetNpadCaptureButtonAssignment>, "SetNpadCaptureButtonAssignment"},
- {136, C<&IHidServer::ClearNpadCaptureButtonAssignment>, "ClearNpadCaptureButtonAssignment"},
- {200, C<&IHidServer::GetVibrationDeviceInfo>, "GetVibrationDeviceInfo"},
- {201, C<&IHidServer::SendVibrationValue>, "SendVibrationValue"},
- {202, C<&IHidServer::GetActualVibrationValue>, "GetActualVibrationValue"},
- {203, C<&IHidServer::CreateActiveVibrationDeviceList>, "CreateActiveVibrationDeviceList"},
- {204, C<&IHidServer::PermitVibration>, "PermitVibration"},
- {205, C<&IHidServer::IsVibrationPermitted>, "IsVibrationPermitted"},
- {206, C<&IHidServer::SendVibrationValues>, "SendVibrationValues"},
- {207, C<&IHidServer::SendVibrationGcErmCommand>, "SendVibrationGcErmCommand"},
- {208, C<&IHidServer::GetActualVibrationGcErmCommand>, "GetActualVibrationGcErmCommand"},
- {209, C<&IHidServer::BeginPermitVibrationSession>, "BeginPermitVibrationSession"},
- {210, C<&IHidServer::EndPermitVibrationSession>, "EndPermitVibrationSession"},
- {211, C<&IHidServer::IsVibrationDeviceMounted>, "IsVibrationDeviceMounted"},
- {212, C<&IHidServer::SendVibrationValueInBool>, "SendVibrationValueInBool"},
- {300, C<&IHidServer::ActivateConsoleSixAxisSensor>, "ActivateConsoleSixAxisSensor"},
- {301, C<&IHidServer::StartConsoleSixAxisSensor>, "StartConsoleSixAxisSensor"},
- {302, C<&IHidServer::StopConsoleSixAxisSensor>, "StopConsoleSixAxisSensor"},
- {303, C<&IHidServer::ActivateSevenSixAxisSensor>, "ActivateSevenSixAxisSensor"},
- {304, C<&IHidServer::StartSevenSixAxisSensor>, "StartSevenSixAxisSensor"},
- {305, C<&IHidServer::StopSevenSixAxisSensor>, "StopSevenSixAxisSensor"},
- {306, C<&IHidServer::InitializeSevenSixAxisSensor>, "InitializeSevenSixAxisSensor"},
- {307, C<&IHidServer::FinalizeSevenSixAxisSensor>, "FinalizeSevenSixAxisSensor"},
- {308, nullptr, "SetSevenSixAxisSensorFusionStrength"},
- {309, nullptr, "GetSevenSixAxisSensorFusionStrength"},
- {310, C<&IHidServer::ResetSevenSixAxisSensorTimestamp>, "ResetSevenSixAxisSensorTimestamp"},
- {320, nullptr, "EnableNpadImu"}, //21.0.0+
- {321, nullptr, "DisableNpadImu"}, //21.0.0+
- {400, C<&IHidServer::IsUsbFullKeyControllerEnabled>, "IsUsbFullKeyControllerEnabled"},
- {401, nullptr, "EnableUsbFullKeyController"},
- {402, nullptr, "IsUsbFullKeyControllerConnected"},
- {403, nullptr, "HasBattery"},
- {404, nullptr, "HasLeftRightBattery"},
- {405, nullptr, "GetNpadInterfaceType"},
- {406, nullptr, "GetNpadLeftRightInterfaceType"},
- {407, nullptr, "GetNpadOfHighestBatteryLevel"},
- {408, nullptr, "GetNpadOfHighestBatteryLevelForJoyRight"},
- {500, C<&IHidServer::GetPalmaConnectionHandle>, "GetPalmaConnectionHandle"},
- {501, C<&IHidServer::InitializePalma>, "InitializePalma"},
- {502, C<&IHidServer::AcquirePalmaOperationCompleteEvent>, "AcquirePalmaOperationCompleteEvent"},
- {503, C<&IHidServer::GetPalmaOperationInfo>, "GetPalmaOperationInfo"},
- {504, C<&IHidServer::PlayPalmaActivity>, "PlayPalmaActivity"},
- {505, C<&IHidServer::SetPalmaFrModeType>, "SetPalmaFrModeType"},
- {506, C<&IHidServer::ReadPalmaStep>, "ReadPalmaStep"},
- {507, C<&IHidServer::EnablePalmaStep>, "EnablePalmaStep"},
- {508, C<&IHidServer::ResetPalmaStep>, "ResetPalmaStep"},
- {509, C<&IHidServer::ReadPalmaApplicationSection>, "ReadPalmaApplicationSection"},
- {510, C<&IHidServer::WritePalmaApplicationSection>, "WritePalmaApplicationSection"},
- {511, C<&IHidServer::ReadPalmaUniqueCode>, "ReadPalmaUniqueCode"},
- {512, C<&IHidServer::SetPalmaUniqueCodeInvalid>, "SetPalmaUniqueCodeInvalid"},
- {513, C<&IHidServer::WritePalmaActivityEntry>, "WritePalmaActivityEntry"},
- {514, C<&IHidServer::WritePalmaRgbLedPatternEntry>, "WritePalmaRgbLedPatternEntry"},
- {515, C<&IHidServer::WritePalmaWaveEntry>, "WritePalmaWaveEntry"},
- {516, C<&IHidServer::SetPalmaDataBaseIdentificationVersion>, "SetPalmaDataBaseIdentificationVersion"},
- {517, C<&IHidServer::GetPalmaDataBaseIdentificationVersion>, "GetPalmaDataBaseIdentificationVersion"},
- {518, C<&IHidServer::SuspendPalmaFeature>, "SuspendPalmaFeature"},
- {519, C<&IHidServer::GetPalmaOperationResult>, "GetPalmaOperationResult"},
- {520, C<&IHidServer::ReadPalmaPlayLog>, "ReadPalmaPlayLog"},
- {521, C<&IHidServer::ResetPalmaPlayLog>, "ResetPalmaPlayLog"},
- {522, C<&IHidServer::SetIsPalmaAllConnectable>, "SetIsPalmaAllConnectable"},
- {523, C<&IHidServer::SetIsPalmaPairedConnectable>, "SetIsPalmaPairedConnectable"},
- {524, C<&IHidServer::PairPalma>, "PairPalma"},
- {525, C<&IHidServer::SetPalmaBoostMode>, "SetPalmaBoostMode"},
- {526, C<&IHidServer::CancelWritePalmaWaveEntry>, "CancelWritePalmaWaveEntry"},
- {527, C<&IHidServer::EnablePalmaBoostMode>, "EnablePalmaBoostMode"},
- {528, C<&IHidServer::GetPalmaBluetoothAddress>, "GetPalmaBluetoothAddress"},
- {529, C<&IHidServer::SetDisallowedPalmaConnection>, "SetDisallowedPalmaConnection"},
- {1000, C<&IHidServer::SetNpadCommunicationMode>, "SetNpadCommunicationMode"},
- {1001, C<&IHidServer::GetNpadCommunicationMode>, "GetNpadCommunicationMode"},
- {1002, C<&IHidServer::SetTouchScreenConfiguration>, "SetTouchScreenConfiguration"},
- {1003, C<&IHidServer::IsFirmwareUpdateNeededForNotification>, "IsFirmwareUpdateNeededForNotification"},
- {1004, C<&IHidServer::SetTouchScreenResolution>, "SetTouchScreenResolution"},
- {1270, nullptr, "DeleteButtonConfigStorageRight"},
- {1271, nullptr, "IsUsingCustomButtonConfig"},
- {1272, nullptr, "IsAnyCustomButtonConfigEnabled"},
- {1273, nullptr, "SetAllCustomButtonConfigEnabled"},
- {1274, nullptr, "SetDefaultButtonConfig"},
- {1275, nullptr, "SetAllDefaultButtonConfig"},
- {1276, nullptr, "SetHidButtonConfigEmbedded"},
- {1277, nullptr, "SetHidButtonConfigFull"},
- {1278, nullptr, "SetHidButtonConfigLeft"},
- {1279, nullptr, "SetHidButtonConfigRight"},
- {1280, nullptr, "GetHidButtonConfigEmbedded"},
- {1281, nullptr, "GetHidButtonConfigFull"},
- {1282, nullptr, "GetHidButtonConfigLeft"},
- {1283, nullptr, "GetHidButtonConfigRight"},
- {1284, nullptr, "GetButtonConfigStorageEmbedded"},
- {1285, nullptr, "GetButtonConfigStorageFull"},
- {1286, nullptr, "GetButtonConfigStorageLeft"},
- {1287, nullptr, "GetButtonConfigStorageRight"},
- {1288, nullptr, "SetButtonConfigStorageEmbedded"},
- {1289, nullptr, "SetButtonConfigStorageFull"},
- {1290, nullptr, "SetButtonConfigStorageLeft"},
- {1291, nullptr, "SetButtonConfigStorageRight"},
- {1308, nullptr, "SetButtonConfigVisible"},
- {1309, nullptr, "IsButtonConfigVisible"},
- {1320, nullptr, "WakeTouchScreenUp"},
- {1321, nullptr, "PutTouchScreenToSleep"},
- {1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"},
- {1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"},
- {1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"},
- {1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"},
- {1420, nullptr, "GetAppletResourceProperty"},
- {2000, nullptr, "ActivateDigitizer"},
- {3000, nullptr, "GetDebugPadGenericPadMap"},
- {3001, nullptr, "SetDebugPadGenericPadMap"},
- {3002, nullptr, "ResetDebugPadGenericPadMap"},
- {3003, nullptr, "GetDebugPadKeyboardMap"},
- {3004, nullptr, "SetDebugPadKeyboardMap"},
- {3005, nullptr, "ResetDebugPadKeyboardMap"},
- {3006, nullptr, "GetFullKeyGenericPadMap"},
- {3007, nullptr, "SetFullKeyGenericPadMap"},
- {3008, nullptr, "ResetFullKeyGenericPadMap"},
- {3009, nullptr, "GetFullKeyKeyboardMap"},
- {3010, nullptr, "SetFullKeyKeyboardMap"},
- {3011, nullptr, "ResetFullKeyKeyboardMap"},
- {3012, nullptr, "GetDebugPadGenericPadMap"}, //21.0.0+
- {3013, nullptr, "SetDebugPadGenericPadMap"}, //21.0.0+
- {3014, nullptr, "GetDebugPadKeyboardMap"}, //21.0.0+
- {3015, nullptr, "SetDebugPadKeyboardMap"}, //21.0.0+
- {3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion"}, //21.0.0+
- // What? -- {12010, nullptr, "SetButtonConfigLeft"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IHidServer::~IHidServer() = default;
diff --git a/src/core/hle/service/hid/hid_server.h b/src/core/hle/service/hid/hid_server.h
index 57a1a04b9c..f2c08e9df8 100644
--- a/src/core/hle/service/hid/hid_server.h
+++ b/src/core/hle/service/hid/hid_server.h
@@ -265,6 +265,8 @@ private:
Result SetTouchScreenResolution(u32 width, u32 height, ClientAppletResourceUserId aruid);
Result SetMouseLibraryVersion(ClientAppletResourceUserId aruid);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
std::shared_ptr<ResourceManager> resource_manager;
std::shared_ptr<HidFirmwareSettings> firmware_settings;
};
diff --git a/src/core/hle/service/hid/hid_system_server.cpp b/src/core/hle/service/hid/hid_system_server.cpp
index e544adf03c..4df021f443 100644
--- a/src/core/hle/service/hid/hid_system_server.cpp
+++ b/src/core/hle/service/hid/hid_system_server.cpp
@@ -22,252 +22,6 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<Resour
std::shared_ptr<HidFirmwareSettings> settings)
: ServiceFramework{system_, "hid:sys"}, service_context{system_, service_name},
resource_manager{resource}, firmware_settings{settings} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {31, nullptr, "SendKeyboardLockKeyEvent"},
- {101, nullptr, "AcquireHomeButtonEventHandle"},
- {111, nullptr, "ActivateHomeButton"},
- {121, nullptr, "AcquireSleepButtonEventHandle"},
- {131, nullptr, "ActivateSleepButton"},
- {141, nullptr, "AcquireCaptureButtonEventHandle"},
- {151, nullptr, "ActivateCaptureButton"},
- {161, &IHidSystemServer::GetPlatformConfig, "GetPlatformConfig"},
- {210, nullptr, "AcquireNfcDeviceUpdateEventHandle"},
- {211, nullptr, "GetNpadsWithNfc"},
- {212, nullptr, "AcquireNfcActivateEventHandle"},
- {213, nullptr, "ActivateNfc"},
- {214, nullptr, "GetXcdHandleForNpadWithNfc"},
- {215, nullptr, "IsNfcActivated"},
- {216, nullptr, "GetAbstractedPadIdForNpadWithNfc"},
- {217, nullptr, "SetNfcEvent"},
- {218, nullptr, "GetNfcInfo"},
- {219, nullptr, "StartNfcDiscovery"},
- {220, nullptr, "StopNfcDiscovery"},
- {221, nullptr, "StartNtagRead"},
- {222, nullptr, "StartNtagWrite"},
- {223, nullptr, "SendNfcRawData"},
- {224, nullptr, "RegisterMifareKey"},
- {225, nullptr, "ClearMifareKey"},
- {226, nullptr, "StartMifareRead"},
- {227, nullptr, "StartMifareWrite"},
- {230, nullptr, "AcquireIrSensorEventHndle" },
- {231, nullptr, "ActivateIrSensor"},
- {232, nullptr, "GetIrSensorState"},
- {233, nullptr, "GetXcdHandleForNpadWihIrSensor" },
- {234, nullptr, "GetNpadJoyHoldType"},
- {241, nullptr, "GetDataFormat"},
- {242, nullptr, "SetDataFormat"},
- {243, nullptr, "GetMcuState"},
- {244, nullptr, "SetMcuState"},
- {245, nullptr, "GetMcuVersionForNfc"},
- {246, nullptr, "CheckNfcDevicePower"},
- {247, nullptr, "SetMcuStateImmediate"},
- {301, nullptr, "ActivateNpadSystem"},
- {303, &IHidSystemServer::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"},
- {304, &IHidSystemServer::EnableAssigningSingleOnSlSrPress, "EnableAssigningSingleOnSlSrPress"},
- {305, &IHidSystemServer::DisableAssigningSingleOnSlSrPress, "DisableAssigningSingleOnSlSrPress"},
- {306, &IHidSystemServer::GetLastActiveNpad, "GetLastActiveNpad"},
- {307, nullptr, "GetNpadSystemExtStyle"},
- {308, &IHidSystemServer::ApplyNpadSystemCommonPolicyFull, "ApplyNpadSystemCommonPolicyFull"},
- {309, &IHidSystemServer::GetNpadFullKeyGripColor, "GetNpadFullKeyGripColor"},
- {310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"},
- {311, nullptr, "SetNpadPlayerLedBlinkingDevice"},
- {312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"},
- {313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"},
- {314, nullptr, "GetAppletFooterUiType"},
- {315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"},
- {316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"},
- {317, &IHidSystemServer::GetNpadLeftRightInterfaceType, "GetNpadLeftRightInterfaceType"},
- {318, &IHidSystemServer::HasBattery, "HasBattery"},
- {319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"},
- {321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"},
- {322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"},
- {323, nullptr, "GetLastActiveUniquePad"},
- {324, nullptr, "GetUniquePadButtonSet"},
- {325, nullptr, "GetUniquePadColor"},
- {326, nullptr, "GetUniquePadAppletDetailedUiType"},
- {327, nullptr, "GetAbstractedPadIdDataFromNpad"},
- {328, nullptr, "AttachAbstractedPadToNpad"},
- {329, nullptr, "DetachAbstractedPadAll"},
- {330, nullptr, "CheckAbstractedPadConnection"},
- {332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType"}, //19.0.0+
- {333, nullptr, "SetNpadUserSpgApplet"}, //20.0.0+
- {334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle"}, //20.0.0+
- {501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"},
- {502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"},
- {503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"},
- {504, &IHidSystemServer::SetAruidValidForVibration, "SetAruidValidForVibration"},
- {505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"},
- {506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"},
- {507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"},
- {510, &IHidSystemServer::SetVibrationMasterVolume, "SetVibrationMasterVolume"},
- {511, &IHidSystemServer::GetVibrationMasterVolume, "GetVibrationMasterVolume"},
- {512, &IHidSystemServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"},
- {513, &IHidSystemServer::EndPermitVibrationSession, "EndPermitVibrationSession"},
- {514, nullptr, "Unknown514"},
- {520, nullptr, "EnableHandheldHids"},
- {521, nullptr, "DisableHandheldHids"},
- {522, nullptr, "SetJoyConRailEnabled"},
- {523, &IHidSystemServer::IsJoyConRailEnabled, "IsJoyConRailEnabled"},
- {524, nullptr, "IsHandheldHidsEnabled"},
- {525, &IHidSystemServer::IsJoyConAttachedOnAllRail, "IsJoyConAttachedOnAllRail"},
- {540, nullptr, "AcquirePlayReportControllerUsageUpdateEvent"},
- {541, nullptr, "GetPlayReportControllerUsages"},
- {542, nullptr, "AcquirePlayReportRegisteredDeviceUpdateEvent"},
- {543, nullptr, "GetRegisteredDevicesOld"},
- {544, &IHidSystemServer::AcquireConnectionTriggerTimeoutEvent, "AcquireConnectionTriggerTimeoutEvent"},
- {545, nullptr, "SendConnectionTrigger"},
- {546, &IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport, "AcquireDeviceRegisteredEventForControllerSupport"},
- {547, nullptr, "GetAllowedBluetoothLinksCount"},
- {548, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevices"},
- {549, nullptr, "GetConnectableRegisteredDevices"},
- {551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport"}, //20.0.0+ //mocked via 548 for Diablo 3 (at least)
- {700, nullptr, "ActivateUniquePad"},
- {702, &IHidSystemServer::AcquireUniquePadConnectionEventHandle, "AcquireUniquePadConnectionEventHandle"},
- {703, &IHidSystemServer::GetUniquePadIds, "GetUniquePadIds"},
- {711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle"}, //20.0.0+
- {712, nullptr, "GetUniquePadColor12"}, //20.0.0+
- {751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"},
- {800, nullptr, "ListSixAxisSensorHandles"},
- {801, nullptr, "IsSixAxisSensorUserCalibrationSupported"},
- {802, nullptr, "ResetSixAxisSensorCalibrationValues"},
- {803, nullptr, "StartSixAxisSensorUserCalibration"},
- {804, nullptr, "CancelSixAxisSensorUserCalibration"},
- {805, nullptr, "GetUniquePadBluetoothAddress"},
- {806, nullptr, "DisconnectUniquePad"},
- {807, nullptr, "GetUniquePadType"},
- {808, nullptr, "GetUniquePadInterface"},
- {809, nullptr, "GetUniquePadSerialNumber"},
- {810, nullptr, "GetUniquePadControllerNumber"},
- {811, nullptr, "GetSixAxisSensorUserCalibrationStage"},
- {812, nullptr, "GetConsoleUniqueSixAxisSensorHandle"},
- {813, nullptr, "GetDeviceType"},
- {821, nullptr, "StartAnalogStickManualCalibration"},
- {822, nullptr, "RetryCurrentAnalogStickManualCalibrationStage"},
- {823, nullptr, "CancelAnalogStickManualCalibration"},
- {824, nullptr, "ResetAnalogStickManualCalibration"},
- {825, nullptr, "GetAnalogStickState"},
- {826, nullptr, "GetAnalogStickManualCalibrationStage"},
- {827, nullptr, "IsAnalogStickButtonPressed"},
- {828, nullptr, "IsAnalogStickInReleasePosition"},
- {829, nullptr, "IsAnalogStickInCircumference"},
- {830, nullptr, "SetNotificationLedPattern"},
- {831, nullptr, "SetNotificationLedPatternWithTimeout"},
- {832, nullptr, "PrepareHidsForNotificationWake"},
- {850, &IHidSystemServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"},
- {851, &IHidSystemServer::EnableUsbFullKeyController, "EnableUsbFullKeyController"},
- {852, nullptr, "IsUsbConnected"},
- {870, &IHidSystemServer::IsHandheldButtonPressedOnConsoleMode, "IsHandheldButtonPressedOnConsoleMode"},
- {900, nullptr, "ActivateInputDetector"},
- {901, nullptr, "NotifyInputDetector"},
- {1000, &IHidSystemServer::InitializeFirmwareUpdate, "InitializeFirmwareUpdate"},
- {1001, nullptr, "GetFirmwareVersion"},
- {1002, nullptr, "GetAvailableFirmwareVersion"},
- {1003, nullptr, "IsFirmwareUpdateAvailable"},
- {1004, &IHidSystemServer::CheckFirmwareUpdateRequired, "CheckFirmwareUpdateRequired"},
- {1005, nullptr, "StartFirmwareUpdate"},
- {1006, nullptr, "AbortFirmwareUpdate"},
- {1007, nullptr, "GetFirmwareUpdateState"},
- {1008, nullptr, "ActivateAudioControl"},
- {1009, nullptr, "AcquireAudioControlEventHandle"},
- {1010, nullptr, "GetAudioControlStates"},
- {1011, nullptr, "DeactivateAudioControl"},
- {1012, nullptr, "GetFirmwareVersionStringForUserSupportPage"},
- {1050, nullptr, "IsSixAxisSensorAccurateUserCalibrationSupported"},
- {1051, nullptr, "StartSixAxisSensorAccurateUserCalibration"},
- {1052, nullptr, "CancelSixAxisSensorAccurateUserCalibration"},
- {1053, nullptr, "GetSixAxisSensorAccurateUserCalibrationState"},
- {1100, nullptr, "GetHidbusSystemServiceObject"},
- {1120, &IHidSystemServer::SetFirmwareHotfixUpdateSkipEnabled, "SetFirmwareHotfixUpdateSkipEnabled"},
- {1130, &IHidSystemServer::InitializeUsbFirmwareUpdate, "InitializeUsbFirmwareUpdate"},
- {1131, &IHidSystemServer::FinalizeUsbFirmwareUpdate, "FinalizeUsbFirmwareUpdate"},
- {1132, &IHidSystemServer::CheckUsbFirmwareUpdateRequired, "CheckUsbFirmwareUpdateRequired"},
- {1133, nullptr, "StartUsbFirmwareUpdate"},
- {1134, nullptr, "GetUsbFirmwareUpdateState"},
- {1135, &IHidSystemServer::InitializeUsbFirmwareUpdateWithoutMemory, "InitializeUsbFirmwareUpdateWithoutMemory"},
- {1150, &IHidSystemServer::SetTouchScreenMagnification, "SetTouchScreenMagnification"},
- {1151, &IHidSystemServer::GetTouchScreenFirmwareVersion, "GetTouchScreenFirmwareVersion"},
- {1152, &IHidSystemServer::SetTouchScreenDefaultConfiguration, "SetTouchScreenDefaultConfiguration"},
- {1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"},
- {1154, nullptr, "IsFirmwareAvailableForNotification"},
- {1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"},
- {1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
- {1157, nullptr, "CancelConnectionTrigger"},
- {1158, nullptr, "SetConnectionLimitForSplay"}, //20.1.0+
- {1159, nullptr, "ClearConnectionLimitForSplay"}, //20.1.0+
- {1200, nullptr, "IsButtonConfigSupported"},
- {1201, nullptr, "IsButtonConfigEmbeddedSupported"},
- {1202, nullptr, "DeleteButtonConfig"},
- {1203, nullptr, "DeleteButtonConfigEmbedded"},
- {1204, nullptr, "SetButtonConfigEnabled"},
- {1205, nullptr, "SetButtonConfigEmbeddedEnabled"},
- {1206, nullptr, "IsButtonConfigEnabled"},
- {1207, nullptr, "IsButtonConfigEmbeddedEnabled"},
- {1208, nullptr, "SetButtonConfigEmbedded"},
- {1209, nullptr, "SetButtonConfigFull"},
- {1210, nullptr, "SetButtonConfigLeft"},
- {1211, nullptr, "SetButtonConfigRight"},
- {1212, nullptr, "GetButtonConfigEmbedded"},
- {1213, nullptr, "GetButtonConfigFull"},
- {1214, nullptr, "GetButtonConfigLeft"},
- {1215, nullptr, "GetButtonConfigRight"},
- {1250, nullptr, "IsCustomButtonConfigSupported"},
- {1251, nullptr, "IsDefaultButtonConfigEmbedded"},
- {1252, nullptr, "IsDefaultButtonConfigFull"},
- {1253, nullptr, "IsDefaultButtonConfigLeft"},
- {1254, nullptr, "IsDefaultButtonConfigRight"},
- {1255, nullptr, "IsButtonConfigStorageEmbeddedEmpty"},
- {1256, nullptr, "IsButtonConfigStorageFullEmpty"},
- {1257, nullptr, "IsButtonConfigStorageLeftEmpty"},
- {1258, nullptr, "IsButtonConfigStorageRightEmpty"},
- {1259, nullptr, "GetButtonConfigStorageEmbeddedDeprecated"},
- {1260, nullptr, "GetButtonConfigStorageFullDeprecated"},
- {1261, nullptr, "GetButtonConfigStorageLeftDeprecated"},
- {1262, nullptr, "GetButtonConfigStorageRightDeprecated"},
- {1263, nullptr, "SetButtonConfigStorageEmbeddedDeprecated"},
- {1264, nullptr, "SetButtonConfigStorageFullDeprecated"},
- {1265, nullptr, "SetButtonConfigStorageLeftDeprecated"},
- {1266, nullptr, "SetButtonConfigStorageRightDeprecated"},
- {1267, nullptr, "DeleteButtonConfigStorageEmbedded"},
- {1268, nullptr, "DeleteButtonConfigStorageFull"},
- {1269, nullptr, "DeleteButtonConfigStorageLeft"},
- {1270, nullptr, "DeleteButtonConfigStorageRight"},
- {1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"},
- {1272, &IHidSystemServer::IsAnyCustomButtonConfigEnabled, "IsAnyCustomButtonConfigEnabled"},
- {1273, nullptr, "SetAllCustomButtonConfigEnabled"},
- {1274, nullptr, "SetDefaultButtonConfig"},
- {1275, nullptr, "SetAllDefaultButtonConfig"},
- {1276, nullptr, "SetHidButtonConfigEmbedded"},
- {1277, nullptr, "SetHidButtonConfigFull"},
- {1278, nullptr, "SetHidButtonConfigLeft"},
- {1279, nullptr, "SetHidButtonConfigRight"},
- {1280, nullptr, "GetHidButtonConfigEmbedded"},
- {1281, nullptr, "GetHidButtonConfigFull"},
- {1282, nullptr, "GetHidButtonConfigLeft"},
- {1283, nullptr, "GetHidButtonConfigRight"},
- {1284, nullptr, "GetButtonConfigStorageEmbedded"},
- {1285, nullptr, "GetButtonConfigStorageFull"},
- {1286, nullptr, "GetButtonConfigStorageLeft"},
- {1287, nullptr, "GetButtonConfigStorageRight"},
- {1288, nullptr, "SetButtonConfigStorageEmbedded"},
- {1289, nullptr, "SetButtonConfigStorageFull"},
- {1290, nullptr, "DeleteButtonConfigStorageRight"},
- {1291, nullptr, "DeleteButtonConfigStorageRight"},
- {1308, nullptr, "SetButtonConfigVisible"}, //18.0.0+
- {1309, nullptr, "IsButtonConfigVisible"}, //18.0.0+
- {1320, nullptr, "WakeTouchScreenUp"}, //17.0.0+
- {1321, nullptr, "PutTouchScreenToSleep"}, //17.0.0+
- {1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"}, //20.0.0+
- {1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"}, //21.0.0+
- {1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"}, //21.0.0+
- {1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"}, //21.0.0+
- {1326, nullptr, "SetTouchScreenOffset"}, //21.0.0+
- {1420, nullptr, "GetAppletResourceProperty"}, //19.0.0+
- {12010, nullptr, "SetButtonConfigLeft"} //11.0.0-17.0.1
- };
- // clang-format on
-
- RegisterHandlers(functions);
joy_detach_event = service_context.CreateEvent("IHidSystemServer::JoyDetachEvent");
acquire_device_registered_event =
diff --git a/src/core/hle/service/hid/hid_system_server.h b/src/core/hle/service/hid/hid_system_server.h
index 1a4f244d72..e5da7bbdac 100644
--- a/src/core/hle/service/hid/hid_system_server.h
+++ b/src/core/hle/service/hid/hid_system_server.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -81,6 +84,252 @@ private:
std::shared_ptr<ResourceManager> GetResourceManager();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{31, nullptr, "SendKeyboardLockKeyEvent"},
+ FunctionInfo{101, nullptr, "AcquireHomeButtonEventHandle"},
+ FunctionInfo{111, nullptr, "ActivateHomeButton"},
+ FunctionInfo{121, nullptr, "AcquireSleepButtonEventHandle"},
+ FunctionInfo{131, nullptr, "ActivateSleepButton"},
+ FunctionInfo{141, nullptr, "AcquireCaptureButtonEventHandle"},
+ FunctionInfo{151, nullptr, "ActivateCaptureButton"},
+ FunctionInfo{161, &IHidSystemServer::GetPlatformConfig, "GetPlatformConfig"},
+ FunctionInfo{210, nullptr, "AcquireNfcDeviceUpdateEventHandle"},
+ FunctionInfo{211, nullptr, "GetNpadsWithNfc"},
+ FunctionInfo{212, nullptr, "AcquireNfcActivateEventHandle"},
+ FunctionInfo{213, nullptr, "ActivateNfc"},
+ FunctionInfo{214, nullptr, "GetXcdHandleForNpadWithNfc"},
+ FunctionInfo{215, nullptr, "IsNfcActivated"},
+ FunctionInfo{216, nullptr, "GetAbstractedPadIdForNpadWithNfc"},
+ FunctionInfo{217, nullptr, "SetNfcEvent"},
+ FunctionInfo{218, nullptr, "GetNfcInfo"},
+ FunctionInfo{219, nullptr, "StartNfcDiscovery"},
+ FunctionInfo{220, nullptr, "StopNfcDiscovery"},
+ FunctionInfo{221, nullptr, "StartNtagRead"},
+ FunctionInfo{222, nullptr, "StartNtagWrite"},
+ FunctionInfo{223, nullptr, "SendNfcRawData"},
+ FunctionInfo{224, nullptr, "RegisterMifareKey"},
+ FunctionInfo{225, nullptr, "ClearMifareKey"},
+ FunctionInfo{226, nullptr, "StartMifareRead"},
+ FunctionInfo{227, nullptr, "StartMifareWrite"},
+ FunctionInfo{230, nullptr, "AcquireIrSensorEventHndle" },
+ FunctionInfo{231, nullptr, "ActivateIrSensor"},
+ FunctionInfo{232, nullptr, "GetIrSensorState"},
+ FunctionInfo{233, nullptr, "GetXcdHandleForNpadWihIrSensor" },
+ FunctionInfo{234, nullptr, "GetNpadJoyHoldType"},
+ FunctionInfo{241, nullptr, "GetDataFormat"},
+ FunctionInfo{242, nullptr, "SetDataFormat"},
+ FunctionInfo{243, nullptr, "GetMcuState"},
+ FunctionInfo{244, nullptr, "SetMcuState"},
+ FunctionInfo{245, nullptr, "GetMcuVersionForNfc"},
+ FunctionInfo{246, nullptr, "CheckNfcDevicePower"},
+ FunctionInfo{247, nullptr, "SetMcuStateImmediate"},
+ FunctionInfo{301, nullptr, "ActivateNpadSystem"},
+ FunctionInfo{303, &IHidSystemServer::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"},
+ FunctionInfo{304, &IHidSystemServer::EnableAssigningSingleOnSlSrPress, "EnableAssigningSingleOnSlSrPress"},
+ FunctionInfo{305, &IHidSystemServer::DisableAssigningSingleOnSlSrPress, "DisableAssigningSingleOnSlSrPress"},
+ FunctionInfo{306, &IHidSystemServer::GetLastActiveNpad, "GetLastActiveNpad"},
+ FunctionInfo{307, nullptr, "GetNpadSystemExtStyle"},
+ FunctionInfo{308, &IHidSystemServer::ApplyNpadSystemCommonPolicyFull, "ApplyNpadSystemCommonPolicyFull"},
+ FunctionInfo{309, &IHidSystemServer::GetNpadFullKeyGripColor, "GetNpadFullKeyGripColor"},
+ FunctionInfo{310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"},
+ FunctionInfo{311, nullptr, "SetNpadPlayerLedBlinkingDevice"},
+ FunctionInfo{312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"},
+ FunctionInfo{313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"},
+ FunctionInfo{314, nullptr, "GetAppletFooterUiType"},
+ FunctionInfo{315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"},
+ FunctionInfo{316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"},
+ FunctionInfo{317, &IHidSystemServer::GetNpadLeftRightInterfaceType, "GetNpadLeftRightInterfaceType"},
+ FunctionInfo{318, &IHidSystemServer::HasBattery, "HasBattery"},
+ FunctionInfo{319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"},
+ FunctionInfo{321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"},
+ FunctionInfo{322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"},
+ FunctionInfo{323, nullptr, "GetLastActiveUniquePad"},
+ FunctionInfo{324, nullptr, "GetUniquePadButtonSet"},
+ FunctionInfo{325, nullptr, "GetUniquePadColor"},
+ FunctionInfo{326, nullptr, "GetUniquePadAppletDetailedUiType"},
+ FunctionInfo{327, nullptr, "GetAbstractedPadIdDataFromNpad"},
+ FunctionInfo{328, nullptr, "AttachAbstractedPadToNpad"},
+ FunctionInfo{329, nullptr, "DetachAbstractedPadAll"},
+ FunctionInfo{330, nullptr, "CheckAbstractedPadConnection"},
+ FunctionInfo{332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType", MakeVersionGate({19,0,0})},
+ FunctionInfo{333, nullptr, "SetNpadUserSpgApplet", MakeVersionGate({20,0,0})},
+ FunctionInfo{334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle", MakeVersionGate({20,0,0})},
+ FunctionInfo{501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"},
+ FunctionInfo{502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"},
+ FunctionInfo{503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"},
+ FunctionInfo{504, &IHidSystemServer::SetAruidValidForVibration, "SetAruidValidForVibration"},
+ FunctionInfo{505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"},
+ FunctionInfo{506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"},
+ FunctionInfo{507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"},
+ FunctionInfo{510, &IHidSystemServer::SetVibrationMasterVolume, "SetVibrationMasterVolume"},
+ FunctionInfo{511, &IHidSystemServer::GetVibrationMasterVolume, "GetVibrationMasterVolume"},
+ FunctionInfo{512, &IHidSystemServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"},
+ FunctionInfo{513, &IHidSystemServer::EndPermitVibrationSession, "EndPermitVibrationSession"},
+ FunctionInfo{514, nullptr, "Unknown514"},
+ FunctionInfo{520, nullptr, "EnableHandheldHids"},
+ FunctionInfo{521, nullptr, "DisableHandheldHids"},
+ FunctionInfo{522, nullptr, "SetJoyConRailEnabled"},
+ FunctionInfo{523, &IHidSystemServer::IsJoyConRailEnabled, "IsJoyConRailEnabled"},
+ FunctionInfo{524, nullptr, "IsHandheldHidsEnabled"},
+ FunctionInfo{525, &IHidSystemServer::IsJoyConAttachedOnAllRail, "IsJoyConAttachedOnAllRail"},
+ FunctionInfo{540, nullptr, "AcquirePlayReportControllerUsageUpdateEvent"},
+ FunctionInfo{541, nullptr, "GetPlayReportControllerUsages"},
+ FunctionInfo{542, nullptr, "AcquirePlayReportRegisteredDeviceUpdateEvent"},
+ FunctionInfo{543, nullptr, "GetRegisteredDevicesOld"},
+ FunctionInfo{544, &IHidSystemServer::AcquireConnectionTriggerTimeoutEvent, "AcquireConnectionTriggerTimeoutEvent"},
+ FunctionInfo{545, nullptr, "SendConnectionTrigger"},
+ FunctionInfo{546, &IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport, "AcquireDeviceRegisteredEventForControllerSupport"},
+ FunctionInfo{547, nullptr, "GetAllowedBluetoothLinksCount"},
+ FunctionInfo{548, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevices"},
+ FunctionInfo{549, nullptr, "GetConnectableRegisteredDevices"},
+ FunctionInfo{551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport", MakeVersionGate({20,0,0})}, //mocked via 548 for Diablo 3 (at least)
+ FunctionInfo{700, nullptr, "ActivateUniquePad"},
+ FunctionInfo{702, &IHidSystemServer::AcquireUniquePadConnectionEventHandle, "AcquireUniquePadConnectionEventHandle"},
+ FunctionInfo{703, &IHidSystemServer::GetUniquePadIds, "GetUniquePadIds"},
+ FunctionInfo{711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle", MakeVersionGate({20,0,0})},
+ FunctionInfo{712, nullptr, "GetUniquePadColor12", MakeVersionGate({20,0,0})},
+ FunctionInfo{751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"},
+ FunctionInfo{800, nullptr, "ListSixAxisSensorHandles"},
+ FunctionInfo{801, nullptr, "IsSixAxisSensorUserCalibrationSupported"},
+ FunctionInfo{802, nullptr, "ResetSixAxisSensorCalibrationValues"},
+ FunctionInfo{803, nullptr, "StartSixAxisSensorUserCalibration"},
+ FunctionInfo{804, nullptr, "CancelSixAxisSensorUserCalibration"},
+ FunctionInfo{805, nullptr, "GetUniquePadBluetoothAddress"},
+ FunctionInfo{806, nullptr, "DisconnectUniquePad"},
+ FunctionInfo{807, nullptr, "GetUniquePadType"},
+ FunctionInfo{808, nullptr, "GetUniquePadInterface"},
+ FunctionInfo{809, nullptr, "GetUniquePadSerialNumber"},
+ FunctionInfo{810, nullptr, "GetUniquePadControllerNumber"},
+ FunctionInfo{811, nullptr, "GetSixAxisSensorUserCalibrationStage"},
+ FunctionInfo{812, nullptr, "GetConsoleUniqueSixAxisSensorHandle"},
+ FunctionInfo{813, nullptr, "GetDeviceType"},
+ FunctionInfo{821, nullptr, "StartAnalogStickManualCalibration"},
+ FunctionInfo{822, nullptr, "RetryCurrentAnalogStickManualCalibrationStage"},
+ FunctionInfo{823, nullptr, "CancelAnalogStickManualCalibration"},
+ FunctionInfo{824, nullptr, "ResetAnalogStickManualCalibration"},
+ FunctionInfo{825, nullptr, "GetAnalogStickState"},
+ FunctionInfo{826, nullptr, "GetAnalogStickManualCalibrationStage"},
+ FunctionInfo{827, nullptr, "IsAnalogStickButtonPressed"},
+ FunctionInfo{828, nullptr, "IsAnalogStickInReleasePosition"},
+ FunctionInfo{829, nullptr, "IsAnalogStickInCircumference"},
+ FunctionInfo{830, nullptr, "SetNotificationLedPattern"},
+ FunctionInfo{831, nullptr, "SetNotificationLedPatternWithTimeout"},
+ FunctionInfo{832, nullptr, "PrepareHidsForNotificationWake"},
+ FunctionInfo{850, &IHidSystemServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"},
+ FunctionInfo{851, &IHidSystemServer::EnableUsbFullKeyController, "EnableUsbFullKeyController"},
+ FunctionInfo{852, nullptr, "IsUsbConnected"},
+ FunctionInfo{870, &IHidSystemServer::IsHandheldButtonPressedOnConsoleMode, "IsHandheldButtonPressedOnConsoleMode"},
+ FunctionInfo{900, nullptr, "ActivateInputDetector"},
+ FunctionInfo{901, nullptr, "NotifyInputDetector"},
+ FunctionInfo{1000, &IHidSystemServer::InitializeFirmwareUpdate, "InitializeFirmwareUpdate"},
+ FunctionInfo{1001, nullptr, "GetFirmwareVersion"},
+ FunctionInfo{1002, nullptr, "GetAvailableFirmwareVersion"},
+ FunctionInfo{1003, nullptr, "IsFirmwareUpdateAvailable"},
+ FunctionInfo{1004, &IHidSystemServer::CheckFirmwareUpdateRequired, "CheckFirmwareUpdateRequired"},
+ FunctionInfo{1005, nullptr, "StartFirmwareUpdate"},
+ FunctionInfo{1006, nullptr, "AbortFirmwareUpdate"},
+ FunctionInfo{1007, nullptr, "GetFirmwareUpdateState"},
+ FunctionInfo{1008, nullptr, "ActivateAudioControl"},
+ FunctionInfo{1009, nullptr, "AcquireAudioControlEventHandle"},
+ FunctionInfo{1010, nullptr, "GetAudioControlStates"},
+ FunctionInfo{1011, nullptr, "DeactivateAudioControl"},
+ FunctionInfo{1012, nullptr, "GetFirmwareVersionStringForUserSupportPage"},
+ FunctionInfo{1050, nullptr, "IsSixAxisSensorAccurateUserCalibrationSupported"},
+ FunctionInfo{1051, nullptr, "StartSixAxisSensorAccurateUserCalibration"},
+ FunctionInfo{1052, nullptr, "CancelSixAxisSensorAccurateUserCalibration"},
+ FunctionInfo{1053, nullptr, "GetSixAxisSensorAccurateUserCalibrationState"},
+ FunctionInfo{1100, nullptr, "GetHidbusSystemServiceObject"},
+ FunctionInfo{1120, &IHidSystemServer::SetFirmwareHotfixUpdateSkipEnabled, "SetFirmwareHotfixUpdateSkipEnabled"},
+ FunctionInfo{1130, &IHidSystemServer::InitializeUsbFirmwareUpdate, "InitializeUsbFirmwareUpdate"},
+ FunctionInfo{1131, &IHidSystemServer::FinalizeUsbFirmwareUpdate, "FinalizeUsbFirmwareUpdate"},
+ FunctionInfo{1132, &IHidSystemServer::CheckUsbFirmwareUpdateRequired, "CheckUsbFirmwareUpdateRequired"},
+ FunctionInfo{1133, nullptr, "StartUsbFirmwareUpdate"},
+ FunctionInfo{1134, nullptr, "GetUsbFirmwareUpdateState"},
+ FunctionInfo{1135, &IHidSystemServer::InitializeUsbFirmwareUpdateWithoutMemory, "InitializeUsbFirmwareUpdateWithoutMemory"},
+ FunctionInfo{1150, &IHidSystemServer::SetTouchScreenMagnification, "SetTouchScreenMagnification"},
+ FunctionInfo{1151, &IHidSystemServer::GetTouchScreenFirmwareVersion, "GetTouchScreenFirmwareVersion"},
+ FunctionInfo{1152, &IHidSystemServer::SetTouchScreenDefaultConfiguration, "SetTouchScreenDefaultConfiguration"},
+ FunctionInfo{1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"},
+ FunctionInfo{1154, nullptr, "IsFirmwareAvailableForNotification"},
+ FunctionInfo{1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"},
+ FunctionInfo{1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
+ FunctionInfo{1157, nullptr, "CancelConnectionTrigger"},
+ FunctionInfo{1158, nullptr, "SetConnectionLimitForSplay", MakeVersionGate({20,1,0})},
+ FunctionInfo{1159, nullptr, "ClearConnectionLimitForSplay", MakeVersionGate({20,1,0})},
+ FunctionInfo{1200, nullptr, "IsButtonConfigSupported"},
+ FunctionInfo{1201, nullptr, "IsButtonConfigEmbeddedSupported"},
+ FunctionInfo{1202, nullptr, "DeleteButtonConfig"},
+ FunctionInfo{1203, nullptr, "DeleteButtonConfigEmbedded"},
+ FunctionInfo{1204, nullptr, "SetButtonConfigEnabled"},
+ FunctionInfo{1205, nullptr, "SetButtonConfigEmbeddedEnabled"},
+ FunctionInfo{1206, nullptr, "IsButtonConfigEnabled"},
+ FunctionInfo{1207, nullptr, "IsButtonConfigEmbeddedEnabled"},
+ FunctionInfo{1208, nullptr, "SetButtonConfigEmbedded"},
+ FunctionInfo{1209, nullptr, "SetButtonConfigFull"},
+ FunctionInfo{1210, nullptr, "SetButtonConfigLeft"},
+ FunctionInfo{1211, nullptr, "SetButtonConfigRight"},
+ FunctionInfo{1212, nullptr, "GetButtonConfigEmbedded"},
+ FunctionInfo{1213, nullptr, "GetButtonConfigFull"},
+ FunctionInfo{1214, nullptr, "GetButtonConfigLeft"},
+ FunctionInfo{1215, nullptr, "GetButtonConfigRight"},
+ FunctionInfo{1250, nullptr, "IsCustomButtonConfigSupported"},
+ FunctionInfo{1251, nullptr, "IsDefaultButtonConfigEmbedded"},
+ FunctionInfo{1252, nullptr, "IsDefaultButtonConfigFull"},
+ FunctionInfo{1253, nullptr, "IsDefaultButtonConfigLeft"},
+ FunctionInfo{1254, nullptr, "IsDefaultButtonConfigRight"},
+ FunctionInfo{1255, nullptr, "IsButtonConfigStorageEmbeddedEmpty"},
+ FunctionInfo{1256, nullptr, "IsButtonConfigStorageFullEmpty"},
+ FunctionInfo{1257, nullptr, "IsButtonConfigStorageLeftEmpty"},
+ FunctionInfo{1258, nullptr, "IsButtonConfigStorageRightEmpty"},
+ FunctionInfo{1259, nullptr, "GetButtonConfigStorageEmbeddedDeprecated"},
+ FunctionInfo{1260, nullptr, "GetButtonConfigStorageFullDeprecated"},
+ FunctionInfo{1261, nullptr, "GetButtonConfigStorageLeftDeprecated"},
+ FunctionInfo{1262, nullptr, "GetButtonConfigStorageRightDeprecated"},
+ FunctionInfo{1263, nullptr, "SetButtonConfigStorageEmbeddedDeprecated"},
+ FunctionInfo{1264, nullptr, "SetButtonConfigStorageFullDeprecated"},
+ FunctionInfo{1265, nullptr, "SetButtonConfigStorageLeftDeprecated"},
+ FunctionInfo{1266, nullptr, "SetButtonConfigStorageRightDeprecated"},
+ FunctionInfo{1267, nullptr, "DeleteButtonConfigStorageEmbedded"},
+ FunctionInfo{1268, nullptr, "DeleteButtonConfigStorageFull"},
+ FunctionInfo{1269, nullptr, "DeleteButtonConfigStorageLeft"},
+ FunctionInfo{1270, nullptr, "DeleteButtonConfigStorageRight"},
+ FunctionInfo{1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"},
+ FunctionInfo{1272, &IHidSystemServer::IsAnyCustomButtonConfigEnabled, "IsAnyCustomButtonConfigEnabled"},
+ FunctionInfo{1273, nullptr, "SetAllCustomButtonConfigEnabled"},
+ FunctionInfo{1274, nullptr, "SetDefaultButtonConfig"},
+ FunctionInfo{1275, nullptr, "SetAllDefaultButtonConfig"},
+ FunctionInfo{1276, nullptr, "SetHidButtonConfigEmbedded"},
+ FunctionInfo{1277, nullptr, "SetHidButtonConfigFull"},
+ FunctionInfo{1278, nullptr, "SetHidButtonConfigLeft"},
+ FunctionInfo{1279, nullptr, "SetHidButtonConfigRight"},
+ FunctionInfo{1280, nullptr, "GetHidButtonConfigEmbedded"},
+ FunctionInfo{1281, nullptr, "GetHidButtonConfigFull"},
+ FunctionInfo{1282, nullptr, "GetHidButtonConfigLeft"},
+ FunctionInfo{1283, nullptr, "GetHidButtonConfigRight"},
+ FunctionInfo{1284, nullptr, "GetButtonConfigStorageEmbedded"},
+ FunctionInfo{1285, nullptr, "GetButtonConfigStorageFull"},
+ FunctionInfo{1286, nullptr, "GetButtonConfigStorageLeft"},
+ FunctionInfo{1287, nullptr, "GetButtonConfigStorageRight"},
+ FunctionInfo{1288, nullptr, "SetButtonConfigStorageEmbedded"},
+ FunctionInfo{1289, nullptr, "SetButtonConfigStorageFull"},
+ FunctionInfo{1290, nullptr, "DeleteButtonConfigStorageRight"},
+ FunctionInfo{1291, nullptr, "DeleteButtonConfigStorageRight"},
+ FunctionInfo{1308, nullptr, "SetButtonConfigVisible", MakeVersionGate({18,0,0})},
+ FunctionInfo{1309, nullptr, "IsButtonConfigVisible", MakeVersionGate({18,0,0})},
+ FunctionInfo{1320, nullptr, "WakeTouchScreenUp", MakeVersionGate({17,0,0})},
+ FunctionInfo{1321, nullptr, "PutTouchScreenToSleep", MakeVersionGate({17,0,0})},
+ FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent", MakeVersionGate({20,0,0})},
+ FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings", MakeVersionGate({21,0,0})},
+ FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent", MakeVersionGate({21,0,0})},
+ FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement", MakeVersionGate({21,0,0})},
+ FunctionInfo{1326, nullptr, "SetTouchScreenOffset", MakeVersionGate({21,0,0})},
+ FunctionInfo{1420, nullptr, "GetAppletResourceProperty", MakeVersionGate({19,0,0})},
+ FunctionInfo{12010, nullptr, "SetButtonConfigLeft", MakeVersionGate({11,0,0}, {17,0,1})}
+ );
+
Kernel::KEvent* acquire_connection_trigger_timeout_event;
Kernel::KEvent* acquire_device_registered_event;
Kernel::KEvent* joy_detach_event;
diff --git a/src/core/hle/service/hid/hidbus.cpp b/src/core/hle/service/hid/hidbus.cpp
index 70bb5437e3..326cfbf74b 100644
--- a/src/core/hle/service/hid/hidbus.cpp
+++ b/src/core/hle/service/hid/hidbus.cpp
@@ -26,30 +26,28 @@ namespace Service::HID {
// (15ms, 66Hz)
constexpr auto hidbus_update_ns = std::chrono::nanoseconds{15 * 1000 * 1000};
+std::optional<ServiceFrameworkBase::FunctionInfoBase> Hidbus::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, C<&Hidbus::GetBusHandle>, "GetBusHandle"},
+ FunctionInfo{2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"},
+ FunctionInfo{3, C<&Hidbus::Initialize>, "Initialize"},
+ FunctionInfo{4, C<&Hidbus::Finalize>, "Finalize"},
+ FunctionInfo{5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"},
+ FunctionInfo{6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"},
+ FunctionInfo{7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"},
+ FunctionInfo{8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"},
+ FunctionInfo{9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"},
+ FunctionInfo{10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"},
+ FunctionInfo{11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"},
+ FunctionInfo{12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"},
+ FunctionInfo{13, nullptr, "GetPollingData"},
+ FunctionInfo{14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
Hidbus::Hidbus(Core::System& system_)
: ServiceFramework{system_, "hidbus"}, service_context{system_, service_name} {
-
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, C<&Hidbus::GetBusHandle>, "GetBusHandle"},
- {2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"},
- {3, C<&Hidbus::Initialize>, "Initialize"},
- {4, C<&Hidbus::Finalize>, "Finalize"},
- {5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"},
- {6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"},
- {7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"},
- {8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"},
- {9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"},
- {10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"},
- {11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"},
- {12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"},
- {13, nullptr, "GetPollingData"},
- {14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
// Register update callbacks
hidbus_update_event = Core::Timing::CreateEvent(
"Hidbus::UpdateCallback",
diff --git a/src/core/hle/service/hid/hidbus.h b/src/core/hle/service/hid/hidbus.h
index af4d956673..9ad097150e 100644
--- a/src/core/hle/service/hid/hidbus.h
+++ b/src/core/hle/service/hid/hidbus.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -144,6 +147,8 @@ private:
}
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
bool is_hidbus_enabled{false};
HidbusStatusManager hidbus_status{};
std::array<HidbusDevice, max_number_of_handles> devices{};
diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp
index 3d87e6788d..a17395b596 100644
--- a/src/core/hle/service/hid/irs.cpp
+++ b/src/core/hle/service/hid/irs.cpp
@@ -29,32 +29,32 @@
namespace Service::IRS {
-IRS::IRS(Core::System& system_) : ServiceFramework{system_, "irs"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {302, C<&IRS::ActivateIrsensor>, "ActivateIrsensor"},
- {303, C<&IRS::DeactivateIrsensor>, "DeactivateIrsensor"},
- {304, C<&IRS::GetIrsensorSharedMemoryHandle>, "GetIrsensorSharedMemoryHandle"},
- {305, C<&IRS::StopImageProcessor>, "StopImageProcessor"},
- {306, C<&IRS::RunMomentProcessor>, "RunMomentProcessor"},
- {307, C<&IRS::RunClusteringProcessor>, "RunClusteringProcessor"},
- {308, C<&IRS::RunImageTransferProcessor>, "RunImageTransferProcessor"},
- {309, C<&IRS::GetImageTransferProcessorState>, "GetImageTransferProcessorState"},
- {310, C<&IRS::RunTeraPluginProcessor>, "RunTeraPluginProcessor"},
- {311, C<&IRS::GetNpadIrCameraHandle>, "GetNpadIrCameraHandle"},
- {312, C<&IRS::RunPointingProcessor>, "RunPointingProcessor"},
- {313, C<&IRS::SuspendImageProcessor>, "SuspendImageProcessor"},
- {314, C<&IRS::CheckFirmwareVersion>, "CheckFirmwareVersion"},
- {315, C<&IRS::SetFunctionLevel>, "SetFunctionLevel"},
- {316, C<&IRS::RunImageTransferExProcessor>, "RunImageTransferExProcessor"},
- {317, C<&IRS::RunIrLedProcessor>, "RunIrLedProcessor"},
- {318, C<&IRS::StopImageProcessorAsync>, "StopImageProcessorAsync"},
- {319, C<&IRS::ActivateIrsensorWithFunctionLevel>, "ActivateIrsensorWithFunctionLevel"},
- };
- // clang-format on
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IRS::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{302, C<&IRS::ActivateIrsensor>, "ActivateIrsensor"},
+ FunctionInfo{303, C<&IRS::DeactivateIrsensor>, "DeactivateIrsensor"},
+ FunctionInfo{304, C<&IRS::GetIrsensorSharedMemoryHandle>, "GetIrsensorSharedMemoryHandle"},
+ FunctionInfo{305, C<&IRS::StopImageProcessor>, "StopImageProcessor"},
+ FunctionInfo{306, C<&IRS::RunMomentProcessor>, "RunMomentProcessor"},
+ FunctionInfo{307, C<&IRS::RunClusteringProcessor>, "RunClusteringProcessor"},
+ FunctionInfo{308, C<&IRS::RunImageTransferProcessor>, "RunImageTransferProcessor"},
+ FunctionInfo{309, C<&IRS::GetImageTransferProcessorState>, "GetImageTransferProcessorState"},
+ FunctionInfo{310, C<&IRS::RunTeraPluginProcessor>, "RunTeraPluginProcessor"},
+ FunctionInfo{311, C<&IRS::GetNpadIrCameraHandle>, "GetNpadIrCameraHandle"},
+ FunctionInfo{312, C<&IRS::RunPointingProcessor>, "RunPointingProcessor"},
+ FunctionInfo{313, C<&IRS::SuspendImageProcessor>, "SuspendImageProcessor"},
+ FunctionInfo{314, C<&IRS::CheckFirmwareVersion>, "CheckFirmwareVersion"},
+ FunctionInfo{315, C<&IRS::SetFunctionLevel>, "SetFunctionLevel"},
+ FunctionInfo{316, C<&IRS::RunImageTransferExProcessor>, "RunImageTransferExProcessor"},
+ FunctionInfo{317, C<&IRS::RunIrLedProcessor>, "RunIrLedProcessor"},
+ FunctionInfo{318, C<&IRS::StopImageProcessorAsync>, "StopImageProcessorAsync"},
+ FunctionInfo{319, C<&IRS::ActivateIrsensorWithFunctionLevel>, "ActivateIrsensorWithFunctionLevel"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+IRS::IRS(Core::System& system_) : ServiceFramework{system_, "irs"} {
u8* raw_shared_memory = system.Kernel().GetIrsSharedMem().GetPointer();
- RegisterHandlers(functions);
shared_memory = std::construct_at(reinterpret_cast<StatusManager*>(raw_shared_memory));
npad_device = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1);
@@ -369,16 +369,6 @@ Core::IrSensor::DeviceFormat& IRS::GetIrCameraSharedMemoryDeviceEntry(
}
IRS_SYS::IRS_SYS(Core::System& system_) : ServiceFramework{system_, "irs:sys"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {500, nullptr, "SetAppletResourceUserId"},
- {501, nullptr, "RegisterAppletResourceUserId"},
- {502, nullptr, "UnregisterAppletResourceUserId"},
- {503, nullptr, "EnableAppletToGetInput"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IRS_SYS::~IRS_SYS() = default;
diff --git a/src/core/hle/service/hid/irs.h b/src/core/hle/service/hid/irs.h
index 58dfee6c36..be81ea75a9 100644
--- a/src/core/hle/service/hid/irs.h
+++ b/src/core/hle/service/hid/irs.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -154,6 +157,8 @@ private:
return static_cast<T&>(*processors[index]);
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
Core::HID::EmulatedController* npad_device = nullptr;
StatusManager* shared_memory = nullptr;
std::array<std::unique_ptr<ProcessorBase>, 9> processors{};
@@ -163,6 +168,16 @@ class IRS_SYS final : public ServiceFramework<IRS_SYS> {
public:
explicit IRS_SYS(Core::System& system);
~IRS_SYS() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{500, nullptr, "SetAppletResourceUserId"},
+ FunctionInfo{501, nullptr, "RegisterAppletResourceUserId"},
+ FunctionInfo{502, nullptr, "UnregisterAppletResourceUserId"},
+ FunctionInfo{503, nullptr, "EnableAppletToGetInput"}
+ );
};
} // namespace Service::IRS
diff --git a/src/core/hle/service/hid/xcd.cpp b/src/core/hle/service/hid/xcd.cpp
index 75cc266ea9..6b8ae7048c 100644
--- a/src/core/hle/service/hid/xcd.cpp
+++ b/src/core/hle/service/hid/xcd.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -6,33 +9,6 @@
namespace Service::HID {
XCD_SYS::XCD_SYS(Core::System& system_) : ServiceFramework{system_, "xcd:sys"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetDataFormat"},
- {1, nullptr, "SetDataFormat"},
- {2, nullptr, "GetMcuState"},
- {3, nullptr, "SetMcuState"},
- {4, nullptr, "GetMcuVersionForNfc"},
- {5, nullptr, "CheckNfcDevicePower"},
- {10, nullptr, "SetNfcEvent"},
- {11, nullptr, "GetNfcInfo"},
- {12, nullptr, "StartNfcDiscovery"},
- {13, nullptr, "StopNfcDiscovery"},
- {14, nullptr, "StartNtagRead"},
- {15, nullptr, "StartNtagWrite"},
- {16, nullptr, "SendNfcRawData"},
- {17, nullptr, "RegisterMifareKey"},
- {18, nullptr, "ClearMifareKey"},
- {19, nullptr, "StartMifareRead"},
- {20, nullptr, "StartMifareWrite"},
- {101, nullptr, "GetAwakeTriggerReasonForLeftRail"},
- {102, nullptr, "GetAwakeTriggerReasonForRightRail"},
- {103, nullptr, "GetAwakeTriggerBatteryLevelTransitionForLeftRail"},
- {104, nullptr, "GetAwakeTriggerBatteryLevelTransitionForRightRail"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
XCD_SYS::~XCD_SYS() = default;
diff --git a/src/core/hle/service/hid/xcd.h b/src/core/hle/service/hid/xcd.h
index fe0b91b919..af1dd88ef7 100644
--- a/src/core/hle/service/hid/xcd.h
+++ b/src/core/hle/service/hid/xcd.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,33 @@ class XCD_SYS final : public ServiceFramework<XCD_SYS> {
public:
explicit XCD_SYS(Core::System& system_);
~XCD_SYS() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetDataFormat"},
+ FunctionInfo{1, nullptr, "SetDataFormat"},
+ FunctionInfo{2, nullptr, "GetMcuState"},
+ FunctionInfo{3, nullptr, "SetMcuState"},
+ FunctionInfo{4, nullptr, "GetMcuVersionForNfc"},
+ FunctionInfo{5, nullptr, "CheckNfcDevicePower"},
+ FunctionInfo{10, nullptr, "SetNfcEvent"},
+ FunctionInfo{11, nullptr, "GetNfcInfo"},
+ FunctionInfo{12, nullptr, "StartNfcDiscovery"},
+ FunctionInfo{13, nullptr, "StopNfcDiscovery"},
+ FunctionInfo{14, nullptr, "StartNtagRead"},
+ FunctionInfo{15, nullptr, "StartNtagWrite"},
+ FunctionInfo{16, nullptr, "SendNfcRawData"},
+ FunctionInfo{17, nullptr, "RegisterMifareKey"},
+ FunctionInfo{18, nullptr, "ClearMifareKey"},
+ FunctionInfo{19, nullptr, "StartMifareRead"},
+ FunctionInfo{20, nullptr, "StartMifareWrite"},
+ FunctionInfo{101, nullptr, "GetAwakeTriggerReasonForLeftRail"},
+ FunctionInfo{102, nullptr, "GetAwakeTriggerReasonForRightRail"},
+ FunctionInfo{103, nullptr, "GetAwakeTriggerBatteryLevelTransitionForLeftRail"},
+ FunctionInfo{104, nullptr, "GetAwakeTriggerBatteryLevelTransitionForRightRail"}
+ );
};
} // namespace Service::HID
diff --git a/src/core/hle/service/i2c/i2c.cpp b/src/core/hle/service/i2c/i2c.cpp
index 0b242768c2..d0a5e29f8c 100644
--- a/src/core/hle/service/i2c/i2c.cpp
+++ b/src/core/hle/service/i2c/i2c.cpp
@@ -17,25 +17,26 @@ namespace Service::I2C {
class I2CSession final : public ServiceFramework<I2CSession> {
public:
- explicit I2CSession(Core::System& system_)
- : ServiceFramework{system_, "I2CSession"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "SendOld"},
- {1, nullptr, "ReceiveOld"},
- {2, nullptr, "ExecuteCommandListOld"},
- {10, C<&I2CSession::Send>, "Send"},
- {11, nullptr, "Receive"},
- {12, nullptr, "ExecuteCommandList"},
- {13, nullptr, "SetRetryPolicy"},
- };
- RegisterHandlers(functions);
- }
+ explicit I2CSession(Core::System& system_) : ServiceFramework{system_, "I2CSession"} {}
~I2CSession() override = default;
+
Result Send(InBuffer<BufferAttr_HipcMapAlias> in_data, u32 transaction_option) {
LOG_WARNING(Service, "(stubbed) topt={}", transaction_option);
R_THROW(ResultUnknown);
}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SendOld"},
+ FunctionInfo{1, nullptr, "ReceiveOld"},
+ FunctionInfo{2, nullptr, "ExecuteCommandListOld"},
+ FunctionInfo{10, C<&I2CSession::Send>, "Send"},
+ FunctionInfo{11, nullptr, "Receive"},
+ FunctionInfo{12, nullptr, "ExecuteCommandList"},
+ FunctionInfo{13, nullptr, "SetRetryPolicy"}
+ );
};
enum class I2CDevice : u32 {
@@ -45,19 +46,9 @@ enum class I2CDevice : u32 {
class I2C final : public ServiceFramework<I2C> {
public:
- explicit I2C(Core::System& system_)
- : ServiceFramework{system_, "i2c"}
- {
- static const FunctionInfo functions[] = {
- {0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"},
- {1, C<&I2C::OpenSession>, "OpenSession"},
- {2, C<&I2C::HasDevice>, "HasDevice"},
- {3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"},
- {4, C<&I2C::OpenSession2>, "OpenSession2"},
- };
- RegisterHandlers(functions);
- }
+ explicit I2C(Core::System& system_) : ServiceFramework{system_, "i2c"} {}
~I2C() override = default;
+
Result OpenSessionForDev(OutInterface<I2CSession> out_session, s32 bus_idx, u32 slave_address, u32 addressing_mode, u32 speed_mode) {
LOG_DEBUG(Service, "(stubbed)");
*out_session = std::make_shared<I2CSession>(system);
@@ -83,6 +74,17 @@ public:
*out_session = std::make_shared<I2CSession>(system);
R_SUCCEED();
}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"},
+ FunctionInfo{1, C<&I2C::OpenSession>, "OpenSession"},
+ FunctionInfo{2, C<&I2C::HasDevice>, "HasDevice"},
+ FunctionInfo{3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"},
+ FunctionInfo{4, C<&I2C::OpenSession2>, "OpenSession2"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/jit/jit.cpp b/src/core/hle/service/jit/jit.cpp
index ec3a3a8dcb..9059aaf518 100644
--- a/src/core/hle/service/jit/jit.cpp
+++ b/src/core/hle/service/jit/jit.cpp
@@ -37,18 +37,6 @@ public:
, user_ro{std::move(user_ro_)}
, context{process_->GetMemory()}
{
-
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"},
- {1, C<&IJitEnvironment::Control>, "Control"},
- {1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"},
- {1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
// Identity map user code range into sysmodule context
configuration.user_rx_memory.size = user_rx.GetSize();
configuration.user_rx_memory.offset = user_rx.GetAddress();
@@ -59,6 +47,10 @@ public:
configuration.sys_ro_memory = configuration.user_ro_memory;
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
~IJitEnvironment() {
user_rx.Finalize(system.Kernel());
user_ro.Finalize(system.Kernel());
@@ -248,6 +240,13 @@ private:
return in;
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"},
+ FunctionInfo{1, C<&IJitEnvironment::Control>, "Control"},
+ FunctionInfo{1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"},
+ FunctionInfo{1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"}
+ );
+
Kernel::KScopedAutoObject<Kernel::KProcess> process;
CodeMemory user_rx;
CodeMemory user_ro;
@@ -258,14 +257,10 @@ private:
class JITU final : public ServiceFramework<JITU> {
public:
- explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"},
- };
- // clang-format on
+ explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -294,6 +289,10 @@ private:
}
private:
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"}
+ );
+
std::mt19937_64 generate_random{};
};
diff --git a/src/core/hle/service/lbl/lbl.cpp b/src/core/hle/service/lbl/lbl.cpp
index 68a9bff2df..9b245201ff 100644
--- a/src/core/hle/service/lbl/lbl.cpp
+++ b/src/core/hle/service/lbl/lbl.cpp
@@ -18,43 +18,10 @@ namespace Service::LBL {
class LBL final : public ServiceFramework<LBL> {
public:
- explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"},
- {1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"},
- {2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"},
- {3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"},
- {4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"},
- {5, nullptr, "GetBrightnessSettingAppliedToBacklight"},
- {6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"},
- {7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"},
- {8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"},
- {9, &LBL::EnableDimming, "EnableDimming"},
- {10, &LBL::DisableDimming, "DisableDimming"},
- {11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"},
- {12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"},
- {13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"},
- {14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"},
- {15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"},
- {16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"},
- {17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"},
- {18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"},
- {19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"},
- {20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"},
- {21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"},
- {22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"},
- {23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"},
- {24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"},
- {25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"},
- {26, &LBL::EnableVrMode, "EnableVrMode"},
- {27, &LBL::DisableVrMode, "DisableVrMode"},
- {28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"},
- {29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -335,6 +302,38 @@ private:
rb.Push<u8>(auto_brightness_supported);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"},
+ FunctionInfo{1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"},
+ FunctionInfo{2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"},
+ FunctionInfo{3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"},
+ FunctionInfo{4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"},
+ FunctionInfo{5, nullptr, "GetBrightnessSettingAppliedToBacklight"},
+ FunctionInfo{6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"},
+ FunctionInfo{7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"},
+ FunctionInfo{8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"},
+ FunctionInfo{9, &LBL::EnableDimming, "EnableDimming"},
+ FunctionInfo{10, &LBL::DisableDimming, "DisableDimming"},
+ FunctionInfo{11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"},
+ FunctionInfo{12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"},
+ FunctionInfo{13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"},
+ FunctionInfo{14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"},
+ FunctionInfo{15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"},
+ FunctionInfo{16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"},
+ FunctionInfo{17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"},
+ FunctionInfo{18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"},
+ FunctionInfo{19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"},
+ FunctionInfo{20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"},
+ FunctionInfo{21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"},
+ FunctionInfo{22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"},
+ FunctionInfo{23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"},
+ FunctionInfo{24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"},
+ FunctionInfo{25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"},
+ FunctionInfo{26, &LBL::EnableVrMode, "EnableVrMode"},
+ FunctionInfo{27, &LBL::DisableVrMode, "DisableVrMode"},
+ FunctionInfo{28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"},
+ FunctionInfo{29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"}
+ );
bool vr_mode_enabled = false;
float current_brightness = 1.0f;
float ambient_light_value = 0.0f;
diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp
index 1a0165fd2e..838fe85f79 100644
--- a/src/core/hle/service/ldn/ldn.cpp
+++ b/src/core/hle/service/ldn/ldn.cpp
@@ -9,7 +9,6 @@
#include "core/hle/service/ldn/ldn.h"
#include "core/hle/service/ldn/monitor_service.h"
#include "core/hle/service/ldn/sf_monitor_service.h"
-#include "core/hle/service/ldn/sf_service.h"
#include "core/hle/service/ldn/sf_service_monitor.h"
#include "core/hle/service/ldn/system_local_communication_service.h"
#include "core/hle/service/ldn/user_local_communication_service.h"
@@ -19,14 +18,10 @@ namespace Service::LDN {
class IClientProcessMonitor final
: public ServiceFramework<IClientProcessMonitor> {
public:
- explicit IClientProcessMonitor(Core::System& system_)
- : ServiceFramework{system_, "IClientProcessMonitor"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit IClientProcessMonitor(Core::System& system_) : ServiceFramework{system_, "IClientProcessMonitor"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~IClientProcessMonitor() override = default;
private:
@@ -34,19 +29,19 @@ private:
LOG_WARNING(Service_LDN, "(STUBBED) called");
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}
+ );
};
class IMonitorServiceCreator final : public ServiceFramework<IMonitorServiceCreator> {
public:
- explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}
- };
- // clang-format on
- RegisterHandlers(functions);
- }
+ explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} {}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
private:
Result CreateMonitorService(OutInterface<IMonitorService> out_interface) {
LOG_DEBUG(Service_LDN, "called");
@@ -54,21 +49,19 @@ private:
*out_interface = std::make_shared<IMonitorService>(system);
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}
+ );
};
class ISystemServiceCreator final : public ServiceFramework<ISystemServiceCreator> {
public:
- explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"},
- {1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
- };
- // clang-format on
+ explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
-
private:
Result CreateSystemLocalCommunicationService(
OutInterface<ISystemLocalCommunicationService> out_interface) {
@@ -85,21 +78,20 @@ private:
*out_interface = std::make_shared<IClientProcessMonitor>(system);
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"},
+ FunctionInfo{1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})}
+ );
};
class IUserServiceCreator final : public ServiceFramework<IUserServiceCreator> {
public:
- explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"},
- {1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
- };
- // clang-format on
+ explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
-
private:
Result CreateUserLocalCommunicationService(
OutInterface<IUserLocalCommunicationService> out_interface) {
@@ -116,22 +108,50 @@ private:
*out_interface = std::make_shared<IClientProcessMonitor>(system);
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"},
+ FunctionInfo{1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})}
+ );
};
-class ISfServiceCreator final : public ServiceFramework<ISfServiceCreator> {
+class ISfService final : public ServiceFramework<ISfService> {
public:
- explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_)
- : ServiceFramework{system_, name_}, is_system{is_system_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"},
- {8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"},
- };
- // clang-format on
+ explicit ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {}
+ ~ISfService() override = default;
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
+ FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"},
+ FunctionInfo{272, nullptr, "GetRole"},
+ FunctionInfo{280, nullptr, "GetAdvertiseData"},
+ FunctionInfo{288, nullptr, "GetGroupInfo"},
+ FunctionInfo{296, nullptr, "GetGroupInfo2"},
+ FunctionInfo{304, nullptr, "GetGroupOwner"},
+ FunctionInfo{312, nullptr, "GetIpConfig"},
+ FunctionInfo{320, nullptr, "GetLinkLevel"},
+ FunctionInfo{512, nullptr, "Scan"},
+ FunctionInfo{768, nullptr, "CreateGroup"},
+ FunctionInfo{776, nullptr, "DestroyGroup"},
+ FunctionInfo{784, nullptr, "SetAdvertiseData"},
+ FunctionInfo{1536, nullptr, "SendToOtherGroup"},
+ FunctionInfo{1544, nullptr, "RecvFromOtherGroup"},
+ FunctionInfo{1552, nullptr, "AddAcceptableGroupId"},
+ FunctionInfo{1560, nullptr, "ClearAcceptableGroupId"}
+ );
+};
+
+class ISfServiceCreator final : public ServiceFramework<ISfServiceCreator> {
+public:
+ explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_) : ServiceFramework{system_, name_}, is_system{is_system_} {}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
private:
Result CreateNetworkService(OutInterface<ISfService> out_interface, u32 input,
u64 reserved_input) {
@@ -150,21 +170,20 @@ private:
R_SUCCEED();
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"},
+ FunctionInfo{8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"}
+ );
bool is_system{};
};
class ISfMonitorServiceCreator final : public ServiceFramework<ISfMonitorServiceCreator> {
public:
- explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"},
- };
- // clang-format on
+ explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
-
private:
Result CreateMonitorService(OutInterface<ISfMonitorService> out_interface, u64 reserved_input) {
LOG_INFO(Service_LDN, "called, reserved_input={}", reserved_input);
@@ -172,6 +191,10 @@ private:
*out_interface = std::make_shared<ISfMonitorService>(system);
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}
+ );
};
void LoopProcess(Core::System& system) {
@@ -181,12 +204,9 @@ void LoopProcess(Core::System& system) {
server_manager->RegisterNamedService("ldn:s", std::make_shared<ISystemServiceCreator>(system));
server_manager->RegisterNamedService("ldn:u", std::make_shared<IUserServiceCreator>(system));
- server_manager->RegisterNamedService(
- "lp2p:app", std::make_shared<ISfServiceCreator>(system, false, "lp2p:app"));
- server_manager->RegisterNamedService(
- "lp2p:sys", std::make_shared<ISfServiceCreator>(system, true, "lp2p:sys"));
- server_manager->RegisterNamedService("lp2p:m",
- std::make_shared<ISfMonitorServiceCreator>(system));
+ server_manager->RegisterNamedService("lp2p:app", std::make_shared<ISfServiceCreator>(system, false, "lp2p:app"));
+ server_manager->RegisterNamedService("lp2p:sys", std::make_shared<ISfServiceCreator>(system, true, "lp2p:sys"));
+ server_manager->RegisterNamedService("lp2p:m", std::make_shared<ISfMonitorServiceCreator>(system));
ServerManager::RunServer(std::move(server_manager));
}
diff --git a/src/core/hle/service/ldn/monitor_service.cpp b/src/core/hle/service/ldn/monitor_service.cpp
index ea6ac4d5dd..6a60b0b3d8 100644
--- a/src/core/hle/service/ldn/monitor_service.cpp
+++ b/src/core/hle/service/ldn/monitor_service.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -7,22 +10,22 @@
namespace Service::LDN {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IMonitorService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IMonitorService::GetStateForMonitor>, "GetStateForMonitor"},
+ FunctionInfo{1, nullptr, "GetNetworkInfoForMonitor"},
+ FunctionInfo{2, nullptr, "GetIpv4AddressForMonitor"},
+ FunctionInfo{3, nullptr, "GetDisconnectReasonForMonitor"},
+ FunctionInfo{4, nullptr, "GetSecurityParameterForMonitor"},
+ FunctionInfo{5, nullptr, "GetNetworkConfigForMonitor"},
+ FunctionInfo{100, C<&IMonitorService::InitializeMonitor>, "InitializeMonitor"},
+ FunctionInfo{101, C<&IMonitorService::FinalizeMonitor>, "FinalizeMonitor"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IMonitorService::IMonitorService(Core::System& system_)
: ServiceFramework{system_, "IMonitorService"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&IMonitorService::GetStateForMonitor>, "GetStateForMonitor"},
- {1, nullptr, "GetNetworkInfoForMonitor"},
- {2, nullptr, "GetIpv4AddressForMonitor"},
- {3, nullptr, "GetDisconnectReasonForMonitor"},
- {4, nullptr, "GetSecurityParameterForMonitor"},
- {5, nullptr, "GetNetworkConfigForMonitor"},
- {100, C<&IMonitorService::InitializeMonitor>, "InitializeMonitor"},
- {101, C<&IMonitorService::FinalizeMonitor>, "FinalizeMonitor"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IMonitorService::~IMonitorService() = default;
diff --git a/src/core/hle/service/ldn/monitor_service.h b/src/core/hle/service/ldn/monitor_service.h
index e663145b4f..9c1acd0a1e 100644
--- a/src/core/hle/service/ldn/monitor_service.h
+++ b/src/core/hle/service/ldn/monitor_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -23,6 +26,7 @@ private:
Result InitializeMonitor();
Result FinalizeMonitor();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
State state{State::None};
};
diff --git a/src/core/hle/service/ldn/sf_monitor_service.cpp b/src/core/hle/service/ldn/sf_monitor_service.cpp
index 9e6736ff2c..ebe06b2059 100644
--- a/src/core/hle/service/ldn/sf_monitor_service.cpp
+++ b/src/core/hle/service/ldn/sf_monitor_service.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -7,17 +10,17 @@
namespace Service::LDN {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ISfMonitorService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&ISfMonitorService::Initialize>, "Initialize"},
+ FunctionInfo{288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"},
+ FunctionInfo{320, nullptr, "GetLinkLevel"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
ISfMonitorService::ISfMonitorService(Core::System& system_)
: ServiceFramework{system_, "ISfMonitorService"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&ISfMonitorService::Initialize>, "Initialize"},
- {288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"},
- {320, nullptr, "GetLinkLevel"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ISfMonitorService::~ISfMonitorService() = default;
diff --git a/src/core/hle/service/ldn/sf_monitor_service.h b/src/core/hle/service/ldn/sf_monitor_service.h
index d021152010..09ca16727d 100644
--- a/src/core/hle/service/ldn/sf_monitor_service.h
+++ b/src/core/hle/service/ldn/sf_monitor_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -21,6 +24,7 @@ public:
private:
Result Initialize(Out<u32> out_value);
Result GetGroupInfo(OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/sf_service.cpp b/src/core/hle/service/ldn/sf_service.cpp
deleted file mode 100644
index 61cabe219a..0000000000
--- a/src/core/hle/service/ldn/sf_service.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#include "core/hle/service/ldn/sf_service.h"
-
-namespace Service::LDN {
-
-ISfService::ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
- {264, nullptr, "GetNetworkInterfaceLastError"},
- {272, nullptr, "GetRole"},
- {280, nullptr, "GetAdvertiseData"},
- {288, nullptr, "GetGroupInfo"},
- {296, nullptr, "GetGroupInfo2"},
- {304, nullptr, "GetGroupOwner"},
- {312, nullptr, "GetIpConfig"},
- {320, nullptr, "GetLinkLevel"},
- {512, nullptr, "Scan"},
- {768, nullptr, "CreateGroup"},
- {776, nullptr, "DestroyGroup"},
- {784, nullptr, "SetAdvertiseData"},
- {1536, nullptr, "SendToOtherGroup"},
- {1544, nullptr, "RecvFromOtherGroup"},
- {1552, nullptr, "AddAcceptableGroupId"},
- {1560, nullptr, "ClearAcceptableGroupId"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-ISfService::~ISfService() = default;
-
-} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/sf_service.h b/src/core/hle/service/ldn/sf_service.h
deleted file mode 100644
index 05534b5677..0000000000
--- a/src/core/hle/service/ldn/sf_service.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Core {
-class System;
-}
-
-namespace Service::LDN {
-
-class ISfService final : public ServiceFramework<ISfService> {
-public:
- explicit ISfService(Core::System& system_);
- ~ISfService() override;
-};
-
-} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/sf_service_monitor.cpp b/src/core/hle/service/ldn/sf_service_monitor.cpp
index 9a1cde6881..574ba82a0b 100644
--- a/src/core/hle/service/ldn/sf_service_monitor.cpp
+++ b/src/core/hle/service/ldn/sf_service_monitor.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -7,27 +10,27 @@
namespace Service::LDN {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ISfServiceMonitor::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&ISfServiceMonitor::Initialize>, "Initialize"},
+ FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
+ FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"},
+ FunctionInfo{272, nullptr, "GetRole"},
+ FunctionInfo{280, nullptr, "GetAdvertiseData"},
+ FunctionInfo{281, nullptr, "GetAdvertiseData2"},
+ FunctionInfo{288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"},
+ FunctionInfo{296, nullptr, "GetGroupInfo2"},
+ FunctionInfo{304, nullptr, "GetGroupOwner"},
+ FunctionInfo{312, nullptr, "GetIpConfig"},
+ FunctionInfo{320, nullptr, "GetLinkLevel"},
+ FunctionInfo{328, nullptr, "AttachJoinEvent"},
+ FunctionInfo{336, nullptr, "GetMembers"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
ISfServiceMonitor::ISfServiceMonitor(Core::System& system_)
: ServiceFramework{system_, "ISfServiceMonitor"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&ISfServiceMonitor::Initialize>, "Initialize"},
- {256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
- {264, nullptr, "GetNetworkInterfaceLastError"},
- {272, nullptr, "GetRole"},
- {280, nullptr, "GetAdvertiseData"},
- {281, nullptr, "GetAdvertiseData2"},
- {288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"},
- {296, nullptr, "GetGroupInfo2"},
- {304, nullptr, "GetGroupOwner"},
- {312, nullptr, "GetIpConfig"},
- {320, nullptr, "GetLinkLevel"},
- {328, nullptr, "AttachJoinEvent"},
- {336, nullptr, "GetMembers"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ISfServiceMonitor::~ISfServiceMonitor() = default;
diff --git a/src/core/hle/service/ldn/sf_service_monitor.h b/src/core/hle/service/ldn/sf_service_monitor.h
index 924cc17594..5e5e64ae6c 100644
--- a/src/core/hle/service/ldn/sf_service_monitor.h
+++ b/src/core/hle/service/ldn/sf_service_monitor.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -20,8 +23,8 @@ public:
private:
Result Initialize(Out<u32> out_value);
- Result GetGroupInfo(OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info,
- GroupInfo in_group_info);
+ Result GetGroupInfo(OutLargeData<GroupInfo, BufferAttr_HipcAutoSelect> out_group_info, GroupInfo in_group_info);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/system_local_communication_service.cpp b/src/core/hle/service/ldn/system_local_communication_service.cpp
index 7b52223cdc..9d3d49aac4 100644
--- a/src/core/hle/service/ldn/system_local_communication_service.cpp
+++ b/src/core/hle/service/ldn/system_local_communication_service.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -6,44 +9,44 @@
namespace Service::LDN {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemLocalCommunicationService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetState"},
+ FunctionInfo{1, nullptr, "GetNetworkInfo"},
+ FunctionInfo{2, nullptr, "GetIpv4Address"},
+ FunctionInfo{3, nullptr, "GetDisconnectReason"},
+ FunctionInfo{4, nullptr, "GetSecurityParameter"},
+ FunctionInfo{5, nullptr, "GetNetworkConfig"},
+ FunctionInfo{100, nullptr, "AttachStateChangeEvent"},
+ FunctionInfo{101, nullptr, "GetNetworkInfoLatestUpdate"},
+ FunctionInfo{102, nullptr, "Scan"},
+ FunctionInfo{103, nullptr, "ScanPrivate"},
+ FunctionInfo{104, nullptr, "SetWirelessControllerRestriction"},
+ FunctionInfo{200, nullptr, "OpenAccessPoint"},
+ FunctionInfo{201, nullptr, "CloseAccessPoint"},
+ FunctionInfo{202, nullptr, "CreateNetwork"},
+ FunctionInfo{203, nullptr, "CreateNetworkPrivate"},
+ FunctionInfo{204, nullptr, "DestroyNetwork"},
+ FunctionInfo{205, nullptr, "Reject"},
+ FunctionInfo{206, nullptr, "SetAdvertiseData"},
+ FunctionInfo{207, nullptr, "SetStationAcceptPolicy"},
+ FunctionInfo{208, nullptr, "AddAcceptFilterEntry"},
+ FunctionInfo{209, nullptr, "ClearAcceptFilter"},
+ FunctionInfo{300, nullptr, "OpenStation"},
+ FunctionInfo{301, nullptr, "CloseStation"},
+ FunctionInfo{302, nullptr, "Connect"},
+ FunctionInfo{303, nullptr, "ConnectPrivate"},
+ FunctionInfo{304, nullptr, "Disconnect"},
+ FunctionInfo{400, nullptr, "InitializeSystem"},
+ FunctionInfo{401, nullptr, "FinalizeSystem"},
+ FunctionInfo{402, nullptr, "SetOperationMode"},
+ FunctionInfo{403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
ISystemLocalCommunicationService::ISystemLocalCommunicationService(Core::System& system_)
: ServiceFramework{system_, "ISystemLocalCommunicationService"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetState"},
- {1, nullptr, "GetNetworkInfo"},
- {2, nullptr, "GetIpv4Address"},
- {3, nullptr, "GetDisconnectReason"},
- {4, nullptr, "GetSecurityParameter"},
- {5, nullptr, "GetNetworkConfig"},
- {100, nullptr, "AttachStateChangeEvent"},
- {101, nullptr, "GetNetworkInfoLatestUpdate"},
- {102, nullptr, "Scan"},
- {103, nullptr, "ScanPrivate"},
- {104, nullptr, "SetWirelessControllerRestriction"},
- {200, nullptr, "OpenAccessPoint"},
- {201, nullptr, "CloseAccessPoint"},
- {202, nullptr, "CreateNetwork"},
- {203, nullptr, "CreateNetworkPrivate"},
- {204, nullptr, "DestroyNetwork"},
- {205, nullptr, "Reject"},
- {206, nullptr, "SetAdvertiseData"},
- {207, nullptr, "SetStationAcceptPolicy"},
- {208, nullptr, "AddAcceptFilterEntry"},
- {209, nullptr, "ClearAcceptFilter"},
- {300, nullptr, "OpenStation"},
- {301, nullptr, "CloseStation"},
- {302, nullptr, "Connect"},
- {303, nullptr, "ConnectPrivate"},
- {304, nullptr, "Disconnect"},
- {400, nullptr, "InitializeSystem"},
- {401, nullptr, "FinalizeSystem"},
- {402, nullptr, "SetOperationMode"},
- {403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ISystemLocalCommunicationService::~ISystemLocalCommunicationService() = default;
diff --git a/src/core/hle/service/ldn/system_local_communication_service.h b/src/core/hle/service/ldn/system_local_communication_service.h
index a02b097ea7..c7e937e3a2 100644
--- a/src/core/hle/service/ldn/system_local_communication_service.h
+++ b/src/core/hle/service/ldn/system_local_communication_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -20,6 +23,7 @@ public:
private:
Result InitializeSystem2();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::LDN
diff --git a/src/core/hle/service/ldn/user_local_communication_service.cpp b/src/core/hle/service/ldn/user_local_communication_service.cpp
index 572aea6314..26a742bf0b 100644
--- a/src/core/hle/service/ldn/user_local_communication_service.cpp
+++ b/src/core/hle/service/ldn/user_local_communication_service.cpp
@@ -21,46 +21,46 @@
namespace Service::LDN {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IUserLocalCommunicationService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IUserLocalCommunicationService::GetState>, "GetState"},
+ FunctionInfo{1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"},
+ FunctionInfo{2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"},
+ FunctionInfo{3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"},
+ FunctionInfo{4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"},
+ FunctionInfo{5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"},
+ FunctionInfo{100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"},
+ FunctionInfo{101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"},
+ FunctionInfo{102, D<&IUserLocalCommunicationService::Scan>, "Scan"},
+ FunctionInfo{103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"},
+ FunctionInfo{104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"},
+ FunctionInfo{106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" },
+ FunctionInfo{200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"},
+ FunctionInfo{201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"},
+ FunctionInfo{202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"},
+ FunctionInfo{203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"},
+ FunctionInfo{204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"},
+ FunctionInfo{205, nullptr, "Reject"},
+ FunctionInfo{206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"},
+ FunctionInfo{207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"},
+ FunctionInfo{208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"},
+ FunctionInfo{209, nullptr, "ClearAcceptFilter"},
+ FunctionInfo{300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"},
+ FunctionInfo{301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"},
+ FunctionInfo{302, D<&IUserLocalCommunicationService::Connect>, "Connect"},
+ FunctionInfo{303, nullptr, "ConnectPrivate"},
+ FunctionInfo{304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"},
+ FunctionInfo{400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"},
+ FunctionInfo{401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"},
+ FunctionInfo{402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IUserLocalCommunicationService::IUserLocalCommunicationService(Core::System& system_)
: ServiceFramework{system_, "IUserLocalCommunicationService"},
service_context{system, "IUserLocalCommunicationService"},
lan_discovery{} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IUserLocalCommunicationService::GetState>, "GetState"},
- {1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"},
- {2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"},
- {3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"},
- {4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"},
- {5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"},
- {100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"},
- {101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"},
- {102, D<&IUserLocalCommunicationService::Scan>, "Scan"},
- {103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"},
- {104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"},
- { 106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" },
- {200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"},
- {201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"},
- {202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"},
- {203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"},
- {204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"},
- {205, nullptr, "Reject"},
- {206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"},
- {207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"},
- {208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"},
- {209, nullptr, "ClearAcceptFilter"},
- {300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"},
- {301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"},
- {302, D<&IUserLocalCommunicationService::Connect>, "Connect"},
- {303, nullptr, "ConnectPrivate"},
- {304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"},
- {400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"},
- {401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"},
- {402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
state_change_event =
service_context.CreateEvent("IUserLocalCommunicationService:StateChangeEvent");
diff --git a/src/core/hle/service/ldn/user_local_communication_service.h b/src/core/hle/service/ldn/user_local_communication_service.h
index 1e725ed531..6f832b7a23 100644
--- a/src/core/hle/service/ldn/user_local_communication_service.h
+++ b/src/core/hle/service/ldn/user_local_communication_service.h
@@ -1,7 +1,7 @@
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
@@ -89,6 +89,7 @@ private:
/// Callback to parse and handle a received LDN packet.
void OnLDNPacketReceived(const Network::LDNPacket& packet);
void OnEventFired();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* state_change_event;
diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp
index db4d51b49d..25ecc58fa4 100644
--- a/src/core/hle/service/ldr/ldr.cpp
+++ b/src/core/hle/service/ldr/ldr.cpp
@@ -12,47 +12,44 @@ namespace Service::LDR {
class DebugMonitor final : public ServiceFramework<DebugMonitor> {
public:
- explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetProgramArgument"},
- {1, nullptr, "FlushArguments"},
- {2, nullptr, "GetProcessModuleInfo"},
- };
- // clang-format on
+ explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} {}
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetProgramArgument"},
+ FunctionInfo{1, nullptr, "FlushArguments"},
+ FunctionInfo{2, nullptr, "GetProcessModuleInfo"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class ProcessManager final : public ServiceFramework<ProcessManager> {
public:
- explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CreateProcess"},
- {1, nullptr, "GetProgramInfo"},
- {2, nullptr, "PinProgram"},
- {3, nullptr, "UnpinProgram"},
- {4, nullptr, "SetEnabledProgramVerification"},
- };
- // clang-format on
+ explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} {}
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateProcess"},
+ FunctionInfo{1, nullptr, "GetProgramInfo"},
+ FunctionInfo{2, nullptr, "PinProgram"},
+ FunctionInfo{3, nullptr, "UnpinProgram"},
+ FunctionInfo{4, nullptr, "SetEnabledProgramVerification"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class Shell final : public ServiceFramework<Shell> {
public:
- explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetProgramArgument"},
- {1, nullptr, "FlushArguments"},
- };
- // clang-format on
+ explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} {}
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetProgramArgument"},
+ FunctionInfo{1, nullptr, "FlushArguments"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp
index d631a6dd80..be8cdf9aa9 100644
--- a/src/core/hle/service/lm/lm.cpp
+++ b/src/core/hle/service/lm/lm.cpp
@@ -87,16 +87,7 @@ DECLARE_ENUM_FLAG_OPERATORS(LogPacketFlags);
class ILogger final : public ServiceFramework<ILogger> {
public:
- explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} {
- static const FunctionInfo functions[] = {
- {0, &ILogger::Log, "Log"},
- {1, &ILogger::SetDestination, "SetDestination"},
- {2, nullptr, "TransmitHashedLog"}, //20.0.0+
- {3, nullptr, "DevNotify"}, //20.0.0+
- };
- RegisterHandlers(functions);
- }
-
+ explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} {}
private:
void Log(HLERequestContext& ctx) {
std::size_t offset{};
@@ -331,20 +322,25 @@ private:
};
static_assert(sizeof(LogPacketHeader) == 0x18, "LogPacketHeader is an invalid size");
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ILogger::Log, "Log"},
+ FunctionInfo{1, &ILogger::SetDestination, "SetDestination"},
+ FunctionInfo{2, nullptr, "TransmitHashedLog", MakeVersionGate({20,0,0})},
+ FunctionInfo{3, nullptr, "DevNotify", MakeVersionGate({20,0,0})}
+ );
::Common::unordered_map<LogPacketHeaderEntry, std::vector<u8>> entries{};
LogDestination destination{LogDestination::All};
};
class LM final : public ServiceFramework<LM> {
public:
- explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &LM::OpenLogger, "OpenLogger"},
- };
- // clang-format on
+ explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -355,21 +351,26 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<ILogger>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &LM::OpenLogger, "OpenLogger"}
+ );
};
class LM_GET final : public ServiceFramework<LM_GET> {
public:
- explicit LM_GET(Core::System& system_)
- : ServiceFramework{system_, "lm:get"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "StartLogging"},
- {1, nullptr, "StopLogging"},
- {2, nullptr, "GetLog"},
- {100, nullptr, "CreateDevNotificationReceiver"},
- };
- RegisterHandlers(functions);
+ explicit LM_GET(Core::System& system_) : ServiceFramework{system_, "lm:get"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "StartLogging"},
+ FunctionInfo{1, nullptr, "StopLogging"},
+ FunctionInfo{2, nullptr, "GetLog"},
+ FunctionInfo{100, nullptr, "CreateDevNotificationReceiver"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/mig/mig.cpp b/src/core/hle/service/mig/mig.cpp
index edc96506c0..2560050622 100644
--- a/src/core/hle/service/mig/mig.cpp
+++ b/src/core/hle/service/mig/mig.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -14,50 +14,50 @@ namespace Service::Migration {
class MIG_USR final : public ServiceFramework<MIG_USR> {
public:
- explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Unknown0"}, //19.0.0+
- {1, nullptr, "Unknown1"}, //20.0.0+
- {2, nullptr, "Unknown2"}, //20.0.0+
- {10, nullptr, "TryGetLastMigrationInfo"},
- {11, nullptr, "Unknown11"}, //20.0.0+
- {100, nullptr, "CreateUserMigrationServer"}, //7.0.0+
- {101, nullptr, "ResumeUserMigrationServer"}, //7.0.0+
- {200, nullptr, "CreateUserMigrationClient"}, //7.0.0+
- {201, nullptr, "ResumeUserMigrationClient"}, //7.0.0+
- {1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync"}, //8.0.0-20.5.0
- {1010, nullptr, "TryGetLastSaveDataMigrationInfo"}, //7.0.0+
- {1100, nullptr, "CreateSaveDataMigrationServer"}, //7.0.0-19.0.1
- {1101, nullptr, "ResumeSaveDataMigrationServer"}, //7.0.0+
- {1110, nullptr, "Unknown1101"}, //17.0.0+
- {1200, nullptr, "CreateSaveDataMigrationClient"}, //7.0.0+
- {1201, nullptr, "ResumeSaveDataMigrationClient"}, //7.0.0+
- {2001, nullptr, "Unknown2001"}, //20.0.0+
- {2010, nullptr, "Unknown2010"}, //20.0.0+
- {2100, nullptr, "Unknown2100"}, //20.0.0+
- {2110, nullptr, "Unknown2110"}, //20.0.0+
- {2200, nullptr, "Unknown2200"}, //20.0.0+
- {2210, nullptr, "Unknown2210"}, //20.0.0+
- {2220, nullptr, "Unknown2220"}, //20.0.0+
- {2230, nullptr, "Unknown2230"}, //20.0.0+
- {2231, nullptr, "Unknown2231"}, //20.0.0+
- {2232, nullptr, "Unknown2232"}, //20.0.0+
- {2233, nullptr, "Unknown2233"}, //20.0.0+
- {2234, nullptr, "Unknown2234"}, //20.0.0+
- {2250, nullptr, "Unknown2250"}, //20.0.0+
- {2260, nullptr, "Unknown2260"}, //20.0.0+
- {2270, nullptr, "Unknown2270"}, //20.0.0+
- {2280, nullptr, "Unknown2280"}, //20.0.0+
- {2300, nullptr, "Unknown2300"}, //20.0.0+
- {2310, nullptr, "Unknown2310"}, //20.0.0+
- {2400, nullptr, "Unknown2400"}, //20.0.0+
- {2420, nullptr, "Unknown2420"}, //20.0.0+
- };
- // clang-format on
+ explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Unknown0", MakeVersionGate({19,0,0})},
+ FunctionInfo{1, nullptr, "Unknown1", MakeVersionGate({20,0,0})},
+ FunctionInfo{2, nullptr, "Unknown2", MakeVersionGate({20,0,0})},
+ FunctionInfo{10, nullptr, "TryGetLastMigrationInfo"},
+ FunctionInfo{11, nullptr, "Unknown11", MakeVersionGate({20,0,0})},
+ FunctionInfo{100, nullptr, "CreateUserMigrationServer", MakeVersionGate({7,0,0})},
+ FunctionInfo{101, nullptr, "ResumeUserMigrationServer", MakeVersionGate({7,0,0})},
+ FunctionInfo{200, nullptr, "CreateUserMigrationClient", MakeVersionGate({7,0,0})},
+ FunctionInfo{201, nullptr, "ResumeUserMigrationClient", MakeVersionGate({7,0,0})},
+ FunctionInfo{1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync", MakeVersionGate({8,0,0}, {20,5,0})},
+ FunctionInfo{1010, nullptr, "TryGetLastSaveDataMigrationInfo", MakeVersionGate({7,0,0})},
+ FunctionInfo{1100, nullptr, "CreateSaveDataMigrationServer", MakeVersionGate({7,0,0}, {19,0,1})},
+ FunctionInfo{1101, nullptr, "ResumeSaveDataMigrationServer", MakeVersionGate({7,0,0})},
+ FunctionInfo{1110, nullptr, "Unknown1101", MakeVersionGate({17,0,0})},
+ FunctionInfo{1200, nullptr, "CreateSaveDataMigrationClient", MakeVersionGate({7,0,0})},
+ FunctionInfo{1201, nullptr, "ResumeSaveDataMigrationClient", MakeVersionGate({7,0,0})},
+ FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})},
+ FunctionInfo{2010, nullptr, "Unknown2010", MakeVersionGate({20,0,0})},
+ FunctionInfo{2100, nullptr, "Unknown2100", MakeVersionGate({20,0,0})},
+ FunctionInfo{2110, nullptr, "Unknown2110", MakeVersionGate({20,0,0})},
+ FunctionInfo{2200, nullptr, "Unknown2200", MakeVersionGate({20,0,0})},
+ FunctionInfo{2210, nullptr, "Unknown2210", MakeVersionGate({20,0,0})},
+ FunctionInfo{2220, nullptr, "Unknown2220", MakeVersionGate({20,0,0})},
+ FunctionInfo{2230, nullptr, "Unknown2230", MakeVersionGate({20,0,0})},
+ FunctionInfo{2231, nullptr, "Unknown2231", MakeVersionGate({20,0,0})},
+ FunctionInfo{2232, nullptr, "Unknown2232", MakeVersionGate({20,0,0})},
+ FunctionInfo{2233, nullptr, "Unknown2233", MakeVersionGate({20,0,0})},
+ FunctionInfo{2234, nullptr, "Unknown2234", MakeVersionGate({20,0,0})},
+ FunctionInfo{2250, nullptr, "Unknown2250", MakeVersionGate({20,0,0})},
+ FunctionInfo{2260, nullptr, "Unknown2260", MakeVersionGate({20,0,0})},
+ FunctionInfo{2270, nullptr, "Unknown2270", MakeVersionGate({20,0,0})},
+ FunctionInfo{2280, nullptr, "Unknown2280", MakeVersionGate({20,0,0})},
+ FunctionInfo{2300, nullptr, "Unknown2300", MakeVersionGate({20,0,0})},
+ FunctionInfo{2310, nullptr, "Unknown2310", MakeVersionGate({20,0,0})},
+ FunctionInfo{2400, nullptr, "Unknown2400", MakeVersionGate({20,0,0})},
+ FunctionInfo{2420, nullptr, "Unknown2420", MakeVersionGate({20,0,0})}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/mii/mii.cpp b/src/core/hle/service/mii/mii.cpp
index 513bb671f8..642a9e4907 100644
--- a/src/core/hle/service/mii/mii.cpp
+++ b/src/core/hle/service/mii/mii.cpp
@@ -22,51 +22,27 @@
namespace Service::Mii {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IStaticService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IStaticService::GetDatabaseService>, "GetDatabaseService"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
class IDatabaseService final : public ServiceFramework<IDatabaseService> {
public:
- explicit IDatabaseService(Core::System& system_, std::shared_ptr<MiiManager> mii_manager,
- bool is_system_)
- : ServiceFramework{system_, "IDatabaseService"}, manager{mii_manager}, is_system{
- is_system_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IDatabaseService::IsUpdated>, "IsUpdated"},
- {1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"},
- {2, D<&IDatabaseService::GetCount>, "GetCount"},
- {3, D<&IDatabaseService::Get>, "Get"},
- {4, D<&IDatabaseService::Get1>, "Get1"},
- {5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"},
- {6, D<&IDatabaseService::BuildRandom>, "BuildRandom"},
- {7, D<&IDatabaseService::BuildDefault>, "BuildDefault"},
- {8, D<&IDatabaseService::Get2>, "Get2"},
- {9, D<&IDatabaseService::Get3>, "Get3"},
- {10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"},
- {11, D<&IDatabaseService::FindIndex>, "FindIndex"},
- {12, D<&IDatabaseService::Move>, "Move"},
- {13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"},
- {14, D<&IDatabaseService::Delete>, "Delete"},
- {15, D<&IDatabaseService::DestroyFile>, "DestroyFile"},
- {16, D<&IDatabaseService::DeleteFile>, "DeleteFile"},
- {17, D<&IDatabaseService::Format>, "Format"},
- {18, nullptr, "Import"},
- {19, nullptr, "Export"},
- {20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"},
- {21, D<&IDatabaseService::GetIndex>, "GetIndex"},
- {22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"},
- {23, D<&IDatabaseService::Convert>, "Convert"},
- {24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"},
- {25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"},
- {26, D<&IDatabaseService::Append>, "Append"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
- m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>(
- "set:sys", true);
+ explicit IDatabaseService(Core::System& system_, std::shared_ptr<MiiManager> mii_manager, bool is_system_)
+ : ServiceFramework{system_, "IDatabaseService"}
+ , manager{mii_manager}
+ , is_system{is_system_} {
+ m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
manager->Initialize(metadata);
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
private:
Result IsUpdated(Out<bool> out_is_updated, SourceFlag source_flag) {
LOG_DEBUG(Service_Mii, "called with source_flag={}", source_flag);
@@ -288,23 +264,45 @@ private:
R_RETURN(manager->Append(metadata, char_info));
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IDatabaseService::IsUpdated>, "IsUpdated"},
+ FunctionInfo{1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"},
+ FunctionInfo{2, D<&IDatabaseService::GetCount>, "GetCount"},
+ FunctionInfo{3, D<&IDatabaseService::Get>, "Get"},
+ FunctionInfo{4, D<&IDatabaseService::Get1>, "Get1"},
+ FunctionInfo{5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"},
+ FunctionInfo{6, D<&IDatabaseService::BuildRandom>, "BuildRandom"},
+ FunctionInfo{7, D<&IDatabaseService::BuildDefault>, "BuildDefault"},
+ FunctionInfo{8, D<&IDatabaseService::Get2>, "Get2"},
+ FunctionInfo{9, D<&IDatabaseService::Get3>, "Get3"},
+ FunctionInfo{10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"},
+ FunctionInfo{11, D<&IDatabaseService::FindIndex>, "FindIndex"},
+ FunctionInfo{12, D<&IDatabaseService::Move>, "Move"},
+ FunctionInfo{13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"},
+ FunctionInfo{14, D<&IDatabaseService::Delete>, "Delete"},
+ FunctionInfo{15, D<&IDatabaseService::DestroyFile>, "DestroyFile"},
+ FunctionInfo{16, D<&IDatabaseService::DeleteFile>, "DeleteFile"},
+ FunctionInfo{17, D<&IDatabaseService::Format>, "Format"},
+ FunctionInfo{18, nullptr, "Import"},
+ FunctionInfo{19, nullptr, "Export"},
+ FunctionInfo{20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"},
+ FunctionInfo{21, D<&IDatabaseService::GetIndex>, "GetIndex"},
+ FunctionInfo{22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"},
+ FunctionInfo{23, D<&IDatabaseService::Convert>, "Convert"},
+ FunctionInfo{24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"},
+ FunctionInfo{25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"},
+ FunctionInfo{26, D<&IDatabaseService::Append>, "Append"}
+ );
+
std::shared_ptr<MiiManager> manager = nullptr;
DatabaseSessionMetadata metadata{};
bool is_system{};
-
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
};
IStaticService::IStaticService(Core::System& system_, const char* name_,
std::shared_ptr<MiiManager> mii_manager, bool is_system_)
: ServiceFramework{system_, name_}, manager{mii_manager}, is_system{is_system_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IStaticService::GetDatabaseService>, "GetDatabaseService"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IStaticService::~IStaticService() = default;
@@ -324,27 +322,10 @@ std::shared_ptr<MiiManager> IStaticService::GetMiiManager() {
class IImageDatabaseService final : public ServiceFramework<IImageDatabaseService> {
public:
- explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IImageDatabaseService::Initialize>, "Initialize"},
- {10, nullptr, "Reload"},
- {11, D<&IImageDatabaseService::GetCount>, "GetCount"},
- {12, nullptr, "IsEmpty"},
- {13, nullptr, "IsFull"},
- {14, nullptr, "GetAttribute"},
- {15, nullptr, "LoadImage"},
- {16, nullptr, "AddOrUpdateImage"},
- {17, nullptr, "DeleteImages"},
- {100, nullptr, "DeleteFile"},
- {101, nullptr, "DestroyFile"},
- {102, nullptr, "ImportFile"},
- {103, nullptr, "ExportFile"},
- {104, nullptr, "ForceInitialize"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -361,6 +342,23 @@ private:
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IImageDatabaseService::Initialize>, "Initialize"},
+ FunctionInfo{10, nullptr, "Reload"},
+ FunctionInfo{11, D<&IImageDatabaseService::GetCount>, "GetCount"},
+ FunctionInfo{12, nullptr, "IsEmpty"},
+ FunctionInfo{13, nullptr, "IsFull"},
+ FunctionInfo{14, nullptr, "GetAttribute"},
+ FunctionInfo{15, nullptr, "LoadImage"},
+ FunctionInfo{16, nullptr, "AddOrUpdateImage"},
+ FunctionInfo{17, nullptr, "DeleteImages"},
+ FunctionInfo{100, nullptr, "DeleteFile"},
+ FunctionInfo{101, nullptr, "DestroyFile"},
+ FunctionInfo{102, nullptr, "ImportFile"},
+ FunctionInfo{103, nullptr, "ExportFile"},
+ FunctionInfo{104, nullptr, "ForceInitialize"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/mii/mii.h b/src/core/hle/service/mii/mii.h
index 8683ac1a52..ba20db40d7 100644
--- a/src/core/hle/service/mii/mii.h
+++ b/src/core/hle/service/mii/mii.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -24,6 +27,7 @@ public:
private:
Result GetDatabaseService(Out<SharedPointer<IDatabaseService>> out_database_service);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::shared_ptr<MiiManager> manager{nullptr};
bool is_system{};
};
diff --git a/src/core/hle/service/mm/mm_u.cpp b/src/core/hle/service/mm/mm_u.cpp
index e5353ee42c..0b361ecdd2 100644
--- a/src/core/hle/service/mm/mm_u.cpp
+++ b/src/core/hle/service/mm/mm_u.cpp
@@ -49,21 +49,10 @@ public:
class MM_U final : public ServiceFramework<MM_U> {
public:
- explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &MM_U::InitializeOld, "InitializeOld"},
- {1, &MM_U::FinalizeOld, "FinalizeOld"},
- {2, &MM_U::SetAndWaitOld, "SetAndWaitOld"},
- {3, &MM_U::GetOld, "GetOld"},
- {4, &MM_U::Initialize, "Initialize"},
- {5, &MM_U::Finalize, "Finalize"},
- {6, &MM_U::SetAndWait, "SetAndWait"},
- {7, &MM_U::Get, "Get"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -212,6 +201,16 @@ private:
rb.Push<u32>(0);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &MM_U::InitializeOld, "InitializeOld"},
+ FunctionInfo{1, &MM_U::FinalizeOld, "FinalizeOld"},
+ FunctionInfo{2, &MM_U::SetAndWaitOld, "SetAndWaitOld"},
+ FunctionInfo{3, &MM_U::GetOld, "GetOld"},
+ FunctionInfo{4, &MM_U::Initialize, "Initialize"},
+ FunctionInfo{5, &MM_U::Finalize, "Finalize"},
+ FunctionInfo{6, &MM_U::SetAndWait, "SetAndWait"},
+ FunctionInfo{7, &MM_U::Get, "Get"}
+ );
std::vector<Session> sessions;
u32 request_id{1};
};
diff --git a/src/core/hle/service/mnpp/mnpp.cpp b/src/core/hle/service/mnpp/mnpp.cpp
index 11b6f3a386..c5bc306302 100644
--- a/src/core/hle/service/mnpp/mnpp.cpp
+++ b/src/core/hle/service/mnpp/mnpp.cpp
@@ -14,15 +14,10 @@ namespace Service::MNPP {
class MNPP_APP final : public ServiceFramework<MNPP_APP> {
public:
- explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &MNPP_APP::Cmd0, "Cmd0"},
- {1, &MNPP_APP::Cmd1, "Cmd1"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -39,38 +34,43 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &MNPP_APP::Cmd0, "Cmd0"},
+ FunctionInfo{1, &MNPP_APP::Cmd1, "Cmd1"}
+ );
};
class MNPP_SYS final : public ServiceFramework<MNPP_SYS> {
public:
- explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Cmd0"},
- {10, nullptr, "Cmd10"},
- {100, nullptr, "Cmd100"},
- {200, nullptr, "Cmd200"},
- {300, nullptr, "Cmd300"},
- {400, nullptr, "Cmd400"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Cmd0"},
+ FunctionInfo{10, nullptr, "Cmd10"},
+ FunctionInfo{100, nullptr, "Cmd100"},
+ FunctionInfo{200, nullptr, "Cmd200"},
+ FunctionInfo{300, nullptr, "Cmd300"},
+ FunctionInfo{400, nullptr, "Cmd400"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class MNPP_WEB final : public ServiceFramework<MNPP_WEB> {
public:
- explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Cmd0"},
- {1, nullptr, "Cmd1"},
- {10, nullptr, "Cmd10"},
- {20, nullptr, "Cmd20"},
- {100, nullptr, "Cmd100"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Cmd0"},
+ FunctionInfo{1, nullptr, "Cmd1"},
+ FunctionInfo{10, nullptr, "Cmd10"},
+ FunctionInfo{20, nullptr, "Cmd20"},
+ FunctionInfo{100, nullptr, "Cmd100"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/ncm/ncm.cpp b/src/core/hle/service/ncm/ncm.cpp
index 6c754d5567..4091eadcf9 100644
--- a/src/core/hle/service/ncm/ncm.cpp
+++ b/src/core/hle/service/ncm/ncm.cpp
@@ -24,33 +24,32 @@ namespace Service::NCM {
class ILocationResolver final : public ServiceFramework<ILocationResolver> {
public:
explicit ILocationResolver(Core::System& system_, FileSys::StorageId id)
- : ServiceFramework{system_, "ILocationResolver"}, storage{id} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "ResolveProgramPath"},
- {1, nullptr, "RedirectProgramPath"},
- {2, nullptr, "ResolveApplicationControlPath"},
- {3, nullptr, "ResolveApplicationHtmlDocumentPath"},
- {4, nullptr, "ResolveDataPath"},
- {5, nullptr, "RedirectApplicationControlPath"},
- {6, nullptr, "RedirectApplicationHtmlDocumentPath"},
- {7, nullptr, "ResolveApplicationLegalInformationPath"},
- {8, nullptr, "RedirectApplicationLegalInformationPath"},
- {9, nullptr, "Refresh"},
- {10, nullptr, "RedirectApplicationProgramPath"},
- {11, nullptr, "ClearApplicationRedirection"},
- {12, nullptr, "EraseProgramRedirection"},
- {13, nullptr, "EraseApplicationControlRedirection"},
- {14, nullptr, "EraseApplicationHtmlDocumentRedirection"},
- {15, nullptr, "EraseApplicationLegalInformationRedirection"},
- {16, nullptr, "ResolveProgramPathForDebug"},
- {17, nullptr, "RedirectProgramPathForDebug"},
- {18, nullptr, "RedirectApplicationProgramPathForDebug"},
- {19, nullptr, "EraseProgramRedirectionForDebug"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "ILocationResolver"}, storage{id} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "ResolveProgramPath"},
+ FunctionInfo{1, nullptr, "RedirectProgramPath"},
+ FunctionInfo{2, nullptr, "ResolveApplicationControlPath"},
+ FunctionInfo{3, nullptr, "ResolveApplicationHtmlDocumentPath"},
+ FunctionInfo{4, nullptr, "ResolveDataPath"},
+ FunctionInfo{5, nullptr, "RedirectApplicationControlPath"},
+ FunctionInfo{6, nullptr, "RedirectApplicationHtmlDocumentPath"},
+ FunctionInfo{7, nullptr, "ResolveApplicationLegalInformationPath"},
+ FunctionInfo{8, nullptr, "RedirectApplicationLegalInformationPath"},
+ FunctionInfo{9, nullptr, "Refresh"},
+ FunctionInfo{10, nullptr, "RedirectApplicationProgramPath"},
+ FunctionInfo{11, nullptr, "ClearApplicationRedirection"},
+ FunctionInfo{12, nullptr, "EraseProgramRedirection"},
+ FunctionInfo{13, nullptr, "EraseApplicationControlRedirection"},
+ FunctionInfo{14, nullptr, "EraseApplicationHtmlDocumentRedirection"},
+ FunctionInfo{15, nullptr, "EraseApplicationLegalInformationRedirection"},
+ FunctionInfo{16, nullptr, "ResolveProgramPathForDebug"},
+ FunctionInfo{17, nullptr, "RedirectProgramPathForDebug"},
+ FunctionInfo{18, nullptr, "RedirectApplicationProgramPathForDebug"},
+ FunctionInfo{19, nullptr, "EraseProgramRedirectionForDebug"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -60,60 +59,49 @@ private:
class IRegisteredLocationResolver final : public ServiceFramework<IRegisteredLocationResolver> {
public:
explicit IRegisteredLocationResolver(Core::System& system_)
- : ServiceFramework{system_, "IRegisteredLocationResolver"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "ResolveProgramPath"},
- {1, nullptr, "RegisterProgramPath"},
- {2, nullptr, "UnregisterProgramPath"},
- {3, nullptr, "RedirectProgramPath"},
- {4, nullptr, "ResolveHtmlDocumentPath"},
- {5, nullptr, "RegisterHtmlDocumentPath"},
- {6, nullptr, "UnregisterHtmlDocumentPath"},
- {7, nullptr, "RedirectHtmlDocumentPath"},
- {8, nullptr, "Refresh"},
- {9, nullptr, "RefreshExcluding"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IRegisteredLocationResolver"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "ResolveProgramPath"},
+ FunctionInfo{1, nullptr, "RegisterProgramPath"},
+ FunctionInfo{2, nullptr, "UnregisterProgramPath"},
+ FunctionInfo{3, nullptr, "RedirectProgramPath"},
+ FunctionInfo{4, nullptr, "ResolveHtmlDocumentPath"},
+ FunctionInfo{5, nullptr, "RegisterHtmlDocumentPath"},
+ FunctionInfo{6, nullptr, "UnregisterHtmlDocumentPath"},
+ FunctionInfo{7, nullptr, "RedirectHtmlDocumentPath"},
+ FunctionInfo{8, nullptr, "Refresh"},
+ FunctionInfo{9, nullptr, "RefreshExcluding"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IAddOnContentLocationResolver final : public ServiceFramework<IAddOnContentLocationResolver> {
public:
explicit IAddOnContentLocationResolver(Core::System& system_)
- : ServiceFramework{system_, "IAddOnContentLocationResolver"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "ResolveAddOnContentPath"},
- {1, nullptr, "RegisterAddOnContentStorage"},
- {2, nullptr, "UnregisterAllAddOnContentPath"},
- {3, nullptr, "RefreshApplicationAddOnContent"},
- {4, nullptr, "UnregisterApplicationAddOnContent"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IAddOnContentLocationResolver"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "ResolveAddOnContentPath"},
+ FunctionInfo{1, nullptr, "RegisterAddOnContentStorage"},
+ FunctionInfo{2, nullptr, "UnregisterAllAddOnContentPath"},
+ FunctionInfo{3, nullptr, "RefreshApplicationAddOnContent"},
+ FunctionInfo{4, nullptr, "UnregisterApplicationAddOnContent"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IContentStorage final : public ServiceFramework<IContentStorage> {
public:
explicit IContentStorage(Core::System& system_, FileSys::StorageId id)
- : ServiceFramework{system_, "IContentStorage"}, storage{id} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"},
- {1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"},
- {2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"},
- {4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"},
- {5, &IContentStorage::Register, "Register"},
- {6, &IContentStorage::Delete, "Delete"},
- };
- // clang-format on
+ : ServiceFramework{system_, "IContentStorage"}, storage{id} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -252,23 +240,24 @@ private:
rb.Push(succeeded ? ResultSuccess : ResultUnknown);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"},
+ FunctionInfo{1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"},
+ FunctionInfo{2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"},
+ FunctionInfo{4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"},
+ FunctionInfo{5, &IContentStorage::Register, "Register"},
+ FunctionInfo{6, &IContentStorage::Delete, "Delete"}
+ );
FileSys::StorageId storage;
};
class IContentMetaDatabase final : public ServiceFramework<IContentMetaDatabase> {
public:
explicit IContentMetaDatabase(Core::System& system_, FileSys::StorageId id)
- : ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IContentMetaDatabase::Set, "Set"},
- {2, &IContentMetaDatabase::Remove, "Remove"},
- {8, &IContentMetaDatabase::Has, "Has"},
- {15, &IContentMetaDatabase::Commit, "Commit"},
- };
- // clang-format on
+ : ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -356,51 +345,37 @@ private:
rb.Push(ResultSuccess);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IContentMetaDatabase::Set, "Set"},
+ FunctionInfo{2, &IContentMetaDatabase::Remove, "Remove"},
+ FunctionInfo{8, &IContentMetaDatabase::Has, "Has"},
+ FunctionInfo{15, &IContentMetaDatabase::Commit, "Commit"}
+ );
FileSys::StorageId storage;
std::vector<ContentMetaKey> entries;
};
class LR final : public ServiceFramework<LR> {
public:
- explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "OpenLocationResolver"},
- {1, nullptr, "OpenRegisteredLocationResolver"},
- {2, nullptr, "RefreshLocationResolver"},
- {3, nullptr, "OpenAddOnContentLocationResolver"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenLocationResolver"},
+ FunctionInfo{1, nullptr, "OpenRegisteredLocationResolver"},
+ FunctionInfo{2, nullptr, "RefreshLocationResolver"},
+ FunctionInfo{3, nullptr, "OpenAddOnContentLocationResolver"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class NCM final : public ServiceFramework<NCM> {
public:
- explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CreateContentStorage"},
- {1, nullptr, "CreateContentMetaDatabase"},
- {2, nullptr, "VerifyContentStorage"},
- {3, nullptr, "VerifyContentMetaDatabase"},
- {4, &NCM::OpenContentStorage, "OpenContentStorage"},
- {5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"},
- {6, nullptr, "CloseContentStorageForcibly"},
- {7, nullptr, "CloseContentMetaDatabaseForcibly"},
- {8, nullptr, "CleanupContentMetaDatabase"},
- {9, nullptr, "ActivateContentStorage"},
- {10, nullptr, "InactivateContentStorage"},
- {11, nullptr, "ActivateContentMetaDatabase"},
- {12, nullptr, "InactivateContentMetaDatabase"},
- {13, nullptr, "InvalidateRightsIdCache"},
- {14, nullptr, "GetMemoryReport"},
- {15, nullptr, "ActivateFsContentStorage"},
- };
- // clang-format on
+ explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -425,18 +400,39 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IContentMetaDatabase>(ctx, system, storage_id);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateContentStorage"},
+ FunctionInfo{1, nullptr, "CreateContentMetaDatabase"},
+ FunctionInfo{2, nullptr, "VerifyContentStorage"},
+ FunctionInfo{3, nullptr, "VerifyContentMetaDatabase"},
+ FunctionInfo{4, &NCM::OpenContentStorage, "OpenContentStorage"},
+ FunctionInfo{5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"},
+ FunctionInfo{6, nullptr, "CloseContentStorageForcibly"},
+ FunctionInfo{7, nullptr, "CloseContentMetaDatabaseForcibly"},
+ FunctionInfo{8, nullptr, "CleanupContentMetaDatabase"},
+ FunctionInfo{9, nullptr, "ActivateContentStorage"},
+ FunctionInfo{10, nullptr, "InactivateContentStorage"},
+ FunctionInfo{11, nullptr, "ActivateContentMetaDatabase"},
+ FunctionInfo{12, nullptr, "InactivateContentMetaDatabase"},
+ FunctionInfo{13, nullptr, "InvalidateRightsIdCache"},
+ FunctionInfo{14, nullptr, "GetMemoryReport"},
+ FunctionInfo{15, nullptr, "ActivateFsContentStorage"}
+ );
};
class NCM_V final : public ServiceFramework<NCM_V> {
public:
explicit NCM_V(Core::System& system_)
: ServiceFramework{system_, "ncm:v"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetSystemVersion"},
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetSystemVersion"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/nfc/nfc.cpp b/src/core/hle/service/nfc/nfc.cpp
index f64445835e..d3a986faea 100644
--- a/src/core/hle/service/nfc/nfc.cpp
+++ b/src/core/hle/service/nfc/nfc.cpp
@@ -18,74 +18,71 @@ namespace Service::NFC {
class IUser final : public NfcInterface {
public:
- explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &NfcInterface::Initialize, "InitializeOld"},
- {1, &NfcInterface::Finalize, "FinalizeOld"},
- {2, &NfcInterface::GetState, "GetStateOld"},
- {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"},
- {400, &NfcInterface::Initialize, "Initialize"},
- {401, &NfcInterface::Finalize, "Finalize"},
- {402, &NfcInterface::GetState, "GetState"},
- {403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"},
- {404, &NfcInterface::ListDevices, "ListDevices"},
- {405, &NfcInterface::GetDeviceState, "GetDeviceState"},
- {406, &NfcInterface::GetNpadId, "GetNpadId"},
- {407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- {408, &NfcInterface::StartDetection, "StartDetection"},
- {409, &NfcInterface::StopDetection, "StopDetection"},
- {410, &NfcInterface::GetTagInfo, "GetTagInfo"},
- {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"},
- {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"},
- {1000, &NfcInterface::ReadMifare, "ReadMifare"},
- {1001, &NfcInterface::WriteMifare ,"WriteMifare"},
- {1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
- {1301, nullptr, "KeepPassThroughSession"},
- {1302, nullptr, "ReleasePassThroughSession"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMapWithClass<IUser>(
+ FunctionInfoTyped<IUser>{0, &NfcInterface::Initialize, "InitializeOld"},
+ FunctionInfoTyped<IUser>{1, &NfcInterface::Finalize, "FinalizeOld"},
+ FunctionInfoTyped<IUser>{2, &NfcInterface::GetState, "GetStateOld"},
+ FunctionInfoTyped<IUser>{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"},
+ FunctionInfoTyped<IUser>{400, &NfcInterface::Initialize, "Initialize"},
+ FunctionInfoTyped<IUser>{401, &NfcInterface::Finalize, "Finalize"},
+ FunctionInfoTyped<IUser>{402, &NfcInterface::GetState, "GetState"},
+ FunctionInfoTyped<IUser>{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"},
+ FunctionInfoTyped<IUser>{404, &NfcInterface::ListDevices, "ListDevices"},
+ FunctionInfoTyped<IUser>{405, &NfcInterface::GetDeviceState, "GetDeviceState"},
+ FunctionInfoTyped<IUser>{406, &NfcInterface::GetNpadId, "GetNpadId"},
+ FunctionInfoTyped<IUser>{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ FunctionInfoTyped<IUser>{408, &NfcInterface::StartDetection, "StartDetection"},
+ FunctionInfoTyped<IUser>{409, &NfcInterface::StopDetection, "StopDetection"},
+ FunctionInfoTyped<IUser>{410, &NfcInterface::GetTagInfo, "GetTagInfo"},
+ FunctionInfoTyped<IUser>{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"},
+ FunctionInfoTyped<IUser>{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ FunctionInfoTyped<IUser>{1000, &NfcInterface::ReadMifare, "ReadMifare"},
+ FunctionInfoTyped<IUser>{1001, &NfcInterface::WriteMifare ,"WriteMifare"},
+ FunctionInfoTyped<IUser>{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
+ FunctionInfoTyped<IUser>{1301, nullptr, "KeepPassThroughSession"},
+ FunctionInfoTyped<IUser>{1302, nullptr, "ReleasePassThroughSession"}
+ );
};
class ISystem final : public NfcInterface {
public:
- explicit ISystem(Core::System& system_)
- : NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &NfcInterface::Initialize, "InitializeOld"},
- {1, &NfcInterface::Finalize, "FinalizeOld"},
- {2, &NfcInterface::GetState, "GetStateOld"},
- {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"},
- {100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"},
- {400, &NfcInterface::Initialize, "Initialize"},
- {401, &NfcInterface::Finalize, "Finalize"},
- {402, &NfcInterface::GetState, "GetState"},
- {403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"},
- {404, &NfcInterface::ListDevices, "ListDevices"},
- {405, &NfcInterface::GetDeviceState, "GetDeviceState"},
- {406, &NfcInterface::GetNpadId, "GetNpadId"},
- {407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- {408, &NfcInterface::StartDetection, "StartDetection"},
- {409, &NfcInterface::StopDetection, "StopDetection"},
- {410, &NfcInterface::GetTagInfo, "GetTagInfo"},
- {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"},
- {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"},
- {500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"},
- {510, nullptr, "OutputTestWave"},
- {1000, &NfcInterface::ReadMifare, "ReadMifare"},
- {1001, &NfcInterface::WriteMifare, "WriteMifare"},
- {1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
- {1301, nullptr, "KeepPassThroughSession"},
- {1302, nullptr, "ReleasePassThroughSession"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit ISystem(Core::System& system_) : NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMapWithClass<ISystem>(
+ FunctionInfoTyped<ISystem>{0, &NfcInterface::Initialize, "InitializeOld"},
+ FunctionInfoTyped<ISystem>{1, &NfcInterface::Finalize, "FinalizeOld"},
+ FunctionInfoTyped<ISystem>{2, &NfcInterface::GetState, "GetStateOld"},
+ FunctionInfoTyped<ISystem>{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"},
+ FunctionInfoTyped<ISystem>{100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"},
+ FunctionInfoTyped<ISystem>{400, &NfcInterface::Initialize, "Initialize"},
+ FunctionInfoTyped<ISystem>{401, &NfcInterface::Finalize, "Finalize"},
+ FunctionInfoTyped<ISystem>{402, &NfcInterface::GetState, "GetState"},
+ FunctionInfoTyped<ISystem>{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"},
+ FunctionInfoTyped<ISystem>{404, &NfcInterface::ListDevices, "ListDevices"},
+ FunctionInfoTyped<ISystem>{405, &NfcInterface::GetDeviceState, "GetDeviceState"},
+ FunctionInfoTyped<ISystem>{406, &NfcInterface::GetNpadId, "GetNpadId"},
+ FunctionInfoTyped<ISystem>{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ FunctionInfoTyped<ISystem>{408, &NfcInterface::StartDetection, "StartDetection"},
+ FunctionInfoTyped<ISystem>{409, &NfcInterface::StopDetection, "StopDetection"},
+ FunctionInfoTyped<ISystem>{410, &NfcInterface::GetTagInfo, "GetTagInfo"},
+ FunctionInfoTyped<ISystem>{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"},
+ FunctionInfoTyped<ISystem>{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ FunctionInfoTyped<ISystem>{500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"},
+ FunctionInfoTyped<ISystem>{510, nullptr, "OutputTestWave"},
+ FunctionInfoTyped<ISystem>{1000, &NfcInterface::ReadMifare, "ReadMifare"},
+ FunctionInfoTyped<ISystem>{1001, &NfcInterface::WriteMifare, "WriteMifare"},
+ FunctionInfoTyped<ISystem>{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
+ FunctionInfoTyped<ISystem>{1301, nullptr, "KeepPassThroughSession"},
+ FunctionInfoTyped<ISystem>{1302, nullptr, "ReleasePassThroughSession"}
+ );
};
// MFInterface has an unique interface but it's identical to NfcInterface so we can keep the code
@@ -93,56 +90,49 @@ public:
using MFInterface = NfcInterface;
class MFIUser final : public MFInterface {
public:
- explicit MFIUser(Core::System& system_)
- : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} {
- // clang-format off
- static const FunctionInfoTyped<MFIUser> functions[] = {
- {0, &MFIUser::Initialize, "Initialize"},
- {1, &MFIUser::Finalize, "Finalize"},
- {2, &MFIUser::ListDevices, "ListDevices"},
- {3, &MFIUser::StartDetection, "StartDetection"},
- {4, &MFIUser::StopDetection, "StopDetection"},
- {5, &MFIUser::ReadMifare, "Read"},
- {6, &MFIUser::WriteMifare, "Write"},
- {7, &MFIUser::GetTagInfo, "GetTagInfo"},
- {8, &MFIUser::AttachActivateEvent, "GetActivateEventHandle"},
- {9, &MFIUser::AttachDeactivateEvent, "GetDeactivateEventHandle"},
- {10, &MFIUser::GetState, "GetState"},
- {11, &MFIUser::GetDeviceState, "GetDeviceState"},
- {12, &MFIUser::GetNpadId, "GetNpadId"},
- {13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit MFIUser(Core::System& system_) : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMapWithClass<MFIUser>(
+ FunctionInfoTyped<MFIUser>{0, &MFIUser::Initialize, "Initialize"},
+ FunctionInfoTyped<MFIUser>{1, &MFIUser::Finalize, "Finalize"},
+ FunctionInfoTyped<MFIUser>{2, &MFIUser::ListDevices, "ListDevices"},
+ FunctionInfoTyped<MFIUser>{3, &MFIUser::StartDetection, "StartDetection"},
+ FunctionInfoTyped<MFIUser>{4, &MFIUser::StopDetection, "StopDetection"},
+ FunctionInfoTyped<MFIUser>{5, &MFIUser::ReadMifare, "Read"},
+ FunctionInfoTyped<MFIUser>{6, &MFIUser::WriteMifare, "Write"},
+ FunctionInfoTyped<MFIUser>{7, &MFIUser::GetTagInfo, "GetTagInfo"},
+ FunctionInfoTyped<MFIUser>{8, &MFIUser::AttachActivateEvent, "GetActivateEventHandle"},
+ FunctionInfoTyped<MFIUser>{9, &MFIUser::AttachDeactivateEvent, "GetDeactivateEventHandle"},
+ FunctionInfoTyped<MFIUser>{10, &MFIUser::GetState, "GetState"},
+ FunctionInfoTyped<MFIUser>{11, &MFIUser::GetDeviceState, "GetDeviceState"},
+ FunctionInfoTyped<MFIUser>{12, &MFIUser::GetNpadId, "GetNpadId"},
+ FunctionInfoTyped<MFIUser>{13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"}
+ );
};
class IAm final : public ServiceFramework<IAm> {
public:
- explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {1, nullptr, "Finalize"},
- {2, nullptr, "NotifyForegroundApplet"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{1, nullptr, "Finalize"},
+ FunctionInfo{2, nullptr, "NotifyForegroundApplet"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class NFC_AM final : public ServiceFramework<NFC_AM> {
public:
- explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -153,18 +143,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IAm>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"}
+ );
};
class NFC_MF_U final : public ServiceFramework<NFC_MF_U> {
public:
- explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -175,18 +165,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<MFIUser>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"}
+ );
};
class NFC_U final : public ServiceFramework<NFC_U> {
public:
- explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -197,18 +187,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IUser>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"}
+ );
};
class NFC_SYS final : public ServiceFramework<NFC_SYS> {
public:
- explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -219,6 +209,10 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<ISystem>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp
index e0c24679ab..bfeb7d5553 100644
--- a/src/core/hle/service/nfp/nfp.cpp
+++ b/src/core/hle/service/nfp/nfp.cpp
@@ -14,145 +14,134 @@ namespace Service::NFP {
class IUser final : public Interface {
public:
- explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") {
- // clang-format off
- static const FunctionInfoTyped<IUser> functions[] = {
- {0, &IUser::Initialize, "Initialize"},
- {1, &IUser::Finalize, "Finalize"},
- {2, &IUser::ListDevices, "ListDevices"},
- {3, &IUser::StartDetection, "StartDetection"},
- {4, &IUser::StopDetection, "StopDetection"},
- {5, &IUser::Mount, "Mount"},
- {6, &IUser::Unmount, "Unmount"},
- {7, &IUser::OpenApplicationArea, "OpenApplicationArea"},
- {8, &IUser::GetApplicationArea, "GetApplicationArea"},
- {9, &IUser::SetApplicationArea, "SetApplicationArea"},
- {10, &IUser::Flush, "Flush"},
- {11, &IUser::Restore, "Restore"},
- {12, &IUser::CreateApplicationArea, "CreateApplicationArea"},
- {13, &IUser::GetTagInfo, "GetTagInfo"},
- {14, &IUser::GetRegisterInfo, "GetRegisterInfo"},
- {15, &IUser::GetCommonInfo, "GetCommonInfo"},
- {16, &IUser::GetModelInfo, "GetModelInfo"},
- {17, &IUser::AttachActivateEvent, "AttachActivateEvent"},
- {18, &IUser::AttachDeactivateEvent, "AttachDeactivateEvent"},
- {19, &IUser::GetState, "GetState"},
- {20, &IUser::GetDeviceState, "GetDeviceState"},
- {21, &IUser::GetNpadId, "GetNpadId"},
- {22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"},
- {23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- {24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"},
- {25, &IUser::StartDetection, "StartDetectionWithFilter"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMapWithClass<IUser>(
+ FunctionInfoTyped<IUser>{0, &IUser::Initialize, "Initialize"},
+ FunctionInfoTyped<IUser>{1, &IUser::Finalize, "Finalize"},
+ FunctionInfoTyped<IUser>{2, &IUser::ListDevices, "ListDevices"},
+ FunctionInfoTyped<IUser>{3, &IUser::StartDetection, "StartDetection"},
+ FunctionInfoTyped<IUser>{4, &IUser::StopDetection, "StopDetection"},
+ FunctionInfoTyped<IUser>{5, &IUser::Mount, "Mount"},
+ FunctionInfoTyped<IUser>{6, &IUser::Unmount, "Unmount"},
+ FunctionInfoTyped<IUser>{7, &IUser::OpenApplicationArea, "OpenApplicationArea"},
+ FunctionInfoTyped<IUser>{8, &IUser::GetApplicationArea, "GetApplicationArea"},
+ FunctionInfoTyped<IUser>{9, &IUser::SetApplicationArea, "SetApplicationArea"},
+ FunctionInfoTyped<IUser>{10, &IUser::Flush, "Flush"},
+ FunctionInfoTyped<IUser>{11, &IUser::Restore, "Restore"},
+ FunctionInfoTyped<IUser>{12, &IUser::CreateApplicationArea, "CreateApplicationArea"},
+ FunctionInfoTyped<IUser>{13, &IUser::GetTagInfo, "GetTagInfo"},
+ FunctionInfoTyped<IUser>{14, &IUser::GetRegisterInfo, "GetRegisterInfo"},
+ FunctionInfoTyped<IUser>{15, &IUser::GetCommonInfo, "GetCommonInfo"},
+ FunctionInfoTyped<IUser>{16, &IUser::GetModelInfo, "GetModelInfo"},
+ FunctionInfoTyped<IUser>{17, &IUser::AttachActivateEvent, "AttachActivateEvent"},
+ FunctionInfoTyped<IUser>{18, &IUser::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ FunctionInfoTyped<IUser>{19, &IUser::GetState, "GetState"},
+ FunctionInfoTyped<IUser>{20, &IUser::GetDeviceState, "GetDeviceState"},
+ FunctionInfoTyped<IUser>{21, &IUser::GetNpadId, "GetNpadId"},
+ FunctionInfoTyped<IUser>{22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"},
+ FunctionInfoTyped<IUser>{23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ FunctionInfoTyped<IUser>{24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"},
+ FunctionInfoTyped<IUser>{25, &IUser::StartDetection, "StartDetectionWithFilter"}
+ );
};
class ISystem final : public Interface {
public:
- explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") {
- // clang-format off
- static const FunctionInfoTyped<ISystem> functions[] = {
- {0, &ISystem::InitializeSystem, "InitializeSystem"},
- {1, &ISystem::FinalizeSystem, "FinalizeSystem"},
- {2, &ISystem::ListDevices, "ListDevices"},
- {3, &ISystem::StartDetection, "StartDetection"},
- {4, &ISystem::StopDetection, "StopDetection"},
- {5, &ISystem::Mount, "Mount"},
- {6, &ISystem::Unmount, "Unmount"},
- {10, &ISystem::Flush, "Flush"},
- {11, &ISystem::Restore, "Restore"},
- {12, &ISystem::CreateApplicationArea, "CreateApplicationArea"},
- {13, &ISystem::GetTagInfo, "GetTagInfo"},
- {14, &ISystem::GetRegisterInfo, "GetRegisterInfo"},
- {15, &ISystem::GetCommonInfo, "GetCommonInfo"},
- {16, &ISystem::GetModelInfo, "GetModelInfo"},
- {17, &ISystem::AttachActivateEvent, "AttachActivateEvent"},
- {18, &ISystem::AttachDeactivateEvent, "AttachDeactivateEvent"},
- {19, &ISystem::GetState, "GetState"},
- {20, &ISystem::GetDeviceState, "GetDeviceState"},
- {21, &ISystem::GetNpadId, "GetNpadId"},
- {23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- {25, &ISystem::StartDetection, "StartDetectionWithFilter"},
- {100, &ISystem::Format, "Format"},
- {101, &ISystem::GetAdminInfo, "GetAdminInfo"},
- {102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"},
- {103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"},
- {104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"},
- {105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"},
- {106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMapWithClass<ISystem>(
+ FunctionInfoTyped<ISystem>{0, &ISystem::InitializeSystem, "InitializeSystem"},
+ FunctionInfoTyped<ISystem>{1, &ISystem::FinalizeSystem, "FinalizeSystem"},
+ FunctionInfoTyped<ISystem>{2, &ISystem::ListDevices, "ListDevices"},
+ FunctionInfoTyped<ISystem>{3, &ISystem::StartDetection, "StartDetection"},
+ FunctionInfoTyped<ISystem>{4, &ISystem::StopDetection, "StopDetection"},
+ FunctionInfoTyped<ISystem>{5, &ISystem::Mount, "Mount"},
+ FunctionInfoTyped<ISystem>{6, &ISystem::Unmount, "Unmount"},
+ FunctionInfoTyped<ISystem>{10, &ISystem::Flush, "Flush"},
+ FunctionInfoTyped<ISystem>{11, &ISystem::Restore, "Restore"},
+ FunctionInfoTyped<ISystem>{12, &ISystem::CreateApplicationArea, "CreateApplicationArea"},
+ FunctionInfoTyped<ISystem>{13, &ISystem::GetTagInfo, "GetTagInfo"},
+ FunctionInfoTyped<ISystem>{14, &ISystem::GetRegisterInfo, "GetRegisterInfo"},
+ FunctionInfoTyped<ISystem>{15, &ISystem::GetCommonInfo, "GetCommonInfo"},
+ FunctionInfoTyped<ISystem>{16, &ISystem::GetModelInfo, "GetModelInfo"},
+ FunctionInfoTyped<ISystem>{17, &ISystem::AttachActivateEvent, "AttachActivateEvent"},
+ FunctionInfoTyped<ISystem>{18, &ISystem::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ FunctionInfoTyped<ISystem>{19, &ISystem::GetState, "GetState"},
+ FunctionInfoTyped<ISystem>{20, &ISystem::GetDeviceState, "GetDeviceState"},
+ FunctionInfoTyped<ISystem>{21, &ISystem::GetNpadId, "GetNpadId"},
+ FunctionInfoTyped<ISystem>{23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ FunctionInfoTyped<ISystem>{25, &ISystem::StartDetection, "StartDetectionWithFilter"},
+ FunctionInfoTyped<ISystem>{100, &ISystem::Format, "Format"},
+ FunctionInfoTyped<ISystem>{101, &ISystem::GetAdminInfo, "GetAdminInfo"},
+ FunctionInfoTyped<ISystem>{102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"},
+ FunctionInfoTyped<ISystem>{103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"},
+ FunctionInfoTyped<ISystem>{104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"},
+ FunctionInfoTyped<ISystem>{105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"},
+ FunctionInfoTyped<ISystem>{106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"}
+ );
};
class IDebug final : public Interface {
public:
- explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") {
- // clang-format off
- static const FunctionInfoTyped<IDebug> functions[] = {
- {0, &IDebug::InitializeDebug, "InitializeDebug"},
- {1, &IDebug::FinalizeDebug, "FinalizeDebug"},
- {2, &IDebug::ListDevices, "ListDevices"},
- {3, &IDebug::StartDetection, "StartDetection"},
- {4, &IDebug::StopDetection, "StopDetection"},
- {5, &IDebug::Mount, "Mount"},
- {6, &IDebug::Unmount, "Unmount"},
- {7, &IDebug::OpenApplicationArea, "OpenApplicationArea"},
- {8, &IDebug::GetApplicationArea, "GetApplicationArea"},
- {9, &IDebug::SetApplicationArea, "SetApplicationArea"},
- {10, &IDebug::Flush, "Flush"},
- {11, &IDebug::Restore, "Restore"},
- {12, &IDebug::CreateApplicationArea, "CreateApplicationArea"},
- {13, &IDebug::GetTagInfo, "GetTagInfo"},
- {14, &IDebug::GetRegisterInfo, "GetRegisterInfo"},
- {15, &IDebug::GetCommonInfo, "GetCommonInfo"},
- {16, &IDebug::GetModelInfo, "GetModelInfo"},
- {17, &IDebug::AttachActivateEvent, "AttachActivateEvent"},
- {18, &IDebug::AttachDeactivateEvent, "AttachDeactivateEvent"},
- {19, &IDebug::GetState, "GetState"},
- {20, &IDebug::GetDeviceState, "GetDeviceState"},
- {21, &IDebug::GetNpadId, "GetNpadId"},
- {22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"},
- {23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
- {24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"},
- {25, &IDebug::StartDetection, "StartDetectionWithFilter"},
- {100, &IDebug::Format, "Format"},
- {101, &IDebug::GetAdminInfo, "GetAdminInfo"},
- {102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"},
- {103, &IDebug::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"},
- {104, &IDebug::DeleteRegisterInfo, "DeleteRegisterInfo"},
- {105, &IDebug::DeleteApplicationArea, "DeleteApplicationArea"},
- {106, &IDebug::ExistsApplicationArea, "ExistsApplicationArea"},
- {200, &IDebug::GetAll, "GetAll"},
- {201, &IDebug::SetAll, "SetAll"},
- {202, &IDebug::FlushDebug, "FlushDebug"},
- {203, &IDebug::BreakTag, "BreakTag"},
- {204, &IDebug::ReadBackupData, "ReadBackupData"},
- {205, &IDebug::WriteBackupData, "WriteBackupData"},
- {206, &IDebug::WriteNtf, "WriteNtf"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMapWithClass<IDebug>(
+ FunctionInfoTyped<IDebug>{0, &IDebug::InitializeDebug, "InitializeDebug"},
+ FunctionInfoTyped<IDebug>{1, &IDebug::FinalizeDebug, "FinalizeDebug"},
+ FunctionInfoTyped<IDebug>{2, &IDebug::ListDevices, "ListDevices"},
+ FunctionInfoTyped<IDebug>{3, &IDebug::StartDetection, "StartDetection"},
+ FunctionInfoTyped<IDebug>{4, &IDebug::StopDetection, "StopDetection"},
+ FunctionInfoTyped<IDebug>{5, &IDebug::Mount, "Mount"},
+ FunctionInfoTyped<IDebug>{6, &IDebug::Unmount, "Unmount"},
+ FunctionInfoTyped<IDebug>{7, &IDebug::OpenApplicationArea, "OpenApplicationArea"},
+ FunctionInfoTyped<IDebug>{8, &IDebug::GetApplicationArea, "GetApplicationArea"},
+ FunctionInfoTyped<IDebug>{9, &IDebug::SetApplicationArea, "SetApplicationArea"},
+ FunctionInfoTyped<IDebug>{10, &IDebug::Flush, "Flush"},
+ FunctionInfoTyped<IDebug>{11, &IDebug::Restore, "Restore"},
+ FunctionInfoTyped<IDebug>{12, &IDebug::CreateApplicationArea, "CreateApplicationArea"},
+ FunctionInfoTyped<IDebug>{13, &IDebug::GetTagInfo, "GetTagInfo"},
+ FunctionInfoTyped<IDebug>{14, &IDebug::GetRegisterInfo, "GetRegisterInfo"},
+ FunctionInfoTyped<IDebug>{15, &IDebug::GetCommonInfo, "GetCommonInfo"},
+ FunctionInfoTyped<IDebug>{16, &IDebug::GetModelInfo, "GetModelInfo"},
+ FunctionInfoTyped<IDebug>{17, &IDebug::AttachActivateEvent, "AttachActivateEvent"},
+ FunctionInfoTyped<IDebug>{18, &IDebug::AttachDeactivateEvent, "AttachDeactivateEvent"},
+ FunctionInfoTyped<IDebug>{19, &IDebug::GetState, "GetState"},
+ FunctionInfoTyped<IDebug>{20, &IDebug::GetDeviceState, "GetDeviceState"},
+ FunctionInfoTyped<IDebug>{21, &IDebug::GetNpadId, "GetNpadId"},
+ FunctionInfoTyped<IDebug>{22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"},
+ FunctionInfoTyped<IDebug>{23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
+ FunctionInfoTyped<IDebug>{24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"},
+ FunctionInfoTyped<IDebug>{25, &IDebug::StartDetection, "StartDetectionWithFilter"},
+ FunctionInfoTyped<IDebug>{100, &IDebug::Format, "Format"},
+ FunctionInfoTyped<IDebug>{101, &IDebug::GetAdminInfo, "GetAdminInfo"},
+ FunctionInfoTyped<IDebug>{102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"},
+ FunctionInfoTyped<IDebug>{103, &IDebug::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"},
+ FunctionInfoTyped<IDebug>{104, &IDebug::DeleteRegisterInfo, "DeleteRegisterInfo"},
+ FunctionInfoTyped<IDebug>{105, &IDebug::DeleteApplicationArea, "DeleteApplicationArea"},
+ FunctionInfoTyped<IDebug>{106, &IDebug::ExistsApplicationArea, "ExistsApplicationArea"},
+ FunctionInfoTyped<IDebug>{200, &IDebug::GetAll, "GetAll"},
+ FunctionInfoTyped<IDebug>{201, &IDebug::SetAll, "SetAll"},
+ FunctionInfoTyped<IDebug>{202, &IDebug::FlushDebug, "FlushDebug"},
+ FunctionInfoTyped<IDebug>{203, &IDebug::BreakTag, "BreakTag"},
+ FunctionInfoTyped<IDebug>{204, &IDebug::ReadBackupData, "ReadBackupData"},
+ FunctionInfoTyped<IDebug>{205, &IDebug::WriteBackupData, "WriteBackupData"},
+ FunctionInfoTyped<IDebug>{206, &IDebug::WriteNtf, "WriteNtf"}
+ );
};
class IUserManager final : public ServiceFramework<IUserManager> {
public:
- explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IUserManager::CreateUserInterface, "CreateUserInterface"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
- }
+ explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} {}
private:
void CreateUserInterface(HLERequestContext& ctx) {
@@ -162,18 +151,21 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IUser>(ctx, system);
}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IUserManager::CreateUserInterface, "CreateUserInterface"}
+ );
};
class ISystemManager final : public ServiceFramework<ISystemManager> {
public:
- explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -184,18 +176,18 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<ISystem>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"}
+ );
};
class IDebugManager final : public ServiceFramework<IDebugManager> {
public:
- explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -206,6 +198,10 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IDebug>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/ngc/ngc.cpp b/src/core/hle/service/ngc/ngc.cpp
index e79108a1eb..fb3ef39093 100644
--- a/src/core/hle/service/ngc/ngc.cpp
+++ b/src/core/hle/service/ngc/ngc.cpp
@@ -21,15 +21,10 @@ namespace Service::NGC {
class IService final : public ServiceFramework<IService> {
public:
- explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IService::Match, "Match"},
- {1, &IService::Filter, "Filter"},
- };
- // clang-format on
+ explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -61,23 +56,19 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IService::Match, "Match"},
+ FunctionInfo{1, &IService::Filter, "Filter"}
+ );
};
class NgcServiceImpl final : public ServiceFramework<NgcServiceImpl> {
public:
- explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"},
- {1, &NgcServiceImpl::Check, "Check"},
- {2, &NgcServiceImpl::Mask, "Mask"},
- {3, &NgcServiceImpl::Reload, "Reload"},
- {4, &NgcServiceImpl::Check, "Check2"},
- {5, &NgcServiceImpl::Mask, "Mask2"},
- };
- // clang-format on
+ explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -150,25 +141,34 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"},
+ FunctionInfo{1, &NgcServiceImpl::Check, "Check"},
+ FunctionInfo{2, &NgcServiceImpl::Mask, "Mask"},
+ FunctionInfo{3, &NgcServiceImpl::Reload, "Reload"},
+ FunctionInfo{4, &NgcServiceImpl::Check, "Check2"},
+ FunctionInfo{5, &NgcServiceImpl::Mask, "Mask2"}
+ );
};
class IServiceWithManagementApi final : public ServiceFramework<IServiceWithManagementApi> {
public:
- explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0 , nullptr, "Match"},
- {1 , nullptr, "Filter"},
- {100, nullptr, "ConfigureAutoUpdateSetting"},
- {101, nullptr, "RequestResourceUpdateCheck"},
- {110, nullptr, "Reload"},
- {111, nullptr, "IsReloadRequired"},
- {112, nullptr, "TryAcquireReloadRequestNotifier"},
- {120, nullptr, "CalculateContentFingerprint"},
- {130, nullptr, "TryEnableTemporalPassThrough"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Match"},
+ FunctionInfo{1, nullptr, "Filter"},
+ FunctionInfo{100, nullptr, "ConfigureAutoUpdateSetting"},
+ FunctionInfo{101, nullptr, "RequestResourceUpdateCheck"},
+ FunctionInfo{110, nullptr, "Reload"},
+ FunctionInfo{111, nullptr, "IsReloadRequired"},
+ FunctionInfo{112, nullptr, "TryAcquireReloadRequestNotifier"},
+ FunctionInfo{120, nullptr, "CalculateContentFingerprint"},
+ FunctionInfo{130, nullptr, "TryEnableTemporalPassThrough"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
@@ -179,20 +179,10 @@ static_assert(sizeof(SaveDataHandle) == 0x08);
class IUserShimScopedObject final : public ServiceFramework<IUserShimScopedObject> {
public:
- explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {450, nullptr, "InitializeForSaveData"},
- {451, nullptr, "FinalizeForSaveData"},
- {452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"},
- {453, nullptr, "CloseSaveData"},
- {454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"},
- {455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"},
- {456, nullptr, "FlushSaveSlot"},
- {457, nullptr, "CommitSaveData"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
Result OpenSaveData(Account::Uid unk0, Out<SaveDataHandle> unk1) {
@@ -210,42 +200,43 @@ public:
// to implement
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{450, nullptr, "InitializeForSaveData"},
+ FunctionInfo{451, nullptr, "FinalizeForSaveData"},
+ FunctionInfo{452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"},
+ FunctionInfo{453, nullptr, "CloseSaveData"},
+ FunctionInfo{454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"},
+ FunctionInfo{455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"},
+ FunctionInfo{456, nullptr, "FlushSaveSlot"},
+ FunctionInfo{457, nullptr, "CommitSaveData"}
+ );
};
class IUserService final : public ServiceFramework<IUserService> {
public:
- explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0 , D<&IUserService::Cmd0>, "Cmd0"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
Result Cmd0(u32 unk0, OutInterface<IUserShimScopedObject> out_interface) {
LOG_WARNING(Service_NGC, "stubbed");
*out_interface = std::make_shared<IUserShimScopedObject>(system);
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IUserService::Cmd0>, "Cmd0"}
+ );
};
class ISystemShimScopedObject final : public ServiceFramework<ISystemShimScopedObject> {
public:
- explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {106, nullptr, "Cmd106"},
- {107, nullptr, "Cmd107"},
- {108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"},
- {207, nullptr, "Cmd207"},
- {208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"},
- {209, nullptr, "Cmd209"},
- {210, nullptr, "Cmd210"},
- {211, nullptr, "Cmd211"},
- {212, nullptr, "Cmd212"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
Result Cmd108() {
@@ -257,23 +248,36 @@ public:
LOG_WARNING(Service_NGC, "stubbed");
R_THROW(IPC::ResultNotSupported);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{106, nullptr, "Cmd106"},
+ FunctionInfo{107, nullptr, "Cmd107"},
+ FunctionInfo{108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"},
+ FunctionInfo{207, nullptr, "Cmd207"},
+ FunctionInfo{208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"},
+ FunctionInfo{209, nullptr, "Cmd209"},
+ FunctionInfo{210, nullptr, "Cmd210"},
+ FunctionInfo{211, nullptr, "Cmd211"},
+ FunctionInfo{212, nullptr, "Cmd212"}
+ );
};
class ISystemService final : public ServiceFramework<ISystemService> {
public:
- explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0 , D<&ISystemService::Cmd0>, "Cmd0"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
Result Cmd0(OutInterface<ISystemShimScopedObject> out_interface) {
LOG_WARNING(Service_NGC, "stubbed");
*out_interface = std::make_shared<ISystemShimScopedObject>(system);
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ISystemService::Cmd0>, "Cmd0"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp
index efada9b807..5befe8e943 100644
--- a/src/core/hle/service/nifm/nifm.cpp
+++ b/src/core/hle/service/nifm/nifm.cpp
@@ -235,15 +235,6 @@ public:
explicit IScanRequest(Core::System& system_)
: ServiceFramework{system_, "IScanRequest"}, svc_ctx{system_, "IScanRequest"} {
- static const FunctionInfo functions[] = {
- {0, &IScanRequest::Submit, "Submit"},
- {1, &IScanRequest::IsProcessing, "IsProcessing"},
- {2, &IScanRequest::GetResult, "GetResult"},
- {3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"},
- {4, &IScanRequest::SetChannels, "SetChannels"},
- };
- RegisterHandlers(functions);
-
evt_scan_complete = CreateKEvent(svc_ctx, "IScanRequest:Complete");
evt_processing = CreateKEvent(svc_ctx, "IScanRequest:Processing");
}
@@ -257,8 +248,6 @@ public:
}
private:
- std::vector<Network::ScanData> scan_results;
-
void Submit(HLERequestContext& ctx) {
if (state.load() == State::Finished) {
@@ -329,6 +318,17 @@ private:
evt_scan_complete->Signal(system.Kernel());
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IScanRequest::Submit, "Submit"},
+ FunctionInfo{1, &IScanRequest::IsProcessing, "IsProcessing"},
+ FunctionInfo{2, &IScanRequest::GetResult, "GetResult"},
+ FunctionInfo{3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"},
+ FunctionInfo{4, &IScanRequest::SetChannels, "SetChannels"}
+ );
+ std::vector<Network::ScanData> scan_results;
KernelHelpers::ServiceContext svc_ctx;
Kernel::KEvent* evt_scan_complete{};
@@ -342,36 +342,6 @@ class IRequest final : public ServiceFramework<IRequest> {
public:
explicit IRequest(Core::System& system_)
: ServiceFramework{system_, "IRequest"}, service_context{system_, "IRequest"} {
- static const FunctionInfo functions[] = {
- {0, &IRequest::GetRequestState, "GetRequestState"},
- {1, &IRequest::GetResult, "GetResult"},
- {2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"},
- {3, &IRequest::Cancel, "Cancel"},
- {4, &IRequest::Submit, "Submit"},
- {5, nullptr, "SetRequirement"},
- {6, &IRequest::SetRequirementPreset, "SetRequirementPreset"},
- {8, nullptr, "SetPriority"},
- {9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"},
- {10, nullptr, "SetRejectable"},
- {11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"},
- {12, nullptr, "SetPersistent"},
- {13, nullptr, "SetInstant"},
- {14, nullptr, "SetSustainable"},
- {15, nullptr, "SetRawPriority"},
- {16, nullptr, "SetGreedy"},
- {17, nullptr, "SetSharable"},
- {18, nullptr, "SetRequirementByRevision"},
- {19, nullptr, "GetRequirement"},
- {20, nullptr, "GetRevision"},
- {21, &IRequest::GetAppletInfo, "GetAppletInfo"},
- {22, nullptr, "GetAdditionalInfo"},
- {23, nullptr, "SetKeptInSleep"},
- {24, nullptr, "RegisterSocketDescriptor"},
- {25, nullptr, "UnregisterSocketDescriptor"},
- {26, nullptr, "GetNetworkAccessStatus"}, //21.0.0+
- };
- RegisterHandlers(functions);
-
event1 = CreateKEvent(service_context, "IRequest:Event1");
event2 = CreateKEvent(service_context, "IRequest:Event2");
state = RequestState::NotSubmitted;
@@ -494,6 +464,37 @@ private:
event1->Signal(system.Kernel());
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IRequest::GetRequestState, "GetRequestState"},
+ FunctionInfo{1, &IRequest::GetResult, "GetResult"},
+ FunctionInfo{2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"},
+ FunctionInfo{3, &IRequest::Cancel, "Cancel"},
+ FunctionInfo{4, &IRequest::Submit, "Submit"},
+ FunctionInfo{5, nullptr, "SetRequirement"},
+ FunctionInfo{6, &IRequest::SetRequirementPreset, "SetRequirementPreset"},
+ FunctionInfo{8, nullptr, "SetPriority"},
+ FunctionInfo{9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"},
+ FunctionInfo{10, nullptr, "SetRejectable"},
+ FunctionInfo{11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"},
+ FunctionInfo{12, nullptr, "SetPersistent"},
+ FunctionInfo{13, nullptr, "SetInstant"},
+ FunctionInfo{14, nullptr, "SetSustainable"},
+ FunctionInfo{15, nullptr, "SetRawPriority"},
+ FunctionInfo{16, nullptr, "SetGreedy"},
+ FunctionInfo{17, nullptr, "SetSharable"},
+ FunctionInfo{18, nullptr, "SetRequirementByRevision"},
+ FunctionInfo{19, nullptr, "GetRequirement"},
+ FunctionInfo{20, nullptr, "GetRevision"},
+ FunctionInfo{21, &IRequest::GetAppletInfo, "GetAppletInfo"},
+ FunctionInfo{22, nullptr, "GetAdditionalInfo"},
+ FunctionInfo{23, nullptr, "SetKeptInSleep"},
+ FunctionInfo{24, nullptr, "RegisterSocketDescriptor"},
+ FunctionInfo{25, nullptr, "UnregisterSocketDescriptor"},
+ FunctionInfo{26, nullptr, "GetNetworkAccessStatus", MakeVersionGate({21,0,0})}
+ );
KernelHelpers::ServiceContext service_context;
RequestState state;
@@ -508,14 +509,16 @@ private:
class INetworkProfile final : public ServiceFramework<INetworkProfile> {
public:
- explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} {
- static const FunctionInfo functions[] = {
- {0, nullptr, "Update"},
- {1, nullptr, "PersistOld"},
- {2, nullptr, "Persist"},
- };
- RegisterHandlers(functions);
+ explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Update"},
+ FunctionInfo{1, nullptr, "PersistOld"},
+ FunctionInfo{2, nullptr, "Persist"}
+ );
};
void IGeneralService::GetClientId(HLERequestContext& ctx) {
@@ -1050,78 +1053,70 @@ void IGeneralService::GetCurrentAccessPoint(HLERequestContext& ctx) {
rb.Push(ResultSuccess);
}
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IGeneralService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, &IGeneralService::GetClientId, "GetClientId"},
+ FunctionInfo{2, &IGeneralService::CreateScanRequest, "CreateScanRequest"},
+ FunctionInfo{4, &IGeneralService::CreateRequest, "CreateRequest"},
+ FunctionInfo{5, &IGeneralService::GetCurrentNetworkProfile, "GetCurrentNetworkProfile"},
+ FunctionInfo{6, &IGeneralService::EnumerateNetworkInterfaces, "EnumerateNetworkInterfaces"},
+ FunctionInfo{7, &IGeneralService::EnumerateNetworkProfiles, "EnumerateNetworkProfiles"},
+ FunctionInfo{8, &IGeneralService::GetNetworkProfile, "GetNetworkProfile"},
+ FunctionInfo{9, &IGeneralService::SetNetworkProfile, "SetNetworkProfile"},
+ FunctionInfo{10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"},
+ FunctionInfo{11, &IGeneralService::GetScanData, "GetScanDataOld"},
+ FunctionInfo{12, &IGeneralService::GetCurrentIpAddress, "GetCurrentIpAddress"},
+ FunctionInfo{13, nullptr, "GetCurrentAccessPointOld"},
+ FunctionInfo{14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"},
+ FunctionInfo{15, &IGeneralService::GetCurrentIpConfigInfo, "GetCurrentIpConfigInfo"},
+ FunctionInfo{16, &IGeneralService::SetWirelessCommunicationEnabled, "SetWirelessCommunicationEnabled"},
+ FunctionInfo{17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"},
+ FunctionInfo{18, &IGeneralService::GetInternetConnectionStatus, "GetInternetConnectionStatus"},
+ FunctionInfo{19, &IGeneralService::SetEthernetCommunicationEnabled, "SetEthernetCommunicationEnabled"},
+ FunctionInfo{20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"},
+ FunctionInfo{21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"},
+ FunctionInfo{22, &IGeneralService::IsAnyForegroundRequestAccepted, "IsAnyForegroundRequestAccepted"},
+ FunctionInfo{23, nullptr, "PutToSleep"},
+ FunctionInfo{24, nullptr, "WakeUp"},
+ FunctionInfo{25, &IGeneralService::GetSsidListVersion, "GetSsidListVersion"},
+ FunctionInfo{26, nullptr, "SetExclusiveClient"},
+ FunctionInfo{27, nullptr, "GetDefaultIpSetting"},
+ FunctionInfo{28, nullptr, "SetDefaultIpSetting"},
+ FunctionInfo{29, nullptr, "SetWirelessCommunicationEnabledForTest"},
+ FunctionInfo{30, nullptr, "SetEthernetCommunicationEnabledForTest"},
+ FunctionInfo{31, nullptr, "GetTelemetorySystemEventReadableHandle"},
+ FunctionInfo{32, nullptr, "GetTelemetryInfo"},
+ FunctionInfo{33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability", MakeVersionGate({2,0,0})},
+ FunctionInfo{34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled", MakeVersionGate({4,0,0})},
+ FunctionInfo{35, &IGeneralService::GetScanDataV2, "GetScanData"},
+ FunctionInfo{36, &IGeneralService::GetCurrentAccessPoint, "GetCurrentAccessPoint"},
+ FunctionInfo{37, nullptr, "Shutdown"},
+ FunctionInfo{38, nullptr, "GetAllowedChannels"},
+ FunctionInfo{39, nullptr, "NotifyApplicationSuspended"},
+ FunctionInfo{40, nullptr, "SetAcceptableNetworkTypeFlag"},
+ FunctionInfo{41, nullptr, "GetAcceptableNetworkTypeFlag"},
+ FunctionInfo{42, nullptr, "NotifyConnectionStateChanged"},
+ FunctionInfo{43, nullptr, "SetWowlDelayedWakeTime"},
+ FunctionInfo{44, nullptr, "IsWiredConnectionAvailable", MakeVersionGate({18,0,0})},
+ FunctionInfo{45, nullptr, "IsNetworkEmulationFeatureEnabled", MakeVersionGate({18,0,0})},
+ FunctionInfo{46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug", MakeVersionGate({18,0,0})},
+ FunctionInfo{47, &IGeneralService::GetScanDataV3, "GetScanData", MakeVersionGate({19,0,0})},
+ FunctionInfo{50, nullptr, "IsRewriteFeatureEnabled", MakeVersionGate({18,0,0})},
+ FunctionInfo{51, nullptr, "CreateRewriteRule", MakeVersionGate({18,0,0})},
+ FunctionInfo{52, nullptr, "DestroyRewriteRule", MakeVersionGate({18,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IGeneralService::IGeneralService(Core::System& system_)
: ServiceFramework{system_, "IGeneralService"} {
- // clang-format off
-
- static const FunctionInfo functions[] = {
- {1, &IGeneralService::GetClientId, "GetClientId"},
- {2, &IGeneralService::CreateScanRequest, "CreateScanRequest"},
- {4, &IGeneralService::CreateRequest, "CreateRequest"},
- {5, &IGeneralService::GetCurrentNetworkProfile, "GetCurrentNetworkProfile"},
- {6, &IGeneralService::EnumerateNetworkInterfaces, "EnumerateNetworkInterfaces"},
- {7, &IGeneralService::EnumerateNetworkProfiles, "EnumerateNetworkProfiles"},
- {8, &IGeneralService::GetNetworkProfile, "GetNetworkProfile"},
- {9, &IGeneralService::SetNetworkProfile, "SetNetworkProfile"},
- {10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"},
- {11, &IGeneralService::GetScanData, "GetScanDataOld"},
- {12, &IGeneralService::GetCurrentIpAddress, "GetCurrentIpAddress"},
- {13, nullptr, "GetCurrentAccessPointOld"},
- {14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"},
- {15, &IGeneralService::GetCurrentIpConfigInfo, "GetCurrentIpConfigInfo"},
- {16, &IGeneralService::SetWirelessCommunicationEnabled, "SetWirelessCommunicationEnabled"},
- {17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"},
- {18, &IGeneralService::GetInternetConnectionStatus, "GetInternetConnectionStatus"},
- {19, &IGeneralService::SetEthernetCommunicationEnabled, "SetEthernetCommunicationEnabled"},
- {20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"},
- {21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"},
- {22, &IGeneralService::IsAnyForegroundRequestAccepted, "IsAnyForegroundRequestAccepted"},
- {23, nullptr, "PutToSleep"},
- {24, nullptr, "WakeUp"},
- {25, &IGeneralService::GetSsidListVersion, "GetSsidListVersion"},
- {26, nullptr, "SetExclusiveClient"},
- {27, nullptr, "GetDefaultIpSetting"},
- {28, nullptr, "SetDefaultIpSetting"},
- {29, nullptr, "SetWirelessCommunicationEnabledForTest"},
- {30, nullptr, "SetEthernetCommunicationEnabledForTest"},
- {31, nullptr, "GetTelemetorySystemEventReadableHandle"},
- {32, nullptr, "GetTelemetryInfo"},
- {33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability"}, // 2.0.0+
- {34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled"}, // 4.0.0+
- {35, &IGeneralService::GetScanDataV2, "GetScanData"},
- {36, &IGeneralService::GetCurrentAccessPoint, "GetCurrentAccessPoint"},
- {37, nullptr, "Shutdown"},
- {38, nullptr, "GetAllowedChannels"},
- {39, nullptr, "NotifyApplicationSuspended"},
- {40, nullptr, "SetAcceptableNetworkTypeFlag"},
- {41, nullptr, "GetAcceptableNetworkTypeFlag"},
- {42, nullptr, "NotifyConnectionStateChanged"},
- {43, nullptr, "SetWowlDelayedWakeTime"},
- {44, nullptr, "IsWiredConnectionAvailable"}, // 18.0.0+
- {45, nullptr, "IsNetworkEmulationFeatureEnabled"}, // 18.0.0+
- {46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug"}, // 18.0.0+
- {47, &IGeneralService::GetScanDataV3, "GetScanData"}, // 19.0.0+
- {50, nullptr, "IsRewriteFeatureEnabled"}, // 18.0.0+
- {51, nullptr, "CreateRewriteRule"}, // 18.0.0+
- {52, nullptr, "DestroyRewriteRule"} // 18.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IGeneralService::~IGeneralService() = default;
class NetworkInterface final : public ServiceFramework<NetworkInterface> {
public:
- explicit NetworkInterface(const char* name, Core::System& system_)
- : ServiceFramework{system_, name} {
- static const FunctionInfo functions[] = {
- {4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"},
- {5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"},
- };
- RegisterHandlers(functions);
- }
+ explicit NetworkInterface(const char* name, Core::System& system_) : ServiceFramework{system_, name} {}
private:
void CreateGeneralServiceOld(HLERequestContext& ctx) {
@@ -1139,6 +1134,14 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IGeneralService>(ctx, system);
}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"},
+ FunctionInfo{5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/nifm/nifm.h b/src/core/hle/service/nifm/nifm.h
index 3b5a438c75..3f3535fa93 100644
--- a/src/core/hle/service/nifm/nifm.h
+++ b/src/core/hle/service/nifm/nifm.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator
@@ -51,6 +51,7 @@ private:
void SetBackgroundRequestEnabled(HLERequestContext& ctx);
void GetCurrentAccessPoint(HLERequestContext& ctx);
void GetScanDataV3(HLERequestContext& ctx);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NIFM
diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp
index e5f2d85dde..c48bf54646 100644
--- a/src/core/hle/service/nim/nim.cpp
+++ b/src/core/hle/service/nim/nim.cpp
@@ -24,24 +24,15 @@ namespace Service::NIM {
class IShopServiceAsync final : public ServiceFramework<IShopServiceAsync> {
public:
explicit IShopServiceAsync(Core::System& system_)
- : ServiceFramework{system_, "IShopServiceAsync"},
- service_context{system_, "IShopServiceAsync"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IShopServiceAsync::Cancel>, "Cancel"},
- {1, D<&IShopServiceAsync::GetSize>, "GetSize"},
- {2, D<&IShopServiceAsync::Read>, "Read"},
- {3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"},
- {4, D<&IShopServiceAsync::Request>, "Request"},
- {5, D<&IShopServiceAsync::Prepare>, "Prepare"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
+ : ServiceFramework{system_, "IShopServiceAsync"}
+ , service_context{system_, "IShopServiceAsync"} {
completion_event = service_context.CreateEvent("IShopServiceAsync:Completion");
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
~IShopServiceAsync() override {
CancelImpl();
service_context.CloseEvent(completion_event);
@@ -52,15 +43,6 @@ public:
}
private:
- KernelHelpers::ServiceContext service_context;
- Kernel::KEvent* completion_event;
-
- std::jthread worker;
- std::atomic<u32> error_code{0};
-
- std::mutex data_mutex;
- std::vector<u8> download_data;
-
void CancelImpl() {
worker.request_stop();
if (worker.joinable()) {
@@ -136,19 +118,30 @@ private:
}
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IShopServiceAsync::Cancel>, "Cancel"},
+ FunctionInfo{1, D<&IShopServiceAsync::GetSize>, "GetSize"},
+ FunctionInfo{2, D<&IShopServiceAsync::Read>, "Read"},
+ FunctionInfo{3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"},
+ FunctionInfo{4, D<&IShopServiceAsync::Request>, "Request"},
+ FunctionInfo{5, D<&IShopServiceAsync::Prepare>, "Prepare"}
+ );
+ KernelHelpers::ServiceContext service_context;
+ Kernel::KEvent* completion_event;
+ std::jthread worker;
+ std::atomic<u32> error_code{0};
+ std::mutex data_mutex;
+ std::vector<u8> download_data;
};
class IShopServiceAccessor final : public ServiceFramework<IShopServiceAccessor> {
public:
explicit IShopServiceAccessor(Core::System& system_)
- : ServiceFramework{system_, "IShopServiceAccessor"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"},
- };
- // clang-format on
+ : ServiceFramework{system_, "IShopServiceAccessor"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -160,19 +153,19 @@ private:
rb.PushCopyObjects(ctx, async_interface->GetEvent());
rb.PushIpcInterface<IShopServiceAsync>(ctx, std::move(async_interface));
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"}
+ );
};
class IShopServiceAccessServer final : public ServiceFramework<IShopServiceAccessServer> {
public:
explicit IShopServiceAccessServer(Core::System& system_)
- : ServiceFramework{system_, "IShopServiceAccessServer"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"},
- };
- // clang-format on
+ : ServiceFramework{system_, "IShopServiceAccessServer"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -182,258 +175,252 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IShopServiceAccessor>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"}
+ );
};
class NIM final : public ServiceFramework<NIM> {
public:
- explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CreateSystemUpdateTask"},
- {1, nullptr, "DestroySystemUpdateTask"},
- {2, nullptr, "ListSystemUpdateTask"},
- {3, nullptr, "RequestSystemUpdateTaskRun"},
- {4, nullptr, "GetSystemUpdateTaskInfo"},
- {5, nullptr, "CommitSystemUpdateTask"},
- {6, nullptr, "CreateNetworkInstallTask"},
- {7, nullptr, "DestroyNetworkInstallTask"},
- {8, nullptr, "ListNetworkInstallTask"},
- {9, nullptr, "RequestNetworkInstallTaskRun"},
- {10, nullptr, "GetNetworkInstallTaskInfo"},
- {11, nullptr, "CommitNetworkInstallTask"},
- {12, nullptr, "RequestLatestSystemUpdateMeta"},
- {14, nullptr, "ListApplicationNetworkInstallTask"},
- {15, nullptr, "ListNetworkInstallTaskContentMeta"},
- {16, nullptr, "RequestLatestVersion"},
- {17, nullptr, "SetNetworkInstallTaskAttribute"},
- {18, nullptr, "AddNetworkInstallTaskContentMeta"},
- {19, nullptr, "GetDownloadedSystemDataPath"},
- {20, nullptr, "CalculateNetworkInstallTaskRequiredSize"},
- {21, nullptr, "IsExFatDriverIncluded"},
- {22, nullptr, "GetBackgroundDownloadStressTaskInfo"},
- {23, nullptr, "RequestDeviceAuthenticationToken"},
- {24, nullptr, "RequestGameCardRegistrationStatus"},
- {25, nullptr, "RequestRegisterGameCard"},
- {26, nullptr, "RequestRegisterNotificationToken"},
- {27, nullptr, "RequestDownloadTaskList"},
- {28, nullptr, "RequestApplicationControl"},
- {29, nullptr, "RequestLatestApplicationControl"},
- {30, nullptr, "RequestVersionList"},
- {31, nullptr, "CreateApplyDeltaTask"},
- {32, nullptr, "DestroyApplyDeltaTask"},
- {33, nullptr, "ListApplicationApplyDeltaTask"},
- {34, nullptr, "RequestApplyDeltaTaskRun"},
- {35, nullptr, "GetApplyDeltaTaskInfo"},
- {36, nullptr, "ListApplyDeltaTask"},
- {37, nullptr, "CommitApplyDeltaTask"},
- {38, nullptr, "CalculateApplyDeltaTaskRequiredSize"},
- {39, nullptr, "PrepareShutdown"},
- {40, nullptr, "ListApplyDeltaTask"},
- {41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"},
- {42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"},
- {43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
- {44, nullptr, "GetApplyDeltaTaskRequiredStorage"},
- {45, nullptr, "CalculateNetworkInstallTaskContentsSize"},
- {46, nullptr, "PrepareShutdownForSystemUpdate"},
- {47, nullptr, "FindMaxRequiredApplicationVersionOfTask"},
- {48, nullptr, "CommitNetworkInstallTaskPartially"},
- {49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"},
- {50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"},
- {51, nullptr, "FindMaxRequiredSystemVersionOfTask"},
- {52, nullptr, "GetNetworkInstallTaskErrorContext"},
- {53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"},
- {54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"},
- {55, nullptr, "ListLocalCommunicationReceiveApplicationTask"},
- {56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"},
- {57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"},
- {58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"},
- {59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"},
- {60, nullptr, "CreateLocalCommunicationSendApplicationTask"},
- {61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"},
- {62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"},
- {63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"},
- {64, nullptr, "DestroyLocalCommunicationSendApplicationTask"},
- {65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"},
- {66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"},
- {67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"},
- {68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"},
- {69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"},
- {70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"},
- {71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"},
- {72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"},
- {73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"},
- {74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"},
- {75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"},
- {76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"},
- {77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"},
- {78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"},
- {79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"},
- {80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"},
- {81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"},
- {82, nullptr, "GetReceivedSystemDataPath"},
- {83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"},
- {84, nullptr, "ReloadErrorSimulation"},
- {85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"},
- {86, nullptr, "ListNetworkInstallTaskOccupiedSize"},
- {87, nullptr, "RequestQueryAvailableELicenses"},
- {88, nullptr, "RequestAssignELicenses"},
- {89, nullptr, "RequestExtendELicenses"},
- {90, nullptr, "RequestSyncELicenses"},
- {91, nullptr, "Unknown91"}, //6.0.0-14.1.2
- {92, nullptr, "Unknown92"}, //21.0.0+
- {93, nullptr, "RequestReportActiveELicenses"},
- {94, nullptr, "RequestReportActiveELicensesPassively"},
- {95, nullptr, "RequestRegisterDynamicRightsNotificationToken"},
- {96, nullptr, "RequestAssignAllDeviceLinkedELicenses"},
- {97, nullptr, "RequestRevokeAllELicenses"},
- {98, nullptr, "RequestPrefetchForDynamicRights"},
- {99, nullptr, "CreateNetworkInstallTask"},
- {100, nullptr, "ListNetworkInstallTaskRightsIds"},
- {101, nullptr, "RequestDownloadETickets"},
- {102, nullptr, "RequestQueryDownloadableContents"},
- {103, nullptr, "DeleteNetworkInstallTaskContentMeta"},
- {104, nullptr, "RequestIssueEdgeTokenForDebug"},
- {105, nullptr, "RequestQueryAvailableELicenses2"},
- {106, nullptr, "RequestAssignELicenses2"},
- {107, nullptr, "GetNetworkInstallTaskStateCounter"},
- {108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"},
- {109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"},
- {110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"},
- {111, nullptr, "AddNetworkInstallTaskContentMetaForUser"},
- {112, nullptr, "RequestAssignELicensesAndDownloadETickets"},
- {113, nullptr, "RequestQueryAvailableCommonELicenses"},
- {114, nullptr, "SetNetworkInstallTaskExtendedAttribute"},
- {115, nullptr, "GetNetworkInstallTaskExtendedAttribute"},
- {116, nullptr, "GetAllocatorInfo"},
- {117, nullptr, "RequestQueryDownloadableContentsByApplicationId"},
- {118, nullptr, "MarkNoDownloadRightsErrorResolved"},
- {119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"},
- {120, nullptr, "PrioritizeNetworkInstallTask"},
- {121, nullptr, "RequestQueryAvailableCommonELicenses2"},
- {122, nullptr, "RequestAssignCommonELicenses"},
- {123, nullptr, "RequestAssignCommonELicenses2"},
- {124, nullptr, "IsNetworkInstallTaskFrontOfQueue"},
- {125, nullptr, "PrioritizeApplyDeltaTask"},
- {126, nullptr, "RerouteDownloadingPatch"},
- {127, nullptr, "UnmarkNoDownloadRightsErrorResolved"},
- {128, nullptr, "RequestContentsSize"},
- {129, nullptr, "RequestContentsAuthorizationToken"},
- {130, nullptr, "RequestCdnVendorDiscovery"},
- {131, nullptr, "RefreshDebugAvailability"},
- {132, nullptr, "ClearResponseSimulationEntry"},
- {133, nullptr, "RegisterResponseSimulationEntry"},
- {134, nullptr, "GetProcessedCdnVendors"},
- {135, nullptr, "RefreshRuntimeBehaviorsForDebug"},
- {136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"},
- {137, nullptr, "GetNetworkInstallTaskContentMetaCount"},
- {138, nullptr, "RequestRevokeELicenses"},
- {139, nullptr, "EnableNetworkConnectionToUseApplicationCore"},
- {140, nullptr, "DisableNetworkConnectionToUseApplicationCore"},
- {141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"},
- {142, nullptr, "RequestCheckSafeSystemVersion"},
- {143, nullptr, "RequestApplicationIcon"},
- {144, nullptr, "RequestDownloadIdbeIconFile"},
- {147, nullptr, "Unknown147"}, //18.0.0+
- {148, nullptr, "Unknown148"}, //18.0.0+
- {150, nullptr, "Unknown150"}, //19.0.0+
- {151, nullptr, "Unknown151"}, //20.0.0+
- {152, nullptr, "Unknown152"}, //20.0.0+
- {153, nullptr, "Unknown153"}, //20.0.0+
- {154, nullptr, "Unknown154"}, //20.0.0+
- {155, nullptr, "Unknown155"}, //20.0.0+
- {156, nullptr, "Unknown156"}, //20.0.0+
- {157, nullptr, "Unknown157"}, //20.0.0+
- {158, nullptr, "Unknown158"}, //20.0.0+
- {159, nullptr, "Unknown159"}, //20.0.0+
- {160, nullptr, "Unknown160"}, //20.0.0+
- {161, nullptr, "Unknown161"}, //20.0.0+
- {162, nullptr, "Unknown162"}, //20.0.0+
- {163, nullptr, "Unknown163"}, //20.0.0+
- {164, nullptr, "Unknown164"}, //20.0.0+
- {165, nullptr, "Unknown165"}, //20.0.0+
- {166, nullptr, "Unknown166"}, //20.0.0+
- {167, nullptr, "Unknown167"}, //20.0.0+
- {168, nullptr, "Unknown168"}, //20.0.0+
- {169, nullptr, "Unknown169"}, //20.0.0+
- {170, nullptr, "Unknown170"}, //20.0.0+
- {171, nullptr, "Unknown171"}, //20.0.0+
- {172, nullptr, "Unknown172"}, //20.0.0+
- {173, nullptr, "Unknown173"}, //20.0.0+
- {174, nullptr, "Unknown174"}, //20.0.0+
- {175, nullptr, "Unknown175"}, //20.0.0+
- {176, nullptr, "Unknown176"}, //20.0.0+
- {177, nullptr, "Unknown177"}, //20.0.0+
- {2000, nullptr, "Unknown2000"}, //20.0.0+
- {2001, nullptr, "Unknown2001"}, //20.0.0+
- {2002, nullptr, "Unknown2002"}, //20.0.0+
- {2003, nullptr, "Unknown2003"}, //20.0.0+
- {2004, nullptr, "Unknown2004"}, //20.0.0+
- {2007, nullptr, "Unknown2007"}, //20.0.0+
- {2011, nullptr, "Unknown2011"}, //20.0.0+
- {2012, nullptr, "Unknown2012"}, //20.0.0+
- {2013, nullptr, "Unknown2013"}, //20.0.0+
- {2014, nullptr, "Unknown2014"}, //20.0.0+
- {2015, nullptr, "Unknown2015"}, //20.0.0+
- {2016, nullptr, "Unknown2016"}, //20.0.0+
- {2017, nullptr, "Unknown2017"}, //20.0.0+
- {2018, nullptr, "Unknown2018"}, //20.0.0+
- {2019, nullptr, "Unknown2019"}, //20.0.0+
- {2020, nullptr, "Unknown2020"}, //20.0.0+
- {2021, nullptr, "Unknown2021"}, //20.0.0+
- {2022, nullptr, "Unknown2022"}, //20.0.0+
- {2023, nullptr, "Unknown2023"}, //20.0.0+
- {2024, nullptr, "Unknown2024"}, //20.0.0+
- {2025, nullptr, "Unknown2025"}, //20.0.0+
- {2026, nullptr, "Unknown2026"}, //20.0.0+
- {2027, nullptr, "Unknown2027"}, //20.0.0+
- {2028, nullptr, "Unknown2028"}, //20.0.0+
- {2029, nullptr, "Unknown2029"}, //20.0.0+
- {2030, nullptr, "Unknown2030"}, //20.0.0+
- {2031, nullptr, "Unknown2031"}, //20.0.0+
- {2032, nullptr, "Unknown2032"}, //20.0.0+
- {2033, nullptr, "Unknown2033"}, //20.0.0+
- {2034, nullptr, "Unknown2034"}, //20.0.0+
- {2035, nullptr, "Unknown2035"}, //20.0.0+
- {2036, nullptr, "Unknown2036"}, //20.0.0+
- {2037, nullptr, "Unknown2037"}, //20.0.0+
- {2038, nullptr, "Unknown2038"}, //20.0.0+
- {2039, nullptr, "Unknown2039"}, //20.0.0+
- {2040, nullptr, "Unknown2040"}, //20.0.0+
- {2041, nullptr, "Unknown2041"}, //20.0.0+
- {2042, nullptr, "Unknown2042"}, //20.0.0+
- {2043, nullptr, "Unknown2043"}, //20.0.0+
- {2044, nullptr, "Unknown2044"}, //20.0.0+
- {2045, nullptr, "Unknown2045"}, //20.0.0+
- {2046, nullptr, "Unknown2046"}, //20.0.0+
- {2047, nullptr, "Unknown2047"}, //20.0.0+
- {2048, nullptr, "Unknown2048"}, //20.0.0+
- {2049, nullptr, "Unknown2049"}, //20.0.0+
- {2050, nullptr, "Unknown2050"}, //20.0.0+
- {2051, nullptr, "Unknown2051"}, //20.0.0+
- {3000, nullptr, "RequestLatestApplicationIcon"}, //17.0.0+
- {3001, nullptr, "RequestDownloadIdbeLatestIconFile"}, //17.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateSystemUpdateTask"},
+ FunctionInfo{1, nullptr, "DestroySystemUpdateTask"},
+ FunctionInfo{2, nullptr, "ListSystemUpdateTask"},
+ FunctionInfo{3, nullptr, "RequestSystemUpdateTaskRun"},
+ FunctionInfo{4, nullptr, "GetSystemUpdateTaskInfo"},
+ FunctionInfo{5, nullptr, "CommitSystemUpdateTask"},
+ FunctionInfo{6, nullptr, "CreateNetworkInstallTask"},
+ FunctionInfo{7, nullptr, "DestroyNetworkInstallTask"},
+ FunctionInfo{8, nullptr, "ListNetworkInstallTask"},
+ FunctionInfo{9, nullptr, "RequestNetworkInstallTaskRun"},
+ FunctionInfo{10, nullptr, "GetNetworkInstallTaskInfo"},
+ FunctionInfo{11, nullptr, "CommitNetworkInstallTask"},
+ FunctionInfo{12, nullptr, "RequestLatestSystemUpdateMeta"},
+ FunctionInfo{14, nullptr, "ListApplicationNetworkInstallTask"},
+ FunctionInfo{15, nullptr, "ListNetworkInstallTaskContentMeta"},
+ FunctionInfo{16, nullptr, "RequestLatestVersion"},
+ FunctionInfo{17, nullptr, "SetNetworkInstallTaskAttribute"},
+ FunctionInfo{18, nullptr, "AddNetworkInstallTaskContentMeta"},
+ FunctionInfo{19, nullptr, "GetDownloadedSystemDataPath"},
+ FunctionInfo{20, nullptr, "CalculateNetworkInstallTaskRequiredSize"},
+ FunctionInfo{21, nullptr, "IsExFatDriverIncluded"},
+ FunctionInfo{22, nullptr, "GetBackgroundDownloadStressTaskInfo"},
+ FunctionInfo{23, nullptr, "RequestDeviceAuthenticationToken"},
+ FunctionInfo{24, nullptr, "RequestGameCardRegistrationStatus"},
+ FunctionInfo{25, nullptr, "RequestRegisterGameCard"},
+ FunctionInfo{26, nullptr, "RequestRegisterNotificationToken"},
+ FunctionInfo{27, nullptr, "RequestDownloadTaskList"},
+ FunctionInfo{28, nullptr, "RequestApplicationControl"},
+ FunctionInfo{29, nullptr, "RequestLatestApplicationControl"},
+ FunctionInfo{30, nullptr, "RequestVersionList"},
+ FunctionInfo{31, nullptr, "CreateApplyDeltaTask"},
+ FunctionInfo{32, nullptr, "DestroyApplyDeltaTask"},
+ FunctionInfo{33, nullptr, "ListApplicationApplyDeltaTask"},
+ FunctionInfo{34, nullptr, "RequestApplyDeltaTaskRun"},
+ FunctionInfo{35, nullptr, "GetApplyDeltaTaskInfo"},
+ FunctionInfo{36, nullptr, "ListApplyDeltaTask"},
+ FunctionInfo{37, nullptr, "CommitApplyDeltaTask"},
+ FunctionInfo{38, nullptr, "CalculateApplyDeltaTaskRequiredSize"},
+ FunctionInfo{39, nullptr, "PrepareShutdown"},
+ FunctionInfo{40, nullptr, "ListApplyDeltaTask"},
+ FunctionInfo{41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"},
+ FunctionInfo{42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"},
+ FunctionInfo{43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
+ FunctionInfo{44, nullptr, "GetApplyDeltaTaskRequiredStorage"},
+ FunctionInfo{45, nullptr, "CalculateNetworkInstallTaskContentsSize"},
+ FunctionInfo{46, nullptr, "PrepareShutdownForSystemUpdate"},
+ FunctionInfo{47, nullptr, "FindMaxRequiredApplicationVersionOfTask"},
+ FunctionInfo{48, nullptr, "CommitNetworkInstallTaskPartially"},
+ FunctionInfo{49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"},
+ FunctionInfo{50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"},
+ FunctionInfo{51, nullptr, "FindMaxRequiredSystemVersionOfTask"},
+ FunctionInfo{52, nullptr, "GetNetworkInstallTaskErrorContext"},
+ FunctionInfo{53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"},
+ FunctionInfo{54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"},
+ FunctionInfo{55, nullptr, "ListLocalCommunicationReceiveApplicationTask"},
+ FunctionInfo{56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"},
+ FunctionInfo{57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"},
+ FunctionInfo{58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"},
+ FunctionInfo{59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"},
+ FunctionInfo{60, nullptr, "CreateLocalCommunicationSendApplicationTask"},
+ FunctionInfo{61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"},
+ FunctionInfo{62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"},
+ FunctionInfo{63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"},
+ FunctionInfo{64, nullptr, "DestroyLocalCommunicationSendApplicationTask"},
+ FunctionInfo{65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"},
+ FunctionInfo{66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"},
+ FunctionInfo{67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"},
+ FunctionInfo{68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"},
+ FunctionInfo{69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"},
+ FunctionInfo{70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"},
+ FunctionInfo{71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"},
+ FunctionInfo{72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"},
+ FunctionInfo{73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"},
+ FunctionInfo{74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"},
+ FunctionInfo{75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"},
+ FunctionInfo{76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"},
+ FunctionInfo{77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"},
+ FunctionInfo{78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"},
+ FunctionInfo{79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"},
+ FunctionInfo{80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"},
+ FunctionInfo{81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"},
+ FunctionInfo{82, nullptr, "GetReceivedSystemDataPath"},
+ FunctionInfo{83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"},
+ FunctionInfo{84, nullptr, "ReloadErrorSimulation"},
+ FunctionInfo{85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"},
+ FunctionInfo{86, nullptr, "ListNetworkInstallTaskOccupiedSize"},
+ FunctionInfo{87, nullptr, "RequestQueryAvailableELicenses"},
+ FunctionInfo{88, nullptr, "RequestAssignELicenses"},
+ FunctionInfo{89, nullptr, "RequestExtendELicenses"},
+ FunctionInfo{90, nullptr, "RequestSyncELicenses"},
+ FunctionInfo{91, nullptr, "Unknown91", MakeVersionGate({6,0,0}, {14,1,2})},
+ FunctionInfo{92, nullptr, "Unknown92", MakeVersionGate({21,0,0})},
+ FunctionInfo{93, nullptr, "RequestReportActiveELicenses"},
+ FunctionInfo{94, nullptr, "RequestReportActiveELicensesPassively"},
+ FunctionInfo{95, nullptr, "RequestRegisterDynamicRightsNotificationToken"},
+ FunctionInfo{96, nullptr, "RequestAssignAllDeviceLinkedELicenses"},
+ FunctionInfo{97, nullptr, "RequestRevokeAllELicenses"},
+ FunctionInfo{98, nullptr, "RequestPrefetchForDynamicRights"},
+ FunctionInfo{99, nullptr, "CreateNetworkInstallTask"},
+ FunctionInfo{100, nullptr, "ListNetworkInstallTaskRightsIds"},
+ FunctionInfo{101, nullptr, "RequestDownloadETickets"},
+ FunctionInfo{102, nullptr, "RequestQueryDownloadableContents"},
+ FunctionInfo{103, nullptr, "DeleteNetworkInstallTaskContentMeta"},
+ FunctionInfo{104, nullptr, "RequestIssueEdgeTokenForDebug"},
+ FunctionInfo{105, nullptr, "RequestQueryAvailableELicenses2"},
+ FunctionInfo{106, nullptr, "RequestAssignELicenses2"},
+ FunctionInfo{107, nullptr, "GetNetworkInstallTaskStateCounter"},
+ FunctionInfo{108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"},
+ FunctionInfo{109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"},
+ FunctionInfo{110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"},
+ FunctionInfo{111, nullptr, "AddNetworkInstallTaskContentMetaForUser"},
+ FunctionInfo{112, nullptr, "RequestAssignELicensesAndDownloadETickets"},
+ FunctionInfo{113, nullptr, "RequestQueryAvailableCommonELicenses"},
+ FunctionInfo{114, nullptr, "SetNetworkInstallTaskExtendedAttribute"},
+ FunctionInfo{115, nullptr, "GetNetworkInstallTaskExtendedAttribute"},
+ FunctionInfo{116, nullptr, "GetAllocatorInfo"},
+ FunctionInfo{117, nullptr, "RequestQueryDownloadableContentsByApplicationId"},
+ FunctionInfo{118, nullptr, "MarkNoDownloadRightsErrorResolved"},
+ FunctionInfo{119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"},
+ FunctionInfo{120, nullptr, "PrioritizeNetworkInstallTask"},
+ FunctionInfo{121, nullptr, "RequestQueryAvailableCommonELicenses2"},
+ FunctionInfo{122, nullptr, "RequestAssignCommonELicenses"},
+ FunctionInfo{123, nullptr, "RequestAssignCommonELicenses2"},
+ FunctionInfo{124, nullptr, "IsNetworkInstallTaskFrontOfQueue"},
+ FunctionInfo{125, nullptr, "PrioritizeApplyDeltaTask"},
+ FunctionInfo{126, nullptr, "RerouteDownloadingPatch"},
+ FunctionInfo{127, nullptr, "UnmarkNoDownloadRightsErrorResolved"},
+ FunctionInfo{128, nullptr, "RequestContentsSize"},
+ FunctionInfo{129, nullptr, "RequestContentsAuthorizationToken"},
+ FunctionInfo{130, nullptr, "RequestCdnVendorDiscovery"},
+ FunctionInfo{131, nullptr, "RefreshDebugAvailability"},
+ FunctionInfo{132, nullptr, "ClearResponseSimulationEntry"},
+ FunctionInfo{133, nullptr, "RegisterResponseSimulationEntry"},
+ FunctionInfo{134, nullptr, "GetProcessedCdnVendors"},
+ FunctionInfo{135, nullptr, "RefreshRuntimeBehaviorsForDebug"},
+ FunctionInfo{136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"},
+ FunctionInfo{137, nullptr, "GetNetworkInstallTaskContentMetaCount"},
+ FunctionInfo{138, nullptr, "RequestRevokeELicenses"},
+ FunctionInfo{139, nullptr, "EnableNetworkConnectionToUseApplicationCore"},
+ FunctionInfo{140, nullptr, "DisableNetworkConnectionToUseApplicationCore"},
+ FunctionInfo{141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"},
+ FunctionInfo{142, nullptr, "RequestCheckSafeSystemVersion"},
+ FunctionInfo{143, nullptr, "RequestApplicationIcon"},
+ FunctionInfo{144, nullptr, "RequestDownloadIdbeIconFile"},
+ FunctionInfo{147, nullptr, "Unknown147", MakeVersionGate({18,0,0})},
+ FunctionInfo{148, nullptr, "Unknown148", MakeVersionGate({18,0,0})},
+ FunctionInfo{150, nullptr, "Unknown150", MakeVersionGate({19,0,0})},
+ FunctionInfo{151, nullptr, "Unknown151", MakeVersionGate({20,0,0})},
+ FunctionInfo{152, nullptr, "Unknown152", MakeVersionGate({20,0,0})},
+ FunctionInfo{153, nullptr, "Unknown153", MakeVersionGate({20,0,0})},
+ FunctionInfo{154, nullptr, "Unknown154", MakeVersionGate({20,0,0})},
+ FunctionInfo{155, nullptr, "Unknown155", MakeVersionGate({20,0,0})},
+ FunctionInfo{156, nullptr, "Unknown156", MakeVersionGate({20,0,0})},
+ FunctionInfo{157, nullptr, "Unknown157", MakeVersionGate({20,0,0})},
+ FunctionInfo{158, nullptr, "Unknown158", MakeVersionGate({20,0,0})},
+ FunctionInfo{159, nullptr, "Unknown159", MakeVersionGate({20,0,0})},
+ FunctionInfo{160, nullptr, "Unknown160", MakeVersionGate({20,0,0})},
+ FunctionInfo{161, nullptr, "Unknown161", MakeVersionGate({20,0,0})},
+ FunctionInfo{162, nullptr, "Unknown162", MakeVersionGate({20,0,0})},
+ FunctionInfo{163, nullptr, "Unknown163", MakeVersionGate({20,0,0})},
+ FunctionInfo{164, nullptr, "Unknown164", MakeVersionGate({20,0,0})},
+ FunctionInfo{165, nullptr, "Unknown165", MakeVersionGate({20,0,0})},
+ FunctionInfo{166, nullptr, "Unknown166", MakeVersionGate({20,0,0})},
+ FunctionInfo{167, nullptr, "Unknown167", MakeVersionGate({20,0,0})},
+ FunctionInfo{168, nullptr, "Unknown168", MakeVersionGate({20,0,0})},
+ FunctionInfo{169, nullptr, "Unknown169", MakeVersionGate({20,0,0})},
+ FunctionInfo{170, nullptr, "Unknown170", MakeVersionGate({20,0,0})},
+ FunctionInfo{171, nullptr, "Unknown171", MakeVersionGate({20,0,0})},
+ FunctionInfo{172, nullptr, "Unknown172", MakeVersionGate({20,0,0})},
+ FunctionInfo{173, nullptr, "Unknown173", MakeVersionGate({20,0,0})},
+ FunctionInfo{174, nullptr, "Unknown174", MakeVersionGate({20,0,0})},
+ FunctionInfo{175, nullptr, "Unknown175", MakeVersionGate({20,0,0})},
+ FunctionInfo{176, nullptr, "Unknown176", MakeVersionGate({20,0,0})},
+ FunctionInfo{177, nullptr, "Unknown177", MakeVersionGate({20,0,0})},
+ FunctionInfo{2000, nullptr, "Unknown2000", MakeVersionGate({20,0,0})},
+ FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})},
+ FunctionInfo{2002, nullptr, "Unknown2002", MakeVersionGate({20,0,0})},
+ FunctionInfo{2003, nullptr, "Unknown2003", MakeVersionGate({20,0,0})},
+ FunctionInfo{2004, nullptr, "Unknown2004", MakeVersionGate({20,0,0})},
+ FunctionInfo{2007, nullptr, "Unknown2007", MakeVersionGate({20,0,0})},
+ FunctionInfo{2011, nullptr, "Unknown2011", MakeVersionGate({20,0,0})},
+ FunctionInfo{2012, nullptr, "Unknown2012", MakeVersionGate({20,0,0})},
+ FunctionInfo{2013, nullptr, "Unknown2013", MakeVersionGate({20,0,0})},
+ FunctionInfo{2014, nullptr, "Unknown2014", MakeVersionGate({20,0,0})},
+ FunctionInfo{2015, nullptr, "Unknown2015", MakeVersionGate({20,0,0})},
+ FunctionInfo{2016, nullptr, "Unknown2016", MakeVersionGate({20,0,0})},
+ FunctionInfo{2017, nullptr, "Unknown2017", MakeVersionGate({20,0,0})},
+ FunctionInfo{2018, nullptr, "Unknown2018", MakeVersionGate({20,0,0})},
+ FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})},
+ FunctionInfo{2020, nullptr, "Unknown2020", MakeVersionGate({20,0,0})},
+ FunctionInfo{2021, nullptr, "Unknown2021", MakeVersionGate({20,0,0})},
+ FunctionInfo{2022, nullptr, "Unknown2022", MakeVersionGate({20,0,0})},
+ FunctionInfo{2023, nullptr, "Unknown2023", MakeVersionGate({20,0,0})},
+ FunctionInfo{2024, nullptr, "Unknown2024", MakeVersionGate({20,0,0})},
+ FunctionInfo{2025, nullptr, "Unknown2025", MakeVersionGate({20,0,0})},
+ FunctionInfo{2026, nullptr, "Unknown2026", MakeVersionGate({20,0,0})},
+ FunctionInfo{2027, nullptr, "Unknown2027", MakeVersionGate({20,0,0})},
+ FunctionInfo{2028, nullptr, "Unknown2028", MakeVersionGate({20,0,0})},
+ FunctionInfo{2029, nullptr, "Unknown2029", MakeVersionGate({20,0,0})},
+ FunctionInfo{2030, nullptr, "Unknown2030", MakeVersionGate({20,0,0})},
+ FunctionInfo{2031, nullptr, "Unknown2031", MakeVersionGate({20,0,0})},
+ FunctionInfo{2032, nullptr, "Unknown2032", MakeVersionGate({20,0,0})},
+ FunctionInfo{2033, nullptr, "Unknown2033", MakeVersionGate({20,0,0})},
+ FunctionInfo{2034, nullptr, "Unknown2034", MakeVersionGate({20,0,0})},
+ FunctionInfo{2035, nullptr, "Unknown2035", MakeVersionGate({20,0,0})},
+ FunctionInfo{2036, nullptr, "Unknown2036", MakeVersionGate({20,0,0})},
+ FunctionInfo{2037, nullptr, "Unknown2037", MakeVersionGate({20,0,0})},
+ FunctionInfo{2038, nullptr, "Unknown2038", MakeVersionGate({20,0,0})},
+ FunctionInfo{2039, nullptr, "Unknown2039", MakeVersionGate({20,0,0})},
+ FunctionInfo{2040, nullptr, "Unknown2040", MakeVersionGate({20,0,0})},
+ FunctionInfo{2041, nullptr, "Unknown2041", MakeVersionGate({20,0,0})},
+ FunctionInfo{2042, nullptr, "Unknown2042", MakeVersionGate({20,0,0})},
+ FunctionInfo{2043, nullptr, "Unknown2043", MakeVersionGate({20,0,0})},
+ FunctionInfo{2044, nullptr, "Unknown2044", MakeVersionGate({20,0,0})},
+ FunctionInfo{2045, nullptr, "Unknown2045", MakeVersionGate({20,0,0})},
+ FunctionInfo{2046, nullptr, "Unknown2046", MakeVersionGate({20,0,0})},
+ FunctionInfo{2047, nullptr, "Unknown2047", MakeVersionGate({20,0,0})},
+ FunctionInfo{2048, nullptr, "Unknown2048", MakeVersionGate({20,0,0})},
+ FunctionInfo{2049, nullptr, "Unknown2049", MakeVersionGate({20,0,0})},
+ FunctionInfo{2050, nullptr, "Unknown2050", MakeVersionGate({20,0,0})},
+ FunctionInfo{2051, nullptr, "Unknown2051", MakeVersionGate({20,0,0})},
+ FunctionInfo{3000, nullptr, "RequestLatestApplicationIcon", MakeVersionGate({17,0,0})},
+ FunctionInfo{3001, nullptr, "RequestDownloadIdbeLatestIconFile", MakeVersionGate({17,0,0})}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class NIM_ECA final : public ServiceFramework<NIM_ECA> {
public:
- explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"},
- {1, nullptr, "RefreshDebugAvailability"},
- {2, nullptr, "ClearDebugResponse"},
- {3, nullptr, "RegisterDebugResponse"},
- {4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"},
- {5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2"} // 17.0.0+
- };
- // clang-format on
+ explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -463,45 +450,53 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IShopServiceAccessServer>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"},
+ FunctionInfo{1, nullptr, "RefreshDebugAvailability"},
+ FunctionInfo{2, nullptr, "ClearDebugResponse"},
+ FunctionInfo{3, nullptr, "RegisterDebugResponse"},
+ FunctionInfo{4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"},
+ FunctionInfo{5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2", MakeVersionGate({17,0,0})}
+ );
};
class NIM_SHP final : public ServiceFramework<NIM_SHP> {
public:
- explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestDeviceAuthenticationToken"},
- {1, nullptr, "RequestCachedDeviceAuthenticationToken"},
- {2, nullptr, "RequestEdgeToken"},
- {3, nullptr, "RequestCachedEdgeToken"},
- {100, nullptr, "RequestRegisterDeviceAccount"},
- {101, nullptr, "RequestUnregisterDeviceAccount"},
- {102, nullptr, "RequestDeviceAccountStatus"},
- {103, nullptr, "GetDeviceAccountInfo"},
- {104, nullptr, "RequestDeviceRegistrationInfo"},
- {105, nullptr, "RequestTransferDeviceAccount"},
- {106, nullptr, "RequestSyncRegistration"},
- {107, nullptr, "IsOwnDeviceId"},
- {200, nullptr, "RequestRegisterNotificationToken"},
- {300, nullptr, "RequestUnlinkDevice"},
- {301, nullptr, "RequestUnlinkDeviceIntegrated"},
- {302, nullptr, "RequestLinkDevice"},
- {303, nullptr, "HasDeviceLink"},
- {304, nullptr, "RequestUnlinkDeviceAll"},
- {305, nullptr, "RequestCreateVirtualAccount"},
- {306, nullptr, "RequestDeviceLinkStatus"},
- {400, nullptr, "GetAccountByVirtualAccount"},
- {401, nullptr, "GetVirtualAccount"},
- {500, nullptr, "RequestSyncTicketLegacy"},
- {501, nullptr, "RequestDownloadTicket"},
- {502, nullptr, "RequestDownloadTicketForPrepurchasedContents"},
- {503, nullptr, "RequestSyncTicket"},
- {504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"},
- {505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestDeviceAuthenticationToken"},
+ FunctionInfo{1, nullptr, "RequestCachedDeviceAuthenticationToken"},
+ FunctionInfo{2, nullptr, "RequestEdgeToken"},
+ FunctionInfo{3, nullptr, "RequestCachedEdgeToken"},
+ FunctionInfo{100, nullptr, "RequestRegisterDeviceAccount"},
+ FunctionInfo{101, nullptr, "RequestUnregisterDeviceAccount"},
+ FunctionInfo{102, nullptr, "RequestDeviceAccountStatus"},
+ FunctionInfo{103, nullptr, "GetDeviceAccountInfo"},
+ FunctionInfo{104, nullptr, "RequestDeviceRegistrationInfo"},
+ FunctionInfo{105, nullptr, "RequestTransferDeviceAccount"},
+ FunctionInfo{106, nullptr, "RequestSyncRegistration"},
+ FunctionInfo{107, nullptr, "IsOwnDeviceId"},
+ FunctionInfo{200, nullptr, "RequestRegisterNotificationToken"},
+ FunctionInfo{300, nullptr, "RequestUnlinkDevice"},
+ FunctionInfo{301, nullptr, "RequestUnlinkDeviceIntegrated"},
+ FunctionInfo{302, nullptr, "RequestLinkDevice"},
+ FunctionInfo{303, nullptr, "HasDeviceLink"},
+ FunctionInfo{304, nullptr, "RequestUnlinkDeviceAll"},
+ FunctionInfo{305, nullptr, "RequestCreateVirtualAccount"},
+ FunctionInfo{306, nullptr, "RequestDeviceLinkStatus"},
+ FunctionInfo{400, nullptr, "GetAccountByVirtualAccount"},
+ FunctionInfo{401, nullptr, "GetVirtualAccount"},
+ FunctionInfo{500, nullptr, "RequestSyncTicketLegacy"},
+ FunctionInfo{501, nullptr, "RequestDownloadTicket"},
+ FunctionInfo{502, nullptr, "RequestDownloadTicketForPrepurchasedContents"},
+ FunctionInfo{503, nullptr, "RequestSyncTicket"},
+ FunctionInfo{504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"},
+ FunctionInfo{505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
@@ -511,19 +506,7 @@ public:
explicit IEnsureNetworkClockAvailabilityService(Core::System& system_)
: ServiceFramework{system_, "IEnsureNetworkClockAvailabilityService"},
service_context{system_, "IEnsureNetworkClockAvailabilityService"} {
- static const FunctionInfo functions[] = {
- {0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"},
- {1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent,
- "GetFinishNotificationEvent"},
- {2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"},
- {3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"},
- {4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"},
- {5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"},
- };
- RegisterHandlers(functions);
-
- finished_event =
- service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent");
+ finished_event = service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent");
}
~IEnsureNetworkClockAvailabilityService() override {
@@ -580,23 +563,27 @@ private:
rb.PushRaw<s64>(server_time);
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"},
+ FunctionInfo{1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent, "GetFinishNotificationEvent"},
+ FunctionInfo{2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"},
+ FunctionInfo{3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"},
+ FunctionInfo{4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"},
+ FunctionInfo{5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"}
+ );
KernelHelpers::ServiceContext service_context;
-
Kernel::KEvent* finished_event;
};
class NTC final : public ServiceFramework<NTC> {
public:
- explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"},
- {100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"},
- {101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"},
- };
- // clang-format on
+ explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -622,18 +609,24 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"},
+ FunctionInfo{100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"},
+ FunctionInfo{101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"}
+ );
};
class NIM_ECAS final : public ServiceFramework<NIM_ECAS> {
public:
- explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RegisterSpecialClient"},
- {1, nullptr, "UnregisterSpecialClient"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RegisterSpecialClient"},
+ FunctionInfo{1, nullptr, "UnregisterSpecialClient"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/npns/npns.cpp b/src/core/hle/service/npns/npns.cpp
index b0f74bef06..90bf633e8b 100644
--- a/src/core/hle/service/npns/npns.cpp
+++ b/src/core/hle/service/npns/npns.cpp
@@ -19,79 +19,10 @@ class INpnsSystem final : public ServiceFramework<INpnsSystem> {
public:
explicit INpnsSystem(Core::System& system_)
: ServiceFramework{system_, "npns:s"}, service_context{system, "npns:s"},
- get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "ListenAll"},
- {2, C<&INpnsSystem::ListenTo>, "ListenTo"},
- {3, nullptr, "Receive"},
- {4, nullptr, "ReceiveRaw"},
- {5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"},
- {6, nullptr, "ListenUndelivered"},
- {7, nullptr, "GetStateChangeEvent"},
- {8, C<&INpnsSystem::ListenToByName>, "ListenToByName"},
- {11, nullptr, "SubscribeTopic"},
- {12, nullptr, "UnsubscribeTopic"},
- {13, nullptr, "QueryIsTopicExist"},
- {14, nullptr, "SubscribeTopicByAccount"}, // 18.0.0+
- {15, nullptr, "UnsubscribeTopicByAccount"}, // 18.0.0+
- {16, nullptr, "DownloadSubscriptionList"}, // 18.0.0+
- {21, nullptr, "CreateToken"},
- {22, nullptr, "CreateTokenWithApplicationId"},
- {23, nullptr, "DestroyToken"},
- {24, nullptr, "DestroyTokenWithApplicationId"},
- {25, nullptr, "QueryIsTokenValid"},
- {26, nullptr, "ListenToMyApplicationId"},
- {27, nullptr, "DestroyTokenAll"},
- {28, nullptr, "CreateTokenWithName"}, // 18.0.0+
- {29, nullptr, "DestroyTokenWithName"}, // 18.0.0+
- {31, nullptr, "UploadTokenToBaaS"},
- {32, nullptr, "DestroyTokenForBaaS"},
- {33, nullptr, "CreateTokenForBaaS"},
- {34, nullptr, "SetBaaSDeviceAccountIdList"},
- {35, nullptr, "LinkNsaId"}, // 17.0.0+
- {36, nullptr, "UnlinkNsaId"}, // 17.0.0+
- {37, nullptr, "RelinkNsaId"}, // 18.0.0+
- {40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent"}, // 17.0.0+
- {41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid"}, // 17.0.0+
- {42, nullptr, "SetNetworkServiceAccountIdTokenSuccess"}, // 17.0.0+
- {43, nullptr, "SetNetworkServiceAccountIdTokenFailure"}, // 17.0.0+
- {44, nullptr, "SetUidList"}, // 17.0.0+
- {45, nullptr, "PutDigitalTwinKeyValue"}, // 17.0.0+
- {51, nullptr, "DeleteDigitalTwinKeyValue"}, // 18.0.0+
- {101, nullptr, "Suspend"},
- {102, nullptr, "Resume"},
- {103, C<&INpnsSystem::GetState>, "GetState"},
- {104, nullptr, "GetStatistics"},
- {105, nullptr, "GetPlayReportRequestEvent"},
- {106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime"}, // 18.0.0+
- {107, nullptr, "SetLastNotifiedTime"}, // 18.0.0+
- {111, nullptr, "GetJid"},
- {112, nullptr, "CreateJid"},
- {113, nullptr, "DestroyJid"},
- {114, nullptr, "AttachJid"},
- {115, nullptr, "DetachJid"},
- {120, nullptr, "CreateNotificationReceiver"},
- {151, nullptr, "GetStateWithHandover"},
- {152, nullptr, "GetStateChangeEventWithHandover"},
- {153, nullptr, "GetDropEventWithHandover"},
- {154, nullptr, "CreateTokenAsync"},
- {155, nullptr, "CreateTokenAsyncWithApplicationId"},
- {156, nullptr, "CreateTokenWithNameAsync"}, // 18.0.0+
- {161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent"}, // 10.0.0+
- {162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"},
- {201, nullptr, "RequestChangeStateForceTimed"},
- {202, nullptr, "RequestChangeStateForceAsync"},
- {301, nullptr, "GetPassword"}, // 18.0.0+
- {302, nullptr, "GetAllImmigration"}, // 18.0.0+
- {303, nullptr, "GetNotificationHistories"}, // 18.0.0+
- {304, nullptr, "GetPersistentConnectionSummary"}, // 18.0.0+
- {305, nullptr, "GetDigitalTwinSummary"}, // 18.0.0+
- {306, nullptr, "GetDigitalTwinValue"}, // 18.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~INpnsSystem() override = default;
@@ -140,6 +71,74 @@ private:
R_SUCCEED();
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "ListenAll"},
+ FunctionInfo{2, C<&INpnsSystem::ListenTo>, "ListenTo"},
+ FunctionInfo{3, nullptr, "Receive"},
+ FunctionInfo{4, nullptr, "ReceiveRaw"},
+ FunctionInfo{5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"},
+ FunctionInfo{6, nullptr, "ListenUndelivered"},
+ FunctionInfo{7, nullptr, "GetStateChangeEvent"},
+ FunctionInfo{8, C<&INpnsSystem::ListenToByName>, "ListenToByName"},
+ FunctionInfo{11, nullptr, "SubscribeTopic"},
+ FunctionInfo{12, nullptr, "UnsubscribeTopic"},
+ FunctionInfo{13, nullptr, "QueryIsTopicExist"},
+ FunctionInfo{14, nullptr, "SubscribeTopicByAccount", MakeVersionGate({18,0,0})},
+ FunctionInfo{15, nullptr, "UnsubscribeTopicByAccount", MakeVersionGate({18,0,0})},
+ FunctionInfo{16, nullptr, "DownloadSubscriptionList", MakeVersionGate({18,0,0})},
+ FunctionInfo{21, nullptr, "CreateToken"},
+ FunctionInfo{22, nullptr, "CreateTokenWithApplicationId"},
+ FunctionInfo{23, nullptr, "DestroyToken"},
+ FunctionInfo{24, nullptr, "DestroyTokenWithApplicationId"},
+ FunctionInfo{25, nullptr, "QueryIsTokenValid"},
+ FunctionInfo{26, nullptr, "ListenToMyApplicationId"},
+ FunctionInfo{27, nullptr, "DestroyTokenAll"},
+ FunctionInfo{28, nullptr, "CreateTokenWithName", MakeVersionGate({18,0,0})},
+ FunctionInfo{29, nullptr, "DestroyTokenWithName", MakeVersionGate({18,0,0})},
+ FunctionInfo{31, nullptr, "UploadTokenToBaaS"},
+ FunctionInfo{32, nullptr, "DestroyTokenForBaaS"},
+ FunctionInfo{33, nullptr, "CreateTokenForBaaS"},
+ FunctionInfo{34, nullptr, "SetBaaSDeviceAccountIdList"},
+ FunctionInfo{35, nullptr, "LinkNsaId", MakeVersionGate({17,0,0})},
+ FunctionInfo{36, nullptr, "UnlinkNsaId", MakeVersionGate({17,0,0})},
+ FunctionInfo{37, nullptr, "RelinkNsaId", MakeVersionGate({18,0,0})},
+ FunctionInfo{40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent", MakeVersionGate({17,0,0})},
+ FunctionInfo{41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid", MakeVersionGate({17,0,0})},
+ FunctionInfo{42, nullptr, "SetNetworkServiceAccountIdTokenSuccess", MakeVersionGate({17,0,0})},
+ FunctionInfo{43, nullptr, "SetNetworkServiceAccountIdTokenFailure", MakeVersionGate({17,0,0})},
+ FunctionInfo{44, nullptr, "SetUidList", MakeVersionGate({17,0,0})},
+ FunctionInfo{45, nullptr, "PutDigitalTwinKeyValue", MakeVersionGate({17,0,0})},
+ FunctionInfo{51, nullptr, "DeleteDigitalTwinKeyValue", MakeVersionGate({18,0,0})},
+ FunctionInfo{101, nullptr, "Suspend"},
+ FunctionInfo{102, nullptr, "Resume"},
+ FunctionInfo{103, C<&INpnsSystem::GetState>, "GetState"},
+ FunctionInfo{104, nullptr, "GetStatistics"},
+ FunctionInfo{105, nullptr, "GetPlayReportRequestEvent"},
+ FunctionInfo{106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime", MakeVersionGate({18,0,0})},
+ FunctionInfo{107, nullptr, "SetLastNotifiedTime", MakeVersionGate({18,0,0})},
+ FunctionInfo{111, nullptr, "GetJid"},
+ FunctionInfo{112, nullptr, "CreateJid"},
+ FunctionInfo{113, nullptr, "DestroyJid"},
+ FunctionInfo{114, nullptr, "AttachJid"},
+ FunctionInfo{115, nullptr, "DetachJid"},
+ FunctionInfo{120, nullptr, "CreateNotificationReceiver"},
+ FunctionInfo{151, nullptr, "GetStateWithHandover"},
+ FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"},
+ FunctionInfo{153, nullptr, "GetDropEventWithHandover"},
+ FunctionInfo{154, nullptr, "CreateTokenAsync"},
+ FunctionInfo{155, nullptr, "CreateTokenAsyncWithApplicationId"},
+ FunctionInfo{156, nullptr, "CreateTokenWithNameAsync", MakeVersionGate({18,0,0})},
+ FunctionInfo{161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent", MakeVersionGate({10,0,0})},
+ FunctionInfo{162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"},
+ FunctionInfo{201, nullptr, "RequestChangeStateForceTimed"},
+ FunctionInfo{202, nullptr, "RequestChangeStateForceAsync"},
+ FunctionInfo{301, nullptr, "GetPassword", MakeVersionGate({18,0,0})},
+ FunctionInfo{302, nullptr, "GetAllImmigration", MakeVersionGate({18,0,0})},
+ FunctionInfo{303, nullptr, "GetNotificationHistories", MakeVersionGate({18,0,0})},
+ FunctionInfo{304, nullptr, "GetPersistentConnectionSummary", MakeVersionGate({18,0,0})},
+ FunctionInfo{305, nullptr, "GetDigitalTwinSummary", MakeVersionGate({18,0,0})},
+ FunctionInfo{306, nullptr, "GetDigitalTwinValue", MakeVersionGate({18,0,0})}
+ );
KernelHelpers::ServiceContext service_context;
Event get_receive_event;
Event get_request_change_state_cancel_event;
@@ -148,34 +147,10 @@ private:
class INpnsUser final : public ServiceFramework<INpnsUser> {
public:
explicit INpnsUser(Core::System& system_)
- : ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, nullptr, "ListenAll"},
- {2, nullptr, "ListenTo"},
- {3, nullptr, "Receive"},
- {4, nullptr, "ReceiveRaw"},
- {5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"},
- {7, nullptr, "GetStateChangeEvent"},
- {8, C<&INpnsUser::ListenToByName>, "ListenToByName"}, // 18.0.0+
- {21, nullptr, "CreateToken"},
- {23, nullptr, "DestroyToken"},
- {25, nullptr, "QueryIsTokenValid"},
- {26, nullptr, "ListenToMyApplicationId"},
- {101, nullptr, "Suspend"},
- {102, nullptr, "Resume"},
- {103, nullptr, "GetState"},
- {104, nullptr, "GetStatistics"},
- {111, nullptr, "GetJid"},
- {120, nullptr, "CreateNotificationReceiver"},
- {151, nullptr, "GetStateWithHandover"},
- {152, nullptr, "GetStateChangeEventWithHandover"},
- {153, nullptr, "GetDropEventWithHandover"},
- {154, nullptr, "CreateTokenAsync"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -195,6 +170,29 @@ private:
R_SUCCEED();
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, nullptr, "ListenAll"},
+ FunctionInfo{2, nullptr, "ListenTo"},
+ FunctionInfo{3, nullptr, "Receive"},
+ FunctionInfo{4, nullptr, "ReceiveRaw"},
+ FunctionInfo{5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"},
+ FunctionInfo{7, nullptr, "GetStateChangeEvent"},
+ FunctionInfo{8, C<&INpnsUser::ListenToByName>, "ListenToByName", MakeVersionGate({18,0,0})},
+ FunctionInfo{21, nullptr, "CreateToken"},
+ FunctionInfo{23, nullptr, "DestroyToken"},
+ FunctionInfo{25, nullptr, "QueryIsTokenValid"},
+ FunctionInfo{26, nullptr, "ListenToMyApplicationId"},
+ FunctionInfo{101, nullptr, "Suspend"},
+ FunctionInfo{102, nullptr, "Resume"},
+ FunctionInfo{103, nullptr, "GetState"},
+ FunctionInfo{104, nullptr, "GetStatistics"},
+ FunctionInfo{111, nullptr, "GetJid"},
+ FunctionInfo{120, nullptr, "CreateNotificationReceiver"},
+ FunctionInfo{151, nullptr, "GetStateWithHandover"},
+ FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"},
+ FunctionInfo{153, nullptr, "GetDropEventWithHandover"},
+ FunctionInfo{154, nullptr, "CreateTokenAsync"}
+ );
KernelHelpers::ServiceContext service_context;
Event get_receive_event;
};
diff --git a/src/core/hle/service/ns/account_proxy_interface.cpp b/src/core/hle/service/ns/account_proxy_interface.cpp
index e5041af66b..0107e16b72 100644
--- a/src/core/hle/service/ns/account_proxy_interface.cpp
+++ b/src/core/hle/service/ns/account_proxy_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,13 +10,6 @@ namespace Service::NS {
IAccountProxyInterface::IAccountProxyInterface(Core::System& system_)
: ServiceFramework{system_, "IAccountProxyInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CreateUserAccount"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IAccountProxyInterface::~IAccountProxyInterface() = default;
diff --git a/src/core/hle/service/ns/account_proxy_interface.h b/src/core/hle/service/ns/account_proxy_interface.h
index e944d2a75f..37248726a9 100644
--- a/src/core/hle/service/ns/account_proxy_interface.h
+++ b/src/core/hle/service/ns/account_proxy_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -11,6 +14,13 @@ class IAccountProxyInterface final : public ServiceFramework<IAccountProxyInterf
public:
explicit IAccountProxyInterface(Core::System& system_);
~IAccountProxyInterface() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateUserAccount"}
+ );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp
index 348649917e..7220c52dcb 100644
--- a/src/core/hle/service/ns/application_manager_interface.cpp
+++ b/src/core/hle/service/ns/application_manager_interface.cpp
@@ -25,6 +25,458 @@
namespace Service::NS {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationManagerInterface::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"},
+ FunctionInfo{1, nullptr, "GenerateApplicationRecordCount"},
+ FunctionInfo{2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"},
+ FunctionInfo{3, nullptr, "GetApplicationViewDeprecated"},
+ FunctionInfo{4, D<&IApplicationManagerInterface::DeleteApplicationEntity>, "DeleteApplicationEntity"},
+ FunctionInfo{5, D<&IApplicationManagerInterface::DeleteApplicationCompletely>, "DeleteApplicationCompletely"},
+ FunctionInfo{6, nullptr, "IsAnyApplicationEntityRedundant"},
+ FunctionInfo{7, nullptr, "DeleteRedundantApplicationEntity"},
+ FunctionInfo{8, nullptr, "IsApplicationEntityMovable"},
+ FunctionInfo{9, nullptr, "MoveApplicationEntity"},
+ FunctionInfo{11, nullptr, "CalculateApplicationOccupiedSize"},
+ FunctionInfo{16, &IApplicationManagerInterface::PushApplicationRecord, "PushApplicationRecord"},
+ FunctionInfo{17, nullptr, "ListApplicationRecordContentMeta"},
+ FunctionInfo{19, nullptr, "LaunchApplicationOld"},
+ FunctionInfo{21, nullptr, "GetApplicationContentPath"},
+ FunctionInfo{22, nullptr, "TerminateApplication"},
+ FunctionInfo{23, nullptr, "ResolveApplicationContentPath"},
+ FunctionInfo{26, nullptr, "BeginInstallApplication"},
+ FunctionInfo{27, nullptr, "DeleteApplicationRecord"},
+ FunctionInfo{30, nullptr, "RequestApplicationUpdateInfo"},
+ FunctionInfo{31, nullptr, "RequestUpdateApplication"},
+ FunctionInfo{32, nullptr, "CancelApplicationDownload"},
+ FunctionInfo{33, nullptr, "ResumeApplicationDownload"},
+ FunctionInfo{35, nullptr, "UpdateVersionList"},
+ FunctionInfo{36, nullptr, "PushLaunchVersion"},
+ FunctionInfo{37, nullptr, "ListRequiredVersion"},
+ FunctionInfo{38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"},
+ FunctionInfo{39, nullptr, "CheckApplicationLaunchRights"},
+ FunctionInfo{40, D<&IApplicationManagerInterface::GetApplicationLogoData>, "GetApplicationLogoData"},
+ FunctionInfo{41, nullptr, "CalculateApplicationDownloadRequiredSize"},
+ FunctionInfo{42, nullptr, "CleanupSdCard"},
+ FunctionInfo{43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
+ FunctionInfo{44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"},
+ FunctionInfo{45, nullptr, "GetGameCardAttachmentEvent"},
+ FunctionInfo{46, nullptr, "GetGameCardAttachmentInfo"},
+ FunctionInfo{47, D<&IApplicationManagerInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"},
+ FunctionInfo{48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
+ FunctionInfo{49, nullptr, "GetSdCardRemovedEvent"},
+ FunctionInfo{52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"},
+ FunctionInfo{53, nullptr, "DisableApplicationAutoDelete"},
+ FunctionInfo{54, nullptr, "EnableApplicationAutoDelete"},
+ FunctionInfo{55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
+ FunctionInfo{56, nullptr, "SetApplicationTerminateResult"},
+ FunctionInfo{57, nullptr, "ClearApplicationTerminateResult"},
+ FunctionInfo{58, nullptr, "GetLastSdCardMountUnexpectedResult"},
+ FunctionInfo{59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
+ FunctionInfo{60, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
+ FunctionInfo{61, nullptr, "GetBackgroundDownloadStressTaskInfo"},
+ FunctionInfo{62, nullptr, "GetGameCardStopper"},
+ FunctionInfo{63, nullptr, "IsSystemProgramInstalled"},
+ FunctionInfo{64, nullptr, "StartApplyDeltaTask"},
+ FunctionInfo{65, nullptr, "GetRequestServerStopper"},
+ FunctionInfo{66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
+ FunctionInfo{67, nullptr, "CancelApplicationApplyDelta"},
+ FunctionInfo{68, nullptr, "ResumeApplicationApplyDelta"},
+ FunctionInfo{69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
+ FunctionInfo{70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"},
+ FunctionInfo{71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"},
+ FunctionInfo{80, nullptr, "RequestDownloadApplication"},
+ FunctionInfo{81, nullptr, "RequestDownloadAddOnContent"},
+ FunctionInfo{82, nullptr, "DownloadApplication"},
+ FunctionInfo{83, nullptr, "CheckApplicationResumeRights"},
+ FunctionInfo{84, nullptr, "GetDynamicCommitEvent"},
+ FunctionInfo{85, nullptr, "RequestUpdateApplication2"},
+ FunctionInfo{86, nullptr, "EnableApplicationCrashReport"},
+ FunctionInfo{87, nullptr, "IsApplicationCrashReportEnabled"},
+ FunctionInfo{90, nullptr, "BoostSystemMemoryResourceLimit"},
+ FunctionInfo{91, nullptr, "DeprecatedLaunchApplication"},
+ FunctionInfo{92, nullptr, "GetRunningApplicationProgramId"},
+ FunctionInfo{93, nullptr, "GetMainApplicationProgramIndex"},
+ FunctionInfo{94, nullptr, "LaunchApplication"},
+ FunctionInfo{95, nullptr, "GetApplicationLaunchInfo"},
+ FunctionInfo{96, nullptr, "AcquireApplicationLaunchInfo"},
+ FunctionInfo{97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"},
+ FunctionInfo{98, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
+ FunctionInfo{99, nullptr, "LaunchDevMenu"},
+ FunctionInfo{100, nullptr, "ResetToFactorySettings"},
+ FunctionInfo{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
+ FunctionInfo{102, nullptr, "ResetToFactorySettingsForRefurbishment"},
+ FunctionInfo{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
+ FunctionInfo{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
+ FunctionInfo{105, nullptr, "RequestResetToFactorySettingsSecurely"},
+ FunctionInfo{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
+ FunctionInfo{200, nullptr, "CalculateUserSaveDataStatistics"},
+ FunctionInfo{201, nullptr, "DeleteUserSaveDataAll"},
+ FunctionInfo{210, nullptr, "DeleteUserSystemSaveData"},
+ FunctionInfo{211, nullptr, "DeleteSaveData"},
+ FunctionInfo{220, nullptr, "UnregisterNetworkServiceAccount"},
+ FunctionInfo{221, D<&IApplicationManagerInterface::UnregisterNetworkServiceAccountWithUserSaveDataDeletion>, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"},
+ FunctionInfo{300, nullptr, "GetApplicationShellEvent"},
+ FunctionInfo{301, nullptr, "PopApplicationShellEventInfo"},
+ FunctionInfo{302, nullptr, "LaunchLibraryApplet"},
+ FunctionInfo{303, nullptr, "TerminateLibraryApplet"},
+ FunctionInfo{304, nullptr, "LaunchSystemApplet"},
+ FunctionInfo{305, nullptr, "TerminateSystemApplet"},
+ FunctionInfo{306, nullptr, "LaunchOverlayApplet"},
+ FunctionInfo{307, nullptr, "TerminateOverlayApplet"},
+ FunctionInfo{400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"},
+ FunctionInfo{401, nullptr, "InvalidateAllApplicationControlCache"},
+ FunctionInfo{402, nullptr, "RequestDownloadApplicationControlData"},
+ FunctionInfo{403, nullptr, "GetMaxApplicationControlCacheCount"},
+ FunctionInfo{404, nullptr, "InvalidateApplicationControlCache"},
+ FunctionInfo{405, nullptr, "ListApplicationControlCacheEntryInfo"},
+ FunctionInfo{406, nullptr, "GetApplicationControlProperty"},
+ FunctionInfo{407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"},
+ FunctionInfo{408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"},
+ FunctionInfo{411, nullptr, "Unknown411", MakeVersionGate({19,0,0})},
+ FunctionInfo{412, nullptr, "Unknown412", MakeVersionGate({19,0,0})},
+ FunctionInfo{413, nullptr, "Unknown413", MakeVersionGate({19,0,0})},
+ FunctionInfo{414, nullptr, "Unknown414", MakeVersionGate({19,0,0})},
+ FunctionInfo{415, nullptr, "Unknown415", MakeVersionGate({19,0,0})},
+ FunctionInfo{416, nullptr, "Unknown416", MakeVersionGate({19,0,0})},
+ FunctionInfo{417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})},
+ FunctionInfo{418, nullptr, "InvalidateApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})},
+ FunctionInfo{419, D<&IApplicationManagerInterface::RequestDownloadApplicationControlDataInBackground>, "RequestDownloadApplicationControlDataInBackground"},
+ FunctionInfo{420, nullptr, "CloneApplicationControlDataCacheForDebug"},
+ FunctionInfo{421, nullptr, "Unknown421", MakeVersionGate({20,0,0})},
+ FunctionInfo{422, nullptr, "Unknown422", MakeVersionGate({20,0,0})},
+ FunctionInfo{423, nullptr, "Unknown423", MakeVersionGate({20,0,0})},
+ FunctionInfo{424, nullptr, "Unknown424", MakeVersionGate({20,0,0})},
+ FunctionInfo{425, nullptr, "Unknown425", MakeVersionGate({20,0,0})},
+ FunctionInfo{426, nullptr, "Unknown426", MakeVersionGate({20,0,0})},
+ FunctionInfo{427, nullptr, "Unknown427", MakeVersionGate({20,0,0})},
+ FunctionInfo{428, nullptr, "Unknown428", MakeVersionGate({21,0,0})},
+ FunctionInfo{429, nullptr, "Unknown429", MakeVersionGate({21,0,0})},
+ FunctionInfo{430, nullptr, "Unknown430", MakeVersionGate({21,0,0})},
+ FunctionInfo{502, nullptr, "RequestCheckGameCardRegistration"},
+ FunctionInfo{503, nullptr, "RequestGameCardRegistrationGoldPoint"},
+ FunctionInfo{504, nullptr, "RequestRegisterGameCard"},
+ FunctionInfo{505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"},
+ FunctionInfo{506, nullptr, "IsGameCardInserted"},
+ FunctionInfo{507, nullptr, "EnsureGameCardAccess"},
+ FunctionInfo{508, nullptr, "GetLastGameCardMountFailureResult"},
+ FunctionInfo{509, nullptr, "ListApplicationIdOnGameCard"},
+ FunctionInfo{510, nullptr, "GetGameCardPlatformRegion"},
+ FunctionInfo{511, D<&IApplicationManagerInterface::GetGameCardWakenReadyEvent>, "GetGameCardWakenReadyEvent"},
+ FunctionInfo{512, D<&IApplicationManagerInterface::IsGameCardApplicationRunning>, "IsGameCardApplicationRunning"},
+ FunctionInfo{513, nullptr, "Unknown513", MakeVersionGate({20,0,0})},
+ FunctionInfo{514, nullptr, "Unknown514", MakeVersionGate({20,0,0})},
+ FunctionInfo{515, nullptr, "Unknown515", MakeVersionGate({20,0,0})},
+ FunctionInfo{516, nullptr, "Unknown516", MakeVersionGate({21,0,0})},
+ FunctionInfo{517, nullptr, "Unknown517", MakeVersionGate({21,0,0})},
+ FunctionInfo{518, nullptr, "Unknown518", MakeVersionGate({21,0,0})},
+ FunctionInfo{519, nullptr, "Unknown519", MakeVersionGate({21,0,0})},
+ FunctionInfo{600, nullptr, "CountApplicationContentMeta"},
+ FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"},
+ FunctionInfo{602, nullptr, "ListAvailableAddOnContent"},
+ FunctionInfo{603, nullptr, "GetOwnedApplicationContentMetaStatus"},
+ FunctionInfo{604, nullptr, "RegisterContentsExternalKey"},
+ FunctionInfo{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
+ FunctionInfo{606, nullptr, "GetContentMetaStorage"},
+ FunctionInfo{607, nullptr, "ListAvailableAddOnContent"},
+ FunctionInfo{609, nullptr, "ListAvailabilityAssuredAddOnContent"},
+ FunctionInfo{610, nullptr, "GetInstalledContentMetaStorage"},
+ FunctionInfo{611, nullptr, "PrepareAddOnContent"},
+ FunctionInfo{700, nullptr, "PushDownloadTaskList"},
+ FunctionInfo{701, nullptr, "ClearTaskStatusList"},
+ FunctionInfo{702, nullptr, "RequestDownloadTaskList"},
+ FunctionInfo{703, nullptr, "RequestEnsureDownloadTask"},
+ FunctionInfo{704, nullptr, "ListDownloadTaskStatus"},
+ FunctionInfo{705, nullptr, "RequestDownloadTaskListData"},
+ FunctionInfo{800, nullptr, "RequestVersionList"},
+ FunctionInfo{801, nullptr, "ListVersionList"},
+ FunctionInfo{802, nullptr, "RequestVersionListData"},
+ FunctionInfo{900, nullptr, "GetApplicationRecord"},
+ FunctionInfo{901, nullptr, "GetApplicationRecordProperty"},
+ FunctionInfo{902, nullptr, "EnableApplicationAutoUpdate"},
+ FunctionInfo{903, nullptr, "DisableApplicationAutoUpdate"},
+ FunctionInfo{904, D<&IApplicationManagerInterface::TouchApplication>, "TouchApplication"},
+ FunctionInfo{905, nullptr, "RequestApplicationUpdate"},
+ FunctionInfo{906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"},
+ FunctionInfo{907, nullptr, "WithdrawApplicationUpdateRequest"},
+ FunctionInfo{908, nullptr, "ListApplicationRecordInstalledContentMeta"},
+ FunctionInfo{909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"},
+ FunctionInfo{910, nullptr, "HasApplicationRecord"},
+ FunctionInfo{911, nullptr, "SetPreInstalledApplication"},
+ FunctionInfo{912, nullptr, "ClearPreInstalledApplicationFlag"},
+ FunctionInfo{913, nullptr, "ListAllApplicationRecord"},
+ FunctionInfo{914, nullptr, "HideApplicationRecord"},
+ FunctionInfo{915, nullptr, "ShowApplicationRecord"},
+ FunctionInfo{916, nullptr, "IsApplicationAutoDeleteDisabled"},
+ FunctionInfo{916, nullptr, "Unknown916", MakeVersionGate({20,0,0})},
+ FunctionInfo{917, nullptr, "Unknown917", MakeVersionGate({20,0,0})},
+ FunctionInfo{918, nullptr, "Unknown918", MakeVersionGate({20,0,0})},
+ FunctionInfo{919, nullptr, "Unknown919", MakeVersionGate({20,0,0})},
+ FunctionInfo{920, nullptr, "Unknown920", MakeVersionGate({20,0,0})},
+ FunctionInfo{921, nullptr, "Unknown921", MakeVersionGate({20,0,0})},
+ FunctionInfo{922, nullptr, "Unknown922", MakeVersionGate({20,0,0})},
+ FunctionInfo{923, nullptr, "Unknown923", MakeVersionGate({20,0,0})},
+ FunctionInfo{928, nullptr, "Unknown928", MakeVersionGate({20,0,0})},
+ FunctionInfo{929, nullptr, "Unknown929", MakeVersionGate({20,0,0})},
+ FunctionInfo{930, nullptr, "Unknown930", MakeVersionGate({20,0,0})},
+ FunctionInfo{931, nullptr, "Unknown931", MakeVersionGate({20,0,0})},
+ FunctionInfo{933, nullptr, "Unknown933", MakeVersionGate({20,0,0})},
+ FunctionInfo{934, nullptr, "Unknown934", MakeVersionGate({21,0,0})},
+ FunctionInfo{935, nullptr, "Unknown935", MakeVersionGate({21,0,0})},
+ FunctionInfo{936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936", MakeVersionGate({21,0,0})},
+ FunctionInfo{1000, nullptr, "RequestVerifyApplicationDeprecated"},
+ FunctionInfo{1001, nullptr, "CorruptApplicationForDebug"},
+ FunctionInfo{1002, nullptr, "RequestVerifyAddOnContentsRights"},
+ FunctionInfo{1003, nullptr, "RequestVerifyApplication"},
+ FunctionInfo{1004, nullptr, "CorruptContentForDebug"},
+ FunctionInfo{1200, nullptr, "NeedsUpdateVulnerability"},
+ FunctionInfo{1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"},
+ FunctionInfo{1301, nullptr, "DeleteApplicationContentEntities"},
+ FunctionInfo{1302, nullptr, "CleanupUnrecordedApplicationEntity"},
+ FunctionInfo{1303, nullptr, "CleanupAddOnContentsWithNoRights"},
+ FunctionInfo{1304, nullptr, "DeleteApplicationContentEntity"},
+ FunctionInfo{1305, nullptr, "TryDeleteRunningApplicationEntity"},
+ FunctionInfo{1306, nullptr, "TryDeleteRunningApplicationCompletely"},
+ FunctionInfo{1307, nullptr, "TryDeleteRunningApplicationContentEntities"},
+ FunctionInfo{1308, nullptr, "DeleteApplicationCompletelyForDebug"},
+ FunctionInfo{1309, nullptr, "CleanupUnavailableAddOnContents"},
+ FunctionInfo{1310, nullptr, "RequestMoveApplicationEntity"},
+ FunctionInfo{1311, nullptr, "EstimateSizeToMove"},
+ FunctionInfo{1312, nullptr, "HasMovableEntity"},
+ FunctionInfo{1313, nullptr, "CleanupOrphanContents"},
+ FunctionInfo{1314, nullptr, "CheckPreconditionSatisfiedToMove"},
+ FunctionInfo{1400, nullptr, "PrepareShutdown"},
+ FunctionInfo{1500, nullptr, "FormatSdCard"},
+ FunctionInfo{1501, nullptr, "NeedsSystemUpdateToFormatSdCard"},
+ FunctionInfo{1502, nullptr, "GetLastSdCardFormatUnexpectedResult"},
+ FunctionInfo{1504, nullptr, "InsertSdCard"},
+ FunctionInfo{1505, nullptr, "RemoveSdCard"},
+ FunctionInfo{1506, nullptr, "GetSdCardStartupStatus"},
+ FunctionInfo{1508, nullptr, "Unknown1508", MakeVersionGate({20,0,0})},
+ FunctionInfo{1509, nullptr, "Unknown1509", MakeVersionGate({20,0,0})},
+ FunctionInfo{1510, nullptr, "Unknown1510", MakeVersionGate({20,0,0})},
+ FunctionInfo{1511, nullptr, "Unknown1511", MakeVersionGate({20,0,0})},
+ FunctionInfo{1512, nullptr, "Unknown1512", MakeVersionGate({20,0,0})},
+ FunctionInfo{1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
+ FunctionInfo{1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
+ FunctionInfo{1700, nullptr, "ListApplicationDownloadingContentMeta"},
+ FunctionInfo{1701, D<&IApplicationManagerInterface::GetApplicationViewDeprecated>, "GetApplicationViewDeprecated"},
+ FunctionInfo{1702, nullptr, "GetApplicationDownloadTaskStatus"},
+ FunctionInfo{1703, nullptr, "GetApplicationViewDownloadErrorContext"},
+ FunctionInfo{1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"},
+ FunctionInfo{1705, nullptr, "IsPatchAutoDeletableApplication"},
+ FunctionInfo{1706, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"},
+ FunctionInfo{1800, nullptr, "IsNotificationSetupCompleted"},
+ FunctionInfo{1801, nullptr, "GetLastNotificationInfoCount"},
+ FunctionInfo{1802, nullptr, "ListLastNotificationInfo"},
+ FunctionInfo{1803, nullptr, "ListNotificationTask"},
+ FunctionInfo{1900, nullptr, "IsActiveAccount"},
+ FunctionInfo{1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"},
+ FunctionInfo{1902, nullptr, "GetApplicationTicketInfo"},
+ FunctionInfo{1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"},
+ FunctionInfo{2000, nullptr, "GetSystemDeliveryInfo"},
+ FunctionInfo{2001, nullptr, "SelectLatestSystemDeliveryInfo"},
+ FunctionInfo{2002, nullptr, "VerifyDeliveryProtocolVersion"},
+ FunctionInfo{2003, nullptr, "GetApplicationDeliveryInfo"},
+ FunctionInfo{2004, nullptr, "HasAllContentsToDeliver"},
+ FunctionInfo{2005, nullptr, "CompareApplicationDeliveryInfo"},
+ FunctionInfo{2006, nullptr, "CanDeliverApplication"},
+ FunctionInfo{2007, nullptr, "ListContentMetaKeyToDeliverApplication"},
+ FunctionInfo{2008, nullptr, "NeedsSystemUpdateToDeliverApplication"},
+ FunctionInfo{2009, nullptr, "EstimateRequiredSize"},
+ FunctionInfo{2010, nullptr, "RequestReceiveApplication"},
+ FunctionInfo{2011, nullptr, "CommitReceiveApplication"},
+ FunctionInfo{2012, nullptr, "GetReceiveApplicationProgress"},
+ FunctionInfo{2013, nullptr, "RequestSendApplication"},
+ FunctionInfo{2014, nullptr, "GetSendApplicationProgress"},
+ FunctionInfo{2015, nullptr, "CompareSystemDeliveryInfo"},
+ FunctionInfo{2016, nullptr, "ListNotCommittedContentMeta"},
+ FunctionInfo{2017, nullptr, "CreateDownloadTask"},
+ FunctionInfo{2018, nullptr, "GetApplicationDeliveryInfoHash"},
+ FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})},
+ FunctionInfo{2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"},
+ FunctionInfo{2051, nullptr, "InvalidateRightsIdCache"},
+ FunctionInfo{2052, nullptr, "Unknown2052", MakeVersionGate({20,0,0})},
+ FunctionInfo{2053, nullptr, "Unknown2053", MakeVersionGate({20,0,0})},
+ FunctionInfo{2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"},
+ FunctionInfo{2101, nullptr, "GetRawApplicationTerminateResult"},
+ FunctionInfo{2150, nullptr, "CreateRightsEnvironment"},
+ FunctionInfo{2151, nullptr, "DestroyRightsEnvironment"},
+ FunctionInfo{2152, nullptr, "ActivateRightsEnvironment"},
+ FunctionInfo{2153, nullptr, "DeactivateRightsEnvironment"},
+ FunctionInfo{2154, nullptr, "ForceActivateRightsContextForExit"},
+ FunctionInfo{2155, nullptr, "UpdateRightsEnvironmentStatus"},
+ FunctionInfo{2156, nullptr, "CreateRightsEnvironmentForMicroApplication"},
+ FunctionInfo{2160, nullptr, "AddTargetApplicationToRightsEnvironment"},
+ FunctionInfo{2161, nullptr, "SetUsersToRightsEnvironment"},
+ FunctionInfo{2170, nullptr, "GetRightsEnvironmentStatus"},
+ FunctionInfo{2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"},
+ FunctionInfo{2180, nullptr, "RequestExtendRightsInRightsEnvironment"},
+ FunctionInfo{2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"},
+ FunctionInfo{2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"},
+ FunctionInfo{2183, nullptr, "Unknown2183", MakeVersionGate({20,1,0})},
+ FunctionInfo{2190, nullptr, "GetRightsEnvironmentHandleForApplication"},
+ FunctionInfo{2199, nullptr, "GetRightsEnvironmentCountForDebug"},
+ FunctionInfo{2200, nullptr, "GetGameCardApplicationCopyIdentifier"},
+ FunctionInfo{2201, nullptr, "GetInstalledApplicationCopyIdentifier"},
+ FunctionInfo{2250, nullptr, "RequestReportActiveELicence"},
+ FunctionInfo{2300, nullptr, "ListEventLog"},
+ FunctionInfo{2350, nullptr, "PerformAutoUpdateByApplicationId"},
+ FunctionInfo{2351, nullptr, "RequestNoDownloadRightsErrorResolution"},
+ FunctionInfo{2352, nullptr, "RequestResolveNoDownloadRightsError"},
+ FunctionInfo{2353, nullptr, "GetApplicationDownloadTaskInfo"},
+ FunctionInfo{2354, nullptr, "PrioritizeApplicationBackgroundTask"},
+ FunctionInfo{2355, nullptr, "PreferStorageEfficientUpdate"},
+ FunctionInfo{2356, nullptr, "RequestStorageEfficientUpdatePreferable"},
+ FunctionInfo{2357, nullptr, "EnableMultiCoreDownload"},
+ FunctionInfo{2358, nullptr, "DisableMultiCoreDownload"},
+ FunctionInfo{2359, nullptr, "IsMultiCoreDownloadEnabled"},
+ FunctionInfo{2360, nullptr, "GetApplicationDownloadTaskCount", MakeVersionGate({19,0,0})},
+ FunctionInfo{2361, nullptr, "GetMaxApplicationDownloadTaskCount", MakeVersionGate({19,0,0})},
+ FunctionInfo{2362, nullptr, "Unknown2362", MakeVersionGate({20,0,0})},
+ FunctionInfo{2363, nullptr, "Unknown2363", MakeVersionGate({20,0,0})},
+ FunctionInfo{2364, nullptr, "Unknown2364", MakeVersionGate({20,0,0})},
+ FunctionInfo{2365, nullptr, "Unknown2365", MakeVersionGate({20,0,0})},
+ FunctionInfo{2366, nullptr, "Unknown2366", MakeVersionGate({20,0,0})},
+ FunctionInfo{2367, nullptr, "Unknown2367", MakeVersionGate({20,0,0})},
+ FunctionInfo{2368, nullptr, "Unknown2368", MakeVersionGate({20,0,0})},
+ FunctionInfo{2369, nullptr, "Unknown2369", MakeVersionGate({21,0,0})},
+ FunctionInfo{2400, nullptr, "GetPromotionInfo"},
+ FunctionInfo{2401, nullptr, "CountPromotionInfo"},
+ FunctionInfo{2402, nullptr, "ListPromotionInfo"},
+ FunctionInfo{2403, nullptr, "ImportPromotionJsonForDebug"},
+ FunctionInfo{2404, nullptr, "ClearPromotionInfoForDebug"},
+ FunctionInfo{2500, nullptr, "ConfirmAvailableTime"},
+ FunctionInfo{2510, nullptr, "CreateApplicationResource"},
+ FunctionInfo{2511, nullptr, "GetApplicationResource"},
+ FunctionInfo{2513, nullptr, "LaunchMicroApplication"},
+ FunctionInfo{2514, nullptr, "ClearTaskOfAsyncTaskManager"},
+ FunctionInfo{2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"},
+ FunctionInfo{2516, nullptr, "EnsureApplicationCertificate"},
+ FunctionInfo{2517, nullptr, "CreateApplicationInstance"},
+ FunctionInfo{2518, nullptr, "UpdateQualificationForDebug"},
+ FunctionInfo{2519, nullptr, "IsQualificationTransitionSupported"},
+ FunctionInfo{2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>, "IsQualificationTransitionSupportedByProcessId"},
+ FunctionInfo{2521, nullptr, "GetRightsUserChangedEvent"},
+ FunctionInfo{2522, nullptr, "IsRomRedirectionAvailable"},
+ FunctionInfo{2523, nullptr, "GetProgramId", MakeVersionGate({17,0,0})},
+ FunctionInfo{2524, nullptr, "Unknown2524", MakeVersionGate({19,0,0})},
+ FunctionInfo{2525, nullptr, "Unknown2525", MakeVersionGate({20,0,0})},
+ FunctionInfo{2800, nullptr, "GetApplicationIdOfPreomia"},
+ FunctionInfo{3000, nullptr, "RegisterDeviceLockKey"},
+ FunctionInfo{3001, nullptr, "UnregisterDeviceLockKey"},
+ FunctionInfo{3002, nullptr, "VerifyDeviceLockKey"},
+ FunctionInfo{3003, nullptr, "HideApplicationIcon"},
+ FunctionInfo{3004, nullptr, "ShowApplicationIcon"},
+ FunctionInfo{3005, nullptr, "HideApplicationTitle"},
+ FunctionInfo{3006, nullptr, "ShowApplicationTitle"},
+ FunctionInfo{3007, nullptr, "EnableGameCard"},
+ FunctionInfo{3008, nullptr, "DisableGameCard"},
+ FunctionInfo{3009, nullptr, "EnableLocalContentShare"},
+ FunctionInfo{3010, nullptr, "DisableLocalContentShare"},
+ FunctionInfo{3011, nullptr, "IsApplicationIconHidden"},
+ FunctionInfo{3012, nullptr, "IsApplicationTitleHidden"},
+ FunctionInfo{3013, nullptr, "IsGameCardEnabled"},
+ FunctionInfo{3014, nullptr, "IsLocalContentShareEnabled"},
+ FunctionInfo{3050, nullptr, "ListAssignELicenseTaskResult"},
+ FunctionInfo{3104, nullptr, "GetApplicationNintendoLogo", MakeVersionGate({18,0,0})},
+ FunctionInfo{3105, nullptr, "GetApplicationStartupMovie", MakeVersionGate({18,0,0})},
+ FunctionInfo{4000, nullptr, "Unknown4000", MakeVersionGate({20,0,0})},
+ FunctionInfo{4004, nullptr, "Unknown4004", MakeVersionGate({20,0,0})},
+ FunctionInfo{4006, nullptr, "Unknown4006", MakeVersionGate({20,0,0})},
+ FunctionInfo{4007, nullptr, "Unknown4007", MakeVersionGate({20,0,0})},
+ FunctionInfo{4008, nullptr, "Unknown4008", MakeVersionGate({20,0,0})},
+ FunctionInfo{4009, nullptr, "Unknown4009", MakeVersionGate({20,0,0})},
+ FunctionInfo{4010, nullptr, "Unknown4010", MakeVersionGate({20,0,0})},
+ FunctionInfo{4011, nullptr, "Unknown4011", MakeVersionGate({20,0,0})},
+ FunctionInfo{4012, nullptr, "Unknown4012", MakeVersionGate({20,0,0})},
+ FunctionInfo{4013, nullptr, "Unknown4013", MakeVersionGate({20,0,0})},
+ FunctionInfo{4015, nullptr, "Unknown4015", MakeVersionGate({20,0,0})},
+ FunctionInfo{4017, nullptr, "Unknown4017", MakeVersionGate({20,0,0})},
+ FunctionInfo{4019, nullptr, "Unknown4019", MakeVersionGate({20,0,0})},
+ FunctionInfo{4020, nullptr, "Unknown4020", MakeVersionGate({20,0,0})},
+ FunctionInfo{4021, nullptr, "Unknown4021", MakeVersionGate({20,0,0})},
+ FunctionInfo{4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022", MakeVersionGate({20,0,0})},
+ FunctionInfo{4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023", MakeVersionGate({20,0,0})},
+ FunctionInfo{4024, nullptr, "Unknown4024", MakeVersionGate({20,0,0})},
+ FunctionInfo{4025, nullptr, "Unknown4025", MakeVersionGate({20,0,0})},
+ FunctionInfo{4026, nullptr, "Unknown4026", MakeVersionGate({20,0,0})},
+ FunctionInfo{4027, nullptr, "Unknown4027", MakeVersionGate({20,0,0})},
+ FunctionInfo{4028, nullptr, "Unknown4028", MakeVersionGate({20,0,0})},
+ FunctionInfo{4029, nullptr, "Unknown4029", MakeVersionGate({20,0,0})},
+ FunctionInfo{4030, nullptr, "Unknown4030", MakeVersionGate({20,0,0})},
+ FunctionInfo{4031, nullptr, "Unknown4031", MakeVersionGate({20,0,0})},
+ FunctionInfo{4032, nullptr, "Unknown4032", MakeVersionGate({20,0,0})},
+ FunctionInfo{4033, nullptr, "Unknown4033", MakeVersionGate({20,0,0})},
+ FunctionInfo{4034, nullptr, "Unknown4034", MakeVersionGate({20,0,0})},
+ FunctionInfo{4035, nullptr, "Unknown4035", MakeVersionGate({20,0,0})},
+ FunctionInfo{4037, nullptr, "Unknown4037", MakeVersionGate({20,0,0})},
+ FunctionInfo{4038, nullptr, "Unknown4038", MakeVersionGate({20,0,0})},
+ FunctionInfo{4039, nullptr, "Unknown4039", MakeVersionGate({20,0,0})},
+ FunctionInfo{4040, nullptr, "Unknown4040", MakeVersionGate({20,0,0})},
+ FunctionInfo{4041, nullptr, "Unknown4041", MakeVersionGate({20,0,0})},
+ FunctionInfo{4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042", MakeVersionGate({20,0,0})},
+ FunctionInfo{4043, nullptr, "Unknown4043", MakeVersionGate({20,0,0})},
+ FunctionInfo{4044, nullptr, "Unknown4044", MakeVersionGate({20,0,0})},
+ FunctionInfo{4045, nullptr, "Unknown4045", MakeVersionGate({20,0,0})},
+ FunctionInfo{4046, nullptr, "Unknown4046", MakeVersionGate({20,0,0})},
+ FunctionInfo{4049, nullptr, "Unknown4049", MakeVersionGate({20,0,0})},
+ FunctionInfo{4050, nullptr, "Unknown4050", MakeVersionGate({20,0,0})},
+ FunctionInfo{4051, nullptr, "Unknown4051", MakeVersionGate({20,0,0})},
+ FunctionInfo{4052, nullptr, "Unknown4052", MakeVersionGate({20,0,0})},
+ FunctionInfo{4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053", MakeVersionGate({20,0,0})},
+ FunctionInfo{4054, nullptr, "Unknown4054", MakeVersionGate({20,0,0})},
+ FunctionInfo{4055, nullptr, "Unknown4055", MakeVersionGate({20,0,0})},
+ FunctionInfo{4056, nullptr, "Unknown4056", MakeVersionGate({20,0,0})},
+ FunctionInfo{4057, nullptr, "Unknown4057", MakeVersionGate({20,0,0})},
+ FunctionInfo{4058, nullptr, "Unknown4058", MakeVersionGate({20,0,0})},
+ FunctionInfo{4059, nullptr, "Unknown4059", MakeVersionGate({20,0,0})},
+ FunctionInfo{4060, nullptr, "Unknown4060", MakeVersionGate({20,0,0})},
+ FunctionInfo{4061, nullptr, "Unknown4061", MakeVersionGate({20,0,0})},
+ FunctionInfo{4062, nullptr, "Unknown4062", MakeVersionGate({20,0,0})},
+ FunctionInfo{4063, nullptr, "Unknown4063", MakeVersionGate({20,0,0})},
+ FunctionInfo{4064, nullptr, "Unknown4064", MakeVersionGate({20,0,0})},
+ FunctionInfo{4065, nullptr, "Unknown4065", MakeVersionGate({20,0,0})},
+ FunctionInfo{4066, nullptr, "Unknown4066", MakeVersionGate({20,0,0})},
+ FunctionInfo{4067, nullptr, "Unknown4067", MakeVersionGate({20,0,0})},
+ FunctionInfo{4068, nullptr, "Unknown4068", MakeVersionGate({20,0,0})},
+ FunctionInfo{4069, nullptr, "Unknown4069", MakeVersionGate({20,0,0})},
+ FunctionInfo{4070, nullptr, "Unknown4070", MakeVersionGate({20,0,0})},
+ FunctionInfo{4071, nullptr, "Unknown4071", MakeVersionGate({20,0,0})},
+ FunctionInfo{4072, nullptr, "Unknown4072", MakeVersionGate({20,0,0})},
+ FunctionInfo{4073, nullptr, "Unknown4073", MakeVersionGate({20,0,0})},
+ FunctionInfo{4074, nullptr, "Unknown4074", MakeVersionGate({20,0,0})},
+ FunctionInfo{4075, nullptr, "Unknown4075", MakeVersionGate({20,0,0})},
+ FunctionInfo{4076, nullptr, "Unknown4076", MakeVersionGate({20,0,0})},
+ FunctionInfo{4077, nullptr, "Unknown4077", MakeVersionGate({20,0,0})},
+ FunctionInfo{4078, nullptr, "Unknown4078", MakeVersionGate({20,0,0})},
+ FunctionInfo{4079, nullptr, "Unknown4079", MakeVersionGate({20,0,0})},
+ FunctionInfo{4080, nullptr, "Unknown4080", MakeVersionGate({20,0,0})},
+ FunctionInfo{4081, nullptr, "Unknown4081", MakeVersionGate({20,0,0})},
+ FunctionInfo{4083, nullptr, "Unknown4083", MakeVersionGate({20,0,0})},
+ FunctionInfo{4084, nullptr, "Unknown4084", MakeVersionGate({20,0,0})},
+ FunctionInfo{4085, nullptr, "Unknown4085", MakeVersionGate({20,0,0})},
+ FunctionInfo{4086, nullptr, "Unknown4086", MakeVersionGate({20,0,0})},
+ FunctionInfo{4087, nullptr, "Unknown4087", MakeVersionGate({20,0,0})},
+ FunctionInfo{4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088", MakeVersionGate({20,0,0})},
+ FunctionInfo{4089, nullptr, "Unknown4089", MakeVersionGate({20,0,0})},
+ FunctionInfo{4090, nullptr, "Unknown4090", MakeVersionGate({20,0,0})},
+ FunctionInfo{4091, nullptr, "Unknown4091", MakeVersionGate({20,0,0})},
+ FunctionInfo{4092, nullptr, "Unknown4092", MakeVersionGate({20,0,0})},
+ FunctionInfo{4093, nullptr, "Unknown4093", MakeVersionGate({20,0,0})},
+ FunctionInfo{4094, nullptr, "Unknown4094", MakeVersionGate({20,0,0})},
+ FunctionInfo{4095, nullptr, "Unknown4095", MakeVersionGate({20,0,0})},
+ FunctionInfo{4096, nullptr, "Unknown4096", MakeVersionGate({20,0,0})},
+ FunctionInfo{4097, nullptr, "Unknown4097", MakeVersionGate({20,0,0})},
+ FunctionInfo{4099, nullptr, "Unknown4099", MakeVersionGate({21,0,0})},
+ FunctionInfo{4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105", MakeVersionGate({23,0,0})},
+ FunctionInfo{5000, nullptr, "Unknown5000", MakeVersionGate({18,0,0})},
+ FunctionInfo{5001, nullptr, "Unknown5001", MakeVersionGate({18,0,0})},
+ FunctionInfo{9999, nullptr, "GetApplicationCertificate", MakeVersionGate({10,0,0}, {10,2,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_)
: ServiceFramework{system_, "IApplicationManagerInterface"},
service_context{system, "IApplicationManagerInterface"},
@@ -32,458 +484,6 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
gamecard_update_detection_event{service_context},
gamecard_mount_status_event{service_context}, gamecard_mount_failure_event{service_context},
gamecard_waken_ready_event{service_context}, unknown_event{service_context} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"},
- {1, nullptr, "GenerateApplicationRecordCount"},
- {2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"},
- {3, nullptr, "GetApplicationViewDeprecated"},
- {4, D<&IApplicationManagerInterface::DeleteApplicationEntity>, "DeleteApplicationEntity"},
- {5, D<&IApplicationManagerInterface::DeleteApplicationCompletely>, "DeleteApplicationCompletely"},
- {6, nullptr, "IsAnyApplicationEntityRedundant"},
- {7, nullptr, "DeleteRedundantApplicationEntity"},
- {8, nullptr, "IsApplicationEntityMovable"},
- {9, nullptr, "MoveApplicationEntity"},
- {11, nullptr, "CalculateApplicationOccupiedSize"},
- {16, &IApplicationManagerInterface::PushApplicationRecord, "PushApplicationRecord"},
- {17, nullptr, "ListApplicationRecordContentMeta"},
- {19, nullptr, "LaunchApplicationOld"},
- {21, nullptr, "GetApplicationContentPath"},
- {22, nullptr, "TerminateApplication"},
- {23, nullptr, "ResolveApplicationContentPath"},
- {26, nullptr, "BeginInstallApplication"},
- {27, nullptr, "DeleteApplicationRecord"},
- {30, nullptr, "RequestApplicationUpdateInfo"},
- {31, nullptr, "RequestUpdateApplication"},
- {32, nullptr, "CancelApplicationDownload"},
- {33, nullptr, "ResumeApplicationDownload"},
- {35, nullptr, "UpdateVersionList"},
- {36, nullptr, "PushLaunchVersion"},
- {37, nullptr, "ListRequiredVersion"},
- {38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"},
- {39, nullptr, "CheckApplicationLaunchRights"},
- {40, D<&IApplicationManagerInterface::GetApplicationLogoData>, "GetApplicationLogoData"},
- {41, nullptr, "CalculateApplicationDownloadRequiredSize"},
- {42, nullptr, "CleanupSdCard"},
- {43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
- {44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"},
- {45, nullptr, "GetGameCardAttachmentEvent"},
- {46, nullptr, "GetGameCardAttachmentInfo"},
- {47, D<&IApplicationManagerInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"},
- {48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
- {49, nullptr, "GetSdCardRemovedEvent"},
- {52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"},
- {53, nullptr, "DisableApplicationAutoDelete"},
- {54, nullptr, "EnableApplicationAutoDelete"},
- {55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
- {56, nullptr, "SetApplicationTerminateResult"},
- {57, nullptr, "ClearApplicationTerminateResult"},
- {58, nullptr, "GetLastSdCardMountUnexpectedResult"},
- {59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
- {60, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
- {61, nullptr, "GetBackgroundDownloadStressTaskInfo"},
- {62, nullptr, "GetGameCardStopper"},
- {63, nullptr, "IsSystemProgramInstalled"},
- {64, nullptr, "StartApplyDeltaTask"},
- {65, nullptr, "GetRequestServerStopper"},
- {66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
- {67, nullptr, "CancelApplicationApplyDelta"},
- {68, nullptr, "ResumeApplicationApplyDelta"},
- {69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
- {70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"},
- {71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"},
- {80, nullptr, "RequestDownloadApplication"},
- {81, nullptr, "RequestDownloadAddOnContent"},
- {82, nullptr, "DownloadApplication"},
- {83, nullptr, "CheckApplicationResumeRights"},
- {84, nullptr, "GetDynamicCommitEvent"},
- {85, nullptr, "RequestUpdateApplication2"},
- {86, nullptr, "EnableApplicationCrashReport"},
- {87, nullptr, "IsApplicationCrashReportEnabled"},
- {90, nullptr, "BoostSystemMemoryResourceLimit"},
- {91, nullptr, "DeprecatedLaunchApplication"},
- {92, nullptr, "GetRunningApplicationProgramId"},
- {93, nullptr, "GetMainApplicationProgramIndex"},
- {94, nullptr, "LaunchApplication"},
- {95, nullptr, "GetApplicationLaunchInfo"},
- {96, nullptr, "AcquireApplicationLaunchInfo"},
- {97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"},
- {98, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
- {99, nullptr, "LaunchDevMenu"},
- {100, nullptr, "ResetToFactorySettings"},
- {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
- {102, nullptr, "ResetToFactorySettingsForRefurbishment"},
- {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
- {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
- {105, nullptr, "RequestResetToFactorySettingsSecurely"},
- {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
- {200, nullptr, "CalculateUserSaveDataStatistics"},
- {201, nullptr, "DeleteUserSaveDataAll"},
- {210, nullptr, "DeleteUserSystemSaveData"},
- {211, nullptr, "DeleteSaveData"},
- {220, nullptr, "UnregisterNetworkServiceAccount"},
- {221, D<&IApplicationManagerInterface::UnregisterNetworkServiceAccountWithUserSaveDataDeletion>, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"},
- {300, nullptr, "GetApplicationShellEvent"},
- {301, nullptr, "PopApplicationShellEventInfo"},
- {302, nullptr, "LaunchLibraryApplet"},
- {303, nullptr, "TerminateLibraryApplet"},
- {304, nullptr, "LaunchSystemApplet"},
- {305, nullptr, "TerminateSystemApplet"},
- {306, nullptr, "LaunchOverlayApplet"},
- {307, nullptr, "TerminateOverlayApplet"},
- {400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"},
- {401, nullptr, "InvalidateAllApplicationControlCache"},
- {402, nullptr, "RequestDownloadApplicationControlData"},
- {403, nullptr, "GetMaxApplicationControlCacheCount"},
- {404, nullptr, "InvalidateApplicationControlCache"},
- {405, nullptr, "ListApplicationControlCacheEntryInfo"},
- {406, nullptr, "GetApplicationControlProperty"},
- {407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"},
- {408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"},
- {411, nullptr, "Unknown411"}, //19.0.0+
- {412, nullptr, "Unknown412"}, //19.0.0+
- {413, nullptr, "Unknown413"}, //19.0.0+
- {414, nullptr, "Unknown414"}, //19.0.0+
- {415, nullptr, "Unknown415"}, //19.0.0+
- {416, nullptr, "Unknown416"}, //19.0.0+
- {417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage"}, //19.0.0+
- {418, nullptr, "InvalidateApplicationControlCacheOfTheStage"}, //19.0.0+
- {419, D<&IApplicationManagerInterface::RequestDownloadApplicationControlDataInBackground>, "RequestDownloadApplicationControlDataInBackground"},
- {420, nullptr, "CloneApplicationControlDataCacheForDebug"},
- {421, nullptr, "Unknown421"}, //20.0.0+
- {422, nullptr, "Unknown422"}, //20.0.0+
- {423, nullptr, "Unknown423"}, //20.0.0+
- {424, nullptr, "Unknown424"}, //20.0.0+
- {425, nullptr, "Unknown425"}, //20.0.0+
- {426, nullptr, "Unknown426"}, //20.0.0+
- {427, nullptr, "Unknown427"}, //20.0.0+
- {428, nullptr, "Unknown428"}, //21.0.0+
- {429, nullptr, "Unknown429"}, //21.0.0+
- {430, nullptr, "Unknown430"}, //21.0.0+
- {502, nullptr, "RequestCheckGameCardRegistration"},
- {503, nullptr, "RequestGameCardRegistrationGoldPoint"},
- {504, nullptr, "RequestRegisterGameCard"},
- {505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"},
- {506, nullptr, "IsGameCardInserted"},
- {507, nullptr, "EnsureGameCardAccess"},
- {508, nullptr, "GetLastGameCardMountFailureResult"},
- {509, nullptr, "ListApplicationIdOnGameCard"},
- {510, nullptr, "GetGameCardPlatformRegion"},
- {511, D<&IApplicationManagerInterface::GetGameCardWakenReadyEvent>, "GetGameCardWakenReadyEvent"},
- {512, D<&IApplicationManagerInterface::IsGameCardApplicationRunning>, "IsGameCardApplicationRunning"},
- {513, nullptr, "Unknown513"}, //20.0.0+
- {514, nullptr, "Unknown514"}, //20.0.0+
- {515, nullptr, "Unknown515"}, //20.0.0+
- {516, nullptr, "Unknown516"}, //21.0.0+
- {517, nullptr, "Unknown517"}, //21.0.0+
- {518, nullptr, "Unknown518"}, //21.0.0+
- {519, nullptr, "Unknown519"}, //21.0.0+
- {600, nullptr, "CountApplicationContentMeta"},
- {601, nullptr, "ListApplicationContentMetaStatus"},
- {602, nullptr, "ListAvailableAddOnContent"},
- {603, nullptr, "GetOwnedApplicationContentMetaStatus"},
- {604, nullptr, "RegisterContentsExternalKey"},
- {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
- {606, nullptr, "GetContentMetaStorage"},
- {607, nullptr, "ListAvailableAddOnContent"},
- {609, nullptr, "ListAvailabilityAssuredAddOnContent"},
- {610, nullptr, "GetInstalledContentMetaStorage"},
- {611, nullptr, "PrepareAddOnContent"},
- {700, nullptr, "PushDownloadTaskList"},
- {701, nullptr, "ClearTaskStatusList"},
- {702, nullptr, "RequestDownloadTaskList"},
- {703, nullptr, "RequestEnsureDownloadTask"},
- {704, nullptr, "ListDownloadTaskStatus"},
- {705, nullptr, "RequestDownloadTaskListData"},
- {800, nullptr, "RequestVersionList"},
- {801, nullptr, "ListVersionList"},
- {802, nullptr, "RequestVersionListData"},
- {900, nullptr, "GetApplicationRecord"},
- {901, nullptr, "GetApplicationRecordProperty"},
- {902, nullptr, "EnableApplicationAutoUpdate"},
- {903, nullptr, "DisableApplicationAutoUpdate"},
- {904, D<&IApplicationManagerInterface::TouchApplication>, "TouchApplication"},
- {905, nullptr, "RequestApplicationUpdate"},
- {906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"},
- {907, nullptr, "WithdrawApplicationUpdateRequest"},
- {908, nullptr, "ListApplicationRecordInstalledContentMeta"},
- {909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"},
- {910, nullptr, "HasApplicationRecord"},
- {911, nullptr, "SetPreInstalledApplication"},
- {912, nullptr, "ClearPreInstalledApplicationFlag"},
- {913, nullptr, "ListAllApplicationRecord"},
- {914, nullptr, "HideApplicationRecord"},
- {915, nullptr, "ShowApplicationRecord"},
- {916, nullptr, "IsApplicationAutoDeleteDisabled"},
- {916, nullptr, "Unknown916"}, //20.0.0+
- {917, nullptr, "Unknown917"}, //20.0.0+
- {918, nullptr, "Unknown918"}, //20.0.0+
- {919, nullptr, "Unknown919"}, //20.0.0+
- {920, nullptr, "Unknown920"}, //20.0.0+
- {921, nullptr, "Unknown921"}, //20.0.0+
- {922, nullptr, "Unknown922"}, //20.0.0+
- {923, nullptr, "Unknown923"}, //20.0.0+
- {928, nullptr, "Unknown928"}, //20.0.0+
- {929, nullptr, "Unknown929"}, //20.0.0+
- {930, nullptr, "Unknown930"}, //20.0.0+
- {931, nullptr, "Unknown931"}, //20.0.0+
- {933, nullptr, "Unknown933"}, //20.0.0+
- {934, nullptr, "Unknown934"}, //21.0.0+
- {935, nullptr, "Unknown935"}, //21.0.0+
- {936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936"}, //21.0.0+
- {1000, nullptr, "RequestVerifyApplicationDeprecated"},
- {1001, nullptr, "CorruptApplicationForDebug"},
- {1002, nullptr, "RequestVerifyAddOnContentsRights"},
- {1003, nullptr, "RequestVerifyApplication"},
- {1004, nullptr, "CorruptContentForDebug"},
- {1200, nullptr, "NeedsUpdateVulnerability"},
- {1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"},
- {1301, nullptr, "DeleteApplicationContentEntities"},
- {1302, nullptr, "CleanupUnrecordedApplicationEntity"},
- {1303, nullptr, "CleanupAddOnContentsWithNoRights"},
- {1304, nullptr, "DeleteApplicationContentEntity"},
- {1305, nullptr, "TryDeleteRunningApplicationEntity"},
- {1306, nullptr, "TryDeleteRunningApplicationCompletely"},
- {1307, nullptr, "TryDeleteRunningApplicationContentEntities"},
- {1308, nullptr, "DeleteApplicationCompletelyForDebug"},
- {1309, nullptr, "CleanupUnavailableAddOnContents"},
- {1310, nullptr, "RequestMoveApplicationEntity"},
- {1311, nullptr, "EstimateSizeToMove"},
- {1312, nullptr, "HasMovableEntity"},
- {1313, nullptr, "CleanupOrphanContents"},
- {1314, nullptr, "CheckPreconditionSatisfiedToMove"},
- {1400, nullptr, "PrepareShutdown"},
- {1500, nullptr, "FormatSdCard"},
- {1501, nullptr, "NeedsSystemUpdateToFormatSdCard"},
- {1502, nullptr, "GetLastSdCardFormatUnexpectedResult"},
- {1504, nullptr, "InsertSdCard"},
- {1505, nullptr, "RemoveSdCard"},
- {1506, nullptr, "GetSdCardStartupStatus"},
- {1508, nullptr, "Unknown1508"}, //20.0.0+
- {1509, nullptr, "Unknown1509"}, //20.0.0+
- {1510, nullptr, "Unknown1510"}, //20.0.0+
- {1511, nullptr, "Unknown1511"}, //20.0.0+
- {1512, nullptr, "Unknown1512"}, //20.0.0+
- {1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
- {1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
- {1700, nullptr, "ListApplicationDownloadingContentMeta"},
- {1701, D<&IApplicationManagerInterface::GetApplicationViewDeprecated>, "GetApplicationViewDeprecated"},
- {1702, nullptr, "GetApplicationDownloadTaskStatus"},
- {1703, nullptr, "GetApplicationViewDownloadErrorContext"},
- {1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"},
- {1705, nullptr, "IsPatchAutoDeletableApplication"},
- {1706, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"},
- {1800, nullptr, "IsNotificationSetupCompleted"},
- {1801, nullptr, "GetLastNotificationInfoCount"},
- {1802, nullptr, "ListLastNotificationInfo"},
- {1803, nullptr, "ListNotificationTask"},
- {1900, nullptr, "IsActiveAccount"},
- {1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"},
- {1902, nullptr, "GetApplicationTicketInfo"},
- {1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"},
- {2000, nullptr, "GetSystemDeliveryInfo"},
- {2001, nullptr, "SelectLatestSystemDeliveryInfo"},
- {2002, nullptr, "VerifyDeliveryProtocolVersion"},
- {2003, nullptr, "GetApplicationDeliveryInfo"},
- {2004, nullptr, "HasAllContentsToDeliver"},
- {2005, nullptr, "CompareApplicationDeliveryInfo"},
- {2006, nullptr, "CanDeliverApplication"},
- {2007, nullptr, "ListContentMetaKeyToDeliverApplication"},
- {2008, nullptr, "NeedsSystemUpdateToDeliverApplication"},
- {2009, nullptr, "EstimateRequiredSize"},
- {2010, nullptr, "RequestReceiveApplication"},
- {2011, nullptr, "CommitReceiveApplication"},
- {2012, nullptr, "GetReceiveApplicationProgress"},
- {2013, nullptr, "RequestSendApplication"},
- {2014, nullptr, "GetSendApplicationProgress"},
- {2015, nullptr, "CompareSystemDeliveryInfo"},
- {2016, nullptr, "ListNotCommittedContentMeta"},
- {2017, nullptr, "CreateDownloadTask"},
- {2018, nullptr, "GetApplicationDeliveryInfoHash"},
- {2019, nullptr, "Unknown2019"}, //20.0.0+
- {2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"},
- {2051, nullptr, "InvalidateRightsIdCache"},
- {2052, nullptr, "Unknown2052"}, //20.0.0+
- {2053, nullptr, "Unknown2053"}, //20.0.0+
- {2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"},
- {2101, nullptr, "GetRawApplicationTerminateResult"},
- {2150, nullptr, "CreateRightsEnvironment"},
- {2151, nullptr, "DestroyRightsEnvironment"},
- {2152, nullptr, "ActivateRightsEnvironment"},
- {2153, nullptr, "DeactivateRightsEnvironment"},
- {2154, nullptr, "ForceActivateRightsContextForExit"},
- {2155, nullptr, "UpdateRightsEnvironmentStatus"},
- {2156, nullptr, "CreateRightsEnvironmentForMicroApplication"},
- {2160, nullptr, "AddTargetApplicationToRightsEnvironment"},
- {2161, nullptr, "SetUsersToRightsEnvironment"},
- {2170, nullptr, "GetRightsEnvironmentStatus"},
- {2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"},
- {2180, nullptr, "RequestExtendRightsInRightsEnvironment"},
- {2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"},
- {2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"},
- {2183, nullptr, "Unknown2183"}, //20.1.0+
- {2190, nullptr, "GetRightsEnvironmentHandleForApplication"},
- {2199, nullptr, "GetRightsEnvironmentCountForDebug"},
- {2200, nullptr, "GetGameCardApplicationCopyIdentifier"},
- {2201, nullptr, "GetInstalledApplicationCopyIdentifier"},
- {2250, nullptr, "RequestReportActiveELicence"},
- {2300, nullptr, "ListEventLog"},
- {2350, nullptr, "PerformAutoUpdateByApplicationId"},
- {2351, nullptr, "RequestNoDownloadRightsErrorResolution"},
- {2352, nullptr, "RequestResolveNoDownloadRightsError"},
- {2353, nullptr, "GetApplicationDownloadTaskInfo"},
- {2354, nullptr, "PrioritizeApplicationBackgroundTask"},
- {2355, nullptr, "PreferStorageEfficientUpdate"},
- {2356, nullptr, "RequestStorageEfficientUpdatePreferable"},
- {2357, nullptr, "EnableMultiCoreDownload"},
- {2358, nullptr, "DisableMultiCoreDownload"},
- {2359, nullptr, "IsMultiCoreDownloadEnabled"},
- {2360, nullptr, "GetApplicationDownloadTaskCount"}, //19.0.0+
- {2361, nullptr, "GetMaxApplicationDownloadTaskCount"}, //19.0.0+
- {2362, nullptr, "Unknown2362"}, //20.0.0+
- {2363, nullptr, "Unknown2363"}, //20.0.0+
- {2364, nullptr, "Unknown2364"}, //20.0.0+
- {2365, nullptr, "Unknown2365"}, //20.0.0+
- {2366, nullptr, "Unknown2366"}, //20.0.0+
- {2367, nullptr, "Unknown2367"}, //20.0.0+
- {2368, nullptr, "Unknown2368"}, //20.0.0+
- {2369, nullptr, "Unknown2369"}, //21.0.0+
- {2400, nullptr, "GetPromotionInfo"},
- {2401, nullptr, "CountPromotionInfo"},
- {2402, nullptr, "ListPromotionInfo"},
- {2403, nullptr, "ImportPromotionJsonForDebug"},
- {2404, nullptr, "ClearPromotionInfoForDebug"},
- {2500, nullptr, "ConfirmAvailableTime"},
- {2510, nullptr, "CreateApplicationResource"},
- {2511, nullptr, "GetApplicationResource"},
- {2513, nullptr, "LaunchMicroApplication"},
- {2514, nullptr, "ClearTaskOfAsyncTaskManager"},
- {2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"},
- {2516, nullptr, "EnsureApplicationCertificate"},
- {2517, nullptr, "CreateApplicationInstance"},
- {2518, nullptr, "UpdateQualificationForDebug"},
- {2519, nullptr, "IsQualificationTransitionSupported"},
- {2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>, "IsQualificationTransitionSupportedByProcessId"},
- {2521, nullptr, "GetRightsUserChangedEvent"},
- {2522, nullptr, "IsRomRedirectionAvailable"},
- {2523, nullptr, "GetProgramId"}, //17.0.0+
- {2524, nullptr, "Unknown2524"}, //19.0.0+
- {2525, nullptr, "Unknown2525"}, //20.0.0+
- {2800, nullptr, "GetApplicationIdOfPreomia"},
- {3000, nullptr, "RegisterDeviceLockKey"},
- {3001, nullptr, "UnregisterDeviceLockKey"},
- {3002, nullptr, "VerifyDeviceLockKey"},
- {3003, nullptr, "HideApplicationIcon"},
- {3004, nullptr, "ShowApplicationIcon"},
- {3005, nullptr, "HideApplicationTitle"},
- {3006, nullptr, "ShowApplicationTitle"},
- {3007, nullptr, "EnableGameCard"},
- {3008, nullptr, "DisableGameCard"},
- {3009, nullptr, "EnableLocalContentShare"},
- {3010, nullptr, "DisableLocalContentShare"},
- {3011, nullptr, "IsApplicationIconHidden"},
- {3012, nullptr, "IsApplicationTitleHidden"},
- {3013, nullptr, "IsGameCardEnabled"},
- {3014, nullptr, "IsLocalContentShareEnabled"},
- {3050, nullptr, "ListAssignELicenseTaskResult"},
- {3104, nullptr, "GetApplicationNintendoLogo"}, //18.0.0+
- {3105, nullptr, "GetApplicationStartupMovie"}, //18.0.0+
- {4000, nullptr, "Unknown4000"}, //20.0.0+
- {4004, nullptr, "Unknown4004"}, //20.0.0+
- {4006, nullptr, "Unknown4006"}, //20.0.0+
- {4007, nullptr, "Unknown4007"}, //20.0.0+
- {4008, nullptr, "Unknown4008"}, //20.0.0+
- {4009, nullptr, "Unknown4009"}, //20.0.0+
- {4010, nullptr, "Unknown4010"}, //20.0.0+
- {4011, nullptr, "Unknown4011"}, //20.0.0+
- {4012, nullptr, "Unknown4012"}, //20.0.0+
- {4013, nullptr, "Unknown4013"}, //20.0.0+
- {4015, nullptr, "Unknown4015"}, //20.0.0+
- {4017, nullptr, "Unknown4017"}, //20.0.0+
- {4019, nullptr, "Unknown4019"}, //20.0.0+
- {4020, nullptr, "Unknown4020"}, //20.0.0+
- {4021, nullptr, "Unknown4021"}, //20.0.0+
- {4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022"}, //20.0.0+
- {4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023"}, //20.0.0+
- {4024, nullptr, "Unknown4024"}, //20.0.0+
- {4025, nullptr, "Unknown4025"}, //20.0.0+
- {4026, nullptr, "Unknown4026"}, //20.0.0+
- {4027, nullptr, "Unknown4027"}, //20.0.0+
- {4028, nullptr, "Unknown4028"}, //20.0.0+
- {4029, nullptr, "Unknown4029"}, //20.0.0+
- {4030, nullptr, "Unknown4030"}, //20.0.0+
- {4031, nullptr, "Unknown4031"}, //20.0.0+
- {4032, nullptr, "Unknown4032"}, //20.0.0+
- {4033, nullptr, "Unknown4033"}, //20.0.0+
- {4034, nullptr, "Unknown4034"}, //20.0.0+
- {4035, nullptr, "Unknown4035"}, //20.0.0+
- {4037, nullptr, "Unknown4037"}, //20.0.0+
- {4038, nullptr, "Unknown4038"}, //20.0.0+
- {4039, nullptr, "Unknown4039"}, //20.0.0+
- {4040, nullptr, "Unknown4040"}, //20.0.0+
- {4041, nullptr, "Unknown4041"}, //20.0.0+
- {4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042"}, //20.0.0+
- {4043, nullptr, "Unknown4043"}, //20.0.0+
- {4044, nullptr, "Unknown4044"}, //20.0.0+
- {4045, nullptr, "Unknown4045"}, //20.0.0+
- {4046, nullptr, "Unknown4046"}, //20.0.0+
- {4049, nullptr, "Unknown4049"}, //20.0.0+
- {4050, nullptr, "Unknown4050"}, //20.0.0+
- {4051, nullptr, "Unknown4051"}, //20.0.0+
- {4052, nullptr, "Unknown4052"}, //20.0.0+
- {4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053"}, //20.0.0+
- {4054, nullptr, "Unknown4054"}, //20.0.0+
- {4055, nullptr, "Unknown4055"}, //20.0.0+
- {4056, nullptr, "Unknown4056"}, //20.0.0+
- {4057, nullptr, "Unknown4057"}, //20.0.0+
- {4058, nullptr, "Unknown4058"}, //20.0.0+
- {4059, nullptr, "Unknown4059"}, //20.0.0+
- {4060, nullptr, "Unknown4060"}, //20.0.0+
- {4061, nullptr, "Unknown4061"}, //20.0.0+
- {4062, nullptr, "Unknown4062"}, //20.0.0+
- {4063, nullptr, "Unknown4063"}, //20.0.0+
- {4064, nullptr, "Unknown4064"}, //20.0.0+
- {4065, nullptr, "Unknown4065"}, //20.0.0+
- {4066, nullptr, "Unknown4066"}, //20.0.0+
- {4067, nullptr, "Unknown4067"}, //20.0.0+
- {4068, nullptr, "Unknown4068"}, //20.0.0+
- {4069, nullptr, "Unknown4069"}, //20.0.0+
- {4070, nullptr, "Unknown4070"}, //20.0.0+
- {4071, nullptr, "Unknown4071"}, //20.0.0+
- {4072, nullptr, "Unknown4072"}, //20.0.0+
- {4073, nullptr, "Unknown4073"}, //20.0.0+
- {4074, nullptr, "Unknown4074"}, //20.0.0+
- {4075, nullptr, "Unknown4075"}, //20.0.0+
- {4076, nullptr, "Unknown4076"}, //20.0.0+
- {4077, nullptr, "Unknown4077"}, //20.0.0+
- {4078, nullptr, "Unknown4078"}, //20.0.0+
- {4079, nullptr, "Unknown4079"}, //20.0.0+
- {4080, nullptr, "Unknown4080"}, //20.0.0+
- {4081, nullptr, "Unknown4081"}, //20.0.0+
- {4083, nullptr, "Unknown4083"}, //20.0.0+
- {4084, nullptr, "Unknown4084"}, //20.0.0+
- {4085, nullptr, "Unknown4085"}, //20.0.0+
- {4086, nullptr, "Unknown4086"}, //20.0.0+
- {4087, nullptr, "Unknown4087"}, //20.0.0+
- {4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088"}, //20.0.0+
- {4089, nullptr, "Unknown4089"}, //20.0.0+
- {4090, nullptr, "Unknown4090"}, //20.0.0+
- {4091, nullptr, "Unknown4091"}, //20.0.0+
- {4092, nullptr, "Unknown4092"}, //20.0.0+
- {4093, nullptr, "Unknown4093"}, //20.0.0+
- {4094, nullptr, "Unknown4094"}, //20.0.0+
- {4095, nullptr, "Unknown4095"}, //20.0.0+
- {4096, nullptr, "Unknown4096"}, //20.0.0+
- {4097, nullptr, "Unknown4097"}, //20.0.0+
- {4099, nullptr, "Unknown4099"}, //21.0.0+
- {4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105"}, //23.0.0+
- {5000, nullptr, "Unknown5000"}, //18.0.0+
- {5001, nullptr, "Unknown5001"}, //18.0.0+
- {9999, nullptr, "GetApplicationCertificate"}, //10.0.0-10.2.0
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IApplicationManagerInterface::~IApplicationManagerInterface() = default;
diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h
index c4ca66f319..592068823c 100644
--- a/src/core/hle/service/ns/application_manager_interface.h
+++ b/src/core/hle/service/ns/application_manager_interface.h
@@ -85,6 +85,7 @@ public:
void PushApplicationRecord(HLERequestContext& ctx);
void ListApplicationTitle(HLERequestContext& ctx);
void ListApplicationIcon(HLERequestContext& ctx);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
private:
KernelHelpers::ServiceContext service_context;
diff --git a/src/core/hle/service/ns/application_version_interface.cpp b/src/core/hle/service/ns/application_version_interface.cpp
index b89e127dbe..e1e747f6d2 100644
--- a/src/core/hle/service/ns/application_version_interface.cpp
+++ b/src/core/hle/service/ns/application_version_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,25 +10,6 @@ namespace Service::NS {
IApplicationVersionInterface::IApplicationVersionInterface(Core::System& system_)
: ServiceFramework{system_, "IApplicationVersionInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetLaunchRequiredVersion"},
- {1, nullptr, "UpgradeLaunchRequiredVersion"},
- {35, nullptr, "UpdateVersionList"},
- {36, nullptr, "PushLaunchVersion"},
- {37, nullptr, "ListRequiredVersion"},
- {800, nullptr, "RequestVersionList"},
- {801, nullptr, "ListVersionList"},
- {802, nullptr, "RequestVersionListData"},
- {900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"},
- {901, nullptr, "ListDefaultAutoUpdatePolicy"},
- {902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"},
- {1000, nullptr, "PerformAutoUpdate"},
- {1001, nullptr, "ListAutoUpdateSchedule"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IApplicationVersionInterface::~IApplicationVersionInterface() = default;
diff --git a/src/core/hle/service/ns/application_version_interface.h b/src/core/hle/service/ns/application_version_interface.h
index b288cff1be..c1f7710a00 100644
--- a/src/core/hle/service/ns/application_version_interface.h
+++ b/src/core/hle/service/ns/application_version_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -11,6 +14,25 @@ class IApplicationVersionInterface final : public ServiceFramework<IApplicationV
public:
explicit IApplicationVersionInterface(Core::System& system_);
~IApplicationVersionInterface() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetLaunchRequiredVersion"},
+ FunctionInfo{1, nullptr, "UpgradeLaunchRequiredVersion"},
+ FunctionInfo{35, nullptr, "UpdateVersionList"},
+ FunctionInfo{36, nullptr, "PushLaunchVersion"},
+ FunctionInfo{37, nullptr, "ListRequiredVersion"},
+ FunctionInfo{800, nullptr, "RequestVersionList"},
+ FunctionInfo{801, nullptr, "ListVersionList"},
+ FunctionInfo{802, nullptr, "RequestVersionListData"},
+ FunctionInfo{900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"},
+ FunctionInfo{901, nullptr, "ListDefaultAutoUpdatePolicy"},
+ FunctionInfo{902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"},
+ FunctionInfo{1000, nullptr, "PerformAutoUpdate"},
+ FunctionInfo{1001, nullptr, "ListAutoUpdateSchedule"}
+ );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/async_result.cpp b/src/core/hle/service/ns/async_result.cpp
index 8617280bef..d93c510141 100644
--- a/src/core/hle/service/ns/async_result.cpp
+++ b/src/core/hle/service/ns/async_result.cpp
@@ -8,17 +8,17 @@
namespace Service::NS {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IAsyncResult::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Get"},
+ FunctionInfo{1, D<&IAsyncResult::Cancel>, "Cancel"},
+ FunctionInfo{2, nullptr, "GetErrorContext", MakeVersionGate({4,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IAsyncResult::IAsyncResult(Core::System& system_, Service::Event* event_)
: ServiceFramework{system_, "nn::ns::detail::IAsyncResult"}, event{event_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Get"},
- {1, D<&IAsyncResult::Cancel>, "Cancel"},
- {2, nullptr, "GetErrorContext"}, // 4.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IAsyncResult::~IAsyncResult() = default;
diff --git a/src/core/hle/service/ns/async_result.h b/src/core/hle/service/ns/async_result.h
index 914ea5a42c..1cad75bf47 100644
--- a/src/core/hle/service/ns/async_result.h
+++ b/src/core/hle/service/ns/async_result.h
@@ -13,6 +13,7 @@ public:
private:
Result Cancel();
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Service::Event* event{};
};
diff --git a/src/core/hle/service/ns/content_management_interface.cpp b/src/core/hle/service/ns/content_management_interface.cpp
index 39b9cb6f70..45922ffab3 100644
--- a/src/core/hle/service/ns/content_management_interface.cpp
+++ b/src/core/hle/service/ns/content_management_interface.cpp
@@ -15,22 +15,6 @@ namespace Service::NS {
IContentManagementInterface::IContentManagementInterface(Core::System& system_)
: ServiceFramework{system_, "IContentManagementInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {11, D<&IContentManagementInterface::CalculateApplicationOccupiedSize>, "CalculateApplicationOccupiedSize"},
- {43, D<&IContentManagementInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
- {47, D<&IContentManagementInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"},
- {48, D<&IContentManagementInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
- {71, D<&IContentManagementInterface::GetUnknown71>, "Unknown71"},
- {600, nullptr, "CountApplicationContentMeta"},
- {601, nullptr, "ListApplicationContentMetaStatus"},
- {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
- {607, nullptr, "IsAnyApplicationRunning"},
- {608, nullptr, "Unknown608"}, //21.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IContentManagementInterface::~IContentManagementInterface() = default;
diff --git a/src/core/hle/service/ns/content_management_interface.h b/src/core/hle/service/ns/content_management_interface.h
index df0c51a184..bddd044b45 100644
--- a/src/core/hle/service/ns/content_management_interface.h
+++ b/src/core/hle/service/ns/content_management_interface.h
@@ -24,6 +24,22 @@ public:
Result GetTotalSpaceSize(Out<s64> out_total_space_size, FileSys::StorageId storage_id);
Result GetFreeSpaceSize(Out<s64> out_free_space_size, FileSys::StorageId storage_id);
Result GetUnknown71(Out<u64> out_value_a, Out<u64> out_value_b, u8 flag);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{11, D<&IContentManagementInterface::CalculateApplicationOccupiedSize>, "CalculateApplicationOccupiedSize"},
+ FunctionInfo{43, D<&IContentManagementInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
+ FunctionInfo{47, D<&IContentManagementInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"},
+ FunctionInfo{48, D<&IContentManagementInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
+ FunctionInfo{71, D<&IContentManagementInterface::GetUnknown71>, "Unknown71"},
+ FunctionInfo{600, nullptr, "CountApplicationContentMeta"},
+ FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"},
+ FunctionInfo{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
+ FunctionInfo{607, nullptr, "IsAnyApplicationRunning"},
+ FunctionInfo{608, nullptr, "Unknown608", MakeVersionGate({21,0,0})}
+ );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/develop_interface.cpp b/src/core/hle/service/ns/develop_interface.cpp
index 880bdbebbf..2fc41cd7dd 100644
--- a/src/core/hle/service/ns/develop_interface.cpp
+++ b/src/core/hle/service/ns/develop_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -6,31 +9,6 @@
namespace Service::NS {
IDevelopInterface::IDevelopInterface(Core::System& system_) : ServiceFramework{system_, "ns:dev"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "LaunchProgram"},
- {1, nullptr, "TerminateProcess"},
- {2, nullptr, "TerminateProgram"},
- {4, nullptr, "GetShellEvent"},
- {5, nullptr, "GetShellEventInfo"},
- {6, nullptr, "TerminateApplication"},
- {7, nullptr, "PrepareLaunchProgramFromHost"},
- {8, nullptr, "LaunchApplicationFromHost"},
- {9, nullptr, "LaunchApplicationWithStorageIdForDevelop"},
- {10, nullptr, "IsSystemMemoryResourceLimitBoosted"},
- {11, nullptr, "GetRunningApplicationProcessIdForDevelop"},
- {12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"},
- {13, nullptr, "CreateApplicationResourceForDevelop"},
- {14, nullptr, "IsPreomiaForDevelop"},
- {15, nullptr, "GetApplicationProgramIdFromHost"},
- {16, nullptr, "RefreshCachedDebugValues"},
- {17, nullptr, "PrepareLaunchApplicationFromHost"},
- {18, nullptr, "GetLaunchEvent"},
- {19, nullptr, "GetLaunchResult"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IDevelopInterface::~IDevelopInterface() = default;
diff --git a/src/core/hle/service/ns/develop_interface.h b/src/core/hle/service/ns/develop_interface.h
index a9f81ccd60..55e54fa38d 100644
--- a/src/core/hle/service/ns/develop_interface.h
+++ b/src/core/hle/service/ns/develop_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -11,6 +14,31 @@ class IDevelopInterface final : public ServiceFramework<IDevelopInterface> {
public:
explicit IDevelopInterface(Core::System& system_);
~IDevelopInterface() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "LaunchProgram"},
+ FunctionInfo{1, nullptr, "TerminateProcess"},
+ FunctionInfo{2, nullptr, "TerminateProgram"},
+ FunctionInfo{4, nullptr, "GetShellEvent"},
+ FunctionInfo{5, nullptr, "GetShellEventInfo"},
+ FunctionInfo{6, nullptr, "TerminateApplication"},
+ FunctionInfo{7, nullptr, "PrepareLaunchProgramFromHost"},
+ FunctionInfo{8, nullptr, "LaunchApplicationFromHost"},
+ FunctionInfo{9, nullptr, "LaunchApplicationWithStorageIdForDevelop"},
+ FunctionInfo{10, nullptr, "IsSystemMemoryResourceLimitBoosted"},
+ FunctionInfo{11, nullptr, "GetRunningApplicationProcessIdForDevelop"},
+ FunctionInfo{12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"},
+ FunctionInfo{13, nullptr, "CreateApplicationResourceForDevelop"},
+ FunctionInfo{14, nullptr, "IsPreomiaForDevelop"},
+ FunctionInfo{15, nullptr, "GetApplicationProgramIdFromHost"},
+ FunctionInfo{16, nullptr, "RefreshCachedDebugValues"},
+ FunctionInfo{17, nullptr, "PrepareLaunchApplicationFromHost"},
+ FunctionInfo{18, nullptr, "GetLaunchEvent"},
+ FunctionInfo{19, nullptr, "GetLaunchResult"}
+ );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/document_interface.cpp b/src/core/hle/service/ns/document_interface.cpp
index 51a1e46c0d..f9a1e2267a 100644
--- a/src/core/hle/service/ns/document_interface.cpp
+++ b/src/core/hle/service/ns/document_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -9,15 +12,6 @@ namespace Service::NS {
IDocumentInterface::IDocumentInterface(Core::System& system_)
: ServiceFramework{system_, "IDocumentInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {21, nullptr, "GetApplicationContentPath"},
- {23, D<&IDocumentInterface::ResolveApplicationContentPath>, "ResolveApplicationContentPath"},
- {92, D<&IDocumentInterface::GetRunningApplicationProgramId>, "GetRunningApplicationProgramId"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IDocumentInterface::~IDocumentInterface() = default;
diff --git a/src/core/hle/service/ns/document_interface.h b/src/core/hle/service/ns/document_interface.h
index cd461652cf..43a194c3e6 100644
--- a/src/core/hle/service/ns/document_interface.h
+++ b/src/core/hle/service/ns/document_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -17,6 +20,15 @@ public:
private:
Result ResolveApplicationContentPath(ContentPath content_path);
Result GetRunningApplicationProgramId(Out<u64> out_program_id, u64 caller_program_id);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{21, nullptr, "GetApplicationContentPath"},
+ FunctionInfo{23, D<&IDocumentInterface::ResolveApplicationContentPath>, "ResolveApplicationContentPath"},
+ FunctionInfo{92, D<&IDocumentInterface::GetRunningApplicationProgramId>, "GetRunningApplicationProgramId"}
+ );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/download_task_interface.cpp b/src/core/hle/service/ns/download_task_interface.cpp
index 62dc7f1874..9fe6ca512f 100644
--- a/src/core/hle/service/ns/download_task_interface.cpp
+++ b/src/core/hle/service/ns/download_task_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,21 +11,6 @@ namespace Service::NS {
IDownloadTaskInterface::IDownloadTaskInterface(Core::System& system_)
: ServiceFramework{system_, "IDownloadTaskInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {701, nullptr, "ClearTaskStatusList"},
- {702, nullptr, "RequestDownloadTaskList"},
- {703, nullptr, "RequestEnsureDownloadTask"},
- {704, nullptr, "ListDownloadTaskStatus"},
- {705, nullptr, "RequestDownloadTaskListData"},
- {706, nullptr, "TryCommitCurrentApplicationDownloadTask"},
- {707, D<&IDownloadTaskInterface::EnableAutoCommit>, "EnableAutoCommit"},
- {708, D<&IDownloadTaskInterface::DisableAutoCommit>, "DisableAutoCommit"},
- {709, nullptr, "TriggerDynamicCommitEvent"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IDownloadTaskInterface::~IDownloadTaskInterface() = default;
diff --git a/src/core/hle/service/ns/download_task_interface.h b/src/core/hle/service/ns/download_task_interface.h
index b1cb69cb86..0fd2bacd42 100644
--- a/src/core/hle/service/ns/download_task_interface.h
+++ b/src/core/hle/service/ns/download_task_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,21 @@ public:
private:
Result EnableAutoCommit();
Result DisableAutoCommit();
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{701, nullptr, "ClearTaskStatusList"},
+ FunctionInfo{702, nullptr, "RequestDownloadTaskList"},
+ FunctionInfo{703, nullptr, "RequestEnsureDownloadTask"},
+ FunctionInfo{704, nullptr, "ListDownloadTaskStatus"},
+ FunctionInfo{705, nullptr, "RequestDownloadTaskListData"},
+ FunctionInfo{706, nullptr, "TryCommitCurrentApplicationDownloadTask"},
+ FunctionInfo{707, D<&IDownloadTaskInterface::EnableAutoCommit>, "EnableAutoCommit"},
+ FunctionInfo{708, D<&IDownloadTaskInterface::DisableAutoCommit>, "DisableAutoCommit"},
+ FunctionInfo{709, nullptr, "TriggerDynamicCommitEvent"}
+ );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/dynamic_rights_interface.cpp b/src/core/hle/service/ns/dynamic_rights_interface.cpp
index 0301085670..951ef4c4b2 100644
--- a/src/core/hle/service/ns/dynamic_rights_interface.cpp
+++ b/src/core/hle/service/ns/dynamic_rights_interface.cpp
@@ -9,43 +9,43 @@
namespace Service::NS {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IDynamicRightsInterface::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestApplicationRightsOnServer"},
+ FunctionInfo{1, nullptr, "RequestAssignRights"},
+ FunctionInfo{4, nullptr, "DeprecatedRequestAssignRightsToResume"},
+ FunctionInfo{5, D<&IDynamicRightsInterface::VerifyActivatedRightsOwners>, "VerifyActivatedRightsOwners"},
+ FunctionInfo{6, nullptr, "DeprecatedGetApplicationRightsStatus"},
+ FunctionInfo{7, nullptr, "RequestPrefetchForDynamicRights"},
+ FunctionInfo{8, nullptr, "GetDynamicRightsState"},
+ FunctionInfo{9, nullptr, "RequestApplicationRightsOnServerToResume"},
+ FunctionInfo{10, nullptr, "RequestAssignRightsToResume"},
+ FunctionInfo{11, nullptr, "GetActivatedRightsUsers"},
+ FunctionInfo{12, nullptr, "GetApplicationRightsStatus"},
+ FunctionInfo{13, D<&IDynamicRightsInterface::GetRunningApplicationStatus>, "GetRunningApplicationStatus"},
+ FunctionInfo{14, nullptr, "SelectApplicationLicense"},
+ FunctionInfo{15, nullptr, "RequestContentsAuthorizationToken"},
+ FunctionInfo{16, nullptr, "QualifyUser"},
+ FunctionInfo{17, nullptr, "QualifyUserWithProcessId"},
+ FunctionInfo{18, D<&IDynamicRightsInterface::NotifyApplicationRightsCheckStart>, "NotifyApplicationRightsCheckStart"},
+ FunctionInfo{19, nullptr, "UpdateUserList"},
+ FunctionInfo{20, nullptr, "IsRightsLostUser"},
+ FunctionInfo{21, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
+ FunctionInfo{22, nullptr, "GetLimitedApplicationLicense"},
+ FunctionInfo{23, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
+ FunctionInfo{24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"},
+ FunctionInfo{25, nullptr, "RequestProceedDynamicRightsState"},
+ FunctionInfo{26, D<&IDynamicRightsInterface::HasAccountRestrictedRightsInRunningApplications>, "HasAccountRestrictedRightsInRunningApplications"},
+ FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,0,0})},
+ FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})},
+ FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})},
+ FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({21,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IDynamicRightsInterface::IDynamicRightsInterface(Core::System& system_)
: ServiceFramework{system_, "DynamicRightsInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestApplicationRightsOnServer"},
- {1, nullptr, "RequestAssignRights"},
- {4, nullptr, "DeprecatedRequestAssignRightsToResume"},
- {5, D<&IDynamicRightsInterface::VerifyActivatedRightsOwners>, "VerifyActivatedRightsOwners"},
- {6, nullptr, "DeprecatedGetApplicationRightsStatus"},
- {7, nullptr, "RequestPrefetchForDynamicRights"},
- {8, nullptr, "GetDynamicRightsState"},
- {9, nullptr, "RequestApplicationRightsOnServerToResume"},
- {10, nullptr, "RequestAssignRightsToResume"},
- {11, nullptr, "GetActivatedRightsUsers"},
- {12, nullptr, "GetApplicationRightsStatus"},
- {13, D<&IDynamicRightsInterface::GetRunningApplicationStatus>, "GetRunningApplicationStatus"},
- {14, nullptr, "SelectApplicationLicense"},
- {15, nullptr, "RequestContentsAuthorizationToken"},
- {16, nullptr, "QualifyUser"},
- {17, nullptr, "QualifyUserWithProcessId"},
- {18, D<&IDynamicRightsInterface::NotifyApplicationRightsCheckStart>, "NotifyApplicationRightsCheckStart"},
- {19, nullptr, "UpdateUserList"},
- {20, nullptr, "IsRightsLostUser"},
- {21, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"},
- {22, nullptr, "GetLimitedApplicationLicense"},
- {23, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"},
- {24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"},
- {25, nullptr, "RequestProceedDynamicRightsState"},
- {26, D<&IDynamicRightsInterface::HasAccountRestrictedRightsInRunningApplications>, "HasAccountRestrictedRightsInRunningApplications"},
- {27, nullptr, "Unknown27"}, //20.0.0+
- {28, nullptr, "Unknown28"}, //20.0.0+
- {29, nullptr, "Unknown29"}, //21.0.0+
- {30, nullptr, "Unknown30"}, //21.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IDynamicRightsInterface::~IDynamicRightsInterface() = default;
diff --git a/src/core/hle/service/ns/dynamic_rights_interface.h b/src/core/hle/service/ns/dynamic_rights_interface.h
index c3270aee05..e8a1d81491 100644
--- a/src/core/hle/service/ns/dynamic_rights_interface.h
+++ b/src/core/hle/service/ns/dynamic_rights_interface.h
@@ -21,6 +21,8 @@ private:
Result GetRunningApplicationStatus(Out<u32> out_status, u64 rights_handle);
Result VerifyActivatedRightsOwners(u64 rights_handle);
Result HasAccountRestrictedRightsInRunningApplications(Out<bool> out_is_restricted);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/ecommerce_interface.cpp b/src/core/hle/service/ns/ecommerce_interface.cpp
index 76fc425f0c..5687d09a02 100644
--- a/src/core/hle/service/ns/ecommerce_interface.cpp
+++ b/src/core/hle/service/ns/ecommerce_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,19 +10,6 @@ namespace Service::NS {
IECommerceInterface::IECommerceInterface(Core::System& system_)
: ServiceFramework{system_, "IECommerceInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RequestLinkDevice"},
- {1, nullptr, "RequestCleanupAllPreInstalledApplications"},
- {2, nullptr, "RequestCleanupPreInstalledApplication"},
- {3, nullptr, "RequestSyncRights"},
- {4, nullptr, "RequestUnlinkDevice"},
- {5, nullptr, "RequestRevokeAllELicense"},
- {6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IECommerceInterface::~IECommerceInterface() = default;
diff --git a/src/core/hle/service/ns/ecommerce_interface.h b/src/core/hle/service/ns/ecommerce_interface.h
index 4352101f4a..d020ff5ef8 100644
--- a/src/core/hle/service/ns/ecommerce_interface.h
+++ b/src/core/hle/service/ns/ecommerce_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -11,6 +14,19 @@ class IECommerceInterface final : public ServiceFramework<IECommerceInterface> {
public:
explicit IECommerceInterface(Core::System& system_);
~IECommerceInterface() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RequestLinkDevice"},
+ FunctionInfo{1, nullptr, "RequestCleanupAllPreInstalledApplications"},
+ FunctionInfo{2, nullptr, "RequestCleanupPreInstalledApplication"},
+ FunctionInfo{3, nullptr, "RequestSyncRights"},
+ FunctionInfo{4, nullptr, "RequestUnlinkDevice"},
+ FunctionInfo{5, nullptr, "RequestRevokeAllELicense"},
+ FunctionInfo{6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"}
+ );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/factory_reset_interface.cpp b/src/core/hle/service/ns/factory_reset_interface.cpp
index fd5cf7e1fd..1fc6edcc9b 100644
--- a/src/core/hle/service/ns/factory_reset_interface.cpp
+++ b/src/core/hle/service/ns/factory_reset_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -5,21 +8,21 @@
namespace Service::NS {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IFactoryResetInterface::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{100, nullptr, "ResetToFactorySettings"},
+ FunctionInfo{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
+ FunctionInfo{102, nullptr, "ResetToFactorySettingsForRefurbishment"},
+ FunctionInfo{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
+ FunctionInfo{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
+ FunctionInfo{105, nullptr, "RequestResetToFactorySettingsSecurely"},
+ FunctionInfo{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IFactoryResetInterface::IFactoryResetInterface(Core::System& system_)
: ServiceFramework{system_, "IFactoryResetInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {100, nullptr, "ResetToFactorySettings"},
- {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
- {102, nullptr, "ResetToFactorySettingsForRefurbishment"},
- {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
- {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
- {105, nullptr, "RequestResetToFactorySettingsSecurely"},
- {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IFactoryResetInterface::~IFactoryResetInterface() = default;
diff --git a/src/core/hle/service/ns/factory_reset_interface.h b/src/core/hle/service/ns/factory_reset_interface.h
index 50d1251239..3d5700fb71 100644
--- a/src/core/hle/service/ns/factory_reset_interface.h
+++ b/src/core/hle/service/ns/factory_reset_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -11,6 +14,7 @@ class IFactoryResetInterface final : public ServiceFramework<IFactoryResetInterf
public:
explicit IFactoryResetInterface(Core::System& system_);
~IFactoryResetInterface() override;
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp
index fe057422ce..ff1654517b 100644
--- a/src/core/hle/service/ns/ns.cpp
+++ b/src/core/hle/service/ns/ns.cpp
@@ -19,25 +19,25 @@ namespace Service::NS {
class INotifyService final : public ServiceFramework<INotifyService> {
public:
- explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- { 0, nullptr, "NotifyAppletEvent" },
- { 2, nullptr, "NotifyOperationModeChangeEvent" },
- { 3, nullptr, "NotifyPowerStateChangeEvent" },
- { 4, nullptr, "NotifyClearAllEvent" },
- { 5, nullptr, "NotifyEventForDebug" },
- { 6, nullptr, "SuspendUserAccountEventService" },
- { 7, nullptr, "ResumeUserAccountEventService" },
- { 8, nullptr, "NotifyLibraryAppletEvent" },
- { 9, nullptr, "Cmd9" },
- { 20, nullptr, "Cmd20" },
- { 30, nullptr, "Cmd30" },
- { 100, nullptr, "Cmd100" },
- { 101, nullptr, "Cmd101" },
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "NotifyAppletEvent" },
+ FunctionInfo{2, nullptr, "NotifyOperationModeChangeEvent" },
+ FunctionInfo{3, nullptr, "NotifyPowerStateChangeEvent" },
+ FunctionInfo{4, nullptr, "NotifyClearAllEvent" },
+ FunctionInfo{5, nullptr, "NotifyEventForDebug" },
+ FunctionInfo{6, nullptr, "SuspendUserAccountEventService" },
+ FunctionInfo{7, nullptr, "ResumeUserAccountEventService" },
+ FunctionInfo{8, nullptr, "NotifyLibraryAppletEvent" },
+ FunctionInfo{9, nullptr, "Cmd9" },
+ FunctionInfo{20, nullptr, "Cmd20" },
+ FunctionInfo{30, nullptr, "Cmd30" },
+ FunctionInfo{100, nullptr, "Cmd100" },
+ FunctionInfo{101, nullptr, "Cmd101" }
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
@@ -45,18 +45,10 @@ class IVulnerabilityManagerInterface final
: public ServiceFramework<IVulnerabilityManagerInterface> {
public:
explicit IVulnerabilityManagerInterface(Core::System& system_)
- : ServiceFramework{system_, "ns:vm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"},
- {1201, nullptr, "UpdateSafeSystemVersionForDebug"},
- {1202, nullptr, "GetSafeSystemVersion"},
- {3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"},
- {3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"},
- {3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "ns:vm"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
~IVulnerabilityManagerInterface() override = default;
@@ -76,6 +68,15 @@ public:
LOG_WARNING(Service_NS, "(STUBBED)");
R_SUCCEED();
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"},
+ FunctionInfo{1201, nullptr, "UpdateSafeSystemVersionForDebug"},
+ FunctionInfo{1202, nullptr, "GetSafeSystemVersion"},
+ FunctionInfo{3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"},
+ FunctionInfo{3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"},
+ FunctionInfo{3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/ns/platform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp
index bf93a2edfa..dea6cb5c16 100644
--- a/src/core/hle/service/ns/platform_service_manager.cpp
+++ b/src/core/hle/service/ns/platform_service_manager.cpp
@@ -27,6 +27,28 @@
namespace Service::NS {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IPlatformServiceManager::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IPlatformServiceManager::RequestLoad>, "RequestLoad"},
+ FunctionInfo{1, D<&IPlatformServiceManager::GetLoadState>, "GetLoadState"},
+ FunctionInfo{2, D<&IPlatformServiceManager::GetSize>, "GetSize"},
+ FunctionInfo{3, D<&IPlatformServiceManager::GetSharedMemoryAddressOffset>, "GetSharedMemoryAddressOffset"},
+ FunctionInfo{4, D<&IPlatformServiceManager::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
+ FunctionInfo{5, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriority"},
+ FunctionInfo{6, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriorityForSystem"},
+ FunctionInfo{100, nullptr, "RequestApplicationFunctionAuthorization"},
+ FunctionInfo{101, nullptr, "RequestApplicationFunctionAuthorizationByProcessId"},
+ FunctionInfo{102, nullptr, "RequestApplicationFunctionAuthorizationByApplicationId"},
+ FunctionInfo{103, nullptr, "RefreshApplicationFunctionBlackListDebugRecord"},
+ FunctionInfo{104, nullptr, "RequestApplicationFunctionAuthorizationByProgramId"},
+ FunctionInfo{105, nullptr, "GetFunctionBlackListSystemVersionToAuthorize"},
+ FunctionInfo{106, nullptr, "GetFunctionBlackListVersion"},
+ FunctionInfo{1000, nullptr, "LoadNgWordDataForPlatformRegionChina"},
+ FunctionInfo{1001, nullptr, "GetNgWordDataSizeForPlatformRegionChina"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
struct FontRegion {
u32 offset;
u32 size;
@@ -89,28 +111,6 @@ struct IPlatformServiceManager::Impl {
IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const char* service_name_)
: ServiceFramework{system_, service_name_}, impl{std::make_unique<Impl>()} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IPlatformServiceManager::RequestLoad>, "RequestLoad"},
- {1, D<&IPlatformServiceManager::GetLoadState>, "GetLoadState"},
- {2, D<&IPlatformServiceManager::GetSize>, "GetSize"},
- {3, D<&IPlatformServiceManager::GetSharedMemoryAddressOffset>, "GetSharedMemoryAddressOffset"},
- {4, D<&IPlatformServiceManager::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
- {5, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriority"},
- {6, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriorityForSystem"},
- {100, nullptr, "RequestApplicationFunctionAuthorization"},
- {101, nullptr, "RequestApplicationFunctionAuthorizationByProcessId"},
- {102, nullptr, "RequestApplicationFunctionAuthorizationByApplicationId"},
- {103, nullptr, "RefreshApplicationFunctionBlackListDebugRecord"},
- {104, nullptr, "RequestApplicationFunctionAuthorizationByProgramId"},
- {105, nullptr, "GetFunctionBlackListSystemVersionToAuthorize"},
- {106, nullptr, "GetFunctionBlackListVersion"},
- {1000, nullptr, "LoadNgWordDataForPlatformRegionChina"},
- {1001, nullptr, "GetNgWordDataSizeForPlatformRegionChina"},
- };
- // clang-format on
- RegisterHandlers(functions);
-
auto& fsc = system.GetFileSystemController();
// Attempt to load shared font data from disk
diff --git a/src/core/hle/service/ns/platform_service_manager.h b/src/core/hle/service/ns/platform_service_manager.h
index b82c385a6c..fb99a441f5 100644
--- a/src/core/hle/service/ns/platform_service_manager.h
+++ b/src/core/hle/service/ns/platform_service_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -65,11 +68,12 @@ private:
Result GetSharedMemoryNativeHandle(
OutCopyHandle<Kernel::KSharedMemory> out_shared_memory_native_handle);
Result GetSharedFontInOrderOfPriority(OutArray<u32, BufferAttr_HipcMapAlias> out_font_codes,
- OutArray<u32, BufferAttr_HipcMapAlias> out_font_offsets,
- OutArray<u32, BufferAttr_HipcMapAlias> out_font_sizes,
- Out<bool> out_fonts_are_loaded, Out<u32> out_font_count,
- Set::LanguageCode language_code);
+ OutArray<u32, BufferAttr_HipcMapAlias> out_font_offsets,
+ OutArray<u32, BufferAttr_HipcMapAlias> out_font_sizes,
+ Out<bool> out_fonts_are_loaded, Out<u32> out_font_count,
+ Set::LanguageCode language_code);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
struct Impl;
std::unique_ptr<Impl> impl;
};
diff --git a/src/core/hle/service/ns/query_service.cpp b/src/core/hle/service/ns/query_service.cpp
index d22de1d169..13a1f33866 100644
--- a/src/core/hle/service/ns/query_service.cpp
+++ b/src/core/hle/service/ns/query_service.cpp
@@ -14,40 +14,40 @@
namespace Service::NS {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IQueryService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "QueryAppletEvent"},
+ FunctionInfo{1, nullptr, "QueryPlayStatistics"},
+ FunctionInfo{2, nullptr, "QueryPlayStatisticsByUserAccountId"},
+ FunctionInfo{3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"},
+ FunctionInfo{4, nullptr, "QueryPlayStatisticsByApplicationId"},
+ FunctionInfo{5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"},
+ FunctionInfo{6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"},
+ FunctionInfo{7, nullptr, "QueryLastPlayTimeV0"},
+ FunctionInfo{8, nullptr, "QueryPlayEvent"},
+ FunctionInfo{9, nullptr, "GetAvailablePlayEventRange"},
+ FunctionInfo{10, nullptr, "QueryAccountEvent"},
+ FunctionInfo{11, nullptr, "QueryAccountPlayEvent"},
+ FunctionInfo{12, nullptr, "GetAvailableAccountPlayEventRange"},
+ FunctionInfo{13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"},
+ FunctionInfo{14, nullptr, "QueryRecentlyPlayedApplication"},
+ FunctionInfo{15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"},
+ FunctionInfo{16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"},
+ FunctionInfo{17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"},
+ FunctionInfo{18, D<&IQueryService::QueryApplicationPlayStatisticsForSystem>, "QueryApplicationPlayStatisticsForSystem"},
+ FunctionInfo{19, D<&IQueryService::QueryApplicationPlayStatisticsByUserAccountIdForSystem>, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
+ FunctionInfo{30, nullptr, "Cmd30" },
+ FunctionInfo{31, nullptr, "Cmd31" },
+ FunctionInfo{100, nullptr, "Cmd100" },
+ FunctionInfo{110, nullptr, "Cmd110" },
+ FunctionInfo{118, nullptr, "Cmd118" },
+ FunctionInfo{119, nullptr, "Cmd119" }
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IQueryService::IQueryService(Core::System& system_) : ServiceFramework{system_, "pdm:qry"},
play_time_manager{std::make_unique<PlayTime::PlayTimeManager>()} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "QueryAppletEvent"},
- {1, nullptr, "QueryPlayStatistics"},
- {2, nullptr, "QueryPlayStatisticsByUserAccountId"},
- {3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"},
- {4, nullptr, "QueryPlayStatisticsByApplicationId"},
- {5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"},
- {6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"},
- {7, nullptr, "QueryLastPlayTimeV0"},
- {8, nullptr, "QueryPlayEvent"},
- {9, nullptr, "GetAvailablePlayEventRange"},
- {10, nullptr, "QueryAccountEvent"},
- {11, nullptr, "QueryAccountPlayEvent"},
- {12, nullptr, "GetAvailableAccountPlayEventRange"},
- {13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"},
- {14, nullptr, "QueryRecentlyPlayedApplication"},
- {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"},
- {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"},
- {17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"},
- {18, D<&IQueryService::QueryApplicationPlayStatisticsForSystem>, "QueryApplicationPlayStatisticsForSystem"},
- {19, D<&IQueryService::QueryApplicationPlayStatisticsByUserAccountIdForSystem>, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
- { 30, nullptr, "Cmd30" },
- { 31, nullptr, "Cmd31" },
- { 100, nullptr, "Cmd100" },
- { 110, nullptr, "Cmd110" },
- { 118, nullptr, "Cmd118" },
- { 119, nullptr, "Cmd119" },
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IQueryService::~IQueryService() = default;
diff --git a/src/core/hle/service/ns/query_service.h b/src/core/hle/service/ns/query_service.h
index f5c0ae1058..08267d3165 100644
--- a/src/core/hle/service/ns/query_service.h
+++ b/src/core/hle/service/ns/query_service.h
@@ -62,6 +62,7 @@ private:
OutArray<ApplicationPlayStatistics, BufferAttr_HipcMapAlias> out_stats,
InArray<u64, BufferAttr_HipcMapAlias> application_ids);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
std::unique_ptr<PlayTime::PlayTimeManager> play_time_manager;
};
diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp
index 1359cdbb95..c6cd822d24 100644
--- a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp
+++ b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp
@@ -73,6 +73,21 @@ void SanitizeJPEGImageSize(std::vector<u8>& image) {
} // namespace
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IReadOnlyApplicationControlDataInterface::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData>, "GetApplicationControlData"},
+ FunctionInfo{1, D<&IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
+ FunctionInfo{2, D<&IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
+ FunctionInfo{3, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
+ FunctionInfo{4, nullptr, "SelectApplicationDesiredLanguage"},
+ FunctionInfo{5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"},
+ FunctionInfo{10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"},
+ FunctionInfo{13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"},
+ FunctionInfo{19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"},
+ FunctionInfo{23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData", MakeVersionGate({23,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
// IAsyncValue implementation for ListApplicationTitle
// https://switchbrew.org/wiki/NS_services#ListApplicationTitle
@@ -84,13 +99,6 @@ public:
, data_offset{offset}
, data_size{size}
{
- static const FunctionInfo functions[] = {
- {0, D<&IAsyncValue::GetSize>, "GetSize"},
- {1, D<&IAsyncValue::Get>, "Get"},
- {2, D<&IAsyncValue::Cancel>, "Cancel"},
- {3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"},
- };
- RegisterHandlers(functions);
completion_event = service_context.CreateEvent("IAsyncValue:Completion");
completion_event->GetReadableEvent().Signal(system.Kernel());
}
@@ -122,6 +130,16 @@ private:
LOG_DEBUG(Service_NS, "called");
R_SUCCEED();
}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IAsyncValue::GetSize>, "GetSize"},
+ FunctionInfo{1, D<&IAsyncValue::Get>, "Get"},
+ FunctionInfo{2, D<&IAsyncValue::Cancel>, "Cancel"},
+ FunctionInfo{3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"}
+ );
KernelHelpers::ServiceContext service_context;
Kernel::KEvent* completion_event{};
s32 data_offset;
@@ -131,22 +149,6 @@ private:
IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterface(
Core::System& system_)
: ServiceFramework{system_, "IReadOnlyApplicationControlDataInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData>, "GetApplicationControlData"},
- {1, D<&IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
- {2, D<&IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
- {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
- {4, nullptr, "SelectApplicationDesiredLanguage"},
- {5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"},
- {10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"},
- {13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"},
- {19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"},
- {23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, //23.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IReadOnlyApplicationControlDataInterface::~IReadOnlyApplicationControlDataInterface() = default;
diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.h b/src/core/hle/service/ns/read_only_application_control_data_interface.h
index a4a285151a..3f68029583 100644
--- a/src/core/hle/service/ns/read_only_application_control_data_interface.h
+++ b/src/core/hle/service/ns/read_only_application_control_data_interface.h
@@ -45,6 +45,8 @@ public:
u8 flag1,
u8 flag2,
u64 application_id);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/read_only_application_record_interface.cpp b/src/core/hle/service/ns/read_only_application_record_interface.cpp
index 8ce7851ae2..7a7cf9ec58 100644
--- a/src/core/hle/service/ns/read_only_application_record_interface.cpp
+++ b/src/core/hle/service/ns/read_only_application_record_interface.cpp
@@ -11,17 +11,18 @@
namespace Service::NS {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IReadOnlyApplicationRecordInterface::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"},
+ FunctionInfo{1, nullptr, "NotifyApplicationFailure"},
+ FunctionInfo{2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"},
+ FunctionInfo{3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IReadOnlyApplicationRecordInterface::IReadOnlyApplicationRecordInterface(Core::System& system_)
: ServiceFramework{system_, "IReadOnlyApplicationRecordInterface"} {
- static const FunctionInfo functions[] = {
- {0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"},
- {1, nullptr, "NotifyApplicationFailure"},
- {2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"},
- {3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IReadOnlyApplicationRecordInterface::~IReadOnlyApplicationRecordInterface() = default;
diff --git a/src/core/hle/service/ns/read_only_application_record_interface.h b/src/core/hle/service/ns/read_only_application_record_interface.h
index fc43c768ba..308e753e7d 100644
--- a/src/core/hle/service/ns/read_only_application_record_interface.h
+++ b/src/core/hle/service/ns/read_only_application_record_interface.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -24,6 +24,8 @@ private:
Result ListApplicationRecord(
OutArray<ApplicationRecord, BufferAttr_HipcMapAlias> out_records, Out<s32> out_count,
s32 entry_offset);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/service_getter_interface.cpp b/src/core/hle/service/ns/service_getter_interface.cpp
index 1a3dd7166c..bbf30da3da 100644
--- a/src/core/hle/service/ns/service_getter_interface.cpp
+++ b/src/core/hle/service/ns/service_getter_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -17,25 +20,25 @@
namespace Service::NS {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IServiceGetterInterface::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{7988, D<&IServiceGetterInterface::GetDynamicRightsInterface>, "GetDynamicRightsInterface"},
+ FunctionInfo{7989, D<&IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"},
+ FunctionInfo{7991, D<&IServiceGetterInterface::GetReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"},
+ FunctionInfo{7992, D<&IServiceGetterInterface::GetECommerceInterface>, "GetECommerceInterface"},
+ FunctionInfo{7993, D<&IServiceGetterInterface::GetApplicationVersionInterface>, "GetApplicationVersionInterface"},
+ FunctionInfo{7994, D<&IServiceGetterInterface::GetFactoryResetInterface>, "GetFactoryResetInterface"},
+ FunctionInfo{7995, D<&IServiceGetterInterface::GetAccountProxyInterface>, "GetAccountProxyInterface"},
+ FunctionInfo{7996, D<&IServiceGetterInterface::GetApplicationManagerInterface>, "GetApplicationManagerInterface"},
+ FunctionInfo{7997, D<&IServiceGetterInterface::GetDownloadTaskInterface>, "GetDownloadTaskInterface"},
+ FunctionInfo{7998, D<&IServiceGetterInterface::GetContentManagementInterface>, "GetContentManagementInterface"},
+ FunctionInfo{7999, D<&IServiceGetterInterface::GetDocumentInterface>, "GetDocumentInterface"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IServiceGetterInterface::IServiceGetterInterface(Core::System& system_, const char* name)
: ServiceFramework{system_, name} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {7988, D<&IServiceGetterInterface::GetDynamicRightsInterface>, "GetDynamicRightsInterface"},
- {7989, D<&IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"},
- {7991, D<&IServiceGetterInterface::GetReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"},
- {7992, D<&IServiceGetterInterface::GetECommerceInterface>, "GetECommerceInterface"},
- {7993, D<&IServiceGetterInterface::GetApplicationVersionInterface>, "GetApplicationVersionInterface"},
- {7994, D<&IServiceGetterInterface::GetFactoryResetInterface>, "GetFactoryResetInterface"},
- {7995, D<&IServiceGetterInterface::GetAccountProxyInterface>, "GetAccountProxyInterface"},
- {7996, D<&IServiceGetterInterface::GetApplicationManagerInterface>, "GetApplicationManagerInterface"},
- {7997, D<&IServiceGetterInterface::GetDownloadTaskInterface>, "GetDownloadTaskInterface"},
- {7998, D<&IServiceGetterInterface::GetContentManagementInterface>, "GetContentManagementInterface"},
- {7999, D<&IServiceGetterInterface::GetDocumentInterface>, "GetDocumentInterface"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IServiceGetterInterface::~IServiceGetterInterface() = default;
diff --git a/src/core/hle/service/ns/service_getter_interface.h b/src/core/hle/service/ns/service_getter_interface.h
index bbc18d4445..8c33aafc27 100644
--- a/src/core/hle/service/ns/service_getter_interface.h
+++ b/src/core/hle/service/ns/service_getter_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -42,6 +45,8 @@ public:
Result GetContentManagementInterface(
Out<SharedPointer<IContentManagementInterface>> out_interface);
Result GetDocumentInterface(Out<SharedPointer<IDocumentInterface>> out_interface);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/system_update_control.cpp b/src/core/hle/service/ns/system_update_control.cpp
index f5f5cfd909..3d1911c852 100644
--- a/src/core/hle/service/ns/system_update_control.cpp
+++ b/src/core/hle/service/ns/system_update_control.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,35 +11,6 @@ namespace Service::NS {
ISystemUpdateControl::ISystemUpdateControl(Core::System& system_)
: ServiceFramework{system_, "ISystemUpdateControl"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "HasDownloaded"},
- {1, nullptr, "RequestCheckLatestUpdate"},
- {2, nullptr, "RequestDownloadLatestUpdate"},
- {3, nullptr, "GetDownloadProgress"},
- {4, nullptr, "ApplyDownloadedUpdate"},
- {5, nullptr, "RequestPrepareCardUpdate"},
- {6, nullptr, "GetPrepareCardUpdateProgress"},
- {7, nullptr, "HasPreparedCardUpdate"},
- {8, nullptr, "ApplyCardUpdate"},
- {9, nullptr, "GetDownloadedEulaDataSize"},
- {10, nullptr, "GetDownloadedEulaData"},
- {11, nullptr, "SetupCardUpdate"},
- {12, nullptr, "GetPreparedCardUpdateEulaDataSize"},
- {13, nullptr, "GetPreparedCardUpdateEulaData"},
- {14, nullptr, "SetupCardUpdateViaSystemUpdater"},
- {15, nullptr, "HasReceived"},
- {16, nullptr, "RequestReceiveSystemUpdate"},
- {17, nullptr, "GetReceiveProgress"},
- {18, nullptr, "ApplyReceivedUpdate"},
- {19, nullptr, "GetReceivedEulaDataSize"},
- {20, nullptr, "GetReceivedEulaData"},
- {21, nullptr, "SetupToReceiveSystemUpdate"},
- {22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ISystemUpdateControl::~ISystemUpdateControl() = default;
diff --git a/src/core/hle/service/ns/system_update_control.h b/src/core/hle/service/ns/system_update_control.h
index a30a090000..acdf048e6c 100644
--- a/src/core/hle/service/ns/system_update_control.h
+++ b/src/core/hle/service/ns/system_update_control.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -11,6 +14,35 @@ class ISystemUpdateControl final : public ServiceFramework<ISystemUpdateControl>
public:
explicit ISystemUpdateControl(Core::System& system_);
~ISystemUpdateControl() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "HasDownloaded"},
+ FunctionInfo{1, nullptr, "RequestCheckLatestUpdate"},
+ FunctionInfo{2, nullptr, "RequestDownloadLatestUpdate"},
+ FunctionInfo{3, nullptr, "GetDownloadProgress"},
+ FunctionInfo{4, nullptr, "ApplyDownloadedUpdate"},
+ FunctionInfo{5, nullptr, "RequestPrepareCardUpdate"},
+ FunctionInfo{6, nullptr, "GetPrepareCardUpdateProgress"},
+ FunctionInfo{7, nullptr, "HasPreparedCardUpdate"},
+ FunctionInfo{8, nullptr, "ApplyCardUpdate"},
+ FunctionInfo{9, nullptr, "GetDownloadedEulaDataSize"},
+ FunctionInfo{10, nullptr, "GetDownloadedEulaData"},
+ FunctionInfo{11, nullptr, "SetupCardUpdate"},
+ FunctionInfo{12, nullptr, "GetPreparedCardUpdateEulaDataSize"},
+ FunctionInfo{13, nullptr, "GetPreparedCardUpdateEulaData"},
+ FunctionInfo{14, nullptr, "SetupCardUpdateViaSystemUpdater"},
+ FunctionInfo{15, nullptr, "HasReceived"},
+ FunctionInfo{16, nullptr, "RequestReceiveSystemUpdate"},
+ FunctionInfo{17, nullptr, "GetReceiveProgress"},
+ FunctionInfo{18, nullptr, "ApplyReceivedUpdate"},
+ FunctionInfo{19, nullptr, "GetReceivedEulaDataSize"},
+ FunctionInfo{20, nullptr, "GetReceivedEulaData"},
+ FunctionInfo{21, nullptr, "SetupToReceiveSystemUpdate"},
+ FunctionInfo{22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"}
+ );
};
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/system_update_interface.cpp b/src/core/hle/service/ns/system_update_interface.cpp
index 7e22ca3db0..044d39835f 100644
--- a/src/core/hle/service/ns/system_update_interface.cpp
+++ b/src/core/hle/service/ns/system_update_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,32 +10,32 @@
namespace Service::NS {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemUpdateInterface::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"},
+ FunctionInfo{1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"},
+ FunctionInfo{2, nullptr, "NotifyExFatDriverRequired"},
+ FunctionInfo{3, nullptr, "ClearExFatDriverStatusForDebug"},
+ FunctionInfo{4, nullptr, "RequestBackgroundNetworkUpdate"},
+ FunctionInfo{5, nullptr, "NotifyBackgroundNetworkUpdate"},
+ FunctionInfo{6, nullptr, "NotifyExFatDriverDownloadedForDebug"},
+ FunctionInfo{9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"},
+ FunctionInfo{10, nullptr, "NotifySystemUpdateForContentDelivery"},
+ FunctionInfo{11, nullptr, "PrepareShutdown"},
+ FunctionInfo{12, nullptr, "Unknown12"},
+ FunctionInfo{13, nullptr, "Unknown13"},
+ FunctionInfo{14, nullptr, "Unknown14"},
+ FunctionInfo{15, nullptr, "Unknown15"},
+ FunctionInfo{16, nullptr, "DestroySystemUpdateTask"},
+ FunctionInfo{17, nullptr, "RequestSendSystemUpdate"},
+ FunctionInfo{18, nullptr, "GetSendSystemUpdateProgress"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
ISystemUpdateInterface::ISystemUpdateInterface(Core::System& system_)
: ServiceFramework{system_, "ns:su"}, service_context{system_, "ns:su"},
update_notification_event{service_context} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"},
- {1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"},
- {2, nullptr, "NotifyExFatDriverRequired"},
- {3, nullptr, "ClearExFatDriverStatusForDebug"},
- {4, nullptr, "RequestBackgroundNetworkUpdate"},
- {5, nullptr, "NotifyBackgroundNetworkUpdate"},
- {6, nullptr, "NotifyExFatDriverDownloadedForDebug"},
- {9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"},
- {10, nullptr, "NotifySystemUpdateForContentDelivery"},
- {11, nullptr, "PrepareShutdown"},
- {12, nullptr, "Unknown12"},
- {13, nullptr, "Unknown13"},
- {14, nullptr, "Unknown14"},
- {15, nullptr, "Unknown15"},
- {16, nullptr, "DestroySystemUpdateTask"},
- {17, nullptr, "RequestSendSystemUpdate"},
- {18, nullptr, "GetSendSystemUpdateProgress"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ISystemUpdateInterface::~ISystemUpdateInterface() = default;
diff --git a/src/core/hle/service/ns/system_update_interface.h b/src/core/hle/service/ns/system_update_interface.h
index 36a2880ec9..2ea14f4f5e 100644
--- a/src/core/hle/service/ns/system_update_interface.h
+++ b/src/core/hle/service/ns/system_update_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -30,7 +33,7 @@ private:
Result GetSystemUpdateNotificationEventForContentDelivery(
OutCopyHandle<Kernel::KReadableEvent> out_event);
-private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
KernelHelpers::ServiceContext service_context;
Event update_notification_event;
};
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp
index b252a2efa5..81d8a3a63b 100644
--- a/src/core/hle/service/nvdrv/nvdrv.cpp
+++ b/src/core/hle/service/nvdrv/nvdrv.cpp
@@ -50,55 +50,61 @@ class NVGEM_C final : public ServiceFramework<NVGEM_C> {
public:
explicit NVGEM_C(Core::System& system_)
: ServiceFramework{system_, "nvgem:c"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {1, nullptr, "GetEventHandle"},
- {2, nullptr, "ControlNotification"},
- {3, nullptr, "SetNotificationPerm"},
- {4, nullptr, "SetCoreDumpPerm"},
- {5, nullptr, "GetAruid"},
- {6, nullptr, "Reset"},
- {7, nullptr, "GetAruid2"},
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{1, nullptr, "GetEventHandle"},
+ FunctionInfo{2, nullptr, "ControlNotification"},
+ FunctionInfo{3, nullptr, "SetNotificationPerm"},
+ FunctionInfo{4, nullptr, "SetCoreDumpPerm"},
+ FunctionInfo{5, nullptr, "GetAruid"},
+ FunctionInfo{6, nullptr, "Reset"},
+ FunctionInfo{7, nullptr, "GetAruid2"}
+ );
};
class NVGEM_CD final : public ServiceFramework<NVGEM_CD> {
public:
explicit NVGEM_CD(Core::System& system_)
: ServiceFramework{system_, "nvgem:cd"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {1, nullptr, "GetAruid"},
- {2, nullptr, "ReadNextBlock"},
- {3, nullptr, "GetNextBlockSize"},
- {4, nullptr, "ReadNextBlock2"},
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{1, nullptr, "GetAruid"},
+ FunctionInfo{2, nullptr, "ReadNextBlock"},
+ FunctionInfo{3, nullptr, "GetNextBlockSize"},
+ FunctionInfo{4, nullptr, "ReadNextBlock2"}
+ );
};
class NVDBG_D final : public ServiceFramework<NVDBG_D> {
public:
explicit NVDBG_D(Core::System& system_)
: ServiceFramework{system_, "nvdbg:d"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "Open"},
- {1, nullptr, "Ioctl"},
- {2, nullptr, "Close"},
- {4, nullptr, "QueryEvent"},
- {9, nullptr, "DumpStatus"},
- {10, nullptr, "InitializeDevtools"},
- {11, nullptr, "Ioctl2"},
- {12, nullptr, "Ioctl3"},
- {13, nullptr, "SetConfiguration"},
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Open"},
+ FunctionInfo{1, nullptr, "Ioctl"},
+ FunctionInfo{2, nullptr, "Close"},
+ FunctionInfo{4, nullptr, "QueryEvent"},
+ FunctionInfo{9, nullptr, "DumpStatus"},
+ FunctionInfo{10, nullptr, "InitializeDevtools"},
+ FunctionInfo{11, nullptr, "Ioctl2"},
+ FunctionInfo{12, nullptr, "Ioctl3"},
+ FunctionInfo{13, nullptr, "SetConfiguration"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.cpp b/src/core/hle/service/nvdrv/nvdrv_interface.cpp
index 5fae68adbb..db3dbd9f8e 100644
--- a/src/core/hle/service/nvdrv/nvdrv_interface.cpp
+++ b/src/core/hle/service/nvdrv/nvdrv_interface.cpp
@@ -245,24 +245,6 @@ void NVDRV::DumpGraphicsMemoryInfo(HLERequestContext& ctx) {
NVDRV::NVDRV(Core::System& system_, std::shared_ptr<Module> nvdrv_, const char* name)
: ServiceFramework{system_, name}, nvdrv{std::move(nvdrv_)} {
- static const FunctionInfo functions[] = {
- {0, &NVDRV::Open, "Open"},
- {1, &NVDRV::Ioctl1, "Ioctl"},
- {2, &NVDRV::Close, "Close"},
- {3, &NVDRV::Initialize, "Initialize"},
- {4, &NVDRV::QueryEvent, "QueryEvent"},
- {5, nullptr, "MapSharedMem"},
- {6, &NVDRV::GetStatus, "GetStatus"},
- {7, nullptr, "SetAruidForTest"},
- {8, &NVDRV::SetAruid, "SetAruid"},
- {9, &NVDRV::DumpGraphicsMemoryInfo, "DumpGraphicsMemoryInfo"},
- {10, nullptr, "InitializeDevtools"},
- {11, &NVDRV::Ioctl2, "Ioctl2"},
- {12, &NVDRV::Ioctl3, "Ioctl3"},
- {13, &NVDRV::SetGraphicsFirmwareMemoryMarginEnabled,
- "SetGraphicsFirmwareMemoryMarginEnabled"},
- };
- RegisterHandlers(functions);
}
NVDRV::~NVDRV() {
diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.h b/src/core/hle/service/nvdrv/nvdrv_interface.h
index c72f925979..b9b574398a 100644
--- a/src/core/hle/service/nvdrv/nvdrv_interface.h
+++ b/src/core/hle/service/nvdrv/nvdrv_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -35,8 +38,27 @@ private:
void ServiceError(HLERequestContext& ctx, NvResult result);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &NVDRV::Open, "Open"},
+ FunctionInfo{1, &NVDRV::Ioctl1, "Ioctl"},
+ FunctionInfo{2, &NVDRV::Close, "Close"},
+ FunctionInfo{3, &NVDRV::Initialize, "Initialize"},
+ FunctionInfo{4, &NVDRV::QueryEvent, "QueryEvent"},
+ FunctionInfo{5, nullptr, "MapSharedMem"},
+ FunctionInfo{6, &NVDRV::GetStatus, "GetStatus"},
+ FunctionInfo{7, nullptr, "SetAruidForTest"},
+ FunctionInfo{8, &NVDRV::SetAruid, "SetAruid"},
+ FunctionInfo{9, &NVDRV::DumpGraphicsMemoryInfo, "DumpGraphicsMemoryInfo"},
+ FunctionInfo{10, nullptr, "InitializeDevtools"},
+ FunctionInfo{11, &NVDRV::Ioctl2, "Ioctl2"},
+ FunctionInfo{12, &NVDRV::Ioctl3, "Ioctl3"},
+ FunctionInfo{13, &NVDRV::SetGraphicsFirmwareMemoryMarginEnabled,
+ "SetGraphicsFirmwareMemoryMarginEnabled"}
+ );
std::shared_ptr<Module> nvdrv;
-
u64 pid{};
bool is_initialized{};
NvCore::SessionId session_id{};
diff --git a/src/core/hle/service/nvdrv/nvmemp.cpp b/src/core/hle/service/nvdrv/nvmemp.cpp
index a5477faf1a..8e2e4dfacb 100644
--- a/src/core/hle/service/nvdrv/nvmemp.cpp
+++ b/src/core/hle/service/nvdrv/nvmemp.cpp
@@ -11,11 +11,6 @@
namespace Service::Nvidia {
NVMEMP::NVMEMP(Core::System& system_) : ServiceFramework{system_, "nvmemp"} {
- static const FunctionInfo functions[] = {
- {0, &NVMEMP::Open, "Open"},
- {1, &NVMEMP::GetAruid, "GetAruid"},
- };
- RegisterHandlers(functions);
}
NVMEMP::~NVMEMP() = default;
diff --git a/src/core/hle/service/nvdrv/nvmemp.h b/src/core/hle/service/nvdrv/nvmemp.h
index 85e3053a8d..e98b07c494 100644
--- a/src/core/hle/service/nvdrv/nvmemp.h
+++ b/src/core/hle/service/nvdrv/nvmemp.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -19,6 +22,14 @@ public:
private:
void Open(HLERequestContext& ctx);
void GetAruid(HLERequestContext& ctx);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &NVMEMP::Open, "Open"},
+ FunctionInfo{1, &NVMEMP::GetAruid, "GetAruid"}
+ );
};
} // namespace Service::Nvidia
diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp
index d30aa3717d..c9023374c4 100644
--- a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp
+++ b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,18 +11,21 @@
namespace Service::Nvnflinger {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IHOSBinderDriver::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IHOSBinderDriver::TransactParcel>, "TransactParcel"},
+ FunctionInfo{1, C<&IHOSBinderDriver::AdjustRefcount>, "AdjustRefcount"},
+ FunctionInfo{2, C<&IHOSBinderDriver::GetNativeHandle>, "GetNativeHandle"},
+ FunctionInfo{3, C<&IHOSBinderDriver::TransactParcelAuto>, "TransactParcelAuto"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IHOSBinderDriver::IHOSBinderDriver(Core::System& system_,
std::shared_ptr<HosBinderDriverServer> server,
std::shared_ptr<SurfaceFlinger> surface_flinger)
: ServiceFramework{system_, "IHOSBinderDriver"}, m_server(server),
m_surface_flinger(surface_flinger) {
- static const FunctionInfo functions[] = {
- {0, C<&IHOSBinderDriver::TransactParcel>, "TransactParcel"},
- {1, C<&IHOSBinderDriver::AdjustRefcount>, "AdjustRefcount"},
- {2, C<&IHOSBinderDriver::GetNativeHandle>, "GetNativeHandle"},
- {3, C<&IHOSBinderDriver::TransactParcelAuto>, "TransactParcelAuto"},
- };
- RegisterHandlers(functions);
}
IHOSBinderDriver::~IHOSBinderDriver() = default;
diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.h b/src/core/hle/service/nvnflinger/hos_binder_driver.h
index 6b551c91d2..7d44046115 100644
--- a/src/core/hle/service/nvnflinger/hos_binder_driver.h
+++ b/src/core/hle/service/nvnflinger/hos_binder_driver.h
@@ -44,6 +44,7 @@ private:
OutBuffer<BufferAttr_HipcAutoSelect> parcel_reply, u32 flags);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<HosBinderDriverServer> m_server;
const std::shared_ptr<SurfaceFlinger> m_surface_flinger;
};
diff --git a/src/core/hle/service/olsc/daemon_controller.cpp b/src/core/hle/service/olsc/daemon_controller.cpp
index c449c6ff31..f25888170c 100644
--- a/src/core/hle/service/olsc/daemon_controller.cpp
+++ b/src/core/hle/service/olsc/daemon_controller.cpp
@@ -9,27 +9,25 @@
namespace Service::OLSC {
-IDaemonController::IDaemonController(Core::System& system_)
- : ServiceFramework{system_, "IDaemonController"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IDaemonController::GetApplicationAutoTransferSetting>, "GetApplicationAutoTransferSetting"},
- {1, D<&IDaemonController::SetApplicationAutoTransferSetting>, "SetApplicationAutoTransferSetting"},
- {2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"},
- {3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"},
- {4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"},
- {5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting"}, // 11.0.0+
- {6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting"}, // 11.0.0+
- {10, nullptr, "CreateForbiddenSaveDataInidication"},
- {11, D<&IDaemonController::StopAutonomyTaskExecution>, "StopAutonomyTaskExecution"},
- {12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"},
- {13, nullptr, "Unknown13_20_0_0_Plus"}, // 20.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IDaemonController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IDaemonController::GetApplicationAutoTransferSetting>, "GetApplicationAutoTransferSetting"},
+ FunctionInfo{1, D<&IDaemonController::SetApplicationAutoTransferSetting>, "SetApplicationAutoTransferSetting"},
+ FunctionInfo{2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"},
+ FunctionInfo{3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"},
+ FunctionInfo{4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"},
+ FunctionInfo{5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})},
+ FunctionInfo{6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})},
+ FunctionInfo{10, nullptr, "CreateForbiddenSaveDataInidication"},
+ FunctionInfo{11, D<&IDaemonController::StopAutonomyTaskExecution>, "StopAutonomyTaskExecution"},
+ FunctionInfo{12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"},
+ FunctionInfo{13, nullptr, "Unknown13_20_0_0_Plus", MakeVersionGate({20,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
}
+IDaemonController::IDaemonController(Core::System& system_) : ServiceFramework{system_, "IDaemonController"} {}
+
IDaemonController::~IDaemonController() = default;
Result IDaemonController::GetApplicationAutoTransferSetting(Out<bool> out_is_enabled,
diff --git a/src/core/hle/service/olsc/daemon_controller.h b/src/core/hle/service/olsc/daemon_controller.h
index 70f3d9e235..b90d3ee778 100644
--- a/src/core/hle/service/olsc/daemon_controller.h
+++ b/src/core/hle/service/olsc/daemon_controller.h
@@ -38,6 +38,8 @@ private:
Result GetAutonomyTaskStatus(Out<u8> out_status, Common::UUID user_id);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
// Internal in-memory state to back the above APIs
struct AppKey {
Common::UUID user_id;
diff --git a/src/core/hle/service/olsc/native_handle_holder.cpp b/src/core/hle/service/olsc/native_handle_holder.cpp
index 1e50195539..1f6f8419fc 100644
--- a/src/core/hle/service/olsc/native_handle_holder.cpp
+++ b/src/core/hle/service/olsc/native_handle_holder.cpp
@@ -12,16 +12,16 @@
namespace Service::OLSC {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> INativeHandleHolder::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&INativeHandleHolder::GetNativeHandle>, "GetNativeHandle"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
INativeHandleHolder::INativeHandleHolder(Core::System& system_)
: ServiceFramework{system_, "INativeHandleHolder"}, service_context{system_, "OLSC"} {
event = service_context.CreateEvent("OLSC::INativeHandleHolder");
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&INativeHandleHolder::GetNativeHandle>, "GetNativeHandle"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
INativeHandleHolder::~INativeHandleHolder() {
diff --git a/src/core/hle/service/olsc/native_handle_holder.h b/src/core/hle/service/olsc/native_handle_holder.h
index e0eac50c28..0ab51c7ca0 100644
--- a/src/core/hle/service/olsc/native_handle_holder.h
+++ b/src/core/hle/service/olsc/native_handle_holder.h
@@ -25,6 +25,7 @@ public:
private:
Result GetNativeHandle(OutCopyHandle<Kernel::KReadableEvent> out_event);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
Service::KernelHelpers::ServiceContext service_context;
Kernel::KEvent* event{};
diff --git a/src/core/hle/service/olsc/olsc.cpp b/src/core/hle/service/olsc/olsc.cpp
index a86c525f9a..03b8a696f5 100644
--- a/src/core/hle/service/olsc/olsc.cpp
+++ b/src/core/hle/service/olsc/olsc.cpp
@@ -6,22 +6,179 @@
#include "core/hle/service/olsc/olsc.h"
#include "core/hle/service/olsc/olsc_service_for_application.h"
-#include "core/hle/service/olsc/olsc_service_for_system_service.h"
+#include "core/hle/service/olsc/native_handle_holder.h"
+#include "core/hle/service/olsc/stopper_object.h"
+#include "core/hle/service/olsc/daemon_controller.h"
+#include "core/hle/service/olsc/transfer_task_list_controller.h"
+#include "core/hle/service/olsc/remote_storage_controller.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h"
+#include "core/hle/service/cmif_serialization.h"
namespace Service::OLSC {
class ISProfileBgAgentForSystemProcess final : public ServiceFramework<ISProfileBgAgentForSystemProcess> {
public:
- explicit ISProfileBgAgentForSystemProcess(Core::System& system_)
- : ServiceFramework{system_, "spbg:sp"}
- {
- static const FunctionInfo functions[] = {
- { 100, nullptr, "OpenBgAgentController" },
- };
- RegisterHandlers(functions);
+ explicit ISProfileBgAgentForSystemProcess(Core::System& system_) : ServiceFramework{system_, "spbg:sp"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{100, nullptr, "OpenBgAgentController" }
+ );
+};
+
+class IDaemonController;
+class IRemoteStorageController;
+class ITransferTaskListController;
+
+struct DataTransferPolicy {
+ u8 upload_policy;
+ u8 download_policy;
+};
+
+struct TransferTaskErrorInfo {
+ Common::UUID uid;
+ u64 application_id;
+ u8 unknown_0x18;
+ std::array<u8, 7> reserved_0x19;
+ u64 unknown_0x20;
+ u32 error_code;
+ u32 reserved_0x2C;
+};
+static_assert(sizeof(TransferTaskErrorInfo) == 0x30, "TransferTaskErrorInfo has incorrect size.");
+
+class IOlscServiceForSystemService final : public ServiceFramework<IOlscServiceForSystemService> {
+public:
+ explicit IOlscServiceForSystemService(Core::System& system_)
+ : ServiceFramework{system_, "olsc:s"} {
+ }
+
+ ~IOlscServiceForSystemService() override = default;
+
+ Result GetTransferTaskListController(
+ Out<SharedPointer<ITransferTaskListController>> out_interface) {
+ LOG_INFO(Service_OLSC, "called");
+ *out_interface = std::make_shared<ITransferTaskListController>(system);
+ R_SUCCEED();
+ }
+
+ Result GetRemoteStorageController(
+ Out<SharedPointer<IRemoteStorageController>> out_interface) {
+ LOG_INFO(Service_OLSC, "called");
+ *out_interface = std::make_shared<IRemoteStorageController>(system);
+ R_SUCCEED();
+ }
+
+ Result GetDaemonController(
+ Out<SharedPointer<IDaemonController>> out_interface) {
+ LOG_INFO(Service_OLSC, "called");
+ *out_interface = std::make_shared<IDaemonController>(system);
+ R_SUCCEED();
+ }
+
+ Result GetDataTransferPolicy(
+ Out<DataTransferPolicy> out_policy, u64 application_id) {
+ LOG_WARNING(Service_OLSC, "(STUBBED) called");
+ DataTransferPolicy policy{};
+ policy.upload_policy = 0;
+ policy.download_policy = 0;
+ *out_policy = policy;
+ R_SUCCEED();
+ }
+
+ Result GetTransferTaskErrorInfo(Out<TransferTaskErrorInfo> out_info,
+ Common::UUID uuid, u64 application_id) {
+ LOG_WARNING(Service_OLSC, "(STUBBED) called, uuid={} application_id={:016X}",
+ uuid.FormattedString(), application_id);
+
+ TransferTaskErrorInfo info{};
+ info.uid = uuid;
+ info.application_id = application_id;
+ info.unknown_0x18 = 0;
+ info.reserved_0x19.fill(0);
+ info.unknown_0x20 = 0;
+ info.error_code = 0;
+ info.reserved_0x2C = 0;
+
+ *out_info = info;
+ R_SUCCEED();
+ }
+
+ Result GetOlscServiceForSystemService(
+ Out<SharedPointer<IOlscServiceForSystemService>> out_interface) {
+ LOG_INFO(Service_OLSC, "called");
+ *out_interface = std::static_pointer_cast<IOlscServiceForSystemService>(shared_from_this());
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IOlscServiceForSystemService::GetTransferTaskListController>, "GetTransferTaskListController"},
+ FunctionInfo{1, D<&IOlscServiceForSystemService::GetRemoteStorageController>, "GetRemoteStorageController"},
+ FunctionInfo{2, D<&IOlscServiceForSystemService::GetDaemonController>, "GetDaemonController"},
+ FunctionInfo{10, nullptr, "PrepareDeleteUserProperty"},
+ FunctionInfo{11, nullptr, "DeleteUserSaveDataProperty"},
+ FunctionInfo{12, nullptr, "InvalidateMountCache"},
+ FunctionInfo{13, nullptr, "DeleteDeviceSaveDataProperty"},
+ FunctionInfo{100, nullptr, "ListLastTransferTaskErrorInfo"},
+ FunctionInfo{101, nullptr, "GetLastErrorInfoCount"},
+ FunctionInfo{102, nullptr, "RemoveLastErrorInfoOld"},
+ FunctionInfo{103, nullptr, "GetLastErrorInfo"},
+ FunctionInfo{104, nullptr, "GetLastErrorEventHolder"},
+ FunctionInfo{105, D<&IOlscServiceForSystemService::GetTransferTaskErrorInfo>, "GetTransferTaskErrorInfo"},
+ FunctionInfo{200, D<&IOlscServiceForSystemService::GetDataTransferPolicy>, "GetDataTransferPolicy"},
+ FunctionInfo{201, nullptr, "DeleteDataTransferPolicyCache"},
+ FunctionInfo{202, nullptr, "Unknown202"},
+ FunctionInfo{203, nullptr, "RequestUpdateDataTransferPolicyCacheAsync"},
+ FunctionInfo{204, nullptr, "ClearDataTransferPolicyCache"},
+ FunctionInfo{205, nullptr, "RequestGetDataTransferPolicyAsync"},
+ FunctionInfo{206, nullptr, "Unknown206", MakeVersionGate({21,0,0})},
+ FunctionInfo{300, nullptr, "GetUserSaveDataProperty"},
+ FunctionInfo{301, nullptr, "SetUserSaveDataProperty"},
+ FunctionInfo{302, nullptr, "Unknown302", MakeVersionGate({21,0,0})},
+ FunctionInfo{400, nullptr, "CleanupSaveDataBackupContextForSpecificApplications"},
+ FunctionInfo{900, nullptr, "DeleteAllTransferTask"},
+ FunctionInfo{902, nullptr, "DeleteAllSeriesInfo"},
+ FunctionInfo{903, nullptr, "DeleteAllSdaInfoCache"},
+ FunctionInfo{904, nullptr, "DeleteAllApplicationSetting"},
+ FunctionInfo{905, nullptr, "DeleteAllTransferTaskErrorInfo"},
+ FunctionInfo{906, nullptr, "RegisterTransferTaskErrorInfo"},
+ FunctionInfo{907, nullptr, "AddSaveDataArchiveInfoCache"},
+ FunctionInfo{908, nullptr, "DeleteSeriesInfo"},
+ FunctionInfo{909, nullptr, "GetSeriesInfo"},
+ FunctionInfo{910, nullptr, "RemoveTransferTaskErrorInfo"},
+ FunctionInfo{911, nullptr, "DeleteAllSeriesInfoForSaveDataBackup"},
+ FunctionInfo{912, nullptr, "DeleteSeriesInfoForSaveDataBackup"},
+ FunctionInfo{913, nullptr, "GetSeriesInfoForSaveDataBackup"},
+ FunctionInfo{914, nullptr, "Unknown914", MakeVersionGate({20,2,0})},
+ FunctionInfo{1000, nullptr, "UpdateIssueOld"},
+ FunctionInfo{1010, nullptr, "Unknown1010"},
+ FunctionInfo{1011, nullptr, "Unknown1011"},
+ FunctionInfo{1012, nullptr, "Unknown1012"},
+ FunctionInfo{1013, nullptr, "Unkown1013"},
+ FunctionInfo{1014, nullptr, "Unknown1014"},
+ FunctionInfo{1020, nullptr, "Unknown1020"},
+ FunctionInfo{1021, nullptr, "Unknown1021"},
+ FunctionInfo{1022, nullptr, "Unknown1022"},
+ FunctionInfo{1023, nullptr, "Unknown1023"},
+ FunctionInfo{1024, nullptr, "Unknown1024"},
+ FunctionInfo{1100, nullptr, "RepairUpdateIssueInfoCacheAync"},
+ FunctionInfo{1110, nullptr, "RepairGetIssueInfo"},
+ FunctionInfo{1111, nullptr, "RepairListIssueInfo"},
+ FunctionInfo{1112, nullptr, "RepairListOperationPermissionInfo"},
+ FunctionInfo{1113, nullptr, "RepairListDataInfoForRepairedSaveDataDownload"},
+ FunctionInfo{1114, nullptr, "RepairListDataInfoForOriginalSaveDataDownload"},
+ FunctionInfo{1120, nullptr, "RepairUploadSaveDataAsync"},
+ FunctionInfo{1121, nullptr, "RepairUploadSaveDataAsync1"},
+ FunctionInfo{1122, nullptr, "RepairDownloadRepairedSaveDataAsync"},
+ FunctionInfo{1123, nullptr, "RepairDownloadOriginalSaveDataAsync"},
+ FunctionInfo{1124, nullptr, "RepairGetOperationProgressInfo"},
+ FunctionInfo{10000, D<&IOlscServiceForSystemService::GetOlscServiceForSystemService>, "GetOlscServiceForSystemService"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/olsc/olsc_service_for_application.cpp b/src/core/hle/service/olsc/olsc_service_for_application.cpp
index 01360f5ef2..8d6b20d7ff 100644
--- a/src/core/hle/service/olsc/olsc_service_for_application.cpp
+++ b/src/core/hle/service/olsc/olsc_service_for_application.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -6,36 +9,36 @@
namespace Service::OLSC {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IOlscServiceForApplication::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IOlscServiceForApplication::Initialize>, "Initialize"},
+ FunctionInfo{10, nullptr, "VerifySaveDataBackupLicenseAsync"},
+ FunctionInfo{13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"},
+ FunctionInfo{14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"},
+ FunctionInfo{15, nullptr, "SetCustomData"},
+ FunctionInfo{16, nullptr, "DeleteSaveDataBackupSetting"},
+ FunctionInfo{18, nullptr, "GetSaveDataBackupInfoCache"},
+ FunctionInfo{19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"},
+ FunctionInfo{22, nullptr, "DeleteSaveDataBackupAsync"},
+ FunctionInfo{25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"},
+ FunctionInfo{26, nullptr, "DownloadSaveDataBackupAsync"},
+ FunctionInfo{27, nullptr, "UploadSaveDataBackupAsync"},
+ FunctionInfo{9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"},
+ FunctionInfo{9013, nullptr, "GetSaveDataBackupSettingForDebug"},
+ FunctionInfo{9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"},
+ FunctionInfo{9015, nullptr, "SetCustomDataForDebug"},
+ FunctionInfo{9016, nullptr, "DeleteSaveDataBackupSettingForDebug"},
+ FunctionInfo{9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"},
+ FunctionInfo{9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"},
+ FunctionInfo{9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"},
+ FunctionInfo{9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"},
+ FunctionInfo{9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IOlscServiceForApplication::IOlscServiceForApplication(Core::System& system_)
: ServiceFramework{system_, "olsc:u"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IOlscServiceForApplication::Initialize>, "Initialize"},
- {10, nullptr, "VerifySaveDataBackupLicenseAsync"},
- {13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"},
- {14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"},
- {15, nullptr, "SetCustomData"},
- {16, nullptr, "DeleteSaveDataBackupSetting"},
- {18, nullptr, "GetSaveDataBackupInfoCache"},
- {19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"},
- {22, nullptr, "DeleteSaveDataBackupAsync"},
- {25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"},
- {26, nullptr, "DownloadSaveDataBackupAsync"},
- {27, nullptr, "UploadSaveDataBackupAsync"},
- {9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"},
- {9013, nullptr, "GetSaveDataBackupSettingForDebug"},
- {9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"},
- {9015, nullptr, "SetCustomDataForDebug"},
- {9016, nullptr, "DeleteSaveDataBackupSettingForDebug"},
- {9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"},
- {9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"},
- {9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"},
- {9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"},
- {9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IOlscServiceForApplication::~IOlscServiceForApplication() = default;
diff --git a/src/core/hle/service/olsc/olsc_service_for_application.h b/src/core/hle/service/olsc/olsc_service_for_application.h
index 8941659478..0d92f9ba78 100644
--- a/src/core/hle/service/olsc/olsc_service_for_application.h
+++ b/src/core/hle/service/olsc/olsc_service_for_application.h
@@ -22,6 +22,8 @@ private:
Result GetSaveDataBackupSetting(Out<u8> out_save_data_backup_setting);
Result SetSaveDataBackupSettingEnabled(bool enabled, NS::Uid account_id);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
bool initialized{};
};
diff --git a/src/core/hle/service/olsc/olsc_service_for_system_service.cpp b/src/core/hle/service/olsc/olsc_service_for_system_service.cpp
deleted file mode 100644
index 245bbd5c6b..0000000000
--- a/src/core/hle/service/olsc/olsc_service_for_system_service.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/olsc/daemon_controller.h"
-#include "core/hle/service/olsc/olsc_service_for_system_service.h"
-#include "core/hle/service/olsc/remote_storage_controller.h"
-#include "core/hle/service/olsc/transfer_task_list_controller.h"
-
-namespace Service::OLSC {
-
-IOlscServiceForSystemService::IOlscServiceForSystemService(Core::System& system_)
- : ServiceFramework{system_, "olsc:s"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IOlscServiceForSystemService::GetTransferTaskListController>, "GetTransferTaskListController"},
- {1, D<&IOlscServiceForSystemService::GetRemoteStorageController>, "GetRemoteStorageController"},
- {2, D<&IOlscServiceForSystemService::GetDaemonController>, "GetDaemonController"},
- {10, nullptr, "PrepareDeleteUserProperty"},
- {11, nullptr, "DeleteUserSaveDataProperty"},
- {12, nullptr, "InvalidateMountCache"},
- {13, nullptr, "DeleteDeviceSaveDataProperty"},
- {100, nullptr, "ListLastTransferTaskErrorInfo"},
- {101, nullptr, "GetLastErrorInfoCount"},
- {102, nullptr, "RemoveLastErrorInfoOld"},
- {103, nullptr, "GetLastErrorInfo"},
- {104, nullptr, "GetLastErrorEventHolder"},
- {105, D<&IOlscServiceForSystemService::GetTransferTaskErrorInfo>, "GetTransferTaskErrorInfo"},
- {200, D<&IOlscServiceForSystemService::GetDataTransferPolicy>, "GetDataTransferPolicy"},
- {201, nullptr, "DeleteDataTransferPolicyCache"},
- {202, nullptr, "Unknown202"},
- {203, nullptr, "RequestUpdateDataTransferPolicyCacheAsync"},
- {204, nullptr, "ClearDataTransferPolicyCache"},
- {205, nullptr, "RequestGetDataTransferPolicyAsync"},
- {206, nullptr, "Unknown206"}, //21.0.0+
- {300, nullptr, "GetUserSaveDataProperty"},
- {301, nullptr, "SetUserSaveDataProperty"},
- {302, nullptr, "Unknown302"}, //21.0.0+
- {400, nullptr, "CleanupSaveDataBackupContextForSpecificApplications"},
- {900, nullptr, "DeleteAllTransferTask"},
- {902, nullptr, "DeleteAllSeriesInfo"},
- {903, nullptr, "DeleteAllSdaInfoCache"},
- {904, nullptr, "DeleteAllApplicationSetting"},
- {905, nullptr, "DeleteAllTransferTaskErrorInfo"},
- {906, nullptr, "RegisterTransferTaskErrorInfo"},
- {907, nullptr, "AddSaveDataArchiveInfoCache"},
- {908, nullptr, "DeleteSeriesInfo"},
- {909, nullptr, "GetSeriesInfo"},
- {910, nullptr, "RemoveTransferTaskErrorInfo"},
- {911, nullptr, "DeleteAllSeriesInfoForSaveDataBackup"},
- {912, nullptr, "DeleteSeriesInfoForSaveDataBackup"},
- {913, nullptr, "GetSeriesInfoForSaveDataBackup"},
- {914, nullptr, "Unknown914"}, //20.2.0+
- {1000, nullptr, "UpdateIssueOld"},
- {1010, nullptr, "Unknown1010"},
- {1011, nullptr, "Unknown1011"},
- {1012, nullptr, "Unknown1012"},
- {1013, nullptr, "Unkown1013"},
- {1014, nullptr, "Unknown1014"},
- {1020, nullptr, "Unknown1020"},
- {1021, nullptr, "Unknown1021"},
- {1022, nullptr, "Unknown1022"},
- {1023, nullptr, "Unknown1023"},
- {1024, nullptr, "Unknown1024"},
- {1100, nullptr, "RepairUpdateIssueInfoCacheAync"},
- {1110, nullptr, "RepairGetIssueInfo"},
- {1111, nullptr, "RepairListIssueInfo"},
- {1112, nullptr, "RepairListOperationPermissionInfo"},
- {1113, nullptr, "RepairListDataInfoForRepairedSaveDataDownload"},
- {1114, nullptr, "RepairListDataInfoForOriginalSaveDataDownload"},
- {1120, nullptr, "RepairUploadSaveDataAsync"},
- {1121, nullptr, "RepairUploadSaveDataAsync1"},
- {1122, nullptr, "RepairDownloadRepairedSaveDataAsync"},
- {1123, nullptr, "RepairDownloadOriginalSaveDataAsync"},
- {1124, nullptr, "RepairGetOperationProgressInfo"},
- {10000, D<&IOlscServiceForSystemService::GetOlscServiceForSystemService>, "GetOlscServiceForSystemService"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IOlscServiceForSystemService::~IOlscServiceForSystemService() = default;
-
-Result IOlscServiceForSystemService::GetTransferTaskListController(
- Out<SharedPointer<ITransferTaskListController>> out_interface) {
- LOG_INFO(Service_OLSC, "called");
- *out_interface = std::make_shared<ITransferTaskListController>(system);
- R_SUCCEED();
-}
-
-Result IOlscServiceForSystemService::GetRemoteStorageController(
- Out<SharedPointer<IRemoteStorageController>> out_interface) {
- LOG_INFO(Service_OLSC, "called");
- *out_interface = std::make_shared<IRemoteStorageController>(system);
- R_SUCCEED();
-}
-
-Result IOlscServiceForSystemService::GetDaemonController(
- Out<SharedPointer<IDaemonController>> out_interface) {
- LOG_INFO(Service_OLSC, "called");
- *out_interface = std::make_shared<IDaemonController>(system);
- R_SUCCEED();
-}
-
-Result IOlscServiceForSystemService::GetDataTransferPolicy(
- Out<DataTransferPolicy> out_policy, u64 application_id) {
- LOG_WARNING(Service_OLSC, "(STUBBED) called");
- DataTransferPolicy policy{};
- policy.upload_policy = 0;
- policy.download_policy = 0;
- *out_policy = policy;
- R_SUCCEED();
-}
-
-Result IOlscServiceForSystemService::GetTransferTaskErrorInfo(Out<TransferTaskErrorInfo> out_info,
- Common::UUID uuid, u64 application_id) {
- LOG_WARNING(Service_OLSC, "(STUBBED) called, uuid={} application_id={:016X}",
- uuid.FormattedString(), application_id);
-
- TransferTaskErrorInfo info{};
- info.uid = uuid;
- info.application_id = application_id;
- info.unknown_0x18 = 0;
- info.reserved_0x19.fill(0);
- info.unknown_0x20 = 0;
- info.error_code = 0;
- info.reserved_0x2C = 0;
-
- *out_info = info;
- R_SUCCEED();
-}
-
-Result IOlscServiceForSystemService::GetOlscServiceForSystemService(
- Out<SharedPointer<IOlscServiceForSystemService>> out_interface) {
- LOG_INFO(Service_OLSC, "called");
- *out_interface = std::static_pointer_cast<IOlscServiceForSystemService>(shared_from_this());
- R_SUCCEED();
-}
-
-} // namespace Service::OLSC
diff --git a/src/core/hle/service/olsc/olsc_service_for_system_service.h b/src/core/hle/service/olsc/olsc_service_for_system_service.h
deleted file mode 100644
index d16c8b979b..0000000000
--- a/src/core/hle/service/olsc/olsc_service_for_system_service.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include <array>
-
-#include "common/uuid.h"
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::OLSC {
-
-class IDaemonController;
-class IRemoteStorageController;
-class ITransferTaskListController;
-
-struct DataTransferPolicy {
- u8 upload_policy;
- u8 download_policy;
-};
-
-struct TransferTaskErrorInfo {
- Common::UUID uid;
- u64 application_id;
- u8 unknown_0x18;
- std::array<u8, 7> reserved_0x19;
- u64 unknown_0x20;
- u32 error_code;
- u32 reserved_0x2C;
-};
-static_assert(sizeof(TransferTaskErrorInfo) == 0x30, "TransferTaskErrorInfo has incorrect size.");
-
-class IOlscServiceForSystemService final : public ServiceFramework<IOlscServiceForSystemService> {
-public:
- explicit IOlscServiceForSystemService(Core::System& system_);
- ~IOlscServiceForSystemService() override;
-
-private:
- Result GetTransferTaskListController(
- Out<SharedPointer<ITransferTaskListController>> out_interface);
- Result GetRemoteStorageController(Out<SharedPointer<IRemoteStorageController>> out_interface);
- Result GetDaemonController(Out<SharedPointer<IDaemonController>> out_interface);
- Result GetDataTransferPolicy(Out<DataTransferPolicy> out_policy, u64 application_id);
- Result GetTransferTaskErrorInfo(Out<TransferTaskErrorInfo> out_info, Common::UUID uid, u64 application_id);
- Result GetOlscServiceForSystemService(
- Out<SharedPointer<IOlscServiceForSystemService>> out_interface);
-};
-
-} // namespace Service::OLSC
diff --git a/src/core/hle/service/olsc/remote_storage_controller.cpp b/src/core/hle/service/olsc/remote_storage_controller.cpp
index 817097b426..1e7825da30 100644
--- a/src/core/hle/service/olsc/remote_storage_controller.cpp
+++ b/src/core/hle/service/olsc/remote_storage_controller.cpp
@@ -9,44 +9,44 @@
namespace Service::OLSC {
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> IRemoteStorageController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetSaveDataArchiveInfoBySaveDataId"},
+ FunctionInfo{1, nullptr, "GetSaveDataArchiveInfoByApplicationId"},
+ FunctionInfo{3, nullptr, "GetSaveDataArchiveCount"},
+ FunctionInfo{6, nullptr, "CleanupSaveDataArchives"},
+ FunctionInfo{7, nullptr, "CreateSaveDataArchiveCacheUpdationTask"},
+ FunctionInfo{8, nullptr, "CreateSaveDataArchiveCacheUpdationForSpecifiedApplicationTask"},
+ FunctionInfo{9, nullptr, "Delete"},
+ FunctionInfo{10, nullptr, "GetSeriesInfo"},
+ FunctionInfo{11, nullptr, "CreateDeleteDataTask"},
+ FunctionInfo{12, nullptr, "DeleteSeriesInfo"},
+ FunctionInfo{13, nullptr, "CreateRegisterNotificationTokenTask"},
+ FunctionInfo{14, D<&IRemoteStorageController::GetDataNewnessByApplicationId>, "GetDataNewnessByApplicationId"},
+ FunctionInfo{15, nullptr, "RegisterUploadSaveDataTransferTaskForAutonomyRegistration"},
+ FunctionInfo{16, nullptr, "CreateCleanupToDeleteSaveDataArchiveInfoTask"},
+ FunctionInfo{17, nullptr, "ListDataInfo"},
+ FunctionInfo{18, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV1"},
+ FunctionInfo{19, nullptr, "GetDataInfoCacheUpdateNativeHandleHolder"},
+ FunctionInfo{20, nullptr, "CreateSaveDataArchiveInfoCacheForSaveDataBackupUpdationTask"},
+ FunctionInfo{21, nullptr, "ListSecondarySaves"},
+ FunctionInfo{22, D<&IRemoteStorageController::GetSecondarySave>, "GetSecondarySave"},
+ FunctionInfo{23, nullptr, "TouchSecondarySave"},
+ FunctionInfo{24, nullptr, "GetSecondarySaveDataInfo"},
+ FunctionInfo{25, nullptr, "RegisterDownloadSaveDataTransferTaskForAutonomyRegistration"},
+ FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,0,0})},
+ FunctionInfo{27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2", MakeVersionGate({20,0,0})},
+ FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})},
+ FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})},
+ FunctionInfo{800, nullptr, "Unknown800", MakeVersionGate({20,0,0})},
+ FunctionInfo{900, nullptr, "SetLoadedDataMissing"},
+ FunctionInfo{901, nullptr, "Unknown901", MakeVersionGate({20,2,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
IRemoteStorageController::IRemoteStorageController(Core::System& system_)
: ServiceFramework{system_, "IRemoteStorageController"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetSaveDataArchiveInfoBySaveDataId"},
- {1, nullptr, "GetSaveDataArchiveInfoByApplicationId"},
- {3, nullptr, "GetSaveDataArchiveCount"},
- {6, nullptr, "CleanupSaveDataArchives"},
- {7, nullptr, "CreateSaveDataArchiveCacheUpdationTask"},
- {8, nullptr, "CreateSaveDataArchiveCacheUpdationForSpecifiedApplicationTask"},
- {9, nullptr, "Delete"},
- {10, nullptr, "GetSeriesInfo"},
- {11, nullptr, "CreateDeleteDataTask"},
- {12, nullptr, "DeleteSeriesInfo"},
- {13, nullptr, "CreateRegisterNotificationTokenTask"},
- {14, D<&IRemoteStorageController::GetDataNewnessByApplicationId>, "GetDataNewnessByApplicationId"},
- {15, nullptr, "RegisterUploadSaveDataTransferTaskForAutonomyRegistration"},
- {16, nullptr, "CreateCleanupToDeleteSaveDataArchiveInfoTask"},
- {17, nullptr, "ListDataInfo"},
- {18, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV1"},
- {19, nullptr, "GetDataInfoCacheUpdateNativeHandleHolder"},
- {20, nullptr, "CreateSaveDataArchiveInfoCacheForSaveDataBackupUpdationTask"},
- {21, nullptr, "ListSecondarySaves"},
- {22, D<&IRemoteStorageController::GetSecondarySave>, "GetSecondarySave"},
- {23, nullptr, "TouchSecondarySave"},
- {24, nullptr, "GetSecondarySaveDataInfo"},
- {25, nullptr, "RegisterDownloadSaveDataTransferTaskForAutonomyRegistration"},
- {26, nullptr, "Unknown26"}, //20.0.0+
- {27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2"}, //20.0.0+
- {28, nullptr, "Unknown28"}, //20.0.0+
- {29, nullptr, "Unknown29"}, //21.0.0+
- {800, nullptr, "Unknown800"}, //20.0.0+
- {900, nullptr, "SetLoadedDataMissing"},
- {901, nullptr, "Unknown901"}, //20.2.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IRemoteStorageController::~IRemoteStorageController() = default;
diff --git a/src/core/hle/service/olsc/remote_storage_controller.h b/src/core/hle/service/olsc/remote_storage_controller.h
index 21b439013a..20503d9800 100644
--- a/src/core/hle/service/olsc/remote_storage_controller.h
+++ b/src/core/hle/service/olsc/remote_storage_controller.h
@@ -21,6 +21,8 @@ private:
u64 application_id);
Result GetDataNewnessByApplicationId(Out<u8> out_newness, u64 application_id);
Result GetDataInfo(Out<std::array<u8, 0x38>> out_data, u64 application_id);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::OLSC
diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.cpp b/src/core/hle/service/olsc/transfer_task_list_controller.cpp
index 95e41cdb51..af090fc292 100644
--- a/src/core/hle/service/olsc/transfer_task_list_controller.cpp
+++ b/src/core/hle/service/olsc/transfer_task_list_controller.cpp
@@ -11,45 +11,45 @@
namespace Service::OLSC {
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> ITransferTaskListController::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetTransferTaskCountForOcean"},
+ FunctionInfo{1, nullptr, "GetTransferTaskInfoForOcean"},
+ FunctionInfo{2, nullptr, "ListTransferTaskInfoForOcean"},
+ FunctionInfo{3, nullptr, "DeleteTransferTaskForOcean"},
+ FunctionInfo{4, nullptr, "RaiseTransferTaskPriorityForOcean"},
+ FunctionInfo{5, D<&ITransferTaskListController::GetTransferTaskEndEventNativeHandleHolder>, "GetTransferTaskEndEventNativeHandleHolder"},
+ FunctionInfo{6, nullptr, "GetTransferTaskProgressForOcean"},
+ FunctionInfo{7, nullptr, "GetTransferTaskLastResultForOcean"},
+ FunctionInfo{8, D<&ITransferTaskListController::StopNextTransferTaskExecution>, "StopNextTransferTaskExecution"},
+ FunctionInfo{9, D<&ITransferTaskListController::GetTransferTaskStartEventNativeHandleHolder>, "GetTransferTaskStartEventNativeHandleHolder"},
+ FunctionInfo{10, nullptr, "SuspendTransferTaskForOcean"},
+ FunctionInfo{11, nullptr, "GetCurrentTransferTaskInfoForOcean"},
+ FunctionInfo{12, nullptr, "FindTransferTaskInfoForOcean"},
+ FunctionInfo{13, nullptr, "CancelCurrentRepairTransferTask"},
+ FunctionInfo{14, nullptr, "GetRepairTransferTaskProgress"},
+ FunctionInfo{15, nullptr, "EnsureExecutableForRepairTransferTask"},
+ FunctionInfo{16, D<&ITransferTaskListController::GetTransferTaskCount>, "GetTransferTaskCount"},
+ FunctionInfo{17, nullptr, "GetTransferTaskInfo"},
+ FunctionInfo{18, nullptr, "ListTransferTaskInfo"},
+ FunctionInfo{19, nullptr, "DeleteTransferTask"},
+ FunctionInfo{20, nullptr, "RaiseTransferTaskPriority"},
+ FunctionInfo{21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress", MakeVersionGate({10,1,0})},
+ FunctionInfo{22, nullptr, "GetTransferTaskLastResult"},
+ FunctionInfo{23, nullptr, "SuspendTransferTask"},
+ FunctionInfo{24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"},
+ FunctionInfo{25, D<&ITransferTaskListController::FindTransferTaskInfo>, "FindTransferTaskInfo"},
+ FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,1,0})},
+ FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,1,0})},
+ FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,1,0})},
+ FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({20,1,0})},
+ FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({20,1,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
ITransferTaskListController::ITransferTaskListController(Core::System& system_)
: ServiceFramework{system_, "ITransferTaskListController"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetTransferTaskCountForOcean"},
- {1, nullptr, "GetTransferTaskInfoForOcean"},
- {2, nullptr, "ListTransferTaskInfoForOcean"},
- {3, nullptr, "DeleteTransferTaskForOcean"},
- {4, nullptr, "RaiseTransferTaskPriorityForOcean"},
- {5, D<&ITransferTaskListController::GetTransferTaskEndEventNativeHandleHolder>, "GetTransferTaskEndEventNativeHandleHolder"},
- {6, nullptr, "GetTransferTaskProgressForOcean"},
- {7, nullptr, "GetTransferTaskLastResultForOcean"},
- {8, D<&ITransferTaskListController::StopNextTransferTaskExecution>, "StopNextTransferTaskExecution"},
- {9, D<&ITransferTaskListController::GetTransferTaskStartEventNativeHandleHolder>, "GetTransferTaskStartEventNativeHandleHolder"},
- {10, nullptr, "SuspendTransferTaskForOcean"},
- {11, nullptr, "GetCurrentTransferTaskInfoForOcean"},
- {12, nullptr, "FindTransferTaskInfoForOcean"},
- {13, nullptr, "CancelCurrentRepairTransferTask"},
- {14, nullptr, "GetRepairTransferTaskProgress"},
- {15, nullptr, "EnsureExecutableForRepairTransferTask"},
- {16, D<&ITransferTaskListController::GetTransferTaskCount>, "GetTransferTaskCount"},
- {17, nullptr, "GetTransferTaskInfo"},
- {18, nullptr, "ListTransferTaskInfo"},
- {19, nullptr, "DeleteTransferTask"},
- {20, nullptr, "RaiseTransferTaskPriority"},
- {21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress"}, //10.1.0+
- {22, nullptr, "GetTransferTaskLastResult"},
- {23, nullptr, "SuspendTransferTask"},
- {24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"},
- {25, D<&ITransferTaskListController::FindTransferTaskInfo>, "FindTransferTaskInfo"},
- {26, nullptr, "Unknown26"}, //20.1.0+
- {27, nullptr, "Unknown27"}, //20.1.0+
- {28, nullptr, "Unknown28"}, //20.1.0+
- {29, nullptr, "Unknown29"}, //20.1.0+
- {30, nullptr, "Unknown30"}, //20.1.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ITransferTaskListController::~ITransferTaskListController() = default;
diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.h b/src/core/hle/service/olsc/transfer_task_list_controller.h
index 5f3429879a..74c5eddee3 100644
--- a/src/core/hle/service/olsc/transfer_task_list_controller.h
+++ b/src/core/hle/service/olsc/transfer_task_list_controller.h
@@ -27,6 +27,8 @@ private:
Result GetTransferTaskProgress();
Result GetCurrentTransferTaskInfo(Out<std::array<u8, 0x30>> out_info, u8 unknown);
Result FindTransferTaskInfo(Out<std::array<u8, 0x30>> out_info, InBuffer<BufferAttr_HipcAutoSelect> in);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::OLSC
diff --git a/src/core/hle/service/omm/operation_mode_manager.cpp b/src/core/hle/service/omm/operation_mode_manager.cpp
index fe7ed84a7f..e36f606442 100644
--- a/src/core/hle/service/omm/operation_mode_manager.cpp
+++ b/src/core/hle/service/omm/operation_mode_manager.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,41 +10,6 @@ namespace Service::OMM {
IOperationModeManager::IOperationModeManager(Core::System& system_)
: ServiceFramework{system_, "omm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetOperationMode"},
- {1, nullptr, "GetOperationModeChangeEvent"},
- {2, nullptr, "EnableAudioVisual"},
- {3, nullptr, "DisableAudioVisual"},
- {4, nullptr, "EnterSleepAndWait"},
- {5, nullptr, "GetCradleStatus"},
- {6, nullptr, "FadeInDisplay"},
- {7, nullptr, "FadeOutDisplay"},
- {8, nullptr, "GetCradleFwVersion"},
- {9, nullptr, "NotifyCecSettingsChanged"},
- {10, nullptr, "SetOperationModePolicy"},
- {11, nullptr, "GetDefaultDisplayResolution"},
- {12, nullptr, "GetDefaultDisplayResolutionChangeEvent"},
- {13, nullptr, "UpdateDefaultDisplayResolution"},
- {14, nullptr, "ShouldSleepOnBoot"},
- {15, nullptr, "NotifyHdcpApplicationExecutionStarted"},
- {16, nullptr, "NotifyHdcpApplicationExecutionFinished"},
- {17, nullptr, "NotifyHdcpApplicationDrawingStarted"},
- {18, nullptr, "NotifyHdcpApplicationDrawingFinished"},
- {19, nullptr, "GetHdcpAuthenticationFailedEvent"},
- {20, nullptr, "GetHdcpAuthenticationFailedEmulationEnabled"},
- {21, nullptr, "SetHdcpAuthenticationFailedEmulation"},
- {22, nullptr, "GetHdcpStateChangeEvent"},
- {23, nullptr, "GetHdcpState"},
- {24, nullptr, "ShowCardUpdateProcessing"},
- {25, nullptr, "SetApplicationCecSettingsAndNotifyChanged"},
- {26, nullptr, "GetOperationModeSystemInfo"},
- {27, nullptr, "GetAppletFullAwakingSystemEvent"},
- {28, nullptr, "CreateCradleFirmwareUpdater"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IOperationModeManager::~IOperationModeManager() = default;
diff --git a/src/core/hle/service/omm/operation_mode_manager.h b/src/core/hle/service/omm/operation_mode_manager.h
index 32bc7b2f93..ea604c8f60 100644
--- a/src/core/hle/service/omm/operation_mode_manager.h
+++ b/src/core/hle/service/omm/operation_mode_manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,41 @@ class IOperationModeManager final : public ServiceFramework<IOperationModeManage
public:
explicit IOperationModeManager(Core::System& system_);
~IOperationModeManager() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetOperationMode"},
+ FunctionInfo{1, nullptr, "GetOperationModeChangeEvent"},
+ FunctionInfo{2, nullptr, "EnableAudioVisual"},
+ FunctionInfo{3, nullptr, "DisableAudioVisual"},
+ FunctionInfo{4, nullptr, "EnterSleepAndWait"},
+ FunctionInfo{5, nullptr, "GetCradleStatus"},
+ FunctionInfo{6, nullptr, "FadeInDisplay"},
+ FunctionInfo{7, nullptr, "FadeOutDisplay"},
+ FunctionInfo{8, nullptr, "GetCradleFwVersion"},
+ FunctionInfo{9, nullptr, "NotifyCecSettingsChanged"},
+ FunctionInfo{10, nullptr, "SetOperationModePolicy"},
+ FunctionInfo{11, nullptr, "GetDefaultDisplayResolution"},
+ FunctionInfo{12, nullptr, "GetDefaultDisplayResolutionChangeEvent"},
+ FunctionInfo{13, nullptr, "UpdateDefaultDisplayResolution"},
+ FunctionInfo{14, nullptr, "ShouldSleepOnBoot"},
+ FunctionInfo{15, nullptr, "NotifyHdcpApplicationExecutionStarted"},
+ FunctionInfo{16, nullptr, "NotifyHdcpApplicationExecutionFinished"},
+ FunctionInfo{17, nullptr, "NotifyHdcpApplicationDrawingStarted"},
+ FunctionInfo{18, nullptr, "NotifyHdcpApplicationDrawingFinished"},
+ FunctionInfo{19, nullptr, "GetHdcpAuthenticationFailedEvent"},
+ FunctionInfo{20, nullptr, "GetHdcpAuthenticationFailedEmulationEnabled"},
+ FunctionInfo{21, nullptr, "SetHdcpAuthenticationFailedEmulation"},
+ FunctionInfo{22, nullptr, "GetHdcpStateChangeEvent"},
+ FunctionInfo{23, nullptr, "GetHdcpState"},
+ FunctionInfo{24, nullptr, "ShowCardUpdateProcessing"},
+ FunctionInfo{25, nullptr, "SetApplicationCecSettingsAndNotifyChanged"},
+ FunctionInfo{26, nullptr, "GetOperationModeSystemInfo"},
+ FunctionInfo{27, nullptr, "GetAppletFullAwakingSystemEvent"},
+ FunctionInfo{28, nullptr, "CreateCradleFirmwareUpdater"}
+ );
};
} // namespace Service::OMM
diff --git a/src/core/hle/service/omm/policy_manager_system.cpp b/src/core/hle/service/omm/policy_manager_system.cpp
index 1cd6fd807b..1d46de7f3e 100644
--- a/src/core/hle/service/omm/policy_manager_system.cpp
+++ b/src/core/hle/service/omm/policy_manager_system.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,18 +10,6 @@ namespace Service::OMM {
IPolicyManagerSystem::IPolicyManagerSystem(Core::System& system_)
: ServiceFramework{system_, "idle:sys"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetAutoPowerDownEvent"},
- {1, nullptr, "IsAutoPowerDownRequested"},
- {2, nullptr, "Unknown2"},
- {3, nullptr, "SetHandlingContext"},
- {4, nullptr, "LoadAndApplySettings"},
- {5, nullptr, "ReportUserIsActive"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IPolicyManagerSystem::~IPolicyManagerSystem() = default;
diff --git a/src/core/hle/service/omm/policy_manager_system.h b/src/core/hle/service/omm/policy_manager_system.h
index 151ca0d2ee..c6ff451e61 100644
--- a/src/core/hle/service/omm/policy_manager_system.h
+++ b/src/core/hle/service/omm/policy_manager_system.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,18 @@ class IPolicyManagerSystem final : public ServiceFramework<IPolicyManagerSystem>
public:
explicit IPolicyManagerSystem(Core::System& system_);
~IPolicyManagerSystem() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetAutoPowerDownEvent"},
+ FunctionInfo{1, nullptr, "IsAutoPowerDownRequested"},
+ FunctionInfo{2, nullptr, "Unknown2"},
+ FunctionInfo{3, nullptr, "SetHandlingContext"},
+ FunctionInfo{4, nullptr, "LoadAndApplySettings"},
+ FunctionInfo{5, nullptr, "ReportUserIsActive"}
+ );
};
} // namespace Service::OMM
diff --git a/src/core/hle/service/omm/power_state_interface.cpp b/src/core/hle/service/omm/power_state_interface.cpp
index 22cac82595..4150882695 100644
--- a/src/core/hle/service/omm/power_state_interface.cpp
+++ b/src/core/hle/service/omm/power_state_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,24 +10,6 @@ namespace Service::OMM {
IPowerStateInterface::IPowerStateInterface(Core::System& system_)
: ServiceFramework{system_, "spsm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetState"},
- {1, nullptr, "EnterSleep"},
- {2, nullptr, "GetLastWakeReason"},
- {3, nullptr, "Shutdown"},
- {4, nullptr, "GetNotificationMessageEventHandle"},
- {5, nullptr, "ReceiveNotificationMessage"},
- {6, nullptr, "AnalyzeLogForLastSleepWakeSequence"},
- {7, nullptr, "ResetEventLog"},
- {8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"},
- {9, nullptr, "ChangeHomeButtonLongPressingTime"},
- {10, nullptr, "PutErrorState"},
- {11, nullptr, "InvalidateCurrentHomeButtonPressing"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IPowerStateInterface::~IPowerStateInterface() = default;
diff --git a/src/core/hle/service/omm/power_state_interface.h b/src/core/hle/service/omm/power_state_interface.h
index 825a6512d9..fed55a4361 100644
--- a/src/core/hle/service/omm/power_state_interface.h
+++ b/src/core/hle/service/omm/power_state_interface.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,24 @@ class IPowerStateInterface final : public ServiceFramework<IPowerStateInterface>
public:
explicit IPowerStateInterface(Core::System& system_);
~IPowerStateInterface() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetState"},
+ FunctionInfo{1, nullptr, "EnterSleep"},
+ FunctionInfo{2, nullptr, "GetLastWakeReason"},
+ FunctionInfo{3, nullptr, "Shutdown"},
+ FunctionInfo{4, nullptr, "GetNotificationMessageEventHandle"},
+ FunctionInfo{5, nullptr, "ReceiveNotificationMessage"},
+ FunctionInfo{6, nullptr, "AnalyzeLogForLastSleepWakeSequence"},
+ FunctionInfo{7, nullptr, "ResetEventLog"},
+ FunctionInfo{8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"},
+ FunctionInfo{9, nullptr, "ChangeHomeButtonLongPressingTime"},
+ FunctionInfo{10, nullptr, "PutErrorState"},
+ FunctionInfo{11, nullptr, "InvalidateCurrentHomeButtonPressing"}
+ );
};
} // namespace Service::OMM
diff --git a/src/core/hle/service/pcie/pcie.cpp b/src/core/hle/service/pcie/pcie.cpp
index d162881ecf..f9aaa2d3b8 100644
--- a/src/core/hle/service/pcie/pcie.cpp
+++ b/src/core/hle/service/pcie/pcie.cpp
@@ -15,64 +15,62 @@ namespace Service::PCIe {
class ISession final : public ServiceFramework<ISession> {
public:
- explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "QueryFunctions"},
- {1, nullptr, "AcquireFunction"},
- {2, nullptr, "ReleaseFunction"},
- {3, nullptr, "GetFunctionState"},
- {4, nullptr, "GetBarProfile"},
- {5, nullptr, "ReadConfig"},
- {6, nullptr, "WriteConfig"},
- {7, nullptr, "ReadBarRegion"},
- {8, nullptr, "WriteBarRegion"},
- {9, nullptr, "FindCapability"},
- {10, nullptr, "FindExtendedCapability"},
- {11, nullptr, "MapDma"},
- {12, nullptr, "UnmapDma"},
- {13, nullptr, "UnmapDmaBusAddress"},
- {14, nullptr, "GetDmaBusAddress"},
- {15, nullptr, "GetDmaBusAddressRange"},
- {16, nullptr, "SetDmaEnable"},
- {17, nullptr, "AcquireIrq"},
- {18, nullptr, "ReleaseIrq"},
- {19, nullptr, "SetIrqEnable"},
- {20, nullptr, "GetIrqEvent"},
- {21, nullptr, "SetAspmEnable"},
- {22, nullptr, "SetResetUponResumeEnable"},
- {23, nullptr, "ResetFunction"},
- };
- // clang-format on
+ explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {}
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "QueryFunctions"},
+ FunctionInfo{1, nullptr, "AcquireFunction"},
+ FunctionInfo{2, nullptr, "ReleaseFunction"},
+ FunctionInfo{3, nullptr, "GetFunctionState"},
+ FunctionInfo{4, nullptr, "GetBarProfile"},
+ FunctionInfo{5, nullptr, "ReadConfig"},
+ FunctionInfo{6, nullptr, "WriteConfig"},
+ FunctionInfo{7, nullptr, "ReadBarRegion"},
+ FunctionInfo{8, nullptr, "WriteBarRegion"},
+ FunctionInfo{9, nullptr, "FindCapability"},
+ FunctionInfo{10, nullptr, "FindExtendedCapability"},
+ FunctionInfo{11, nullptr, "MapDma"},
+ FunctionInfo{12, nullptr, "UnmapDma"},
+ FunctionInfo{13, nullptr, "UnmapDmaBusAddress"},
+ FunctionInfo{14, nullptr, "GetDmaBusAddress"},
+ FunctionInfo{15, nullptr, "GetDmaBusAddressRange"},
+ FunctionInfo{16, nullptr, "SetDmaEnable"},
+ FunctionInfo{17, nullptr, "AcquireIrq"},
+ FunctionInfo{18, nullptr, "ReleaseIrq"},
+ FunctionInfo{19, nullptr, "SetIrqEnable"},
+ FunctionInfo{20, nullptr, "GetIrqEvent"},
+ FunctionInfo{21, nullptr, "SetAspmEnable"},
+ FunctionInfo{22, nullptr, "SetResetUponResumeEnable"},
+ FunctionInfo{23, nullptr, "ResetFunction"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class PCIE final : public ServiceFramework<PCIE> {
public:
- explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "RegisterClassDriver"},
- {1, nullptr, "QueryFunctionsUnregistered"},
- };
- // clang-format on
+ explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} {}
- RegisterHandlers(functions);
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "RegisterClassDriver"},
+ FunctionInfo{1, nullptr, "QueryFunctionsUnregistered"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class PCIE_LOG final : public ServiceFramework<PCIE_LOG> {
public:
- explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetLoggedState"},
- {1, nullptr, "GetLoggedStateEvent"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetLoggedState"},
+ FunctionInfo{1, nullptr, "GetLoggedStateEvent"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp
deleted file mode 100644
index 51953c2657..0000000000
--- a/src/core/hle/service/pctl/parental_control_service.cpp
+++ /dev/null
@@ -1,498 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include <chrono>
-
-#include "core/core.h"
-#include "core/file_sys/control_metadata.h"
-#include "core/file_sys/patch_manager.h"
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/pctl/parental_control_service.h"
-#include "core/hle/service/pctl/pctl_results.h"
-
-namespace Service::PCTL {
-
-IParentalControlService::IParentalControlService(Core::System& system_, Capability capability_,
- u64 program_id_)
- : ServiceFramework{system_, "IParentalControlService"}, capability{capability_},
- program_id{program_id_},
- service_context{system_, "IParentalControlService"}, synchronization_event{service_context},
- unlinked_event{service_context}, request_suspension_event{service_context} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1, D<&IParentalControlService::Initialize>, "Initialize"},
- {1001, D<&IParentalControlService::CheckFreeCommunicationPermission>, "CheckFreeCommunicationPermission"},
- {1002, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
- {1003, D<&IParentalControlService::ConfirmResumeApplicationPermission>, "ConfirmResumeApplicationPermission"},
- {1004, D<&IParentalControlService::ConfirmSnsPostPermission>, "ConfirmSnsPostPermission"},
- {1005, D<&IParentalControlService::ConfirmSystemSettingsPermission>, "ConfirmSystemSettingsPermission"},
- {1006, D<&IParentalControlService::IsRestrictionTemporaryUnlocked>, "IsRestrictionTemporaryUnlocked"},
- {1007, nullptr, "RevertRestrictionTemporaryUnlocked"},
- {1008, nullptr, "EnterRestrictedSystemSettings"},
- {1009, nullptr, "LeaveRestrictedSystemSettings"},
- {1010, D<&IParentalControlService::IsRestrictedSystemSettingsEntered>, "IsRestrictedSystemSettingsEntered"},
- {1011, nullptr, "RevertRestrictedSystemSettingsEntered"},
- {1012, nullptr, "GetRestrictedFeatures"},
- {1013, D<&IParentalControlService::ConfirmStereoVisionPermission>, "ConfirmStereoVisionPermission"},
- {1014, nullptr, "ConfirmPlayableApplicationVideoOld"},
- {1015, nullptr, "ConfirmPlayableApplicationVideo"},
- {1016, nullptr, "ConfirmShowNewsPermission"},
- {1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"},
- {1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"},
- {1019, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
- {1020, nullptr, "ConfirmLaunchSharedApplicationPermission"}, //20.0.0+
- {1021, nullptr, "TryBeginFreeCommunicationForStreamPlay"}, //21.0.0+
- {1022, nullptr, "EndFreeCommunicationForStreamPlay"}, //21.0.0+
- {1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"},
- {1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"},
- {1033, nullptr, "SetSafetyLevel"},
- {1034, nullptr, "GetSafetyLevelSettings"},
- {1035, D<&IParentalControlService::GetCurrentSettings>, "GetCurrentSettings"},
- {1036, nullptr, "SetCustomSafetyLevelSettings"},
- {1037, nullptr, "GetDefaultRatingOrganization"},
- {1038, nullptr, "SetDefaultRatingOrganization"},
- {1039, D<&IParentalControlService::GetFreeCommunicationApplicationListCount>, "GetFreeCommunicationApplicationListCount"},
- {1042, nullptr, "AddToFreeCommunicationApplicationList"},
- {1043, nullptr, "DeleteSettings"},
- {1044, nullptr, "GetFreeCommunicationApplicationList"},
- {1045, nullptr, "UpdateFreeCommunicationApplicationList"},
- {1046, nullptr, "DisableFeaturesForReset"},
- {1047, nullptr, "NotifyApplicationDownloadStarted"},
- {1048, nullptr, "NotifyNetworkProfileCreated"},
- {1049, nullptr, "ResetFreeCommunicationApplicationList"},
- {1050, nullptr, "AddToFreeCommunicationApplicationList"}, //20.0.0+
- {1051, nullptr, "NotifyApplicationDownloadStarted"}, //20.0.0+
- {1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"},
- {1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"},
- {1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"},
- {1064, D<&IParentalControlService::ResetConfirmedStereoVisionPermission>, "ResetConfirmedStereoVisionPermission"},
- {1065, D<&IParentalControlService::IsStereoVisionPermitted>, "IsStereoVisionPermitted"},
- {1201, nullptr, "UnlockRestrictionTemporarily"},
- {1202, nullptr, "UnlockSystemSettingsRestriction"},
- {1203, nullptr, "SetPinCode"},
- {1204, nullptr, "GenerateInquiryCode"},
- {1205, nullptr, "CheckMasterKey"},
- {1206, D<&IParentalControlService::GetPinCodeLength>, "GetPinCodeLength"},
- {1207, nullptr, "GetPinCodeChangedEvent"},
- {1208, nullptr, "GetPinCode"},
- {1403, D<&IParentalControlService::IsPairingActive>, "IsPairingActive"},
- {1406, nullptr, "GetSettingsLastUpdated"},
- {1411, nullptr, "GetPairingAccountInfo"},
- {1421, nullptr, "GetAccountNickname"},
- {1424, nullptr, "GetAccountState"},
- {1425, nullptr, "RequestPostEvents"},
- {1426, nullptr, "GetPostEventInterval"},
- {1427, nullptr, "SetPostEventInterval"},
- {1432, D<&IParentalControlService::GetSynchronizationEvent>, "GetSynchronizationEvent"},
- {1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"},
- {1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"},
- {1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"},
- {1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"},
- {1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"},
- {1456, D<&IParentalControlService::GetPlayTimerSettingsOld>, "GetPlayTimerSettingsOld"},
- {1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"},
- {1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"},
- {1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"},
- {1460, D<&IParentalControlService::Unknown1460>, "Unknown1460"},
- {1471, nullptr, "NotifyWrongPinCodeInputManyTimes"},
- {1472, nullptr, "CancelNetworkRequest"},
- {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"},
- {1474, nullptr, "ClearUnlinkedEvent"},
- {1475, nullptr, "GetExtendedPlayTimerEvent"}, // 18.0.0+
- {1601, nullptr, "DisableAllFeatures"},
- {1602, nullptr, "PostEnableAllFeatures"},
- {1603, nullptr, "IsAllFeaturesDisabled"},
- {1901, nullptr, "DeleteFromFreeCommunicationApplicationListForDebug"},
- {1902, nullptr, "ClearFreeCommunicationApplicationListForDebug"},
- {1903, nullptr, "GetExemptApplicationListCountForDebug"},
- {1904, nullptr, "GetExemptApplicationListForDebug"},
- {1905, nullptr, "UpdateExemptApplicationListForDebug"},
- {1906, nullptr, "AddToExemptApplicationListForDebug"},
- {1907, nullptr, "DeleteFromExemptApplicationListForDebug"},
- {1908, nullptr, "ClearExemptApplicationListForDebug"},
- {1941, nullptr, "DeletePairing"},
- {1951, nullptr, "SetPlayTimerSettingsForDebug"},
- {1952, nullptr, "GetPlayTimerSpentTimeForTest"},
- {1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"},
- {1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+
- {1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+
- {1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+
- {1957, nullptr, "GetBedtimeAlarmTimeMinute"}, // 18.0.0+
- {2001, nullptr, "RequestPairingAsync"},
- {2002, nullptr, "FinishRequestPairing"},
- {2003, nullptr, "AuthorizePairingAsync"},
- {2004, nullptr, "FinishAuthorizePairing"},
- {2005, nullptr, "RetrievePairingInfoAsync"},
- {2006, nullptr, "FinishRetrievePairingInfo"},
- {2007, nullptr, "UnlinkPairingAsync"},
- {2008, nullptr, "FinishUnlinkPairing"},
- {2009, nullptr, "GetAccountMiiImageAsync"},
- {2010, nullptr, "FinishGetAccountMiiImage"},
- {2011, nullptr, "GetAccountMiiImageContentTypeAsync"},
- {2012, nullptr, "FinishGetAccountMiiImageContentType"},
- {2013, nullptr, "SynchronizeParentalControlSettingsAsync"},
- {2014, nullptr, "FinishSynchronizeParentalControlSettings"},
- {2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"},
- {2016, nullptr, "RequestUpdateExemptionListAsync"}, //5.0.0+
- {145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+
- {2017, nullptr, "AuthorizePairingAsync"}, //19.0.0+
- {2019, nullptr, "RequestUpdateDeviceUsersBackground"}, //19.0.0+
- {2021, nullptr, "RequestCopyPairingAsync"}, //20.0.0+
- {2022, nullptr, "FinishRequestCopyPairing"}, //20.0.0+
- {2023, nullptr, "IsFromPairingActiveDevice"}, //20.0.0+
- {2024, nullptr, "RollbackCopyPairing"}, //21.0.0+
- {3001, nullptr, "GetErrorContextChangedEvent"}, //20.0.0+
- {145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+
- {195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug"}, //18.0.0+
- };
- // clang-format on
- RegisterHandlers(functions);
-}
-
-IParentalControlService::~IParentalControlService() = default;
-
-bool IParentalControlService::CheckFreeCommunicationPermissionImpl() const {
- if (states.temporary_unlocked) {
- return true;
- }
- if ((states.application_info.parental_control_flag & 1) == 0) {
- return true;
- }
- if (pin_code[0] == '\0') {
- return true;
- }
- if (!settings.is_free_communication_default_on) {
- return true;
- }
- // TODO(ogniK): Check for blacklisted/exempted applications. Return false can happen here
- // but as we don't have multiproceses support yet, we can just assume our application is
- // valid for the time being
- return true;
-}
-
-bool IParentalControlService::ConfirmStereoVisionPermissionImpl() const {
- if (states.temporary_unlocked) {
- return true;
- }
- if (pin_code[0] == '\0') {
- return true;
- }
- if (!settings.is_stero_vision_restricted) {
- return false;
- }
- return true;
-}
-
-void IParentalControlService::SetStereoVisionRestrictionImpl(bool is_restricted) {
- if (settings.disabled) {
- return;
- }
-
- if (pin_code[0] == '\0') {
- return;
- }
- settings.is_stero_vision_restricted = is_restricted;
-}
-
-Result IParentalControlService::Initialize() {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (False(capability & (Capability::Application | Capability::System))) {
- LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability);
- R_THROW(PCTL::ResultNoCapability);
- }
-
- // TODO(ogniK): Recovery flag initialization for pctl:r
-
- if (program_id != 0) {
- const FileSys::PatchManager pm{program_id, system.GetFileSystemController(),
- system.GetContentProvider()};
- const auto control = pm.GetControlMetadata();
- if (control.first) {
- states.tid_from_event = 0;
- states.launch_time_valid = false;
- states.is_suspended = false;
- states.free_communication = false;
- states.stereo_vision = false;
- states.application_info = ApplicationInfo{
- .application_id = program_id,
- .age_rating = control.first->GetRatingAge(),
- .parental_control_flag = control.first->GetParentalControlFlag(),
- .capability = capability,
- };
-
- if (False(capability & (Capability::System | Capability::Recovery))) {
- // TODO(ogniK): Signal application launch event
- }
- }
- }
-
- R_SUCCEED();
-}
-
-Result IParentalControlService::CheckFreeCommunicationPermission() {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (!CheckFreeCommunicationPermissionImpl()) {
- R_THROW(PCTL::ResultNoFreeCommunication);
- } else {
- states.free_communication = true;
- R_SUCCEED();
- }
-}
-
-Result IParentalControlService::ConfirmLaunchApplicationPermission(
- InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
- application_id);
- R_SUCCEED();
-}
-
-Result IParentalControlService::ConfirmResumeApplicationPermission(
- InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
- application_id);
- R_SUCCEED();
-}
-
-Result IParentalControlService::ConfirmSnsPostPermission() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_THROW(PCTL::ResultNoFreeCommunication);
-}
-
-Result IParentalControlService::ConfirmSystemSettingsPermission() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_SUCCEED();
-}
-
-Result IParentalControlService::IsRestrictionTemporaryUnlocked(
- Out<bool> out_is_temporary_unlocked) {
- *out_is_temporary_unlocked = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
- *out_is_temporary_unlocked);
- R_SUCCEED();
-}
-
-Result IParentalControlService::IsRestrictedSystemSettingsEntered(
- Out<bool> out_is_restricted_system_settings_entered) {
- *out_is_restricted_system_settings_entered = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
- *out_is_restricted_system_settings_entered);
- R_SUCCEED();
-}
-
-Result IParentalControlService::ConfirmStereoVisionPermission() {
- LOG_DEBUG(Service_PCTL, "called");
- states.stereo_vision = true;
- R_SUCCEED();
-}
-
-Result IParentalControlService::EndFreeCommunication() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_SUCCEED();
-}
-
-Result IParentalControlService::IsFreeCommunicationAvailable() {
- LOG_DEBUG(Service_PCTL, "(STUBBED) called");
-
- if (!CheckFreeCommunicationPermissionImpl()) {
- R_THROW(PCTL::ResultNoFreeCommunication);
- } else {
- R_SUCCEED();
- }
-}
-
-Result IParentalControlService::IsRestrictionEnabled(Out<bool> out_restriction_enabled) {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (False(capability & (Capability::Status | Capability::Recovery))) {
- LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!");
- *out_restriction_enabled = false;
- R_THROW(PCTL::ResultNoCapability);
- }
-
- *out_restriction_enabled = pin_code[0] != '\0';
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetSafetyLevel(Out<u32> out_safety_level) {
- *out_safety_level = 0;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level);
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetCurrentSettings(Out<RestrictionSettings> out_settings) {
- LOG_INFO(Service_PCTL, "called");
- *out_settings = restriction_settings;
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetFreeCommunicationApplicationListCount(Out<s32> out_count) {
- *out_count = 4;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", *out_count);
- R_SUCCEED();
-}
-
-Result IParentalControlService::ConfirmStereoVisionRestrictionConfigurable() {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (False(capability & Capability::StereoVision)) {
- LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
- R_THROW(PCTL::ResultNoCapability);
- }
-
- if (pin_code[0] == '\0') {
- R_THROW(PCTL::ResultNoRestrictionEnabled);
- }
-
- R_SUCCEED();
-}
-
-Result IParentalControlService::IsStereoVisionPermitted(Out<bool> out_is_permitted) {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (!ConfirmStereoVisionPermissionImpl()) {
- *out_is_permitted = false;
- R_THROW(PCTL::ResultStereoVisionRestricted);
- } else {
- *out_is_permitted = true;
- R_SUCCEED();
- }
-}
-
-Result IParentalControlService::GetPinCodeLength(Out<s32> out_length) {
- *out_length = 0;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length);
- R_SUCCEED();
-}
-
-Result IParentalControlService::IsPairingActive(Out<bool> out_is_pairing_active) {
- *out_is_pairing_active = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", *out_is_pairing_active);
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetSynchronizationEvent(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_PCTL, "called");
- *out_event = synchronization_event.GetHandle();
- R_SUCCEED();
-}
-
-Result IParentalControlService::StartPlayTimer() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_SUCCEED();
-}
-
-Result IParentalControlService::StopPlayTimer() {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- R_SUCCEED();
-}
-
-Result IParentalControlService::IsPlayTimerEnabled(Out<bool> out_is_play_timer_enabled) {
- *out_is_play_timer_enabled = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, enabled={}", *out_is_play_timer_enabled);
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetPlayTimerRemainingTime(Out<s32> out_remaining_time) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- *out_remaining_time = std::numeric_limits<s32>::max();
- R_SUCCEED();
-}
-
-Result IParentalControlService::IsRestrictedByPlayTimer(Out<bool> out_is_restricted_by_play_timer) {
- *out_is_restricted_by_play_timer = false;
- LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer);
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetPlayTimerSettingsOld(
- Out<PlayTimerSettingsOld> out_play_timer_settings) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- *out_play_timer_settings = {};
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetPlayTimerSettings(Out<PlayTimerSettings> out_play_timer_settings) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- *out_play_timer_settings = raw_play_timer_settings;
- R_SUCCEED();
-}
-
-Result IParentalControlService::SetPlayTimerSettings(PlayTimerSettings play_timer_settings) {
- LOG_WARNING(Service_PCTL, "(STUBBED) called");
- raw_play_timer_settings = play_timer_settings;
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetPlayTimerEventToRequestSuspension(
- OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_PCTL, "called");
- *out_event = request_suspension_event.GetHandle();
- R_SUCCEED();
-}
-
-Result IParentalControlService::IsPlayTimerAlarmDisabled(Out<bool> out_play_timer_alarm_disabled) {
- *out_play_timer_alarm_disabled = false;
- LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}",
- *out_play_timer_alarm_disabled);
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo(Out<PlayTimerRemainingTimeDisplayInfo> out_display_info) {
- LOG_DEBUG(Service_PCTL, "called");
- *out_display_info = {.state = PlayTimerDisplayState::NotConfigured};
- R_SUCCEED();
-}
-
-Result IParentalControlService::Unknown1460(u8 in_unk, Out<PlayTimerRemainingTimeDisplayInfo> out_display_info) {
- LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk);
- *out_display_info = {.state = PlayTimerDisplayState::NotConfigured};
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetUnlinkedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_PCTL, "called");
- *out_event = unlinked_event.GetHandle();
- R_SUCCEED();
-}
-
-Result IParentalControlService::GetStereoVisionRestriction(
- Out<bool> out_stereo_vision_restriction) {
- LOG_DEBUG(Service_PCTL, "called");
-
- if (False(capability & Capability::StereoVision)) {
- LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
- *out_stereo_vision_restriction = false;
- R_THROW(PCTL::ResultNoCapability);
- }
-
- *out_stereo_vision_restriction = settings.is_stero_vision_restricted;
- R_SUCCEED();
-}
-
-Result IParentalControlService::SetStereoVisionRestriction(bool stereo_vision_restriction) {
- LOG_DEBUG(Service_PCTL, "called, can_use={}", stereo_vision_restriction);
-
- if (False(capability & Capability::StereoVision)) {
- LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
- R_THROW(PCTL::ResultNoCapability);
- }
-
- SetStereoVisionRestrictionImpl(stereo_vision_restriction);
- R_SUCCEED();
-}
-
-Result IParentalControlService::ResetConfirmedStereoVisionPermission() {
- LOG_DEBUG(Service_PCTL, "called");
-
- states.stereo_vision = false;
-
- R_SUCCEED();
-}
-
-} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/parental_control_service.h b/src/core/hle/service/pctl/parental_control_service.h
deleted file mode 100644
index 9dabe3d059..0000000000
--- a/src/core/hle/service/pctl/parental_control_service.h
+++ /dev/null
@@ -1,99 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator
-// Project// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/kernel_helpers.h"
-#include "core/hle/service/os/event.h"
-#include "core/hle/service/pctl/pctl_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::PCTL {
-
-class IParentalControlService final : public ServiceFramework<IParentalControlService> {
-public:
- explicit IParentalControlService(Core::System& system_, Capability capability_,
- u64 program_id_);
- ~IParentalControlService() override;
-
-private:
- bool CheckFreeCommunicationPermissionImpl() const;
- bool ConfirmStereoVisionPermissionImpl() const;
- void SetStereoVisionRestrictionImpl(bool is_restricted);
-
- Result Initialize();
- Result CheckFreeCommunicationPermission();
- Result ConfirmLaunchApplicationPermission(InBuffer<BufferAttr_HipcPointer> restriction_bitset,
- u64 nacp_flag, u64 application_id);
- Result ConfirmResumeApplicationPermission(InBuffer<BufferAttr_HipcPointer> restriction_bitset,
- u64 nacp_flag, u64 application_id);
- Result ConfirmSnsPostPermission();
- Result ConfirmSystemSettingsPermission();
- Result IsRestrictionTemporaryUnlocked(Out<bool> out_is_temporary_unlocked);
- Result IsRestrictedSystemSettingsEntered(Out<bool> out_is_restricted_system_settings_entered);
- Result ConfirmStereoVisionPermission();
- Result EndFreeCommunication();
- Result IsFreeCommunicationAvailable();
- Result IsRestrictionEnabled(Out<bool> out_restriction_enabled);
- Result GetSafetyLevel(Out<u32> out_safety_level);
- Result GetCurrentSettings(Out<RestrictionSettings> out_settings);
- Result GetFreeCommunicationApplicationListCount(Out<s32> out_count);
- Result ConfirmStereoVisionRestrictionConfigurable();
- Result IsStereoVisionPermitted(Out<bool> out_is_permitted);
- Result GetPinCodeLength(Out<s32> out_length);
- Result IsPairingActive(Out<bool> out_is_pairing_active);
- Result GetSynchronizationEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
- Result StartPlayTimer();
- Result StopPlayTimer();
- Result IsPlayTimerEnabled(Out<bool> out_is_play_timer_enabled);
- Result GetPlayTimerRemainingTime(Out<s32> out_remaining_time);
- Result IsRestrictedByPlayTimer(Out<bool> out_is_restricted_by_play_timer);
- Result GetPlayTimerSettingsOld(Out<PlayTimerSettingsOld> out_play_timer_settings);
- Result GetPlayTimerEventToRequestSuspension(OutCopyHandle<Kernel::KReadableEvent> out_event);
- Result IsPlayTimerAlarmDisabled(Out<bool> out_play_timer_alarm_disabled);
- Result GetPlayTimerRemainingTimeDisplayInfo(Out<PlayTimerRemainingTimeDisplayInfo> out_display_info);
- Result Unknown1460(u8 in_unk, Out<PlayTimerRemainingTimeDisplayInfo> out_display_info);
- Result GetUnlinkedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
- Result GetStereoVisionRestriction(Out<bool> out_stereo_vision_restriction);
- Result SetStereoVisionRestriction(bool stereo_vision_restriction);
- Result ResetConfirmedStereoVisionPermission();
- Result GetPlayTimerSettings(Out<PlayTimerSettings> out_play_timer_settings);
- Result SetPlayTimerSettings(PlayTimerSettings out_play_timer_settings);
-
- struct States {
- u64 current_tid{};
- ApplicationInfo application_info{};
- u64 tid_from_event{};
- bool launch_time_valid{};
- bool is_suspended{};
- bool temporary_unlocked{};
- bool free_communication{};
- bool stereo_vision{};
- };
-
- struct ParentalControlSettings {
- bool is_stero_vision_restricted{};
- bool is_free_communication_default_on{};
- bool disabled{};
- };
-
- States states{};
- ParentalControlSettings settings{};
- RestrictionSettings restriction_settings{};
- std::array<char, 8> pin_code{};
- Capability capability{};
- u64 program_id{};
- // TODO: this is raw
- PlayTimerSettings raw_play_timer_settings{};
-
- KernelHelpers::ServiceContext service_context;
- Event synchronization_event;
- Event unlinked_event;
- Event request_suspension_event;
-};
-
-} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/parental_control_service_factory.cpp b/src/core/hle/service/pctl/parental_control_service_factory.cpp
deleted file mode 100644
index ae278a9bbc..0000000000
--- a/src/core/hle/service/pctl/parental_control_service_factory.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/core.h"
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/pctl/parental_control_service.h"
-#include "core/hle/service/pctl/parental_control_service_factory.h"
-
-namespace Service::PCTL {
-
-IParentalControlServiceFactory::IParentalControlServiceFactory(Core::System& system_,
- const char* name_,
- Capability capability_)
- : ServiceFramework{system_, name_}, capability{capability_} {
- static const FunctionInfo functions[] = {
- {0, D<&IParentalControlServiceFactory::CreateService>, "CreateService"},
- {1, D<&IParentalControlServiceFactory::CreateServiceWithoutInitialize>,
- "CreateServiceWithoutInitialize"},
- };
- RegisterHandlers(functions);
-}
-
-IParentalControlServiceFactory::~IParentalControlServiceFactory() = default;
-
-Result IParentalControlServiceFactory::CreateService(
- Out<SharedPointer<IParentalControlService>> out_service, ClientProcessId process_id) {
- LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid);
- *out_service = std::make_shared<IParentalControlService>(
- system, capability, system.ResolveCallerProgramId(*process_id));
- R_SUCCEED();
-}
-
-Result IParentalControlServiceFactory::CreateServiceWithoutInitialize(
- Out<SharedPointer<IParentalControlService>> out_service, ClientProcessId process_id) {
- LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid);
- *out_service = std::make_shared<IParentalControlService>(
- system, capability, system.ResolveCallerProgramId(*process_id));
- R_SUCCEED();
-}
-
-} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/parental_control_service_factory.h b/src/core/hle/service/pctl/parental_control_service_factory.h
deleted file mode 100644
index 362988add1..0000000000
--- a/src/core/hle/service/pctl/parental_control_service_factory.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/pctl/pctl_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::PCTL {
-
-class IParentalControlService;
-
-class IParentalControlServiceFactory : public ServiceFramework<IParentalControlServiceFactory> {
-public:
- explicit IParentalControlServiceFactory(Core::System& system_, const char* name_,
- Capability capability_);
- ~IParentalControlServiceFactory() override;
-
- Result CreateService(Out<SharedPointer<IParentalControlService>> out_service,
- ClientProcessId process_id);
- Result CreateServiceWithoutInitialize(Out<SharedPointer<IParentalControlService>> out_service,
- ClientProcessId process_id);
-
-private:
- Capability capability{};
-};
-
-void LoopProcess(Core::System& system);
-
-} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/pctl.cpp b/src/core/hle/service/pctl/pctl.cpp
index d92dbe2169..4f0fbbe702 100644
--- a/src/core/hle/service/pctl/pctl.cpp
+++ b/src/core/hle/service/pctl/pctl.cpp
@@ -1,27 +1,639 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-#include "core/hle/service/pctl/parental_control_service_factory.h"
+#include "common/common_funcs.h"
+#include "core/file_sys/control_metadata.h"
+#include "core/file_sys/patch_manager.h"
+#include "core/hle/service/cmif_types.h"
#include "core/hle/service/pctl/pctl.h"
#include "core/hle/service/server_manager.h"
+#include "core/hle/service/service.h"
+#include "core/hle/service/cmif_serialization.h"
namespace Service::PCTL {
+constexpr Result ResultNoFreeCommunication{ErrorModule::PCTL, 101};
+constexpr Result ResultStereoVisionRestricted{ErrorModule::PCTL, 104};
+constexpr Result ResultNoCapability{ErrorModule::PCTL, 131};
+constexpr Result ResultNoRestrictionEnabled{ErrorModule::PCTL, 181};
+
+enum class Capability : u32 {
+ None = 0,
+ Application = 1 << 0,
+ SnsPost = 1 << 1,
+ Recovery = 1 << 6,
+ Status = 1 << 8,
+ StereoVision = 1 << 9,
+ System = 1 << 15,
+};
+DECLARE_ENUM_FLAG_OPERATORS(Capability);
+
+struct ApplicationInfo {
+ u64 application_id{};
+ std::array<u8, 32> age_rating{};
+ u32 parental_control_flag{};
+ Capability capability{};
+};
+static_assert(sizeof(ApplicationInfo) == 0x30, "ApplicationInfo has incorrect size.");
+
+// This is nn::pctl::RestrictionSettings
+struct RestrictionSettings {
+ u8 rating_age;
+ bool sns_post_restriction;
+ bool free_communication_restriction;
+};
+static_assert(sizeof(RestrictionSettings) == 0x3, "RestrictionSettings has incorrect size.");
+
+// This is nn::pctl::PlayTimerSettingsOld
+struct PlayTimerSettingsOld {
+ std::array<u32, 13> settings;
+};
+static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size.");
+
+// This is nn::pctl::PlayTimerSettings
+struct PlayTimerSettings {
+ std::array<u32, 17> settings; //21.0.0+ now takes 0x44
+};
+static_assert(sizeof(PlayTimerSettings) == 0x44, "PlayTimerSettings has incorrect size.");
+
+enum class PlayTimerDisplayState : u8 {
+ TimesUp = 0,
+ BedtimeAlarm = 1,
+ RemainingTime = 2,
+ Unknown3 = 3,
+ Unknown4 = 4,
+ Unknown5 = 5,
+ TimerDisabled = 6,
+ NotConfigured = 7,
+};
+
+// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo
+struct PlayTimerRemainingTimeDisplayInfo {
+ PlayTimerDisplayState state;
+ INSERT_PADDING_BYTES(0x7);
+ u64 unknown_08;
+ u64 remaining_time;
+};
+static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18, "PlayTimerRemainingTimeDisplayInfo has incorrect size.");
+
+class IParentalControlService final : public ServiceFramework<IParentalControlService> {
+public:
+ explicit IParentalControlService(Core::System& system_, Capability capability_,
+ u64 program_id_)
+ : ServiceFramework{system_, "IParentalControlService"}, capability{capability_},
+ program_id{program_id_},
+ service_context{system_, "IParentalControlService"}, synchronization_event{service_context},
+ unlinked_event{service_context}, request_suspension_event{service_context} {
+ }
+
+ ~IParentalControlService() override = default;
+
+ bool CheckFreeCommunicationPermissionImpl() const {
+ if (states.temporary_unlocked) {
+ return true;
+ }
+ if ((states.application_info.parental_control_flag & 1) == 0) {
+ return true;
+ }
+ if (pin_code[0] == '\0') {
+ return true;
+ }
+ if (!settings.is_free_communication_default_on) {
+ return true;
+ }
+ // TODO(ogniK): Check for blacklisted/exempted applications. Return false can happen here
+ // but as we don't have multiproceses support yet, we can just assume our application is
+ // valid for the time being
+ return true;
+ }
+
+ bool ConfirmStereoVisionPermissionImpl() const {
+ if (states.temporary_unlocked) {
+ return true;
+ }
+ if (pin_code[0] == '\0') {
+ return true;
+ }
+ if (!settings.is_stero_vision_restricted) {
+ return false;
+ }
+ return true;
+ }
+
+ void SetStereoVisionRestrictionImpl(bool is_restricted) {
+ if (settings.disabled) {
+ return;
+ }
+
+ if (pin_code[0] == '\0') {
+ return;
+ }
+ settings.is_stero_vision_restricted = is_restricted;
+ }
+
+ Result Initialize() {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (False(capability & (Capability::Application | Capability::System))) {
+ LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability);
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ // TODO(ogniK): Recovery flag initialization for pctl:r
+
+ if (program_id != 0) {
+ const FileSys::PatchManager pm{program_id, system.GetFileSystemController(),
+ system.GetContentProvider()};
+ const auto control = pm.GetControlMetadata();
+ if (control.first) {
+ states.tid_from_event = 0;
+ states.launch_time_valid = false;
+ states.is_suspended = false;
+ states.free_communication = false;
+ states.stereo_vision = false;
+ states.application_info = ApplicationInfo{
+ .application_id = program_id,
+ .age_rating = control.first->GetRatingAge(),
+ .parental_control_flag = control.first->GetParentalControlFlag(),
+ .capability = capability,
+ };
+
+ if (False(capability & (Capability::System | Capability::Recovery))) {
+ // TODO(ogniK): Signal application launch event
+ }
+ }
+ }
+
+ R_SUCCEED();
+ }
+
+ Result CheckFreeCommunicationPermission() {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (!CheckFreeCommunicationPermissionImpl()) {
+ R_THROW(PCTL::ResultNoFreeCommunication);
+ } else {
+ states.free_communication = true;
+ R_SUCCEED();
+ }
+ }
+
+ Result ConfirmLaunchApplicationPermission(
+ InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
+ application_id);
+ R_SUCCEED();
+ }
+
+ Result ConfirmResumeApplicationPermission(
+ InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
+ application_id);
+ R_SUCCEED();
+ }
+
+ Result ConfirmSnsPostPermission() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_THROW(PCTL::ResultNoFreeCommunication);
+ }
+
+ Result ConfirmSystemSettingsPermission() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_SUCCEED();
+ }
+
+ Result IsRestrictionTemporaryUnlocked(
+ Out<bool> out_is_temporary_unlocked) {
+ *out_is_temporary_unlocked = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
+ *out_is_temporary_unlocked);
+ R_SUCCEED();
+ }
+
+ Result IsRestrictedSystemSettingsEntered(
+ Out<bool> out_is_restricted_system_settings_entered) {
+ *out_is_restricted_system_settings_entered = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
+ *out_is_restricted_system_settings_entered);
+ R_SUCCEED();
+ }
+
+ Result ConfirmStereoVisionPermission() {
+ LOG_DEBUG(Service_PCTL, "called");
+ states.stereo_vision = true;
+ R_SUCCEED();
+ }
+
+ Result EndFreeCommunication() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_SUCCEED();
+ }
+
+ Result IsFreeCommunicationAvailable() {
+ LOG_DEBUG(Service_PCTL, "(STUBBED) called");
+
+ if (!CheckFreeCommunicationPermissionImpl()) {
+ R_THROW(PCTL::ResultNoFreeCommunication);
+ } else {
+ R_SUCCEED();
+ }
+ }
+
+ Result IsRestrictionEnabled(Out<bool> out_restriction_enabled) {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (False(capability & (Capability::Status | Capability::Recovery))) {
+ LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!");
+ *out_restriction_enabled = false;
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ *out_restriction_enabled = pin_code[0] != '\0';
+ R_SUCCEED();
+ }
+
+ Result GetSafetyLevel(Out<u32> out_safety_level) {
+ *out_safety_level = 0;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level);
+ R_SUCCEED();
+ }
+
+ Result GetCurrentSettings(Out<RestrictionSettings> out_settings) {
+ LOG_INFO(Service_PCTL, "called");
+ *out_settings = restriction_settings;
+ R_SUCCEED();
+ }
+
+ Result GetFreeCommunicationApplicationListCount(Out<s32> out_count) {
+ *out_count = 4;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", *out_count);
+ R_SUCCEED();
+ }
+
+ Result ConfirmStereoVisionRestrictionConfigurable() {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (False(capability & Capability::StereoVision)) {
+ LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ if (pin_code[0] == '\0') {
+ R_THROW(PCTL::ResultNoRestrictionEnabled);
+ }
+
+ R_SUCCEED();
+ }
+
+ Result IsStereoVisionPermitted(Out<bool> out_is_permitted) {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (!ConfirmStereoVisionPermissionImpl()) {
+ *out_is_permitted = false;
+ R_THROW(PCTL::ResultStereoVisionRestricted);
+ } else {
+ *out_is_permitted = true;
+ R_SUCCEED();
+ }
+ }
+
+ Result GetPinCodeLength(Out<s32> out_length) {
+ *out_length = 0;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length);
+ R_SUCCEED();
+ }
+
+ Result IsPairingActive(Out<bool> out_is_pairing_active) {
+ *out_is_pairing_active = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", *out_is_pairing_active);
+ R_SUCCEED();
+ }
+
+ Result GetSynchronizationEvent(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_PCTL, "called");
+ *out_event = synchronization_event.GetHandle();
+ R_SUCCEED();
+ }
+
+ Result StartPlayTimer() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_SUCCEED();
+ }
+
+ Result StopPlayTimer() {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ R_SUCCEED();
+ }
+
+ Result IsPlayTimerEnabled(Out<bool> out_is_play_timer_enabled) {
+ *out_is_play_timer_enabled = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, enabled={}", *out_is_play_timer_enabled);
+ R_SUCCEED();
+ }
+
+ Result GetPlayTimerRemainingTime(Out<s32> out_remaining_time) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ *out_remaining_time = std::numeric_limits<s32>::max();
+ R_SUCCEED();
+ }
+
+ Result IsRestrictedByPlayTimer(Out<bool> out_is_restricted_by_play_timer) {
+ *out_is_restricted_by_play_timer = false;
+ LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer);
+ R_SUCCEED();
+ }
+
+ Result GetPlayTimerSettingsOld(
+ Out<PlayTimerSettingsOld> out_play_timer_settings) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ *out_play_timer_settings = {};
+ R_SUCCEED();
+ }
+
+ Result GetPlayTimerSettings(Out<PlayTimerSettings> out_play_timer_settings) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ *out_play_timer_settings = raw_play_timer_settings;
+ R_SUCCEED();
+ }
+
+ Result SetPlayTimerSettings(PlayTimerSettings play_timer_settings) {
+ LOG_WARNING(Service_PCTL, "(STUBBED) called");
+ raw_play_timer_settings = play_timer_settings;
+ R_SUCCEED();
+ }
+
+ Result GetPlayTimerEventToRequestSuspension(
+ OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_PCTL, "called");
+ *out_event = request_suspension_event.GetHandle();
+ R_SUCCEED();
+ }
+
+ Result IsPlayTimerAlarmDisabled(Out<bool> out_play_timer_alarm_disabled) {
+ *out_play_timer_alarm_disabled = false;
+ LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}",
+ *out_play_timer_alarm_disabled);
+ R_SUCCEED();
+ }
+
+ Result GetPlayTimerRemainingTimeDisplayInfo(Out<PlayTimerRemainingTimeDisplayInfo> out_display_info) {
+ LOG_DEBUG(Service_PCTL, "called");
+ *out_display_info = {.state = PlayTimerDisplayState::NotConfigured};
+ R_SUCCEED();
+ }
+
+ Result Unknown1460(u8 in_unk, Out<PlayTimerRemainingTimeDisplayInfo> out_display_info) {
+ LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk);
+ *out_display_info = {.state = PlayTimerDisplayState::NotConfigured};
+ R_SUCCEED();
+ }
+
+ Result GetUnlinkedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_PCTL, "called");
+ *out_event = unlinked_event.GetHandle();
+ R_SUCCEED();
+ }
+
+ Result GetStereoVisionRestriction(
+ Out<bool> out_stereo_vision_restriction) {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ if (False(capability & Capability::StereoVision)) {
+ LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
+ *out_stereo_vision_restriction = false;
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ *out_stereo_vision_restriction = settings.is_stero_vision_restricted;
+ R_SUCCEED();
+ }
+
+ Result SetStereoVisionRestriction(bool stereo_vision_restriction) {
+ LOG_DEBUG(Service_PCTL, "called, can_use={}", stereo_vision_restriction);
+
+ if (False(capability & Capability::StereoVision)) {
+ LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
+ R_THROW(PCTL::ResultNoCapability);
+ }
+
+ SetStereoVisionRestrictionImpl(stereo_vision_restriction);
+ R_SUCCEED();
+ }
+
+ Result ResetConfirmedStereoVisionPermission() {
+ LOG_DEBUG(Service_PCTL, "called");
+
+ states.stereo_vision = false;
+
+ R_SUCCEED();
+ }
+
+ struct States {
+ u64 current_tid{};
+ ApplicationInfo application_info{};
+ u64 tid_from_event{};
+ bool launch_time_valid{};
+ bool is_suspended{};
+ bool temporary_unlocked{};
+ bool free_communication{};
+ bool stereo_vision{};
+ };
+
+ struct ParentalControlSettings {
+ bool is_stero_vision_restricted{};
+ bool is_free_communication_default_on{};
+ bool disabled{};
+ };
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, D<&IParentalControlService::Initialize>, "Initialize"},
+ FunctionInfo{1001, D<&IParentalControlService::CheckFreeCommunicationPermission>, "CheckFreeCommunicationPermission"},
+ FunctionInfo{1002, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
+ FunctionInfo{1003, D<&IParentalControlService::ConfirmResumeApplicationPermission>, "ConfirmResumeApplicationPermission"},
+ FunctionInfo{1004, D<&IParentalControlService::ConfirmSnsPostPermission>, "ConfirmSnsPostPermission"},
+ FunctionInfo{1005, D<&IParentalControlService::ConfirmSystemSettingsPermission>, "ConfirmSystemSettingsPermission"},
+ FunctionInfo{1006, D<&IParentalControlService::IsRestrictionTemporaryUnlocked>, "IsRestrictionTemporaryUnlocked"},
+ FunctionInfo{1007, nullptr, "RevertRestrictionTemporaryUnlocked"},
+ FunctionInfo{1008, nullptr, "EnterRestrictedSystemSettings"},
+ FunctionInfo{1009, nullptr, "LeaveRestrictedSystemSettings"},
+ FunctionInfo{1010, D<&IParentalControlService::IsRestrictedSystemSettingsEntered>, "IsRestrictedSystemSettingsEntered"},
+ FunctionInfo{1011, nullptr, "RevertRestrictedSystemSettingsEntered"},
+ FunctionInfo{1012, nullptr, "GetRestrictedFeatures"},
+ FunctionInfo{1013, D<&IParentalControlService::ConfirmStereoVisionPermission>, "ConfirmStereoVisionPermission"},
+ FunctionInfo{1014, nullptr, "ConfirmPlayableApplicationVideoOld"},
+ FunctionInfo{1015, nullptr, "ConfirmPlayableApplicationVideo"},
+ FunctionInfo{1016, nullptr, "ConfirmShowNewsPermission"},
+ FunctionInfo{1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"},
+ FunctionInfo{1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"},
+ FunctionInfo{1019, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
+ FunctionInfo{1020, nullptr, "ConfirmLaunchSharedApplicationPermission", MakeVersionGate({20,0,0})},
+ FunctionInfo{1021, nullptr, "TryBeginFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})},
+ FunctionInfo{1022, nullptr, "EndFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})},
+ FunctionInfo{1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"},
+ FunctionInfo{1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"},
+ FunctionInfo{1033, nullptr, "SetSafetyLevel"},
+ FunctionInfo{1034, nullptr, "GetSafetyLevelSettings"},
+ FunctionInfo{1035, D<&IParentalControlService::GetCurrentSettings>, "GetCurrentSettings"},
+ FunctionInfo{1036, nullptr, "SetCustomSafetyLevelSettings"},
+ FunctionInfo{1037, nullptr, "GetDefaultRatingOrganization"},
+ FunctionInfo{1038, nullptr, "SetDefaultRatingOrganization"},
+ FunctionInfo{1039, D<&IParentalControlService::GetFreeCommunicationApplicationListCount>, "GetFreeCommunicationApplicationListCount"},
+ FunctionInfo{1042, nullptr, "AddToFreeCommunicationApplicationList"},
+ FunctionInfo{1043, nullptr, "DeleteSettings"},
+ FunctionInfo{1044, nullptr, "GetFreeCommunicationApplicationList"},
+ FunctionInfo{1045, nullptr, "UpdateFreeCommunicationApplicationList"},
+ FunctionInfo{1046, nullptr, "DisableFeaturesForReset"},
+ FunctionInfo{1047, nullptr, "NotifyApplicationDownloadStarted"},
+ FunctionInfo{1048, nullptr, "NotifyNetworkProfileCreated"},
+ FunctionInfo{1049, nullptr, "ResetFreeCommunicationApplicationList"},
+ FunctionInfo{1050, nullptr, "AddToFreeCommunicationApplicationList", MakeVersionGate({20,0,0})},
+ FunctionInfo{1051, nullptr, "NotifyApplicationDownloadStarted", MakeVersionGate({20,0,0})},
+ FunctionInfo{1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"},
+ FunctionInfo{1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"},
+ FunctionInfo{1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"},
+ FunctionInfo{1064, D<&IParentalControlService::ResetConfirmedStereoVisionPermission>, "ResetConfirmedStereoVisionPermission"},
+ FunctionInfo{1065, D<&IParentalControlService::IsStereoVisionPermitted>, "IsStereoVisionPermitted"},
+ FunctionInfo{1201, nullptr, "UnlockRestrictionTemporarily"},
+ FunctionInfo{1202, nullptr, "UnlockSystemSettingsRestriction"},
+ FunctionInfo{1203, nullptr, "SetPinCode"},
+ FunctionInfo{1204, nullptr, "GenerateInquiryCode"},
+ FunctionInfo{1205, nullptr, "CheckMasterKey"},
+ FunctionInfo{1206, D<&IParentalControlService::GetPinCodeLength>, "GetPinCodeLength"},
+ FunctionInfo{1207, nullptr, "GetPinCodeChangedEvent"},
+ FunctionInfo{1208, nullptr, "GetPinCode"},
+ FunctionInfo{1403, D<&IParentalControlService::IsPairingActive>, "IsPairingActive"},
+ FunctionInfo{1406, nullptr, "GetSettingsLastUpdated"},
+ FunctionInfo{1411, nullptr, "GetPairingAccountInfo"},
+ FunctionInfo{1421, nullptr, "GetAccountNickname"},
+ FunctionInfo{1424, nullptr, "GetAccountState"},
+ FunctionInfo{1425, nullptr, "RequestPostEvents"},
+ FunctionInfo{1426, nullptr, "GetPostEventInterval"},
+ FunctionInfo{1427, nullptr, "SetPostEventInterval"},
+ FunctionInfo{1432, D<&IParentalControlService::GetSynchronizationEvent>, "GetSynchronizationEvent"},
+ FunctionInfo{1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"},
+ FunctionInfo{1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"},
+ FunctionInfo{1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"},
+ FunctionInfo{1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"},
+ FunctionInfo{1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"},
+ FunctionInfo{1456, D<&IParentalControlService::GetPlayTimerSettingsOld>, "GetPlayTimerSettingsOld"},
+ FunctionInfo{1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"},
+ FunctionInfo{1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"},
+ FunctionInfo{1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"},
+ FunctionInfo{1460, D<&IParentalControlService::Unknown1460>, "Unknown1460"},
+ FunctionInfo{1471, nullptr, "NotifyWrongPinCodeInputManyTimes"},
+ FunctionInfo{1472, nullptr, "CancelNetworkRequest"},
+ FunctionInfo{1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"},
+ FunctionInfo{1474, nullptr, "ClearUnlinkedEvent"},
+ FunctionInfo{1475, nullptr, "GetExtendedPlayTimerEvent", MakeVersionGate({18,0,0})},
+ FunctionInfo{1601, nullptr, "DisableAllFeatures"},
+ FunctionInfo{1602, nullptr, "PostEnableAllFeatures"},
+ FunctionInfo{1603, nullptr, "IsAllFeaturesDisabled"},
+ FunctionInfo{1901, nullptr, "DeleteFromFreeCommunicationApplicationListForDebug"},
+ FunctionInfo{1902, nullptr, "ClearFreeCommunicationApplicationListForDebug"},
+ FunctionInfo{1903, nullptr, "GetExemptApplicationListCountForDebug"},
+ FunctionInfo{1904, nullptr, "GetExemptApplicationListForDebug"},
+ FunctionInfo{1905, nullptr, "UpdateExemptApplicationListForDebug"},
+ FunctionInfo{1906, nullptr, "AddToExemptApplicationListForDebug"},
+ FunctionInfo{1907, nullptr, "DeleteFromExemptApplicationListForDebug"},
+ FunctionInfo{1908, nullptr, "ClearExemptApplicationListForDebug"},
+ FunctionInfo{1941, nullptr, "DeletePairing"},
+ FunctionInfo{1951, nullptr, "SetPlayTimerSettingsForDebug"},
+ FunctionInfo{1952, nullptr, "GetPlayTimerSpentTimeForTest"},
+ FunctionInfo{1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"},
+ FunctionInfo{1954, nullptr, "IsBedtimeAlarmEnabled", MakeVersionGate({18,0,0})},
+ FunctionInfo{1955, nullptr, "GetBedtimeAlarmTime", MakeVersionGate({18,0,0})},
+ FunctionInfo{1956, nullptr, "GetBedtimeAlarmTimeHour", MakeVersionGate({18,0,0})},
+ FunctionInfo{1957, nullptr, "GetBedtimeAlarmTimeMinute", MakeVersionGate({18,0,0})},
+ FunctionInfo{2001, nullptr, "RequestPairingAsync"},
+ FunctionInfo{2002, nullptr, "FinishRequestPairing"},
+ FunctionInfo{2003, nullptr, "AuthorizePairingAsync"},
+ FunctionInfo{2004, nullptr, "FinishAuthorizePairing"},
+ FunctionInfo{2005, nullptr, "RetrievePairingInfoAsync"},
+ FunctionInfo{2006, nullptr, "FinishRetrievePairingInfo"},
+ FunctionInfo{2007, nullptr, "UnlinkPairingAsync"},
+ FunctionInfo{2008, nullptr, "FinishUnlinkPairing"},
+ FunctionInfo{2009, nullptr, "GetAccountMiiImageAsync"},
+ FunctionInfo{2010, nullptr, "FinishGetAccountMiiImage"},
+ FunctionInfo{2011, nullptr, "GetAccountMiiImageContentTypeAsync"},
+ FunctionInfo{2012, nullptr, "FinishGetAccountMiiImageContentType"},
+ FunctionInfo{2013, nullptr, "SynchronizeParentalControlSettingsAsync"},
+ FunctionInfo{2014, nullptr, "FinishSynchronizeParentalControlSettings"},
+ FunctionInfo{2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"},
+ FunctionInfo{2016, nullptr, "RequestUpdateExemptionListAsync", MakeVersionGate({5,0,0})},
+ FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})},
+ FunctionInfo{2017, nullptr, "AuthorizePairingAsync", MakeVersionGate({19,0,0})},
+ FunctionInfo{2019, nullptr, "RequestUpdateDeviceUsersBackground", MakeVersionGate({19,0,0})},
+ FunctionInfo{2021, nullptr, "RequestCopyPairingAsync", MakeVersionGate({20,0,0})},
+ FunctionInfo{2022, nullptr, "FinishRequestCopyPairing", MakeVersionGate({20,0,0})},
+ FunctionInfo{2023, nullptr, "IsFromPairingActiveDevice", MakeVersionGate({20,0,0})},
+ FunctionInfo{2024, nullptr, "RollbackCopyPairing", MakeVersionGate({21,0,0})},
+ FunctionInfo{3001, nullptr, "GetErrorContextChangedEvent", MakeVersionGate({20,0,0})},
+ FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})},
+ FunctionInfo{195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug", MakeVersionGate({18,0,0})}
+ );
+ States states{};
+ ParentalControlSettings settings{};
+ RestrictionSettings restriction_settings{};
+ std::array<char, 8> pin_code{};
+ Capability capability{};
+ u64 program_id{};
+ // TODO: this is raw
+ PlayTimerSettings raw_play_timer_settings{};
+
+ KernelHelpers::ServiceContext service_context;
+ Event synchronization_event;
+ Event unlinked_event;
+ Event request_suspension_event;
+};
+
+class IParentalControlServiceFactory : public ServiceFramework<IParentalControlServiceFactory> {
+public:
+ explicit IParentalControlServiceFactory(Core::System& system_, const char* name_, Capability capability_)
+ : ServiceFramework{system_, name_}, capability{capability_}
+ {}
+
+ ~IParentalControlServiceFactory() override = default;
+
+ Result CreateService(Out<SharedPointer<IParentalControlService>> out_service, ClientProcessId process_id) {
+ LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid);
+ *out_service = std::make_shared<IParentalControlService>(
+ system, capability, system.ResolveCallerProgramId(*process_id));
+ R_SUCCEED();
+ }
+
+ Result CreateServiceWithoutInitialize(Out<SharedPointer<IParentalControlService>> out_service, ClientProcessId process_id) {
+ LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid);
+ *out_service = std::make_shared<IParentalControlService>(
+ system, capability, system.ResolveCallerProgramId(*process_id));
+ R_SUCCEED();
+ }
+
+private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IParentalControlServiceFactory::CreateService>, "CreateService"},
+ FunctionInfo{1, D<&IParentalControlServiceFactory::CreateServiceWithoutInitialize>, "CreateServiceWithoutInitialize"}
+ );
+ Capability capability{};
+};
+
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
- server_manager->RegisterNamedService("pctl",
- std::make_shared<IParentalControlServiceFactory>(
- system, "pctl",
- Capability::Application | Capability::SnsPost |
- Capability::Status | Capability::StereoVision));
+ server_manager->RegisterNamedService("pctl", std::make_shared<IParentalControlServiceFactory>(system, "pctl", Capability::Application | Capability::SnsPost | Capability::Status | Capability::StereoVision));
// TODO(ogniK): Implement remaining capabilities
- server_manager->RegisterNamedService("pctl:a", std::make_shared<IParentalControlServiceFactory>(
- system, "pctl:a", Capability::None));
- server_manager->RegisterNamedService("pctl:r", std::make_shared<IParentalControlServiceFactory>(
- system, "pctl:r", Capability::None));
- server_manager->RegisterNamedService("pctl:s", std::make_shared<IParentalControlServiceFactory>(
- system, "pctl:s", Capability::None));
+ server_manager->RegisterNamedService("pctl:a", std::make_shared<IParentalControlServiceFactory>(system, "pctl:a", Capability::None));
+ server_manager->RegisterNamedService("pctl:r", std::make_shared<IParentalControlServiceFactory>(system, "pctl:r", Capability::None));
+ server_manager->RegisterNamedService("pctl:s", std::make_shared<IParentalControlServiceFactory>(system, "pctl:s", Capability::None));
ServerManager::RunServer(std::move(server_manager));
}
diff --git a/src/core/hle/service/pctl/pctl_results.h b/src/core/hle/service/pctl/pctl_results.h
deleted file mode 100644
index 1fc54727b7..0000000000
--- a/src/core/hle/service/pctl/pctl_results.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/result.h"
-
-namespace Service::PCTL {
-
-constexpr Result ResultNoFreeCommunication{ErrorModule::PCTL, 101};
-constexpr Result ResultStereoVisionRestricted{ErrorModule::PCTL, 104};
-constexpr Result ResultNoCapability{ErrorModule::PCTL, 131};
-constexpr Result ResultNoRestrictionEnabled{ErrorModule::PCTL, 181};
-
-} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/pctl_types.h b/src/core/hle/service/pctl/pctl_types.h
deleted file mode 100644
index 3a5a19099d..0000000000
--- a/src/core/hle/service/pctl/pctl_types.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "common/common_funcs.h"
-
-namespace Service::PCTL {
-
-enum class Capability : u32 {
- None = 0,
- Application = 1 << 0,
- SnsPost = 1 << 1,
- Recovery = 1 << 6,
- Status = 1 << 8,
- StereoVision = 1 << 9,
- System = 1 << 15,
-};
-DECLARE_ENUM_FLAG_OPERATORS(Capability);
-
-struct ApplicationInfo {
- u64 application_id{};
- std::array<u8, 32> age_rating{};
- u32 parental_control_flag{};
- Capability capability{};
-};
-static_assert(sizeof(ApplicationInfo) == 0x30, "ApplicationInfo has incorrect size.");
-
-// This is nn::pctl::RestrictionSettings
-struct RestrictionSettings {
- u8 rating_age;
- bool sns_post_restriction;
- bool free_communication_restriction;
-};
-static_assert(sizeof(RestrictionSettings) == 0x3, "RestrictionSettings has incorrect size.");
-
-// This is nn::pctl::PlayTimerSettingsOld
-struct PlayTimerSettingsOld {
- std::array<u32, 13> settings;
-};
-static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size.");
-
-// This is nn::pctl::PlayTimerSettings
-struct PlayTimerSettings {
- std::array<u32, 17> settings; //21.0.0+ now takes 0x44
-};
-static_assert(sizeof(PlayTimerSettings) == 0x44, "PlayTimerSettings has incorrect size.");
-
-enum class PlayTimerDisplayState : u8 {
- TimesUp = 0,
- BedtimeAlarm = 1,
- RemainingTime = 2,
- Unknown3 = 3,
- Unknown4 = 4,
- Unknown5 = 5,
- TimerDisabled = 6,
- NotConfigured = 7,
-};
-
-// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo
-struct PlayTimerRemainingTimeDisplayInfo {
- PlayTimerDisplayState state;
- INSERT_PADDING_BYTES(0x7);
- u64 unknown_08;
- u64 remaining_time;
-};
-static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18,
- "PlayTimerRemainingTimeDisplayInfo has incorrect size.");
-
-} // namespace Service::PCTL
diff --git a/src/core/hle/service/pcv/pcv.cpp b/src/core/hle/service/pcv/pcv.cpp
index 1b314f3518..bb3d748527 100644
--- a/src/core/hle/service/pcv/pcv.cpp
+++ b/src/core/hle/service/pcv/pcv.cpp
@@ -15,91 +15,76 @@ namespace Service::PCV {
class PCV final : public ServiceFramework<PCV> {
public:
- explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetPowerEnabled"},
- {1, nullptr, "SetClockEnabled"},
- {2, nullptr, "SetClockRate"},
- {3, nullptr, "GetClockRate"},
- {4, nullptr, "GetState"},
- {5, nullptr, "GetPossibleClockRates"},
- {6, nullptr, "SetMinVClockRate"},
- {7, nullptr, "SetReset"},
- {8, nullptr, "SetVoltageEnabled"},
- {9, nullptr, "GetVoltageEnabled"},
- {10, nullptr, "GetVoltageRange"},
- {11, nullptr, "SetVoltageValue"},
- {12, nullptr, "GetVoltageValue"},
- {13, nullptr, "GetTemperatureThresholds"},
- {14, nullptr, "SetTemperature"},
- {15, nullptr, "Initialize"},
- {16, nullptr, "IsInitialized"},
- {17, nullptr, "Finalize"},
- {18, nullptr, "PowerOn"},
- {19, nullptr, "PowerOff"},
- {20, nullptr, "ChangeVoltage"},
- {21, nullptr, "GetPowerClockInfoEvent"},
- {22, nullptr, "GetOscillatorClock"},
- {23, nullptr, "GetDvfsTable"},
- {24, nullptr, "GetModuleStateTable"},
- {25, nullptr, "GetPowerDomainStateTable"},
- {26, nullptr, "GetFuseInfo"},
- {27, nullptr, "GetDramId"},
- {28, nullptr, "IsPoweredOn"},
- {29, nullptr, "GetVoltage"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetPowerEnabled"},
+ FunctionInfo{1, nullptr, "SetClockEnabled"},
+ FunctionInfo{2, nullptr, "SetClockRate"},
+ FunctionInfo{3, nullptr, "GetClockRate"},
+ FunctionInfo{4, nullptr, "GetState"},
+ FunctionInfo{5, nullptr, "GetPossibleClockRates"},
+ FunctionInfo{6, nullptr, "SetMinVClockRate"},
+ FunctionInfo{7, nullptr, "SetReset"},
+ FunctionInfo{8, nullptr, "SetVoltageEnabled"},
+ FunctionInfo{9, nullptr, "GetVoltageEnabled"},
+ FunctionInfo{10, nullptr, "GetVoltageRange"},
+ FunctionInfo{11, nullptr, "SetVoltageValue"},
+ FunctionInfo{12, nullptr, "GetVoltageValue"},
+ FunctionInfo{13, nullptr, "GetTemperatureThresholds"},
+ FunctionInfo{14, nullptr, "SetTemperature"},
+ FunctionInfo{15, nullptr, "Initialize"},
+ FunctionInfo{16, nullptr, "IsInitialized"},
+ FunctionInfo{17, nullptr, "Finalize"},
+ FunctionInfo{18, nullptr, "PowerOn"},
+ FunctionInfo{19, nullptr, "PowerOff"},
+ FunctionInfo{20, nullptr, "ChangeVoltage"},
+ FunctionInfo{21, nullptr, "GetPowerClockInfoEvent"},
+ FunctionInfo{22, nullptr, "GetOscillatorClock"},
+ FunctionInfo{23, nullptr, "GetDvfsTable"},
+ FunctionInfo{24, nullptr, "GetModuleStateTable"},
+ FunctionInfo{25, nullptr, "GetPowerDomainStateTable"},
+ FunctionInfo{26, nullptr, "GetFuseInfo"},
+ FunctionInfo{27, nullptr, "GetDramId"},
+ FunctionInfo{28, nullptr, "IsPoweredOn"},
+ FunctionInfo{29, nullptr, "GetVoltage"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class PCV_ARB final : public ServiceFramework<PCV_ARB> {
public:
- explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "ReleaseControl"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "ReleaseControl"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class PCV_IMM final : public ServiceFramework<PCV_IMM> {
public:
- explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetClockRate"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetClockRate"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IClkrstSession final : public ServiceFramework<IClkrstSession> {
public:
explicit IClkrstSession(Core::System& system_, DeviceCode device_code_)
- : ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetClockEnabled"},
- {1, nullptr, "SetClockDisabled"},
- {2, nullptr, "SetResetAsserted"},
- {3, nullptr, "SetResetDeasserted"},
- {4, nullptr, "SetPowerEnabled"},
- {5, nullptr, "SetPowerDisabled"},
- {6, nullptr, "GetState"},
- {7, &IClkrstSession::SetClockRate, "SetClockRate"},
- {8, &IClkrstSession::GetClockRate, "GetClockRate"},
- {9, nullptr, "SetMinVClockRate"},
- {10, nullptr, "GetPossibleClockRates"},
- {11, nullptr, "GetDvfsTable"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -120,25 +105,30 @@ private:
rb.Push<u32>(clock_rate);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetClockEnabled"},
+ FunctionInfo{1, nullptr, "SetClockDisabled"},
+ FunctionInfo{2, nullptr, "SetResetAsserted"},
+ FunctionInfo{3, nullptr, "SetResetDeasserted"},
+ FunctionInfo{4, nullptr, "SetPowerEnabled"},
+ FunctionInfo{5, nullptr, "SetPowerDisabled"},
+ FunctionInfo{6, nullptr, "GetState"},
+ FunctionInfo{7, &IClkrstSession::SetClockRate, "SetClockRate"},
+ FunctionInfo{8, &IClkrstSession::GetClockRate, "GetClockRate"},
+ FunctionInfo{9, nullptr, "SetMinVClockRate"},
+ FunctionInfo{10, nullptr, "GetPossibleClockRates"},
+ FunctionInfo{11, nullptr, "GetDvfsTable"}
+ );
DeviceCode device_code;
u32 clock_rate{};
};
class CLKRST final : public ServiceFramework<CLKRST> {
public:
- explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &CLKRST::OpenSession, "OpenSession"},
- {1, nullptr, "GetTemperatureThresholds"},
- {2, nullptr, "SetTemperature"},
- {3, nullptr, "GetModuleStateTable"},
- {4, nullptr, "GetModuleStateTableEvent"},
- {5, nullptr, "GetModuleStateTableMaxCount"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -153,18 +143,26 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IClkrstSession>(ctx, system, device_code);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &CLKRST::OpenSession, "OpenSession"},
+ FunctionInfo{1, nullptr, "GetTemperatureThresholds"},
+ FunctionInfo{2, nullptr, "SetTemperature"},
+ FunctionInfo{3, nullptr, "GetModuleStateTable"},
+ FunctionInfo{4, nullptr, "GetModuleStateTableEvent"},
+ FunctionInfo{5, nullptr, "GetModuleStateTableMaxCount"}
+ );
};
class CLKRST_A final : public ServiceFramework<CLKRST_A> {
public:
- explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "ReleaseControl"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "ReleaseControl"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp
index ff7053b690..3d431c305f 100644
--- a/src/core/hle/service/pm/pm.cpp
+++ b/src/core/hle/service/pm/pm.cpp
@@ -47,13 +47,7 @@ void GetApplicationPidGeneric(Kernel::KernelCore& kernel, HLERequestContext& ctx
class BootMode final : public ServiceFramework<BootMode> {
public:
- explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} {
- static const FunctionInfo functions[] = {
- {0, &BootMode::GetBootMode, "GetBootMode"},
- {1, &BootMode::SetMaintenanceBoot, "SetMaintenanceBoot"},
- };
- RegisterHandlers(functions);
- }
+ explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} {}
private:
void GetBootMode(HLERequestContext& ctx) {
@@ -73,28 +67,19 @@ private:
rb.Push(ResultSuccess);
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &BootMode::GetBootMode, "GetBootMode"},
+ FunctionInfo{1, &BootMode::SetMaintenanceBoot, "SetMaintenanceBoot"}
+ );
SystemBootMode boot_mode = SystemBootMode::Normal;
};
class DebugMonitor final : public ServiceFramework<DebugMonitor> {
public:
- explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "pm:dmnt"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetJitDebugProcessIdList"},
- {1, nullptr, "StartProcess"},
- {2, &DebugMonitor::GetProcessId, "GetProcessId"},
- {3, nullptr, "HookToCreateProcess"},
- {4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"},
- {5, nullptr, "HookToCreateApplicationProgress"},
- {6, nullptr, "ClearHook"},
- {65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"},
- {65001, nullptr, "AtmosphereGetCurrentLimitInfo"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
- }
+ explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "pm:dmnt"} {}
private:
void GetProcessId(HLERequestContext& ctx) {
@@ -164,19 +149,26 @@ private:
rb.PushRaw(program_location);
rb.PushRaw(override_status);
}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetJitDebugProcessIdList"},
+ FunctionInfo{1, nullptr, "StartProcess"},
+ FunctionInfo{2, &DebugMonitor::GetProcessId, "GetProcessId"},
+ FunctionInfo{3, nullptr, "HookToCreateProcess"},
+ FunctionInfo{4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"},
+ FunctionInfo{5, nullptr, "HookToCreateApplicationProgress"},
+ FunctionInfo{6, nullptr, "ClearHook"},
+ FunctionInfo{65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"},
+ FunctionInfo{65001, nullptr, "AtmosphereGetCurrentLimitInfo"}
+ );
};
class Info final : public ServiceFramework<Info> {
public:
- explicit Info(Core::System& system_) : ServiceFramework{system_, "pm:info"} {
- static const FunctionInfo functions[] = {
- {0, &Info::GetProgramId, "GetProgramId"},
- {65000, &Info::AtmosphereGetProcessId, "AtmosphereGetProcessId"},
- {65001, nullptr, "AtmosphereHasLaunchedProgram"},
- {65002, nullptr, "AtmosphereGetProcessInfo"},
- };
- RegisterHandlers(functions);
- }
+ explicit Info(Core::System& system_) : ServiceFramework{system_, "pm:info"} {}
private:
void GetProgramId(HLERequestContext& ctx) {
@@ -218,27 +210,24 @@ private:
rb.Push(ResultSuccess);
rb.Push(process->GetProcessId());
}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &Info::GetProgramId, "GetProgramId"},
+ FunctionInfo{65000, &Info::AtmosphereGetProcessId, "AtmosphereGetProcessId"},
+ FunctionInfo{65001, nullptr, "AtmosphereHasLaunchedProgram"},
+ FunctionInfo{65002, nullptr, "AtmosphereGetProcessInfo"}
+ );
};
class Shell final : public ServiceFramework<Shell> {
public:
- explicit Shell(Core::System& system_) : ServiceFramework{system_, "pm:shell"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "LaunchProgram"},
- {1, nullptr, "TerminateProcess"},
- {2, nullptr, "TerminateProgram"},
- {3, nullptr, "GetProcessEventHandle"},
- {4, nullptr, "GetProcessEventInfo"},
- {5, nullptr, "NotifyBootFinished"},
- {6, &Shell::GetApplicationProcessIdForShell, "GetApplicationProcessIdForShell"},
- {7, nullptr, "BoostSystemMemoryResourceLimit"},
- {8, nullptr, "BoostApplicationThreadResourceLimit"},
- {9, nullptr, "GetBootFinishedEventHandle"},
- };
- // clang-format on
+ explicit Shell(Core::System& system_) : ServiceFramework{system_, "pm:shell"} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -247,6 +236,19 @@ private:
auto list = kernel.GetProcessList();
GetApplicationPidGeneric(system.Kernel(), ctx, list);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "LaunchProgram"},
+ FunctionInfo{1, nullptr, "TerminateProcess"},
+ FunctionInfo{2, nullptr, "TerminateProgram"},
+ FunctionInfo{3, nullptr, "GetProcessEventHandle"},
+ FunctionInfo{4, nullptr, "GetProcessEventInfo"},
+ FunctionInfo{5, nullptr, "NotifyBootFinished"},
+ FunctionInfo{6, &Shell::GetApplicationProcessIdForShell, "GetApplicationProcessIdForShell"},
+ FunctionInfo{7, nullptr, "BoostSystemMemoryResourceLimit"},
+ FunctionInfo{8, nullptr, "BoostApplicationThreadResourceLimit"},
+ FunctionInfo{9, nullptr, "GetBootFinishedEventHandle"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp
index e76c3ea93c..a199c41d2c 100644
--- a/src/core/hle/service/prepo/prepo.cpp
+++ b/src/core/hle/service/prepo/prepo.cpp
@@ -21,45 +21,10 @@ namespace Service::PlayReport {
class PlayReport final : public ServiceFramework<PlayReport> {
public:
- explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {10100, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old>, "SaveReportOld"},
- {10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"},
- {10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"},
- {10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"},
- {10104, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old3>, "SaveReportOld3"},
- {10105, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old3>, "SaveReportWithUserOld3"},
- {10106, &PlayReport::SaveReport<Core::Reporter::PlayReportType::New>, "SaveReport"},
- {10107, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::New>, "SaveReportWithUser"},
- {10200, &PlayReport::RequestImmediateTransmission, "RequestImmediateTransmission"},
- {10300, &PlayReport::GetTransmissionStatus, "GetTransmissionStatus"},
- {10400, &PlayReport::GetSystemSessionId, "GetSystemSessionId"},
- {20100, &PlayReport::SaveSystemReportOld, "SaveSystemReport"},
- {20101, &PlayReport::SaveSystemReportWithUserOld, "SaveSystemReportWithUser"},
- {20102, &PlayReport::SaveSystemReport, "SaveSystemReport"},
- {20103, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"},
- {20200, nullptr, "SetOperationMode"},
- {30100, nullptr, "ClearStorage"},
- {30200, nullptr, "ClearStatistics"},
- {30300, nullptr, "GetStorageUsage"},
- {30400, nullptr, "GetStatistics"},
- {30401, nullptr, "GetThroughputHistory"},
- {30500, nullptr, "GetLastUploadError"},
- {30600, nullptr, "GetApplicationUploadSummary"},
- {40100, nullptr, "IsUserAgreementCheckEnabled"},
- {40101, nullptr, "SetUserAgreementCheckEnabled"},
- {50100, nullptr, "ReadAllApplicationReportFiles"},
- {90100, nullptr, "ReadAllReportFiles"},
- {90101, nullptr, "Unknown90101"},
- {90102, nullptr, "Unknown90102"},
- {90200, nullptr, "GetStatistics"},
- {90201, nullptr, "GetThroughputHistory"},
- {90300, nullptr, "GetLastUploadError"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -214,21 +179,51 @@ private:
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{10100, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old>, "SaveReportOld"},
+ FunctionInfo{10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"},
+ FunctionInfo{10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"},
+ FunctionInfo{10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"},
+ FunctionInfo{10104, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old3>, "SaveReportOld3"},
+ FunctionInfo{10105, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old3>, "SaveReportWithUserOld3"},
+ FunctionInfo{10106, &PlayReport::SaveReport<Core::Reporter::PlayReportType::New>, "SaveReport"},
+ FunctionInfo{10107, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::New>, "SaveReportWithUser"},
+ FunctionInfo{10200, &PlayReport::RequestImmediateTransmission, "RequestImmediateTransmission"},
+ FunctionInfo{10300, &PlayReport::GetTransmissionStatus, "GetTransmissionStatus"},
+ FunctionInfo{10400, &PlayReport::GetSystemSessionId, "GetSystemSessionId"},
+ FunctionInfo{20100, &PlayReport::SaveSystemReportOld, "SaveSystemReport"},
+ FunctionInfo{20101, &PlayReport::SaveSystemReportWithUserOld, "SaveSystemReportWithUser"},
+ FunctionInfo{20102, &PlayReport::SaveSystemReport, "SaveSystemReport"},
+ FunctionInfo{20103, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"},
+ FunctionInfo{20200, nullptr, "SetOperationMode"},
+ FunctionInfo{30100, nullptr, "ClearStorage"},
+ FunctionInfo{30200, nullptr, "ClearStatistics"},
+ FunctionInfo{30300, nullptr, "GetStorageUsage"},
+ FunctionInfo{30400, nullptr, "GetStatistics"},
+ FunctionInfo{30401, nullptr, "GetThroughputHistory"},
+ FunctionInfo{30500, nullptr, "GetLastUploadError"},
+ FunctionInfo{30600, nullptr, "GetApplicationUploadSummary"},
+ FunctionInfo{40100, nullptr, "IsUserAgreementCheckEnabled"},
+ FunctionInfo{40101, nullptr, "SetUserAgreementCheckEnabled"},
+ FunctionInfo{50100, nullptr, "ReadAllApplicationReportFiles"},
+ FunctionInfo{90100, nullptr, "ReadAllReportFiles"},
+ FunctionInfo{90101, nullptr, "Unknown90101"},
+ FunctionInfo{90102, nullptr, "Unknown90102"},
+ FunctionInfo{90200, nullptr, "GetStatistics"},
+ FunctionInfo{90201, nullptr, "GetThroughputHistory"},
+ FunctionInfo{90300, nullptr, "GetLastUploadError"}
+ );
};
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
- server_manager->RegisterNamedService("prepo:a",
- std::make_shared<PlayReport>("prepo:a", system));
- server_manager->RegisterNamedService("prepo:a2",
- std::make_shared<PlayReport>("prepo:a2", system));
- server_manager->RegisterNamedService("prepo:m",
- std::make_shared<PlayReport>("prepo:m", system));
- server_manager->RegisterNamedService("prepo:s",
- std::make_shared<PlayReport>("prepo:s", system));
- server_manager->RegisterNamedService("prepo:u",
- std::make_shared<PlayReport>("prepo:u", system));
+ server_manager->RegisterNamedService("prepo:a", std::make_shared<PlayReport>("prepo:a", system));
+ server_manager->RegisterNamedService("prepo:a2", std::make_shared<PlayReport>("prepo:a2", system));
+ server_manager->RegisterNamedService("prepo:m", std::make_shared<PlayReport>("prepo:m", system));
+ server_manager->RegisterNamedService("prepo:s", std::make_shared<PlayReport>("prepo:s", system));
+ server_manager->RegisterNamedService("prepo:u", std::make_shared<PlayReport>("prepo:u", system));
ServerManager::RunServer(std::move(server_manager));
}
diff --git a/src/core/hle/service/psc/ovln/receiver.cpp b/src/core/hle/service/psc/ovln/receiver.cpp
deleted file mode 100644
index f43d705126..0000000000
--- a/src/core/hle/service/psc/ovln/receiver.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/psc/ovln/receiver.h"
-#include "core/hle/service/cmif_serialization.h"
-
-namespace Service::PSC {
-
-IReceiver::IReceiver(Core::System& system_)
- : ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IReceiver::AddSource>, "AddSource"},
- {1, D<&IReceiver::RemoveSource>, "RemoveSource"},
- {2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"},
- {3, D<&IReceiver::Receive>, "Receive"},
- {4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
- receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent");
-}
-
-IReceiver::~IReceiver() {
- service_context.CloseEvent(receive_event);
-}
-
-Result IReceiver::AddSource(SourceName source_name) {
- const std::string name = source_name.GetString();
- LOG_INFO(Service_PSC, "called: source_name={}", name);
-
- // Add source if it doesn't already exist
- if (message_sources.find(name) == message_sources.end()) {
- message_sources[name] = {};
- }
-
- R_SUCCEED();
-}
-
-Result IReceiver::RemoveSource(SourceName source_name) {
- const std::string name = source_name.GetString();
- LOG_INFO(Service_PSC, "called: source_name={}", name);
-
- // Remove source if it exists
- message_sources.erase(name);
-
- R_SUCCEED();
-}
-
-Result IReceiver::GetReceiveEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event) {
- LOG_INFO(Service_PSC, "called");
- *out_event = &receive_event->GetReadableEvent();
- R_SUCCEED();
-}
-
-Result IReceiver::Receive(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags) {
- u64 tick;
- return ReceiveWithTick(out_notification, out_flags, Out<u64>(&tick));
-}
-
-Result IReceiver::ReceiveWithTick(Out<OverlayNotification> out_notification,
- Out<MessageFlags> out_flags, Out<u64> out_tick) {
- LOG_DEBUG(Service_PSC, "called");
-
- // Find the message with the lowest ID across all sources
- const std::string* target_source = nullptr;
- size_t target_index = 0;
-
- for (const auto& [source_name, messages] : message_sources) {
- if (!messages.empty()) {
- if (target_source == nullptr) {
- target_source = &source_name;
- target_index = 0;
- }
- // Note: In the real implementation, we would track message IDs
- // For now, just use FIFO order
- }
- }
-
- if (target_source != nullptr) {
- auto& messages = message_sources[*target_source];
- *out_notification = messages[target_index].first;
- *out_flags = messages[target_index].second;
- *out_tick = 0; // TODO: Implement tick tracking
-
- // Remove the message
- messages.erase(messages.begin() + target_index);
-
- // Clear event if no more messages
- bool has_messages = false;
- for (const auto& [_, msgs] : message_sources) {
- if (!msgs.empty()) {
- has_messages = true;
- break;
- }
- }
- if (!has_messages) {
- receive_event->Clear(system.Kernel());
- }
-
- R_SUCCEED();
- }
-
- // No messages available
- *out_notification = {};
- *out_flags = {};
- *out_tick = 0;
-
- LOG_WARNING(Service_PSC, "No messages available");
- R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available
-}
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/receiver.h b/src/core/hle/service/psc/ovln/receiver.h
deleted file mode 100644
index 2b96216a1a..0000000000
--- a/src/core/hle/service/psc/ovln/receiver.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include <map>
-#include <memory>
-#include <string>
-#include "core/hle/result.h"
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/kernel_helpers.h"
-#include "core/hle/service/service.h"
-#include "core/hle/service/psc/ovln/ovln_types.h"
-
-namespace Kernel {
-class KReadableEvent;
-}
-
-namespace Service::PSC {
-
-class IReceiver final : public ServiceFramework<IReceiver> {
-public:
- explicit IReceiver(Core::System& system_);
- ~IReceiver() override;
-
- IReceiver(const IReceiver&) = delete;
- IReceiver& operator=(const IReceiver&) = delete;
-
-private:
- Result AddSource(SourceName source_name);
- Result RemoveSource(SourceName source_name);
- Result GetReceiveEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event);
- Result Receive(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags);
- Result ReceiveWithTick(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags,
- Out<u64> out_tick);
-
- KernelHelpers::ServiceContext service_context;
- Kernel::KEvent* receive_event;
-
- std::map<std::string, std::vector<std::pair<OverlayNotification, MessageFlags>>> message_sources;
-};
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/receiver_service.cpp b/src/core/hle/service/psc/ovln/receiver_service.cpp
index 3b0b180725..0df9d802b9 100644
--- a/src/core/hle/service/psc/ovln/receiver_service.cpp
+++ b/src/core/hle/service/psc/ovln/receiver_service.cpp
@@ -5,19 +5,126 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/psc/ovln/receiver.h"
+#include "core/hle/service/psc/ovln/ovln_types.h"
#include "core/hle/service/psc/ovln/receiver_service.h"
namespace Service::PSC {
-IReceiverService::IReceiverService(Core::System& system_) : ServiceFramework{system_, "ovln:rcv"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"},
- };
- // clang-format on
+class IReceiver final : public ServiceFramework<IReceiver> {
+public:
+ explicit IReceiver(Core::System& system_) : ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} {
+ receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent");
+ }
+
+ ~IReceiver() override {
+ service_context.CloseEvent(receive_event);
+ }
+
+ Result AddSource(SourceName source_name) {
+ const std::string name = source_name.GetString();
+ LOG_INFO(Service_PSC, "called: source_name={}", name);
+ // Add source if it doesn't already exist
+ if (message_sources.find(name) == message_sources.end()) {
+ message_sources[name] = {};
+ }
+ R_SUCCEED();
+ }
+
+ Result RemoveSource(SourceName source_name) {
+ const std::string name = source_name.GetString();
+ LOG_INFO(Service_PSC, "called: source_name={}", name);
+ // Remove source if it exists
+ message_sources.erase(name);
+ R_SUCCEED();
+ }
+
+ Result GetReceiveEventHandle(OutCopyHandle<Kernel::KReadableEvent> out_event) {
+ LOG_INFO(Service_PSC, "called");
+ *out_event = &receive_event->GetReadableEvent();
+ R_SUCCEED();
+ }
+
+ Result Receive(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags) {
+ u64 tick;
+ return ReceiveWithTick(out_notification, out_flags, Out<u64>(&tick));
+ }
+
+ Result ReceiveWithTick(Out<OverlayNotification> out_notification, Out<MessageFlags> out_flags, Out<u64> out_tick) {
+ LOG_DEBUG(Service_PSC, "called");
+
+ // Find the message with the lowest ID across all sources
+ const std::string* target_source = nullptr;
+ size_t target_index = 0;
+
+ for (const auto& [source_name, messages] : message_sources) {
+ if (!messages.empty()) {
+ if (target_source == nullptr) {
+ target_source = &source_name;
+ target_index = 0;
+ }
+ // Note: In the real implementation, we would track message IDs
+ // For now, just use FIFO order
+ }
+ }
+
+ if (target_source != nullptr) {
+ auto& messages = message_sources[*target_source];
+ *out_notification = messages[target_index].first;
+ *out_flags = messages[target_index].second;
+ *out_tick = 0; // TODO: Implement tick tracking
+
+ // Remove the message
+ messages.erase(messages.begin() + target_index);
- RegisterHandlers(functions);
+ // Clear event if no more messages
+ bool has_messages = false;
+ for (const auto& [_, msgs] : message_sources) {
+ if (!msgs.empty()) {
+ has_messages = true;
+ break;
+ }
+ }
+ if (!has_messages) {
+ receive_event->Clear(system.Kernel());
+ }
+
+ R_SUCCEED();
+ }
+
+ // No messages available
+ *out_notification = {};
+ *out_flags = {};
+ *out_tick = 0;
+
+ LOG_WARNING(Service_PSC, "No messages available");
+ R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IReceiver::AddSource>, "AddSource"},
+ FunctionInfo{1, D<&IReceiver::RemoveSource>, "RemoveSource"},
+ FunctionInfo{2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"},
+ FunctionInfo{3, D<&IReceiver::Receive>, "Receive"},
+ FunctionInfo{4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"}
+ );
+
+ KernelHelpers::ServiceContext service_context;
+ Kernel::KEvent* receive_event;
+
+ std::map<std::string, std::vector<std::pair<OverlayNotification, MessageFlags>>> message_sources;
+};
+
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IReceiverService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
+IReceiverService::IReceiverService(Core::System& system_) : ServiceFramework{system_, "ovln:rcv"} {
}
IReceiverService::~IReceiverService() = default;
diff --git a/src/core/hle/service/psc/ovln/receiver_service.h b/src/core/hle/service/psc/ovln/receiver_service.h
index b3b31ba4aa..bd053cd50c 100644
--- a/src/core/hle/service/psc/ovln/receiver_service.h
+++ b/src/core/hle/service/psc/ovln/receiver_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -17,6 +20,8 @@ public:
private:
Result OpenReceiver(Out<SharedPointer<IReceiver>> out_receiver);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/sender.cpp b/src/core/hle/service/psc/ovln/sender.cpp
deleted file mode 100644
index 3227a56f25..0000000000
--- a/src/core/hle/service/psc/ovln/sender.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/psc/ovln/sender.h"
-
-namespace Service::PSC {
-
-ISender::ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ISender::Send>, "Send"},
- {1, nullptr, "GetUnreceivedMessageCount"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-ISender::~ISender() = default;
-
-Result ISender::Send(const OverlayNotification& notification, MessageFlags flags) {
- std::string data;
- for (const auto m : notification) {
- data += fmt::format("{:016X} ", m);
- }
-
- LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data);
- R_SUCCEED();
-}
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/sender.h b/src/core/hle/service/psc/ovln/sender.h
deleted file mode 100644
index c1575428e3..0000000000
--- a/src/core/hle/service/psc/ovln/sender.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/psc/ovln/ovln_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::PSC {
-
-class ISender final : public ServiceFramework<ISender> {
-public:
- explicit ISender(Core::System& system_);
- ~ISender() override;
-
-private:
- Result Send(const OverlayNotification& notification, MessageFlags flags);
-};
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/ovln/sender_service.cpp b/src/core/hle/service/psc/ovln/sender_service.cpp
index 18d2c83a3d..5a36f1e1ec 100644
--- a/src/core/hle/service/psc/ovln/sender_service.cpp
+++ b/src/core/hle/service/psc/ovln/sender_service.cpp
@@ -1,20 +1,47 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/psc/ovln/sender.h"
+#include "core/hle/service/psc/ovln/ovln_types.h"
#include "core/hle/service/psc/ovln/sender_service.h"
namespace Service::PSC {
-ISenderService::ISenderService(Core::System& system_) : ServiceFramework{system_, "ovln:snd"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ISenderService::OpenSender>, "OpenSender"},
- };
- // clang-format on
+class ISender final : public ServiceFramework<ISender> {
+public:
+ explicit ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} {}
+ ~ISender() override = default;
+
+ Result Send(const OverlayNotification& notification, MessageFlags flags) {
+ std::string data;
+ for (const auto m : notification) {
+ data += fmt::format("{:016X} ", m);
+ }
+
+ LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data);
+ R_SUCCEED();
+ }
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ISender::Send>, "Send"},
+ FunctionInfo{1, nullptr, "GetUnreceivedMessageCount"}
+ );
+};
+
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ISenderService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ISenderService::OpenSender>, "OpenSender"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
+ISenderService::ISenderService(Core::System& system_) : ServiceFramework{system_, "ovln:snd"} {
}
ISenderService::~ISenderService() = default;
diff --git a/src/core/hle/service/psc/ovln/sender_service.h b/src/core/hle/service/psc/ovln/sender_service.h
index 10027701f4..90a9a33872 100644
--- a/src/core/hle/service/psc/ovln/sender_service.h
+++ b/src/core/hle/service/psc/ovln/sender_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -16,8 +19,9 @@ public:
~ISenderService() override;
private:
- Result OpenSender(Out<SharedPointer<ISender>> out_sender, u32 sender_id,
- std::array<u64, 2> data);
+ Result OpenSender(Out<SharedPointer<ISender>> out_sender, u32 sender_id, std::array<u64, 2> data);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_control.cpp b/src/core/hle/service/psc/pm_control.cpp
deleted file mode 100644
index 7dedb76629..0000000000
--- a/src/core/hle/service/psc/pm_control.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/psc/pm_control.h"
-
-namespace Service::PSC {
-
-IPmControl::IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {1, nullptr, "DispatchRequest"},
- {2, nullptr, "GetResult"},
- {3, nullptr, "GetState"},
- {4, nullptr, "Cancel"},
- {5, nullptr, "PrintModuleInformation"},
- {6, nullptr, "GetModuleInformation"},
- {10, nullptr, "AcquireStateLock"},
- {11, nullptr, "HasStateLock"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IPmControl::~IPmControl() = default;
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_control.h b/src/core/hle/service/psc/pm_control.h
deleted file mode 100644
index e0ae2f39ca..0000000000
--- a/src/core/hle/service/psc/pm_control.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/service.h"
-
-namespace Service::PSC {
-
-class IPmControl final : public ServiceFramework<IPmControl> {
-public:
- explicit IPmControl(Core::System& system_);
- ~IPmControl() override;
-};
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_module.cpp b/src/core/hle/service/psc/pm_module.cpp
deleted file mode 100644
index 74dc7ed4e8..0000000000
--- a/src/core/hle/service/psc/pm_module.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/psc/pm_module.h"
-
-namespace Service::PSC {
-
-IPmModule::IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {1, nullptr, "GetRequest"},
- {2, nullptr, "Acknowledge"},
- {3, nullptr, "Finalize"},
- {4, nullptr, "AcknowledgeEx"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IPmModule::~IPmModule() = default;
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_module.h b/src/core/hle/service/psc/pm_module.h
deleted file mode 100644
index b3a2d25842..0000000000
--- a/src/core/hle/service/psc/pm_module.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/service.h"
-
-namespace Service::PSC {
-
-class IPmModule final : public ServiceFramework<IPmModule> {
-public:
- explicit IPmModule(Core::System& system_);
- ~IPmModule() override;
-};
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_service.cpp b/src/core/hle/service/psc/pm_service.cpp
deleted file mode 100644
index c4e0ad2286..0000000000
--- a/src/core/hle/service/psc/pm_service.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/service/cmif_serialization.h"
-#include "core/hle/service/psc/pm_module.h"
-#include "core/hle/service/psc/pm_service.h"
-
-namespace Service::PSC {
-
-IPmService::IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IPmService::GetPmModule>, "GetPmModule"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
-IPmService::~IPmService() = default;
-
-Result IPmService::GetPmModule(Out<SharedPointer<IPmModule>> out_module) {
- LOG_DEBUG(Service_PSC, "called");
- *out_module = std::make_shared<IPmModule>(system);
- R_SUCCEED();
-}
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/pm_service.h b/src/core/hle/service/psc/pm_service.h
deleted file mode 100644
index 08e14c6f8f..0000000000
--- a/src/core/hle/service/psc/pm_service.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/cmif_types.h"
-#include "core/hle/service/service.h"
-
-namespace Service::PSC {
-
-class IPmModule;
-
-class IPmService final : public ServiceFramework<IPmService> {
-public:
- explicit IPmService(Core::System& system_);
- ~IPmService() override;
-
-private:
- Result GetPmModule(Out<SharedPointer<IPmModule>> out_module);
-};
-
-} // namespace Service::PSC
diff --git a/src/core/hle/service/psc/psc.cpp b/src/core/hle/service/psc/psc.cpp
index 31fb9f0117..553c4f63a4 100644
--- a/src/core/hle/service/psc/psc.cpp
+++ b/src/core/hle/service/psc/psc.cpp
@@ -6,100 +6,157 @@
#include "core/hle/service/psc/ovln/receiver_service.h"
#include "core/hle/service/psc/ovln/sender_service.h"
-#include "core/hle/service/psc/pm_control.h"
-#include "core/hle/service/psc/pm_service.h"
#include "core/hle/service/psc/psc.h"
#include "core/hle/service/psc/time/manager.h"
#include "core/hle/service/psc/time/power_state_service.h"
#include "core/hle/service/psc/time/service_manager.h"
#include "core/hle/service/psc/time/static.h"
#include "core/hle/service/service.h"
+#include "core/hle/service/cmif_serialization.h"
namespace Service::PSC {
class PSC_L final : public ServiceFramework<PSC_L> {
public:
- explicit PSC_L(Core::System& system_) : ServiceFramework{system_, "psc:l"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize_3"},
- {1, nullptr, "Lock"},
- {2, nullptr, "Unlock"},
- {3, nullptr, "IsLocked"},
- {4, nullptr, "GetRelatedState"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit PSC_L(Core::System& system_) : ServiceFramework{system_, "psc:l"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize_3"},
+ FunctionInfo{1, nullptr, "Lock"},
+ FunctionInfo{2, nullptr, "Unlock"},
+ FunctionInfo{3, nullptr, "IsLocked"},
+ FunctionInfo{4, nullptr, "GetRelatedState"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class INS_R final : public ServiceFramework<INS_R> {
public:
- explicit INS_R(Core::System& system_) : ServiceFramework{system_, "ins:r"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetInputSourceState"},
- {1, nullptr, "GetTriggerTargetEvent"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit INS_R(Core::System& system_) : ServiceFramework{system_, "ins:r"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetInputSourceState"},
+ FunctionInfo{1, nullptr, "GetTriggerTargetEvent"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class INS_S final : public ServiceFramework<INS_S> {
public:
- explicit INS_S(Core::System& system_) : ServiceFramework{system_, "ins:s"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetNotifyEvent"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit INS_S(Core::System& system_) : ServiceFramework{system_, "ins:s"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetNotifyEvent"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class HSHL_SYS final : public ServiceFramework<HSHL_SYS> {
public:
- explicit HSHL_SYS(Core::System& system_) : ServiceFramework{system_, "hshl:sys"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetBatteryPercentage"},
- {1, nullptr, "GetChargerType"},
- {2, nullptr, "OpenChargeSession"},
- {3, nullptr, "GetRawBatteryPercentage"},
- {4, nullptr, "GetBatteryVoltageLevel"},
- {5, nullptr, "OpenThermalSession"},
- {6, nullptr, "GetAbnormalTemperatureSet"},
- {7, nullptr, "OpenClockSession"},
- {8, nullptr, "GetClockRate"},
- {9, nullptr, "OpenBridgeSession"},
- {10, nullptr, "GetBridgePowerSupply"},
- {11, nullptr, "OpenVsysVoltageSession"},
- {12, nullptr, "GetIsBatteryEnoughForFullAwake"},
- {13, nullptr, "GetIsCharging"},
- {14, nullptr, "Cmd14"},
- {15, nullptr, "Cmd15"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit HSHL_SYS(Core::System& system_) : ServiceFramework{system_, "hshl:sys"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetBatteryPercentage"},
+ FunctionInfo{1, nullptr, "GetChargerType"},
+ FunctionInfo{2, nullptr, "OpenChargeSession"},
+ FunctionInfo{3, nullptr, "GetRawBatteryPercentage"},
+ FunctionInfo{4, nullptr, "GetBatteryVoltageLevel"},
+ FunctionInfo{5, nullptr, "OpenThermalSession"},
+ FunctionInfo{6, nullptr, "GetAbnormalTemperatureSet"},
+ FunctionInfo{7, nullptr, "OpenClockSession"},
+ FunctionInfo{8, nullptr, "GetClockRate"},
+ FunctionInfo{9, nullptr, "OpenBridgeSession"},
+ FunctionInfo{10, nullptr, "GetBridgePowerSupply"},
+ FunctionInfo{11, nullptr, "OpenVsysVoltageSession"},
+ FunctionInfo{12, nullptr, "GetIsBatteryEnoughForFullAwake"},
+ FunctionInfo{13, nullptr, "GetIsCharging"},
+ FunctionInfo{14, nullptr, "Cmd14"},
+ FunctionInfo{15, nullptr, "Cmd15"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class HSHL_SET final : public ServiceFramework<HSHL_SET> {
public:
- explicit HSHL_SET(Core::System& system_) : ServiceFramework{system_, "hshl:set"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "OpenChargeSession_2"},
- {1, nullptr, "OpenThermalSession_2"},
- {2, nullptr, "SetClockRate"},
- {3, nullptr, "SetBridgePowerSupply"},
- {4, nullptr, "Cmd4"},
- {5, nullptr, "Cmd5"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit HSHL_SET(Core::System& system_) : ServiceFramework{system_, "hshl:set"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenChargeSession_2"},
+ FunctionInfo{1, nullptr, "OpenThermalSession_2"},
+ FunctionInfo{2, nullptr, "SetClockRate"},
+ FunctionInfo{3, nullptr, "SetBridgePowerSupply"},
+ FunctionInfo{4, nullptr, "Cmd4"},
+ FunctionInfo{5, nullptr, "Cmd5"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+};
+
+class IPmModule final : public ServiceFramework<IPmModule> {
+public:
+ explicit IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} {}
+ ~IPmModule() override = default;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{1, nullptr, "GetRequest"},
+ FunctionInfo{2, nullptr, "Acknowledge"},
+ FunctionInfo{3, nullptr, "Finalize"},
+ FunctionInfo{4, nullptr, "AcknowledgeEx"}
+ );
+};
+
+class IPmService final : public ServiceFramework<IPmService> {
+public:
+ explicit IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} {}
+ ~IPmService() override = default;
+
+private:
+ Result GetPmModule(Out<SharedPointer<IPmModule>> out_module) {
+ LOG_DEBUG(Service_PSC, "called");
+ *out_module = std::make_shared<IPmModule>(system);
+ R_SUCCEED();
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IPmService::GetPmModule>, "GetPmModule"}
+ );
+};
+
+class IPmControl final : public ServiceFramework<IPmControl> {
+public:
+ explicit IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} {}
+ ~IPmControl() override = default;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{1, nullptr, "DispatchRequest"},
+ FunctionInfo{2, nullptr, "GetResult"},
+ FunctionInfo{3, nullptr, "GetState"},
+ FunctionInfo{4, nullptr, "Cancel"},
+ FunctionInfo{5, nullptr, "PrintModuleInformation"},
+ FunctionInfo{6, nullptr, "GetModuleInformation"},
+ FunctionInfo{10, nullptr, "AcquireStateLock"},
+ FunctionInfo{11, nullptr, "HasStateLock"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/psc/time/alarms.cpp b/src/core/hle/service/psc/time/alarms.cpp
index 17a795c4c5..c9070896b3 100644
--- a/src/core/hle/service/psc/time/alarms.cpp
+++ b/src/core/hle/service/psc/time/alarms.cpp
@@ -33,8 +33,7 @@ Alarm::~Alarm() {
}
Alarms::Alarms(Core::System& system, StandardSteadyClockCore& steady_clock, PowerStateRequestManager& power_state_request_manager)
- : m_system{system}
- , m_ctx{system, "Psc:Alarms"}
+ : m_ctx{system, "Psc:Alarms"}
, m_steady_clock{steady_clock}
, m_power_state_request_manager{power_state_request_manager}
, m_event{m_ctx.CreateEvent("Psc:Alarms:Event")}
@@ -136,15 +135,7 @@ Result Alarms::UpdateClosestAndSignal(Kernel::KernelCore& kernel) {
IAlarmService::IAlarmService(Core::System& system_, std::shared_ptr<TimeManager> manager)
: ServiceFramework{system_, "time:al"}
, m_alarms{manager->m_alarms}
-{
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IAlarmService::CreateWakeupAlarm, "CreateWakeupAlarm"},
- {1, &IAlarmService::CreateBackgroundTaskAlarm, "CreateBackgroundTaskAlarm"},
- };
- // clang-format on
- RegisterHandlers(functions);
-}
+{}
void IAlarmService::CreateWakeupAlarm(HLERequestContext& ctx) {
LOG_DEBUG(Service_Time, "called.");
@@ -165,17 +156,6 @@ void IAlarmService::CreateBackgroundTaskAlarm(HLERequestContext& ctx) {
ISteadyClockAlarm::ISteadyClockAlarm(Core::System& system_, Alarms& alarms, AlarmType type)
: ServiceFramework{system_, "ISteadyClockAlarm"}, m_ctx{system, "Psc:ISteadyClockAlarm"},
m_alarms{alarms}, m_alarm{system, m_ctx, type} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &ISteadyClockAlarm::GetAlarmEvent, "GetAlarmEvent"},
- {1, &ISteadyClockAlarm::Enable, "Enable"},
- {2, &ISteadyClockAlarm::Disable, "Disable"},
- {3, &ISteadyClockAlarm::IsEnabled, "IsEnabled"},
- {10, nullptr, "CreateWakeLock"},
- {11, nullptr, "DestroyWakeLock"},
- };
- // clang-format on
- RegisterHandlers(functions);
}
void ISteadyClockAlarm::GetAlarmEvent(HLERequestContext& ctx) {
diff --git a/src/core/hle/service/psc/time/alarms.h b/src/core/hle/service/psc/time/alarms.h
index 0a2fa7fac5..6d916ca198 100644
--- a/src/core/hle/service/psc/time/alarms.h
+++ b/src/core/hle/service/psc/time/alarms.h
@@ -95,7 +95,6 @@ private:
void Erase(Kernel::KernelCore& kernel, Alarm& alarm);
Result UpdateClosestAndSignal(Kernel::KernelCore& kernel);
- Core::System& m_system;
KernelHelpers::ServiceContext m_ctx;
StandardSteadyClockCore& m_steady_clock;
@@ -114,6 +113,14 @@ public:
private:
void CreateWakeupAlarm(HLERequestContext& ctx);
void CreateBackgroundTaskAlarm(HLERequestContext& ctx);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IAlarmService::CreateWakeupAlarm, "CreateWakeupAlarm"},
+ FunctionInfo{1, &IAlarmService::CreateBackgroundTaskAlarm, "CreateBackgroundTaskAlarm"}
+ );
Alarms& m_alarms;
};
@@ -128,8 +135,18 @@ private:
void Disable(HLERequestContext& ctx);
void IsEnabled(HLERequestContext& ctx);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ISteadyClockAlarm::GetAlarmEvent, "GetAlarmEvent"},
+ FunctionInfo{1, &ISteadyClockAlarm::Enable, "Enable"},
+ FunctionInfo{2, &ISteadyClockAlarm::Disable, "Disable"},
+ FunctionInfo{3, &ISteadyClockAlarm::IsEnabled, "IsEnabled"},
+ FunctionInfo{10, nullptr, "CreateWakeLock"},
+ FunctionInfo{11, nullptr, "DestroyWakeLock"}
+ );
KernelHelpers::ServiceContext m_ctx;
-
Alarms& m_alarms;
Alarm m_alarm;
};
diff --git a/src/core/hle/service/psc/time/manager.h b/src/core/hle/service/psc/time/manager.h
index 62ded12475..2cb8b58a2b 100644
--- a/src/core/hle/service/psc/time/manager.h
+++ b/src/core/hle/service/psc/time/manager.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -23,20 +26,20 @@ namespace Service::PSC::Time {
class TimeManager {
public:
explicit TimeManager(Core::System& system)
- : m_system{system}, m_standard_steady_clock{system}, m_tick_based_steady_clock{m_system},
- m_standard_local_system_clock{m_standard_steady_clock},
- m_standard_network_system_clock{m_standard_steady_clock},
- m_standard_user_system_clock{m_system, m_standard_local_system_clock,
- m_standard_network_system_clock},
- m_ephemeral_network_clock{m_tick_based_steady_clock}, m_shared_memory{m_system},
- m_power_state_request_manager{m_system}, m_alarms{m_system, m_standard_steady_clock,
- m_power_state_request_manager},
- m_local_system_clock_context_writer{m_system, m_shared_memory},
- m_network_system_clock_context_writer{m_system, m_shared_memory,
- m_standard_user_system_clock},
- m_ephemeral_network_clock_context_writer{m_system} {}
-
- Core::System& m_system;
+ : m_standard_steady_clock{system}
+ , m_tick_based_steady_clock{system}
+ , m_standard_local_system_clock{m_standard_steady_clock}
+ , m_standard_network_system_clock{m_standard_steady_clock}
+ , m_standard_user_system_clock{system, m_standard_local_system_clock
+ , m_standard_network_system_clock}
+ , m_ephemeral_network_clock{m_tick_based_steady_clock}
+ , m_shared_memory{system}
+ , m_power_state_request_manager{system}
+ , m_alarms{system, m_standard_steady_clock, m_power_state_request_manager}
+ , m_local_system_clock_context_writer{system, m_shared_memory}
+ , m_network_system_clock_context_writer{system, m_shared_memory, m_standard_user_system_clock}
+ , m_ephemeral_network_clock_context_writer{system}
+ {}
StandardSteadyClockCore m_standard_steady_clock;
TickBasedSteadyClockCore m_tick_based_steady_clock;
diff --git a/src/core/hle/service/psc/time/power_state_service.cpp b/src/core/hle/service/psc/time/power_state_service.cpp
index 39af16b6f1..795aeb94a8 100644
--- a/src/core/hle/service/psc/time/power_state_service.cpp
+++ b/src/core/hle/service/psc/time/power_state_service.cpp
@@ -9,20 +9,19 @@
namespace Service::PSC::Time {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IPowerStateRequestHandler::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle>, "GetPowerStateRequestEventReadableHandle"},
+ FunctionInfo{1, D<&IPowerStateRequestHandler::GetAndClearPowerStateRequest>, "GetAndClearPowerStateRequest"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IPowerStateRequestHandler::IPowerStateRequestHandler(
Core::System& system_, PowerStateRequestManager& power_state_request_manager)
: ServiceFramework{system_, "time:p"}
, m_power_state_request_manager{power_state_request_manager}
-{
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle>, "GetPowerStateRequestEventReadableHandle"},
- {1, D<&IPowerStateRequestHandler::GetAndClearPowerStateRequest>, "GetAndClearPowerStateRequest"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
+{}
Result IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle(
OutCopyHandle<Kernel::KReadableEvent> out_event) {
diff --git a/src/core/hle/service/psc/time/power_state_service.h b/src/core/hle/service/psc/time/power_state_service.h
index 81b3adf234..14d9c1a77a 100644
--- a/src/core/hle/service/psc/time/power_state_service.h
+++ b/src/core/hle/service/psc/time/power_state_service.h
@@ -27,6 +27,7 @@ public:
Result GetAndClearPowerStateRequest(Out<bool> out_cleared, Out<u32> out_priority);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
PowerStateRequestManager& m_power_state_request_manager;
};
diff --git a/src/core/hle/service/psc/time/service_manager.cpp b/src/core/hle/service/psc/time/service_manager.cpp
index e9f1407e4d..be25ee9a70 100644
--- a/src/core/hle/service/psc/time/service_manager.cpp
+++ b/src/core/hle/service/psc/time/service_manager.cpp
@@ -13,6 +13,30 @@
namespace Service::PSC::Time {
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> ServiceManager::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ServiceManager::GetStaticServiceAsUser>, "GetStaticServiceAsUser"},
+ FunctionInfo{5, D<&ServiceManager::GetStaticServiceAsAdmin>, "GetStaticServiceAsAdmin"},
+ FunctionInfo{6, D<&ServiceManager::GetStaticServiceAsRepair>, "GetStaticServiceAsRepair"},
+ FunctionInfo{9, D<&ServiceManager::GetStaticServiceAsServiceManager>, "GetStaticServiceAsServiceManager"},
+ FunctionInfo{10, D<&ServiceManager::SetupStandardSteadyClockCore>, "SetupStandardSteadyClockCore"},
+ FunctionInfo{11, D<&ServiceManager::SetupStandardLocalSystemClockCore>, "SetupStandardLocalSystemClockCore"},
+ FunctionInfo{12, D<&ServiceManager::SetupStandardNetworkSystemClockCore>, "SetupStandardNetworkSystemClockCore"},
+ FunctionInfo{13, D<&ServiceManager::SetupStandardUserSystemClockCore>, "SetupStandardUserSystemClockCore"},
+ FunctionInfo{14, D<&ServiceManager::SetupTimeZoneServiceCore>, "SetupTimeZoneServiceCore"},
+ FunctionInfo{15, D<&ServiceManager::SetupEphemeralNetworkSystemClockCore>, "SetupEphemeralNetworkSystemClockCore"},
+ FunctionInfo{50, D<&ServiceManager::GetStandardLocalClockOperationEvent>, "GetStandardLocalClockOperationEvent"},
+ FunctionInfo{51, D<&ServiceManager::GetStandardNetworkClockOperationEventForServiceManager>, "GetStandardNetworkClockOperationEventForServiceManager"},
+ FunctionInfo{52, D<&ServiceManager::GetEphemeralNetworkClockOperationEventForServiceManager>, "GetEphemeralNetworkClockOperationEventForServiceManager"},
+ FunctionInfo{60, D<&ServiceManager::GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent"},
+ FunctionInfo{100, D<&ServiceManager::SetStandardSteadyClockBaseTime>, "SetStandardSteadyClockBaseTime"},
+ FunctionInfo{200, D<&ServiceManager::GetClosestAlarmUpdatedEvent>, "GetClosestAlarmUpdatedEvent"},
+ FunctionInfo{201, D<&ServiceManager::CheckAndSignalAlarms>, "CheckAndSignalAlarms"},
+ FunctionInfo{202, D<&ServiceManager::GetClosestAlarmInfo>, "GetClosestAlarmInfo "}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
ServiceManager::ServiceManager(Core::System& system_, std::shared_ptr<TimeManager> time,
ServerManager* server_manager)
: ServiceFramework{system_, "time:m"}, m_time{std::move(time)},
@@ -27,30 +51,6 @@ ServiceManager::ServiceManager(Core::System& system_, std::shared_ptr<TimeManage
m_network_system_context_writer{m_time->m_network_system_clock_context_writer},
m_ephemeral_system_context_writer{m_time->m_ephemeral_network_clock_context_writer},
m_local_operation{system_}, m_network_operation{system_}, m_ephemeral_operation{system_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ServiceManager::GetStaticServiceAsUser>, "GetStaticServiceAsUser"},
- {5, D<&ServiceManager::GetStaticServiceAsAdmin>, "GetStaticServiceAsAdmin"},
- {6, D<&ServiceManager::GetStaticServiceAsRepair>, "GetStaticServiceAsRepair"},
- {9, D<&ServiceManager::GetStaticServiceAsServiceManager>, "GetStaticServiceAsServiceManager"},
- {10, D<&ServiceManager::SetupStandardSteadyClockCore>, "SetupStandardSteadyClockCore"},
- {11, D<&ServiceManager::SetupStandardLocalSystemClockCore>, "SetupStandardLocalSystemClockCore"},
- {12, D<&ServiceManager::SetupStandardNetworkSystemClockCore>, "SetupStandardNetworkSystemClockCore"},
- {13, D<&ServiceManager::SetupStandardUserSystemClockCore>, "SetupStandardUserSystemClockCore"},
- {14, D<&ServiceManager::SetupTimeZoneServiceCore>, "SetupTimeZoneServiceCore"},
- {15, D<&ServiceManager::SetupEphemeralNetworkSystemClockCore>, "SetupEphemeralNetworkSystemClockCore"},
- {50, D<&ServiceManager::GetStandardLocalClockOperationEvent>, "GetStandardLocalClockOperationEvent"},
- {51, D<&ServiceManager::GetStandardNetworkClockOperationEventForServiceManager>, "GetStandardNetworkClockOperationEventForServiceManager"},
- {52, D<&ServiceManager::GetEphemeralNetworkClockOperationEventForServiceManager>, "GetEphemeralNetworkClockOperationEventForServiceManager"},
- {60, D<&ServiceManager::GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent"},
- {100, D<&ServiceManager::SetStandardSteadyClockBaseTime>, "SetStandardSteadyClockBaseTime"},
- {200, D<&ServiceManager::GetClosestAlarmUpdatedEvent>, "GetClosestAlarmUpdatedEvent"},
- {201, D<&ServiceManager::CheckAndSignalAlarms>, "CheckAndSignalAlarms"},
- {202, D<&ServiceManager::GetClosestAlarmInfo>, "GetClosestAlarmInfo "},
- };
- // clang-format on
- RegisterHandlers(functions);
-
m_local_system_context_writer.Link(m_local_operation);
m_network_system_context_writer.Link(m_network_operation);
m_ephemeral_system_context_writer.Link(m_ephemeral_operation);
diff --git a/src/core/hle/service/psc/time/service_manager.h b/src/core/hle/service/psc/time/service_manager.h
index 09cff25038..a8b94d8939 100644
--- a/src/core/hle/service/psc/time/service_manager.h
+++ b/src/core/hle/service/psc/time/service_manager.h
@@ -65,6 +65,8 @@ private:
void SetupSAndP();
Result GetStaticService(OutInterface<StaticService> out_service, StaticServiceSetupInfo setup_info, const char* name);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
std::shared_ptr<TimeManager> m_time;
ServerManager& m_server_manager;
bool m_is_s_and_p_setup{};
diff --git a/src/core/hle/service/psc/time/static.cpp b/src/core/hle/service/psc/time/static.cpp
index 28cff3b764..2b2b6f1f04 100644
--- a/src/core/hle/service/psc/time/static.cpp
+++ b/src/core/hle/service/psc/time/static.cpp
@@ -33,6 +33,31 @@ constexpr Result GetTimeFromTimePointAndContext(s64* out_time, SteadyClockTimePo
}
} // namespace
+std::optional<ServiceFrameworkBase::FunctionInfoBase> StaticService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
+ FunctionInfo{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
+ FunctionInfo{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
+ FunctionInfo{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
+ FunctionInfo{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
+ FunctionInfo{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
+ FunctionInfo{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
+ FunctionInfo{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
+ FunctionInfo{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
+ FunctionInfo{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
+ FunctionInfo{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
+ FunctionInfo{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
+ FunctionInfo{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
+ FunctionInfo{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
+ FunctionInfo{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
+ FunctionInfo{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
+ FunctionInfo{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
+ FunctionInfo{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
+ FunctionInfo{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
StaticService::StaticService(Core::System& system_, StaticServiceSetupInfo setup_info,
std::shared_ptr<TimeManager> time, const char* name)
: ServiceFramework{system_, name}, m_setup_info{setup_info}, m_time{time},
@@ -42,31 +67,6 @@ StaticService::StaticService(Core::System& system_, StaticServiceSetupInfo setup
m_time_zone{m_time->m_time_zone},
m_ephemeral_network_clock{m_time->m_ephemeral_network_clock}, m_shared_memory{
m_time->m_shared_memory} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
- {1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
- {2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
- {3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
- {4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
- {5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
- {20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
- {50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
- {51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
- {100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
- {101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
- {102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
- {200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
- {201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
- {300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
- {400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
- {401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
- {500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
- {501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
Result StaticService::GetStandardUserSystemClock(OutInterface<SystemClock> out_service) {
diff --git a/src/core/hle/service/psc/time/static.h b/src/core/hle/service/psc/time/static.h
index 52659166f1..a86fec178f 100644
--- a/src/core/hle/service/psc/time/static.h
+++ b/src/core/hle/service/psc/time/static.h
@@ -71,6 +71,8 @@ private:
Result GetClockSnapshotImpl(OutClockSnapshot out_snapshot,
const SystemClockContext& user_context,
const SystemClockContext& network_context, TimeType type);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
StaticServiceSetupInfo m_setup_info;
std::shared_ptr<TimeManager> m_time;
StandardLocalSystemClockCore& m_local_system_clock;
diff --git a/src/core/hle/service/psc/time/steady_clock.cpp b/src/core/hle/service/psc/time/steady_clock.cpp
index 1d1551acf9..3d138837d3 100644
--- a/src/core/hle/service/psc/time/steady_clock.cpp
+++ b/src/core/hle/service/psc/time/steady_clock.cpp
@@ -11,26 +11,26 @@
namespace Service::PSC::Time {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> SteadyClock::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&SteadyClock::GetCurrentTimePoint>, "GetCurrentTimePoint"},
+ FunctionInfo{2, D<&SteadyClock::GetTestOffset>, "GetTestOffset"},
+ FunctionInfo{3, D<&SteadyClock::SetTestOffset>, "SetTestOffset"},
+ FunctionInfo{100, D<&SteadyClock::GetRtcValue>, "GetRtcValue"},
+ FunctionInfo{101, D<&SteadyClock::IsRtcResetDetected>, "IsRtcResetDetected"},
+ FunctionInfo{102, D<&SteadyClock::GetSetupResultValue>, "GetSetupResultValue"},
+ FunctionInfo{200, D<&SteadyClock::GetInternalOffset>, "GetInternalOffset"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
SteadyClock::SteadyClock(Core::System& system_, std::shared_ptr<TimeManager> manager,
bool can_write_steady_clock, bool can_write_uninitialized_clock)
: ServiceFramework{system_, "ISteadyClock"}
, m_clock_core{manager->m_standard_steady_clock}
, m_can_write_steady_clock{can_write_steady_clock}
, m_can_write_uninitialized_clock{can_write_uninitialized_clock}
-{
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&SteadyClock::GetCurrentTimePoint>, "GetCurrentTimePoint"},
- {2, D<&SteadyClock::GetTestOffset>, "GetTestOffset"},
- {3, D<&SteadyClock::SetTestOffset>, "SetTestOffset"},
- {100, D<&SteadyClock::GetRtcValue>, "GetRtcValue"},
- {101, D<&SteadyClock::IsRtcResetDetected>, "IsRtcResetDetected"},
- {102, D<&SteadyClock::GetSetupResultValue>, "GetSetupResultValue"},
- {200, D<&SteadyClock::GetInternalOffset>, "GetInternalOffset"},
- };
- // clang-format on
- RegisterHandlers(functions);
-}
+{}
Result SteadyClock::GetCurrentTimePoint(Out<SteadyClockTimePoint> out_time_point) {
SCOPE_EXIT {
diff --git a/src/core/hle/service/psc/time/steady_clock.h b/src/core/hle/service/psc/time/steady_clock.h
index 8d3d9a6280..e4de3e3717 100644
--- a/src/core/hle/service/psc/time/steady_clock.h
+++ b/src/core/hle/service/psc/time/steady_clock.h
@@ -34,6 +34,8 @@ public:
Result GetSetupResultValue(Out<Result> out_result);
Result GetInternalOffset(Out<s64> out_internal_offset);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
+
private:
StandardSteadyClockCore& m_clock_core;
bool m_can_write_steady_clock;
diff --git a/src/core/hle/service/psc/time/system_clock.cpp b/src/core/hle/service/psc/time/system_clock.cpp
index e978ffb5e5..c08eca0b02 100644
--- a/src/core/hle/service/psc/time/system_clock.cpp
+++ b/src/core/hle/service/psc/time/system_clock.cpp
@@ -11,23 +11,23 @@
namespace Service::PSC::Time {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> SystemClock::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&SystemClock::GetCurrentTime>, "GetCurrentTime"},
+ FunctionInfo{1, D<&SystemClock::SetCurrentTime>, "SetCurrentTime"},
+ FunctionInfo{2, D<&SystemClock::GetSystemClockContext>, "GetSystemClockContext"},
+ FunctionInfo{3, D<&SystemClock::SetSystemClockContext>, "SetSystemClockContext"},
+ FunctionInfo{4, D<&SystemClock::GetOperationEventReadableHandle>, "GetOperationEventReadableHandle"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
SystemClock::SystemClock(Core::System& system_, SystemClockCore& clock_core, bool can_write_clock, bool can_write_uninitialized_clock)
: ServiceFramework{system_, "ISystemClock"}
, m_clock_core{clock_core}
, m_can_write_clock{can_write_clock}
, m_can_write_uninitialized_clock{can_write_uninitialized_clock}
-{
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&SystemClock::GetCurrentTime>, "GetCurrentTime"},
- {1, D<&SystemClock::SetCurrentTime>, "SetCurrentTime"},
- {2, D<&SystemClock::GetSystemClockContext>, "GetSystemClockContext"},
- {3, D<&SystemClock::SetSystemClockContext>, "SetSystemClockContext"},
- {4, D<&SystemClock::GetOperationEventReadableHandle>, "GetOperationEventReadableHandle"},
- };
- // clang-format on
- RegisterHandlers(functions);
-}
+{}
Result SystemClock::GetCurrentTime(Out<s64> out_time) {
SCOPE_EXIT {
diff --git a/src/core/hle/service/psc/time/system_clock.h b/src/core/hle/service/psc/time/system_clock.h
index 0d91aaa735..4f7d285d39 100644
--- a/src/core/hle/service/psc/time/system_clock.h
+++ b/src/core/hle/service/psc/time/system_clock.h
@@ -31,6 +31,7 @@ public:
Result GetOperationEventReadableHandle(OutCopyHandle<Kernel::KReadableEvent> out_event);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
SystemClockCore& m_clock_core;
bool m_can_write_clock;
bool m_can_write_uninitialized_clock;
diff --git a/src/core/hle/service/psc/time/time_zone_service.cpp b/src/core/hle/service/psc/time/time_zone_service.cpp
index bd6bb3ba93..6a717846d3 100644
--- a/src/core/hle/service/psc/time/time_zone_service.cpp
+++ b/src/core/hle/service/psc/time/time_zone_service.cpp
@@ -13,33 +13,33 @@
namespace Service::PSC::Time {
+ std::optional<ServiceFrameworkBase::FunctionInfoBase> TimeZoneService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"},
+ FunctionInfo{1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"},
+ FunctionInfo{2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"},
+ FunctionInfo{3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"},
+ FunctionInfo{4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"},
+ FunctionInfo{5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"},
+ FunctionInfo{6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"},
+ FunctionInfo{7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"},
+ FunctionInfo{8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"},
+ FunctionInfo{20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"},
+ FunctionInfo{100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"},
+ FunctionInfo{101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"},
+ FunctionInfo{201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"},
+ FunctionInfo{202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
TimeZoneService::TimeZoneService(Core::System& system_, StandardSteadyClockCore& clock_core,
TimeZone& time_zone, bool can_write_timezone_device_location)
: ServiceFramework{system_, "ITimeZoneService"}
, m_clock_core{clock_core}
, m_time_zone{time_zone}
, m_can_write_timezone_device_location{can_write_timezone_device_location}
-{
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"},
- {1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"},
- {2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"},
- {3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"},
- {4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"},
- {5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"},
- {6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"},
- {7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"},
- {8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"},
- {20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"},
- {100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"},
- {101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"},
- {201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"},
- {202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"},
- };
- // clang-format on
- RegisterHandlers(functions);
-}
+{}
Result TimeZoneService::GetDeviceLocationName(Out<LocationName> out_location_name) {
SCOPE_EXIT {
diff --git a/src/core/hle/service/psc/time/time_zone_service.h b/src/core/hle/service/psc/time/time_zone_service.h
index 0067b08258..fbb107f87c 100644
--- a/src/core/hle/service/psc/time/time_zone_service.h
+++ b/src/core/hle/service/psc/time/time_zone_service.h
@@ -59,6 +59,7 @@ public:
const CalendarTime& calendar_time);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
StandardSteadyClockCore& m_clock_core;
TimeZone& m_time_zone;
bool m_can_write_timezone_device_location;
diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp
index 41d172b71b..5cad46f997 100644
--- a/src/core/hle/service/ptm/psm.cpp
+++ b/src/core/hle/service/ptm/psm.cpp
@@ -21,22 +21,15 @@ namespace Service::PTM {
class IPsmSession final : public ServiceFramework<IPsmSession> {
public:
explicit IPsmSession(Core::System& system_)
- : ServiceFramework{system_, "IPsmSession"}, service_context{system_, "IPsmSession"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IPsmSession::BindStateChangeEvent, "BindStateChangeEvent"},
- {1, &IPsmSession::UnbindStateChangeEvent, "UnbindStateChangeEvent"},
- {2, &IPsmSession::SetChargerTypeChangeEventEnabled, "SetChargerTypeChangeEventEnabled"},
- {3, &IPsmSession::SetPowerSupplyChangeEventEnabled, "SetPowerSupplyChangeEventEnabled"},
- {4, &IPsmSession::SetBatteryVoltageStateChangeEventEnabled, "SetBatteryVoltageStateChangeEventEnabled"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
+ : ServiceFramework{system_, "IPsmSession"}
+ , service_context{system_, "IPsmSession"} {
state_change_event = service_context.CreateEvent("IPsmSession::state_change_event");
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
~IPsmSession() override {
service_context.CloseEvent(state_change_event);
}
@@ -112,8 +105,15 @@ private:
rb.Push(ResultSuccess);
}
- KernelHelpers::ServiceContext service_context;
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IPsmSession::BindStateChangeEvent, "BindStateChangeEvent"},
+ FunctionInfo{1, &IPsmSession::UnbindStateChangeEvent, "UnbindStateChangeEvent"},
+ FunctionInfo{2, &IPsmSession::SetChargerTypeChangeEventEnabled, "SetChargerTypeChangeEventEnabled"},
+ FunctionInfo{3, &IPsmSession::SetPowerSupplyChangeEventEnabled, "SetPowerSupplyChangeEventEnabled"},
+ FunctionInfo{4, &IPsmSession::SetBatteryVoltageStateChangeEventEnabled, "SetBatteryVoltageStateChangeEventEnabled"}
+ );
+ KernelHelpers::ServiceContext service_context;
bool should_signal_charger_type{};
bool should_signal_power_supply{};
bool should_signal_battery_voltage{};
@@ -122,31 +122,6 @@ private:
};
PSM::PSM(Core::System& system_) : ServiceFramework{system_, "psm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"},
- {1, &PSM::GetChargerType, "GetChargerType"},
- {2, nullptr, "EnableBatteryCharging"},
- {3, nullptr, "DisableBatteryCharging"},
- {4, nullptr, "IsBatteryChargingEnabled"},
- {5, nullptr, "AcquireControllerPowerSupply"},
- {6, nullptr, "ReleaseControllerPowerSupply"},
- {7, &PSM::OpenSession, "OpenSession"},
- {8, nullptr, "EnableEnoughPowerChargeEmulation"},
- {9, nullptr, "DisableEnoughPowerChargeEmulation"},
- {10, nullptr, "EnableFastBatteryCharging"},
- {11, nullptr, "DisableFastBatteryCharging"},
- {12, &PSM::GetBatteryVoltageState, "GetBatteryVoltageState"},
- {13, nullptr, "GetRawBatteryChargePercentage"},
- {14, nullptr, "IsEnoughPowerSupplied"},
- {15, &PSM::GetBatteryAgePercentage, "GetBatteryAgePercentage"},
- {16, nullptr, "GetBatteryChargeInfoEvent"},
- {17, &PSM::GetBatteryChargeInfoFields, "GetBatteryChargeInfoFields"},
- {18, nullptr, "GetBatteryChargeCalibratedEvent"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
PSM::~PSM() = default;
diff --git a/src/core/hle/service/ptm/psm.h b/src/core/hle/service/ptm/psm.h
index 77c38d1f9b..fe77b23d79 100644
--- a/src/core/hle/service/ptm/psm.h
+++ b/src/core/hle/service/ptm/psm.h
@@ -28,6 +28,31 @@ private:
void GetBatteryVoltageState(HLERequestContext& ctx);
void GetBatteryAgePercentage(HLERequestContext& ctx);
void GetBatteryChargeInfoFields(HLERequestContext& ctx);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"},
+ FunctionInfo{1, &PSM::GetChargerType, "GetChargerType"},
+ FunctionInfo{2, nullptr, "EnableBatteryCharging"},
+ FunctionInfo{3, nullptr, "DisableBatteryCharging"},
+ FunctionInfo{4, nullptr, "IsBatteryChargingEnabled"},
+ FunctionInfo{5, nullptr, "AcquireControllerPowerSupply"},
+ FunctionInfo{6, nullptr, "ReleaseControllerPowerSupply"},
+ FunctionInfo{7, &PSM::OpenSession, "OpenSession"},
+ FunctionInfo{8, nullptr, "EnableEnoughPowerChargeEmulation"},
+ FunctionInfo{9, nullptr, "DisableEnoughPowerChargeEmulation"},
+ FunctionInfo{10, nullptr, "EnableFastBatteryCharging"},
+ FunctionInfo{11, nullptr, "DisableFastBatteryCharging"},
+ FunctionInfo{12, &PSM::GetBatteryVoltageState, "GetBatteryVoltageState"},
+ FunctionInfo{13, nullptr, "GetRawBatteryChargePercentage"},
+ FunctionInfo{14, nullptr, "IsEnoughPowerSupplied"},
+ FunctionInfo{15, &PSM::GetBatteryAgePercentage, "GetBatteryAgePercentage"},
+ FunctionInfo{16, nullptr, "GetBatteryChargeInfoEvent"},
+ FunctionInfo{17, &PSM::GetBatteryChargeInfoFields, "GetBatteryChargeInfoFields"},
+ FunctionInfo{18, nullptr, "GetBatteryChargeCalibratedEvent"}
+ );
};
} // namespace Service::PTM
diff --git a/src/core/hle/service/ptm/ptm.cpp b/src/core/hle/service/ptm/ptm.cpp
index de1d34a688..ad474ec411 100644
--- a/src/core/hle/service/ptm/ptm.cpp
+++ b/src/core/hle/service/ptm/ptm.cpp
@@ -17,28 +17,28 @@ namespace Service::PTM {
class PSM_MANU final : public ServiceFramework<PSM_MANU> {
public:
explicit PSM_MANU(Core::System& system_)
- : ServiceFramework{system_, "psm:manu"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "EnableVdd50StateControl"},
- {1, nullptr, "DisableVdd50StateControl"},
- {2, nullptr, "SetVdd50State"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "psm:manu"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "EnableVdd50StateControl"},
+ FunctionInfo{1, nullptr, "DisableVdd50StateControl"},
+ FunctionInfo{2, nullptr, "SetVdd50State"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class POWCTL final : public ServiceFramework<POWCTL> {
public:
explicit POWCTL(Core::System& system_)
- : ServiceFramework{system_, "powctl"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "OpenSession"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "powctl"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenSession"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/ptm/ts.cpp b/src/core/hle/service/ptm/ts.cpp
index b1ac0c8f11..f22ff2ec69 100644
--- a/src/core/hle/service/ptm/ts.cpp
+++ b/src/core/hle/service/ptm/ts.cpp
@@ -19,16 +19,10 @@ enum class Location : u8 {
class ISession : public ServiceFramework<ISession> {
public:
- explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetTemperatureRange"},
- {2, nullptr, "SetMeasurementMode"},
- {4, &ISession::GetTemperature, "GetTemperature"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -39,20 +33,15 @@ private:
rb.Push(ResultSuccess);
rb.Push(temperature);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetTemperatureRange"},
+ FunctionInfo{2, nullptr, "SetMeasurementMode"},
+ FunctionInfo{4, &ISession::GetTemperature, "GetTemperature"}
+ );
};
TS::TS(Core::System& system_) : ServiceFramework{system_, "ts"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetTemperatureRange"},
- {1, &TS::GetTemperature, "GetTemperature"},
- {2, nullptr, "SetMeasurementMode"},
- {3, &TS::GetTemperatureMilliC, "GetTemperatureMilliC"},
- {4, &TS::OpenSession, "OpenSession"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
TS::~TS() = default;
diff --git a/src/core/hle/service/ptm/ts.h b/src/core/hle/service/ptm/ts.h
index a10a91a64b..21f3ac2b70 100644
--- a/src/core/hle/service/ptm/ts.h
+++ b/src/core/hle/service/ptm/ts.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -17,6 +20,17 @@ private:
void GetTemperature(HLERequestContext& ctx);
void GetTemperatureMilliC(HLERequestContext& ctx);
void OpenSession(HLERequestContext& ctx);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetTemperatureRange"},
+ FunctionInfo{1, &TS::GetTemperature, "GetTemperature"},
+ FunctionInfo{2, nullptr, "SetMeasurementMode"},
+ FunctionInfo{3, &TS::GetTemperatureMilliC, "GetTemperatureMilliC"},
+ FunctionInfo{4, &TS::OpenSession, "OpenSession"}
+ );
};
} // namespace Service::PTM
diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp
index 167bf04c9a..838ff136f6 100644
--- a/src/core/hle/service/ro/ro.cpp
+++ b/src/core/hle/service/ro/ro.cpp
@@ -8,21 +8,334 @@
#include <openssl/evp.h>
#include "core/hle/kernel/k_process.h"
-
-#include "core/hle/service/cmif_serialization.h"
#include "core/hle/service/ro/ro.h"
-#include "core/hle/service/ro/ro_nro_utils.h"
-#include "core/hle/service/ro/ro_results.h"
-#include "core/hle/service/ro/ro_types.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h"
#ifdef HAS_NCE
#include "core/arm/nce/patcher.h"
#include "core/hle/kernel/k_shared_memory.h"
#endif
+#include "core/hle/service/cmif_serialization.h"
namespace Service::RO {
+constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2};
+constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3};
+constexpr Result ResultInvalidNro{ErrorModule::RO, 4};
+constexpr Result ResultInvalidNrr{ErrorModule::RO, 6};
+constexpr Result ResultTooManyNro{ErrorModule::RO, 7};
+constexpr Result ResultTooManyNrr{ErrorModule::RO, 8};
+constexpr Result ResultNotAuthorized{ErrorModule::RO, 9};
+constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10};
+constexpr Result ResultInternalError{ErrorModule::RO, 1023};
+constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025};
+constexpr Result ResultInvalidSize{ErrorModule::RO, 1026};
+constexpr Result ResultNotLoaded{ErrorModule::RO, 1028};
+constexpr Result ResultNotRegistered{ErrorModule::RO, 1029};
+constexpr Result ResultInvalidSession{ErrorModule::RO, 1030};
+constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031};
+
+namespace {
+
+struct ProcessMemoryRegion {
+ u64 address;
+ u64 size;
+};
+
+size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) {
+ size_t total = 0;
+
+ for (size_t i = 0; i < num_regions; ++i) {
+ total += regions[i].size;
+ }
+
+ return total;
+}
+
+size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address,
+ u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
+ // Reset region count.
+ size_t num_regions = 0;
+
+ // We always want a region for the nro.
+ regions[num_regions++] = {nro_heap_address, nro_heap_size};
+
+ // If we have bss, create a region for bss.
+ if (bss_heap_size > 0) {
+ regions[num_regions++] = {bss_heap_address, bss_heap_size};
+ }
+
+ return num_regions;
+}
+
+Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size,
+ Kernel::Svc::MemoryPermission permission) {
+ auto& page_table = process->GetPageTable();
+
+ // Set permission.
+ R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission));
+}
+
+Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address,
+ const ProcessMemoryRegion* regions, size_t num_regions) {
+ // Get the total process memory region size.
+ const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions);
+
+ auto& page_table = process->GetPageTable();
+
+ // Unmap each region in order.
+ size_t cur_offset = total_size;
+ for (size_t i = 0; i < num_regions; ++i) {
+ // We want to unmap in reverse order.
+ const auto& cur_region = regions[num_regions - 1 - i];
+
+ // Subtract to update the current offset.
+ cur_offset -= cur_region.size;
+
+ // Unmap.
+ R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address,
+ cur_region.size));
+ }
+
+ R_SUCCEED();
+}
+
+Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) {
+ Kernel::KMemoryInfo memory_info;
+ Kernel::Svc::PageInfo page_info;
+
+ // Ensure page before mapping is unmapped.
+ R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
+ map_address - 1));
+ R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
+ Kernel::ResultInvalidState);
+
+ // Ensure page after mapping is unmapped.
+ R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
+ map_address + map_size));
+ R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
+ Kernel::ResultInvalidState);
+
+ // Successfully verified guard pages.
+ R_SUCCEED();
+}
+
+Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions,
+ size_t num_regions, std::mt19937_64& generate_random) {
+ auto& page_table = process->GetPageTable();
+ const u64 alias_code_start =
+ GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize;
+ const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize;
+
+ for (size_t trial = 0; trial < 64; trial++) {
+ // Generate a new trial address.
+ const u64 mapped_address =
+ (alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize;
+
+ const auto MapRegions = [&] {
+ // Map the regions in order.
+ u64 mapped_size = 0;
+ for (size_t i = 0; i < num_regions; ++i) {
+ // If we fail, unmap up to where we've mapped.
+ ON_RESULT_FAILURE {
+ R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i));
+ };
+
+ // Map the current region.
+ R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address,
+ regions[i].size));
+
+ mapped_size += regions[i].size;
+ }
+
+ // If we fail, unmap all mapped regions.
+ ON_RESULT_FAILURE {
+ R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions));
+ };
+
+ // Ensure guard pages.
+ R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size));
+ };
+
+ if (R_SUCCEEDED(MapRegions())) {
+ // Set the output address.
+ *out = mapped_address;
+ R_SUCCEED();
+ }
+ }
+
+ // We failed to map anything.
+ R_THROW(RO::ResultOutOfAddressSpace);
+}
+
+Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address,
+ u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size,
+ std::mt19937_64& generate_random) {
+ // Set up the process memory regions.
+ std::array<ProcessMemoryRegion, 2> regions{};
+ const size_t num_regions = SetupNroProcessMemoryRegions(
+ regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
+
+ // Re-map the nro/bss as code memory in the destination process.
+ R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions,
+ generate_random));
+}
+
+Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size,
+ u64 rw_size) {
+ const u64 rx_offset = 0;
+ const u64 ro_offset = rx_offset + rx_size;
+ const u64 rw_offset = ro_offset + ro_size;
+
+ R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size,
+ Kernel::Svc::MemoryPermission::ReadExecute));
+ R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size,
+ Kernel::Svc::MemoryPermission::Read));
+ R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size,
+ Kernel::Svc::MemoryPermission::ReadWrite));
+
+ R_SUCCEED();
+}
+
+Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address,
+ u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
+ // Set up the process memory regions.
+ std::array<ProcessMemoryRegion, 2> regions{};
+ const size_t num_regions = SetupNroProcessMemoryRegions(
+ regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
+
+ // Unmap the nro/bss.
+ R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions));
+}
+
+} // namespace
+
+enum class NrrKind : u8 {
+ User = 0,
+ JitPlugin = 1,
+ Count,
+};
+
+static constexpr size_t ModuleIdSize = 0x20;
+struct ModuleId {
+ std::array<u8, ModuleIdSize> data;
+};
+static_assert(sizeof(ModuleId) == ModuleIdSize);
+
+struct NrrCertification {
+ static constexpr size_t RsaKeySize = 0x100;
+ static constexpr size_t SignedSize = 0x120;
+
+ u64 program_id_mask;
+ u64 program_id_pattern;
+ std::array<u8, 0x10> reserved_10;
+ std::array<u8, RsaKeySize> modulus;
+ std::array<u8, RsaKeySize> signature;
+};
+static_assert(sizeof(NrrCertification) == NrrCertification::RsaKeySize + NrrCertification::SignedSize);
+
+class NrrHeader {
+public:
+ static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0');
+
+public:
+ bool IsMagicValid() const {
+ return m_magic == Magic;
+ }
+
+ bool IsProgramIdValid() const {
+ return (m_program_id & m_certification.program_id_mask) ==
+ m_certification.program_id_pattern;
+ }
+
+ NrrKind GetNrrKind() const {
+ const NrrKind kind = static_cast<NrrKind>(m_nrr_kind);
+ ASSERT(kind < NrrKind::Count);
+ return kind;
+ }
+
+ u64 GetProgramId() const {
+ return m_program_id;
+ }
+
+ u32 GetSize() const {
+ return m_size;
+ }
+
+ u32 GetNumHashes() const {
+ return m_num_hashes;
+ }
+
+ size_t GetHashesOffset() const {
+ return m_hashes_offset;
+ }
+
+ u32 GetKeyGeneration() const {
+ return m_key_generation;
+ }
+
+ const u8* GetCertificationSignature() const {
+ return m_certification.signature.data();
+ }
+
+ const u8* GetCertificationSignedArea() const {
+ return reinterpret_cast<const u8*>(std::addressof(m_certification));
+ }
+
+ const u8* GetCertificationModulus() const {
+ return m_certification.modulus.data();
+ }
+
+ const u8* GetSignature() const {
+ return m_signature.data();
+ }
+
+ size_t GetSignedAreaSize() const {
+ return m_size - GetSignedAreaOffset();
+ }
+
+ static constexpr size_t GetSignedAreaOffset() {
+ return offsetof(NrrHeader, m_program_id);
+ }
+
+private:
+ u32 m_magic;
+ u32 m_key_generation;
+ INSERT_PADDING_BYTES_NOINIT(8);
+ NrrCertification m_certification;
+ std::array<u8, 0x100> m_signature;
+ u64 m_program_id;
+ u32 m_size;
+ u8 m_nrr_kind; // 7.0.0+
+ INSERT_PADDING_BYTES_NOINIT(3);
+ u32 m_hashes_offset;
+ u32 m_num_hashes;
+ INSERT_PADDING_BYTES_NOINIT(8);
+};
+static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size");
+
+static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0');
+struct NroHeader {
+ u32 m_entrypoint_insn;
+ u32 m_mod_offset;
+ INSERT_PADDING_BYTES_NOINIT(0x8);
+ u32 m_magic;
+ INSERT_PADDING_BYTES_NOINIT(0x4);
+ u32 m_size;
+ INSERT_PADDING_BYTES_NOINIT(0x4);
+ u32 m_text_offset;
+ u32 m_text_size;
+ u32 m_ro_offset;
+ u32 m_ro_size;
+ u32 m_rw_offset;
+ u32 m_rw_size;
+ u32 m_bss_size;
+ INSERT_PADDING_BYTES_NOINIT(0x4);
+ ModuleId m_module_id;
+ INSERT_PADDING_BYTES_NOINIT(0x20);
+};
+static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size");
+
namespace {
// Atmosphere defines as follows:
@@ -535,29 +848,21 @@ private:
class RoInterface : public ServiceFramework<RoInterface> {
public:
- explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr<RoContext> ro,
- NrrKind nrr_kind)
- : ServiceFramework{system_, name_}, m_ro(ro), m_context_id(InvalidContextId),
- m_nrr_kind(nrr_kind) {
-
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&RoInterface::MapManualLoadModuleMemory>, "MapManualLoadModuleMemory"},
- {1, C<&RoInterface::UnmapManualLoadModuleMemory>, "UnmapManualLoadModuleMemory"},
- {2, C<&RoInterface::RegisterModuleInfo>, "RegisterModuleInfo"},
- {3, C<&RoInterface::UnregisterModuleInfo>, "UnregisterModuleInfo"},
- {4, C<&RoInterface::RegisterProcessHandle>, "RegisterProcessHandle"},
- {10, C<&RoInterface::RegisterProcessModuleInfo>, "RegisterProcessModuleInfo"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
- }
+ explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr<RoContext> ro, NrrKind nrr_kind)
+ : ServiceFramework{system_, name_}
+ , m_ro(ro)
+ , m_context_id(InvalidContextId)
+ , m_nrr_kind(nrr_kind)
+ {}
~RoInterface() {
m_ro->UnregisterProcess(system.Kernel(), m_context_id);
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
Result MapManualLoadModuleMemory(Out<u64> out_load_address, ClientProcessId client_pid,
u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) {
R_TRY(m_ro->ValidateProcess(m_context_id, *client_pid));
@@ -594,6 +899,14 @@ public:
}
private:
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&RoInterface::MapManualLoadModuleMemory>, "MapManualLoadModuleMemory"},
+ FunctionInfo{1, C<&RoInterface::UnmapManualLoadModuleMemory>, "UnmapManualLoadModuleMemory"},
+ FunctionInfo{2, C<&RoInterface::RegisterModuleInfo>, "RegisterModuleInfo"},
+ FunctionInfo{3, C<&RoInterface::UnregisterModuleInfo>, "UnregisterModuleInfo"},
+ FunctionInfo{4, C<&RoInterface::RegisterProcessHandle>, "RegisterProcessHandle"},
+ FunctionInfo{10, C<&RoInterface::RegisterProcessModuleInfo>, "RegisterProcessModuleInfo"}
+ );
std::shared_ptr<RoContext> m_ro{};
size_t m_context_id{};
NrrKind m_nrr_kind{};
@@ -606,12 +919,14 @@ class IDebugMonitorInterface final : public ServiceFramework<IDebugMonitorInterf
public:
explicit IDebugMonitorInterface(Core::System& system_)
: ServiceFramework{system_, "ro:dmnt"}
- {
- static const FunctionInfo functions[] = {
- { 0, nullptr, "GetProcessModuleInfo" },
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetProcessModuleInfo" }
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/ro/ro_nro_utils.cpp b/src/core/hle/service/ro/ro_nro_utils.cpp
deleted file mode 100644
index 268c7f93e7..0000000000
--- a/src/core/hle/service/ro/ro_nro_utils.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "core/hle/kernel/k_process.h"
-#include "core/hle/service/ro/ro_nro_utils.h"
-#include "core/hle/service/ro/ro_results.h"
-
-namespace Service::RO {
-
-namespace {
-
-struct ProcessMemoryRegion {
- u64 address;
- u64 size;
-};
-
-size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) {
- size_t total = 0;
-
- for (size_t i = 0; i < num_regions; ++i) {
- total += regions[i].size;
- }
-
- return total;
-}
-
-size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address,
- u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
- // Reset region count.
- size_t num_regions = 0;
-
- // We always want a region for the nro.
- regions[num_regions++] = {nro_heap_address, nro_heap_size};
-
- // If we have bss, create a region for bss.
- if (bss_heap_size > 0) {
- regions[num_regions++] = {bss_heap_address, bss_heap_size};
- }
-
- return num_regions;
-}
-
-Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size,
- Kernel::Svc::MemoryPermission permission) {
- auto& page_table = process->GetPageTable();
-
- // Set permission.
- R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission));
-}
-
-Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address,
- const ProcessMemoryRegion* regions, size_t num_regions) {
- // Get the total process memory region size.
- const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions);
-
- auto& page_table = process->GetPageTable();
-
- // Unmap each region in order.
- size_t cur_offset = total_size;
- for (size_t i = 0; i < num_regions; ++i) {
- // We want to unmap in reverse order.
- const auto& cur_region = regions[num_regions - 1 - i];
-
- // Subtract to update the current offset.
- cur_offset -= cur_region.size;
-
- // Unmap.
- R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address,
- cur_region.size));
- }
-
- R_SUCCEED();
-}
-
-Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) {
- Kernel::KMemoryInfo memory_info;
- Kernel::Svc::PageInfo page_info;
-
- // Ensure page before mapping is unmapped.
- R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
- map_address - 1));
- R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
- Kernel::ResultInvalidState);
-
- // Ensure page after mapping is unmapped.
- R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info),
- map_address + map_size));
- R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free,
- Kernel::ResultInvalidState);
-
- // Successfully verified guard pages.
- R_SUCCEED();
-}
-
-Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions,
- size_t num_regions, std::mt19937_64& generate_random) {
- auto& page_table = process->GetPageTable();
- const u64 alias_code_start =
- GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize;
- const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize;
-
- for (size_t trial = 0; trial < 64; trial++) {
- // Generate a new trial address.
- const u64 mapped_address =
- (alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize;
-
- const auto MapRegions = [&] {
- // Map the regions in order.
- u64 mapped_size = 0;
- for (size_t i = 0; i < num_regions; ++i) {
- // If we fail, unmap up to where we've mapped.
- ON_RESULT_FAILURE {
- R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i));
- };
-
- // Map the current region.
- R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address,
- regions[i].size));
-
- mapped_size += regions[i].size;
- }
-
- // If we fail, unmap all mapped regions.
- ON_RESULT_FAILURE {
- R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions));
- };
-
- // Ensure guard pages.
- R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size));
- };
-
- if (R_SUCCEEDED(MapRegions())) {
- // Set the output address.
- *out = mapped_address;
- R_SUCCEED();
- }
- }
-
- // We failed to map anything.
- R_THROW(RO::ResultOutOfAddressSpace);
-}
-
-} // namespace
-
-Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address,
- u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size,
- std::mt19937_64& generate_random) {
- // Set up the process memory regions.
- std::array<ProcessMemoryRegion, 2> regions{};
- const size_t num_regions = SetupNroProcessMemoryRegions(
- regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
-
- // Re-map the nro/bss as code memory in the destination process.
- R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions,
- generate_random));
-}
-
-Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size,
- u64 rw_size) {
- const u64 rx_offset = 0;
- const u64 ro_offset = rx_offset + rx_size;
- const u64 rw_offset = ro_offset + ro_size;
-
- R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size,
- Kernel::Svc::MemoryPermission::ReadExecute));
- R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size,
- Kernel::Svc::MemoryPermission::Read));
- R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size,
- Kernel::Svc::MemoryPermission::ReadWrite));
-
- R_SUCCEED();
-}
-
-Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address,
- u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) {
- // Set up the process memory regions.
- std::array<ProcessMemoryRegion, 2> regions{};
- const size_t num_regions = SetupNroProcessMemoryRegions(
- regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size);
-
- // Unmap the nro/bss.
- R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions));
-}
-
-} // namespace Service::RO
diff --git a/src/core/hle/service/ro/ro_nro_utils.h b/src/core/hle/service/ro/ro_nro_utils.h
deleted file mode 100644
index f7083a1ba3..0000000000
--- a/src/core/hle/service/ro/ro_nro_utils.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include <random>
-
-#include "common/common_types.h"
-
-namespace Kernel {
-class KProcess;
-}
-
-union Result;
-
-namespace Service::RO {
-
-Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address,
- u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size,
- std::mt19937_64& generate_random);
-Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size,
- u64 rw_size);
-Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address,
- u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size);
-
-} // namespace Service::RO
diff --git a/src/core/hle/service/ro/ro_results.h b/src/core/hle/service/ro/ro_results.h
deleted file mode 100644
index 906378bc7f..0000000000
--- a/src/core/hle/service/ro/ro_results.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/result.h"
-
-namespace Service::RO {
-
-constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2};
-constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3};
-constexpr Result ResultInvalidNro{ErrorModule::RO, 4};
-constexpr Result ResultInvalidNrr{ErrorModule::RO, 6};
-constexpr Result ResultTooManyNro{ErrorModule::RO, 7};
-constexpr Result ResultTooManyNrr{ErrorModule::RO, 8};
-constexpr Result ResultNotAuthorized{ErrorModule::RO, 9};
-constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10};
-constexpr Result ResultInternalError{ErrorModule::RO, 1023};
-constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025};
-constexpr Result ResultInvalidSize{ErrorModule::RO, 1026};
-constexpr Result ResultNotLoaded{ErrorModule::RO, 1028};
-constexpr Result ResultNotRegistered{ErrorModule::RO, 1029};
-constexpr Result ResultInvalidSession{ErrorModule::RO, 1030};
-constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031};
-
-} // namespace Service::RO
diff --git a/src/core/hle/service/ro/ro_types.h b/src/core/hle/service/ro/ro_types.h
deleted file mode 100644
index 8e88f43246..0000000000
--- a/src/core/hle/service/ro/ro_types.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "common/assert.h"
-#include "common/common_funcs.h"
-#include "common/common_types.h"
-
-namespace Service::RO {
-
-enum class NrrKind : u8 {
- User = 0,
- JitPlugin = 1,
- Count,
-};
-
-static constexpr size_t ModuleIdSize = 0x20;
-struct ModuleId {
- std::array<u8, ModuleIdSize> data;
-};
-static_assert(sizeof(ModuleId) == ModuleIdSize);
-
-struct NrrCertification {
- static constexpr size_t RsaKeySize = 0x100;
- static constexpr size_t SignedSize = 0x120;
-
- u64 program_id_mask;
- u64 program_id_pattern;
- std::array<u8, 0x10> reserved_10;
- std::array<u8, RsaKeySize> modulus;
- std::array<u8, RsaKeySize> signature;
-};
-static_assert(sizeof(NrrCertification) ==
- NrrCertification::RsaKeySize + NrrCertification::SignedSize);
-
-class NrrHeader {
-public:
- static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0');
-
-public:
- bool IsMagicValid() const {
- return m_magic == Magic;
- }
-
- bool IsProgramIdValid() const {
- return (m_program_id & m_certification.program_id_mask) ==
- m_certification.program_id_pattern;
- }
-
- NrrKind GetNrrKind() const {
- const NrrKind kind = static_cast<NrrKind>(m_nrr_kind);
- ASSERT(kind < NrrKind::Count);
- return kind;
- }
-
- u64 GetProgramId() const {
- return m_program_id;
- }
-
- u32 GetSize() const {
- return m_size;
- }
-
- u32 GetNumHashes() const {
- return m_num_hashes;
- }
-
- size_t GetHashesOffset() const {
- return m_hashes_offset;
- }
-
- u32 GetKeyGeneration() const {
- return m_key_generation;
- }
-
- const u8* GetCertificationSignature() const {
- return m_certification.signature.data();
- }
-
- const u8* GetCertificationSignedArea() const {
- return reinterpret_cast<const u8*>(std::addressof(m_certification));
- }
-
- const u8* GetCertificationModulus() const {
- return m_certification.modulus.data();
- }
-
- const u8* GetSignature() const {
- return m_signature.data();
- }
-
- size_t GetSignedAreaSize() const {
- return m_size - GetSignedAreaOffset();
- }
-
- static constexpr size_t GetSignedAreaOffset() {
- return offsetof(NrrHeader, m_program_id);
- }
-
-private:
- u32 m_magic;
- u32 m_key_generation;
- INSERT_PADDING_BYTES_NOINIT(8);
- NrrCertification m_certification;
- std::array<u8, 0x100> m_signature;
- u64 m_program_id;
- u32 m_size;
- u8 m_nrr_kind; // 7.0.0+
- INSERT_PADDING_BYTES_NOINIT(3);
- u32 m_hashes_offset;
- u32 m_num_hashes;
- INSERT_PADDING_BYTES_NOINIT(8);
-};
-static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size");
-
-static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0');
-struct NroHeader {
- u32 m_entrypoint_insn;
- u32 m_mod_offset;
- INSERT_PADDING_BYTES_NOINIT(0x8);
- u32 m_magic;
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 m_size;
- INSERT_PADDING_BYTES_NOINIT(0x4);
- u32 m_text_offset;
- u32 m_text_size;
- u32 m_ro_offset;
- u32 m_ro_size;
- u32 m_rw_offset;
- u32 m_rw_size;
- u32 m_bss_size;
- INSERT_PADDING_BYTES_NOINIT(0x4);
- ModuleId m_module_id;
- INSERT_PADDING_BYTES_NOINIT(0x20);
-};
-static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size");
-
-} // namespace Service::RO
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index 225b92a783..2c6e8d1c07 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -19,6 +19,7 @@
#include "core/hle/service/service.h"
#include "core/hle/service/sm/sm.h"
#include "core/reporter.h"
+#include "frontend_common/firmware_manager.h"
namespace Service {
@@ -47,24 +48,9 @@ ServiceFrameworkBase::~ServiceFrameworkBase() {
const auto guard = ServiceFrameworkBase::LockService();
}
-void ServiceFrameworkBase::RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n) {
- // Usually this array is sorted by id already, so hint to insert at the end
- handlers.reserve(handlers.size() + n);
- for (std::size_t i = 0; i < n; ++i)
- handlers.emplace_hint(handlers.cend(), functions[i].expected_header, functions[i]);
-}
-
-void ServiceFrameworkBase::RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n) {
- // Usually this array is sorted by id already, so hint to insert at the end
- handlers_tipc.reserve(handlers_tipc.size() + n);
- for (std::size_t i = 0; i < n; ++i)
- handlers_tipc.emplace_hint(handlers_tipc.cend(), functions[i].expected_header, functions[i]);
-}
-
-void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx,
- const FunctionInfoBase* info) {
+void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated) {
auto cmd_buf = ctx.CommandBuffer();
- std::string function_name = info == nullptr ? "<unknown>" : info->name;
+ std::string function_name = bool(info) ? info->name : "<unknown>";
fmt::memory_buffer buf;
fmt::format_to(std::back_inserter(buf), "function '{}({})': port='{}' cmd_buf={{[0]={:#x}", ctx.GetCommand(), function_name, service_name, cmd_buf[0]);
@@ -73,7 +59,11 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx,
buf.push_back('}');
system.GetReporter().SaveUnimplementedFunctionReport(ctx, ctx.GetCommand(), function_name, service_name);
- UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf));
+ if (gated) {
+ LOG_ERROR(Service, "Version gated {}", fmt::to_string(buf));
+ } else {
+ UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf));
+ }
if (Settings::values.use_auto_stub) {
LOG_WARNING(Service, "Using auto stub fallback!");
IPC::ResponseBuilder rb{ctx, 2};
@@ -81,17 +71,33 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx,
}
}
+[[nodiscard]] static bool VersionGateCheck(Core::System& system, u32 vg) {
+ u32 const c_maj = FirmwareManager::GetFirmwareVersion(system).first.major;
+ u32 const c_min = FirmwareManager::GetFirmwareVersion(system).first.minor;
+ u32 const c_pat = FirmwareManager::GetFirmwareVersion(system).first.micro;
+ u32 const cg = (c_pat << 0) | (c_min << 4) | (c_maj << 8);
+ u32 const sg = (vg >> 16) & 0xffff;
+ u32 const ug = vg & 0xffff;
+ // feature available after current
+ if (sg && cg < sg)
+ return false;
+ // feature until xxx (0 = up to current)
+ return ug ? ug >= cg : true;
+}
+
void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) {
- const auto command = ctx.GetCommand();
- auto it = handlers.find(command);
- const bool is_cmd_read = command == 0;
- FunctionInfoBase const* info = it == handlers.end() ? nullptr : &it->second;
- if (info == nullptr || info->handler_callback == nullptr)
- return ReportUnimplementedFunction(ctx, info);
+ const bool is_cmd_read = ctx.GetCommand() == 0;
+ auto const info = FindRequest(ctx.GetCommand());
+ if (!info.has_value() || info->handler_callback == nullptr)
+ return ReportUnimplementedFunction(ctx, &*info, false);
+
+ if (!VersionGateCheck(system, info->version_gating))
+ {
+ return ReportUnimplementedFunction(ctx, &*info, true);
+ }
LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer()));
handler_invoker(this, info->handler_callback, ctx);
-
if (is_i_storage && is_cmd_read) {
const auto* const process = ctx.GetThread().GetOwnerProcess();
if (process != nullptr && system.IsNVDECActiveForProcess(process->GetId())) {
@@ -101,10 +107,15 @@ void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) {
}
void ServiceFrameworkBase::InvokeRequestTipc(HLERequestContext& ctx) {
- auto it = handlers_tipc.find(ctx.GetCommand());
- FunctionInfoBase const* info = it == handlers_tipc.end() ? nullptr : &it->second;
- if (info == nullptr || info->handler_callback == nullptr)
- return ReportUnimplementedFunction(ctx, info);
+ auto const info = FindRequestTipc(ctx.GetCommand());
+ if (!info.has_value() || info->handler_callback == nullptr)
+ return ReportUnimplementedFunction(ctx, &*info, false);
+
+ LOG_ERROR(Service, "check for {} version_gating: {}", info->name, info->version_gating);
+ if (!VersionGateCheck(system, info->version_gating))
+ {
+ return ReportUnimplementedFunction(ctx, &*info, true);
+ }
LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer()));
handler_invoker(this, info->handler_callback, ctx);
diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h
index ea98897e79..e8bd8683ea 100644
--- a/src/core/hle/service/service.h
+++ b/src/core/hle/service/service.h
@@ -7,7 +7,11 @@
#pragma once
#include <cstddef>
+#include <memory>
#include <mutex>
+#include <tuple>
+#include <type_traits>
+#include "frozen/map.h"
#include "common/container/unordered_map.h"
#include "common/common_types.h"
#include "core/hle/service/hle_ipc.h"
@@ -77,30 +81,35 @@ protected:
[[nodiscard]] virtual std::unique_lock<std::mutex> LockService() noexcept {
return std::unique_lock{lock_service};
}
-private:
- template <typename T>
- friend class ServiceFramework;
+
+ static constexpr u32 MakeVersionGate(std::tuple<u32, u32, u32> since, std::tuple<u32, u32, u32> until = {0, 0, 0}) {
+ auto const [s_maj, s_min, s_pat] = since;
+ auto const [u_maj, u_min, u_pat] = until;
+ return (u_pat << 0) | (u_min << 4) | (u_maj << 8)
+ | (s_pat << 16) | (s_min << 20) | (s_maj << 24);
+ }
struct FunctionInfoBase {
- u32 expected_header;
HandlerFnP<ServiceFrameworkBase> handler_callback;
const char* name;
+ u32 version_gating;
};
+ static_assert(std::is_trivially_constructible_v<FunctionInfoBase>);
+private:
+ template <typename T>
+ friend class ServiceFramework;
- using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP<ServiceFrameworkBase> member,
- HLERequestContext& ctx);
+ using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP<ServiceFrameworkBase> member, HLERequestContext& ctx);
- explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_,
- u32 max_sessions_, InvokerFn* handler_invoker_);
+ explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_, u32 max_sessions_, InvokerFn* handler_invoker_);
~ServiceFrameworkBase() override;
- void RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n);
- void RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n);
- void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info);
+ virtual std::optional<FunctionInfoBase> FindRequest(u32 key) = 0;
+ virtual std::optional<FunctionInfoBase> FindRequestTipc(u32 key) = 0;
+
+ void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated);
protected:
- ::Common::unordered_map<u32, FunctionInfoBase> handlers;
- ::Common::unordered_map<u32, FunctionInfoBase> handlers_tipc;
/// Used to gain exclusive access to the service members, e.g. from CoreTiming thread.
std::mutex lock_service;
/// System context that the service operates under.
@@ -121,8 +130,7 @@ protected:
/**
* Framework for implementing HLE services. Dispatches on the header id of incoming SyncRequests
* based on a table mapping header ids to handler functions. Service implementations should inherit
- * from ServiceFramework using the CRTP (`class Foo : public ServiceFramework<Foo> { ... };`) and
- * populate it with handlers by calling #RegisterHandlers.
+ * from ServiceFramework using the CRTP (`class Foo : public ServiceFramework<Foo> { ... };`)
*
* In order to avoid duplicating code in the binary and exposing too many implementation details in
* the header, this class is split into a non-templated base (ServiceFrameworkBase) and a template
@@ -143,50 +151,77 @@ protected:
/// @param expected_header_ request header in the command buffer which will trigger dispatch to this handler
/// @param handler_callback_ member function in this service which will be called to handle the request
/// @param name_ human-friendly name for the request. Used mostly for logging purposes.
- FunctionInfoTyped(u32 expected_header_, HandlerFnP<T> handler_callback_, const char* name_)
- : FunctionInfoBase{expected_header_, HandlerFnP<ServiceFrameworkBase>(handler_callback_), name_} {}
+ explicit constexpr FunctionInfoTyped(u32 expected_header_, HandlerFnP<T> handler_callback_, const char* name_, u32 version_gating_ = 0)
+ : handler_callback{handler_callback_}
+ , name{name_}
+ , version_gating{version_gating_}
+ , expected_header{expected_header_}
+ {}
+ HandlerFnP<T> handler_callback;
+ const char* name;
+ u32 version_gating;
+ u32 expected_header;
};
using FunctionInfo = FunctionInfoTyped<Self>;
- /**
- * Initializes the handler with no functions installed.
- *
- * @param system_ The system context to construct this service under.
- * @param service_name_ Name of the service.
- * @param max_sessions_ Maximum number of sessions that can be connected to this service at the
- * same time.
- */
- explicit ServiceFramework(Core::System& system_, const char* service_name_, u32 max_sessions_ = ServerSessionCountMax)
- : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker) {}
+ // expected_header serves as a key to 'address' function handlers, thus only include the minimal
+ template <typename T>
+ struct FunctionValueInfo {
+ explicit constexpr FunctionValueInfo(HandlerFnP<T> handler_callback_, const char* name_, u32 version_gating_)
+ : handler_callback{handler_callback_}
+ , name{name_}
+ , version_gating{version_gating_}
+ {}
+ HandlerFnP<T> handler_callback;
+ const char* name;
+ u32 version_gating;
+ };
- /// Registers handlers in the service.
- template <typename T = Self, std::size_t N>
- void RegisterHandlers(const FunctionInfoTyped<T> (&functions)[N]) {
- RegisterHandlers(functions, N);
+ template<typename ...Ts>
+ //requires (std::same_as<Ts, FunctionInfo> && ...)
+ [[nodiscard]] static consteval frozen::map<u32, FunctionValueInfo<Self>, sizeof...(Ts)> CreateStaticMap(Ts... args) {
+ return frozen::map<u32, FunctionValueInfo<Self>, sizeof...(args)>{
+ {args.expected_header, FunctionValueInfo<Self>{args.handler_callback, args.name, args.version_gating}}...
+ };
}
- /**
- * Registers handlers in the service. Usually prefer using the other RegisterHandlers
- * overload in order to avoid needing to specify the array size.
- */
- template <typename T = Self>
- void RegisterHandlers(const FunctionInfoTyped<T>* functions, std::size_t n) {
- RegisterHandlersBase(functions, n);
+ // Used exclusively by NFC
+ template<typename T, typename ...Ts>
+ //requires (std::same_as<Ts, FunctionInfoTyped<T>> && ...)
+ [[nodiscard]] static consteval frozen::map<u32, FunctionValueInfo<T>, sizeof...(Ts)> CreateStaticMapWithClass(Ts... args) {
+ return frozen::map<u32, FunctionValueInfo<T>, sizeof...(args)>{
+ {args.expected_header, FunctionValueInfo<T>{args.handler_callback, args.name, args.version_gating}}...
+ };
}
- /// Registers handlers in the service.
- template <typename T = Self, std::size_t N>
- void RegisterHandlersTipc(const FunctionInfoTyped<T> (&functions)[N]) {
- RegisterHandlersTipc(functions, N);
+ template<typename T>
+ [[nodiscard]] static std::optional<FunctionInfoBase> HandlerTableGenerateWithFind(u32 key, T const& map) {
+ auto const it = map.find(key);
+ if (it != map.end()) {
+ auto const r = it->second;
+ return std::optional<FunctionInfoBase>{{
+ HandlerFnP<ServiceFrameworkBase>(r.handler_callback),
+ r.name,
+ r.version_gating
+ }};
+ }
+ return std::nullopt;
}
- /**
- * Registers handlers in the service. Usually prefer using the other RegisterHandlers
- * overload in order to avoid needing to specify the array size.
- */
- template <typename T = Self>
- void RegisterHandlersTipc(const FunctionInfoTyped<T>* functions, std::size_t n) {
- RegisterHandlersBaseTipc(functions, n);
+ /// @brief Initializes the handler with no functions installed.
+ /// @param system_ The system context to construct this service under.
+ /// @param service_name_ Name of the service.
+ /// @param max_sessions_ Maximum number of sessions that can be connected to this service at the
+ /// same time.
+ explicit ServiceFramework(Core::System& system_, const char* service_name_, u32 max_sessions_ = ServerSessionCountMax)
+ : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker)
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ UNREACHABLE();
+ }
+ std::optional<FunctionInfoBase> FindRequestTipc(u32 key) override {
+ UNREACHABLE();
}
protected:
diff --git a/src/core/hle/service/set/factory_settings_server.cpp b/src/core/hle/service/set/factory_settings_server.cpp
index a8e307ae26..70d02fab3b 100644
--- a/src/core/hle/service/set/factory_settings_server.cpp
+++ b/src/core/hle/service/set/factory_settings_server.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -7,55 +10,6 @@ namespace Service::Set {
IFactorySettingsServer::IFactorySettingsServer(Core::System& system_)
: ServiceFramework{system_, "set:cal"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetBluetoothBdAddress"},
- {1, nullptr, "GetConfigurationId1"},
- {2, nullptr, "GetAccelerometerOffset"},
- {3, nullptr, "GetAccelerometerScale"},
- {4, nullptr, "GetGyroscopeOffset"},
- {5, nullptr, "GetGyroscopeScale"},
- {6, nullptr, "GetWirelessLanMacAddress"},
- {7, nullptr, "GetWirelessLanCountryCodeCount"},
- {8, nullptr, "GetWirelessLanCountryCodes"},
- {9, nullptr, "GetSerialNumber"},
- {10, nullptr, "SetInitialSystemAppletProgramId"},
- {11, nullptr, "SetOverlayDispProgramId"},
- {12, nullptr, "GetBatteryLot"},
- {14, nullptr, "GetEciDeviceCertificate"},
- {15, nullptr, "GetEticketDeviceCertificate"},
- {16, nullptr, "GetSslKey"},
- {17, nullptr, "GetSslCertificate"},
- {18, nullptr, "GetGameCardKey"},
- {19, nullptr, "GetGameCardCertificate"},
- {20, nullptr, "GetEciDeviceKey"},
- {21, nullptr, "GetEticketDeviceKey"},
- {22, nullptr, "GetSpeakerParameter"},
- {23, nullptr, "GetLcdVendorId"},
- {24, nullptr, "GetEciDeviceCertificate2"},
- {25, nullptr, "GetEciDeviceKey2"},
- {26, nullptr, "GetAmiiboKey"},
- {27, nullptr, "GetAmiiboEcqvCertificate"},
- {28, nullptr, "GetAmiiboEcdsaCertificate"},
- {29, nullptr, "GetAmiiboEcqvBlsKey"},
- {30, nullptr, "GetAmiiboEcqvBlsCertificate"},
- {31, nullptr, "GetAmiiboEcqvBlsRootCertificate"},
- {32, nullptr, "GetUsbTypeCPowerSourceCircuitVersion"},
- {33, nullptr, "GetAnalogStickModuleTypeL"},
- {34, nullptr, "GetAnalogStickModelParameterL"},
- {35, nullptr, "GetAnalogStickFactoryCalibrationL"},
- {36, nullptr, "GetAnalogStickModuleTypeR"},
- {37, nullptr, "GetAnalogStickModelParameterR"},
- {38, nullptr, "GetAnalogStickFactoryCalibrationR"},
- {39, nullptr, "GetConsoleSixAxisSensorModuleType"},
- {40, nullptr, "GetConsoleSixAxisSensorHorizontalOffset"},
- {41, nullptr, "GetBatteryVersion"},
- {42, nullptr, "GetDeviceId"},
- {43, nullptr, "GetConsoleSixAxisSensorMountType"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IFactorySettingsServer::~IFactorySettingsServer() = default;
diff --git a/src/core/hle/service/set/factory_settings_server.h b/src/core/hle/service/set/factory_settings_server.h
index e64cd13809..dcc329f9c2 100644
--- a/src/core/hle/service/set/factory_settings_server.h
+++ b/src/core/hle/service/set/factory_settings_server.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,55 @@ class IFactorySettingsServer final : public ServiceFramework<IFactorySettingsSer
public:
explicit IFactorySettingsServer(Core::System& system_);
~IFactorySettingsServer() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetBluetoothBdAddress"},
+ FunctionInfo{1, nullptr, "GetConfigurationId1"},
+ FunctionInfo{2, nullptr, "GetAccelerometerOffset"},
+ FunctionInfo{3, nullptr, "GetAccelerometerScale"},
+ FunctionInfo{4, nullptr, "GetGyroscopeOffset"},
+ FunctionInfo{5, nullptr, "GetGyroscopeScale"},
+ FunctionInfo{6, nullptr, "GetWirelessLanMacAddress"},
+ FunctionInfo{7, nullptr, "GetWirelessLanCountryCodeCount"},
+ FunctionInfo{8, nullptr, "GetWirelessLanCountryCodes"},
+ FunctionInfo{9, nullptr, "GetSerialNumber"},
+ FunctionInfo{10, nullptr, "SetInitialSystemAppletProgramId"},
+ FunctionInfo{11, nullptr, "SetOverlayDispProgramId"},
+ FunctionInfo{12, nullptr, "GetBatteryLot"},
+ FunctionInfo{14, nullptr, "GetEciDeviceCertificate"},
+ FunctionInfo{15, nullptr, "GetEticketDeviceCertificate"},
+ FunctionInfo{16, nullptr, "GetSslKey"},
+ FunctionInfo{17, nullptr, "GetSslCertificate"},
+ FunctionInfo{18, nullptr, "GetGameCardKey"},
+ FunctionInfo{19, nullptr, "GetGameCardCertificate"},
+ FunctionInfo{20, nullptr, "GetEciDeviceKey"},
+ FunctionInfo{21, nullptr, "GetEticketDeviceKey"},
+ FunctionInfo{22, nullptr, "GetSpeakerParameter"},
+ FunctionInfo{23, nullptr, "GetLcdVendorId"},
+ FunctionInfo{24, nullptr, "GetEciDeviceCertificate2"},
+ FunctionInfo{25, nullptr, "GetEciDeviceKey2"},
+ FunctionInfo{26, nullptr, "GetAmiiboKey"},
+ FunctionInfo{27, nullptr, "GetAmiiboEcqvCertificate"},
+ FunctionInfo{28, nullptr, "GetAmiiboEcdsaCertificate"},
+ FunctionInfo{29, nullptr, "GetAmiiboEcqvBlsKey"},
+ FunctionInfo{30, nullptr, "GetAmiiboEcqvBlsCertificate"},
+ FunctionInfo{31, nullptr, "GetAmiiboEcqvBlsRootCertificate"},
+ FunctionInfo{32, nullptr, "GetUsbTypeCPowerSourceCircuitVersion"},
+ FunctionInfo{33, nullptr, "GetAnalogStickModuleTypeL"},
+ FunctionInfo{34, nullptr, "GetAnalogStickModelParameterL"},
+ FunctionInfo{35, nullptr, "GetAnalogStickFactoryCalibrationL"},
+ FunctionInfo{36, nullptr, "GetAnalogStickModuleTypeR"},
+ FunctionInfo{37, nullptr, "GetAnalogStickModelParameterR"},
+ FunctionInfo{38, nullptr, "GetAnalogStickFactoryCalibrationR"},
+ FunctionInfo{39, nullptr, "GetConsoleSixAxisSensorModuleType"},
+ FunctionInfo{40, nullptr, "GetConsoleSixAxisSensorHorizontalOffset"},
+ FunctionInfo{41, nullptr, "GetBatteryVersion"},
+ FunctionInfo{42, nullptr, "GetDeviceId"},
+ FunctionInfo{43, nullptr, "GetConsoleSixAxisSensorMountType"}
+ );
};
} // namespace Service::Set
diff --git a/src/core/hle/service/set/firmware_debug_settings_server.cpp b/src/core/hle/service/set/firmware_debug_settings_server.cpp
index b7c66047e6..35fb43f7e7 100644
--- a/src/core/hle/service/set/firmware_debug_settings_server.cpp
+++ b/src/core/hle/service/set/firmware_debug_settings_server.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -10,23 +10,6 @@ namespace Service::Set {
IFirmwareDebugSettingsServer::IFirmwareDebugSettingsServer(Core::System& system_)
: ServiceFramework{system_, "set:fd"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {2, nullptr, "SetSettingsItemValue"},
- {3, nullptr, "ResetSettingsItemValue"},
- {4, nullptr, "CreateSettingsItemKeyIterator"},
- {10, nullptr, "ReadSettings"},
- {11, nullptr, "ResetSettings"},
- {20, nullptr, "SetWebInspectorFlag"},
- {21, nullptr, "SetAllowedSslHosts"},
- {22, nullptr, "SetHostFsMountPoint"},
- {23, nullptr, "SetMemoryUsageRateFlag"},
- {24, nullptr, "CommitSettings"}, //20.0.0+
- {27, nullptr, "SetHttpAuthConfigs"}, //21.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IFirmwareDebugSettingsServer::~IFirmwareDebugSettingsServer() = default;
diff --git a/src/core/hle/service/set/firmware_debug_settings_server.h b/src/core/hle/service/set/firmware_debug_settings_server.h
index 5dae2263e9..3727a1a94c 100644
--- a/src/core/hle/service/set/firmware_debug_settings_server.h
+++ b/src/core/hle/service/set/firmware_debug_settings_server.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -15,6 +18,23 @@ class IFirmwareDebugSettingsServer final : public ServiceFramework<IFirmwareDebu
public:
explicit IFirmwareDebugSettingsServer(Core::System& system_);
~IFirmwareDebugSettingsServer() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{2, nullptr, "SetSettingsItemValue"},
+ FunctionInfo{3, nullptr, "ResetSettingsItemValue"},
+ FunctionInfo{4, nullptr, "CreateSettingsItemKeyIterator"},
+ FunctionInfo{10, nullptr, "ReadSettings"},
+ FunctionInfo{11, nullptr, "ResetSettings"},
+ FunctionInfo{20, nullptr, "SetWebInspectorFlag"},
+ FunctionInfo{21, nullptr, "SetAllowedSslHosts"},
+ FunctionInfo{22, nullptr, "SetHostFsMountPoint"},
+ FunctionInfo{23, nullptr, "SetMemoryUsageRateFlag"},
+ FunctionInfo{24, nullptr, "CommitSettings", MakeVersionGate({20,0,0})},
+ FunctionInfo{27, nullptr, "SetHttpAuthConfigs", MakeVersionGate({21,0,0})}
+ );
};
} // namespace Service::Set
diff --git a/src/core/hle/service/set/settings_server.cpp b/src/core/hle/service/set/settings_server.cpp
index 942dddc9bc..4580cb723b 100644
--- a/src/core/hle/service/set/settings_server.cpp
+++ b/src/core/hle/service/set/settings_server.cpp
@@ -89,26 +89,26 @@ LanguageCode GetLanguageCodeFromIndex(std::size_t index) {
return available_language_codes.at(index);
}
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ISettingsServer::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&ISettingsServer::GetLanguageCode>, "GetLanguageCode"},
+ FunctionInfo{1, C<&ISettingsServer::GetAvailableLanguageCodes>, "GetAvailableLanguageCodes"},
+ FunctionInfo{2, C<&ISettingsServer::MakeLanguageCode>, "MakeLanguageCode"},
+ FunctionInfo{3, C<&ISettingsServer::GetAvailableLanguageCodeCount>, "GetAvailableLanguageCodeCount"},
+ FunctionInfo{4, C<&ISettingsServer::GetRegionCode>, "GetRegionCode"},
+ FunctionInfo{5, C<&ISettingsServer::GetAvailableLanguageCodes2>, "GetAvailableLanguageCodes2"},
+ FunctionInfo{6, C<&ISettingsServer::GetAvailableLanguageCodeCount2>, "GetAvailableLanguageCodeCount2"},
+ FunctionInfo{7, C<&ISettingsServer::GetKeyCodeMap>, "GetKeyCodeMap"},
+ FunctionInfo{8, C<&ISettingsServer::GetQuestFlag>, "GetQuestFlag"},
+ FunctionInfo{9, C<&ISettingsServer::GetKeyCodeMap2>, "GetKeyCodeMap2"},
+ FunctionInfo{10, nullptr, "GetFirmwareVersionForDebug"},
+ FunctionInfo{11, C<&ISettingsServer::GetDeviceNickName>, "GetDeviceNickName"},
+ FunctionInfo{12, C<&ISettingsServer::GetKeyCodeMapByPort>, "GetKeyCodeMapByPort"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
ISettingsServer::ISettingsServer(Core::System& system_) : ServiceFramework{system_, "set"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&ISettingsServer::GetLanguageCode>, "GetLanguageCode"},
- {1, C<&ISettingsServer::GetAvailableLanguageCodes>, "GetAvailableLanguageCodes"},
- {2, C<&ISettingsServer::MakeLanguageCode>, "MakeLanguageCode"},
- {3, C<&ISettingsServer::GetAvailableLanguageCodeCount>, "GetAvailableLanguageCodeCount"},
- {4, C<&ISettingsServer::GetRegionCode>, "GetRegionCode"},
- {5, C<&ISettingsServer::GetAvailableLanguageCodes2>, "GetAvailableLanguageCodes2"},
- {6, C<&ISettingsServer::GetAvailableLanguageCodeCount2>, "GetAvailableLanguageCodeCount2"},
- {7, C<&ISettingsServer::GetKeyCodeMap>, "GetKeyCodeMap"},
- {8, C<&ISettingsServer::GetQuestFlag>, "GetQuestFlag"},
- {9, C<&ISettingsServer::GetKeyCodeMap2>, "GetKeyCodeMap2"},
- {10, nullptr, "GetFirmwareVersionForDebug"},
- {11, C<&ISettingsServer::GetDeviceNickName>, "GetDeviceNickName"},
- {12, C<&ISettingsServer::GetKeyCodeMapByPort>, "GetKeyCodeMapByPort"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
ISettingsServer::~ISettingsServer() = default;
diff --git a/src/core/hle/service/set/settings_server.h b/src/core/hle/service/set/settings_server.h
index a9cee5f626..2aa487b8b1 100644
--- a/src/core/hle/service/set/settings_server.h
+++ b/src/core/hle/service/set/settings_server.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -23,31 +26,19 @@ public:
private:
Result GetLanguageCode(Out<LanguageCode> out_language_code);
-
- Result GetAvailableLanguageCodes(Out<s32> out_count,
- OutArray<LanguageCode, BufferAttr_HipcPointer> language_codes);
-
+ Result GetAvailableLanguageCodes(Out<s32> out_count, OutArray<LanguageCode, BufferAttr_HipcPointer> language_codes);
Result MakeLanguageCode(Out<LanguageCode> out_language_code, Language language);
-
Result GetAvailableLanguageCodeCount(Out<s32> out_count);
-
Result GetRegionCode(Out<SystemRegionCode> out_region_code);
-
- Result GetAvailableLanguageCodes2(
- Out<s32> out_count, OutArray<LanguageCode, BufferAttr_HipcMapAlias> language_codes);
-
+ Result GetAvailableLanguageCodes2(Out<s32> out_count, OutArray<LanguageCode, BufferAttr_HipcMapAlias> language_codes);
Result GetAvailableLanguageCodeCount2(Out<s32> out_count);
-
Result GetKeyCodeMap(OutLargeData<KeyCodeMap, BufferAttr_HipcMapAlias> out_key_code_map);
-
Result GetQuestFlag(Out<bool> out_quest_flag);
-
Result GetKeyCodeMap2(OutLargeData<KeyCodeMap, BufferAttr_HipcMapAlias> out_key_code_map);
-
- Result GetDeviceNickName(
- OutLargeData<std::array<u8, 0x80>, BufferAttr_HipcMapAlias> out_device_name);
-
+ Result GetDeviceNickName(OutLargeData<std::array<u8, 0x80>, BufferAttr_HipcMapAlias> out_device_name);
Result GetKeyCodeMapByPort(OutLargeData<KeyCodeMap, BufferAttr_HipcMapAlias> out_key_code_map, u32 port);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
};
} // namespace Service::Set
diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp
index 52642e37f7..925207d927 100644
--- a/src/core/hle/service/set/system_settings_server.cpp
+++ b/src/core/hle/service/set/system_settings_server.cpp
@@ -114,240 +114,239 @@ Result GetFirmwareVersionImpl(FirmwareVersionFormat& out_firmware, Core::System&
return ResultSuccess;
}
-ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
- : ServiceFramework{system_, "set:sys"}, m_system{system} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, C<&ISystemSettingsServer::SetLanguageCode>, "SetLanguageCode"},
- {1, nullptr, "SetNetworkSettings"},
- {2, nullptr, "GetNetworkSettings"},
- {3, C<&ISystemSettingsServer::GetFirmwareVersion>, "GetFirmwareVersion"},
- {4, C<&ISystemSettingsServer::GetFirmwareVersion2>, "GetFirmwareVersion2"},
- {5, nullptr, "GetFirmwareVersionDigest"},
- {7, C<&ISystemSettingsServer::GetLockScreenFlag>, "GetLockScreenFlag"},
- {8, C<&ISystemSettingsServer::SetLockScreenFlag>, "SetLockScreenFlag"},
- {9, nullptr, "GetBacklightSettings"},
- {10, nullptr, "SetBacklightSettings"},
- {11, nullptr, "SetBluetoothDevicesSettings"},
- {12, nullptr, "GetBluetoothDevicesSettings"},
- {13, C<&ISystemSettingsServer::GetExternalSteadyClockSourceId>, "GetExternalSteadyClockSourceId"},
- {14, C<&ISystemSettingsServer::SetExternalSteadyClockSourceId>, "SetExternalSteadyClockSourceId"},
- {15, C<&ISystemSettingsServer::GetUserSystemClockContext>, "GetUserSystemClockContext"},
- {16, C<&ISystemSettingsServer::SetUserSystemClockContext>, "SetUserSystemClockContext"},
- {17, C<&ISystemSettingsServer::GetAccountSettings>, "GetAccountSettings"},
- {18, C<&ISystemSettingsServer::SetAccountSettings>, "SetAccountSettings"},
- {19, nullptr, "GetAudioVolume"},
- {20, nullptr, "SetAudioVolume"},
- {21, C<&ISystemSettingsServer::GetEulaVersions>, "GetEulaVersions"},
- {22, C<&ISystemSettingsServer::SetEulaVersions>, "SetEulaVersions"},
- {23, C<&ISystemSettingsServer::GetColorSetId>, "GetColorSetId"},
- {24, C<&ISystemSettingsServer::SetColorSetId>, "SetColorSetId"},
- {25, C<&ISystemSettingsServer::GetConsoleInformationUploadFlag>, "GetConsoleInformationUploadFlag"},
- {26, C<&ISystemSettingsServer::SetConsoleInformationUploadFlag>, "SetConsoleInformationUploadFlag"},
- {27, C<&ISystemSettingsServer::GetAutomaticApplicationDownloadFlag>, "GetAutomaticApplicationDownloadFlag"},
- {28, C<&ISystemSettingsServer::SetAutomaticApplicationDownloadFlag>, "SetAutomaticApplicationDownloadFlag"},
- {29, C<&ISystemSettingsServer::GetNotificationSettings>, "GetNotificationSettings"},
- {30, C<&ISystemSettingsServer::SetNotificationSettings>, "SetNotificationSettings"},
- {31, C<&ISystemSettingsServer::GetAccountNotificationSettings>, "GetAccountNotificationSettings"},
- {32, C<&ISystemSettingsServer::SetAccountNotificationSettings>, "SetAccountNotificationSettings"},
- {35, C<&ISystemSettingsServer::GetVibrationMasterVolume>, "GetVibrationMasterVolume"},
- {36, C<&ISystemSettingsServer::SetVibrationMasterVolume>, "SetVibrationMasterVolume"},
- {37, C<&ISystemSettingsServer::GetSettingsItemValueSize>, "GetSettingsItemValueSize"},
- {38, C<&ISystemSettingsServer::GetSettingsItemValue>, "GetSettingsItemValue"},
- {39, C<&ISystemSettingsServer::GetTvSettings>, "GetTvSettings"},
- {40, C<&ISystemSettingsServer::SetTvSettings>, "SetTvSettings"},
- {41, nullptr, "GetEdid"},
- {42, nullptr, "SetEdid"},
- {43, C<&ISystemSettingsServer::GetAudioOutputMode>, "GetAudioOutputMode"},
- {44, C<&ISystemSettingsServer::SetAudioOutputMode>, "SetAudioOutputMode"},
- {45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag>, "GetSpeakerAutoMuteFlag"},
- {46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag>, "SetSpeakerAutoMuteFlag"},
- {47, C<&ISystemSettingsServer::GetQuestFlag>, "GetQuestFlag"},
- {48, C<&ISystemSettingsServer::SetQuestFlag>, "SetQuestFlag"},
- {49, nullptr, "GetDataDeletionSettings"},
- {50, nullptr, "SetDataDeletionSettings"},
- {51, nullptr, "GetInitialSystemAppletProgramId"},
- {52, nullptr, "GetOverlayDispProgramId"},
- {53, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationName>, "GetDeviceTimeZoneLocationName"},
- {54, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationName>, "SetDeviceTimeZoneLocationName"},
- {55, nullptr, "GetWirelessCertificationFileSize"},
- {56, nullptr, "GetWirelessCertificationFile"},
- {57, C<&ISystemSettingsServer::SetRegionCode>, "SetRegionCode"},
- {58, C<&ISystemSettingsServer::GetNetworkSystemClockContext>, "GetNetworkSystemClockContext"},
- {59, C<&ISystemSettingsServer::SetNetworkSystemClockContext>, "SetNetworkSystemClockContext"},
- {60, C<&ISystemSettingsServer::IsUserSystemClockAutomaticCorrectionEnabled>, "IsUserSystemClockAutomaticCorrectionEnabled"},
- {61, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled>, "SetUserSystemClockAutomaticCorrectionEnabled"},
- {62, C<&ISystemSettingsServer::GetDebugModeFlag>, "GetDebugModeFlag"},
- {63, C<&ISystemSettingsServer::GetPrimaryAlbumStorage>, "GetPrimaryAlbumStorage"},
- {64, C<&ISystemSettingsServer::SetPrimaryAlbumStorage>, "SetPrimaryAlbumStorage"},
- {65, C<&ISystemSettingsServer::GetUsb30EnableFlag>, "GetUsb30EnableFlag"},
- {66, C<&ISystemSettingsServer::SetUsb30EnableFlag>, "SetUsb30EnableFlag"},
- {67, C<&ISystemSettingsServer::GetBatteryLot>, "GetBatteryLot"},
- {68, C<&ISystemSettingsServer::GetSerialNumber>, "GetSerialNumber"},
- {69, C<&ISystemSettingsServer::GetNfcEnableFlag>, "GetNfcEnableFlag"},
- {70, C<&ISystemSettingsServer::SetNfcEnableFlag>, "SetNfcEnableFlag"},
- {71, C<&ISystemSettingsServer::GetSleepSettings>, "GetSleepSettings"},
- {72, C<&ISystemSettingsServer::SetSleepSettings>, "SetSleepSettings"},
- {73, C<&ISystemSettingsServer::GetWirelessLanEnableFlag>, "GetWirelessLanEnableFlag"},
- {74, C<&ISystemSettingsServer::SetWirelessLanEnableFlag>, "SetWirelessLanEnableFlag"},
- {75, C<&ISystemSettingsServer::GetInitialLaunchSettings>, "GetInitialLaunchSettings"},
- {76, C<&ISystemSettingsServer::SetInitialLaunchSettings>, "SetInitialLaunchSettings"},
- {77, C<&ISystemSettingsServer::GetDeviceNickName>, "GetDeviceNickName"},
- {78, C<&ISystemSettingsServer::SetDeviceNickName>, "SetDeviceNickName"},
- {79, C<&ISystemSettingsServer::GetProductModel>, "GetProductModel"},
- {80, nullptr, "GetLdnChannel"},
- {81, nullptr, "SetLdnChannel"},
- {82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"},
- {83, nullptr, "GetTelemetryDirtyFlags"},
- {84, nullptr, "GetPtmBatteryLot"},
- {85, nullptr, "SetPtmBatteryLot"},
- {86, nullptr, "GetPtmFuelGaugeParameter"},
- {87, nullptr, "SetPtmFuelGaugeParameter"},
- {88, C<&ISystemSettingsServer::GetBluetoothEnableFlag>, "GetBluetoothEnableFlag"},
- {89, C<&ISystemSettingsServer::SetBluetoothEnableFlag>, "SetBluetoothEnableFlag"},
- {90, C<&ISystemSettingsServer::GetMiiAuthorId>, "GetMiiAuthorId"},
- {91, nullptr, "SetShutdownRtcValue"},
- {92, nullptr, "GetShutdownRtcValue"},
- {93, nullptr, "AcquireFatalDirtyFlagEventHandle"},
- {94, nullptr, "GetFatalDirtyFlags"},
- {95, C<&ISystemSettingsServer::GetAutoUpdateEnableFlag>, "GetAutoUpdateEnableFlag"},
- {96, C<&ISystemSettingsServer::SetAutoUpdateEnableFlag>, "SetAutoUpdateEnableFlag"},
- {97, nullptr, "GetNxControllerSettings"},
- {98, nullptr, "SetNxControllerSettings"},
- {99, C<&ISystemSettingsServer::GetBatteryPercentageFlag>, "GetBatteryPercentageFlag"},
- {100, C<&ISystemSettingsServer::SetBatteryPercentageFlag>, "SetBatteryPercentageFlag"},
- {101, nullptr, "GetExternalRtcResetFlag"},
- {102, nullptr, "SetExternalRtcResetFlag"},
- {103, nullptr, "GetUsbFullKeyEnableFlag"},
- {104, nullptr, "SetUsbFullKeyEnableFlag"},
- {105, C<&ISystemSettingsServer::SetExternalSteadyClockInternalOffset>, "SetExternalSteadyClockInternalOffset"},
- {106, C<&ISystemSettingsServer::GetExternalSteadyClockInternalOffset>, "GetExternalSteadyClockInternalOffset"},
- {107, nullptr, "GetBacklightSettingsEx"},
- {108, nullptr, "SetBacklightSettingsEx"},
- {109, nullptr, "GetHeadphoneVolumeWarningCount"},
- {110, nullptr, "SetHeadphoneVolumeWarningCount"},
- {111, nullptr, "GetBluetoothAfhEnableFlag"},
- {112, nullptr, "SetBluetoothAfhEnableFlag"},
- {113, nullptr, "GetBluetoothBoostEnableFlag"},
- {114, nullptr, "SetBluetoothBoostEnableFlag"},
- {115, nullptr, "GetInRepairProcessEnableFlag"},
- {116, nullptr, "SetInRepairProcessEnableFlag"},
- {117, nullptr, "GetHeadphoneVolumeUpdateFlag"},
- {118, nullptr, "SetHeadphoneVolumeUpdateFlag"},
- {119, nullptr, "NeedsToUpdateHeadphoneVolume"},
- {120, C<&ISystemSettingsServer::GetPushNotificationActivityModeOnSleep>, "GetPushNotificationActivityModeOnSleep"},
- {121, C<&ISystemSettingsServer::SetPushNotificationActivityModeOnSleep>, "SetPushNotificationActivityModeOnSleep"},
- {122, nullptr, "GetServiceDiscoveryControlSettings"},
- {123, nullptr, "SetServiceDiscoveryControlSettings"},
- {124, C<&ISystemSettingsServer::GetErrorReportSharePermission>, "GetErrorReportSharePermission"},
- {125, C<&ISystemSettingsServer::SetErrorReportSharePermission>, "SetErrorReportSharePermission"},
- {126, C<&ISystemSettingsServer::GetAppletLaunchFlags>, "GetAppletLaunchFlags"},
- {127, C<&ISystemSettingsServer::SetAppletLaunchFlags>, "SetAppletLaunchFlags"},
- {128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"},
- {129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"},
- {130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"},
- {131, nullptr, "SetConsoleSixAxisSensorAngularVelocityBias"},
- {132, nullptr, "GetConsoleSixAxisSensorAccelerationGain"},
- {133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"},
- {134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"},
- {135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"},
- {136, C<&ISystemSettingsServer::GetKeyboardLayout>, "GetKeyboardLayout"},
- {137, C<&ISystemSettingsServer::SetKeyboardLayout>, "SetKeyboardLayout"},
- {138, nullptr, "GetWebInspectorFlag"},
- {139, nullptr, "GetAllowedSslHosts"},
- {140, nullptr, "GetHostFsMountPoint"},
- {141, nullptr, "GetRequiresRunRepairTimeReviser"},
- {142, nullptr, "SetRequiresRunRepairTimeReviser"},
- {143, nullptr, "SetBlePairingSettings"},
- {144, nullptr, "GetBlePairingSettings"},
- {145, nullptr, "GetConsoleSixAxisSensorAngularVelocityTimeBias"},
- {146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"},
- {147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"},
- {148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"},
- {149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"},
- {150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"},
- {151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"},
- {152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"},
- {153, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime>, "SetUserSystemClockAutomaticCorrectionUpdatedTime"},
- {154, nullptr, "GetAccountOnlineStorageSettings"},
- {155, nullptr, "SetAccountOnlineStorageSettings"},
- {156, nullptr, "GetPctlReadyFlag"},
- {157, nullptr, "SetPctlReadyFlag"},
- {158, nullptr, "GetAnalogStickUserCalibrationL"},
- {159, nullptr, "SetAnalogStickUserCalibrationL"},
- {160, nullptr, "GetAnalogStickUserCalibrationR"},
- {161, nullptr, "SetAnalogStickUserCalibrationR"},
- {162, nullptr, "GetPtmBatteryVersion"},
- {163, nullptr, "SetPtmBatteryVersion"},
- {164, nullptr, "GetUsb30HostEnableFlag"},
- {165, nullptr, "SetUsb30HostEnableFlag"},
- {166, nullptr, "GetUsb30DeviceEnableFlag"},
- {167, nullptr, "SetUsb30DeviceEnableFlag"},
- {168, nullptr, "GetThemeId"},
- {169, nullptr, "SetThemeId"},
- {170, C<&ISystemSettingsServer::GetChineseTraditionalInputMethod>, "GetChineseTraditionalInputMethod"},
- {171, nullptr, "SetChineseTraditionalInputMethod"},
- {172, nullptr, "GetPtmCycleCountReliability"},
- {173, nullptr, "SetPtmCycleCountReliability"},
- {174, C<&ISystemSettingsServer::GetHomeMenuScheme>, "GetHomeMenuScheme"},
- {175, nullptr, "GetThemeSettings"},
- {176, nullptr, "SetThemeSettings"},
- {177, nullptr, "GetThemeKey"},
- {178, nullptr, "SetThemeKey"},
- {179, nullptr, "GetZoomFlag"},
- {180, nullptr, "SetZoomFlag"},
- {181, nullptr, "GetT"},
- {182, nullptr, "SetT"},
- {183, C<&ISystemSettingsServer::GetPlatformRegion>, "GetPlatformRegion"},
- {184, C<&ISystemSettingsServer::SetPlatformRegion>, "SetPlatformRegion"},
- {185, C<&ISystemSettingsServer::GetHomeMenuSchemeModel>, "GetHomeMenuSchemeModel"},
- {186, nullptr, "GetMemoryUsageRateFlag"},
- {187, C<&ISystemSettingsServer::GetTouchScreenMode>, "GetTouchScreenMode"},
- {188, C<&ISystemSettingsServer::SetTouchScreenMode>, "SetTouchScreenMode"},
- {189, nullptr, "GetButtonConfigSettingsFull"},
- {190, nullptr, "SetButtonConfigSettingsFull"},
- {191, nullptr, "GetButtonConfigSettingsEmbedded"},
- {192, nullptr, "SetButtonConfigSettingsEmbedded"},
- {193, nullptr, "GetButtonConfigSettingsLeft"},
- {194, nullptr, "SetButtonConfigSettingsLeft"},
- {195, nullptr, "GetButtonConfigSettingsRight"},
- {196, nullptr, "SetButtonConfigSettingsRight"},
- {197, nullptr, "GetButtonConfigRegisteredSettingsEmbedded"},
- {198, nullptr, "SetButtonConfigRegisteredSettingsEmbedded"},
- {199, nullptr, "GetButtonConfigRegisteredSettings"},
- {200, nullptr, "SetButtonConfigRegisteredSettings"},
- {201, C<&ISystemSettingsServer::GetFieldTestingFlag>, "GetFieldTestingFlag"},
- {202, nullptr, "SetFieldTestingFlag"},
- {203, C<&ISystemSettingsServer::GetPanelCrcMode>, "GetPanelCrcMode"},
- {204, C<&ISystemSettingsServer::SetPanelCrcMode>, "SetPanelCrcMode"},
- {205, nullptr, "GetNxControllerSettingsEx"},
- {206, nullptr, "SetNxControllerSettingsEx"},
- {207, nullptr, "GetHearingProtectionSafeguardFlag"},
- {208, nullptr, "SetHearingProtectionSafeguardFlag"},
- {209, nullptr, "GetHearingProtectionSafeguardRemainingTime"},
- {210, nullptr, "SetHearingProtectionSafeguardRemainingTime"},
- {221, nullptr, "GetForceMonauralOutputFlag"}, //17.0.0+
- {222, nullptr, "SetForceMonauralOutputFlag"}, //17.0.0+
- {251, nullptr, "GetAccountIdentificationSettings"}, //18.0.0+
- {252, nullptr, "SetAccountIdentificationSettings"}, //18.0.0+
- {263, nullptr, "AcquireVphymDirtyFlagEventHandle"}, //20.0.0+
- {264, nullptr, "GetVphymDirtyFlags"}, //20.0.0+
- {282, nullptr, "ConvertToProductModel"}, //20.0.0+
- {283, nullptr, "ConvertToProductModelName"}, //20.0.0+
- {289, nullptr, "GetDefaultAccountIdentificationFlagSet"}, //20.0.0+
- {300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle"}, //20.0.0+
- {301, nullptr, "GetPushNotificationDirtyFlags"}, //20.0.0+
- {306, nullptr, "GetPinCodeReregistrationGuideAccounts"}, //20.0.0+
- {307, nullptr, "SetPinCodeReregistrationGuideAccounts"}, //20.0.0+
- {315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs"}, //21.0.0+
- {319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings"}, //21.0.0+
- {320, nullptr, "SetAccountUserSettings"}, //21.0.0+
- {321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings"}, //21.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemSettingsServer::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&ISystemSettingsServer::SetLanguageCode>, "SetLanguageCode"},
+ FunctionInfo{1, nullptr, "SetNetworkSettings"},
+ FunctionInfo{2, nullptr, "GetNetworkSettings"},
+ FunctionInfo{3, C<&ISystemSettingsServer::GetFirmwareVersion>, "GetFirmwareVersion"},
+ FunctionInfo{4, C<&ISystemSettingsServer::GetFirmwareVersion2>, "GetFirmwareVersion2"},
+ FunctionInfo{5, nullptr, "GetFirmwareVersionDigest"},
+ FunctionInfo{7, C<&ISystemSettingsServer::GetLockScreenFlag>, "GetLockScreenFlag"},
+ FunctionInfo{8, C<&ISystemSettingsServer::SetLockScreenFlag>, "SetLockScreenFlag"},
+ FunctionInfo{9, nullptr, "GetBacklightSettings"},
+ FunctionInfo{10, nullptr, "SetBacklightSettings"},
+ FunctionInfo{11, nullptr, "SetBluetoothDevicesSettings"},
+ FunctionInfo{12, nullptr, "GetBluetoothDevicesSettings"},
+ FunctionInfo{13, C<&ISystemSettingsServer::GetExternalSteadyClockSourceId>, "GetExternalSteadyClockSourceId"},
+ FunctionInfo{14, C<&ISystemSettingsServer::SetExternalSteadyClockSourceId>, "SetExternalSteadyClockSourceId"},
+ FunctionInfo{15, C<&ISystemSettingsServer::GetUserSystemClockContext>, "GetUserSystemClockContext"},
+ FunctionInfo{16, C<&ISystemSettingsServer::SetUserSystemClockContext>, "SetUserSystemClockContext"},
+ FunctionInfo{17, C<&ISystemSettingsServer::GetAccountSettings>, "GetAccountSettings"},
+ FunctionInfo{18, C<&ISystemSettingsServer::SetAccountSettings>, "SetAccountSettings"},
+ FunctionInfo{19, nullptr, "GetAudioVolume"},
+ FunctionInfo{20, nullptr, "SetAudioVolume"},
+ FunctionInfo{21, C<&ISystemSettingsServer::GetEulaVersions>, "GetEulaVersions"},
+ FunctionInfo{22, C<&ISystemSettingsServer::SetEulaVersions>, "SetEulaVersions"},
+ FunctionInfo{23, C<&ISystemSettingsServer::GetColorSetId>, "GetColorSetId"},
+ FunctionInfo{24, C<&ISystemSettingsServer::SetColorSetId>, "SetColorSetId"},
+ FunctionInfo{25, C<&ISystemSettingsServer::GetConsoleInformationUploadFlag>, "GetConsoleInformationUploadFlag"},
+ FunctionInfo{26, C<&ISystemSettingsServer::SetConsoleInformationUploadFlag>, "SetConsoleInformationUploadFlag"},
+ FunctionInfo{27, C<&ISystemSettingsServer::GetAutomaticApplicationDownloadFlag>, "GetAutomaticApplicationDownloadFlag"},
+ FunctionInfo{28, C<&ISystemSettingsServer::SetAutomaticApplicationDownloadFlag>, "SetAutomaticApplicationDownloadFlag"},
+ FunctionInfo{29, C<&ISystemSettingsServer::GetNotificationSettings>, "GetNotificationSettings"},
+ FunctionInfo{30, C<&ISystemSettingsServer::SetNotificationSettings>, "SetNotificationSettings"},
+ FunctionInfo{31, C<&ISystemSettingsServer::GetAccountNotificationSettings>, "GetAccountNotificationSettings"},
+ FunctionInfo{32, C<&ISystemSettingsServer::SetAccountNotificationSettings>, "SetAccountNotificationSettings"},
+ FunctionInfo{35, C<&ISystemSettingsServer::GetVibrationMasterVolume>, "GetVibrationMasterVolume"},
+ FunctionInfo{36, C<&ISystemSettingsServer::SetVibrationMasterVolume>, "SetVibrationMasterVolume"},
+ FunctionInfo{37, C<&ISystemSettingsServer::GetSettingsItemValueSize>, "GetSettingsItemValueSize"},
+ FunctionInfo{38, C<&ISystemSettingsServer::GetSettingsItemValue>, "GetSettingsItemValue"},
+ FunctionInfo{39, C<&ISystemSettingsServer::GetTvSettings>, "GetTvSettings"},
+ FunctionInfo{40, C<&ISystemSettingsServer::SetTvSettings>, "SetTvSettings"},
+ FunctionInfo{41, nullptr, "GetEdid"},
+ FunctionInfo{42, nullptr, "SetEdid"},
+ FunctionInfo{43, C<&ISystemSettingsServer::GetAudioOutputMode>, "GetAudioOutputMode"},
+ FunctionInfo{44, C<&ISystemSettingsServer::SetAudioOutputMode>, "SetAudioOutputMode"},
+ FunctionInfo{45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag>, "GetSpeakerAutoMuteFlag"},
+ FunctionInfo{46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag>, "SetSpeakerAutoMuteFlag"},
+ FunctionInfo{47, C<&ISystemSettingsServer::GetQuestFlag>, "GetQuestFlag"},
+ FunctionInfo{48, C<&ISystemSettingsServer::SetQuestFlag>, "SetQuestFlag"},
+ FunctionInfo{49, nullptr, "GetDataDeletionSettings"},
+ FunctionInfo{50, nullptr, "SetDataDeletionSettings"},
+ FunctionInfo{51, nullptr, "GetInitialSystemAppletProgramId"},
+ FunctionInfo{52, nullptr, "GetOverlayDispProgramId"},
+ FunctionInfo{53, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationName>, "GetDeviceTimeZoneLocationName"},
+ FunctionInfo{54, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationName>, "SetDeviceTimeZoneLocationName"},
+ FunctionInfo{55, nullptr, "GetWirelessCertificationFileSize"},
+ FunctionInfo{56, nullptr, "GetWirelessCertificationFile"},
+ FunctionInfo{57, C<&ISystemSettingsServer::SetRegionCode>, "SetRegionCode"},
+ FunctionInfo{58, C<&ISystemSettingsServer::GetNetworkSystemClockContext>, "GetNetworkSystemClockContext"},
+ FunctionInfo{59, C<&ISystemSettingsServer::SetNetworkSystemClockContext>, "SetNetworkSystemClockContext"},
+ FunctionInfo{60, C<&ISystemSettingsServer::IsUserSystemClockAutomaticCorrectionEnabled>, "IsUserSystemClockAutomaticCorrectionEnabled"},
+ FunctionInfo{61, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled>, "SetUserSystemClockAutomaticCorrectionEnabled"},
+ FunctionInfo{62, C<&ISystemSettingsServer::GetDebugModeFlag>, "GetDebugModeFlag"},
+ FunctionInfo{63, C<&ISystemSettingsServer::GetPrimaryAlbumStorage>, "GetPrimaryAlbumStorage"},
+ FunctionInfo{64, C<&ISystemSettingsServer::SetPrimaryAlbumStorage>, "SetPrimaryAlbumStorage"},
+ FunctionInfo{65, C<&ISystemSettingsServer::GetUsb30EnableFlag>, "GetUsb30EnableFlag"},
+ FunctionInfo{66, C<&ISystemSettingsServer::SetUsb30EnableFlag>, "SetUsb30EnableFlag"},
+ FunctionInfo{67, C<&ISystemSettingsServer::GetBatteryLot>, "GetBatteryLot"},
+ FunctionInfo{68, C<&ISystemSettingsServer::GetSerialNumber>, "GetSerialNumber"},
+ FunctionInfo{69, C<&ISystemSettingsServer::GetNfcEnableFlag>, "GetNfcEnableFlag"},
+ FunctionInfo{70, C<&ISystemSettingsServer::SetNfcEnableFlag>, "SetNfcEnableFlag"},
+ FunctionInfo{71, C<&ISystemSettingsServer::GetSleepSettings>, "GetSleepSettings"},
+ FunctionInfo{72, C<&ISystemSettingsServer::SetSleepSettings>, "SetSleepSettings"},
+ FunctionInfo{73, C<&ISystemSettingsServer::GetWirelessLanEnableFlag>, "GetWirelessLanEnableFlag"},
+ FunctionInfo{74, C<&ISystemSettingsServer::SetWirelessLanEnableFlag>, "SetWirelessLanEnableFlag"},
+ FunctionInfo{75, C<&ISystemSettingsServer::GetInitialLaunchSettings>, "GetInitialLaunchSettings"},
+ FunctionInfo{76, C<&ISystemSettingsServer::SetInitialLaunchSettings>, "SetInitialLaunchSettings"},
+ FunctionInfo{77, C<&ISystemSettingsServer::GetDeviceNickName>, "GetDeviceNickName"},
+ FunctionInfo{78, C<&ISystemSettingsServer::SetDeviceNickName>, "SetDeviceNickName"},
+ FunctionInfo{79, C<&ISystemSettingsServer::GetProductModel>, "GetProductModel"},
+ FunctionInfo{80, nullptr, "GetLdnChannel"},
+ FunctionInfo{81, nullptr, "SetLdnChannel"},
+ FunctionInfo{82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"},
+ FunctionInfo{83, nullptr, "GetTelemetryDirtyFlags"},
+ FunctionInfo{84, nullptr, "GetPtmBatteryLot"},
+ FunctionInfo{85, nullptr, "SetPtmBatteryLot"},
+ FunctionInfo{86, nullptr, "GetPtmFuelGaugeParameter"},
+ FunctionInfo{87, nullptr, "SetPtmFuelGaugeParameter"},
+ FunctionInfo{88, C<&ISystemSettingsServer::GetBluetoothEnableFlag>, "GetBluetoothEnableFlag"},
+ FunctionInfo{89, C<&ISystemSettingsServer::SetBluetoothEnableFlag>, "SetBluetoothEnableFlag"},
+ FunctionInfo{90, C<&ISystemSettingsServer::GetMiiAuthorId>, "GetMiiAuthorId"},
+ FunctionInfo{91, nullptr, "SetShutdownRtcValue"},
+ FunctionInfo{92, nullptr, "GetShutdownRtcValue"},
+ FunctionInfo{93, nullptr, "AcquireFatalDirtyFlagEventHandle"},
+ FunctionInfo{94, nullptr, "GetFatalDirtyFlags"},
+ FunctionInfo{95, C<&ISystemSettingsServer::GetAutoUpdateEnableFlag>, "GetAutoUpdateEnableFlag"},
+ FunctionInfo{96, C<&ISystemSettingsServer::SetAutoUpdateEnableFlag>, "SetAutoUpdateEnableFlag"},
+ FunctionInfo{97, nullptr, "GetNxControllerSettings"},
+ FunctionInfo{98, nullptr, "SetNxControllerSettings"},
+ FunctionInfo{99, C<&ISystemSettingsServer::GetBatteryPercentageFlag>, "GetBatteryPercentageFlag"},
+ FunctionInfo{100, C<&ISystemSettingsServer::SetBatteryPercentageFlag>, "SetBatteryPercentageFlag"},
+ FunctionInfo{101, nullptr, "GetExternalRtcResetFlag"},
+ FunctionInfo{102, nullptr, "SetExternalRtcResetFlag"},
+ FunctionInfo{103, nullptr, "GetUsbFullKeyEnableFlag"},
+ FunctionInfo{104, nullptr, "SetUsbFullKeyEnableFlag"},
+ FunctionInfo{105, C<&ISystemSettingsServer::SetExternalSteadyClockInternalOffset>, "SetExternalSteadyClockInternalOffset"},
+ FunctionInfo{106, C<&ISystemSettingsServer::GetExternalSteadyClockInternalOffset>, "GetExternalSteadyClockInternalOffset"},
+ FunctionInfo{107, nullptr, "GetBacklightSettingsEx"},
+ FunctionInfo{108, nullptr, "SetBacklightSettingsEx"},
+ FunctionInfo{109, nullptr, "GetHeadphoneVolumeWarningCount"},
+ FunctionInfo{110, nullptr, "SetHeadphoneVolumeWarningCount"},
+ FunctionInfo{111, nullptr, "GetBluetoothAfhEnableFlag"},
+ FunctionInfo{112, nullptr, "SetBluetoothAfhEnableFlag"},
+ FunctionInfo{113, nullptr, "GetBluetoothBoostEnableFlag"},
+ FunctionInfo{114, nullptr, "SetBluetoothBoostEnableFlag"},
+ FunctionInfo{115, nullptr, "GetInRepairProcessEnableFlag"},
+ FunctionInfo{116, nullptr, "SetInRepairProcessEnableFlag"},
+ FunctionInfo{117, nullptr, "GetHeadphoneVolumeUpdateFlag"},
+ FunctionInfo{118, nullptr, "SetHeadphoneVolumeUpdateFlag"},
+ FunctionInfo{119, nullptr, "NeedsToUpdateHeadphoneVolume"},
+ FunctionInfo{120, C<&ISystemSettingsServer::GetPushNotificationActivityModeOnSleep>, "GetPushNotificationActivityModeOnSleep"},
+ FunctionInfo{121, C<&ISystemSettingsServer::SetPushNotificationActivityModeOnSleep>, "SetPushNotificationActivityModeOnSleep"},
+ FunctionInfo{122, nullptr, "GetServiceDiscoveryControlSettings"},
+ FunctionInfo{123, nullptr, "SetServiceDiscoveryControlSettings"},
+ FunctionInfo{124, C<&ISystemSettingsServer::GetErrorReportSharePermission>, "GetErrorReportSharePermission"},
+ FunctionInfo{125, C<&ISystemSettingsServer::SetErrorReportSharePermission>, "SetErrorReportSharePermission"},
+ FunctionInfo{126, C<&ISystemSettingsServer::GetAppletLaunchFlags>, "GetAppletLaunchFlags"},
+ FunctionInfo{127, C<&ISystemSettingsServer::SetAppletLaunchFlags>, "SetAppletLaunchFlags"},
+ FunctionInfo{128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"},
+ FunctionInfo{129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"},
+ FunctionInfo{130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"},
+ FunctionInfo{131, nullptr, "SetConsoleSixAxisSensorAngularVelocityBias"},
+ FunctionInfo{132, nullptr, "GetConsoleSixAxisSensorAccelerationGain"},
+ FunctionInfo{133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"},
+ FunctionInfo{134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"},
+ FunctionInfo{135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"},
+ FunctionInfo{136, C<&ISystemSettingsServer::GetKeyboardLayout>, "GetKeyboardLayout"},
+ FunctionInfo{137, C<&ISystemSettingsServer::SetKeyboardLayout>, "SetKeyboardLayout"},
+ FunctionInfo{138, nullptr, "GetWebInspectorFlag"},
+ FunctionInfo{139, nullptr, "GetAllowedSslHosts"},
+ FunctionInfo{140, nullptr, "GetHostFsMountPoint"},
+ FunctionInfo{141, nullptr, "GetRequiresRunRepairTimeReviser"},
+ FunctionInfo{142, nullptr, "SetRequiresRunRepairTimeReviser"},
+ FunctionInfo{143, nullptr, "SetBlePairingSettings"},
+ FunctionInfo{144, nullptr, "GetBlePairingSettings"},
+ FunctionInfo{145, nullptr, "GetConsoleSixAxisSensorAngularVelocityTimeBias"},
+ FunctionInfo{146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"},
+ FunctionInfo{147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"},
+ FunctionInfo{148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"},
+ FunctionInfo{149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"},
+ FunctionInfo{150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"},
+ FunctionInfo{151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"},
+ FunctionInfo{152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"},
+ FunctionInfo{153, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime>, "SetUserSystemClockAutomaticCorrectionUpdatedTime"},
+ FunctionInfo{154, nullptr, "GetAccountOnlineStorageSettings"},
+ FunctionInfo{155, nullptr, "SetAccountOnlineStorageSettings"},
+ FunctionInfo{156, nullptr, "GetPctlReadyFlag"},
+ FunctionInfo{157, nullptr, "SetPctlReadyFlag"},
+ FunctionInfo{158, nullptr, "GetAnalogStickUserCalibrationL"},
+ FunctionInfo{159, nullptr, "SetAnalogStickUserCalibrationL"},
+ FunctionInfo{160, nullptr, "GetAnalogStickUserCalibrationR"},
+ FunctionInfo{161, nullptr, "SetAnalogStickUserCalibrationR"},
+ FunctionInfo{162, nullptr, "GetPtmBatteryVersion"},
+ FunctionInfo{163, nullptr, "SetPtmBatteryVersion"},
+ FunctionInfo{164, nullptr, "GetUsb30HostEnableFlag"},
+ FunctionInfo{165, nullptr, "SetUsb30HostEnableFlag"},
+ FunctionInfo{166, nullptr, "GetUsb30DeviceEnableFlag"},
+ FunctionInfo{167, nullptr, "SetUsb30DeviceEnableFlag"},
+ FunctionInfo{168, nullptr, "GetThemeId"},
+ FunctionInfo{169, nullptr, "SetThemeId"},
+ FunctionInfo{170, C<&ISystemSettingsServer::GetChineseTraditionalInputMethod>, "GetChineseTraditionalInputMethod"},
+ FunctionInfo{171, nullptr, "SetChineseTraditionalInputMethod"},
+ FunctionInfo{172, nullptr, "GetPtmCycleCountReliability"},
+ FunctionInfo{173, nullptr, "SetPtmCycleCountReliability"},
+ FunctionInfo{174, C<&ISystemSettingsServer::GetHomeMenuScheme>, "GetHomeMenuScheme"},
+ FunctionInfo{175, nullptr, "GetThemeSettings"},
+ FunctionInfo{176, nullptr, "SetThemeSettings"},
+ FunctionInfo{177, nullptr, "GetThemeKey"},
+ FunctionInfo{178, nullptr, "SetThemeKey"},
+ FunctionInfo{179, nullptr, "GetZoomFlag"},
+ FunctionInfo{180, nullptr, "SetZoomFlag"},
+ FunctionInfo{181, nullptr, "GetT"},
+ FunctionInfo{182, nullptr, "SetT"},
+ FunctionInfo{183, C<&ISystemSettingsServer::GetPlatformRegion>, "GetPlatformRegion"},
+ FunctionInfo{184, C<&ISystemSettingsServer::SetPlatformRegion>, "SetPlatformRegion"},
+ FunctionInfo{185, C<&ISystemSettingsServer::GetHomeMenuSchemeModel>, "GetHomeMenuSchemeModel"},
+ FunctionInfo{186, nullptr, "GetMemoryUsageRateFlag"},
+ FunctionInfo{187, C<&ISystemSettingsServer::GetTouchScreenMode>, "GetTouchScreenMode"},
+ FunctionInfo{188, C<&ISystemSettingsServer::SetTouchScreenMode>, "SetTouchScreenMode"},
+ FunctionInfo{189, nullptr, "GetButtonConfigSettingsFull"},
+ FunctionInfo{190, nullptr, "SetButtonConfigSettingsFull"},
+ FunctionInfo{191, nullptr, "GetButtonConfigSettingsEmbedded"},
+ FunctionInfo{192, nullptr, "SetButtonConfigSettingsEmbedded"},
+ FunctionInfo{193, nullptr, "GetButtonConfigSettingsLeft"},
+ FunctionInfo{194, nullptr, "SetButtonConfigSettingsLeft"},
+ FunctionInfo{195, nullptr, "GetButtonConfigSettingsRight"},
+ FunctionInfo{196, nullptr, "SetButtonConfigSettingsRight"},
+ FunctionInfo{197, nullptr, "GetButtonConfigRegisteredSettingsEmbedded"},
+ FunctionInfo{198, nullptr, "SetButtonConfigRegisteredSettingsEmbedded"},
+ FunctionInfo{199, nullptr, "GetButtonConfigRegisteredSettings"},
+ FunctionInfo{200, nullptr, "SetButtonConfigRegisteredSettings"},
+ FunctionInfo{201, C<&ISystemSettingsServer::GetFieldTestingFlag>, "GetFieldTestingFlag"},
+ FunctionInfo{202, nullptr, "SetFieldTestingFlag"},
+ FunctionInfo{203, C<&ISystemSettingsServer::GetPanelCrcMode>, "GetPanelCrcMode"},
+ FunctionInfo{204, C<&ISystemSettingsServer::SetPanelCrcMode>, "SetPanelCrcMode"},
+ FunctionInfo{205, nullptr, "GetNxControllerSettingsEx"},
+ FunctionInfo{206, nullptr, "SetNxControllerSettingsEx"},
+ FunctionInfo{207, nullptr, "GetHearingProtectionSafeguardFlag"},
+ FunctionInfo{208, nullptr, "SetHearingProtectionSafeguardFlag"},
+ FunctionInfo{209, nullptr, "GetHearingProtectionSafeguardRemainingTime"},
+ FunctionInfo{210, nullptr, "SetHearingProtectionSafeguardRemainingTime"},
+ FunctionInfo{221, nullptr, "GetForceMonauralOutputFlag", MakeVersionGate({17,0,0})},
+ FunctionInfo{222, nullptr, "SetForceMonauralOutputFlag", MakeVersionGate({17,0,0})},
+ FunctionInfo{251, nullptr, "GetAccountIdentificationSettings", MakeVersionGate({18,0,0})},
+ FunctionInfo{252, nullptr, "SetAccountIdentificationSettings", MakeVersionGate({18,0,0})},
+ FunctionInfo{263, nullptr, "AcquireVphymDirtyFlagEventHandle", MakeVersionGate({20,0,0})},
+ FunctionInfo{264, nullptr, "GetVphymDirtyFlags", MakeVersionGate({20,0,0})},
+ FunctionInfo{282, nullptr, "ConvertToProductModel", MakeVersionGate({20,0,0})},
+ FunctionInfo{283, nullptr, "ConvertToProductModelName", MakeVersionGate({20,0,0})},
+ FunctionInfo{289, nullptr, "GetDefaultAccountIdentificationFlagSet", MakeVersionGate({20,0,0})},
+ FunctionInfo{300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle", MakeVersionGate({20,0,0})},
+ FunctionInfo{301, nullptr, "GetPushNotificationDirtyFlags", MakeVersionGate({20,0,0})},
+ FunctionInfo{306, nullptr, "GetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})},
+ FunctionInfo{307, nullptr, "SetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})},
+ FunctionInfo{315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs", MakeVersionGate({21,0,0})},
+ FunctionInfo{319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings", MakeVersionGate({21,0,0})},
+ FunctionInfo{320, nullptr, "SetAccountUserSettings", MakeVersionGate({21,0,0})},
+ FunctionInfo{321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings", MakeVersionGate({21,0,0})}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
+ : ServiceFramework{system_, "set:sys"} {
SetupSettings();
m_system_settings.region_code =
diff --git a/src/core/hle/service/set/system_settings_server.h b/src/core/hle/service/set/system_settings_server.h
index 1d56e61f88..471ed61176 100644
--- a/src/core/hle/service/set/system_settings_server.h
+++ b/src/core/hle/service/set/system_settings_server.h
@@ -179,7 +179,7 @@ private:
void StoreSettings();
void SetSaveNeeded();
- Core::System& m_system;
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
SystemSettings m_system_settings{};
PrivateSettings m_private_settings{};
DeviceSettings m_device_settings{};
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp
index c75c5437df..5c196b3218 100644
--- a/src/core/hle/service/sm/sm.cpp
+++ b/src/core/hle/service/sm/sm.cpp
@@ -18,7 +18,16 @@
#include "core/hle/service/ipc_helpers.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/sm/sm.h"
-#include "core/hle/service/sm/sm_controller.h"
+#include "common/assert.h"
+#include "common/logging.h"
+#include "core/core.h"
+#include "core/hle/kernel/k_client_port.h"
+#include "core/hle/kernel/k_port.h"
+#include "core/hle/kernel/k_scoped_resource_reservation.h"
+#include "core/hle/kernel/k_server_session.h"
+#include "core/hle/kernel/k_session.h"
+#include "core/hle/service/ipc_helpers.h"
+#include "core/hle/service/server_manager.h"
namespace Service::SM {
@@ -27,6 +36,116 @@ constexpr Result ResultAlreadyRegistered(ErrorModule::SM, 4);
constexpr Result ResultInvalidServiceName(ErrorModule::SM, 6);
constexpr Result ResultNotRegistered(ErrorModule::SM, 7);
+class Controller final : public ServiceFramework<Controller> {
+public:
+ // https://switchbrew.org/wiki/IPC_Marshalling
+ explicit Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {}
+ ~Controller() override = default;
+
+ void ConvertCurrentObjectToDomain(HLERequestContext& ctx) {
+ ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain");
+ LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId());
+ ctx.GetManager()->ConvertToDomainOnRequestEnd();
+
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push<u32>(1); // Converted sessions start with 1 request handler
+ }
+
+ void CloneCurrentObject(HLERequestContext& ctx) {
+ LOG_DEBUG(Service, "called");
+
+ auto session_manager = ctx.GetManager();
+
+ // FIXME: this is duplicated from the SVC, it should just call it instead
+ // once this is a proper process
+
+ // Reserve a new session from the process resource limit.
+ Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax);
+ ASSERT(session_reservation.Succeeded());
+
+ // Create the session.
+ Kernel::KSession* session = Kernel::KSession::Create(kernel);
+ ASSERT(session != nullptr);
+
+ // Initialize the session.
+ session->Initialize(kernel, nullptr, 0);
+
+ // Commit the session reservation.
+ session_reservation.Commit();
+
+ // Register the session.
+ Kernel::KSession::Register(kernel, session);
+
+ // Register with server manager.
+ session_manager->GetServerManager().RegisterSession(&session->GetServerSession(),
+ session_manager);
+
+ // We succeeded.
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
+ rb.Push(ResultSuccess);
+ rb.PushMoveObjects(ctx, session->GetClientSession());
+ }
+
+ void CloneCurrentObjectEx(HLERequestContext& ctx) {
+ LOG_DEBUG(Service, "called");
+
+ CloneCurrentObject(ctx);
+ }
+
+ void QueryPointerBufferSize(HLERequestContext& ctx) {
+ LOG_DEBUG(Service, "called");
+
+ auto* process = Kernel::GetCurrentProcessPointer(kernel);
+ ASSERT(process != nullptr);
+
+ u32 buffer_size = process->GetPointerBufferSize();
+ if (buffer_size > (std::numeric_limits<u16>::max)()) {
+ LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping");
+ buffer_size = (std::numeric_limits<u16>::max)();
+ }
+
+ IPC::ResponseBuilder rb{ctx, 3};
+ rb.Push(ResultSuccess);
+ rb.Push<u16>(static_cast<u16>(buffer_size));
+ }
+
+ void SetPointerBufferSize(HLERequestContext& ctx) {
+ LOG_DEBUG(Service, "called");
+
+ auto* process = Kernel::GetCurrentProcessPointer(kernel);
+ ASSERT(process != nullptr);
+
+ IPC::RequestParser rp{ctx};
+
+ u32 requested_size = rp.PopRaw<u32>();
+
+ if (requested_size > (std::numeric_limits<u16>::max)()) {
+ LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF");
+ requested_size = (std::numeric_limits<u16>::max)();
+ }
+
+ process->SetPointerBufferSize(requested_size);
+
+ LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size);
+
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultSuccess);
+ }
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"},
+ FunctionInfo{1, nullptr, "CopyFromCurrentDomain"},
+ FunctionInfo{2, &Controller::CloneCurrentObject, "CloneCurrentObject"},
+ FunctionInfo{3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"},
+ FunctionInfo{4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"},
+ FunctionInfo{5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"} //TODO: where does this come from
+ );
+};
+
ServiceManager::ServiceManager(Kernel::KernelCore& kernel_) : kernel{kernel_} {
controller_interface = std::make_unique<Controller>(kernel.System());
}
@@ -112,6 +231,51 @@ Result ServiceManager::GetServicePort(Kernel::KClientPort** out_client_port,
return ResultSuccess;
}
+/// Interface to "sm:" service
+class SM final : public ServiceFramework<SM> {
+public:
+ explicit SM(ServiceManager& service_manager_, Core::System& system_);
+ ~SM() override;
+
+private:
+ void Initialize(HLERequestContext& ctx);
+ void GetServiceCmif(HLERequestContext& ctx);
+ void GetServiceTipc(HLERequestContext& ctx);
+ void RegisterServiceCmif(HLERequestContext& ctx);
+ void RegisterServiceTipc(HLERequestContext& ctx);
+ void UnregisterService(HLERequestContext& ctx);
+ void AtmosphereHasService(HLERequestContext& ctx);
+
+ Result GetServiceImpl(Kernel::KClientSession** out_client_session, HLERequestContext& ctx);
+ void RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_session_count, bool is_light);
+
+ // TODO: We reuse function list for both TIPC and non-TIPC
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ std::optional<FunctionInfoBase> FindRequestTipc(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &SM::Initialize, "Initialize"},
+ FunctionInfo{1, &SM::GetServiceTipc, "GetService"},
+ FunctionInfo{2, &SM::RegisterServiceTipc, "RegisterService"},
+ FunctionInfo{3, &SM::UnregisterService, "UnregisterService"},
+ FunctionInfo{4, nullptr, "DetachClient"},
+ FunctionInfo{65000, nullptr, "AtmosphereInstallMitm"},
+ FunctionInfo{65001, nullptr, "AtmosphereUninstallMitm"},
+ FunctionInfo{65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"},
+ FunctionInfo{65003, nullptr, "AtmosphereAcknowledgeMitmSession"},
+ FunctionInfo{65004, nullptr, "AtmosphereHasMitm"},
+ FunctionInfo{65005, nullptr, "AtmosphereWaitMitm"},
+ FunctionInfo{65006, nullptr, "AtmosphereDeclareFutureMitm"},
+ FunctionInfo{65100, &SM::AtmosphereHasService, "AtmosphereHasService"},
+ FunctionInfo{65101, nullptr, "AtmosphereWaitService"}
+ );
+
+ ServiceManager& service_manager;
+};
+
/**
* SM::Initialize service function
* Inputs:
@@ -194,7 +358,7 @@ Result SM::GetServiceImpl(Kernel::KClientSession** out_client_session, HLEReques
// Create a new session.
Kernel::KClientSession* session{};
- if (const auto result = client_port->CreateSession(kernel, &session); result.IsError()) {
+ if (const auto result = client_port->CreateSession(system.Kernel(), &session); result.IsError()) {
LOG_ERROR(Service_SM, "called service={} -> error {:#08x}", name, result.raw);
return result;
}
@@ -265,42 +429,7 @@ void SM::AtmosphereHasService(HLERequestContext& ctx) {
SM::SM(ServiceManager& service_manager_, Core::System& system_)
: ServiceFramework{system_, "sm:", 64}
, service_manager{service_manager_}
- , kernel{system_.Kernel()}
-{
- RegisterHandlers({
- {0, &SM::Initialize, "Initialize"},
- {1, &SM::GetServiceCmif, "GetService"},
- {2, &SM::RegisterServiceCmif, "RegisterService"},
- {3, &SM::UnregisterService, "UnregisterService"},
- {4, nullptr, "DetachClient"},
- // TODO: are these non-TIPC as well?
- {65000, nullptr, "AtmosphereInstallMitm"},
- {65001, nullptr, "AtmosphereUninstallMitm"},
- {65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"},
- {65003, nullptr, "AtmosphereAcknowledgeMitmSession"},
- {65004, nullptr, "AtmosphereHasMitm"},
- {65005, nullptr, "AtmosphereWaitMitm"},
- {65006, nullptr, "AtmosphereDeclareFutureMitm"},
- {65100, &SM::AtmosphereHasService, "AtmosphereHasService"},
- {65101, nullptr, "AtmosphereWaitService"},
- });
- RegisterHandlersTipc({
- {0, &SM::Initialize, "Initialize"},
- {1, &SM::GetServiceTipc, "GetService"},
- {2, &SM::RegisterServiceTipc, "RegisterService"},
- {3, &SM::UnregisterService, "UnregisterService"},
- {4, nullptr, "DetachClient"},
- {65000, nullptr, "AtmosphereInstallMitm"},
- {65001, nullptr, "AtmosphereUninstallMitm"},
- {65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"},
- {65003, nullptr, "AtmosphereAcknowledgeMitmSession"},
- {65004, nullptr, "AtmosphereHasMitm"},
- {65005, nullptr, "AtmosphereWaitMitm"},
- {65006, nullptr, "AtmosphereDeclareFutureMitm"},
- {65100, &SM::AtmosphereHasService, "AtmosphereHasService"},
- {65101, nullptr, "AtmosphereWaitService"},
- });
-}
+{}
SM::~SM() = default;
diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h
index c520a46fb2..f17fc60080 100644
--- a/src/core/hle/service/sm/sm.h
+++ b/src/core/hle/service/sm/sm.h
@@ -33,29 +33,7 @@ class SessionRequestHandler;
namespace Service::SM {
class Controller;
-
-/// Interface to "sm:" service
-class SM final : public ServiceFramework<SM> {
-public:
- explicit SM(ServiceManager& service_manager_, Core::System& system_);
- ~SM() override;
-
-private:
- void Initialize(HLERequestContext& ctx);
- void GetServiceCmif(HLERequestContext& ctx);
- void GetServiceTipc(HLERequestContext& ctx);
- void RegisterServiceCmif(HLERequestContext& ctx);
- void RegisterServiceTipc(HLERequestContext& ctx);
- void UnregisterService(HLERequestContext& ctx);
- void AtmosphereHasService(HLERequestContext& ctx);
-
- Result GetServiceImpl(Kernel::KClientSession** out_client_session, HLERequestContext& ctx);
- void RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_session_count,
- bool is_light);
-
- ServiceManager& service_manager;
- Kernel::KernelCore& kernel;
-};
+class SM;
class ServiceManager {
public:
diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp
deleted file mode 100644
index 125eb4a247..0000000000
--- a/src/core/hle/service/sm/sm_controller.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "common/assert.h"
-#include "common/logging.h"
-#include "core/core.h"
-#include "core/hle/kernel/k_client_port.h"
-#include "core/hle/kernel/k_port.h"
-#include "core/hle/kernel/k_scoped_resource_reservation.h"
-#include "core/hle/kernel/k_server_session.h"
-#include "core/hle/kernel/k_session.h"
-#include "core/hle/service/ipc_helpers.h"
-#include "core/hle/service/server_manager.h"
-#include "core/hle/service/sm/sm_controller.h"
-
-namespace Service::SM {
-
-void Controller::ConvertCurrentObjectToDomain(HLERequestContext& ctx) {
- ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain");
- LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId());
- ctx.GetManager()->ConvertToDomainOnRequestEnd();
-
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push<u32>(1); // Converted sessions start with 1 request handler
-}
-
-void Controller::CloneCurrentObject(HLERequestContext& ctx) {
- LOG_DEBUG(Service, "called");
-
- auto session_manager = ctx.GetManager();
-
- // FIXME: this is duplicated from the SVC, it should just call it instead
- // once this is a proper process
-
- // Reserve a new session from the process resource limit.
- Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax);
- ASSERT(session_reservation.Succeeded());
-
- // Create the session.
- Kernel::KSession* session = Kernel::KSession::Create(kernel);
- ASSERT(session != nullptr);
-
- // Initialize the session.
- session->Initialize(kernel, nullptr, 0);
-
- // Commit the session reservation.
- session_reservation.Commit();
-
- // Register the session.
- Kernel::KSession::Register(kernel, session);
-
- // Register with server manager.
- session_manager->GetServerManager().RegisterSession(&session->GetServerSession(),
- session_manager);
-
- // We succeeded.
- IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
- rb.Push(ResultSuccess);
- rb.PushMoveObjects(ctx, session->GetClientSession());
-}
-
-void Controller::CloneCurrentObjectEx(HLERequestContext& ctx) {
- LOG_DEBUG(Service, "called");
-
- CloneCurrentObject(ctx);
-}
-
-void Controller::QueryPointerBufferSize(HLERequestContext& ctx) {
- LOG_DEBUG(Service, "called");
-
- auto* process = Kernel::GetCurrentProcessPointer(kernel);
- ASSERT(process != nullptr);
-
- u32 buffer_size = process->GetPointerBufferSize();
- if (buffer_size > (std::numeric_limits<u16>::max)()) {
- LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping");
- buffer_size = (std::numeric_limits<u16>::max)();
- }
-
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push<u16>(static_cast<u16>(buffer_size));
-}
-
-void Controller::SetPointerBufferSize(HLERequestContext& ctx) {
- LOG_DEBUG(Service, "called");
-
- auto* process = Kernel::GetCurrentProcessPointer(kernel);
- ASSERT(process != nullptr);
-
- IPC::RequestParser rp{ctx};
-
- u32 requested_size = rp.PopRaw<u32>();
-
- if (requested_size > (std::numeric_limits<u16>::max)()) {
- LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF");
- requested_size = (std::numeric_limits<u16>::max)();
- }
-
- process->SetPointerBufferSize(requested_size);
-
- LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size);
-
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
-}
-
-
-// https://switchbrew.org/wiki/IPC_Marshalling
-Controller::Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {
- static const FunctionInfo functions[] = {
- {0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"},
- {1, nullptr, "CopyFromCurrentDomain"},
- {2, &Controller::CloneCurrentObject, "CloneCurrentObject"},
- {3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"},
- {4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"},
- {5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"}, //TODO: where does this come from
- };
- RegisterHandlers(functions);
-}
-
-Controller::~Controller() = default;
-
-} // namespace Service::SM
diff --git a/src/core/hle/service/sm/sm_controller.h b/src/core/hle/service/sm/sm_controller.h
deleted file mode 100644
index f7e529a269..0000000000
--- a/src/core/hle/service/sm/sm_controller.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include "core/hle/service/service.h"
-
-namespace Core {
-class System;
-}
-
-namespace Service::SM {
-
-class Controller final : public ServiceFramework<Controller> {
-public:
- explicit Controller(Core::System& system_);
- ~Controller() override;
-
-private:
- void ConvertCurrentObjectToDomain(HLERequestContext& ctx);
- void CloneCurrentObject(HLERequestContext& ctx);
- void CloneCurrentObjectEx(HLERequestContext& ctx);
- void QueryPointerBufferSize(HLERequestContext& ctx);
- void SetPointerBufferSize(HLERequestContext& ctx);
-};
-
-} // namespace Service::SM
diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp
index 0137a3be66..63bd7051ca 100644
--- a/src/core/hle/service/sockets/bsd.cpp
+++ b/src/core/hle/service/sockets/bsd.cpp
@@ -1083,59 +1083,6 @@ void BSD_USA::OnProxyPacketReceived(const Network::ProxyPacket& packet) {
BSD_USA::BSD_USA(Core::System& system_, const char* name, bool is_user_)
: ServiceFramework{system_, name}
, is_user{is_user_} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &BSD_USA::RegisterClient, "RegisterClient"},
- {1, &BSD_USA::StartMonitoring, "StartMonitoring"},
- {2, &BSD_USA::Socket, "Socket"},
- {3, &BSD_USA::SocketExempt, "SocketExempt"},
- {4, nullptr, "Open"},
- {5, &BSD_USA::Select, "Select"},
- {6, &BSD_USA::Poll, "Poll"},
- {7, nullptr, "Sysctl"},
- {8, &BSD_USA::Recv, "Recv"},
- {9, &BSD_USA::RecvFrom, "RecvFrom"},
- {10, &BSD_USA::Send, "Send"},
- {11, &BSD_USA::SendTo, "SendTo"},
- {12, &BSD_USA::Accept, "Accept"},
- {13, &BSD_USA::Bind, "Bind"},
- {14, &BSD_USA::Connect, "Connect"},
- {15, &BSD_USA::GetPeerName, "GetPeerName"},
- {16, &BSD_USA::GetSockName, "GetSockName"},
- {17, &BSD_USA::GetSockOpt, "GetSockOpt"},
- {18, &BSD_USA::Listen, "Listen"},
- {19, nullptr, "Ioctl"},
- {20, &BSD_USA::Fcntl, "Fcntl"},
- {21, &BSD_USA::SetSockOpt, "SetSockOpt"},
- {22, &BSD_USA::Shutdown, "Shutdown"},
- {23, nullptr, "ShutdownAllSockets"},
- {24, &BSD_USA::Write, "Write"},
- {25, &BSD_USA::Read, "Read"},
- {26, &BSD_USA::Close, "Close"},
- {27, &BSD_USA::DuplicateSocket, "DuplicateSocket"},
- {28, nullptr, "GetResourceStatistics"},
- {29, nullptr, "RecvMMsg"}, //3.0.0+
- {30, nullptr, "SendMMsg"}, //3.0.0+
- {31, &BSD_USA::EventFd, "EventFd"}, //7.0.0+
- {32, nullptr, "RegisterResourceStatisticsName"}, //7.0.0+
- {33, nullptr, "RegisterClientShared"}, //10.0.0+
- {34, nullptr, "GetSocketStatistics"}, //15.0.0+
- {35, nullptr, "NifIoctl"}, //17.0.0+
- {36, nullptr, "Unknown36"}, //18.0.0+
- {37, nullptr, "Unknown37"}, //18.0.0+
- {38, nullptr, "Unknown38"}, //18.0.0+
- {39, nullptr, "Unknown39"}, //20.0.0+
- {40, nullptr, "Unknown40"}, //20.0.0+
- {41, nullptr, "Unknown41"}, //21.0.0+
- {42, nullptr, "Unknown42"}, //21.0.0+
- {43, nullptr, "Unknown43"}, //21.0.0+
- {200, nullptr, "SetThreadCoreMask"}, //15.0.0+
- {201, nullptr, "GetThreadCoreMask"}, //15.0.0+
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
if (auto room_member = Network::GetRoomMember().lock()) {
proxy_packet_received = room_member->BindOnProxyPacketReceived(
[this](const Network::ProxyPacket& packet) { OnProxyPacketReceived(packet); });
@@ -1156,40 +1103,12 @@ std::unique_lock<std::mutex> BSD_USA::LockService() noexcept {
BSDCFG::BSDCFG(Core::System& system_, const char *name)
: ServiceFramework{system_, name} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetIfUp"},
- {1, nullptr, "SetIfUpWithEvent"},
- {2, nullptr, "CancelIf"},
- {3, nullptr, "SetIfDown"},
- {4, nullptr, "GetIfState"},
- {5, nullptr, "DhcpRenew"},
- {6, nullptr, "AddStaticArpEntry"},
- {7, nullptr, "RemoveArpEntry"},
- {8, nullptr, "LookupArpEntry"},
- {9, nullptr, "LookupArpEntry2"},
- {10, nullptr, "ClearArpEntries"},
- {11, nullptr, "ClearArpEntries2"},
- {12, nullptr, "PrintArpEntries"},
- {13, nullptr, "Unknown13"},
- {14, nullptr, "Unknown14"},
- {15, nullptr, "Unknown15"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
BSDCFG::~BSDCFG() = default;
BSD_NU::BSD_NU(Core::System& system_)
: ServiceFramework{system_, "bsd:nu"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CreateUserService"},
- };
- // clang-format on
- RegisterHandlers(functions);
}
BSD_NU::~BSD_NU() = default;
diff --git a/src/core/hle/service/sockets/bsd.h b/src/core/hle/service/sockets/bsd.h
index b542e196f0..c2aa343d51 100644
--- a/src/core/hle/service/sockets/bsd.h
+++ b/src/core/hle/service/sockets/bsd.h
@@ -189,6 +189,58 @@ private:
protected:
std::unique_lock<std::mutex> LockService() noexcept override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &BSD_USA::RegisterClient, "RegisterClient"},
+ FunctionInfo{1, &BSD_USA::StartMonitoring, "StartMonitoring"},
+ FunctionInfo{2, &BSD_USA::Socket, "Socket"},
+ FunctionInfo{3, &BSD_USA::SocketExempt, "SocketExempt"},
+ FunctionInfo{4, nullptr, "Open"},
+ FunctionInfo{5, &BSD_USA::Select, "Select"},
+ FunctionInfo{6, &BSD_USA::Poll, "Poll"},
+ FunctionInfo{7, nullptr, "Sysctl"},
+ FunctionInfo{8, &BSD_USA::Recv, "Recv"},
+ FunctionInfo{9, &BSD_USA::RecvFrom, "RecvFrom"},
+ FunctionInfo{10, &BSD_USA::Send, "Send"},
+ FunctionInfo{11, &BSD_USA::SendTo, "SendTo"},
+ FunctionInfo{12, &BSD_USA::Accept, "Accept"},
+ FunctionInfo{13, &BSD_USA::Bind, "Bind"},
+ FunctionInfo{14, &BSD_USA::Connect, "Connect"},
+ FunctionInfo{15, &BSD_USA::GetPeerName, "GetPeerName"},
+ FunctionInfo{16, &BSD_USA::GetSockName, "GetSockName"},
+ FunctionInfo{17, &BSD_USA::GetSockOpt, "GetSockOpt"},
+ FunctionInfo{18, &BSD_USA::Listen, "Listen"},
+ FunctionInfo{19, nullptr, "Ioctl"},
+ FunctionInfo{20, &BSD_USA::Fcntl, "Fcntl"},
+ FunctionInfo{21, &BSD_USA::SetSockOpt, "SetSockOpt"},
+ FunctionInfo{22, &BSD_USA::Shutdown, "Shutdown"},
+ FunctionInfo{23, nullptr, "ShutdownAllSockets"},
+ FunctionInfo{24, &BSD_USA::Write, "Write"},
+ FunctionInfo{25, &BSD_USA::Read, "Read"},
+ FunctionInfo{26, &BSD_USA::Close, "Close"},
+ FunctionInfo{27, &BSD_USA::DuplicateSocket, "DuplicateSocket"},
+ FunctionInfo{28, nullptr, "GetResourceStatistics"},
+ FunctionInfo{29, nullptr, "RecvMMsg", MakeVersionGate({3,0,0})},
+ FunctionInfo{30, nullptr, "SendMMsg", MakeVersionGate({3,0,0})},
+ FunctionInfo{31, &BSD_USA::EventFd, "EventFd", MakeVersionGate({7,0,0})},
+ FunctionInfo{32, nullptr, "RegisterResourceStatisticsName", MakeVersionGate({7,0,0})},
+ FunctionInfo{33, nullptr, "RegisterClientShared", MakeVersionGate({10,0,0})},
+ FunctionInfo{34, nullptr, "GetSocketStatistics", MakeVersionGate({15,0,0})},
+ FunctionInfo{35, nullptr, "NifIoctl", MakeVersionGate({17,0,0})},
+ FunctionInfo{36, nullptr, "Unknown36", MakeVersionGate({18,0,0})},
+ FunctionInfo{37, nullptr, "Unknown37", MakeVersionGate({18,0,0})},
+ FunctionInfo{38, nullptr, "Unknown38", MakeVersionGate({18,0,0})},
+ FunctionInfo{39, nullptr, "Unknown39", MakeVersionGate({20,0,0})},
+ FunctionInfo{40, nullptr, "Unknown40", MakeVersionGate({20,0,0})},
+ FunctionInfo{41, nullptr, "Unknown41", MakeVersionGate({21,0,0})},
+ FunctionInfo{42, nullptr, "Unknown42", MakeVersionGate({21,0,0})},
+ FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})},
+ FunctionInfo{200, nullptr, "SetThreadCoreMask", MakeVersionGate({15,0,0})},
+ FunctionInfo{201, nullptr, "GetThreadCoreMask", MakeVersionGate({15,0,0})}
+ );
bool is_user = false;
};
@@ -196,12 +248,41 @@ class BSDCFG final : public ServiceFramework<BSDCFG> {
public:
explicit BSDCFG(Core::System& system_, const char *name);
~BSDCFG() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetIfUp"},
+ FunctionInfo{1, nullptr, "SetIfUpWithEvent"},
+ FunctionInfo{2, nullptr, "CancelIf"},
+ FunctionInfo{3, nullptr, "SetIfDown"},
+ FunctionInfo{4, nullptr, "GetIfState"},
+ FunctionInfo{5, nullptr, "DhcpRenew"},
+ FunctionInfo{6, nullptr, "AddStaticArpEntry"},
+ FunctionInfo{7, nullptr, "RemoveArpEntry"},
+ FunctionInfo{8, nullptr, "LookupArpEntry"},
+ FunctionInfo{9, nullptr, "LookupArpEntry2"},
+ FunctionInfo{10, nullptr, "ClearArpEntries"},
+ FunctionInfo{11, nullptr, "ClearArpEntries2"},
+ FunctionInfo{12, nullptr, "PrintArpEntries"},
+ FunctionInfo{13, nullptr, "Unknown13"},
+ FunctionInfo{14, nullptr, "Unknown14"},
+ FunctionInfo{15, nullptr, "Unknown15"}
+ );
};
class BSD_NU final : public ServiceFramework<BSD_NU> {
public:
explicit BSD_NU(Core::System& system_);
~BSD_NU() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateUserService"}
+ );
};
} // namespace Service::Sockets
diff --git a/src/core/hle/service/sockets/nsd.cpp b/src/core/hle/service/sockets/nsd.cpp
index 241f2971ca..8f042aee75 100644
--- a/src/core/hle/service/sockets/nsd.cpp
+++ b/src/core/hle/service/sockets/nsd.cpp
@@ -29,38 +29,6 @@ struct EnvironmentIdentifier {
static_assert(sizeof(EnvironmentIdentifier) == 0x8);
NSD::NSD(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {5, nullptr, "GetSettingUrl"},
- {10, nullptr, "GetSettingName"},
- {11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"},
- {12, nullptr, "GetDeviceId"},
- {13, nullptr, "DeleteSettings"},
- {14, nullptr, "ImportSettings"},
- {15, &NSD::SetChangeEnvironmentIdentifierDisabled, "SetChangeEnvironmentIdentifierDisabled"},
- {20, &NSD::Resolve, "Resolve"},
- {21, &NSD::ResolveEx, "ResolveEx"},
- {30, nullptr, "GetNasServiceSetting"},
- {31, nullptr, "GetNasServiceSettingEx"},
- {40, nullptr, "GetNasRequestFqdn"},
- {41, nullptr, "GetNasRequestFqdnEx"},
- {42, nullptr, "GetNasApiFqdn"},
- {43, nullptr, "GetNasApiFqdnEx"},
- {50, nullptr, "GetCurrentSetting"},
- {51, nullptr, "WriteTestParameter"},
- {52, nullptr, "ReadTestParameter"},
- {60, nullptr, "ReadSaveDataFromFsForTest"},
- {61, nullptr, "WriteSaveDataToFsForTest"},
- {62, nullptr, "DeleteSaveDataOfFsForTest"},
- {63, nullptr, "IsChangeEnvironmentIdentifierDisabled"},
- {64, nullptr, "SetWithoutDomainExchangeFqdns"},
- {100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"},
- {101, nullptr, "SetApplicationServerEnvironmentType"},
- {102, nullptr, "DeleteApplicationServerEnvironmentType"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
static std::string ResolveImpl(const std::string& fqdn_in) {
diff --git a/src/core/hle/service/sockets/nsd.h b/src/core/hle/service/sockets/nsd.h
index e4a4588467..f3e4d48aff 100644
--- a/src/core/hle/service/sockets/nsd.h
+++ b/src/core/hle/service/sockets/nsd.h
@@ -25,6 +25,38 @@ private:
void ResolveEx(HLERequestContext& ctx);
void GetEnvironmentIdentifier(HLERequestContext& ctx);
void GetApplicationServerEnvironmentType(HLERequestContext& ctx);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{5, nullptr, "GetSettingUrl"},
+ FunctionInfo{10, nullptr, "GetSettingName"},
+ FunctionInfo{11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"},
+ FunctionInfo{12, nullptr, "GetDeviceId"},
+ FunctionInfo{13, nullptr, "DeleteSettings"},
+ FunctionInfo{14, nullptr, "ImportSettings"},
+ FunctionInfo{15, &NSD::SetChangeEnvironmentIdentifierDisabled, "SetChangeEnvironmentIdentifierDisabled"},
+ FunctionInfo{20, &NSD::Resolve, "Resolve"},
+ FunctionInfo{21, &NSD::ResolveEx, "ResolveEx"},
+ FunctionInfo{30, nullptr, "GetNasServiceSetting"},
+ FunctionInfo{31, nullptr, "GetNasServiceSettingEx"},
+ FunctionInfo{40, nullptr, "GetNasRequestFqdn"},
+ FunctionInfo{41, nullptr, "GetNasRequestFqdnEx"},
+ FunctionInfo{42, nullptr, "GetNasApiFqdn"},
+ FunctionInfo{43, nullptr, "GetNasApiFqdnEx"},
+ FunctionInfo{50, nullptr, "GetCurrentSetting"},
+ FunctionInfo{51, nullptr, "WriteTestParameter"},
+ FunctionInfo{52, nullptr, "ReadTestParameter"},
+ FunctionInfo{60, nullptr, "ReadSaveDataFromFsForTest"},
+ FunctionInfo{61, nullptr, "WriteSaveDataToFsForTest"},
+ FunctionInfo{62, nullptr, "DeleteSaveDataOfFsForTest"},
+ FunctionInfo{63, nullptr, "IsChangeEnvironmentIdentifierDisabled"},
+ FunctionInfo{64, nullptr, "SetWithoutDomainExchangeFqdns"},
+ FunctionInfo{100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"},
+ FunctionInfo{101, nullptr, "SetApplicationServerEnvironmentType"},
+ FunctionInfo{102, nullptr, "DeleteApplicationServerEnvironmentType"}
+ );
};
} // namespace Service::Sockets
diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp
index 93c01bf786..c89705356e 100644
--- a/src/core/hle/service/sockets/sfdnsres.cpp
+++ b/src/core/hle/service/sockets/sfdnsres.cpp
@@ -21,25 +21,6 @@
namespace Service::Sockets {
SFDNSRES::SFDNSRES(Core::System& system_) : ServiceFramework{system_, "sfdnsres"} {
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetDnsAddressesPrivateRequest"},
- {1, nullptr, "GetDnsAddressPrivateRequest"},
- {2, &SFDNSRES::GetHostByNameRequest, "GetHostByNameRequest"},
- {3, nullptr, "GetHostByAddrRequest"},
- {4, nullptr, "GetHostStringErrorRequest"},
- {5, &SFDNSRES::GetGaiStringErrorRequest, "GetGaiStringErrorRequest"},
- {6, &SFDNSRES::GetAddrInfoRequest, "GetAddrInfoRequest"},
- {7, nullptr, "GetNameInfoRequest"},
- {8, nullptr, "RequestCancelHandleRequest"},
- {9, nullptr, "CancelRequest"},
- {10, &SFDNSRES::GetHostByNameRequestWithOptions, "GetHostByNameRequestWithOptions"},
- {11, nullptr, "GetHostByAddrRequestWithOptions"},
- {12, &SFDNSRES::GetAddrInfoRequestWithOptions, "GetAddrInfoRequestWithOptions"},
- {13, nullptr, "GetNameInfoRequestWithOptions"},
- {14, &SFDNSRES::ResolverSetOptionRequest, "ResolverSetOptionRequest"},
- {15, nullptr, "ResolverGetOptionRequest"},
- };
- RegisterHandlers(functions);
}
SFDNSRES::~SFDNSRES() = default;
@@ -410,14 +391,6 @@ void SFDNSRES::ResolverSetOptionRequest(HLERequestContext& ctx) {
DNS_PRIV::DNS_PRIV(Core::System& system_)
: ServiceFramework{system_, "dns:priv"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Cmd0"},
- {1, nullptr, "Cmd1"},
- {2, nullptr, "Cmd2"},
- };
- // clang-format on
- RegisterHandlers(functions);
}
DNS_PRIV::~DNS_PRIV() = default;
diff --git a/src/core/hle/service/sockets/sfdnsres.h b/src/core/hle/service/sockets/sfdnsres.h
index 4302edc43e..b365d03b2d 100644
--- a/src/core/hle/service/sockets/sfdnsres.h
+++ b/src/core/hle/service/sockets/sfdnsres.h
@@ -26,12 +26,43 @@ private:
void GetAddrInfoRequest(HLERequestContext& ctx);
void GetAddrInfoRequestWithOptions(HLERequestContext& ctx);
void ResolverSetOptionRequest(HLERequestContext& ctx);
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetDnsAddressesPrivateRequest"},
+ FunctionInfo{1, nullptr, "GetDnsAddressPrivateRequest"},
+ FunctionInfo{2, &SFDNSRES::GetHostByNameRequest, "GetHostByNameRequest"},
+ FunctionInfo{3, nullptr, "GetHostByAddrRequest"},
+ FunctionInfo{4, nullptr, "GetHostStringErrorRequest"},
+ FunctionInfo{5, &SFDNSRES::GetGaiStringErrorRequest, "GetGaiStringErrorRequest"},
+ FunctionInfo{6, &SFDNSRES::GetAddrInfoRequest, "GetAddrInfoRequest"},
+ FunctionInfo{7, nullptr, "GetNameInfoRequest"},
+ FunctionInfo{8, nullptr, "RequestCancelHandleRequest"},
+ FunctionInfo{9, nullptr, "CancelRequest"},
+ FunctionInfo{10, &SFDNSRES::GetHostByNameRequestWithOptions, "GetHostByNameRequestWithOptions"},
+ FunctionInfo{11, nullptr, "GetHostByAddrRequestWithOptions"},
+ FunctionInfo{12, &SFDNSRES::GetAddrInfoRequestWithOptions, "GetAddrInfoRequestWithOptions"},
+ FunctionInfo{13, nullptr, "GetNameInfoRequestWithOptions"},
+ FunctionInfo{14, &SFDNSRES::ResolverSetOptionRequest, "ResolverSetOptionRequest"},
+ FunctionInfo{15, nullptr, "ResolverGetOptionRequest"}
+ );
};
class DNS_PRIV final : public ServiceFramework<DNS_PRIV> {
public:
explicit DNS_PRIV(Core::System& system_);
~DNS_PRIV() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Cmd0"},
+ FunctionInfo{1, nullptr, "Cmd1"},
+ FunctionInfo{2, nullptr, "Cmd2"}
+ );
};
} // namespace Service::Sockets
diff --git a/src/core/hle/service/sockets/sockets.cpp b/src/core/hle/service/sockets/sockets.cpp
index e96d7c5638..1c723e96a6 100644
--- a/src/core/hle/service/sockets/sockets.cpp
+++ b/src/core/hle/service/sockets/sockets.cpp
@@ -15,49 +15,49 @@ namespace Service::Sockets {
class ETHC_C final : public ServiceFramework<ETHC_C> {
public:
explicit ETHC_C(Core::System& system_)
- : ServiceFramework{system_, "ethc:c"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "Initialize"},
- {1, nullptr, "Cancel"},
- {2, nullptr, "GetResult"},
- {3, nullptr, "GetMediaList"},
- {4, nullptr, "SetMediaType"},
- {5, nullptr, "GetMediaType"},
- {6, nullptr, "GetMacAddress"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "ethc:c"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Initialize"},
+ FunctionInfo{1, nullptr, "Cancel"},
+ FunctionInfo{2, nullptr, "GetResult"},
+ FunctionInfo{3, nullptr, "GetMediaList"},
+ FunctionInfo{4, nullptr, "SetMediaType"},
+ FunctionInfo{5, nullptr, "GetMediaType"},
+ FunctionInfo{6, nullptr, "GetMacAddress"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class ETHC_I final : public ServiceFramework<ETHC_I> {
public:
explicit ETHC_I(Core::System& system_)
- : ServiceFramework{system_, "ethc:i"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetReadableHandle"},
- {1, nullptr, "Cancel"},
- {2, nullptr, "GetResult"},
- {3, nullptr, "GetInterfaceList"},
- {4, nullptr, "GetInterfaceCount"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "ethc:i"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetReadableHandle"},
+ FunctionInfo{1, nullptr, "Cancel"},
+ FunctionInfo{2, nullptr, "GetResult"},
+ FunctionInfo{3, nullptr, "GetInterfaceList"},
+ FunctionInfo{4, nullptr, "GetInterfaceCount"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class ISfDriverServiceCreator final : public ServiceFramework<ISfDriverServiceCreator> {
public:
explicit ISfDriverServiceCreator(Core::System& system_)
- : ServiceFramework{system_, "eth:nd"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "CreateDriverService"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "eth:nd"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateDriverService"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/spl/spl.cpp b/src/core/hle/service/spl/spl.cpp
index 81be99c360..ad0251fac5 100644
--- a/src/core/hle/service/spl/spl.cpp
+++ b/src/core/hle/service/spl/spl.cpp
@@ -8,181 +8,22 @@
namespace Service::SPL {
-SPL::SPL(Core::System& system_, std::shared_ptr<Module> module_)
- : Interface(system_, std::move(module_), "spl:") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &SPL::GetConfig, "GetConfig"},
- {1, &SPL::ModularExponentiate, "ModularExponentiate"},
- {5, &SPL::SetConfig, "SetConfig"},
- {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- {11, &SPL::IsDevelopment, "IsDevelopment"},
- {24, &SPL::SetBootReason, "SetBootReason"},
- {25, &SPL::GetBootReason, "GetBootReason"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
+SPL::SPL(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:") {}
SPL::~SPL() = default;
-SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr<Module> module_)
- : Interface(system_, std::move(module_), "spl:mig") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &SPL::GetConfig, "GetConfig"},
- {1, &SPL::ModularExponentiate, "ModularExponentiate"},
- {2, &SPL::GenerateAesKek, "GenerateAesKek"},
- {3, nullptr, "LoadAesKey"},
- {4, &SPL::GenerateAesKey, "GenerateAesKey"},
- {5, &SPL::SetConfig, "SetConfig"},
- {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- {11, &SPL::IsDevelopment, "IsDevelopment"},
- {14, nullptr, "DecryptAesKey"},
- {15, nullptr, "CryptAesCtr"},
- {16, nullptr, "ComputeCmac"},
- {21, nullptr, "AllocateAesKeyslot"},
- {22, nullptr, "DeallocateAesKeySlot"},
- {23, nullptr, "GetAesKeyslotAvailableEvent"},
- {24, &SPL::SetBootReason, "SetBootReason"},
- {25, &SPL::GetBootReason, "GetBootReason"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
+SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:mig") {}
SPL_MIG::~SPL_MIG() = default;
-SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr<Module> module_)
- : Interface(system_, std::move(module_), "spl:fs") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &SPL::GetConfig, "GetConfig"},
- {1, &SPL::ModularExponentiate, "ModularExponentiate"},
- {2, nullptr, "GenerateAesKek"},
- {3, nullptr, "LoadAesKey"},
- {4, nullptr, "GenerateAesKey"},
- {5, &SPL::SetConfig, "SetConfig"},
- {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- {9, nullptr, "ImportLotusKey"},
- {10, nullptr, "DecryptLotusMessage"},
- {11, &SPL::IsDevelopment, "IsDevelopment"},
- {12, nullptr, "GenerateSpecificAesKey"},
- {14, nullptr, "DecryptAesKey"},
- {15, nullptr, "CryptAesCtr"},
- {16, nullptr, "ComputeCmac"},
- {19, nullptr, "LoadTitleKey"},
- {21, nullptr, "AllocateAesKeyslot"},
- {22, nullptr, "DeallocateAesKeySlot"},
- {23, nullptr, "GetAesKeyslotAvailableEvent"},
- {24, &SPL::SetBootReason, "SetBootReason"},
- {25, &SPL::GetBootReason, "GetBootReason"},
- {31, nullptr, "GetPackage2Hash"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
+SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:fs") {}
SPL_FS::~SPL_FS() = default;
-SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr<Module> module_)
- : Interface(system_, std::move(module_), "spl:ssl") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &SPL::GetConfig, "GetConfig"},
- {1, &SPL::ModularExponentiate, "ModularExponentiate"},
- {2, nullptr, "GenerateAesKek"},
- {3, nullptr, "LoadAesKey"},
- {4, nullptr, "GenerateAesKey"},
- {5, &SPL::SetConfig, "SetConfig"},
- {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- {11, &SPL::IsDevelopment, "IsDevelopment"},
- {13, nullptr, "DecryptDeviceUniqueData"},
- {14, nullptr, "DecryptAesKey"},
- {15, nullptr, "CryptAesCtr"},
- {16, nullptr, "ComputeCmac"},
- {21, nullptr, "AllocateAesKeyslot"},
- {22, nullptr, "DeallocateAesKeySlot"},
- {23, nullptr, "GetAesKeyslotAvailableEvent"},
- {24, &SPL::SetBootReason, "SetBootReason"},
- {25, &SPL::GetBootReason, "GetBootReason"},
- {26, nullptr, "DecryptAndStoreSslClientCertKey"},
- {27, nullptr, "ModularExponentiateWithSslClientCertKey"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
+SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:ssl") {}
SPL_SSL::~SPL_SSL() = default;
-SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr<Module> module_)
- : Interface(system_, std::move(module_), "spl:es") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &SPL::GetConfig, "GetConfig"},
- {1, &SPL::ModularExponentiate, "ModularExponentiate"},
- {2, nullptr, "GenerateAesKek"},
- {3, nullptr, "LoadAesKey"},
- {4, nullptr, "GenerateAesKey"},
- {5, &SPL::SetConfig, "SetConfig"},
- {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- {11, &SPL::IsDevelopment, "IsDevelopment"},
- {13, nullptr, "DecryptDeviceUniqueData"},
- {14, nullptr, "DecryptAesKey"},
- {15, nullptr, "CryptAesCtr"},
- {16, nullptr, "ComputeCmac"},
- {17, nullptr, "ImportEsKey"},
- {18, nullptr, "UnwrapTitleKey"},
- {20, nullptr, "PrepareEsCommonKey"},
- {21, nullptr, "AllocateAesKeyslot"},
- {22, nullptr, "DeallocateAesKeySlot"},
- {23, nullptr, "GetAesKeyslotAvailableEvent"},
- {24, &SPL::SetBootReason, "SetBootReason"},
- {25, &SPL::GetBootReason, "GetBootReason"},
- {28, nullptr, "DecryptAndStoreDrmDeviceCertKey"},
- {29, nullptr, "ModularExponentiateWithDrmDeviceCertKey"},
- {31, nullptr, "PrepareEsArchiveKey"},
- {32, nullptr, "LoadPreparedAesKey"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
+SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:es") {}
SPL_ES::~SPL_ES() = default;
-SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr<Module> module_)
- : Interface(system_, std::move(module_), "spl:manu") {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &SPL::GetConfig, "GetConfig"},
- {1, &SPL::ModularExponentiate, "ModularExponentiate"},
- {2, nullptr, "GenerateAesKek"},
- {3, nullptr, "LoadAesKey"},
- {4, nullptr, "GenerateAesKey"},
- {5, &SPL::SetConfig, "SetConfig"},
- {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
- {11, &SPL::IsDevelopment, "IsDevelopment"},
- {13, nullptr, "DecryptDeviceUniqueData"},
- {14, nullptr, "DecryptAesKey"},
- {15, nullptr, "CryptAesCtr"},
- {16, nullptr, "ComputeCmac"},
- {21, nullptr, "AllocateAesKeyslot"},
- {22, nullptr, "DeallocateAesKeySlot"},
- {23, nullptr, "GetAesKeyslotAvailableEvent"},
- {24, &SPL::SetBootReason, "SetBootReason"},
- {25, &SPL::GetBootReason, "GetBootReason"},
- {30, nullptr, "ReencryptDeviceUniqueData"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-}
-
+SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "spl:manu") {}
SPL_MANU::~SPL_MANU() = default;
} // namespace Service::SPL
diff --git a/src/core/hle/service/spl/spl.h b/src/core/hle/service/spl/spl.h
index 83a3cda539..8f84d2a3d3 100644
--- a/src/core/hle/service/spl/spl.h
+++ b/src/core/hle/service/spl/spl.h
@@ -18,36 +18,177 @@ class SPL final : public Module::Interface {
public:
explicit SPL(Core::System& system_, std::shared_ptr<Module> module_);
~SPL() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
+ FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
+ FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
+ FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
+ FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}
+ );
};
class SPL_MIG final : public Module::Interface {
public:
explicit SPL_MIG(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_MIG() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
+ FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ FunctionInfo{2, &SPL::GenerateAesKek, "GenerateAesKek"},
+ FunctionInfo{3, nullptr, "LoadAesKey"},
+ FunctionInfo{4, &SPL::GenerateAesKey, "GenerateAesKey"},
+ FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
+ FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
+ FunctionInfo{14, nullptr, "DecryptAesKey"},
+ FunctionInfo{15, nullptr, "CryptAesCtr"},
+ FunctionInfo{16, nullptr, "ComputeCmac"},
+ FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
+ FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
+ FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
+ FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
+ FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}
+ );
};
class SPL_FS final : public Module::Interface {
public:
explicit SPL_FS(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_FS() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
+ FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ FunctionInfo{2, nullptr, "GenerateAesKek"},
+ FunctionInfo{3, nullptr, "LoadAesKey"},
+ FunctionInfo{4, nullptr, "GenerateAesKey"},
+ FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
+ FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ FunctionInfo{9, nullptr, "ImportLotusKey"},
+ FunctionInfo{10, nullptr, "DecryptLotusMessage"},
+ FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
+ FunctionInfo{12, nullptr, "GenerateSpecificAesKey"},
+ FunctionInfo{14, nullptr, "DecryptAesKey"},
+ FunctionInfo{15, nullptr, "CryptAesCtr"},
+ FunctionInfo{16, nullptr, "ComputeCmac"},
+ FunctionInfo{19, nullptr, "LoadTitleKey"},
+ FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
+ FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
+ FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
+ FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
+ FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"},
+ FunctionInfo{31, nullptr, "GetPackage2Hash"}
+ );
};
class SPL_SSL final : public Module::Interface {
public:
explicit SPL_SSL(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_SSL() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
+ FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ FunctionInfo{2, nullptr, "GenerateAesKek"},
+ FunctionInfo{3, nullptr, "LoadAesKey"},
+ FunctionInfo{4, nullptr, "GenerateAesKey"},
+ FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
+ FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
+ FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"},
+ FunctionInfo{14, nullptr, "DecryptAesKey"},
+ FunctionInfo{15, nullptr, "CryptAesCtr"},
+ FunctionInfo{16, nullptr, "ComputeCmac"},
+ FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
+ FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
+ FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
+ FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
+ FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"},
+ FunctionInfo{26, nullptr, "DecryptAndStoreSslClientCertKey"},
+ FunctionInfo{27, nullptr, "ModularExponentiateWithSslClientCertKey"}
+ );
};
class SPL_ES final : public Module::Interface {
public:
explicit SPL_ES(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_ES() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
+ FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ FunctionInfo{2, nullptr, "GenerateAesKek"},
+ FunctionInfo{3, nullptr, "LoadAesKey"},
+ FunctionInfo{4, nullptr, "GenerateAesKey"},
+ FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
+ FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
+ FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"},
+ FunctionInfo{14, nullptr, "DecryptAesKey"},
+ FunctionInfo{15, nullptr, "CryptAesCtr"},
+ FunctionInfo{16, nullptr, "ComputeCmac"},
+ FunctionInfo{17, nullptr, "ImportEsKey"},
+ FunctionInfo{18, nullptr, "UnwrapTitleKey"},
+ FunctionInfo{20, nullptr, "PrepareEsCommonKey"},
+ FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
+ FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
+ FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
+ FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
+ FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"},
+ FunctionInfo{28, nullptr, "DecryptAndStoreDrmDeviceCertKey"},
+ FunctionInfo{29, nullptr, "ModularExponentiateWithDrmDeviceCertKey"},
+ FunctionInfo{31, nullptr, "PrepareEsArchiveKey"},
+ FunctionInfo{32, nullptr, "LoadPreparedAesKey"}
+ );
};
class SPL_MANU final : public Module::Interface {
public:
explicit SPL_MANU(Core::System& system_, std::shared_ptr<Module> module_);
~SPL_MANU() override;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &SPL::GetConfig, "GetConfig"},
+ FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"},
+ FunctionInfo{2, nullptr, "GenerateAesKek"},
+ FunctionInfo{3, nullptr, "LoadAesKey"},
+ FunctionInfo{4, nullptr, "GenerateAesKey"},
+ FunctionInfo{5, &SPL::SetConfig, "SetConfig"},
+ FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"},
+ FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"},
+ FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"},
+ FunctionInfo{14, nullptr, "DecryptAesKey"},
+ FunctionInfo{15, nullptr, "CryptAesCtr"},
+ FunctionInfo{16, nullptr, "ComputeCmac"},
+ FunctionInfo{21, nullptr, "AllocateAesKeyslot"},
+ FunctionInfo{22, nullptr, "DeallocateAesKeySlot"},
+ FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"},
+ FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"},
+ FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"},
+ FunctionInfo{30, nullptr, "ReencryptDeviceUniqueData"}
+ );
};
} // namespace Service::SPL
diff --git a/src/core/hle/service/spl/spl_module.cpp b/src/core/hle/service/spl/spl_module.cpp
index 520cb1860b..594575d9a0 100644
--- a/src/core/hle/service/spl/spl_module.cpp
+++ b/src/core/hle/service/spl/spl_module.cpp
@@ -204,14 +204,15 @@ Result Module::Interface::GetConfigImpl(u64* out_config, ConfigItem config_item)
class CSRNG final : public Module::Interface {
public:
- explicit CSRNG(Core::System& system_, std::shared_ptr<Module> module_)
- : Interface(system_, std::move(module_), "csrng") {
- static const FunctionInfo functions[] = {
- {0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"},
- };
- RegisterHandlers(functions);
- }
+ explicit CSRNG(Core::System& system_, std::shared_ptr<Module> module_) : Interface(system_, std::move(module_), "csrng") {}
~CSRNG() override = default;
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp
index 999efd4295..c5902079ee 100644
--- a/src/core/hle/service/ssl/ssl.cpp
+++ b/src/core/hle/service/ssl/ssl.cpp
@@ -74,59 +74,19 @@ struct SslContextSharedData {
class ISslConnection final : public ServiceFramework<ISslConnection> {
public:
- explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in,
- std::shared_ptr<SslContextSharedData>& shared_data_in,
- std::unique_ptr<SSLConnectionBackend>&& backend_in)
- : ServiceFramework{system_in, "ISslConnection"}, ssl_version{ssl_version_in},
- shared_data{shared_data_in}, backend{std::move(backend_in)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ISslConnection::SetSocketDescriptor>, "SetSocketDescriptor"},
- {1, D<&ISslConnection::SetHostName>, "SetHostName"},
- {2, D<&ISslConnection::SetVerifyOption>, "SetVerifyOption"},
- {3, D<&ISslConnection::SetIoMode>, "SetIoMode"},
- {4, D<&ISslConnection::GetSocketDescriptor>, "GetSocketDescriptor"},
- {5, D<&ISslConnection::GetHostName>, "GetHostName"},
- {6, nullptr, "GetVerifyOption"},
- {7, D<&ISslConnection::GetIoMode>, "GetIoMode"},
- {8, D<&ISslConnection::DoHandshake>, "DoHandshake"},
- {9, &ISslConnection::DoHandshakeGetServerCert, "DoHandshakeGetServerCert"},
- {10, D<&ISslConnection::Read>, "Read"},
- {11, D<&ISslConnection::Write>, "Write"},
- {12, D<&ISslConnection::Pending>, "Pending"},
- {13, D<&ISslConnection::Peek>, "Peek"},
- {14, D<&ISslConnection::Poll>, "Poll"},
- {15, D<&ISslConnection::GetVerifyCertError>, "GetVerifyCertError"},
- {16, D<&ISslConnection::GetNeededServerCertBufferSize>, "GetNeededServerCertBufferSize"},
- {17, D<&ISslConnection::SetSessionCacheMode>, "SetSessionCacheMode"},
- {18, D<&ISslConnection::GetSessionCacheMode>, "GetSessionCacheMode"},
- {19, D<&ISslConnection::FlushSessionCache>, "FlushSessionCache"},
- {20, D<&ISslConnection::SetRenegotiationMode>, "SetRenegotiationMode"},
- {21, D<&ISslConnection::GetRenegotiationMode>, "GetRenegotiationMode"},
- {22, D<&ISslConnection::SetOption>, "SetOption"},
- {23, D<&ISslConnection::GetOption>, "GetOption"},
- {24, nullptr, "GetVerifyCertErrors"},
- {25, nullptr, "GetCipherInfo"},
- {26, D<&ISslConnection::SetNextAlpnProto>, "SetNextAlpnProto"},
- {27, D<&ISslConnection::GetNextAlpnProto>, "GetNextAlpnProto"},
- {28, nullptr, "SetDtlsSocketDescriptor"},
- {29, nullptr, "GetDtlsHandshakeTimeout"},
- {30, nullptr, "SetPrivateOption"},
- {31, nullptr, "SetSrtpCiphers"},
- {32, nullptr, "GetSrtpCipher"},
- {33, nullptr, "ExportKeyingMaterial"},
- {34, nullptr, "SetIoTimeout"},
- {35, nullptr, "GetIoTimeout"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
-
+ explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in, std::shared_ptr<SslContextSharedData>& shared_data_in, std::unique_ptr<SSLConnectionBackend>&& backend_in)
+ : ServiceFramework{system_in, "ISslConnection"}
+ , ssl_version{ssl_version_in}
+ , shared_data{shared_data_in}
+ , backend{std::move(backend_in)} {
backend->SetVerifyOption(verify_option);
-
shared_data->connection_count++;
}
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+
~ISslConnection() {
shared_data->connection_count--;
if (fd_to_close.has_value()) {
@@ -432,6 +392,44 @@ private:
R_SUCCEED();
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ISslConnection::SetSocketDescriptor>, "SetSocketDescriptor"},
+ FunctionInfo{1, D<&ISslConnection::SetHostName>, "SetHostName"},
+ FunctionInfo{2, D<&ISslConnection::SetVerifyOption>, "SetVerifyOption"},
+ FunctionInfo{3, D<&ISslConnection::SetIoMode>, "SetIoMode"},
+ FunctionInfo{4, D<&ISslConnection::GetSocketDescriptor>, "GetSocketDescriptor"},
+ FunctionInfo{5, D<&ISslConnection::GetHostName>, "GetHostName"},
+ FunctionInfo{6, nullptr, "GetVerifyOption"},
+ FunctionInfo{7, D<&ISslConnection::GetIoMode>, "GetIoMode"},
+ FunctionInfo{8, D<&ISslConnection::DoHandshake>, "DoHandshake"},
+ FunctionInfo{9, &ISslConnection::DoHandshakeGetServerCert, "DoHandshakeGetServerCert"},
+ FunctionInfo{10, D<&ISslConnection::Read>, "Read"},
+ FunctionInfo{11, D<&ISslConnection::Write>, "Write"},
+ FunctionInfo{12, D<&ISslConnection::Pending>, "Pending"},
+ FunctionInfo{13, D<&ISslConnection::Peek>, "Peek"},
+ FunctionInfo{14, D<&ISslConnection::Poll>, "Poll"},
+ FunctionInfo{15, D<&ISslConnection::GetVerifyCertError>, "GetVerifyCertError"},
+ FunctionInfo{16, D<&ISslConnection::GetNeededServerCertBufferSize>, "GetNeededServerCertBufferSize"},
+ FunctionInfo{17, D<&ISslConnection::SetSessionCacheMode>, "SetSessionCacheMode"},
+ FunctionInfo{18, D<&ISslConnection::GetSessionCacheMode>, "GetSessionCacheMode"},
+ FunctionInfo{19, D<&ISslConnection::FlushSessionCache>, "FlushSessionCache"},
+ FunctionInfo{20, D<&ISslConnection::SetRenegotiationMode>, "SetRenegotiationMode"},
+ FunctionInfo{21, D<&ISslConnection::GetRenegotiationMode>, "GetRenegotiationMode"},
+ FunctionInfo{22, D<&ISslConnection::SetOption>, "SetOption"},
+ FunctionInfo{23, D<&ISslConnection::GetOption>, "GetOption"},
+ FunctionInfo{24, nullptr, "GetVerifyCertErrors"},
+ FunctionInfo{25, nullptr, "GetCipherInfo"},
+ FunctionInfo{26, D<&ISslConnection::SetNextAlpnProto>, "SetNextAlpnProto"},
+ FunctionInfo{27, D<&ISslConnection::GetNextAlpnProto>, "GetNextAlpnProto"},
+ FunctionInfo{28, nullptr, "SetDtlsSocketDescriptor"},
+ FunctionInfo{29, nullptr, "GetDtlsHandshakeTimeout"},
+ FunctionInfo{30, nullptr, "SetPrivateOption"},
+ FunctionInfo{31, nullptr, "SetSrtpCiphers"},
+ FunctionInfo{32, nullptr, "GetSrtpCipher"},
+ FunctionInfo{33, nullptr, "ExportKeyingMaterial"},
+ FunctionInfo{34, nullptr, "SetIoTimeout"},
+ FunctionInfo{35, nullptr, "GetIoTimeout"}
+ );
SslVersion ssl_version;
std::shared_ptr<SslContextSharedData> shared_data;
std::unique_ptr<SSLConnectionBackend> backend;
@@ -452,29 +450,9 @@ public:
explicit ISslContext(Core::System& system_, SslVersion version)
: ServiceFramework{system_, "ISslContext"}, ssl_version{version},
shared_data{std::make_shared<SslContextSharedData>()} {
- static const FunctionInfo functions[] = {
- {0, &ISslContext::SetOption, "SetOption"},
- {1, &ISslContext::GetOption, "GetOption"},
- {2, &ISslContext::CreateConnection, "CreateConnection"},
- {3, &ISslContext::GetConnectionCount, "GetConnectionCount"},
- {4, &ISslContext::ImportServerPki, "ImportServerPki"},
- {5, &ISslContext::ImportClientPki, "ImportClientPki"},
- {6, nullptr, "RemoveServerPki"},
- {7, nullptr, "RemoveClientPki"},
- {8, D<&ISslContext::RegisterInternalPki>, "RegisterInternalPki"},
- {9, nullptr, "AddPolicyOid"},
- {10, nullptr, "ImportCrl"},
- {11, nullptr, "RemoveCrl"},
- {12, nullptr, "ImportClientCertKeyPki"},
- {13, nullptr, "GeneratePrivateKeyAndCert"},
- };
- RegisterHandlers(functions);
}
private:
- SslVersion ssl_version;
- std::shared_ptr<SslContextSharedData> shared_data;
-
void SetOption(HLERequestContext& ctx) {
struct Parameters {
ContextOption option;
@@ -561,28 +539,36 @@ private:
LOG_WARNING(Service_SSL, "(STUBBED) called");
R_SUCCEED();
}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ISslContext::SetOption, "SetOption"},
+ FunctionInfo{1, &ISslContext::GetOption, "GetOption"},
+ FunctionInfo{2, &ISslContext::CreateConnection, "CreateConnection"},
+ FunctionInfo{3, &ISslContext::GetConnectionCount, "GetConnectionCount"},
+ FunctionInfo{4, &ISslContext::ImportServerPki, "ImportServerPki"},
+ FunctionInfo{5, &ISslContext::ImportClientPki, "ImportClientPki"},
+ FunctionInfo{6, nullptr, "RemoveServerPki"},
+ FunctionInfo{7, nullptr, "RemoveClientPki"},
+ FunctionInfo{8, D<&ISslContext::RegisterInternalPki>, "RegisterInternalPki"},
+ FunctionInfo{9, nullptr, "AddPolicyOid"},
+ FunctionInfo{10, nullptr, "ImportCrl"},
+ FunctionInfo{11, nullptr, "RemoveCrl"},
+ FunctionInfo{12, nullptr, "ImportClientCertKeyPki"},
+ FunctionInfo{13, nullptr, "GeneratePrivateKeyAndCert"}
+ );
+ SslVersion ssl_version;
+ std::shared_ptr<SslContextSharedData> shared_data;
};
class ISslService final : public ServiceFramework<ISslService> {
public:
- explicit ISslService(Core::System& system_)
- : ServiceFramework{system_, "ssl"}, cert_store{system} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &ISslService::CreateContext, "CreateContext"},
- {1, nullptr, "GetContextCount"},
- {2, D<&ISslService::GetCertificates>, "GetCertificates"},
- {3, D<&ISslService::GetCertificateBufSize>, "GetCertificateBufSize"},
- {4, nullptr, "DebugIoctl"},
- {5, &ISslService::SetInterfaceVersion, "SetInterfaceVersion"},
- {6, nullptr, "FlushSessionCache"},
- {7, nullptr, "SetDebugOption"},
- {8, nullptr, "GetDebugOption"},
- {8, nullptr, "ClearTls12FallbackFlag"},
- };
- // clang-format on
+ explicit ISslService(Core::System& system_) : ServiceFramework{system_, "ssl"}, cert_store{system} {}
- RegisterHandlers(functions);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -628,147 +614,116 @@ private:
}
private:
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &ISslService::CreateContext, "CreateContext"},
+ FunctionInfo{1, nullptr, "GetContextCount"},
+ FunctionInfo{2, D<&ISslService::GetCertificates>, "GetCertificates"},
+ FunctionInfo{3, D<&ISslService::GetCertificateBufSize>, "GetCertificateBufSize"},
+ FunctionInfo{4, nullptr, "DebugIoctl"},
+ FunctionInfo{5, &ISslService::SetInterfaceVersion, "SetInterfaceVersion"},
+ FunctionInfo{6, nullptr, "FlushSessionCache"},
+ FunctionInfo{7, nullptr, "SetDebugOption"},
+ FunctionInfo{8, nullptr, "GetDebugOption"},
+ FunctionInfo{8, nullptr, "ClearTls12FallbackFlag"}
+ );
CertStore cert_store;
};
class ISslServiceForSystem final : public ServiceFramework<ISslServiceForSystem> {
- public:
- explicit ISslServiceForSystem(Core::System& system_) : ServiceFramework{system_, "ssl:s"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, D<&ISslServiceForSystem::CreateContext>, "CreateContext"},
- {1, D<&ISslServiceForSystem::GetContextCount>, "GetContextCount"},
- {2, D<&ISslServiceForSystem::GetCertificates>, "GetCertificates"},
- {3, D<&ISslServiceForSystem::GetCertificateBufSize>, "GetCertificateBufSize"},
- {4, D<&ISslServiceForSystem::DebugIoctl>, "DebugIoctl"},
- {5, D<&ISslServiceForSystem::SetInterfaceVersion>, "SetInterfaceVersion"},
- {6, D<&ISslServiceForSystem::FlushSessionCache>, "FlushSessionCache"},
- {7, D<&ISslServiceForSystem::SetDebugOption>, "SetDebugOption"},
- {8, D<&ISslServiceForSystem::GetDebugOption>, "GetDebugOption"},
- {9, D<&ISslServiceForSystem::ClearTls12FallbackFlag>, "ClearTls12FallbackFlag"},
- {100, D<&ISslServiceForSystem::CreateContextForSystem>, "CreateContextForSystem"},
- {101, D<&ISslServiceForSystem::SetThreadCoreMask>, "SetThreadCoreMask"},
- {102, D<&ISslServiceForSystem::GetThreadCoreMask>, "GetThreadCoreMask"},
- {103, D<&ISslServiceForSystem::VerifySignature>, "VerifySignature"}
- };
- // clang-format on
-
- RegisterHandlers(functions);
- };
-
- Result CreateContext() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- return ResultSuccess;
- };
-
- Result GetContextCount() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- return ResultSuccess;
- };
-
- Result GetCertificates() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- return ResultSuccess;
- };
-
- Result GetCertificateBufSize() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- return ResultSuccess;
- };
-
- Result DebugIoctl() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- return ResultSuccess;
- };
-
- Result SetInterfaceVersion() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- return ResultSuccess;
- };
-
- Result FlushSessionCache() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- return ResultSuccess;
- };
-
- Result SetDebugOption() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- return ResultSuccess;
- };
-
- Result GetDebugOption() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
-
- // TODO (jarrodnorwell)
-
- return ResultSuccess;
- };
-
- Result ClearTls12FallbackFlag() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+public:
+ explicit ISslServiceForSystem(Core::System& system_) : ServiceFramework{system_, "ssl:s"} {}
- // TODO (jarrodnorwell)
+ Result CreateContext() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- return ResultSuccess;
- };
+ Result GetContextCount() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- Result CreateContextForSystem() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ Result GetCertificates() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- // TODO (jarrodnorwell)
+ Result GetCertificateBufSize() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- return ResultSuccess;
- };
+ Result DebugIoctl() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- Result SetThreadCoreMask() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ Result SetInterfaceVersion() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- // TODO (jarrodnorwell)
+ Result FlushSessionCache() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- return ResultSuccess;
- };
+ Result SetDebugOption() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- Result GetThreadCoreMask() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ Result GetDebugOption() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- // TODO (jarrodnorwell)
+ Result ClearTls12FallbackFlag() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- return ResultSuccess;
- };
+ Result CreateContextForSystem() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- Result VerifySignature() {
- LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ Result SetThreadCoreMask() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- // TODO (jarrodnorwell)
+ Result GetThreadCoreMask() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
+ };
- return ResultSuccess;
- };
+ Result VerifySignature() {
+ LOG_DEBUG(Service_SSL, "(STUBBED) called.");
+ R_SUCCEED();
};
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
+ }
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, D<&ISslServiceForSystem::CreateContext>, "CreateContext"},
+ FunctionInfo{1, D<&ISslServiceForSystem::GetContextCount>, "GetContextCount"},
+ FunctionInfo{2, D<&ISslServiceForSystem::GetCertificates>, "GetCertificates"},
+ FunctionInfo{3, D<&ISslServiceForSystem::GetCertificateBufSize>, "GetCertificateBufSize"},
+ FunctionInfo{4, D<&ISslServiceForSystem::DebugIoctl>, "DebugIoctl"},
+ FunctionInfo{5, D<&ISslServiceForSystem::SetInterfaceVersion>, "SetInterfaceVersion"},
+ FunctionInfo{6, D<&ISslServiceForSystem::FlushSessionCache>, "FlushSessionCache"},
+ FunctionInfo{7, D<&ISslServiceForSystem::SetDebugOption>, "SetDebugOption"},
+ FunctionInfo{8, D<&ISslServiceForSystem::GetDebugOption>, "GetDebugOption"},
+ FunctionInfo{9, D<&ISslServiceForSystem::ClearTls12FallbackFlag>, "ClearTls12FallbackFlag"},
+ FunctionInfo{100, D<&ISslServiceForSystem::CreateContextForSystem>, "CreateContextForSystem"},
+ FunctionInfo{101, D<&ISslServiceForSystem::SetThreadCoreMask>, "SetThreadCoreMask"},
+ FunctionInfo{102, D<&ISslServiceForSystem::GetThreadCoreMask>, "GetThreadCoreMask"},
+ FunctionInfo{103, D<&ISslServiceForSystem::VerifySignature>, "VerifySignature"}
+ );
+};
+
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
diff --git a/src/core/hle/service/tma/tma.cpp b/src/core/hle/service/tma/tma.cpp
index c2fb33cd16..e9198eea64 100644
--- a/src/core/hle/service/tma/tma.cpp
+++ b/src/core/hle/service/tma/tma.cpp
@@ -19,12 +19,14 @@ class HTC_TENV final : public ServiceFramework<HTC_TENV> {
public:
explicit HTC_TENV(Core::System& system_)
: ServiceFramework{system_, "htc:tenv"}
- {
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetServiceInterface"},
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetServiceInterface"}
+ );
};
void LoopProcess(Core::System& system) {
diff --git a/src/core/hle/service/usb/usb.cpp b/src/core/hle/service/usb/usb.cpp
index ff2a377172..f7dc15e3db 100644
--- a/src/core/hle/service/usb/usb.cpp
+++ b/src/core/hle/service/usb/usb.cpp
@@ -17,137 +17,127 @@ namespace Service::USB {
class IDsInterface final : public ServiceFramework<IDsInterface> {
public:
- explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "AddEndpoint"},
- {1, nullptr, "GetSetupEvent"},
- {2, nullptr, "GetSetupPacket"},
- {3, nullptr, "Enable"},
- {4, nullptr, "Disable"},
- {5, nullptr, "CtrlIn"},
- {6, nullptr, "CtrlOut"},
- {7, nullptr, "GetCtrlInCompletionEvent"},
- {8, nullptr, "GetCtrlInUrbReport"},
- {9, nullptr, "GetCtrlOutCompletionEvent"},
- {10, nullptr, "GetCtrlOutUrbReport"},
- {11, nullptr, "CtrlStall"},
- {12, nullptr, "AppendConfigurationData"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "AddEndpoint"},
+ FunctionInfo{1, nullptr, "GetSetupEvent"},
+ FunctionInfo{2, nullptr, "GetSetupPacket"},
+ FunctionInfo{3, nullptr, "Enable"},
+ FunctionInfo{4, nullptr, "Disable"},
+ FunctionInfo{5, nullptr, "CtrlIn"},
+ FunctionInfo{6, nullptr, "CtrlOut"},
+ FunctionInfo{7, nullptr, "GetCtrlInCompletionEvent"},
+ FunctionInfo{8, nullptr, "GetCtrlInUrbReport"},
+ FunctionInfo{9, nullptr, "GetCtrlOutCompletionEvent"},
+ FunctionInfo{10, nullptr, "GetCtrlOutUrbReport"},
+ FunctionInfo{11, nullptr, "CtrlStall"},
+ FunctionInfo{12, nullptr, "AppendConfigurationData"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IDsRootSession final : public ServiceFramework<IDsRootSession> {
public:
- explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "OpenDsService"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenDsService"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IClientEpSession final : public ServiceFramework<IClientEpSession> {
public:
explicit IClientEpSession(Core::System& system_)
- : ServiceFramework{system_, "IClientEpSession"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "ReOpen"},
- {1, nullptr, "Close"},
- {2, nullptr, "GetCompletionEvent"},
- {3, nullptr, "PopulateRing"},
- {4, nullptr, "PostBufferAsync"},
- {5, nullptr, "GetXferReport"},
- {6, nullptr, "PostBufferMultiAsync"},
- {7, nullptr, "CreateSmmuSpace"},
- {8, nullptr, "ShareReportRing"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IClientEpSession"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "ReOpen"},
+ FunctionInfo{1, nullptr, "Close"},
+ FunctionInfo{2, nullptr, "GetCompletionEvent"},
+ FunctionInfo{3, nullptr, "PopulateRing"},
+ FunctionInfo{4, nullptr, "PostBufferAsync"},
+ FunctionInfo{5, nullptr, "GetXferReport"},
+ FunctionInfo{6, nullptr, "PostBufferMultiAsync"},
+ FunctionInfo{7, nullptr, "CreateSmmuSpace"},
+ FunctionInfo{8, nullptr, "ShareReportRing"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IClientIfSession final : public ServiceFramework<IClientIfSession> {
public:
explicit IClientIfSession(Core::System& system_)
- : ServiceFramework{system_, "IClientIfSession"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetStateChangeEvent"},
- {1, nullptr, "SetInterface"},
- {2, nullptr, "GetInterface"},
- {3, nullptr, "GetAlternateInterface"},
- {4, nullptr, "GetCurrentFrame"},
- {5, nullptr, "CtrlXferAsync"},
- {6, nullptr, "GetCtrlXferCompletionEvent"},
- {7, nullptr, "GetCtrlXferReport"},
- {8, nullptr, "ResetDevice"},
- {9, nullptr, "OpenUsbEp"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IClientIfSession"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetStateChangeEvent"},
+ FunctionInfo{1, nullptr, "SetInterface"},
+ FunctionInfo{2, nullptr, "GetInterface"},
+ FunctionInfo{3, nullptr, "GetAlternateInterface"},
+ FunctionInfo{4, nullptr, "GetCurrentFrame"},
+ FunctionInfo{5, nullptr, "CtrlXferAsync"},
+ FunctionInfo{6, nullptr, "GetCtrlXferCompletionEvent"},
+ FunctionInfo{7, nullptr, "GetCtrlXferReport"},
+ FunctionInfo{8, nullptr, "ResetDevice"},
+ FunctionInfo{9, nullptr, "OpenUsbEp"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IClientRootSession final : public ServiceFramework<IClientRootSession> {
public:
- explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "BindClientProcess"},
- {1, nullptr, "QueryAllInterfaces"},
- {2, nullptr, "QueryAvailableInterfaces"},
- {3, nullptr, "QueryAcquiredInterfaces"},
- {4, nullptr, "CreateInterfaceAvailableEvent"},
- {5, nullptr, "DestroyInterfaceAvailableEvent"},
- {6, nullptr, "GetInterfaceStateChangeEvent"},
- {7, nullptr, "AcquireUsbIf"},
- {8, nullptr, "SetTestMode"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "BindClientProcess"},
+ FunctionInfo{1, nullptr, "QueryAllInterfaces"},
+ FunctionInfo{2, nullptr, "QueryAvailableInterfaces"},
+ FunctionInfo{3, nullptr, "QueryAcquiredInterfaces"},
+ FunctionInfo{4, nullptr, "CreateInterfaceAvailableEvent"},
+ FunctionInfo{5, nullptr, "DestroyInterfaceAvailableEvent"},
+ FunctionInfo{6, nullptr, "GetInterfaceStateChangeEvent"},
+ FunctionInfo{7, nullptr, "AcquireUsbIf"},
+ FunctionInfo{8, nullptr, "SetTestMode"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IPdSession final : public ServiceFramework<IPdSession> {
public:
- explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "BindNoticeEvent"},
- {1, nullptr, "UnbindNoticeEvent"},
- {2, nullptr, "GetStatus"},
- {3, nullptr, "GetNotice"},
- {4, nullptr, "EnablePowerRequestNotice"},
- {5, nullptr, "DisablePowerRequestNotice"},
- {6, nullptr, "ReplyPowerRequest"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "BindNoticeEvent"},
+ FunctionInfo{1, nullptr, "UnbindNoticeEvent"},
+ FunctionInfo{2, nullptr, "GetStatus"},
+ FunctionInfo{3, nullptr, "GetNotice"},
+ FunctionInfo{4, nullptr, "EnablePowerRequestNotice"},
+ FunctionInfo{5, nullptr, "DisablePowerRequestNotice"},
+ FunctionInfo{6, nullptr, "ReplyPowerRequest"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IPdManager final : public ServiceFramework<IPdManager> {
public:
- explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IPdManager::OpenSession, "OpenSession"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -158,40 +148,39 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IPdSession>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IPdManager::OpenSession, "OpenSession"}
+ );
};
class IPdCradleSession final : public ServiceFramework<IPdCradleSession> {
public:
explicit IPdCradleSession(Core::System& system_)
- : ServiceFramework{system_, "IPdCradleSession"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "SetCradleVdo"},
- {1, nullptr, "GetCradleVdo"},
- {2, nullptr, "ResetCradleUsbHub"},
- {3, nullptr, "GetHostPdcFirmwareType"},
- {4, nullptr, "GetHostPdcFirmwareRevision"},
- {5, nullptr, "GetHostPdcManufactureId"},
- {6, nullptr, "GetHostPdcDeviceId"},
- {7, nullptr, "EnableCradleRecovery"},
- {8, nullptr, "DisableCradleRecovery"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ : ServiceFramework{system_, "IPdCradleSession"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "SetCradleVdo"},
+ FunctionInfo{1, nullptr, "GetCradleVdo"},
+ FunctionInfo{2, nullptr, "ResetCradleUsbHub"},
+ FunctionInfo{3, nullptr, "GetHostPdcFirmwareType"},
+ FunctionInfo{4, nullptr, "GetHostPdcFirmwareRevision"},
+ FunctionInfo{5, nullptr, "GetHostPdcManufactureId"},
+ FunctionInfo{6, nullptr, "GetHostPdcDeviceId"},
+ FunctionInfo{7, nullptr, "EnableCradleRecovery"},
+ FunctionInfo{8, nullptr, "DisableCradleRecovery"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IPdCradleManager final : public ServiceFramework<IPdCradleManager> {
public:
- explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
private:
@@ -202,61 +191,64 @@ private:
rb.Push(ResultSuccess);
rb.PushIpcInterface<IPdCradleSession>(ctx, system);
}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"}
+ );
};
class IPmMainService final : public ServiceFramework<IPmMainService> {
public:
- explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetPowerEvent"},
- {1, nullptr, "GetPowerState"},
- {2, nullptr, "GetDataEvent"},
- {3, nullptr, "GetDataRole"},
- {4, nullptr, "SetDiagData"},
- {5, nullptr, "GetDiagData"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
+ explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetPowerEvent"},
+ FunctionInfo{1, nullptr, "GetPowerState"},
+ FunctionInfo{2, nullptr, "GetDataEvent"},
+ FunctionInfo{3, nullptr, "GetDataRole"},
+ FunctionInfo{4, nullptr, "SetDiagData"},
+ FunctionInfo{5, nullptr, "GetDiagData"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IPdManufactureManager final : public ServiceFramework<IPdManufactureManager> {
public:
- explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "OpenManufactureSession"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenManufactureSession"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IQdbManager final : public ServiceFramework<IQdbManager> {
public:
- explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "ImportQuirkDevices"},
- {1, nullptr, "HasQuirk"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "ImportQuirkDevices"},
+ FunctionInfo{1, nullptr, "HasQuirk"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
class IPmObserverService final : public ServiceFramework<IPmObserverService> {
public:
- explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {0, nullptr, "GetTopologyChangeEvent"},
- {1, nullptr, "GetFlattenedTopology"},
- };
- // clang-format on
- RegisterHandlers(functions);
+ explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} {}
+
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetTopologyChangeEvent"},
+ FunctionInfo{1, nullptr, "GetFlattenedTopology"}
+ );
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
};
diff --git a/src/core/hle/service/vi/application_display_service.cpp b/src/core/hle/service/vi/application_display_service.cpp
index f179ba676a..dcebb2eba9 100644
--- a/src/core/hle/service/vi/application_display_service.cpp
+++ b/src/core/hle/service/vi/application_display_service.cpp
@@ -17,38 +17,38 @@
namespace Service::VI {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationDisplayService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{100, C<&IApplicationDisplayService::GetRelayService>, "GetRelayService"},
+ FunctionInfo{101, C<&IApplicationDisplayService::GetSystemDisplayService>, "GetSystemDisplayService"},
+ FunctionInfo{102, C<&IApplicationDisplayService::GetManagerDisplayService>, "GetManagerDisplayService"},
+ FunctionInfo{103, C<&IApplicationDisplayService::GetIndirectDisplayTransactionService>, "GetIndirectDisplayTransactionService"},
+ FunctionInfo{1000, C<&IApplicationDisplayService::ListDisplays>, "ListDisplays"},
+ FunctionInfo{1010, C<&IApplicationDisplayService::OpenDisplay>, "OpenDisplay"},
+ FunctionInfo{1011, C<&IApplicationDisplayService::OpenDefaultDisplay>, "OpenDefaultDisplay"},
+ FunctionInfo{1020, C<&IApplicationDisplayService::CloseDisplay>, "CloseDisplay"},
+ FunctionInfo{1101, C<&IApplicationDisplayService::SetDisplayEnabled>, "SetDisplayEnabled"},
+ FunctionInfo{1102, C<&IApplicationDisplayService::GetDisplayResolution>, "GetDisplayResolution"},
+ FunctionInfo{2020, C<&IApplicationDisplayService::OpenLayer>, "OpenLayer"},
+ FunctionInfo{2021, C<&IApplicationDisplayService::CloseLayer>, "CloseLayer"},
+ FunctionInfo{2030, C<&IApplicationDisplayService::CreateStrayLayer>, "CreateStrayLayer"},
+ FunctionInfo{2031, C<&IApplicationDisplayService::DestroyStrayLayer>, "DestroyStrayLayer"},
+ FunctionInfo{2101, C<&IApplicationDisplayService::SetLayerScalingMode>, "SetLayerScalingMode"},
+ FunctionInfo{2102, C<&IApplicationDisplayService::ConvertScalingMode>, "ConvertScalingMode"},
+ FunctionInfo{2103, C<&IApplicationDisplayService::Cmd2103>, "Cmd2103"},
+ FunctionInfo{2450, C<&IApplicationDisplayService::GetIndirectLayerImageMap>, "GetIndirectLayerImageMap"},
+ FunctionInfo{2451, nullptr, "GetIndirectLayerImageCropMap"},
+ FunctionInfo{2460, C<&IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo>, "GetIndirectLayerImageRequiredMemoryInfo"},
+ FunctionInfo{5202, C<&IApplicationDisplayService::GetDisplayVsyncEvent>, "GetDisplayVsyncEvent"},
+ FunctionInfo{5203, nullptr, "GetDisplayVsyncEventForDebug"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IApplicationDisplayService::IApplicationDisplayService(Core::System& system_,
std::shared_ptr<Container> container)
: ServiceFramework{system_, "IApplicationDisplayService"},
m_container{std::move(container)}, m_context{system, "IApplicationDisplayService"} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {100, C<&IApplicationDisplayService::GetRelayService>, "GetRelayService"},
- {101, C<&IApplicationDisplayService::GetSystemDisplayService>, "GetSystemDisplayService"},
- {102, C<&IApplicationDisplayService::GetManagerDisplayService>, "GetManagerDisplayService"},
- {103, C<&IApplicationDisplayService::GetIndirectDisplayTransactionService>, "GetIndirectDisplayTransactionService"},
- {1000, C<&IApplicationDisplayService::ListDisplays>, "ListDisplays"},
- {1010, C<&IApplicationDisplayService::OpenDisplay>, "OpenDisplay"},
- {1011, C<&IApplicationDisplayService::OpenDefaultDisplay>, "OpenDefaultDisplay"},
- {1020, C<&IApplicationDisplayService::CloseDisplay>, "CloseDisplay"},
- {1101, C<&IApplicationDisplayService::SetDisplayEnabled>, "SetDisplayEnabled"},
- {1102, C<&IApplicationDisplayService::GetDisplayResolution>, "GetDisplayResolution"},
- {2020, C<&IApplicationDisplayService::OpenLayer>, "OpenLayer"},
- {2021, C<&IApplicationDisplayService::CloseLayer>, "CloseLayer"},
- {2030, C<&IApplicationDisplayService::CreateStrayLayer>, "CreateStrayLayer"},
- {2031, C<&IApplicationDisplayService::DestroyStrayLayer>, "DestroyStrayLayer"},
- {2101, C<&IApplicationDisplayService::SetLayerScalingMode>, "SetLayerScalingMode"},
- {2102, C<&IApplicationDisplayService::ConvertScalingMode>, "ConvertScalingMode"},
- {2103, C<&IApplicationDisplayService::Cmd2103>, "Cmd2103"},
- {2450, C<&IApplicationDisplayService::GetIndirectLayerImageMap>, "GetIndirectLayerImageMap"},
- {2451, nullptr, "GetIndirectLayerImageCropMap"},
- {2460, C<&IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo>, "GetIndirectLayerImageRequiredMemoryInfo"},
- {5202, C<&IApplicationDisplayService::GetDisplayVsyncEvent>, "GetDisplayVsyncEvent"},
- {5203, nullptr, "GetDisplayVsyncEventForDebug"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IApplicationDisplayService::~IApplicationDisplayService() {
diff --git a/src/core/hle/service/vi/application_display_service.h b/src/core/hle/service/vi/application_display_service.h
index d2db391efd..0b5898ee56 100644
--- a/src/core/hle/service/vi/application_display_service.h
+++ b/src/core/hle/service/vi/application_display_service.h
@@ -74,8 +74,8 @@ public:
s64 width, s64 height);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
-
KernelHelpers::ServiceContext m_context;
std::mutex m_lock{};
std::set<u64> m_open_layer_ids{};
diff --git a/src/core/hle/service/vi/application_root_service.cpp b/src/core/hle/service/vi/application_root_service.cpp
index 7f35a048da..f12c564277 100644
--- a/src/core/hle/service/vi/application_root_service.cpp
+++ b/src/core/hle/service/vi/application_root_service.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -11,14 +14,17 @@
namespace Service::VI {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IApplicationRootService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, C<&IApplicationRootService::GetDisplayService>, "GetDisplayService"},
+ FunctionInfo{1, nullptr, "GetDisplayServiceWithProxyNameExchange"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IApplicationRootService::IApplicationRootService(Core::System& system_,
std::shared_ptr<Container> container)
: ServiceFramework{system_, "vi:u"}, m_container{std::move(container)} {
- static const FunctionInfo functions[] = {
- {0, C<&IApplicationRootService::GetDisplayService>, "GetDisplayService"},
- {1, nullptr, "GetDisplayServiceWithProxyNameExchange"},
- };
- RegisterHandlers(functions);
}
IApplicationRootService::~IApplicationRootService() = default;
diff --git a/src/core/hle/service/vi/application_root_service.h b/src/core/hle/service/vi/application_root_service.h
index 15aa4483d6..4deaa04f4c 100644
--- a/src/core/hle/service/vi/application_root_service.h
+++ b/src/core/hle/service/vi/application_root_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -27,6 +30,7 @@ private:
Policy policy);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/vi/manager_display_service.cpp b/src/core/hle/service/vi/manager_display_service.cpp
index e4d22ca11c..1b3b0f3379 100644
--- a/src/core/hle/service/vi/manager_display_service.cpp
+++ b/src/core/hle/service/vi/manager_display_service.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -10,96 +10,96 @@
namespace Service::VI {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IManagerDisplayService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{200, nullptr, "AllocateProcessHeapBlock"},
+ FunctionInfo{201, nullptr, "FreeProcessHeapBlock"},
+ FunctionInfo{1102, nullptr, "GetDisplayResolution"},
+ FunctionInfo{2010, C<&IManagerDisplayService::CreateManagedLayer>, "CreateManagedLayer"},
+ FunctionInfo{2011, C<&IManagerDisplayService::DestroyManagedLayer>, "DestroyManagedLayer"},
+ FunctionInfo{2012, nullptr, "CreateStrayLayer"},
+ FunctionInfo{2050, nullptr, "CreateIndirectLayer"},
+ FunctionInfo{2051, nullptr, "DestroyIndirectLayer"},
+ FunctionInfo{2052, nullptr, "CreateIndirectProducerEndPoint"},
+ FunctionInfo{2053, nullptr, "DestroyIndirectProducerEndPoint"},
+ FunctionInfo{2054, nullptr, "CreateIndirectConsumerEndPoint"},
+ FunctionInfo{2055, nullptr, "DestroyIndirectConsumerEndPoint"},
+ FunctionInfo{2060, nullptr, "CreateWatermarkCompositor"},
+ FunctionInfo{2062, nullptr, "SetWatermarkText"},
+ FunctionInfo{2063, nullptr, "SetWatermarkLayerStacks"},
+ FunctionInfo{2300, nullptr, "AcquireLayerTexturePresentingEvent"},
+ FunctionInfo{2301, nullptr, "ReleaseLayerTexturePresentingEvent"},
+ FunctionInfo{2302, nullptr, "GetDisplayHotplugEvent"},
+ FunctionInfo{2303, nullptr, "GetDisplayModeChangedEvent"},
+ FunctionInfo{2402, nullptr, "GetDisplayHotplugState"},
+ FunctionInfo{2501, nullptr, "GetCompositorErrorInfo"},
+ FunctionInfo{2601, nullptr, "GetDisplayErrorEvent"},
+ FunctionInfo{2701, nullptr, "GetDisplayFatalErrorEvent"},
+ FunctionInfo{4201, nullptr, "SetDisplayAlpha"},
+ FunctionInfo{4203, nullptr, "SetDisplayLayerStack"},
+ FunctionInfo{4205, nullptr, "SetDisplayPowerState"},
+ FunctionInfo{4206, nullptr, "SetDefaultDisplay"},
+ FunctionInfo{4207, nullptr, "ResetDisplayPanel"},
+ FunctionInfo{4208, nullptr, "SetDisplayFatalErrorEnabled"},
+ FunctionInfo{4209, nullptr, "IsDisplayPanelOn"},
+ FunctionInfo{4300, nullptr, "GetInternalPanelId"},
+ FunctionInfo{6000, C<&IManagerDisplayService::AddToLayerStack>, "AddToLayerStack"},
+ FunctionInfo{6001, nullptr, "RemoveFromLayerStack"},
+ FunctionInfo{6002, C<&IManagerDisplayService::SetLayerVisibility>, "SetLayerVisibility"},
+ FunctionInfo{6003, nullptr, "SetLayerConfig"},
+ FunctionInfo{6004, nullptr, "AttachLayerPresentationTracer"},
+ FunctionInfo{6005, nullptr, "DetachLayerPresentationTracer"},
+ FunctionInfo{6006, nullptr, "StartLayerPresentationRecording"},
+ FunctionInfo{6007, nullptr, "StopLayerPresentationRecording"},
+ FunctionInfo{6008, nullptr, "StartLayerPresentationFenceWait"},
+ FunctionInfo{6009, nullptr, "StopLayerPresentationFenceWait"},
+ FunctionInfo{6010, nullptr, "GetLayerPresentationAllFencesExpiredEvent"},
+ FunctionInfo{6011, nullptr, "EnableLayerAutoClearTransitionBuffer"},
+ FunctionInfo{6012, nullptr, "DisableLayerAutoClearTransitionBuffer"},
+ FunctionInfo{6013, nullptr, "SetLayerOpacity"},
+ FunctionInfo{6014, nullptr, "AttachLayerWatermarkCompositor"},
+ FunctionInfo{6015, nullptr, "DetachLayerWatermarkCompositor"},
+ FunctionInfo{7000, nullptr, "SetContentVisibility"},
+ FunctionInfo{8000, nullptr, "SetConductorLayer"},
+ FunctionInfo{8001, nullptr, "SetTimestampTracking"},
+ FunctionInfo{8100, nullptr, "SetIndirectProducerFlipOffset"},
+ FunctionInfo{8200, nullptr, "CreateSharedBufferStaticStorage"},
+ FunctionInfo{8201, nullptr, "CreateSharedBufferTransferMemory"},
+ FunctionInfo{8202, nullptr, "DestroySharedBuffer"},
+ FunctionInfo{8203, nullptr, "BindSharedLowLevelLayerToManagedLayer"},
+ FunctionInfo{8204, nullptr, "BindSharedLowLevelLayerToIndirectLayer"},
+ FunctionInfo{8207, nullptr, "UnbindSharedLowLevelLayer"},
+ FunctionInfo{8208, nullptr, "ConnectSharedLowLevelLayerToSharedBuffer"},
+ FunctionInfo{8209, nullptr, "DisconnectSharedLowLevelLayerFromSharedBuffer"},
+ FunctionInfo{8210, nullptr, "CreateSharedLayer"},
+ FunctionInfo{8211, nullptr, "DestroySharedLayer"},
+ FunctionInfo{8216, nullptr, "AttachSharedLayerToLowLevelLayer"},
+ FunctionInfo{8217, nullptr, "ForceDetachSharedLayerFromLowLevelLayer"},
+ FunctionInfo{8218, nullptr, "StartDetachSharedLayerFromLowLevelLayer"},
+ FunctionInfo{8219, nullptr, "FinishDetachSharedLayerFromLowLevelLayer"},
+ FunctionInfo{8220, nullptr, "GetSharedLayerDetachReadyEvent"},
+ FunctionInfo{8221, nullptr, "GetSharedLowLevelLayerSynchronizedEvent"},
+ FunctionInfo{8222, nullptr, "CheckSharedLowLevelLayerSynchronized"},
+ FunctionInfo{8223, nullptr, "RegisterSharedBufferImporterAruid"},
+ FunctionInfo{8224, nullptr, "UnregisterSharedBufferImporterAruid"},
+ FunctionInfo{8227, nullptr, "CreateSharedBufferProcessHeap"},
+ FunctionInfo{8228, nullptr, "GetSharedLayerLayerStacks"},
+ FunctionInfo{8229, nullptr, "SetSharedLayerLayerStacks"},
+ FunctionInfo{8291, nullptr, "PresentDetachedSharedFrameBufferToLowLevelLayer"},
+ FunctionInfo{8292, nullptr, "FillDetachedSharedFrameBufferColor"},
+ FunctionInfo{8293, nullptr, "GetDetachedSharedFrameBufferImage"},
+ FunctionInfo{8294, nullptr, "SetDetachedSharedFrameBufferImage"},
+ FunctionInfo{8295, nullptr, "CopyDetachedSharedFrameBufferImage"},
+ FunctionInfo{8296, nullptr, "SetDetachedSharedFrameBufferSubImage"},
+ FunctionInfo{8297, nullptr, "GetSharedFrameBufferContentParameter"},
+ FunctionInfo{8298, nullptr, "ExpandStartupLogoOnSharedFrameBuffer"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IManagerDisplayService::IManagerDisplayService(Core::System& system_,
std::shared_ptr<Container> container)
: ServiceFramework{system_, "IManagerDisplayService"}, m_container{std::move(container)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {200, nullptr, "AllocateProcessHeapBlock"},
- {201, nullptr, "FreeProcessHeapBlock"},
- {1102, nullptr, "GetDisplayResolution"},
- {2010, C<&IManagerDisplayService::CreateManagedLayer>, "CreateManagedLayer"},
- {2011, C<&IManagerDisplayService::DestroyManagedLayer>, "DestroyManagedLayer"},
- {2012, nullptr, "CreateStrayLayer"},
- {2050, nullptr, "CreateIndirectLayer"},
- {2051, nullptr, "DestroyIndirectLayer"},
- {2052, nullptr, "CreateIndirectProducerEndPoint"},
- {2053, nullptr, "DestroyIndirectProducerEndPoint"},
- {2054, nullptr, "CreateIndirectConsumerEndPoint"},
- {2055, nullptr, "DestroyIndirectConsumerEndPoint"},
- {2060, nullptr, "CreateWatermarkCompositor"},
- {2062, nullptr, "SetWatermarkText"},
- {2063, nullptr, "SetWatermarkLayerStacks"},
- {2300, nullptr, "AcquireLayerTexturePresentingEvent"},
- {2301, nullptr, "ReleaseLayerTexturePresentingEvent"},
- {2302, nullptr, "GetDisplayHotplugEvent"},
- {2303, nullptr, "GetDisplayModeChangedEvent"},
- {2402, nullptr, "GetDisplayHotplugState"},
- {2501, nullptr, "GetCompositorErrorInfo"},
- {2601, nullptr, "GetDisplayErrorEvent"},
- {2701, nullptr, "GetDisplayFatalErrorEvent"},
- {4201, nullptr, "SetDisplayAlpha"},
- {4203, nullptr, "SetDisplayLayerStack"},
- {4205, nullptr, "SetDisplayPowerState"},
- {4206, nullptr, "SetDefaultDisplay"},
- {4207, nullptr, "ResetDisplayPanel"},
- {4208, nullptr, "SetDisplayFatalErrorEnabled"},
- {4209, nullptr, "IsDisplayPanelOn"},
- {4300, nullptr, "GetInternalPanelId"},
- {6000, C<&IManagerDisplayService::AddToLayerStack>, "AddToLayerStack"},
- {6001, nullptr, "RemoveFromLayerStack"},
- {6002, C<&IManagerDisplayService::SetLayerVisibility>, "SetLayerVisibility"},
- {6003, nullptr, "SetLayerConfig"},
- {6004, nullptr, "AttachLayerPresentationTracer"},
- {6005, nullptr, "DetachLayerPresentationTracer"},
- {6006, nullptr, "StartLayerPresentationRecording"},
- {6007, nullptr, "StopLayerPresentationRecording"},
- {6008, nullptr, "StartLayerPresentationFenceWait"},
- {6009, nullptr, "StopLayerPresentationFenceWait"},
- {6010, nullptr, "GetLayerPresentationAllFencesExpiredEvent"},
- {6011, nullptr, "EnableLayerAutoClearTransitionBuffer"},
- {6012, nullptr, "DisableLayerAutoClearTransitionBuffer"},
- {6013, nullptr, "SetLayerOpacity"},
- {6014, nullptr, "AttachLayerWatermarkCompositor"},
- {6015, nullptr, "DetachLayerWatermarkCompositor"},
- {7000, nullptr, "SetContentVisibility"},
- {8000, nullptr, "SetConductorLayer"},
- {8001, nullptr, "SetTimestampTracking"},
- {8100, nullptr, "SetIndirectProducerFlipOffset"},
- {8200, nullptr, "CreateSharedBufferStaticStorage"},
- {8201, nullptr, "CreateSharedBufferTransferMemory"},
- {8202, nullptr, "DestroySharedBuffer"},
- {8203, nullptr, "BindSharedLowLevelLayerToManagedLayer"},
- {8204, nullptr, "BindSharedLowLevelLayerToIndirectLayer"},
- {8207, nullptr, "UnbindSharedLowLevelLayer"},
- {8208, nullptr, "ConnectSharedLowLevelLayerToSharedBuffer"},
- {8209, nullptr, "DisconnectSharedLowLevelLayerFromSharedBuffer"},
- {8210, nullptr, "CreateSharedLayer"},
- {8211, nullptr, "DestroySharedLayer"},
- {8216, nullptr, "AttachSharedLayerToLowLevelLayer"},
- {8217, nullptr, "ForceDetachSharedLayerFromLowLevelLayer"},
- {8218, nullptr, "StartDetachSharedLayerFromLowLevelLayer"},
- {8219, nullptr, "FinishDetachSharedLayerFromLowLevelLayer"},
- {8220, nullptr, "GetSharedLayerDetachReadyEvent"},
- {8221, nullptr, "GetSharedLowLevelLayerSynchronizedEvent"},
- {8222, nullptr, "CheckSharedLowLevelLayerSynchronized"},
- {8223, nullptr, "RegisterSharedBufferImporterAruid"},
- {8224, nullptr, "UnregisterSharedBufferImporterAruid"},
- {8227, nullptr, "CreateSharedBufferProcessHeap"},
- {8228, nullptr, "GetSharedLayerLayerStacks"},
- {8229, nullptr, "SetSharedLayerLayerStacks"},
- {8291, nullptr, "PresentDetachedSharedFrameBufferToLowLevelLayer"},
- {8292, nullptr, "FillDetachedSharedFrameBufferColor"},
- {8293, nullptr, "GetDetachedSharedFrameBufferImage"},
- {8294, nullptr, "SetDetachedSharedFrameBufferImage"},
- {8295, nullptr, "CopyDetachedSharedFrameBufferImage"},
- {8296, nullptr, "SetDetachedSharedFrameBufferSubImage"},
- {8297, nullptr, "GetSharedFrameBufferContentParameter"},
- {8298, nullptr, "ExpandStartupLogoOnSharedFrameBuffer"},
- };
- // clang-format on
-
- RegisterHandlers(functions);
}
IManagerDisplayService::~IManagerDisplayService() = default;
diff --git a/src/core/hle/service/vi/manager_display_service.h b/src/core/hle/service/vi/manager_display_service.h
index 14a107cb43..1c7a79f337 100644
--- a/src/core/hle/service/vi/manager_display_service.h
+++ b/src/core/hle/service/vi/manager_display_service.h
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -37,6 +37,7 @@ public:
Result SetLayerVisibility(bool visible, u64 layer_id);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/vi/manager_root_service.cpp b/src/core/hle/service/vi/manager_root_service.cpp
index 0f16a15b4a..0cc98bc2c0 100644
--- a/src/core/hle/service/vi/manager_root_service.cpp
+++ b/src/core/hle/service/vi/manager_root_service.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -12,18 +15,21 @@
namespace Service::VI {
+std::optional<ServiceFrameworkBase::FunctionInfoBase> IManagerRootService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{2, C<&IManagerRootService::GetDisplayService>, "GetDisplayService"},
+ FunctionInfo{3, nullptr, "GetDisplayServiceWithProxyNameExchange"},
+ FunctionInfo{100, nullptr, "PrepareFatal"},
+ FunctionInfo{101, nullptr, "ShowFatal"},
+ FunctionInfo{102, nullptr, "DrawFatalRectangle"},
+ FunctionInfo{103, nullptr, "DrawFatalText32"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
+}
+
IManagerRootService::IManagerRootService(Core::System& system_,
std::shared_ptr<Container> container)
: ServiceFramework{system_, "vi:m"}, m_container{std::move(container)} {
- static const FunctionInfo functions[] = {
- {2, C<&IManagerRootService::GetDisplayService>, "GetDisplayService"},
- {3, nullptr, "GetDisplayServiceWithProxyNameExchange"},
- {100, nullptr, "PrepareFatal"},
- {101, nullptr, "ShowFatal"},
- {102, nullptr, "DrawFatalRectangle"},
- {103, nullptr, "DrawFatalText32"},
- };
- RegisterHandlers(functions);
}
IManagerRootService::~IManagerRootService() = default;
diff --git a/src/core/hle/service/vi/manager_root_service.h b/src/core/hle/service/vi/manager_root_service.h
index 77cd328699..78c0d1f80d 100644
--- a/src/core/hle/service/vi/manager_root_service.h
+++ b/src/core/hle/service/vi/manager_root_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -26,6 +29,7 @@ public:
Policy policy);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/vi/shared_buffer_manager.h b/src/core/hle/service/vi/shared_buffer_manager.h
index 807db10f31..d1ce57ee27 100644
--- a/src/core/hle/service/vi/shared_buffer_manager.h
+++ b/src/core/hle/service/vi/shared_buffer_manager.h
@@ -18,6 +18,10 @@ class KPageGroup;
class KReadableEvent;
} // namespace Kernel
+namespace Core {
+class System;
+}
+
namespace Service::android {
class BufferQueueProducer;
}
diff --git a/src/core/hle/service/vi/system_display_service.cpp b/src/core/hle/service/vi/system_display_service.cpp
index 0956053dcf..997f0a51fc 100644
--- a/src/core/hle/service/vi/system_display_service.cpp
+++ b/src/core/hle/service/vi/system_display_service.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
@@ -12,63 +12,63 @@
namespace Service::VI {
-ISystemDisplayService::ISystemDisplayService(Core::System& system_,
- std::shared_ptr<Container> container)
- : ServiceFramework{system_, "ISystemDisplayService"}, m_container{std::move(container)} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {1200, nullptr, "GetZOrderCountMin"},
- {1202, nullptr, "GetZOrderCountMax"},
- {1203, nullptr, "GetDisplayLogicalResolution"},
- {1204, nullptr, "SetDisplayMagnification"},
- {2201, nullptr, "SetLayerPosition"},
- {2203, nullptr, "SetLayerSize"},
- {2204, C<&ISystemDisplayService::GetLayerZ>, "GetLayerZ"},
- {2205, C<&ISystemDisplayService::SetLayerZ>, "SetLayerZ"},
- {2207, C<&ISystemDisplayService::SetLayerVisibility>, "SetLayerVisibility"},
- {2209, nullptr, "SetLayerAlpha"},
- {2210, nullptr, "SetLayerPositionAndSize"},
- {2312, nullptr, "CreateStrayLayer"},
- {2400, nullptr, "OpenIndirectLayer"},
- {2401, nullptr, "CloseIndirectLayer"},
- {2402, nullptr, "FlipIndirectLayer"},
- {3000, C<&ISystemDisplayService::ListDisplayModes>, "ListDisplayModes"},
- {3001, nullptr, "ListDisplayRgbRanges"},
- {3002, nullptr, "ListDisplayContentTypes"},
- {3200, C<&ISystemDisplayService::GetDisplayMode>, "GetDisplayMode"},
- {3201, nullptr, "SetDisplayMode"},
- {3202, nullptr, "GetDisplayUnderscan"},
- {3203, nullptr, "SetDisplayUnderscan"},
- {3204, nullptr, "GetDisplayContentType"},
- {3205, nullptr, "SetDisplayContentType"},
- {3206, nullptr, "GetDisplayRgbRange"},
- {3207, nullptr, "SetDisplayRgbRange"},
- {3208, nullptr, "GetDisplayCmuMode"},
- {3209, nullptr, "SetDisplayCmuMode"},
- {3210, nullptr, "GetDisplayContrastRatio"},
- {3211, nullptr, "SetDisplayContrastRatio"},
- {3214, nullptr, "GetDisplayGamma"},
- {3215, nullptr, "SetDisplayGamma"},
- {3216, nullptr, "GetDisplayCmuLuma"},
- {3217, nullptr, "SetDisplayCmuLuma"},
- {3218, nullptr, "SetDisplayCrcMode"},
- {6013, nullptr, "GetLayerPresentationSubmissionTimestamps"},
- {8225, C<&ISystemDisplayService::GetSharedBufferMemoryHandleId>, "GetSharedBufferMemoryHandleId"},
- {8250, C<&ISystemDisplayService::OpenSharedLayer>, "OpenSharedLayer"},
- {8251, nullptr, "CloseSharedLayer"},
- {8252, C<&ISystemDisplayService::ConnectSharedLayer>, "ConnectSharedLayer"},
- {8253, nullptr, "DisconnectSharedLayer"},
- {8254, C<&ISystemDisplayService::AcquireSharedFrameBuffer>, "AcquireSharedFrameBuffer"},
- {8255, C<&ISystemDisplayService::PresentSharedFrameBuffer>, "PresentSharedFrameBuffer"},
- {8256, C<&ISystemDisplayService::GetSharedFrameBufferAcquirableEvent>, "GetSharedFrameBufferAcquirableEvent"},
- {8257, nullptr, "FillSharedFrameBufferColor"},
- {8258, C<&ISystemDisplayService::CancelSharedFrameBuffer>, "CancelSharedFrameBuffer"},
- {9000, nullptr, "GetDp2hdmiController"},
- };
- // clang-format on
- RegisterHandlers(functions);
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemDisplayService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1200, nullptr, "GetZOrderCountMin"},
+ FunctionInfo{1202, nullptr, "GetZOrderCountMax"},
+ FunctionInfo{1203, nullptr, "GetDisplayLogicalResolution"},
+ FunctionInfo{1204, nullptr, "SetDisplayMagnification"},
+ FunctionInfo{2201, nullptr, "SetLayerPosition"},
+ FunctionInfo{2203, nullptr, "SetLayerSize"},
+ FunctionInfo{2204, C<&ISystemDisplayService::GetLayerZ>, "GetLayerZ"},
+ FunctionInfo{2205, C<&ISystemDisplayService::SetLayerZ>, "SetLayerZ"},
+ FunctionInfo{2207, C<&ISystemDisplayService::SetLayerVisibility>, "SetLayerVisibility"},
+ FunctionInfo{2209, nullptr, "SetLayerAlpha"},
+ FunctionInfo{2210, nullptr, "SetLayerPositionAndSize"},
+ FunctionInfo{2312, nullptr, "CreateStrayLayer"},
+ FunctionInfo{2400, nullptr, "OpenIndirectLayer"},
+ FunctionInfo{2401, nullptr, "CloseIndirectLayer"},
+ FunctionInfo{2402, nullptr, "FlipIndirectLayer"},
+ FunctionInfo{3000, C<&ISystemDisplayService::ListDisplayModes>, "ListDisplayModes"},
+ FunctionInfo{3001, nullptr, "ListDisplayRgbRanges"},
+ FunctionInfo{3002, nullptr, "ListDisplayContentTypes"},
+ FunctionInfo{3200, C<&ISystemDisplayService::GetDisplayMode>, "GetDisplayMode"},
+ FunctionInfo{3201, nullptr, "SetDisplayMode"},
+ FunctionInfo{3202, nullptr, "GetDisplayUnderscan"},
+ FunctionInfo{3203, nullptr, "SetDisplayUnderscan"},
+ FunctionInfo{3204, nullptr, "GetDisplayContentType"},
+ FunctionInfo{3205, nullptr, "SetDisplayContentType"},
+ FunctionInfo{3206, nullptr, "GetDisplayRgbRange"},
+ FunctionInfo{3207, nullptr, "SetDisplayRgbRange"},
+ FunctionInfo{3208, nullptr, "GetDisplayCmuMode"},
+ FunctionInfo{3209, nullptr, "SetDisplayCmuMode"},
+ FunctionInfo{3210, nullptr, "GetDisplayContrastRatio"},
+ FunctionInfo{3211, nullptr, "SetDisplayContrastRatio"},
+ FunctionInfo{3214, nullptr, "GetDisplayGamma"},
+ FunctionInfo{3215, nullptr, "SetDisplayGamma"},
+ FunctionInfo{3216, nullptr, "GetDisplayCmuLuma"},
+ FunctionInfo{3217, nullptr, "SetDisplayCmuLuma"},
+ FunctionInfo{3218, nullptr, "SetDisplayCrcMode"},
+ FunctionInfo{6013, nullptr, "GetLayerPresentationSubmissionTimestamps"},
+ FunctionInfo{8225, C<&ISystemDisplayService::GetSharedBufferMemoryHandleId>, "GetSharedBufferMemoryHandleId"},
+ FunctionInfo{8250, C<&ISystemDisplayService::OpenSharedLayer>, "OpenSharedLayer"},
+ FunctionInfo{8251, nullptr, "CloseSharedLayer"},
+ FunctionInfo{8252, C<&ISystemDisplayService::ConnectSharedLayer>, "ConnectSharedLayer"},
+ FunctionInfo{8253, nullptr, "DisconnectSharedLayer"},
+ FunctionInfo{8254, C<&ISystemDisplayService::AcquireSharedFrameBuffer>, "AcquireSharedFrameBuffer"},
+ FunctionInfo{8255, C<&ISystemDisplayService::PresentSharedFrameBuffer>, "PresentSharedFrameBuffer"},
+ FunctionInfo{8256, C<&ISystemDisplayService::GetSharedFrameBufferAcquirableEvent>, "GetSharedFrameBufferAcquirableEvent"},
+ FunctionInfo{8257, nullptr, "FillSharedFrameBufferColor"},
+ FunctionInfo{8258, C<&ISystemDisplayService::CancelSharedFrameBuffer>, "CancelSharedFrameBuffer"},
+ FunctionInfo{9000, nullptr, "GetDp2hdmiController"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
}
+ISystemDisplayService::ISystemDisplayService(Core::System& system_, std::shared_ptr<Container> container)
+ : ServiceFramework{system_, "ISystemDisplayService"}, m_container{std::move(container)}
+{}
+
ISystemDisplayService::~ISystemDisplayService() = default;
Result ISystemDisplayService::GetLayerZ(Out<u64> out_z_value, u64 layer_id) {
diff --git a/src/core/hle/service/vi/system_display_service.h b/src/core/hle/service/vi/system_display_service.h
index a3b88c519d..04c9f0977e 100644
--- a/src/core/hle/service/vi/system_display_service.h
+++ b/src/core/hle/service/vi/system_display_service.h
@@ -47,6 +47,7 @@ private:
Result CancelSharedFrameBuffer(u64 layer_id, s64 slot);
private:
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/vi/system_root_service.cpp b/src/core/hle/service/vi/system_root_service.cpp
index 3489727d81..c078be37a3 100644
--- a/src/core/hle/service/vi/system_root_service.cpp
+++ b/src/core/hle/service/vi/system_root_service.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -11,15 +14,18 @@
namespace Service::VI {
-ISystemRootService::ISystemRootService(Core::System& system_, std::shared_ptr<Container> container)
- : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)} {
- static const FunctionInfo functions[] = {
- {1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"},
- {3, nullptr, "GetDisplayServiceWithProxyNameExchange"},
- };
- RegisterHandlers(functions);
+std::optional<ServiceFrameworkBase::FunctionInfoBase> ISystemRootService::FindRequest(u32 key) {
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"},
+ FunctionInfo{3, nullptr, "GetDisplayServiceWithProxyNameExchange"}
+ );
+ return HandlerTableGenerateWithFind(key, functions);
}
+ISystemRootService::ISystemRootService(Core::System& system_, std::shared_ptr<Container> container)
+ : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)}
+{}
+
ISystemRootService::~ISystemRootService() = default;
Result ISystemRootService::GetDisplayService(
diff --git a/src/core/hle/service/vi/system_root_service.h b/src/core/hle/service/vi/system_root_service.h
index 9d5aa53d38..baf516fec5 100644
--- a/src/core/hle/service/vi/system_root_service.h
+++ b/src/core/hle/service/vi/system_root_service.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -26,6 +29,7 @@ private:
Out<SharedPointer<IApplicationDisplayService>> out_application_display_service,
Policy policy);
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override;
const std::shared_ptr<Container> m_container;
};
diff --git a/src/core/hle/service/wlan/wlan.cpp b/src/core/hle/service/wlan/wlan.cpp
index bcd357d57a..fa68ff51ba 100644
--- a/src/core/hle/service/wlan/wlan.cpp
+++ b/src/core/hle/service/wlan/wlan.cpp
@@ -16,232 +16,248 @@ class ILocalManager final : public ServiceFramework<ILocalManager> {
public:
explicit ILocalManager(Core::System& system_)
: ServiceFramework{system_, "wlan:lcl"}
- {
- static const FunctionInfo functions[] = {
- { 0, nullptr, "OpenMasterMode" },
- { 0, nullptr, "OpenMode_2" },
- { 1, nullptr, "CloseMasterMode" },
- { 1, nullptr, "CloseMode_2" },
- { 2, nullptr, "OpenClientMode" },
- { 2, nullptr, "GetMacAddress_2" },
- { 3, nullptr, "CloseClientMode" },
- { 3, nullptr, "CreateBss" },
- { 4, nullptr, "OpenSpectatorMode" },
- { 4, nullptr, "DestroyBss" },
- { 5, nullptr, "CloseSpectatorMode" },
- { 5, nullptr, "StartScan_2" },
- { 6, nullptr, "GetMacAddress_2" },
- { 6, nullptr, "StopScan_2" },
- { 7, nullptr, "CreateBss" },
- { 7, nullptr, "Connect_2" },
- { 8, nullptr, "DestroyBss" },
- { 8, nullptr, "CancelConnect_2" },
- { 9, nullptr, "StartScan_2" },
- { 9, nullptr, "Join" },
- { 10, nullptr, "StopScan_2" },
- { 10, nullptr, "CancelJoin" },
- { 11, nullptr, "Connect_2" },
- { 11, nullptr, "Disconnect_2" },
- { 12, nullptr, "CancelConnect_2" },
- { 12, nullptr, "SetBeaconLostCount" },
- { 13, nullptr, "Join" },
- { 13, nullptr, "GetSystemEvent_2" },
- { 14, nullptr, "CancelJoin" },
- { 14, nullptr, "GetConnectionStatus_2" },
- { 15, nullptr, "Disconnect_2" },
- { 15, nullptr, "GetClientStatus" },
- { 16, nullptr, "SetBeaconLostCount" },
- { 16, nullptr, "GetBssIndicationEvent" },
- { 17, nullptr, "GetSystemEvent_2" },
- { 17, nullptr, "GetBssIndicationInfo" },
- { 18, nullptr, "GetConnectionStatus_2" },
- { 18, nullptr, "GetState_2" },
- { 19, nullptr, "GetClientStatus" },
- { 19, nullptr, "GetAllowedChannels" },
- { 20, nullptr, "GetBssIndicationEvent" },
- { 20, nullptr, "AddIe" },
- { 21, nullptr, "GetBssIndicationInfo" },
- { 21, nullptr, "DeleteIe" },
- { 22, nullptr, "GetState_2" },
- { 22, nullptr, "PutFrameRaw" },
- { 23, nullptr, "GetAllowedChannels" },
- { 23, nullptr, "CancelGetFrame" },
- { 24, nullptr, "AddIe" },
- { 24, nullptr, "CreateRxEntry" },
- { 25, nullptr, "DeleteIe" },
- { 25, nullptr, "DeleteRxEntry" },
- { 26, nullptr, "PutFrameRaw" },
- { 26, nullptr, "AddEthertypeToRxEntry" },
- { 27, nullptr, "CancelGetFrame" },
- { 27, nullptr, "DeleteEthertypeFromRxEntry" },
- { 28, nullptr, "CreateRxEntry" },
- { 28, nullptr, "AddMatchingDataToRxEntry" },
- { 29, nullptr, "DeleteRxEntry" },
- { 29, nullptr, "RemoveMatchingDataFromRxEntry" },
- { 30, nullptr, "AddEthertypeToRxEntry" },
- { 30, nullptr, "GetScanResult_2" },
- { 31, nullptr, "DeleteEthertypeFromRxEntry" },
- { 31, nullptr, "PutActionFrameOneShot" },
- { 32, nullptr, "AddMatchingDataToRxEntry" },
- { 32, nullptr, "SetActionFrameWithBeacon" },
- { 33, nullptr, "RemoveMatchingDataFromRxEntry" },
- { 33, nullptr, "CancelActionFrameWithBeacon" },
- { 34, nullptr, "GetScanResult_2" },
- { 34, nullptr, "CreateRxEntryForActionFrame" },
- { 35, nullptr, "PutActionFrameOneShot" },
- { 35, nullptr, "DeleteRxEntryForActionFrame" },
- { 36, nullptr, "SetActionFrameWithBeacon" },
- { 36, nullptr, "AddSubtypeToRxEntryForActionFrame" },
- { 37, nullptr, "CancelActionFrameWithBeacon" },
- { 37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" },
- { 38, nullptr, "CreateRxEntryForActionFrame" },
- { 38, nullptr, "CancelGetActionFrame" },
- { 39, nullptr, "DeleteRxEntryForActionFrame" },
- { 39, nullptr, "GetRssi_2" },
- { 40, nullptr, "AddSubtypeToRxEntryForActionFrame" },
- { 40, nullptr, "SetMaxAssociationNumber" },
- { 41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" },
- { 41, nullptr, "Cmd41" },
- { 42, nullptr, "CancelGetActionFrame" },
- { 42, nullptr, "Cmd42" },
- { 43, nullptr, "GetRssi_2" },
- { 43, nullptr, "Cmd43" },
- { 44, nullptr, "SetMaxAssociationNumber" },
- { 45, nullptr, "OpenLcsMasterMode" },
- { 46, nullptr, "CloseLcsMasterMode" },
- { 47, nullptr, "OpenLcsClientMode" },
- { 48, nullptr, "CloseLcsClientMode" },
- { 49, nullptr, "GetChannelStats" },
- { 50, nullptr, "Cmd50" },
- { 51, nullptr, "Cmd51" },
- { 52, nullptr, "Cmd52" },
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "OpenMasterMode"},
+ FunctionInfo{0, nullptr, "OpenMode_2"},
+ FunctionInfo{1, nullptr, "CloseMasterMode"},
+ FunctionInfo{1, nullptr, "CloseMode_2"},
+ FunctionInfo{2, nullptr, "OpenClientMode"},
+ FunctionInfo{2, nullptr, "GetMacAddress_2"},
+ FunctionInfo{3, nullptr, "CloseClientMode"},
+ FunctionInfo{3, nullptr, "CreateBss"},
+ FunctionInfo{4, nullptr, "OpenSpectatorMode"},
+ FunctionInfo{4, nullptr, "DestroyBss"},
+ FunctionInfo{5, nullptr, "CloseSpectatorMode"},
+ FunctionInfo{5, nullptr, "StartScan_2"},
+ FunctionInfo{6, nullptr, "GetMacAddress_2"},
+ FunctionInfo{6, nullptr, "StopScan_2"},
+ FunctionInfo{7, nullptr, "CreateBss"},
+ FunctionInfo{7, nullptr, "Connect_2"},
+ FunctionInfo{8, nullptr, "DestroyBss"},
+ FunctionInfo{8, nullptr, "CancelConnect_2"},
+ FunctionInfo{9, nullptr, "StartScan_2"},
+ FunctionInfo{9, nullptr, "Join"},
+ FunctionInfo{10, nullptr, "StopScan_2"},
+ FunctionInfo{10, nullptr, "CancelJoin"},
+ FunctionInfo{11, nullptr, "Connect_2"},
+ FunctionInfo{11, nullptr, "Disconnect_2"},
+ FunctionInfo{12, nullptr, "CancelConnect_2"},
+ FunctionInfo{12, nullptr, "SetBeaconLostCount"},
+ FunctionInfo{13, nullptr, "Join"},
+ FunctionInfo{13, nullptr, "GetSystemEvent_2"},
+ FunctionInfo{14, nullptr, "CancelJoin"},
+ FunctionInfo{14, nullptr, "GetConnectionStatus_2"},
+ FunctionInfo{15, nullptr, "Disconnect_2"},
+ FunctionInfo{15, nullptr, "GetClientStatus"},
+ FunctionInfo{16, nullptr, "SetBeaconLostCount"},
+ FunctionInfo{16, nullptr, "GetBssIndicationEvent"},
+ FunctionInfo{17, nullptr, "GetSystemEvent_2"},
+ FunctionInfo{17, nullptr, "GetBssIndicationInfo"},
+ FunctionInfo{18, nullptr, "GetConnectionStatus_2"},
+ FunctionInfo{18, nullptr, "GetState_2"},
+ FunctionInfo{19, nullptr, "GetClientStatus"},
+ FunctionInfo{19, nullptr, "GetAllowedChannels"},
+ FunctionInfo{20, nullptr, "GetBssIndicationEvent"},
+ FunctionInfo{20, nullptr, "AddIe"},
+ FunctionInfo{21, nullptr, "GetBssIndicationInfo"},
+ FunctionInfo{21, nullptr, "DeleteIe"},
+ FunctionInfo{22, nullptr, "GetState_2"},
+ FunctionInfo{22, nullptr, "PutFrameRaw"},
+ FunctionInfo{23, nullptr, "GetAllowedChannels"},
+ FunctionInfo{23, nullptr, "CancelGetFrame"},
+ FunctionInfo{24, nullptr, "AddIe"},
+ FunctionInfo{24, nullptr, "CreateRxEntry"},
+ FunctionInfo{25, nullptr, "DeleteIe"},
+ FunctionInfo{25, nullptr, "DeleteRxEntry"},
+ FunctionInfo{26, nullptr, "PutFrameRaw"},
+ FunctionInfo{26, nullptr, "AddEthertypeToRxEntry"},
+ FunctionInfo{27, nullptr, "CancelGetFrame"},
+ FunctionInfo{27, nullptr, "DeleteEthertypeFromRxEntry"},
+ FunctionInfo{28, nullptr, "CreateRxEntry"},
+ FunctionInfo{28, nullptr, "AddMatchingDataToRxEntry"},
+ FunctionInfo{29, nullptr, "DeleteRxEntry"},
+ FunctionInfo{29, nullptr, "RemoveMatchingDataFromRxEntry"},
+ FunctionInfo{30, nullptr, "AddEthertypeToRxEntry"},
+ FunctionInfo{30, nullptr, "GetScanResult_2"},
+ FunctionInfo{31, nullptr, "DeleteEthertypeFromRxEntry"},
+ FunctionInfo{31, nullptr, "PutActionFrameOneShot"},
+ FunctionInfo{32, nullptr, "AddMatchingDataToRxEntry"},
+ FunctionInfo{32, nullptr, "SetActionFrameWithBeacon"},
+ FunctionInfo{33, nullptr, "RemoveMatchingDataFromRxEntry"},
+ FunctionInfo{33, nullptr, "CancelActionFrameWithBeacon"},
+ FunctionInfo{34, nullptr, "GetScanResult_2"},
+ FunctionInfo{34, nullptr, "CreateRxEntryForActionFrame"},
+ FunctionInfo{35, nullptr, "PutActionFrameOneShot"},
+ FunctionInfo{35, nullptr, "DeleteRxEntryForActionFrame"},
+ FunctionInfo{36, nullptr, "SetActionFrameWithBeacon"},
+ FunctionInfo{36, nullptr, "AddSubtypeToRxEntryForActionFrame"},
+ FunctionInfo{37, nullptr, "CancelActionFrameWithBeacon"},
+ FunctionInfo{37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"},
+ FunctionInfo{38, nullptr, "CreateRxEntryForActionFrame"},
+ FunctionInfo{38, nullptr, "CancelGetActionFrame"},
+ FunctionInfo{39, nullptr, "DeleteRxEntryForActionFrame"},
+ FunctionInfo{39, nullptr, "GetRssi_2"},
+ FunctionInfo{40, nullptr, "AddSubtypeToRxEntryForActionFrame"},
+ FunctionInfo{40, nullptr, "SetMaxAssociationNumber"},
+ FunctionInfo{41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"},
+ FunctionInfo{41, nullptr, "Cmd41"},
+ FunctionInfo{42, nullptr, "CancelGetActionFrame"},
+ FunctionInfo{42, nullptr, "Cmd42"},
+ FunctionInfo{43, nullptr, "GetRssi_2"},
+ FunctionInfo{43, nullptr, "Cmd43"},
+ FunctionInfo{44, nullptr, "SetMaxAssociationNumber"},
+ FunctionInfo{45, nullptr, "OpenLcsMasterMode"},
+ FunctionInfo{46, nullptr, "CloseLcsMasterMode"},
+ FunctionInfo{47, nullptr, "OpenLcsClientMode"},
+ FunctionInfo{48, nullptr, "CloseLcsClientMode"},
+ FunctionInfo{49, nullptr, "GetChannelStats"},
+ FunctionInfo{50, nullptr, "Cmd50"},
+ FunctionInfo{51, nullptr, "Cmd51"},
+ FunctionInfo{52, nullptr, "Cmd52"}
+ );
};
class ILocalGetFrame final : public ServiceFramework<ILocalGetFrame> {
public:
explicit ILocalGetFrame(Core::System& system_)
: ServiceFramework{system_, "wlan:lg"}
- {
- static const FunctionInfo functions[] = {
- { 0, nullptr, "GetFrameRaw" },
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetFrameRaw" }
+ );
};
class ILocalGetActionFrame final : public ServiceFramework<ILocalGetActionFrame> {
public:
explicit ILocalGetActionFrame(Core::System& system_)
: ServiceFramework{system_, "wlan:lga"}
- {
- static const FunctionInfo functions[] = {
- { 0, nullptr, "GetActionFrame" },
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetActionFrame" }
+ );
};
class ISocketGetFrame final : public ServiceFramework<ISocketGetFrame> {
public:
explicit ISocketGetFrame(Core::System& system_)
: ServiceFramework{system_, "wlan:sg"}
- {
- static const FunctionInfo functions[] = {
- { 0, nullptr, "GetFrameRaw" },
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "GetFrameRaw" }
+ );
};
class ISocketManager final : public ServiceFramework<ISocketManager> {
public:
explicit ISocketManager(Core::System& system_)
: ServiceFramework{system_, "wlan:soc"}
- {
- static const FunctionInfo functions[] = {
- { 0, nullptr, "PutFrameRaw_2" },
- { 1, nullptr, "CancelGetFrame_2" },
- { 2, nullptr, "CreateRxEntry_2" },
- { 3, nullptr, "DeleteRxEntry_2" },
- { 4, nullptr, "AddEthertypeToRxEntry_2" },
- { 5, nullptr, "DeleteEthertypeFromRxEntry_2" },
- { 6, nullptr, "GetMacAddress_3" },
- { 7, nullptr, "SwitchTsfTimerFunction" },
- { 8, nullptr, "GetDeltaTimeBetweenSystemAndTsf" },
- { 9, nullptr, "RegisterSharedMemory" },
- { 10, nullptr, "UnregisterSharedMemory" },
- { 11, nullptr, "EnableSharedMemory" },
- { 12, nullptr, "SetMulticastFilter" },
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "PutFrameRaw_2"},
+ FunctionInfo{1, nullptr, "CancelGetFrame_2"},
+ FunctionInfo{2, nullptr, "CreateRxEntry_2"},
+ FunctionInfo{3, nullptr, "DeleteRxEntry_2"},
+ FunctionInfo{4, nullptr, "AddEthertypeToRxEntry_2"},
+ FunctionInfo{5, nullptr, "DeleteEthertypeFromRxEntry_2"},
+ FunctionInfo{6, nullptr, "GetMacAddress_3"},
+ FunctionInfo{7, nullptr, "SwitchTsfTimerFunction"},
+ FunctionInfo{8, nullptr, "GetDeltaTimeBetweenSystemAndTsf"},
+ FunctionInfo{9, nullptr, "RegisterSharedMemory"},
+ FunctionInfo{10, nullptr, "UnregisterSharedMemory"},
+ FunctionInfo{11, nullptr, "EnableSharedMemory"},
+ FunctionInfo{12, nullptr, "SetMulticastFilter"}
+ );
};
class IDetectManager final : public ServiceFramework<IDetectManager> {
public:
explicit IDetectManager(Core::System& system_)
: ServiceFramework{system_, "wlan:dtc"}
- {
- static const FunctionInfo functions[] = {
- { 0, nullptr, "Cmd0" },
- { 1, nullptr, "Cmd1" },
- { 2, nullptr, "Cmd2" },
- { 3, nullptr, "Cmd3" },
- { 4, nullptr, "Cmd4" },
- { 5, nullptr, "Cmd5" },
- { 6, nullptr, "Cmd6" },
- { 7, nullptr, "Cmd7" },
- { 8, nullptr, "Cmd8" },
- { 9, nullptr, "Cmd9" },
- { 10, nullptr, "Cmd10" },
- { 11, nullptr, "Cmd11" },
- { 12, nullptr, "Cmd12" },
- { 13, nullptr, "Cmd13" },
- { 14, nullptr, "Cmd14" },
- { 15, nullptr, "Cmd15" },
- { 16, nullptr, "Cmd16" },
- { 17, nullptr, "Cmd17" },
- { 18, nullptr, "Cmd18" },
- { 19, nullptr, "Cmd19" },
- { 20, nullptr, "Cmd20" },
- { 21, nullptr, "Cmd21" },
- { 22, nullptr, "Cmd22" },
- { 23, nullptr, "Cmd23" },
- { 24, nullptr, "Cmd24" },
- { 25, nullptr, "Cmd25" },
- { 26, nullptr, "Cmd26" },
- { 27, nullptr, "Cmd27" },
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "Cmd0"},
+ FunctionInfo{1, nullptr, "Cmd1"},
+ FunctionInfo{2, nullptr, "Cmd2"},
+ FunctionInfo{3, nullptr, "Cmd3"},
+ FunctionInfo{4, nullptr, "Cmd4"},
+ FunctionInfo{5, nullptr, "Cmd5"},
+ FunctionInfo{6, nullptr, "Cmd6"},
+ FunctionInfo{7, nullptr, "Cmd7"},
+ FunctionInfo{8, nullptr, "Cmd8"},
+ FunctionInfo{9, nullptr, "Cmd9"},
+ FunctionInfo{10, nullptr, "Cmd10"},
+ FunctionInfo{11, nullptr, "Cmd11"},
+ FunctionInfo{12, nullptr, "Cmd12"},
+ FunctionInfo{13, nullptr, "Cmd13"},
+ FunctionInfo{14, nullptr, "Cmd14"},
+ FunctionInfo{15, nullptr, "Cmd15"},
+ FunctionInfo{16, nullptr, "Cmd16"},
+ FunctionInfo{17, nullptr, "Cmd17"},
+ FunctionInfo{18, nullptr, "Cmd18"},
+ FunctionInfo{19, nullptr, "Cmd19"},
+ FunctionInfo{20, nullptr, "Cmd20"},
+ FunctionInfo{21, nullptr, "Cmd21"},
+ FunctionInfo{22, nullptr, "Cmd22"},
+ FunctionInfo{23, nullptr, "Cmd23"},
+ FunctionInfo{24, nullptr, "Cmd24"},
+ FunctionInfo{25, nullptr, "Cmd25"},
+ FunctionInfo{26, nullptr, "Cmd26"},
+ FunctionInfo{27, nullptr, "Cmd27"}
+ );
};
class IPrivateServiceCreator final : public ServiceFramework<IPrivateServiceCreator> {
public:
explicit IPrivateServiceCreator(Core::System& system_)
: ServiceFramework{system_, "wlan:p"}
- {
- static const FunctionInfo functions[] = {
- { 0, nullptr, "CreateWirelessCommunicationService" },
- { 1, nullptr, "CreatePrivateWirelessCommunicationService" },
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateWirelessCommunicationService"},
+ FunctionInfo{1, nullptr, "CreatePrivateWirelessCommunicationService"}
+ );
};
class ISfDriverServiceCreator final : public ServiceFramework<ISfDriverServiceCreator> {
public:
explicit ISfDriverServiceCreator(Core::System& system_)
: ServiceFramework{system_, "wlan:nd"}
- {
- static const FunctionInfo functions[] = {
- { 0, nullptr, "CreateDriverService" },
- };
- RegisterHandlers(functions);
+ {}
+
+ std::optional<FunctionInfoBase> FindRequest(u32 key) override {
+ return HandlerTableGenerateWithFind(key, functions);
}
+ static constexpr auto functions = CreateStaticMap(
+ FunctionInfo{0, nullptr, "CreateDriverService" }
+ );
};
void LoopProcess(Core::System& system) {