From e255c20db4111485d228c10478bda63aabcfdde5 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Thu, 15 Oct 2026 08:45:15 +0200 Subject: [PATCH] Revert "[hle] constexpr handler dispatch maps, introduce version gating (#4480)" (#4532) This reverts commit 218c6705d950635bc18f8458d738a1996fb592b6. - [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. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4532 Reviewed-by: lizzie Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- docs/DesignOverview.md | 2 +- docs/{SubsystemHLE.md => HosKernel.md} | 53 +- docs/README.md | 2 +- src/core/CMakeLists.txt | 70 +- src/core/hle/service/acc/acc.cpp | 2027 ++++++++--------- src/core/hle/service/acc/acc.h | 64 + src/core/hle/service/acc/async_context.cpp | 11 + src/core/hle/service/acc/async_context.h | 10 - src/core/hle/service/acc/errors.h | 3 + src/core/hle/service/am/am.cpp | 1338 +---------- src/core/hle/service/am/am.h | 3 + src/core/hle/service/am/applet_manager.h | 2 +- .../hle/service/am/frontend/applet_cabinet.h | 3 + .../service/am/frontend/applet_controller.h | 2 +- .../hle/service/am/frontend/applet_error.h | 3 + .../hle/service/am/frontend/applet_general.h | 3 + .../hle/service/am/frontend/applet_mii_edit.h | 3 + .../am/frontend/applet_mii_edit_types.h | 3 + .../service/am/frontend/applet_net_connect.h | 2 +- .../am/frontend/applet_profile_select.cpp | 3 + .../am/frontend/applet_profile_select.h | 3 + .../frontend/applet_software_keyboard_types.h | 3 + .../service/am/frontend/applet_web_browser.h | 2 +- src/core/hle/service/am/frontend/applets.h | 2 +- src/core/hle/service/am/process_holder.cpp | 3 + src/core/hle/service/am/process_holder.h | 3 + .../all_system_applet_proxies_service.cpp | 135 ++ .../all_system_applet_proxies_service.h | 56 + .../am/service/applet_common_functions.cpp | 98 + .../am/service/applet_common_functions.h | 33 + .../am/service/application_accessor.cpp | 64 +- .../service/am/service/application_accessor.h | 1 - .../am/service/application_creator.cpp | 20 +- .../service/am/service/application_creator.h | 1 - .../am/service/application_functions.cpp | 153 +- .../am/service/application_functions.h | 1 - .../service/am/service/application_proxy.cpp | 109 + .../service/am/service/application_proxy.h | 52 + .../am/service/application_proxy_service.cpp | 47 + .../am/service/application_proxy_service.h | 36 + .../service/am/service/audio_controller.cpp | 24 +- .../hle/service/am/service/audio_controller.h | 1 - .../am/service/common_state_getter.cpp | 209 +- .../service/am/service/common_state_getter.h | 1 - .../am/service/cradle_firmware_updater.cpp | 25 +- .../am/service/cradle_firmware_updater.h | 1 - .../service/am/service/debug_functions.cpp | 46 + .../hle/service/am/service/debug_functions.h | 19 + .../service/am/service/display_controller.cpp | 68 +- .../service/am/service/display_controller.h | 1 - .../am/service/global_state_controller.cpp | 38 +- .../am/service/global_state_controller.h | 4 +- .../am/service/home_menu_functions.cpp | 42 +- .../service/am/service/home_menu_functions.h | 1 - .../am/service/library_applet_accessor.cpp | 64 +- .../am/service/library_applet_accessor.h | 22 +- .../am/service/library_applet_creator.cpp | 287 +++ .../am/service/library_applet_creator.h | 44 + .../am/service/library_applet_proxy.cpp | 137 ++ .../service/am/service/library_applet_proxy.h | 59 + .../service/library_applet_self_accessor.cpp | 332 +++ .../am/service/library_applet_self_accessor.h | 87 + .../hle/service/am/service/lock_accessor.cpp | 78 + .../hle/service/am/service/lock_accessor.h | 35 + .../am/service/overlay_applet_proxy.cpp | 120 + .../service/am/service/overlay_applet_proxy.h | 55 + .../service/am/service/overlay_functions.cpp | 52 +- .../service/am/service/overlay_functions.h | 35 +- .../am/service/process_winding_controller.cpp | 28 +- .../am/service/process_winding_controller.h | 1 - .../service/am/service/self_controller.cpp | 113 +- .../hle/service/am/service/self_controller.h | 1 - src/core/hle/service/am/service/storage.cpp | 78 +- src/core/hle/service/am/service/storage.h | 1 - .../service/am/service/storage_accessor.cpp | 71 + .../hle/service/am/service/storage_accessor.h | 41 + .../am/service/system_applet_proxy.cpp | 136 ++ .../service/am/service/system_applet_proxy.h | 58 + .../service/am/service/window_controller.cpp | 28 +- .../service/am/service/window_controller.h | 1 - .../hle/service/aoc/addon_content_manager.cpp | 57 +- .../hle/service/aoc/addon_content_manager.h | 2 +- .../service/aoc/purchase_event_manager.cpp | 27 +- .../hle/service/aoc/purchase_event_manager.h | 2 - src/core/hle/service/apm/apm.h | 3 + src/core/hle/service/apm/apm_controller.h | 3 + src/core/hle/service/apm/apm_interface.cpp | 38 +- src/core/hle/service/apm/apm_interface.h | 21 - src/core/hle/service/audio/audio.cpp | 208 +- src/core/hle/service/audio/audio.h | 3 + .../hle/service/audio/audio_controller.cpp | 139 +- src/core/hle/service/audio/audio_controller.h | 2 +- src/core/hle/service/audio/audio_device.cpp | 52 +- src/core/hle/service/audio/audio_device.h | 1 - src/core/hle/service/audio/audio_in.cpp | 50 +- src/core/hle/service/audio/audio_in.h | 1 - .../hle/service/audio/audio_in_manager.cpp | 30 +- src/core/hle/service/audio/audio_in_manager.h | 1 - src/core/hle/service/audio/audio_out.cpp | 40 +- src/core/hle/service/audio/audio_out.h | 2 - .../hle/service/audio/audio_out_manager.cpp | 20 +- .../hle/service/audio/audio_out_manager.h | 1 - src/core/hle/service/audio/audio_renderer.cpp | 51 +- src/core/hle/service/audio/audio_renderer.h | 1 - .../service/audio/audio_renderer_manager.cpp | 22 +- .../service/audio/audio_renderer_manager.h | 1 - .../audio/final_output_recorder_manager.cpp | 39 +- .../audio/final_output_recorder_manager.h | 7 - ...nal_output_recorder_manager_for_applet.cpp | 8 + ...final_output_recorder_manager_for_applet.h | 8 - .../service/audio/hardware_opus_decoder.cpp | 32 +- .../hle/service/audio/hardware_opus_decoder.h | 1 - .../audio/hardware_opus_decoder_manager.cpp | 31 +- .../audio/hardware_opus_decoder_manager.h | 1 - src/core/hle/service/bcat/bcat.h | 3 + src/core/hle/service/bcat/bcat_result.h | 3 + src/core/hle/service/bcat/bcat_service.cpp | 75 +- src/core/hle/service/bcat/bcat_service.h | 1 - .../bcat/delivery_cache_directory_service.cpp | 18 +- .../bcat/delivery_cache_directory_service.h | 1 - .../bcat/delivery_cache_file_service.cpp | 20 +- .../bcat/delivery_cache_file_service.h | 1 - .../bcat/delivery_cache_progress_service.cpp | 16 +- .../bcat/delivery_cache_progress_service.h | 1 - .../bcat/delivery_cache_storage_service.cpp | 18 +- .../bcat/delivery_cache_storage_service.h | 1 - src/core/hle/service/bcat/news/builtin_news.h | 2 +- src/core/hle/service/bcat/news/msgpack.cpp | 2 +- src/core/hle/service/bcat/news/msgpack.h | 2 +- .../bcat/news/newly_arrived_event_holder.cpp | 19 +- .../bcat/news/newly_arrived_event_holder.h | 1 - .../service/bcat/news/news_data_service.cpp | 19 +- .../hle/service/bcat/news/news_data_service.h | 1 - .../bcat/news/news_database_service.cpp | 23 +- .../service/bcat/news/news_database_service.h | 2 - .../hle/service/bcat/news/news_service.cpp | 50 +- src/core/hle/service/bcat/news/news_service.h | 9 +- .../hle/service/bcat/news/news_storage.cpp | 2 +- .../bcat/news/overwrite_event_holder.cpp | 18 +- .../bcat/news/overwrite_event_holder.h | 1 - .../hle/service/bcat/news/service_creator.cpp | 22 +- .../hle/service/bcat/news/service_creator.h | 1 - src/core/hle/service/bcat/service_creator.cpp | 26 +- src/core/hle/service/bcat/service_creator.h | 1 - src/core/hle/service/bpc/bpc.cpp | 138 +- src/core/hle/service/bpc/bpc.h | 3 + src/core/hle/service/btdrv/btdrv.cpp | 310 +-- src/core/hle/service/btdrv/btdrv.h | 3 + src/core/hle/service/btm/btm.cpp | 495 +--- src/core/hle/service/btm/btm.h | 3 + src/core/hle/service/btm/btm_debug.cpp | 40 + src/core/hle/service/btm/btm_debug.h | 24 + src/core/hle/service/btm/btm_system.cpp | 34 + src/core/hle/service/btm/btm_system.h | 28 + src/core/hle/service/btm/btm_system_core.cpp | 135 ++ src/core/hle/service/btm/btm_system_core.h | 62 + src/core/hle/service/btm/btm_user.cpp | 33 + src/core/hle/service/btm/btm_user.h | 28 + src/core/hle/service/btm/btm_user_core.cpp | 106 + src/core/hle/service/btm/btm_user_core.h | 50 + src/core/hle/service/caps/caps.cpp | 218 +- src/core/hle/service/caps/caps.h | 3 + src/core/hle/service/caps/caps_a.cpp | 211 ++ src/core/hle/service/caps/caps_a.h | 63 + src/core/hle/service/caps/caps_c.cpp | 50 +- src/core/hle/service/caps/caps_c.h | 9 +- src/core/hle/service/caps/caps_result.h | 3 + src/core/hle/service/caps/caps_sc.cpp | 26 + src/core/hle/service/caps/caps_sc.h | 26 - src/core/hle/service/caps/caps_ss.cpp | 26 +- src/core/hle/service/caps/caps_ss.h | 1 - src/core/hle/service/caps/caps_su.cpp | 22 +- src/core/hle/service/caps/caps_su.h | 2 +- src/core/hle/service/caps/caps_u.cpp | 40 +- src/core/hle/service/caps/caps_u.h | 1 - src/core/hle/service/cmif_types.h | 3 + src/core/hle/service/erpt/erpt.cpp | 64 +- src/core/hle/service/erpt/erpt.h | 3 + src/core/hle/service/es/es.cpp | 342 +-- src/core/hle/service/es/es.h | 3 + src/core/hle/service/eupld/eupld.cpp | 44 +- src/core/hle/service/eupld/eupld.h | 3 + src/core/hle/service/fatal/fatal.cpp | 31 +- src/core/hle/service/fatal/fatal.h | 3 + src/core/hle/service/fatal/fatal_p.cpp | 22 + src/core/hle/service/fatal/fatal_p.h | 19 + src/core/hle/service/fatal/fatal_u.cpp | 23 + src/core/hle/service/fatal/fatal_u.h | 19 + src/core/hle/service/fgm/fgm.cpp | 52 +- src/core/hle/service/fgm/fgm.h | 3 + .../service/filesystem/fsp/fs_i_directory.cpp | 13 +- .../service/filesystem/fsp/fs_i_directory.h | 2 - .../hle/service/filesystem/fsp/fs_i_file.cpp | 12 + .../hle/service/filesystem/fsp/fs_i_file.h | 13 - .../filesystem/fsp/fs_i_filesystem.cpp | 43 +- .../service/filesystem/fsp/fs_i_filesystem.h | 1 - .../fsp/fs_i_multi_commit_manager.cpp | 5 + .../fsp/fs_i_multi_commit_manager.h | 7 - .../fsp/fs_i_save_data_info_reader.cpp | 5 + .../fsp/fs_i_save_data_info_reader.h | 6 - .../service/filesystem/fsp/fs_i_storage.cpp | 9 + .../hle/service/filesystem/fsp/fs_i_storage.h | 15 +- .../hle/service/filesystem/fsp/fsp_ldr.cpp | 9 + src/core/hle/service/filesystem/fsp/fsp_ldr.h | 9 - .../hle/service/filesystem/fsp/fsp_pr.cpp | 10 + src/core/hle/service/filesystem/fsp/fsp_pr.h | 10 - .../hle/service/filesystem/fsp/fsp_srv.cpp | 271 +-- src/core/hle/service/filesystem/fsp/fsp_srv.h | 1 - .../hle/service/filesystem/fsp/fsp_types.h | 3 + .../fsp/save_data_transfer_prohibiter.cpp | 3 + .../fsp/save_data_transfer_prohibiter.h | 3 + .../service/filesystem/romfs_controller.cpp | 3 + .../hle/service/filesystem/romfs_controller.h | 3 + .../filesystem/save_data_controller.cpp | 2 +- .../service/filesystem/save_data_controller.h | 3 + src/core/hle/service/friend/friend.cpp | 378 ++- src/core/hle/service/friend/friend.h | 3 + .../hle/service/friend/friend_interface.cpp | 23 + .../hle/service/friend/friend_interface.h | 19 + src/core/hle/service/glue/arp.cpp | 42 +- src/core/hle/service/glue/arp.h | 23 - src/core/hle/service/glue/bgtc.cpp | 43 +- src/core/hle/service/glue/bgtc.h | 39 - src/core/hle/service/glue/ectx.cpp | 38 +- src/core/hle/service/glue/ectx.h | 26 - src/core/hle/service/glue/errors.h | 3 + src/core/hle/service/glue/glue.h | 3 + src/core/hle/service/glue/glue_manager.cpp | 3 + src/core/hle/service/glue/glue_manager.h | 3 + src/core/hle/service/glue/notif.cpp | 96 +- src/core/hle/service/glue/notif.h | 2 - src/core/hle/service/glue/time/alarm_worker.h | 3 + .../glue/time/file_timestamp_worker.cpp | 3 + .../service/glue/time/file_timestamp_worker.h | 3 + src/core/hle/service/glue/time/manager.cpp | 2 +- src/core/hle/service/glue/time/manager.h | 3 + .../glue/time/pm_state_change_handler.cpp | 3 + .../glue/time/pm_state_change_handler.h | 3 + .../time/standard_steady_clock_resource.cpp | 3 + .../time/standard_steady_clock_resource.h | 3 + src/core/hle/service/glue/time/static.cpp | 56 +- src/core/hle/service/glue/time/static.h | 3 +- src/core/hle/service/glue/time/time_zone.cpp | 40 +- src/core/hle/service/glue/time/time_zone.h | 1 - .../service/glue/time/time_zone_binary.cpp | 3 + .../hle/service/glue/time/time_zone_binary.h | 3 + src/core/hle/service/glue/time/worker.h | 3 + src/core/hle/service/gpio/gpio.cpp | 16 +- src/core/hle/service/grc/grc.cpp | 39 +- src/core/hle/service/grc/grc.h | 3 + .../hid/active_vibration_device_list.cpp | 14 +- .../hid/active_vibration_device_list.h | 2 +- src/core/hle/service/hid/applet_resource.cpp | 11 +- src/core/hle/service/hid/applet_resource.h | 1 - src/core/hle/service/hid/hid.cpp | 365 +-- src/core/hle/service/hid/hid.h | 3 + src/core/hle/service/hid/hid_debug_server.cpp | 294 +++ src/core/hle/service/hid/hid_debug_server.h | 26 + src/core/hle/service/hid/hid_server.cpp | 396 ++-- src/core/hle/service/hid/hid_server.h | 2 - .../hle/service/hid/hid_system_server.cpp | 246 ++ src/core/hle/service/hid/hid_system_server.h | 246 -- src/core/hle/service/hid/hidbus.cpp | 42 +- src/core/hle/service/hid/hidbus.h | 2 - src/core/hle/service/hid/irs.cpp | 58 +- src/core/hle/service/hid/irs.h | 12 - src/core/hle/service/hid/xcd.cpp | 27 + src/core/hle/service/hid/xcd.h | 27 - src/core/hle/service/i2c/i2c.cpp | 54 +- src/core/hle/service/jit/jit.cpp | 37 +- src/core/hle/service/jit/jit.h | 3 + src/core/hle/service/jit/jit_context.h | 3 + src/core/hle/service/lbl/lbl.cpp | 71 +- src/core/hle/service/lbl/lbl.h | 3 + src/core/hle/service/ldn/lan_discovery.cpp | 3 +- src/core/hle/service/ldn/lan_discovery.h | 3 + src/core/hle/service/ldn/ldn.cpp | 138 +- src/core/hle/service/ldn/ldn.h | 3 + src/core/hle/service/ldn/ldn_results.h | 3 + src/core/hle/service/ldn/monitor_service.cpp | 28 +- src/core/hle/service/ldn/monitor_service.h | 1 - .../hle/service/ldn/sf_monitor_service.cpp | 18 +- src/core/hle/service/ldn/sf_monitor_service.h | 1 - src/core/hle/service/ldn/sf_service.cpp | 40 + src/core/hle/service/ldn/sf_service.h | 24 + .../hle/service/ldn/sf_service_monitor.cpp | 38 +- src/core/hle/service/ldn/sf_service_monitor.h | 4 +- .../system_local_communication_service.cpp | 72 +- .../ldn/system_local_communication_service.h | 1 - .../ldn/user_local_communication_service.cpp | 73 +- .../ldn/user_local_communication_service.h | 5 +- src/core/hle/service/ldr/ldr.cpp | 53 +- src/core/hle/service/ldr/ldr.h | 3 + src/core/hle/service/lm/lm.cpp | 55 +- src/core/hle/service/lm/lm.h | 3 + src/core/hle/service/mig/mig.cpp | 84 +- src/core/hle/service/mig/mig.h | 3 + src/core/hle/service/mii/mii.cpp | 134 +- src/core/hle/service/mii/mii.h | 1 - src/core/hle/service/mii/mii_database.cpp | 2 +- src/core/hle/service/mii/mii_database.h | 3 + .../hle/service/mii/mii_database_manager.h | 3 + src/core/hle/service/mii/mii_manager.h | 3 + src/core/hle/service/mii/mii_result.h | 3 + src/core/hle/service/mii/mii_types.h | 3 + src/core/hle/service/mii/types/char_info.cpp | 3 + src/core/hle/service/mii/types/char_info.h | 3 + src/core/hle/service/mii/types/core_data.cpp | 3 + src/core/hle/service/mii/types/core_data.h | 3 + src/core/hle/service/mii/types/raw_data.h | 3 + src/core/hle/service/mii/types/store_data.cpp | 3 + src/core/hle/service/mii/types/store_data.h | 3 + .../hle/service/mii/types/ver3_store_data.cpp | 3 + .../hle/service/mii/types/ver3_store_data.h | 3 + src/core/hle/service/mm/mm_u.cpp | 27 +- src/core/hle/service/mm/mm_u.h | 3 + src/core/hle/service/mnpp/mnpp.cpp | 62 +- src/core/hle/service/ncm/ncm.cpp | 220 +- src/core/hle/service/ncm/ncm.h | 3 + src/core/hle/service/nfc/common/device.h | 3 + .../hle/service/nfc/common/device_manager.h | 3 + src/core/hle/service/nfc/mifare_result.h | 3 + src/core/hle/service/nfc/mifare_types.h | 3 + src/core/hle/service/nfc/nfc.cpp | 230 +- src/core/hle/service/nfc/nfc.h | 3 + src/core/hle/service/nfc/nfc_interface.h | 3 + src/core/hle/service/nfc/nfc_result.h | 3 + src/core/hle/service/nfc/nfc_types.h | 2 +- src/core/hle/service/nfp/nfp.cpp | 266 +-- src/core/hle/service/nfp/nfp.h | 3 + src/core/hle/service/nfp/nfp_interface.h | 3 + src/core/hle/service/nfp/nfp_result.h | 3 + src/core/hle/service/nfp/nfp_types.h | 2 +- src/core/hle/service/ngc/ngc.cpp | 160 +- src/core/hle/service/ngc/ngc.h | 3 + src/core/hle/service/nifm/nifm.cpp | 227 +- src/core/hle/service/nifm/nifm.h | 1 - src/core/hle/service/nim/nim.cpp | 681 +++--- src/core/hle/service/nim/nim.h | 3 + src/core/hle/service/npns/npns.cpp | 196 +- src/core/hle/service/npns/npns.h | 3 + .../service/ns/account_proxy_interface.cpp | 7 + .../hle/service/ns/account_proxy_interface.h | 7 - .../ns/application_manager_interface.cpp | 904 ++++---- .../ns/application_manager_interface.h | 1 - .../ns/application_version_interface.cpp | 19 + .../ns/application_version_interface.h | 19 - src/core/hle/service/ns/async_result.cpp | 18 +- src/core/hle/service/ns/async_result.h | 1 - .../ns/content_management_interface.cpp | 16 + .../service/ns/content_management_interface.h | 16 - src/core/hle/service/ns/develop_interface.cpp | 25 + src/core/hle/service/ns/develop_interface.h | 25 - .../hle/service/ns/document_interface.cpp | 9 + src/core/hle/service/ns/document_interface.h | 9 - .../service/ns/download_task_interface.cpp | 15 + .../hle/service/ns/download_task_interface.h | 15 - .../service/ns/dynamic_rights_interface.cpp | 70 +- .../hle/service/ns/dynamic_rights_interface.h | 2 - .../hle/service/ns/ecommerce_interface.cpp | 13 + src/core/hle/service/ns/ecommerce_interface.h | 13 - .../service/ns/factory_reset_interface.cpp | 26 +- .../hle/service/ns/factory_reset_interface.h | 1 - src/core/hle/service/ns/ns.cpp | 63 +- src/core/hle/service/ns/ns.h | 3 + src/core/hle/service/ns/ns_results.h | 3 + .../service/ns/platform_service_manager.cpp | 44 +- .../hle/service/ns/platform_service_manager.h | 9 +- src/core/hle/service/ns/query_service.cpp | 64 +- src/core/hle/service/ns/query_service.h | 1 - ...nly_application_control_data_interface.cpp | 48 +- ..._only_application_control_data_interface.h | 2 - ...read_only_application_record_interface.cpp | 19 +- .../read_only_application_record_interface.h | 2 - .../service/ns/service_getter_interface.cpp | 34 +- .../hle/service/ns/service_getter_interface.h | 2 - .../hle/service/ns/system_update_control.cpp | 29 + .../hle/service/ns/system_update_control.h | 29 - .../service/ns/system_update_interface.cpp | 46 +- .../hle/service/ns/system_update_interface.h | 2 +- .../nvdrv/devices/ioctl_serialization.h | 2 +- src/core/hle/service/nvdrv/devices/nvdevice.h | 3 + .../hle/service/nvdrv/devices/nvhost_gpu.cpp | 2 +- .../hle/service/nvdrv/devices/nvhost_nvdec.h | 3 + .../hle/service/nvdrv/devices/nvhost_nvjpg.h | 3 + .../hle/service/nvdrv/devices/nvhost_vic.h | 3 + src/core/hle/service/nvdrv/nvdrv.cpp | 74 +- .../hle/service/nvdrv/nvdrv_interface.cpp | 18 + src/core/hle/service/nvdrv/nvdrv_interface.h | 21 +- src/core/hle/service/nvdrv/nvmemp.cpp | 5 + src/core/hle/service/nvdrv/nvmemp.h | 8 - src/core/hle/service/nvnflinger/binder.h | 3 + src/core/hle/service/nvnflinger/buffer_item.h | 3 + .../service/nvnflinger/buffer_item_consumer.h | 3 + .../nvnflinger/buffer_queue_consumer.h | 3 + .../service/nvnflinger/buffer_queue_defs.h | 3 + .../nvnflinger/buffer_transform_flags.h | 3 + .../hle/service/nvnflinger/consumer_base.h | 3 + .../service/nvnflinger/consumer_listener.h | 3 + .../nvnflinger/graphic_buffer_producer.cpp | 3 + .../nvnflinger/graphic_buffer_producer.h | 3 + .../service/nvnflinger/hos_binder_driver.cpp | 17 +- .../service/nvnflinger/hos_binder_driver.h | 1 - .../hle/service/nvnflinger/nvnflinger.cpp | 3 + src/core/hle/service/nvnflinger/nvnflinger.h | 3 + src/core/hle/service/nvnflinger/parcel.h | 2 +- .../hle/service/nvnflinger/pixel_format.h | 3 + .../service/nvnflinger/producer_listener.h | 3 + src/core/hle/service/nvnflinger/status.h | 3 + .../service/nvnflinger/ui/graphic_buffer.cpp | 3 + .../service/nvnflinger/ui/graphic_buffer.h | 3 + src/core/hle/service/nvnflinger/window.h | 3 + .../hle/service/olsc/daemon_controller.cpp | 36 +- src/core/hle/service/olsc/daemon_controller.h | 2 - .../hle/service/olsc/native_handle_holder.cpp | 14 +- .../hle/service/olsc/native_handle_holder.h | 1 - src/core/hle/service/olsc/olsc.cpp | 173 +- src/core/hle/service/olsc/olsc.h | 3 + .../olsc/olsc_service_for_application.cpp | 56 +- .../olsc/olsc_service_for_application.h | 2 - .../olsc/olsc_service_for_system_service.cpp | 144 ++ .../olsc/olsc_service_for_system_service.h | 53 + .../olsc/remote_storage_controller.cpp | 72 +- .../service/olsc/remote_storage_controller.h | 2 - .../olsc/transfer_task_list_controller.cpp | 74 +- .../olsc/transfer_task_list_controller.h | 2 - src/core/hle/service/omm/omm.cpp | 3 + src/core/hle/service/omm/omm.h | 3 + .../service/omm/operation_mode_manager.cpp | 35 + .../hle/service/omm/operation_mode_manager.h | 35 - .../hle/service/omm/policy_manager_system.cpp | 12 + .../hle/service/omm/policy_manager_system.h | 12 - .../hle/service/omm/power_state_interface.cpp | 18 + .../hle/service/omm/power_state_interface.h | 18 - src/core/hle/service/os/multi_wait.cpp | 3 + src/core/hle/service/os/multi_wait.h | 3 + src/core/hle/service/os/multi_wait_holder.cpp | 3 + src/core/hle/service/os/multi_wait_holder.h | 3 + src/core/hle/service/os/multi_wait_utils.h | 3 + src/core/hle/service/os/mutex.h | 3 + src/core/hle/service/pcie/pcie.cpp | 90 +- src/core/hle/service/pcie/pcie.h | 3 + .../service/pctl/parental_control_service.cpp | 498 ++++ .../service/pctl/parental_control_service.h | 99 + .../pctl/parental_control_service_factory.cpp | 44 + .../pctl/parental_control_service_factory.h | 34 + src/core/hle/service/pctl/pctl.cpp | 633 +---- src/core/hle/service/pctl/pctl.h | 3 + src/core/hle/service/pctl/pctl_results.h | 18 + src/core/hle/service/pctl/pctl_types.h | 73 + src/core/hle/service/pcv/pcv.cpp | 172 +- src/core/hle/service/pcv/pcv.h | 3 + src/core/hle/service/pm/pm.cpp | 100 +- src/core/hle/service/pm/pm.h | 3 + src/core/hle/service/prepo/prepo.cpp | 91 +- src/core/hle/service/prepo/prepo.h | 3 + src/core/hle/service/psc/ovln/ovln_types.h | 2 +- src/core/hle/service/psc/ovln/receiver.cpp | 118 + src/core/hle/service/psc/ovln/receiver.h | 46 + .../hle/service/psc/ovln/receiver_service.cpp | 123 +- .../hle/service/psc/ovln/receiver_service.h | 2 - src/core/hle/service/psc/ovln/sender.cpp | 35 + src/core/hle/service/psc/ovln/sender.h | 24 + .../hle/service/psc/ovln/sender_service.cpp | 40 +- .../hle/service/psc/ovln/sender_service.h | 5 +- src/core/hle/service/psc/pm_control.cpp | 31 + src/core/hle/service/psc/pm_control.h | 19 + src/core/hle/service/psc/pm_module.cpp | 27 + src/core/hle/service/psc/pm_module.h | 19 + src/core/hle/service/psc/pm_service.cpp | 31 + src/core/hle/service/psc/pm_service.h | 25 + src/core/hle/service/psc/psc.cpp | 181 +- src/core/hle/service/psc/psc.h | 3 + src/core/hle/service/psc/time/alarms.cpp | 24 +- src/core/hle/service/psc/time/alarms.h | 21 +- .../ephemeral_network_system_clock_core.h | 3 + .../standard_local_system_clock_core.cpp | 3 + .../clocks/standard_local_system_clock_core.h | 3 + .../standard_network_system_clock_core.cpp | 3 + .../standard_network_system_clock_core.h | 3 + .../clocks/standard_steady_clock_core.cpp | 3 + .../time/clocks/standard_steady_clock_core.h | 3 + .../clocks/standard_user_system_clock_core.h | 3 + .../psc/time/clocks/steady_clock_core.h | 3 + .../psc/time/clocks/system_clock_core.cpp | 3 + .../psc/time/clocks/system_clock_core.h | 3 + .../clocks/tick_based_steady_clock_core.cpp | 3 + .../clocks/tick_based_steady_clock_core.h | 3 + src/core/hle/service/psc/time/common.cpp | 3 + src/core/hle/service/psc/time/manager.h | 28 +- .../psc/time/power_state_request_manager.h | 3 + .../service/psc/time/power_state_service.cpp | 19 +- .../service/psc/time/power_state_service.h | 1 - .../hle/service/psc/time/service_manager.cpp | 48 +- .../hle/service/psc/time/service_manager.h | 2 - .../hle/service/psc/time/shared_memory.cpp | 3 + src/core/hle/service/psc/time/static.cpp | 50 +- src/core/hle/service/psc/time/static.h | 2 - .../hle/service/psc/time/steady_clock.cpp | 28 +- src/core/hle/service/psc/time/steady_clock.h | 2 - .../hle/service/psc/time/system_clock.cpp | 24 +- src/core/hle/service/psc/time/system_clock.h | 1 - src/core/hle/service/psc/time/time_zone.cpp | 3 + src/core/hle/service/psc/time/time_zone.h | 3 + .../service/psc/time/time_zone_service.cpp | 42 +- .../hle/service/psc/time/time_zone_service.h | 1 - src/core/hle/service/ptm/psm.cpp | 53 +- src/core/hle/service/ptm/psm.h | 25 - src/core/hle/service/ptm/ptm.cpp | 32 +- src/core/hle/service/ptm/ptm.h | 3 + src/core/hle/service/ptm/ts.cpp | 29 +- src/core/hle/service/ptm/ts.h | 11 - src/core/hle/service/ro/ro.cpp | 371 +-- src/core/hle/service/ro/ro.h | 3 + src/core/hle/service/ro/ro_nro_utils.cpp | 188 ++ src/core/hle/service/ro/ro_nro_utils.h | 29 + src/core/hle/service/ro/ro_results.h | 29 + src/core/hle/service/ro/ro_types.h | 142 ++ src/core/hle/service/server_manager.h | 3 + src/core/hle/service/service.cpp | 69 +- src/core/hle/service/service.h | 145 +- src/core/hle/service/services.h | 2 +- .../service/set/factory_settings_server.cpp | 49 + .../hle/service/set/factory_settings_server.h | 49 - .../set/firmware_debug_settings_server.cpp | 17 + .../set/firmware_debug_settings_server.h | 17 - src/core/hle/service/set/key_code_map.h | 3 + .../set/setting_formats/appln_settings.cpp | 3 + .../set/setting_formats/appln_settings.h | 3 + .../set/setting_formats/device_settings.cpp | 3 + .../set/setting_formats/private_settings.cpp | 3 + .../set/setting_formats/private_settings.h | 3 + .../set/setting_formats/system_settings.cpp | 2 +- src/core/hle/service/set/settings.h | 3 + src/core/hle/service/set/settings_server.cpp | 38 +- src/core/hle/service/set/settings_server.h | 36 +- .../service/set/system_settings_server.cpp | 465 ++-- .../hle/service/set/system_settings_server.h | 2 +- src/core/hle/service/sm/sm.cpp | 205 +- src/core/hle/service/sm/sm.h | 24 +- src/core/hle/service/sm/sm_controller.cpp | 128 ++ src/core/hle/service/sm/sm_controller.h | 30 + src/core/hle/service/sockets/bsd.cpp | 81 + src/core/hle/service/sockets/bsd.h | 82 +- src/core/hle/service/sockets/nsd.cpp | 32 + src/core/hle/service/sockets/nsd.h | 32 - src/core/hle/service/sockets/sfdnsres.cpp | 27 + src/core/hle/service/sockets/sfdnsres.h | 31 - src/core/hle/service/sockets/sockets.cpp | 62 +- .../hle/service/sockets/sockets_translate.h | 3 + src/core/hle/service/spl/spl.cpp | 171 +- src/core/hle/service/spl/spl.h | 141 -- src/core/hle/service/spl/spl_module.cpp | 15 +- src/core/hle/service/spl/spl_results.h | 3 + src/core/hle/service/spl/spl_types.h | 3 + src/core/hle/service/ssl/cert_store.cpp | 3 + src/core/hle/service/ssl/cert_store.h | 3 + src/core/hle/service/ssl/ssl.cpp | 397 ++-- src/core/hle/service/ssl/ssl.h | 3 + src/core/hle/service/ssl/ssl_types.h | 3 + src/core/hle/service/tma/tma.cpp | 12 +- src/core/hle/service/usb/usb.cpp | 290 +-- src/core/hle/service/usb/usb.h | 3 + .../vi/application_display_service.cpp | 56 +- .../service/vi/application_display_service.h | 2 +- .../service/vi/application_root_service.cpp | 13 +- .../hle/service/vi/application_root_service.h | 1 - src/core/hle/service/vi/display.h | 3 + src/core/hle/service/vi/display_list.h | 3 + src/core/hle/service/vi/layer.h | 3 + src/core/hle/service/vi/layer_list.h | 3 + .../service/vi/manager_display_service.cpp | 174 +- .../hle/service/vi/manager_display_service.h | 1 - .../hle/service/vi/manager_root_service.cpp | 21 +- .../hle/service/vi/manager_root_service.h | 1 - src/core/hle/service/vi/service_creator.cpp | 3 + src/core/hle/service/vi/service_creator.h | 3 + .../hle/service/vi/shared_buffer_manager.h | 4 - .../hle/service/vi/system_display_service.cpp | 110 +- .../hle/service/vi/system_display_service.h | 1 - .../hle/service/vi/system_root_service.cpp | 17 +- src/core/hle/service/vi/system_root_service.h | 1 - src/core/hle/service/vi/vi.cpp | 3 + src/core/hle/service/vi/vi.h | 3 + src/core/hle/service/vi/vi_results.h | 3 + src/core/hle/service/vi/vi_types.h | 3 + src/core/hle/service/wlan/wlan.cpp | 368 ++- tools/README.md | 2 +- 588 files changed, 14723 insertions(+), 12534 deletions(-) rename docs/{SubsystemHLE.md => HosKernel.md} (55%) create mode 100644 src/core/hle/service/am/service/all_system_applet_proxies_service.cpp create mode 100644 src/core/hle/service/am/service/all_system_applet_proxies_service.h create mode 100644 src/core/hle/service/am/service/applet_common_functions.cpp create mode 100644 src/core/hle/service/am/service/applet_common_functions.h create mode 100644 src/core/hle/service/am/service/application_proxy.cpp create mode 100644 src/core/hle/service/am/service/application_proxy.h create mode 100644 src/core/hle/service/am/service/application_proxy_service.cpp create mode 100644 src/core/hle/service/am/service/application_proxy_service.h create mode 100644 src/core/hle/service/am/service/debug_functions.cpp create mode 100644 src/core/hle/service/am/service/debug_functions.h create mode 100644 src/core/hle/service/am/service/library_applet_creator.cpp create mode 100644 src/core/hle/service/am/service/library_applet_creator.h create mode 100644 src/core/hle/service/am/service/library_applet_proxy.cpp create mode 100644 src/core/hle/service/am/service/library_applet_proxy.h create mode 100644 src/core/hle/service/am/service/library_applet_self_accessor.cpp create mode 100644 src/core/hle/service/am/service/library_applet_self_accessor.h create mode 100644 src/core/hle/service/am/service/lock_accessor.cpp create mode 100644 src/core/hle/service/am/service/lock_accessor.h create mode 100644 src/core/hle/service/am/service/overlay_applet_proxy.cpp create mode 100644 src/core/hle/service/am/service/overlay_applet_proxy.h create mode 100644 src/core/hle/service/am/service/storage_accessor.cpp create mode 100644 src/core/hle/service/am/service/storage_accessor.h create mode 100644 src/core/hle/service/am/service/system_applet_proxy.cpp create mode 100644 src/core/hle/service/am/service/system_applet_proxy.h create mode 100644 src/core/hle/service/btm/btm_debug.cpp create mode 100644 src/core/hle/service/btm/btm_debug.h create mode 100644 src/core/hle/service/btm/btm_system.cpp create mode 100644 src/core/hle/service/btm/btm_system.h create mode 100644 src/core/hle/service/btm/btm_system_core.cpp create mode 100644 src/core/hle/service/btm/btm_system_core.h create mode 100644 src/core/hle/service/btm/btm_user.cpp create mode 100644 src/core/hle/service/btm/btm_user.h create mode 100644 src/core/hle/service/btm/btm_user_core.cpp create mode 100644 src/core/hle/service/btm/btm_user_core.h create mode 100644 src/core/hle/service/caps/caps_a.cpp create mode 100644 src/core/hle/service/caps/caps_a.h create mode 100644 src/core/hle/service/fatal/fatal_p.cpp create mode 100644 src/core/hle/service/fatal/fatal_p.h create mode 100644 src/core/hle/service/fatal/fatal_u.cpp create mode 100644 src/core/hle/service/fatal/fatal_u.h create mode 100644 src/core/hle/service/friend/friend_interface.cpp create mode 100644 src/core/hle/service/friend/friend_interface.h create mode 100644 src/core/hle/service/ldn/sf_service.cpp create mode 100644 src/core/hle/service/ldn/sf_service.h create mode 100644 src/core/hle/service/olsc/olsc_service_for_system_service.cpp create mode 100644 src/core/hle/service/olsc/olsc_service_for_system_service.h create mode 100644 src/core/hle/service/pctl/parental_control_service.cpp create mode 100644 src/core/hle/service/pctl/parental_control_service.h create mode 100644 src/core/hle/service/pctl/parental_control_service_factory.cpp create mode 100644 src/core/hle/service/pctl/parental_control_service_factory.h create mode 100644 src/core/hle/service/pctl/pctl_results.h create mode 100644 src/core/hle/service/pctl/pctl_types.h create mode 100644 src/core/hle/service/psc/ovln/receiver.cpp create mode 100644 src/core/hle/service/psc/ovln/receiver.h create mode 100644 src/core/hle/service/psc/ovln/sender.cpp create mode 100644 src/core/hle/service/psc/ovln/sender.h create mode 100644 src/core/hle/service/psc/pm_control.cpp create mode 100644 src/core/hle/service/psc/pm_control.h create mode 100644 src/core/hle/service/psc/pm_module.cpp create mode 100644 src/core/hle/service/psc/pm_module.h create mode 100644 src/core/hle/service/psc/pm_service.cpp create mode 100644 src/core/hle/service/psc/pm_service.h create mode 100644 src/core/hle/service/ro/ro_nro_utils.cpp create mode 100644 src/core/hle/service/ro/ro_nro_utils.h create mode 100644 src/core/hle/service/ro/ro_results.h create mode 100644 src/core/hle/service/ro/ro_types.h create mode 100644 src/core/hle/service/sm/sm_controller.cpp create mode 100644 src/core/hle/service/sm/sm_controller.h diff --git a/docs/DesignOverview.md b/docs/DesignOverview.md index 959fbfdbb2..c6a328cb9c 100644 --- a/docs/DesignOverview.md +++ b/docs/DesignOverview.md @@ -1,6 +1,6 @@ # Design Overview -Modern game consoles require heavy power to emulate. This is why the emulator uses an approach known as HLE (High-Level-Emulation), in a nutshell: Instead of accurately emulating every subsystem that forms part of a component, emulate the resulting visible output of said interface instead. +Modern game consoles require heavy power to be emulated appropriately. This is why the emulator uses an approach known as HLE (High-Level-Emulation), in a nutshell: Instead of accurately emulating every subsystem that forms part of a component, emulate the resulting visible I/O interface instead. For example, take a disk write, instead of emulating a proper SD card we instead use the C++ standard library for I/O. Additionally we use the abstractions provided by the `fs` service to "lie" to programs about certain SD card properties. Notably this includes making up sizes for the fake SD card, giving "realistic" values or expected outputs for a given card, and so on. And instead of writing to an actual SD card, the emulator simply writes to a file. diff --git a/docs/SubsystemHLE.md b/docs/HosKernel.md similarity index 55% rename from docs/SubsystemHLE.md rename to docs/HosKernel.md index 7a59fef9fa..87df2072a5 100644 --- a/docs/SubsystemHLE.md +++ b/docs/HosKernel.md @@ -1,6 +1,4 @@ -# Subsystem: HLE - -## HOS Kernel +# HOS Kernel In brief, the HOS kernel is a microkernel, all services and programs run in userspace, the primary way to do communication between these is via `HIPC` (not covered here); otherwise most of the primitives reside in the forms of syscalls invoked via `svc #imm`. The kernel supports both 32-bit and 64-bit programs, and has the capacity to use 32, 36 and 39 bits of address space for spawned processes. Most of the networking stack is based off FreeBSD's network stack. @@ -31,52 +29,3 @@ Every process keeps it's own tracking of the following structures: The emulator willingly restricts itself to only use 4 threads (to emulate 4 cores), this is because most existing applications do not benefit greatly from the added core count, and in fact can be detrimental due to extra contention. This translates equitatively to about 4 `ArmInterface` slots for each process, these are then redirected to whatever is the last `pc` of the last thread running on the core is meant to be; proceed to run it, then when returning (due to halt or interruption), proceed to reschedule the thread. The scheduler as-is isn't 100% faithful to the original (for example the original is cooperative and not preemptive), and has great timing variance (especially due to the fact the emulator can run in systems with wildly different timings). - -## Services - -Consult [SwitchBrew](https://switchbrew.org/) for per-service methods, and implementation details. - -All services are instatiated implicitly using `ServiceFramework`. To register a new interface or service, you can inherit from said class, providing additionally a template parameter that references `Self`, for example: - -```c++ -// Follows as: -// class MyInterface [final] : public ServiceFramework { ... }; -// [final] is optional, but should be used whenever there is no intention of this class itself being inherited. -class IFloatingRegistrationRequest final : public ServiceFramework { -public: - // ctor, you can pass extra parameters here (if so required) - explicit IFloatingRegistrationRequest(Core::System& system_) - : ServiceFramework{system_, "IFloatingRegistrationRequest"} - {} - - // Must be placed after all methods are defined (or declared). - // Define here your functions and methods, please order them. - // Use FindRequestTipc for TIPC handlers. - 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"}, - FunctionInfo{101, nullptr, "RegisterUserWithUid"}, - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } -}; -``` - -Try to keep service structures local, that is, don't place them on header files if they're only going to be used by a specific service. - -In each `.cpp` file that uses `D<...>/C<...>` CMIF wrapper helpers, remember to include the corresponding instancer, so you don't face linker errors: -```c++ -#include "core/hle/service/cmif_serialization.h" -``` -This will properly instatiate the corresponding wrappers and decompose the provided arguments in the wiring order. diff --git a/docs/README.md b/docs/README.md index f7568e16f3..5bcaf30239 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,7 @@ This contains documentation created by developers, build instructions, guideline - Subsystems: - **[Design Overview](./DesignOverview.md)** - **[Dynarmic](./dynarmic/README.md)** - - **[Subsystem: HLE](./SubsystemHLE.md)** + - **[HOS Kernel](./HosKernel.md)** - **[Settings](./Settings.md)** ## Policies diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index f1d4bdae42..31f9931d3a 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -444,18 +444,28 @@ 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 @@ -464,14 +474,28 @@ 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 @@ -556,8 +580,20 @@ 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 @@ -582,6 +618,10 @@ 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 @@ -613,6 +653,8 @@ 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 @@ -681,6 +723,8 @@ 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 @@ -869,6 +913,8 @@ 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 @@ -898,8 +944,14 @@ 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 @@ -909,8 +961,18 @@ 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 @@ -961,6 +1023,10 @@ 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 @@ -989,6 +1055,8 @@ 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 @@ -1154,7 +1222,7 @@ target_link_libraries(core PRIVATE RenderDoc::API ZLIB::ZLIB) -target_link_libraries(core PUBLIC httplib::httplib zstd::zstd frozen::frozen-headers) +target_link_libraries(core PUBLIC httplib::httplib zstd::zstd) 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 9b29a7773c..d68b6bde0d 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -75,6 +75,41 @@ class IManagerForSystemService final : public ServiceFramework, "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: @@ -108,40 +143,6 @@ 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } Common::UUID account_id; }; @@ -150,25 +151,25 @@ class IFloatingRegistrationRequest final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -176,6 +177,62 @@ class IAdministrator final : public ServiceFramework { 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: @@ -184,97 +241,42 @@ 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } }; class IAuthorizationRequest final : public ServiceFramework { 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IOAuthProcedure final : public ServiceFramework { public: explicit IOAuthProcedure(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedure"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -282,69 +284,96 @@ public: class IOAuthProcedureForExternalNsa final : public ServiceFramework { public: explicit IOAuthProcedureForExternalNsa(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedureForExternalNsa"} - {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; -class IOAuthProcedureForNintendoAccountLinkage final : public ServiceFramework { +class IOAuthProcedureForNintendoAccountLinkage final + : public ServiceFramework { public: explicit IOAuthProcedureForNintendoAccountLinkage(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedureForNintendoAccountLinkage"} - {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class INotifier final : public ServiceFramework { public: explicit INotifier(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "INotifier"} {} + : ServiceFramework{system_, "INotifier"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetSystemEvent"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSystemEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IProfileCommon : public ServiceFramework { 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: @@ -571,22 +600,6 @@ protected: rb.Push(ResultSuccess); } - std::optional 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. }; @@ -608,33 +621,35 @@ public: class ISessionObject final : public ServiceFramework { public: explicit ISessionObject(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "ISessionObject"} {} + : ServiceFramework{system_, "ISessionObject"} { + // clang-format off + static const FunctionInfo functions[] = { + {999, nullptr, "Dummy"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{999, nullptr, "Dummy"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IGuestLoginRequest final : public ServiceFramework { public: explicit IGuestLoginRequest(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IGuestLoginRequest"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -671,10 +686,23 @@ public: const std::shared_ptr& profile_manager_) : ServiceFramework{system_, "IManagerForApplication"}, ensure_token_id{std::make_shared(system)}, - profile_manager{profile_manager_} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -744,18 +772,6 @@ 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 ensure_token_id{}; std::shared_ptr profile_manager; }; @@ -765,17 +781,18 @@ class IAsyncNetworkServiceLicenseKindContext final : public ServiceFramework { public: explicit IAsyncNetworkServiceLicenseKindContext(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IAsyncNetworkServiceLicenseKindContext"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -784,54 +801,56 @@ class IOAuthProcedureForUserRegistration final : public ServiceFramework { public: explicit IOAuthProcedureForUserRegistration(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedureForUserRegistration"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class DAUTH_O final : public ServiceFramework { public: - explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -839,809 +858,781 @@ public: class IAsyncResult final : public ServiceFramework { public: explicit IAsyncResult(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IAsyncResult"} {} + : 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 - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetResult"}, - FunctionInfo{1, nullptr, "Cancel"}, - FunctionInfo{2, nullptr, "IsAvailable"}, - FunctionInfo{3, nullptr, "GetSystemEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; -class Module final { -public: - class Interface : public ServiceFramework { - public: - explicit Interface(std::shared_ptr module_, std::shared_ptr 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 Module::Interface::GetUserCount(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(static_cast(profile_manager->GetUserCount())); +} - void GetUserCount(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(static_cast(profile_manager->GetUserCount())); +void Module::Interface::GetUserExistence(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + 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(profile_manager->GetLastOpenedUser()); +} + +void Module::Interface::GetProfile(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(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"); + + // 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. + + 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; + } + + // 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; +} + +void Module::Interface::GetBaasAccountManagerForApplication(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, profile_manager); +} + +void Module::Interface::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(); + } - void GetUserExistence(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - 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 ListAllUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - ctx.WriteBuffer(profile_manager->GetAllUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void ListOpenUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - ctx.WriteBuffer(profile_manager->GetOpenUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void GetLastOpenedUser(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 6}; - rb.Push(ResultSuccess); - rb.PushRaw(profile_manager->GetLastOpenedUser()); - } - - void GetProfile(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); - - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, user_id, *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 InitializeApplicationInfo(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(InitializeApplicationInfoBase()); - } - - void InitializeApplicationInfoRestricted(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(Partial implementation) called"); - - // 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. - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(InitializeApplicationInfoBase()); - } - - void GetBaasAccountManagerForApplication(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, profile_manager); - } - - 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); - } - - void InitializeApplicationInfoV2(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - 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()); - - IPC::ResponseBuilder rb{ctx, 6}; - rb.Push(ResultSuccess); - rb.PushRaw(user_id); - } - - void CompleteUserRegistration(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - - LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); - - profile_manager->WriteUserSaveFile(); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void DeleteUser(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - 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); - } - - void SetUserPosition(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - - u64 position = rp.Pop(); - Common::UUID user_id = rp.PopRaw(); - - LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString()); - - profile_manager->SetUserPosition(position, user_id); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void GetProfileEditor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - - LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString()); - - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, user_id, *profile_manager); - } - - void GetBaasAccountAdministrator(HLERequestContext &ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); - - LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); - - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, uuid); - } - - void ListQualifiedUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - - // 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); - } - - void ListOpenContextStoredUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - - ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void StoreSaveDataThumbnailApplication(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); - - LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString()); - - // 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 GetBaasAccountManagerForSystemService(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); - - LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); - - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, uuid); - } - - void StoreSaveDataThumbnailSystem(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); - const auto tid = rp.Pop(); - - LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid); - StoreSaveDataThumbnail(ctx, uuid, tid); - } - - void GetPinCodeLength(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(0); - } - - 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 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); - } - - 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; - } - - void StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid, - const u64 tid) { - IPC::ResponseBuilder rb{ctx, 2}; - - 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); - } - - 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; - std::shared_ptr profile_manager; - }; -}; + 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 Module::Interface::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()); + + IPC::ResponseBuilder rb{ctx, 6}; + rb.Push(ResultSuccess); + rb.PushRaw(user_id); +} + +void Module::Interface::CompleteUserRegistration(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + + LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); + + profile_manager->WriteUserSaveFile(); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::DeleteUser(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + 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); +} + +void Module::Interface::SetUserPosition(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + + u64 position = rp.Pop(); + Common::UUID user_id = rp.PopRaw(); + + LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString()); + + profile_manager->SetUserPosition(position, user_id); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::GetProfileEditor(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + + LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString()); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, user_id, *profile_manager); +} + +void Module::Interface::GetBaasAccountAdministrator(HLERequestContext &ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); + + LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, uuid); +} + +void Module::Interface::ListQualifiedUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + + // 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); +} + +void Module::Interface::ListOpenContextStoredUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + + ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::StoreSaveDataThumbnailApplication(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); + + LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString()); + + // 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::GetBaasAccountManagerForSystemService(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); + + LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, uuid); +} + +void Module::Interface::StoreSaveDataThumbnailSystem(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); + const auto tid = rp.Pop(); + + LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid); + StoreSaveDataThumbnail(ctx, uuid, tid); +} + +void Module::Interface::GetPinCodeLength(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(0); +} + +void Module::Interface::StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid, + const u64 tid) { + IPC::ResponseBuilder rb{ctx, 2}; + + 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); +} + +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; + } + + 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::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); +} + +Module::Interface::Interface(std::shared_ptr module_, + std::shared_ptr profile_manager_, + Core::System& system_, const char* name) + : ServiceFramework{system_, name}, module{std::move(module_)}, + profile_manager{std::move(profile_manager_)} {} + +Module::Interface::~Interface() = default; class ACC_AA final : public Module::Interface { public: explicit ACC_AA(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:aa") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } ~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_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:su") {} + : 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 - ~ACC_SU() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(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"} - ); + ~ACC_SU() override = default; }; class ACC_U0 final : public Module::Interface { public: ACC_U0(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u0") {} + : 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(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_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u1") {} + : 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(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 { public: - explicit DAUTH_0(Core::System& system_) : ServiceFramework{system_, "dauth:0"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } - - 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_, std::shared_ptr profile_manager_, Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class ACC_E_U1 final : public Module::Interface { public: explicit ACC_E_U1(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class ACC_E_U2 final : public Module::Interface { public: explicit ACC_E_U2(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; diff --git a/src/core/hle/service/acc/acc.h b/src/core/hle/service/acc/acc.h index 9c2c96acdb..19af7c74c9 100644 --- a/src/core/hle/service/acc/acc.h +++ b/src/core/hle/service/acc/acc.h @@ -14,6 +14,70 @@ namespace Service::Account { class ProfileManager; +class Module final { +public: + class Interface : public ServiceFramework { + public: + explicit Interface(std::shared_ptr module_, + std::shared_ptr 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; + std::shared_ptr 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 a7f751d756..8dec886ad7 100644 --- a/src/core/hle/service/acc/async_context.cpp +++ b/src/core/hle/service/acc/async_context.cpp @@ -12,6 +12,17 @@ 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 0137567d11..c50537d4ae 100644 --- a/src/core/hle/service/acc/async_context.h +++ b/src/core/hle/service/acc/async_context.h @@ -33,16 +33,6 @@ protected: void MarkComplete(); - std::optional 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 is_complete{false}; diff --git a/src/core/hle/service/acc/errors.h b/src/core/hle/service/acc/errors.h index 433ebfe9d6..b7cf8b5f93 100644 --- a/src/core/hle/service/acc/errors.h +++ b/src/core/hle/service/acc/errors.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 diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 472be8f0f0..86d9d52e34 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -4,1340 +4,16 @@ // 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/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" +#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" 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 { -public: - explicit IDebugFunctions(Core::System& system_) : ServiceFramework{system_, "IDebugFunctions"} {} - ~IDebugFunctions() override = default; - - std::optional 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 { -public: - explicit IApplicationProxy(Core::System& system_, std::shared_ptr 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> out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDisplayController( - Out> out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetProcessWindingController( - Out> out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetDebugFunctions( - Out> out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); - } - - Result GetWindowController( - Out> out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetSelfController( - Out> out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); - } - - Result GetCommonStateGetter( - Out> out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetLibraryAppletCreator( - Out> out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetApplicationFunctions( - Out> out_application_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_application_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - -private: - std::optional 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 m_applet; -}; - -class IApplicationProxyService final : public ServiceFramework { -public: - explicit IApplicationProxyService(Core::System& system_, - WindowSystem& window_system) - : ServiceFramework{system_, "appletOE"}, m_window_system{window_system} { - } - - ~IApplicationProxyService() override = default; - - Result OpenApplicationProxy( - Out> out_application_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid)) { - *out_application_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - std::shared_ptr GetAppletFromProcessId(ProcessId process_id) { - return m_window_system.GetByAppletResourceUserId(process_id.pid); - } - - std::optional 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 { -public: - explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr 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 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{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 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 out_unknown) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_unknown = 0; - R_SUCCEED(); - } - - std::optional 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; -}; - -class ISystemAppletProxy final : public ServiceFramework { -public: - explicit ISystemAppletProxy(Core::System& system_, std::shared_ptr 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> out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDisplayController( - Out> out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetProcessWindingController( - Out> out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetDebugFunctions( - Out> out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); - } - - Result GetWindowController( - Out> out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetSelfController( - Out> out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); - } - - Result GetCommonStateGetter( - Out> out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetLibraryAppletCreator( - Out> out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetApplicationCreator( - Out> out_application_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_application_creator = std::make_shared(system, m_window_system); - R_SUCCEED(); - } - - Result GetAppletCommonFunctions( - Out> out_applet_common_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_applet_common_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetHomeMenuFunctions( - Out> out_home_menu_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_home_menu_functions = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetGlobalStateController( - Out> out_global_state_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_global_state_controller = std::make_shared(system); - R_SUCCEED(); - } - - std::optional 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 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 { -public: - ILibraryAppletSelfAccessor(Core::System& system_, - std::shared_ptr applet) - : ServiceFramework{system_, "ILibraryAppletSelfAccessor"}, m_applet{std::move(applet)}, - m_broker{m_applet->caller_applet_broker} { - } - - ~ILibraryAppletSelfAccessor() = default; - - Result PopInData(Out> out_storage) { - LOG_INFO(Service_AM, "called"); - R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage)); - } - - Result PushOutData(SharedPointer storage) { - LOG_INFO(Service_AM, "called"); - m_broker->GetOutData().Push(system.Kernel(), storage); - R_SUCCEED(); - } - - Result PopInteractiveInData(Out> out_storage) { - LOG_INFO(Service_AM, "called"); - R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage)); - } - - Result PushInteractiveOutData(SharedPointer storage) { - LOG_INFO(Service_AM, "called"); - m_broker->GetInteractiveOutData().Push(system.Kernel(), storage); - R_SUCCEED(); - } - - Result GetPopInDataEvent( - OutCopyHandle out_event) { - LOG_INFO(Service_AM, "called"); - *out_event = m_broker->GetInData().GetEvent(); - R_SUCCEED(); - } - - Result GetPopInteractiveInDataEvent( - OutCopyHandle out_event) { - LOG_INFO(Service_AM, "called"); - *out_event = m_broker->GetInteractiveInData().GetEvent(); - R_SUCCEED(); - } - - Result GetLibraryAppletInfo( - Out 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 out_identity_info) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_identity_info = { - .applet_id = AppletId::QLaunch, - .application_id = 0x0100000000001000ull, - }; - R_SUCCEED(); - } - - Result CanUseApplicationCore(Out 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, 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 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 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 out_identity_info) { - LOG_INFO(Service_AM, "called"); - *out_identity_info = GetCallerIdentity(*m_applet); - R_SUCCEED(); - } - - Result GetCallerAppletIdentityInfoStack( - Out out_count, OutArray out_identity_info) { - LOG_INFO(Service_AM, "called"); - - std::shared_ptr applet = m_applet; - *out_count = 0; - - do { - if (*out_count >= static_cast(out_identity_info.size())) { - break; - } - out_identity_info[(*out_count)++] = GetCallerIdentity(*applet); - } while ((applet = applet->caller_applet.lock())); - - R_SUCCEED(); - } - - Result GetDesirableKeyboardLayout(Out 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 error_context) { - LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, - error_code.number); - R_SUCCEED(); - } - - Result UnpopInData(SharedPointer storage) { - LOG_INFO(Service_AM, "called"); - m_broker->GetInData().Unpop(system.Kernel(), storage); - R_SUCCEED(); - } - - Result GetMainAppletApplicationDesiredLanguage( - Out 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:am2"); - - std::shared_ptr 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 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 out_can_select_any_user, Out out_users_count, - OutArray 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(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 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 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 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 m_applet; - const std::shared_ptr m_broker; -}; - -class ILibraryAppletProxy final : public ServiceFramework { -public: - explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr 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> out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDisplayController( - Out> out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetProcessWindingController( - Out> out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetDebugFunctions( - Out> out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); - } - - Result GetWindowController( - Out> out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetSelfController( - Out> out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); - } - - Result GetCommonStateGetter( - Out> out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetLibraryAppletCreator( - Out> out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result OpenLibraryAppletSelfAccessor( - Out> out_library_applet_self_accessor) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_self_accessor = - std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetAppletCommonFunctions( - Out> out_applet_common_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_applet_common_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetHomeMenuFunctions( - Out> out_home_menu_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_home_menu_functions = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetGlobalStateController( - Out> out_global_state_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_global_state_controller = std::make_shared(system); - R_SUCCEED(); - } - - std::optional 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 m_applet; -}; - -class IOverlayAppletProxy final : public ServiceFramework { -public: - explicit IOverlayAppletProxy(Core::System &system_, std::shared_ptr 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 > out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetSelfController( - Out > out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); - } - - Result GetWindowController( - Out > out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetAudioController( - Out > out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDisplayController( - Out > out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetProcessWindingController( - Out > out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetLibraryAppletCreator( - Out > out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetOverlayFunctions( - Out > out_overlay_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_overlay_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetAppletCommonFunctions( - Out > out_applet_common_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_applet_common_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetGlobalStateController( - Out > out_global_state_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_global_state_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDebugFunctions( - Out > out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); - } - - std::optional 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 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(0); - } -} - -static std::shared_ptr CreateGuestApplet(Core::System& system, - WindowSystem& window_system, - std::shared_ptr caller_applet, - AppletId applet_id, - LibraryAppletMode mode) { - const auto program_id = static_cast(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(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(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(system, broker, applet); - } - // Couldn't initialize the guest process - return {}; -} - -static std::shared_ptr CreateFrontendApplet(Core::System& system, - WindowSystem& window_system, - std::shared_ptr caller_applet, - AppletId applet_id, - LibraryAppletMode mode) { - const auto program_id = static_cast(AppletIdToProgramId(applet_id)); - - auto process = std::make_unique(system); - auto applet = std::make_shared(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(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(system, storage, applet); -} - -class ILibraryAppletCreator final : public ServiceFramework { -public: - explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) - : ServiceFramework{system_, "ILibraryAppletCreator"} - , m_window_system{window_system}, m_applet{std::move(applet)} { - } - ~ILibraryAppletCreator() override = default; - - Result CreateLibraryApplet( - Out> 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 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> 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 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> 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(system, AM::CreateStorage(std::vector(size))); - R_SUCCEED(); - } - - Result CreateTransferMemoryStorage( - Out> out_storage, bool is_writable, s64 size, - InCopyHandle 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( - system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), - transfer_memory_handle.Get(), is_writable, size)); - R_SUCCEED(); - } - - Result CreateHandleStorage( - Out> out_storage, s64 size, - InCopyHandle 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( - system, AM::CreateHandleStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), - transfer_memory_handle.Get(), size)); - R_SUCCEED(); - } - - std::optional 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 m_applet; -}; - -class IAllSystemAppletProxiesService final - : public ServiceFramework { -public: - explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system) - : ServiceFramework{system_, "appletAE"}, m_window_system{window_system} { - } - - ~IAllSystemAppletProxiesService() override = default; - - Result OpenSystemAppletProxy( - Out> out_system_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_system_applet_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - Result OpenLibraryAppletProxy( - Out> out_library_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle, - InLargeData attribute) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_library_applet_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - Result OpenOverlayAppletProxy( - Out> out_overlay_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_WARNING(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_overlay_applet_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - Result OpenSystemApplicationProxy( - Out> out_system_application_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_system_application_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - Result OpenLibraryAppletProxyOld( - Out> out_library_applet_proxy, ClientProcessId pid, - InCopyHandle 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 GetAppletFromProcessId(ProcessId process_id) { - return m_window_system.GetByAppletResourceUserId(process_id.pid); - } - - std::optional 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); @@ -1345,8 +21,10 @@ void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("appletAE", std::make_shared(system, window_system)); - server_manager->RegisterNamedService("appletOE", std::make_shared(system, window_system)); + server_manager->RegisterNamedService( + "appletAE", std::make_shared(system, window_system)); + server_manager->RegisterNamedService( + "appletOE", std::make_shared(system, window_system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 1afe253aed..0bf5880f30 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.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 diff --git a/src/core/hle/service/am/applet_manager.h b/src/core/hle/service/am/applet_manager.h index 2b0714adf7..cd3035de31 100644 --- a/src/core/hle/service/am/applet_manager.h +++ b/src/core/hle/service/am/applet_manager.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 diff --git a/src/core/hle/service/am/frontend/applet_cabinet.h b/src/core/hle/service/am/frontend/applet_cabinet.h index 3a211ed372..a74f233569 100644 --- a/src/core/hle/service/am/frontend/applet_cabinet.h +++ b/src/core/hle/service/am/frontend/applet_cabinet.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-2.0-or-later diff --git a/src/core/hle/service/am/frontend/applet_controller.h b/src/core/hle/service/am/frontend/applet_controller.h index 341ebed234..3877a7b02e 100644 --- a/src/core/hle/service/am/frontend/applet_controller.h +++ b/src/core/hle/service/am/frontend/applet_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 2020 yuzu Emulator Project diff --git a/src/core/hle/service/am/frontend/applet_error.h b/src/core/hle/service/am/frontend/applet_error.h index 678bf33fac..af3e2134a5 100644 --- a/src/core/hle/service/am/frontend/applet_error.h +++ b/src/core/hle/service/am/frontend/applet_error.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 diff --git a/src/core/hle/service/am/frontend/applet_general.h b/src/core/hle/service/am/frontend/applet_general.h index eaa7ae25fe..ceb0537119 100644 --- a/src/core/hle/service/am/frontend/applet_general.h +++ b/src/core/hle/service/am/frontend/applet_general.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 diff --git a/src/core/hle/service/am/frontend/applet_mii_edit.h b/src/core/hle/service/am/frontend/applet_mii_edit.h index 5db792f7d2..8654426431 100644 --- a/src/core/hle/service/am/frontend/applet_mii_edit.h +++ b/src/core/hle/service/am/frontend/applet_mii_edit.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-2.0-or-later diff --git a/src/core/hle/service/am/frontend/applet_mii_edit_types.h b/src/core/hle/service/am/frontend/applet_mii_edit_types.h index 23d9d7a69b..9c354bd947 100644 --- a/src/core/hle/service/am/frontend/applet_mii_edit_types.h +++ b/src/core/hle/service/am/frontend/applet_mii_edit_types.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-2.0-or-later diff --git a/src/core/hle/service/am/frontend/applet_net_connect.h b/src/core/hle/service/am/frontend/applet_net_connect.h index d5d503ed41..0986b63c60 100644 --- a/src/core/hle/service/am/frontend/applet_net_connect.h +++ b/src/core/hle/service/am/frontend/applet_net_connect.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 #pragma once diff --git a/src/core/hle/service/am/frontend/applet_profile_select.cpp b/src/core/hle/service/am/frontend/applet_profile_select.cpp index 89b5a1eabe..0f46ee6232 100644 --- a/src/core/hle/service/am/frontend/applet_profile_select.cpp +++ b/src/core/hle/service/am/frontend/applet_profile_select.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 diff --git a/src/core/hle/service/am/frontend/applet_profile_select.h b/src/core/hle/service/am/frontend/applet_profile_select.h index 674e7afe17..4feba73a37 100644 --- a/src/core/hle/service/am/frontend/applet_profile_select.h +++ b/src/core/hle/service/am/frontend/applet_profile_select.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 diff --git a/src/core/hle/service/am/frontend/applet_software_keyboard_types.h b/src/core/hle/service/am/frontend/applet_software_keyboard_types.h index a25ff2a6d2..6bb8f437d3 100644 --- a/src/core/hle/service/am/frontend/applet_software_keyboard_types.h +++ b/src/core/hle/service/am/frontend/applet_software_keyboard_types.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 diff --git a/src/core/hle/service/am/frontend/applet_web_browser.h b/src/core/hle/service/am/frontend/applet_web_browser.h index ae62389f13..41461a93d0 100644 --- a/src/core/hle/service/am/frontend/applet_web_browser.h +++ b/src/core/hle/service/am/frontend/applet_web_browser.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 2020 yuzu Emulator Project diff --git a/src/core/hle/service/am/frontend/applets.h b/src/core/hle/service/am/frontend/applets.h index 8eb08ea77b..6259a5668a 100644 --- a/src/core/hle/service/am/frontend/applets.h +++ b/src/core/hle/service/am/frontend/applets.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 diff --git a/src/core/hle/service/am/process_holder.cpp b/src/core/hle/service/am/process_holder.cpp index 21ef5bf838..8ad6599fd6 100644 --- a/src/core/hle/service/am/process_holder.cpp +++ b/src/core/hle/service/am/process_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-2.0-or-later diff --git a/src/core/hle/service/am/process_holder.h b/src/core/hle/service/am/process_holder.h index 3a9b81dfb4..dbf04668dc 100644 --- a/src/core/hle/service/am/process_holder.h +++ b/src/core/hle/service/am/process_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-2.0-or-later 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 new file mode 100644 index 0000000000..437032c2f4 --- /dev/null +++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp @@ -0,0 +1,135 @@ +// 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> out_system_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_system_applet_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +Result IAllSystemAppletProxiesService::OpenLibraryAppletProxy( + Out> out_library_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle, + InLargeData attribute) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_library_applet_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +Result IAllSystemAppletProxiesService::OpenOverlayAppletProxy( + Out> out_overlay_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_WARNING(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_overlay_applet_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +Result IAllSystemAppletProxiesService::OpenSystemApplicationProxy( + Out> out_system_application_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_system_application_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +Result IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld( + Out> out_library_applet_proxy, ClientProcessId pid, + InCopyHandle 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 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 new file mode 100644 index 0000000000..73cb8a09ac --- /dev/null +++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.h @@ -0,0 +1,56 @@ +// 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 { +public: + explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system); + ~IAllSystemAppletProxiesService() override; + +private: + Result OpenSystemAppletProxy(Out> out_system_applet_proxy, + ClientProcessId pid, + InCopyHandle process_handle); + Result OpenLibraryAppletProxy(Out> out_library_applet_proxy, + ClientProcessId pid, + InCopyHandle process_handle, + InLargeData attribute); + Result OpenOverlayAppletProxy(Out> out_overlay_applet_proxy, + ClientProcessId pid, InCopyHandle process_handle); + Result OpenLibraryAppletProxyOld( + Out> out_library_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle); + Result OpenSystemApplicationProxy( + Out> out_system_application_proxy, ClientProcessId pid, + InCopyHandle process_handle); + Result GetSystemProcessCommonFunctions(); + Result GetAppletAlternativeFunctions(); + +private: + std::shared_ptr 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 new file mode 100644 index 0000000000..5ffec23b3e --- /dev/null +++ b/src/core/hle/service/am/service/applet_common_functions.cpp @@ -0,0 +1,98 @@ +// 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_) + : 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 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{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 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 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 new file mode 100644 index 0000000000..696fcd5bd1 --- /dev/null +++ b/src/core/hle/service/am/service/applet_common_functions.h @@ -0,0 +1,33 @@ +// 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 { +public: + explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr applet_); + ~IAppletCommonFunctions() override; + +private: + Result SetHomeButtonDoubleClickEnabled(bool home_button_double_click_enabled); + Result GetHomeButtonDoubleClickEnabled(Out out_home_button_double_click_enabled); + Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height); + Result SetCpuBoostRequestPriority(s32 priority); + Result GetCurrentApplicationId(Out out_application_id); + Result SetGpuTimeSliceBoost(s64 time_span); + Result Unknown350(Out out_unknown); + + const std::shared_ptr 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 d24c2616dc..f357871706 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 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, 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 57b222fc19..7908099916 100644 --- a/src/core/hle/service/am/service/application_accessor.h +++ b/src/core/hle/service/am/service/application_accessor.h @@ -39,7 +39,6 @@ private: Result GetNsRightsEnvironmentHandle(Out out_handle); Result ReportApplicationExitTimeout(); - std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; const std::shared_ptr 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 8d57f917fb..4eb2f29e22 100644 --- a/src/core/hle/service/am/service/application_creator.cpp +++ b/src/core/hle/service/am/service/application_creator.cpp @@ -20,16 +20,6 @@ namespace Service::AM { -std::optional 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* out_application_accessor, Core::System& system, WindowSystem& window_system, u64 program_id) { @@ -64,6 +54,16 @@ Result CreateGuestApplication(SharedPointer* 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 64434af542..59ae924131 100644 --- a/src/core/hle/service/am/service/application_creator.h +++ b/src/core/hle/service/am/service/application_creator.h @@ -24,7 +24,6 @@ private: Result CreateApplication(Out>, u64 application_id); Result CreateSystemApplication(Out>, u64 application_id); - std::optional 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 4fda5eedd6..90d292c4a2 100644 --- a/src/core/hle/service/am/service/application_functions.cpp +++ b/src/core/hle/service/am/service/application_functions.cpp @@ -51,84 +51,83 @@ FileSys::PatchManager::Metadata GetApplicationMetadata(Core::System& system, u64 } // Anonymous namespace -std::optional 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) - : ServiceFramework{system_, "IApplicationFunctions"} - , m_applet{std::move(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); +} IApplicationFunctions::~IApplicationFunctions() = default; diff --git a/src/core/hle/service/am/service/application_functions.h b/src/core/hle/service/am/service/application_functions.h index 7093d13f82..b97ed7e25e 100644 --- a/src/core/hle/service/am/service/application_functions.h +++ b/src/core/hle/service/am/service/application_functions.h @@ -84,7 +84,6 @@ private: Result GetUnknownEvent210(OutCopyHandle out_event); Result Unknown330(Out out); Result PrepareForJit(); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/application_proxy.cpp b/src/core/hle/service/am/service/application_proxy.cpp new file mode 100644 index 0000000000..df438e1e17 --- /dev/null +++ b/src/core/hle/service/am/service/application_proxy.cpp @@ -0,0 +1,109 @@ +// 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/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, + 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> out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); +} + +Result IApplicationProxy::GetDisplayController( + Out> out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result IApplicationProxy::GetProcessWindingController( + Out> out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result IApplicationProxy::GetDebugFunctions( + Out> out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); +} + +Result IApplicationProxy::GetWindowController( + Out> out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result IApplicationProxy::GetSelfController( + Out> out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); +} + +Result IApplicationProxy::GetCommonStateGetter( + Out> out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result IApplicationProxy::GetLibraryAppletCreator( + Out> out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result IApplicationProxy::GetApplicationFunctions( + Out> out_application_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_application_functions = std::make_shared(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 new file mode 100644 index 0000000000..b56f597605 --- /dev/null +++ b/src/core/hle/service/am/service/application_proxy.h @@ -0,0 +1,52 @@ +// 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 IAudioController; +class IApplicationFunctions; +class ICommonStateGetter; +class IDebugFunctions; +class IDisplayController; +class ILibraryAppletCreator; +class IProcessWindingController; +class ISelfController; +class IWindowController; +class WindowSystem; + +class IApplicationProxy final : public ServiceFramework { +public: + explicit IApplicationProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system); + ~IApplicationProxy(); + +private: + Result GetAudioController(Out> out_audio_controller); + Result GetDisplayController(Out> out_display_controller); + Result GetProcessWindingController( + Out> out_process_winding_controller); + Result GetDebugFunctions(Out> out_debug_functions); + Result GetWindowController(Out> out_window_controller); + Result GetSelfController(Out> out_self_controller); + Result GetCommonStateGetter(Out> out_common_state_getter); + Result GetLibraryAppletCreator( + Out> out_library_applet_creator); + Result GetApplicationFunctions( + Out> out_application_functions); + +private: + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr 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 new file mode 100644 index 0000000000..7727951d8c --- /dev/null +++ b/src/core/hle/service/am/service/application_proxy_service.cpp @@ -0,0 +1,47 @@ +// 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/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> out_application_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid)) { + *out_application_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +std::shared_ptr 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 new file mode 100644 index 0000000000..fce860a7c1 --- /dev/null +++ b/src/core/hle/service/am/service/application_proxy_service.h @@ -0,0 +1,36 @@ +// 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" + +namespace Service { + +namespace AM { + +struct Applet; +class IApplicationProxy; +class WindowSystem; + +class IApplicationProxyService final : public ServiceFramework { +public: + explicit IApplicationProxyService(Core::System& system_, WindowSystem& window_system); + ~IApplicationProxyService() override; + +private: + Result OpenApplicationProxy(Out> out_application_proxy, + ClientProcessId pid, InCopyHandle process_handle); + +private: + std::shared_ptr 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 2c8494e056..4e9af756f2 100644 --- a/src/core/hle/service/am/service/audio_controller.cpp +++ b/src/core/hle/service/am/service/audio_controller.cpp @@ -9,20 +9,20 @@ namespace Service::AM { -std::optional 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 9cdb33820d..a13f3b199b 100644 --- a/src/core/hle/service/am/service/audio_controller.h +++ b/src/core/hle/service/am/service/audio_controller.h @@ -23,7 +23,6 @@ private: Result ChangeMainAppletMasterVolume(f32 volume, s64 fade_time_ns); Result SetTransparentVolumeRate(f32 transparent_volume_rate); - std::optional 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 6a6a51f42e..044929e434 100644 --- a/src/core/hle/service/am/service/common_state_getter.cpp +++ b/src/core/hle/service/am/service/common_state_getter.cpp @@ -8,6 +8,7 @@ #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" @@ -17,147 +18,77 @@ namespace Service::AM { -std::optional 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 { -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 out_is_locked, OutCopyHandle 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 out_handle) { - LOG_INFO(Service_AM, "called"); - *out_handle = m_event.GetHandle(); - R_SUCCEED(); - } - - Result IsLocked(Out 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 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) : 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 ad782ca48e..da86b5d079 100644 --- a/src/core/hle/service/am/service/common_state_getter.h +++ b/src/core/hle/service/am/service/common_state_getter.h @@ -76,7 +76,6 @@ private: void SetCpuBoostMode(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override; const std::shared_ptr 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 a8097ea209..b9f19e59d2 100644 --- a/src/core/hle/service/am/service/cradle_firmware_updater.cpp +++ b/src/core/hle/service/am/service/cradle_firmware_updater.cpp @@ -9,21 +9,22 @@ namespace Service::AM { - std::optional 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 f8e4b93b27..c895a34c22 100644 --- a/src/core/hle/service/am/service/cradle_firmware_updater.h +++ b/src/core/hle/service/am/service/cradle_firmware_updater.h @@ -33,7 +33,6 @@ private: Result GetCradleDeviceInfoChangeEvent(OutCopyHandle out_event); private: - std::optional 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 new file mode 100644 index 0000000000..4128366270 --- /dev/null +++ b/src/core/hle/service/am/service/debug_functions.cpp @@ -0,0 +1,46 @@ +// 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/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 new file mode 100644 index 0000000000..381499e93d --- /dev/null +++ b/src/core/hle/service/am/service/debug_functions.h @@ -0,0 +1,19 @@ +// 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/service.h" + +namespace Service::AM { + +class IDebugFunctions final : public ServiceFramework { +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 eb95dd1b86..8f87327b17 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 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_) : 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 03d29f93c5..35e98b9ad3 100644 --- a/src/core/hle/service/am/service/display_controller.h +++ b/src/core/hle/service/am/service/display_controller.h @@ -35,7 +35,6 @@ private: Out out_fbshare_layer_index); Result ReleaseLastApplicationCaptureSharedBuffer(); - std::optional FindRequest(u32 key) override; const std::shared_ptr 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 be080ffcb3..e7cd60927c 100644 --- a/src/core/hle/service/am/service/global_state_controller.cpp +++ b/src/core/hle/service/am/service/global_state_controller.cpp @@ -10,28 +10,28 @@ namespace Service::AM { - std::optional 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 0de1415295..012692ecd8 100644 --- a/src/core/hle/service/am/service/global_state_controller.h +++ b/src/core/hle/service/am/service/global_state_controller.h @@ -26,9 +26,9 @@ private: Result LoadAndApplyIdlePolicySettings(); Result ShouldSleepOnBoot(Out out_should_sleep_on_boot); Result GetHdcpAuthenticationFailedEvent(OutCopyHandle out_event); - Result OpenCradleFirmwareUpdater(Out> out_cradle_firmware_updater); + Result OpenCradleFirmwareUpdater( + Out> out_cradle_firmware_updater); - std::optional 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 5f61c842a2..f9d402ca99 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 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, 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 25eb9db45e..2c3ef54375 100644 --- a/src/core/hle/service/am/service/home_menu_functions.h +++ b/src/core/hle/service/am/service/home_menu_functions.h @@ -34,7 +34,6 @@ private: Result IsForceTerminateApplicationDisabledForDebug( Out out_is_force_terminate_application_disabled_for_debug); - std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; const std::shared_ptr 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 c5386fb1a1..849e5794cf 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_accessor.cpp @@ -17,7 +17,9 @@ namespace Service::AM { -static void EnableSingleUserPlay(const std::shared_ptr& impl) { +namespace { + +void EnableSingleUserPlay(const std::shared_ptr& impl) { constexpr s64 DisplayOptionsOffset = 0x90; constexpr s64 IsSkipEnabledOffset = 1; constexpr s64 ShowSkipButtonOffset = 4; @@ -27,7 +29,7 @@ static void EnableSingleUserPlay(const std::shared_ptr& im impl->Write(DisplayOptionsOffset + ShowSkipButtonOffset, &enabled, sizeof(enabled)); } -static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr& impl) { +void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr& impl) { Frontend::UiReturnArg return_arg{}; impl->Read(0, &return_arg, sizeof(return_arg)); @@ -45,40 +47,42 @@ static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr 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); - } +} // namespace ILibraryAppletAccessor::ILibraryAppletAccessor(Core::System& system_, std::shared_ptr broker, std::shared_ptr 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 e14ddb3bde..ad40bc76c7 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.h +++ b/src/core/hle/service/am/service/library_applet_accessor.h @@ -6,6 +6,7 @@ #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" @@ -15,26 +16,6 @@ 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 data; - Result result; -}; -static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size."); - class ILibraryAppletAccessor final : public ServiceFramework { public: explicit ILibraryAppletAccessor(Core::System& system_, std::shared_ptr broker, @@ -68,7 +49,6 @@ private: void FrontendExecuteInteractive(); void FrontendRequestExit(); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_broker; const std::shared_ptr 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 new file mode 100644 index 0000000000..4ee92908b5 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_creator.cpp @@ -0,0 +1,287 @@ +// 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(0); + } +} + +std::shared_ptr CreateGuestApplet(Core::System& system, + WindowSystem& window_system, + std::shared_ptr caller_applet, + AppletId applet_id, + LibraryAppletMode mode) { + const auto program_id = static_cast(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(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(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(system, broker, applet); + } + // Couldn't initialize the guest process + return {}; +} + +std::shared_ptr CreateFrontendApplet(Core::System& system, + WindowSystem& window_system, + std::shared_ptr caller_applet, + AppletId applet_id, + LibraryAppletMode mode) { + const auto program_id = static_cast(AppletIdToProgramId(applet_id)); + + auto process = std::make_unique(system); + auto applet = std::make_shared(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(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(system, storage, applet); +} + +} // namespace + +ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr 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> 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 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> 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 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> 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(system, AM::CreateStorage(std::vector(size))); + R_SUCCEED(); +} + +Result ILibraryAppletCreator::CreateTransferMemoryStorage( + Out> out_storage, bool is_writable, s64 size, + InCopyHandle 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( + system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), + transfer_memory_handle.Get(), is_writable, size)); + R_SUCCEED(); +} + +Result ILibraryAppletCreator::CreateHandleStorage( + Out> out_storage, s64 size, + InCopyHandle 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( + 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 new file mode 100644 index 0000000000..1c7f930055 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_creator.h @@ -0,0 +1,44 @@ +// 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/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 { +public: + explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, + WindowSystem& window_system); + ~ILibraryAppletCreator() override; + +private: + Result CreateLibraryApplet( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode); + Result CreateLibraryAppletEx( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode, u64 thread_id); + Result CreateStorage(Out> out_storage, s64 size); + Result CreateTransferMemoryStorage( + Out> out_storage, bool is_writable, s64 size, + InCopyHandle transfer_memory_handle); + Result CreateHandleStorage(Out> out_storage, s64 size, + InCopyHandle transfer_memory_handle); + + WindowSystem& m_window_system; + const std::shared_ptr 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 new file mode 100644 index 0000000000..567ff75797 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_proxy.cpp @@ -0,0 +1,137 @@ +// 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/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, + 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> out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetDisplayController( + Out> out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetProcessWindingController( + Out> out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetDebugFunctions( + Out> out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetWindowController( + Out> out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetSelfController( + Out> out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetCommonStateGetter( + Out> out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetLibraryAppletCreator( + Out> out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::OpenLibraryAppletSelfAccessor( + Out> out_library_applet_self_accessor) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_self_accessor = + std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetAppletCommonFunctions( + Out> out_applet_common_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_applet_common_functions = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetHomeMenuFunctions( + Out> out_home_menu_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_home_menu_functions = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetGlobalStateController( + Out> out_global_state_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_global_state_controller = std::make_shared(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 new file mode 100644 index 0000000000..c659dbe187 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_proxy.h @@ -0,0 +1,59 @@ +// 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; +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 { +public: + explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system); + ~ILibraryAppletProxy(); + +private: + Result GetAudioController(Out> out_audio_controller); + Result GetDisplayController(Out> out_display_controller); + Result GetProcessWindingController( + Out> out_process_winding_controller); + Result GetDebugFunctions(Out> out_debug_functions); + Result GetWindowController(Out> out_window_controller); + Result GetSelfController(Out> out_self_controller); + Result GetCommonStateGetter(Out> out_common_state_getter); + Result GetLibraryAppletCreator( + Out> out_library_applet_creator); + Result OpenLibraryAppletSelfAccessor( + Out> out_library_applet_self_accessor); + Result GetAppletCommonFunctions( + Out> out_applet_common_functions); + Result GetHomeMenuFunctions(Out> out_home_menu_functions); + Result GetGlobalStateController( + Out> out_global_state_controller); + + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr 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 new file mode 100644 index 0000000000..907be49204 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_self_accessor.cpp @@ -0,0 +1,332 @@ +// 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) + : 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> out_storage) { + LOG_INFO(Service_AM, "called"); + R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage)); +} + +Result ILibraryAppletSelfAccessor::PushOutData(SharedPointer storage) { + LOG_INFO(Service_AM, "called"); + m_broker->GetOutData().Push(system.Kernel(), storage); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::PopInteractiveInData(Out> out_storage) { + LOG_INFO(Service_AM, "called"); + R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage)); +} + +Result ILibraryAppletSelfAccessor::PushInteractiveOutData(SharedPointer storage) { + LOG_INFO(Service_AM, "called"); + m_broker->GetInteractiveOutData().Push(system.Kernel(), storage); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetPopInDataEvent( + OutCopyHandle out_event) { + LOG_INFO(Service_AM, "called"); + *out_event = m_broker->GetInData().GetEvent(); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent( + OutCopyHandle out_event) { + LOG_INFO(Service_AM, "called"); + *out_event = m_broker->GetInteractiveInData().GetEvent(); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetLibraryAppletInfo( + Out 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 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 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, 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 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 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 out_identity_info) { + LOG_INFO(Service_AM, "called"); + *out_identity_info = GetCallerIdentity(*m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack( + Out out_count, OutArray out_identity_info) { + LOG_INFO(Service_AM, "called"); + + std::shared_ptr applet = m_applet; + *out_count = 0; + + do { + if (*out_count >= static_cast(out_identity_info.size())) { + break; + } + out_identity_info[(*out_count)++] = GetCallerIdentity(*applet); + } while ((applet = applet->caller_applet.lock())); + + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout(Out 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 error_context) { + LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, + error_code.number); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::UnpopInData(SharedPointer storage) { + LOG_INFO(Service_AM, "called"); + m_broker->GetInData().Unpop(system.Kernel(), storage); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage( + Out 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:am2"); + + std::shared_ptr 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 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 out_can_select_any_user, Out out_users_count, + OutArray 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(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 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 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 new file mode 100644 index 0000000000..d287f6b403 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_self_accessor.h @@ -0,0 +1,87 @@ +// 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 data; + Result result; +}; +static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size."); + +class ILibraryAppletSelfAccessor final : public ServiceFramework { +public: + explicit ILibraryAppletSelfAccessor(Core::System& system_, std::shared_ptr applet); + ~ILibraryAppletSelfAccessor() override; + +private: + Result PopInData(Out> out_storage); + Result PushOutData(SharedPointer storage); + Result PopInteractiveInData(Out> out_storage); + Result PushInteractiveOutData(SharedPointer storage); + Result GetPopInDataEvent(OutCopyHandle out_event); + Result GetPopInteractiveInDataEvent(OutCopyHandle out_event); + Result GetLibraryAppletInfo(Out out_library_applet_info); + Result GetMainAppletIdentityInfo(Out out_identity_info); + Result CanUseApplicationCore(Out out_can_use_application_core); + Result GetMainAppletApplicationControlProperty( + OutLargeData, BufferAttr_HipcMapAlias> out_nacp); + Result GetMainAppletStorageId(Out out_storage_id); + Result ExitProcessAndReturn(); + Result GetCallerAppletIdentityInfo(Out out_identity_info); + Result GetCallerAppletIdentityInfoStack( + Out out_count, + OutArray out_identity_info); + Result GetDesirableKeyboardLayout(Out out_desirable_layout); + Result ReportVisibleError(ErrorCode error_code); + Result ReportVisibleErrorWithErrorContext( + ErrorCode error_code, InLargeData error_context); + Result UnpopInData(SharedPointer storage); + Result GetMainAppletApplicationDesiredLanguage(Out out_desired_language); + Result GetCurrentApplicationId(Out out_application_id); + Result GetMainAppletAvailableUsers(Out out_can_select_any_user, Out out_users_count, + OutArray out_users); + Result ShouldSetGpuTimeSliceManually(Out out_should_set_gpu_time_slice_manually); + Result GetLibraryAppletInfoEx(Out out_library_applet_info); + + const std::shared_ptr m_applet; + const std::shared_ptr 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 new file mode 100644 index 0000000000..0341254449 --- /dev/null +++ b/src/core/hle/service/am/service/lock_accessor.cpp @@ -0,0 +1,78 @@ +// 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 out_is_locked, + OutCopyHandle 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 out_handle) { + LOG_INFO(Service_AM, "called"); + *out_handle = m_event.GetHandle(); + R_SUCCEED(); +} + +Result ILockAccessor::IsLocked(Out 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 new file mode 100644 index 0000000000..fe3f11dcf0 --- /dev/null +++ b/src/core/hle/service/am/service/lock_accessor.h @@ -0,0 +1,35 @@ +// 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/service.h" + +namespace Service::AM { + +class ILockAccessor final : public ServiceFramework { +public: + explicit ILockAccessor(Core::System& system_); + ~ILockAccessor() override; + +private: + Result TryLock(Out out_is_locked, OutCopyHandle out_handle, + bool return_handle); + Result Unlock(); + Result GetEvent(OutCopyHandle out_handle); + Result IsLocked(Out 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 new file mode 100644 index 0000000000..735ba9d307 --- /dev/null +++ b/src/core/hle/service/am/service/overlay_applet_proxy.cpp @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: Copyright 2026 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, + 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 > out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetSelfController( + Out > out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetWindowController( + Out > out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetAudioController( + Out > out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetDisplayController( + Out > out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetProcessWindingController( + Out > out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetLibraryAppletCreator( + Out > out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetOverlayFunctions( + Out > out_overlay_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_overlay_functions = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetAppletCommonFunctions( + Out > out_applet_common_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_applet_common_functions = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetGlobalStateController( + Out > out_global_state_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_global_state_controller = std::make_shared(system); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetDebugFunctions( + Out > out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(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 new file mode 100644 index 0000000000..6c02166a2d --- /dev/null +++ b/src/core/hle/service/am/service/overlay_applet_proxy.h @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 { +public: + explicit IOverlayAppletProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system); + ~IOverlayAppletProxy(); + +private: + Result GetCommonStateGetter(Out> out_common_state_getter); + Result GetSelfController(Out> out_self_controller); + Result GetWindowController(Out> out_window_controller); + Result GetAudioController(Out> out_audio_controller); + Result GetDisplayController(Out> out_display_controller); + Result GetProcessWindingController( + Out> out_process_winding_controller); + Result GetLibraryAppletCreator( + Out> out_library_applet_creator); + Result GetOverlayFunctions(Out> out_overlay_functions); + Result GetAppletCommonFunctions( + Out> out_applet_common_functions); + Result GetGlobalStateController( + Out> out_global_state_controller); + Result GetDebugFunctions(Out> out_debug_functions); + + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr 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 006610bd47..8150b5dd07 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 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) : 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 b94f0cc0d5..eefd8d862b 100644 --- a/src/core/hle/service/am/service/overlay_functions.h +++ b/src/core/hle/service/am/service/overlay_functions.h @@ -6,25 +6,24 @@ #include "core/hle/service/service.h" namespace Service::AM { -struct Applet; + struct Applet; -class IOverlayFunctions final : public ServiceFramework { -public: - explicit IOverlayFunctions(Core::System &system_, std::shared_ptr applet); - ~IOverlayFunctions() override; + class IOverlayFunctions final : public ServiceFramework { + public: + explicit IOverlayFunctions(Core::System &system_, std::shared_ptr applet); + ~IOverlayFunctions() override; -private: - Result BeginToWatchShortHomeButtonMessage(); - Result EndToWatchShortHomeButtonMessage(); - Result GetApplicationIdForLogo(Out out_application_id); - Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled); - Result IsHealthWarningRequired(Out is_required); - Result SetHandlingHomeButtonShortPressedEnabled(bool enabled); - Result SetHandlingTouchScreenInputEnabled(bool enabled); - Result Unknown70(); + private: + Result BeginToWatchShortHomeButtonMessage(); + Result EndToWatchShortHomeButtonMessage(); + Result GetApplicationIdForLogo(Out out_application_id); + Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled); + Result IsHealthWarningRequired(Out is_required); + Result SetHandlingHomeButtonShortPressedEnabled(bool enabled); + Result SetHandlingTouchScreenInputEnabled(bool enabled); + Result Unknown70(); -private: - std::optional FindRequest(u32 key) override; - const std::shared_ptr m_applet; -}; + private: + const std::shared_ptr 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 159f4dfd5c..e284aa2d89 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 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) : 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 91b29ac04b..f3417bcd97 100644 --- a/src/core/hle/service/am/service/process_winding_controller.h +++ b/src/core/hle/service/am/service/process_winding_controller.h @@ -33,7 +33,6 @@ private: SharedPointer reserved_applet_accessor); Result ReserveToStartAndWait(SharedPointer reserved_applet_accessor); - std::optional FindRequest(u32 key) override; const std::shared_ptr 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 ce8a308d6a..3a654b9daa 100644 --- a/src/core/hle/service/am/service/self_controller.cpp +++ b/src/core/hle/service/am/service/self_controller.cpp @@ -17,66 +17,67 @@ namespace Service::AM { - std::optional 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, 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 ce77769da2..c9f480f575 100644 --- a/src/core/hle/service/am/service/self_controller.h +++ b/src/core/hle/service/am/service/self_controller.h @@ -70,7 +70,6 @@ private: Result Unknown230(u32 in_val, Out out_val); Result Unknown240(u32 in_val); - std::optional FindRequest(u32 key) override; Kernel::KProcess* const m_process; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/storage.cpp b/src/core/hle/service/am/service/storage.cpp index 110a9f5a42..5fe191bf2f 100644 --- a/src/core/hle/service/am/service/storage.cpp +++ b/src/core/hle/service/am/service/storage.cpp @@ -4,86 +4,22 @@ // 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 { -public: - explicit IStorageAccessor(Core::System& system_, std::shared_ptr impl) : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} {} - ~IStorageAccessor() override = default; - - Result GetSize(Out out_size) { - LOG_DEBUG(Service_AM, "called"); - *out_size = m_impl->GetSize(); - R_SUCCEED(); - } - - Result Write(InBuffer 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 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 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 m_impl; -}; - -class ITransferStorageAccessor final : public ServiceFramework { -public: - explicit ITransferStorageAccessor(Core::System& system_, std::shared_ptr impl) : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} {} - ~ITransferStorageAccessor() override = default; - - Result GetSize(Out out_size) { - LOG_DEBUG(Service_AM, "called"); - *out_size = m_impl->GetSize(); - R_SUCCEED(); - } - - Result GetHandle(Out out_size, OutCopyHandle out_handle) { - LOG_INFO(Service_AM, "called"); - *out_size = m_impl->GetSize(); - *out_handle = m_impl->GetHandle(); - R_SUCCEED(); - } - - std::optional 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 m_impl; -}; - -std::optional 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 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&& data) diff --git a/src/core/hle/service/am/service/storage.h b/src/core/hle/service/am/service/storage.h index 63b7a0ad4c..462c823206 100644 --- a/src/core/hle/service/am/service/storage.h +++ b/src/core/hle/service/am/service/storage.h @@ -32,7 +32,6 @@ private: Result OpenTransferStorage( Out> out_transfer_storage_accessor); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_impl; }; diff --git a/src/core/hle/service/am/service/storage_accessor.cpp b/src/core/hle/service/am/service/storage_accessor.cpp new file mode 100644 index 0000000000..2fe379a74d --- /dev/null +++ b/src/core/hle/service/am/service/storage_accessor.cpp @@ -0,0 +1,71 @@ +// 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/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 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 out_size) { + LOG_DEBUG(Service_AM, "called"); + *out_size = m_impl->GetSize(); + R_SUCCEED(); +} + +Result IStorageAccessor::Write(InBuffer 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 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 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 out_size) { + LOG_DEBUG(Service_AM, "called"); + *out_size = m_impl->GetSize(); + R_SUCCEED(); +} + +Result ITransferStorageAccessor::GetHandle(Out out_size, + OutCopyHandle 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 new file mode 100644 index 0000000000..76af3de363 --- /dev/null +++ b/src/core/hle/service/am/service/storage_accessor.h @@ -0,0 +1,41 @@ +// 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/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 { +public: + explicit IStorageAccessor(Core::System& system_, std::shared_ptr impl); + ~IStorageAccessor() override; + +private: + Result GetSize(Out out_size); + Result Write(InBuffer buffer, s64 offset); + Result Read(OutBuffer out_buffer, s64 offset); + + const std::shared_ptr m_impl; +}; + +class ITransferStorageAccessor final : public ServiceFramework { +public: + explicit ITransferStorageAccessor(Core::System& system_, + std::shared_ptr impl); + ~ITransferStorageAccessor() override; + +private: + Result GetSize(Out out_size); + Result GetHandle(Out out_size, OutCopyHandle out_handle); + + const std::shared_ptr 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 new file mode 100644 index 0000000000..bb56750d09 --- /dev/null +++ b/src/core/hle/service/am/service/system_applet_proxy.cpp @@ -0,0 +1,136 @@ +// 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/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, + 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> out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetDisplayController( + Out> out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetProcessWindingController( + Out> out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetDebugFunctions( + Out> out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetWindowController( + Out> out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetSelfController( + Out> out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetCommonStateGetter( + Out> out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetLibraryAppletCreator( + Out> out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetApplicationCreator( + Out> out_application_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_application_creator = std::make_shared(system, m_window_system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetAppletCommonFunctions( + Out> out_applet_common_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_applet_common_functions = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetHomeMenuFunctions( + Out> out_home_menu_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_home_menu_functions = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetGlobalStateController( + Out> out_global_state_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_global_state_controller = std::make_shared(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 new file mode 100644 index 0000000000..76cef507a5 --- /dev/null +++ b/src/core/hle/service/am/service/system_applet_proxy.h @@ -0,0 +1,58 @@ +// 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; +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 { +public: + explicit ISystemAppletProxy(Core::System& system, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system); + ~ISystemAppletProxy(); + +private: + Result GetCommonStateGetter(Out> out_common_state_getter); + Result GetSelfController(Out> out_self_controller); + Result GetWindowController(Out> out_window_controller); + Result GetAudioController(Out> out_audio_controller); + Result GetDisplayController(Out> out_display_controller); + Result GetProcessWindingController( + Out> out_process_winding_controller); + Result GetDebugFunctions(Out> out_debug_functions); + Result GetLibraryAppletCreator( + Out> out_library_applet_creator); + Result GetApplicationCreator(Out> out_application_creator); + Result GetAppletCommonFunctions( + Out> out_applet_common_functions); + Result GetHomeMenuFunctions(Out> out_home_menu_functions); + Result GetGlobalStateController( + Out> out_global_state_controller); + + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr 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 d07aba0c79..f2b9dccb27 100644 --- a/src/core/hle/service/am/service/window_controller.cpp +++ b/src/core/hle/service/am/service/window_controller.cpp @@ -12,24 +12,24 @@ namespace Service::AM { -std::optional 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, 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 29fd723421..51a67f3039 100644 --- a/src/core/hle/service/am/service/window_controller.h +++ b/src/core/hle/service/am/service/window_controller.h @@ -29,7 +29,6 @@ private: Result SetAppletWindowVisibility(bool visible); Result SetAppletGpuTimeSlice(s64 time_slice); - std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; const std::shared_ptr 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 0222d9c52b..be2aa34baa 100644 --- a/src/core/hle/service/aoc/addon_content_manager.cpp +++ b/src/core/hle/service/aoc/addon_content_manager.cpp @@ -28,34 +28,6 @@ namespace Service::AOC { -std::optional 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; } @@ -85,6 +57,35 @@ static std::vector 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 8ddb86cf19..b505525590 100644 --- a/src/core/hle/service/aoc/addon_content_manager.h +++ b/src/core/hle/service/aoc/addon_content_manager.h @@ -43,9 +43,9 @@ public: OutInterface out_interface); private: - std::optional FindRequest(u32 key) override; std::vector 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 eded803b25..64e1244967 100644 --- a/src/core/hle/service/aoc/purchase_event_manager.cpp +++ b/src/core/hle/service/aoc/purchase_event_manager.cpp @@ -11,20 +11,21 @@ namespace Service::AOC { constexpr Result ResultNoPurchasedProductInfoAvailable{ErrorModule::NIMShop, 400}; -std::optional 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"} { + : 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); + 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 d11089e567..c0bdfaf242 100644 --- a/src/core/hle/service/aoc/purchase_event_manager.h +++ b/src/core/hle/service/aoc/purchase_event_manager.h @@ -25,8 +25,6 @@ public: Result PopPurchasedProductInfo(); Result PopPurchasedProductInfoWithUid(); - std::optional FindRequest(u32 key) override; - private: KernelHelpers::ServiceContext service_context; Kernel::KEvent* purchased_event; diff --git a/src/core/hle/service/apm/apm.h b/src/core/hle/service/apm/apm.h index e188b4e446..265e581697 100644 --- a/src/core/hle/service/apm/apm.h +++ b/src/core/hle/service/apm/apm.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 diff --git a/src/core/hle/service/apm/apm_controller.h b/src/core/hle/service/apm/apm_controller.h index 3357b7762a..c2f65a2f0e 100644 --- a/src/core/hle/service/apm/apm_controller.h +++ b/src/core/hle/service/apm/apm_controller.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 diff --git a/src/core/hle/service/apm/apm_interface.cpp b/src/core/hle/service/apm/apm_interface.cpp index 2b4768478e..51c01e2f25 100644 --- a/src/core/hle/service/apm/apm_interface.cpp +++ b/src/core/hle/service/apm/apm_interface.cpp @@ -14,7 +14,15 @@ namespace Service::APM { class ISession final : public ServiceFramework { public: - explicit ISession(Core::System& system_, Controller& controller_) : ServiceFramework{system_, "ISession"}, controller{controller_} {} + 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); + } private: void SetPerformanceConfiguration(HLERequestContext& ctx) { @@ -53,20 +61,18 @@ private: rb.Push(ResultSuccess); } - std::optional 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 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; @@ -96,6 +102,20 @@ 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 0bbcd185a3..eeac3474b0 100644 --- a/src/core/hle/service/apm/apm_interface.h +++ b/src/core/hle/service/apm/apm_interface.h @@ -24,14 +24,6 @@ private: void GetPerformanceMode(HLERequestContext& ctx); void IsCpuOverclockEnabled(HLERequestContext& ctx); - std::optional 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 apm; Controller& controller; }; @@ -47,19 +39,6 @@ private: void GetPerformanceEvent(HLERequestContext& ctx); void GetCurrentPerformanceConfiguration(HLERequestContext& ctx); - std::optional 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 6177efd46c..fde766a275 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 { public: explicit IAudioOutManagerForApplet(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class IAudioSnoopManager final : public ServiceFramework { public: explicit IAudioSnoopManager(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class IAudioInManagerForApplet final : public ServiceFramework { public: explicit IAudioInManagerForApplet(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class IAudioRendererManagerForApplet final : public ServiceFramework { public: explicit IAudioRendererManagerForApplet(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class IAudioOutManagerForDebugger final : public ServiceFramework { public: explicit IAudioOutManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audout:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audout:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioInManagerForDebugger final : public ServiceFramework { public: explicit IAudioInManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audin:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audin:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IFinalOutputRecorderManagerForDebugger final : public ServiceFramework { public: explicit IFinalOutputRecorderManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audrec:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audrec:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioRendererManagerForDebugger final : public ServiceFramework { public: explicit IAudioRendererManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audren:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audren:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioSystemManagerForApplet final : public ServiceFramework { public: explicit IAudioSystemManagerForApplet(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class IAudioSystemManagerForDebugger final : public ServiceFramework { public: explicit IAudioSystemManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "aud:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspendAudioForDebug"}, - FunctionInfo{1, nullptr, "RequestResumeAudioForDebug"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "aud:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspendAudioForDebug"}, + {1, nullptr, "RequestResumeAudioForDebug"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/audio/audio.h b/src/core/hle/service/audio/audio.h index d70f022c73..eb8f482690 100644 --- a/src/core/hle/service/audio/audio.h +++ b/src/core/hle/service/audio/audio.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 diff --git a/src/core/hle/service/audio/audio_controller.cpp b/src/core/hle/service/audio/audio_controller.cpp index d912a5e86a..9e2db4a84c 100644 --- a/src/core/hle/service/audio/audio_controller.cpp +++ b/src/core/hle/service/audio/audio_controller.cpp @@ -1,9 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -// 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 @@ -20,75 +17,77 @@ namespace Service::Audio { -std::optional 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"} { - m_set_sys = system.ServiceManager().GetService("set:sys", true); + // 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("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 e5c615fa21..a30b572ac7 100644 --- a/src/core/hle/service/audio/audio_controller.h +++ b/src/core/hle/service/audio/audio_controller.h @@ -59,8 +59,8 @@ private: Result AcquireTargetNotification(OutCopyHandle out_notification_event); Result Unknown5000(Out> out_audio_controller); - std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; + Kernel::KEvent* notification_event; std::shared_ptr m_set_sys; std::array 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 fc24bf3ccd..e9f7e074a1 100644 --- a/src/core/hle/service/audio/audio_device.cpp +++ b/src/core/hle/service/audio/audio_device.cpp @@ -12,38 +12,36 @@ namespace Service::Audio { using namespace AudioCore::Renderer; -std::optional 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(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 bd0aaa5f7c..f6c12fbfeb 100644 --- a/src/core/hle/service/audio/audio_device.h +++ b/src/core/hle/service/audio/audio_device.h @@ -55,7 +55,6 @@ private: Result SetAudioDeviceOutputVolumeAutoTuneEnabled(bool enabled); Result IsAudioDeviceOutputVolumeAutoTuneEnabled(Out out_enabled); - std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; std::unique_ptr 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 068574dbd2..6208c2d104 100644 --- a/src/core/hle/service/audio/audio_in.cpp +++ b/src/core/hle/service/audio/audio_in.cpp @@ -11,33 +11,35 @@ namespace Service::Audio { using namespace AudioCore::AudioIn; -std::optional 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(system_, manager, event, session_id)} -{ + : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"}, + event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared(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); + 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 dd7a41f300..793d2b3ad4 100644 --- a/src/core/hle/service/audio/audio_in.h +++ b/src/core/hle/service/audio/audio_in.h @@ -46,7 +46,6 @@ public: Result FlushAudioInBuffers(Out out_flushed); private: - std::optional 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 422e72148b..fccfe38b3b 100644 --- a/src/core/hle/service/audio/audio_in_manager.cpp +++ b/src/core/hle/service/audio/audio_in_manager.cpp @@ -12,22 +12,22 @@ namespace Service::Audio { using namespace AudioCore::AudioIn; -std::optional 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(system_)} -{} + : ServiceFramework{system_, "audin:u"}, impl{std::make_unique( + 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); +} IAudioInManager::~IAudioInManager() = default; diff --git a/src/core/hle/service/audio/audio_in_manager.h b/src/core/hle/service/audio/audio_in_manager.h index 0ee0badba7..d8f63972c3 100644 --- a/src/core/hle/service/audio/audio_in_manager.h +++ b/src/core/hle/service/audio/audio_in_manager.h @@ -54,7 +54,6 @@ private: AudioCore::AudioIn::AudioInParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; std::unique_ptr impl; }; diff --git a/src/core/hle/service/audio/audio_out.cpp b/src/core/hle/service/audio/audio_out.cpp index a5f06faab8..996eeede58 100644 --- a/src/core/hle/service/audio/audio_out.cpp +++ b/src/core/hle/service/audio/audio_out.cpp @@ -15,26 +15,6 @@ namespace Service::Audio { using namespace AudioCore::AudioOut; -std::optional 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) @@ -42,6 +22,26 @@ IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id, event{service_context.CreateEvent("AudioOutEvent")}, process{handle}, impl{std::make_shared(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 311eb84afe..178ee57df6 100644 --- a/src/core/hle/service/audio/audio_out.h +++ b/src/core/hle/service/audio/audio_out.h @@ -52,8 +52,6 @@ public: Result GetAudioOutVolume(Out out_volume); private: - std::optional 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 9f24bc3513..3b2087932c 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 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 4c71c12cdf..ec974aaba4 100644 --- a/src/core/hle/service/audio/audio_out_manager.h +++ b/src/core/hle/service/audio/audio_out_manager.h @@ -43,7 +43,6 @@ private: AudioCore::AudioOut::AudioOutParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; std::optional impl; }; diff --git a/src/core/hle/service/audio/audio_renderer.cpp b/src/core/hle/service/audio/audio_renderer.cpp index bcb2adaf61..dd76544094 100644 --- a/src/core/hle/service/audio/audio_renderer.cpp +++ b/src/core/hle/service/audio/audio_renderer.cpp @@ -10,37 +10,38 @@ namespace Service::Audio { using namespace AudioCore::Renderer; -std::optional 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(system_, manager, rendered_event)} - , process_handle{process_handle_} { + : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}, + rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}, + impl{std::make_unique(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); + 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 e03fc6551d..7f4ea9a662 100644 --- a/src/core/hle/service/audio/audio_renderer.h +++ b/src/core/hle/service/audio/audio_renderer.h @@ -45,7 +45,6 @@ private: Result SetVoiceDropParameter(f32 voice_drop_parameter); Result GetVoiceDropParameter(Out out_voice_drop_parameter); - std::optional 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 98701c79c1..4756802eeb 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 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 bd3ea06326..fdce8b6ffa 100644 --- a/src/core/hle/service/audio/audio_renderer_manager.h +++ b/src/core/hle/service/audio/audio_renderer_manager.h @@ -33,7 +33,6 @@ private: Result GetAudioDeviceServiceWithRevisionInfo(Out> out_audio_device, u32 revision, ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; std::optional 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 9c51613de6..2bc9d29e3e 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager.cpp +++ b/src/core/hle/service/audio/final_output_recorder_manager.cpp @@ -11,29 +11,34 @@ namespace Service::Audio { class IFinalOutputRecorder final : public ServiceFramework { public: explicit IFinalOutputRecorder(Core::System& system_) - : ServiceFramework{system_, "IFinalOutputRecorder"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(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 ee392b2ada..833c621be7 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager.h +++ b/src/core/hle/service/audio/final_output_recorder_manager.h @@ -18,13 +18,6 @@ class IFinalOutputRecorderManager final : public ServiceFramework 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 42c08d90ec..dc2ea63aa0 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 @@ -10,6 +10,14 @@ 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 7beaa888ff..32efb75b5e 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 @@ -19,14 +19,6 @@ class IFinalOutputRecorderManagerForApplet final public: explicit IFinalOutputRecorderManagerForApplet(Core::System& system_); ~IFinalOutputRecorderManagerForApplet() override; - - std::optional 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 f0dde63e14..14888afa0d 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder.cpp +++ b/src/core/hle/service/audio/hardware_opus_decoder.cpp @@ -11,25 +11,25 @@ namespace Service::Audio { using namespace AudioCore::OpusDecoder; - std::optional 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(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 9f9b17bc81..5297572da8 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder.h +++ b/src/core/hle/service/audio/hardware_opus_decoder.h @@ -58,7 +58,6 @@ private: Out out_data_size, Out out_sample_count, Out out_time_taken, InBuffer opus_data, bool reset); - std::optional FindRequest(u32 key) override; std::unique_ptr impl; Common::ScratchBuffer 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 3000ba8c60..b89e210012 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp +++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp @@ -12,24 +12,23 @@ namespace Service::Audio { using namespace AudioCore::OpusDecoder; -std::optional 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 1dbac9addb..4dd211e232 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder_manager.h +++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.h @@ -49,7 +49,6 @@ private: Result GetWorkBufferSizeForMultiStreamExEx( Out out_size, InLargeData params); - std::optional FindRequest(u32 key) override; Core::System& system; AudioCore::OpusDecoder::OpusDecoderManager impl; }; diff --git a/src/core/hle/service/bcat/bcat.h b/src/core/hle/service/bcat/bcat.h index 2aaffc693b..65961baffe 100644 --- a/src/core/hle/service/bcat/bcat.h +++ b/src/core/hle/service/bcat/bcat.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 diff --git a/src/core/hle/service/bcat/bcat_result.h b/src/core/hle/service/bcat/bcat_result.h index edf8a65641..c6fa1b4e26 100644 --- a/src/core/hle/service/bcat/bcat_result.h +++ b/src/core/hle/service/bcat/bcat_result.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 diff --git a/src/core/hle/service/bcat/bcat_service.cpp b/src/core/hle/service/bcat/bcat_service.cpp index 85f262f6eb..bc2a3e3457 100644 --- a/src/core/hle/service/bcat/bcat_service.cpp +++ b/src/core/hle/service/bcat/bcat_service.cpp @@ -24,45 +24,44 @@ static u64 GetCurrentBuildID(const Core::System::CurrentBuildProcessID& id) { return out; } -std::optional 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"}, - }} -{} + : 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); +} IBcatService::~IBcatService() = default; diff --git a/src/core/hle/service/bcat/bcat_service.h b/src/core/hle/service/bcat/bcat_service.h index ed95f021d0..5e11059a78 100644 --- a/src/core/hle/service/bcat/bcat_service.h +++ b/src/core/hle/service/bcat/bcat_service.h @@ -41,7 +41,6 @@ private: ProgressServiceBackend& GetProgressBackend(SyncType type); const ProgressServiceBackend& GetProgressBackend(SyncType type) const; - std::optional FindRequest(u32 key) override; BcatBackend& backend; u64 program_id; std::array(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 0d464a2fdc..8ead0bae99 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 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 af90680390..cea67b0d87 100644 --- a/src/core/hle/service/bcat/delivery_cache_directory_service.h +++ b/src/core/hle/service/bcat/delivery_cache_directory_service.h @@ -29,7 +29,6 @@ private: OutArray out_buffer); Result GetCount(Out out_count); - std::optional 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 d9b6ff77ee..1d961e1655 100644 --- a/src/core/hle/service/bcat/delivery_cache_file_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_file_service.cpp @@ -12,19 +12,19 @@ namespace Service::BCAT { -std::optional 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 176c8eb3e5..911bda55b3 100644 --- a/src/core/hle/service/bcat/delivery_cache_file_service.h +++ b/src/core/hle/service/bcat/delivery_cache_file_service.h @@ -29,7 +29,6 @@ private: Result GetSize(Out out_size); Result GetDigest(Out out_digest); - std::optional 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 4de42dd580..873977bf90 100644 --- a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp @@ -10,18 +10,18 @@ namespace Service::BCAT { -std::optional 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 88f49cea85..83d4d35827 100644 --- a/src/core/hle/service/bcat/delivery_cache_progress_service.h +++ b/src/core/hle/service/bcat/delivery_cache_progress_service.h @@ -31,7 +31,6 @@ private: Result GetEvent(OutCopyHandle out_event); Result GetImpl(OutLargeData out_impl); - std::optional 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 67dc857642..a363bcb2d1 100644 --- a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp @@ -12,18 +12,18 @@ namespace Service::BCAT { -std::optional 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 b30f24fb47..4849e58047 100644 --- a/src/core/hle/service/bcat/delivery_cache_storage_service.h +++ b/src/core/hle/service/bcat/delivery_cache_storage_service.h @@ -31,7 +31,6 @@ private: Out out_directory_count, OutArray out_directories); - std::optional FindRequest(u32 key) override; FileSys::VirtualDir root; std::vector entries; std::size_t next_read_index = 0; diff --git a/src/core/hle/service/bcat/news/builtin_news.h b/src/core/hle/service/bcat/news/builtin_news.h index cb06b2d4e3..e47cc89588 100644 --- a/src/core/hle/service/bcat/news/builtin_news.h +++ b/src/core/hle/service/bcat/news/builtin_news.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 #pragma once diff --git a/src/core/hle/service/bcat/news/msgpack.cpp b/src/core/hle/service/bcat/news/msgpack.cpp index b67b75ea9d..9cea2de522 100644 --- a/src/core/hle/service/bcat/news/msgpack.cpp +++ b/src/core/hle/service/bcat/news/msgpack.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 #include "core/hle/service/bcat/news/msgpack.h" diff --git a/src/core/hle/service/bcat/news/msgpack.h b/src/core/hle/service/bcat/news/msgpack.h index a7a2aa40ba..3163689782 100644 --- a/src/core/hle/service/bcat/news/msgpack.h +++ b/src/core/hle/service/bcat/news/msgpack.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 #pragma once 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 57d71c49d8..b60de3b1f5 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 @@ -9,16 +9,17 @@ namespace Service::News { -std::optional 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"} { + : ServiceFramework{system_, "INewlyArrivedEventHolder"}, service_context{ + system_, + "INewlyArrivedEventHolder"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&INewlyArrivedEventHolder::Get>, "Get"}, + }; + // clang-format on + + RegisterHandlers(functions); 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 fccc8d6e55..5c2aeec182 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 @@ -29,7 +29,6 @@ public: private: Result Get(OutCopyHandle out_event); - std::optional 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 f5de93db49..200d00e785 100644 --- a/src/core/hle/service/bcat/news/news_data_service.cpp +++ b/src/core/hle/service/bcat/news/news_data_service.cpp @@ -24,19 +24,16 @@ std::string_view ToStringView(std::span buf) { } // namespace -std::optional 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 8ce10c045d..45fe4bafcc 100644 --- a/src/core/hle/service/bcat/news/news_data_service.h +++ b/src/core/hle/service/bcat/news/news_data_service.h @@ -31,7 +31,6 @@ private: Result Read(Out out_size, s64 offset, OutBuffer out_buffer); Result GetSize(Out out_size); - std::optional FindRequest(u32 key) override; std::vector 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 08fdfcb58b..27ca1ad378 100644 --- a/src/core/hle/service/bcat/news/news_database_service.cpp +++ b/src/core/hle/service/bcat/news/news_database_service.cpp @@ -45,21 +45,18 @@ bool UpdateField(NewsRecord& rec, std::string_view column, s32 value, bool addit } // namespace -std::optional 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 0a097b97bc..7552da23de 100644 --- a/src/core/hle/service/bcat/news/news_database_service.h +++ b/src/core/hle/service/bcat/news/news_database_service.h @@ -49,8 +49,6 @@ private: InBuffer where_phrase, InBuffer order_by_phrase, s32 offset); - - std::optional 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 7cb931896c..4dcaa14881 100644 --- a/src/core/hle/service/bcat/news/news_service.cpp +++ b/src/core/hle/service/bcat/news/news_service.cpp @@ -12,32 +12,32 @@ namespace Service::News { -std::optional 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 577147e604..5d6109243b 100644 --- a/src/core/hle/service/bcat/news/news_service.h +++ b/src/core/hle/service/bcat/news/news_service.h @@ -22,15 +22,22 @@ public: private: Result PostLocalNews(InBuffer buffer_data); + Result SetPassphrase(InBuffer buffer_data); + Result GetSubscriptionStatus(Out out_status, InBuffer buffer_data); + Result GetTopicList(Out out_count, OutBuffer out_topics, s32 filter); + Result IsSystemUpdateRequired(Out out_is_system_update_required); + Result RequestAutoSubscription(u64 value); + Result ClearStorage(); + Result ClearSubscriptionStatusAll(); + Result GetNewsDatabaseDump(); - std::optional FindRequest(u32 key) override; }; } // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_storage.cpp b/src/core/hle/service/bcat/news/news_storage.cpp index 793c1fa94f..b65b680771 100644 --- a/src/core/hle/service/bcat/news/news_storage.cpp +++ b/src/core/hle/service/bcat/news/news_storage.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 #include "core/hle/service/bcat/news/news_storage.h" 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 a6b3029e83..08449f1c4a 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp @@ -9,16 +9,16 @@ namespace Service::News { -std::optional 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"} { + : ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{system_, + "IOverwriteEventHolder"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IOverwriteEventHolder::Get>, "Get"}, + }; + // clang-format on + + RegisterHandlers(functions); 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 ba52a36527..507f6ab668 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.h +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.h @@ -29,7 +29,6 @@ public: private: Result Get(OutCopyHandle out_event); - std::optional 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 66e3b1277e..f27e4e52e6 100644 --- a/src/core/hle/service/bcat/news/service_creator.cpp +++ b/src/core/hle/service/bcat/news/service_creator.cpp @@ -14,19 +14,19 @@ namespace Service::News { -std::optional 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 a87f30b67e..42fbccd2a0 100644 --- a/src/core/hle/service/bcat/news/service_creator.h +++ b/src/core/hle/service/bcat/news/service_creator.h @@ -32,7 +32,6 @@ private: Result CreateNewsDatabaseService(OutInterface out_interface); Result CreateOverwriteEventHolder(OutInterface out_interface); - std::optional 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 83f97bb17a..15f59d3056 100644 --- a/src/core/hle/service/bcat/service_creator.cpp +++ b/src/core/hle/service/bcat/service_creator.cpp @@ -13,17 +13,6 @@ namespace Service::BCAT { -std::optional 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 CreateBackendFromSettings([[maybe_unused]] Core::System& system, DirectoryGetter getter) { return std::make_unique(std::move(getter)); @@ -31,7 +20,20 @@ std::unique_ptr CreateBackendFromSettings([[maybe_unused]] Core::Sy IServiceCreator::IServiceCreator(Core::System& system_, const char* name_) : ServiceFramework{system_, name_}, fsc{system.GetFileSystemController()} { - backend = CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); }); + // 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); }); } IServiceCreator::~IServiceCreator() = default; diff --git a/src/core/hle/service/bcat/service_creator.h b/src/core/hle/service/bcat/service_creator.h index 02527574dc..2245007d6c 100644 --- a/src/core/hle/service/bcat/service_creator.h +++ b/src/core/hle/service/bcat/service_creator.h @@ -36,7 +36,6 @@ private: Result CreateDeliveryCacheStorageServiceWithApplicationId( u64 application_id, OutInterface out_interface); - std::optional FindRequest(u32 key) override; std::unique_ptr backend; Service::FileSystem::FileSystemController& fsc; }; diff --git a/src/core/hle/service/bpc/bpc.cpp b/src/core/hle/service/bpc/bpc.cpp index 7c31cd190d..6f2e00b22b 100644 --- a/src/core/hle/service/bpc/bpc.cpp +++ b/src/core/hle/service/bpc/bpc.cpp @@ -14,101 +14,103 @@ namespace Service::BPC { class BPC final : public ServiceFramework { public: - explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class BPC_R final : public ServiceFramework { public: - explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class BPC_C final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class BPC_B final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class BPC_W final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class BPC_AMS final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; diff --git a/src/core/hle/service/bpc/bpc.h b/src/core/hle/service/bpc/bpc.h index 524391ddb5..bf13ce5bae 100644 --- a/src/core/hle/service/bpc/bpc.h +++ b/src/core/hle/service/bpc/bpc.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 diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp index 913c9475e9..256a722a84 100644 --- a/src/core/hle/service/btdrv/btdrv.cpp +++ b/src/core/hle/service/btdrv/btdrv.cpp @@ -20,13 +20,24 @@ namespace Service::BtDrv { class IBluetoothUser final : public ServiceFramework { public: explicit IBluetoothUser(Core::System& system_) - : ServiceFramework{system_, "bt"} - , service_context{system_, "bt"} { - register_event = service_context.CreateEvent("BT:RegisterEvent"); - } + : 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); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + register_event = service_context.CreateEvent("BT:RegisterEvent"); } ~IBluetoothUser() override { @@ -41,28 +52,151 @@ 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 { public: - explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -70,140 +204,6 @@ 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/btdrv/btdrv.h b/src/core/hle/service/btdrv/btdrv.h index 42713860e6..4e739a96e3 100644 --- a/src/core/hle/service/btdrv/btdrv.h +++ b/src/core/hle/service/btdrv/btdrv.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 diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp index e8fa29af7c..b358387ffe 100644 --- a/src/core/hle/service/btm/btm.cpp +++ b/src/core/hle/service/btm/btm.cpp @@ -6,414 +6,111 @@ #include -#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 { -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("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 out_is_enabled) { - LOG_DEBUG(Service_BTM, "called"); - - R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled)); - } - - Result AcquireRadioEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &radio_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result GetDiscoveredAudioDevice(OutArray, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out out_total) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - R_SUCCEED(); - } - - Result AcquireAudioDeviceConnectionEvent( - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_event = &audio_device_connection_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result GetConnectedAudioDevices( - Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_count = 0; - R_SUCCEED(); - } - - Result GetPairedAudioDevices( - Out out_count, OutArray, 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 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 m_set_sys; -}; - -class IBtmSystem final : public ServiceFramework { -public: - explicit IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} {} - ~IBtmSystem() override = default; - - Result GetCore(OutInterface out_interface) { - LOG_WARNING(Service_BTM, "called"); - - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IBtmSystem::GetCore>, "GetCore"} - ); -}; - -class IBtmUserCore final : public ServiceFramework { -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 out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &scan_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result AcquireBleConnectionEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &connection_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result AcquireBleServiceDiscoveryEvent( - Out out_is_valid, OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &service_discovery_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result AcquireBleMtuConfigEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &config_event->GetReadableEvent(); - R_SUCCEED(); - } - - std::optional 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 { -public: - explicit IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} {} - ~IBtmUser() override = default; - - Result GetCore(OutInterface out_interface) { - LOG_WARNING(Service_BTM, "called"); - - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IBtmUser::GetCore>, "GetCore"} - ); -}; - -class IBtmDebug final : public ServiceFramework { -public: - explicit IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} {} - ~IBtmDebug() override = default; - std::optional 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 { public: - explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/btm/btm.h b/src/core/hle/service/btm/btm.h index 0bf77d053e..902a61d8cc 100644 --- a/src/core/hle/service/btm/btm.h +++ b/src/core/hle/service/btm/btm.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 diff --git a/src/core/hle/service/btm/btm_debug.cpp b/src/core/hle/service/btm/btm_debug.cpp new file mode 100644 index 0000000000..abbe7d4832 --- /dev/null +++ b/src/core/hle/service/btm/btm_debug.cpp @@ -0,0 +1,40 @@ +// 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 "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 new file mode 100644 index 0000000000..fad760d674 --- /dev/null +++ b/src/core/hle/service/btm/btm_debug.h @@ -0,0 +1,24 @@ +// 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/service.h" + +namespace Core { +class System; +} + +namespace Service::BTM { + +class IBtmDebug final : public ServiceFramework { +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 new file mode 100644 index 0000000000..1684b0193e --- /dev/null +++ b/src/core/hle/service/btm/btm_system.cpp @@ -0,0 +1,34 @@ +// 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 out_interface) { + LOG_WARNING(Service_BTM, "called"); + + *out_interface = std::make_shared(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 new file mode 100644 index 0000000000..9755540204 --- /dev/null +++ b/src/core/hle/service/btm/btm_system.h @@ -0,0 +1,28 @@ +// 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/service.h" + +namespace Core { +class System; +} + +namespace Service::BTM { +class IBtmSystemCore; + +class IBtmSystem final : public ServiceFramework { +public: + explicit IBtmSystem(Core::System& system_); + ~IBtmSystem() override; + +private: + Result GetCore(OutInterface 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 new file mode 100644 index 0000000000..318657fc32 --- /dev/null +++ b/src/core/hle/service/btm/btm_system_core.cpp @@ -0,0 +1,135 @@ +// 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("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 out_is_enabled) { + LOG_DEBUG(Service_BTM, "called"); + + R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled)); +} + +Result IBtmSystemCore::AcquireRadioEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &radio_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmSystemCore::GetDiscoveredAudioDevice(OutArray, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out out_total) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + R_SUCCEED(); +} + +Result IBtmSystemCore::AcquireAudioDeviceConnectionEvent( + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_event = &audio_device_connection_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmSystemCore::GetConnectedAudioDevices( + Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_count = 0; + R_SUCCEED(); +} + +Result IBtmSystemCore::GetPairedAudioDevices( + Out out_count, OutArray, 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 new file mode 100644 index 0000000000..3fc4c0d56c --- /dev/null +++ b/src/core/hle/service/btm/btm_system_core.h @@ -0,0 +1,62 @@ +// 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 { +public: + explicit IBtmSystemCore(Core::System& system_); + ~IBtmSystemCore() override; + +private: + Result StartGamepadPairing(); + Result CancelGamepadPairing(); + Result EnableRadio(); + Result DisableRadio(); + Result IsRadioEnabled(Out out_is_enabled); + + Result AcquireRadioEvent(Out out_is_valid, OutCopyHandle out_event); + Result GetDiscoveredAudioDevice(OutArray, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out out_total); + Result AcquireAudioDeviceConnectionEvent(OutCopyHandle out_event); + + Result GetConnectedAudioDevices( + Out out_count, + OutArray, BufferAttr_HipcPointer> out_audio_devices); + + Result GetPairedAudioDevices( + Out out_count, + OutArray, 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 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 new file mode 100644 index 0000000000..c380c573fa --- /dev/null +++ b/src/core/hle/service/btm/btm_user.cpp @@ -0,0 +1,33 @@ +// 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 out_interface) { + LOG_WARNING(Service_BTM, "called"); + + *out_interface = std::make_shared(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 new file mode 100644 index 0000000000..d6cf330ed6 --- /dev/null +++ b/src/core/hle/service/btm/btm_user.h @@ -0,0 +1,28 @@ +// 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/service.h" + +namespace Core { +class System; +} + +namespace Service::BTM { +class IBtmUserCore; + +class IBtmUser final : public ServiceFramework { +public: + explicit IBtmUser(Core::System& system_); + ~IBtmUser() override; + +private: + Result GetCore(OutInterface 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 new file mode 100644 index 0000000000..b120df14c0 --- /dev/null +++ b/src/core/hle/service/btm/btm_user_core.cpp @@ -0,0 +1,106 @@ +// 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 + +#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 out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &scan_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmUserCore::AcquireBleConnectionEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &connection_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmUserCore::AcquireBleServiceDiscoveryEvent( + Out out_is_valid, OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &service_discovery_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmUserCore::AcquireBleMtuConfigEvent(Out out_is_valid, + OutCopyHandle 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 new file mode 100644 index 0000000000..5a565a5897 --- /dev/null +++ b/src/core/hle/service/btm/btm_user_core.h @@ -0,0 +1,50 @@ +// 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::BTM { + +class IBtmUserCore final : public ServiceFramework { +public: + explicit IBtmUserCore(Core::System& system_); + ~IBtmUserCore() override; + +private: + Result AcquireBleScanEvent(Out out_is_valid, + OutCopyHandle out_event); + + Result AcquireBleConnectionEvent(Out out_is_valid, + OutCopyHandle out_event); + + Result AcquireBleServiceDiscoveryEvent(Out out_is_valid, + OutCopyHandle out_event); + + Result AcquireBleMtuConfigEvent(Out out_is_valid, + OutCopyHandle 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 6cc37999f3..f07fbd2185 100644 --- a/src/core/hle/service/caps/caps.cpp +++ b/src/core/hle/service/caps/caps.cpp @@ -5,6 +5,7 @@ // 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" @@ -13,223 +14,24 @@ #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 { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; -class IAlbumAccessorService final : public ServiceFramework { -public: - explicit IAlbumAccessorService(Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:a"}, manager{album_manager} {} - ~IAlbumAccessorService() override = default; - - Result GetAlbumFileList( - Out out_count, AlbumStorage storage, - OutArray 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 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 out_buffer_size, - OutArray out_buffer) { - LOG_WARNING(Service_Capture, "(STUBBED) called"); - *out_buffer_size = 0; - R_SUCCEED(); - } - - Result GetAlbumFileListEx0( - Out out_entries_size, AlbumStorage storage, u8 flags, - OutArray 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 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 out_image_output, - OutArray out_image, - OutArray 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 out_image_output, - OutArray out_image, - OutArray 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 out_result) { - LOG_WARNING(Service_Capture, "(STUBBED) called"); - *out_result = ResultSuccess; - R_SUCCEED(); - } - - std::optional 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 manager = nullptr; -}; - void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); auto album_manager = std::make_shared(system); diff --git a/src/core/hle/service/caps/caps.h b/src/core/hle/service/caps/caps.h index 58e9725b85..670ee59cda 100644 --- a/src/core/hle/service/caps/caps.h +++ b/src/core/hle/service/caps/caps.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 diff --git a/src/core/hle/service/caps/caps_a.cpp b/src/core/hle/service/caps/caps_a.cpp new file mode 100644 index 0000000000..8f561bfcdc --- /dev/null +++ b/src/core/hle/service/caps/caps_a.cpp @@ -0,0 +1,211 @@ +// 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 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 out_count, AlbumStorage storage, + OutArray 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 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 out_buffer_size, + OutArray out_buffer) { + LOG_WARNING(Service_Capture, "(STUBBED) called"); + *out_buffer_size = 0; + R_SUCCEED(); +} + +Result IAlbumAccessorService::GetAlbumFileListEx0( + Out out_entries_size, AlbumStorage storage, u8 flags, + OutArray 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 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 out_image_output, + OutArray out_image, + OutArray 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 out_image_output, + OutArray out_image, + OutArray 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 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 new file mode 100644 index 0000000000..c6aa8f9210 --- /dev/null +++ b/src/core/hle/service/caps/caps_a.h @@ -0,0 +1,63 @@ +// 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 + +#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 { +public: + explicit IAlbumAccessorService(Core::System& system_, + std::shared_ptr album_manager); + ~IAlbumAccessorService() override; + +private: + Result GetAlbumFileList(Out out_count, AlbumStorage storage, + OutArray out_entries); + + Result DeleteAlbumFile(AlbumFileId file_id); + + Result IsAlbumMounted(Out out_is_mounted, AlbumStorage storage); + + Result Unknown18( + Out out_buffer_size, + OutArray + out_buffer); + + Result GetAlbumFileListEx0(Out out_entries_size, AlbumStorage storage, u8 flags, + OutArray out_entries); + + Result GetAutoSavingStorage(Out out_is_autosaving); + + Result LoadAlbumScreenShotImageEx1( + const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, + OutLargeData out_image_output, + OutArray out_image, + OutArray out_buffer); + + Result LoadAlbumScreenShotThumbnailImageEx1( + const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, + OutLargeData out_image_output, + OutArray out_image, + OutArray out_buffer); + + Result TranslateResult(Result in_result); + + Result GetAlbumAccessResultForDebug(Out out_result); + + std::shared_ptr 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 c62c3cd5d3..6c9f8e964d 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 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 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 a1f19bbfc3..f50de0ee8c 100644 --- a/src/core/hle/service/caps/caps_c.h +++ b/src/core/hle/service/caps/caps_c.h @@ -19,11 +19,14 @@ enum class ShimLibraryVersion : u64; class IAlbumControlService final : public ServiceFramework { public: - explicit IAlbumControlService(Core::System& system_, std::shared_ptr album_manager); + explicit IAlbumControlService(Core::System& system_, + std::shared_ptr album_manager); ~IAlbumControlService() override; + private: - Result SetShimLibraryVersion(ShimLibraryVersion library_version, ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; + Result SetShimLibraryVersion(ShimLibraryVersion library_version, + ClientAppletResourceUserId aruid); + std::shared_ptr manager = nullptr; }; diff --git a/src/core/hle/service/caps/caps_result.h b/src/core/hle/service/caps/caps_result.h index 179ae48409..b7ba2a642d 100644 --- a/src/core/hle/service/caps/caps_result.h +++ b/src/core/hle/service/caps/caps_result.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 diff --git a/src/core/hle/service/caps/caps_sc.cpp b/src/core/hle/service/caps/caps_sc.cpp index 59119d8ed7..92d53da9f5 100644 --- a/src/core/hle/service/caps/caps_sc.cpp +++ b/src/core/hle/service/caps/caps_sc.cpp @@ -10,6 +10,32 @@ 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 422f062e59..72e947bf16 100644 --- a/src/core/hle/service/caps/caps_sc.h +++ b/src/core/hle/service/caps/caps_sc.h @@ -18,32 +18,6 @@ class IScreenShotControlService final : public ServiceFramework 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 0c444116b7..0cd641f551 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 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 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 8817637fb8..78971bde0e 100644 --- a/src/core/hle/service/caps/caps_ss.h +++ b/src/core/hle/service/caps/caps_ss.h @@ -37,7 +37,6 @@ private: const InBuffer thumbnail_image_data_buffer); - std::optional FindRequest(u32 key) override; std::shared_ptr manager; }; diff --git a/src/core/hle/service/caps/caps_su.cpp b/src/core/hle/service/caps/caps_su.cpp index e708ddbb68..4ecfc840e4 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 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 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 0fdc994a25..b7e53007ce 100644 --- a/src/core/hle/service/caps/caps_su.h +++ b/src/core/hle/service/caps/caps_su.h @@ -45,8 +45,8 @@ private: const InBuffer image_data_buffer); - std::optional FindRequest(u32 key) override; std::array image_data; + std::shared_ptr manager; }; diff --git a/src/core/hle/service/caps/caps_u.cpp b/src/core/hle/service/caps/caps_u.cpp index c1fa418e03..6472b2bac6 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 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 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 52e151bbe2..debae97a46 100644 --- a/src/core/hle/service/caps/caps_u.h +++ b/src/core/hle/service/caps/caps_u.h @@ -36,7 +36,6 @@ private: AlbumFileDateTime end_date_time, ClientAppletResourceUserId aruid, OutArray out_entries); - std::optional FindRequest(u32 key) override; std::shared_ptr manager = nullptr; }; diff --git a/src/core/hle/service/cmif_types.h b/src/core/hle/service/cmif_types.h index dad358b87c..783bce7781 100644 --- a/src/core/hle/service/cmif_types.h +++ b/src/core/hle/service/cmif_types.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 diff --git a/src/core/hle/service/erpt/erpt.cpp b/src/core/hle/service/erpt/erpt.cpp index 7bed893bd7..014f1da62f 100644 --- a/src/core/hle/service/erpt/erpt.cpp +++ b/src/core/hle/service/erpt/erpt.cpp @@ -17,10 +17,30 @@ namespace Service::ERPT { class ErrorReportContext final : public ServiceFramework { public: - explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -65,41 +85,21 @@ 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 { public: - explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(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/erpt/erpt.h b/src/core/hle/service/erpt/erpt.h index 60094f556e..456e9af910 100644 --- a/src/core/hle/service/erpt/erpt.h +++ b/src/core/hle/service/erpt/erpt.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 diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp index 01d11183c9..432783f96e 100644 --- a/src/core/hle/service/es/es.cpp +++ b/src/core/hle/service/es/es.cpp @@ -19,14 +19,110 @@ constexpr Result ERROR_INVALID_RIGHTS_ID{ErrorModule::ETicket, 3}; class ETicket final : public ServiceFramework { 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - private: bool CheckRightsId(HLERequestContext& ctx, const u128& rights_id) { if (rights_id == u128{}) { @@ -221,185 +317,89 @@ private: rb.Push(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 { public: explicit NDRM_LU(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class NDRM_LA final : public ServiceFramework { public: explicit NDRM_LA(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; diff --git a/src/core/hle/service/es/es.h b/src/core/hle/service/es/es.h index 3176806252..215aadb98f 100644 --- a/src/core/hle/service/es/es.h +++ b/src/core/hle/service/es/es.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 diff --git a/src/core/hle/service/eupld/eupld.cpp b/src/core/hle/service/eupld/eupld.cpp index ed1e1c19c5..9b26ae9c83 100644 --- a/src/core/hle/service/eupld/eupld.cpp +++ b/src/core/hle/service/eupld/eupld.cpp @@ -14,34 +14,36 @@ namespace Service::EUPLD { class ErrorUploadContext final : public ServiceFramework { public: - explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class ErrorUploadRequest final : public ServiceFramework { public: - explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/eupld/eupld.h b/src/core/hle/service/eupld/eupld.h index 8eb0a5b4f2..851e286733 100644 --- a/src/core/hle/service/eupld/eupld.h +++ b/src/core/hle/service/eupld/eupld.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 diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp index 4c9eca5d5b..db48526614 100644 --- a/src/core/hle/service/fatal/fatal.cpp +++ b/src/core/hle/service/fatal/fatal.cpp @@ -13,6 +13,8 @@ #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" @@ -165,35 +167,6 @@ void Module::Interface::ThrowFatalWithCpuContext(HLERequestContext& ctx) { rb.Push(ResultSuccess); } -class Fatal_P final : public Module::Interface { -public: - explicit Fatal_P(std::shared_ptr module_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:p") {} - ~Fatal_P() override = default; - - std::optional 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_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:u") {} - ~Fatal_U() override = default; - - std::optional 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(system); auto module = std::make_shared(); diff --git a/src/core/hle/service/fatal/fatal.h b/src/core/hle/service/fatal/fatal.h index f1c1104060..176ad8d0d9 100644 --- a/src/core/hle/service/fatal/fatal.h +++ b/src/core/hle/service/fatal/fatal.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 diff --git a/src/core/hle/service/fatal/fatal_p.cpp b/src/core/hle/service/fatal/fatal_p.cpp new file mode 100644 index 0000000000..345743d6bc --- /dev/null +++ b/src/core/hle/service/fatal/fatal_p.cpp @@ -0,0 +1,22 @@ +// 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/fatal/fatal_p.h" + +namespace Service::Fatal { + +Fatal_P::Fatal_P(std::shared_ptr 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 new file mode 100644 index 0000000000..ea2183c125 --- /dev/null +++ b/src/core/hle/service/fatal/fatal_p.h @@ -0,0 +1,19 @@ +// 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/fatal/fatal.h" + +namespace Service::Fatal { + +class Fatal_P final : public Module::Interface { +public: + explicit Fatal_P(std::shared_ptr 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 new file mode 100644 index 0000000000..b2850c3e62 --- /dev/null +++ b/src/core/hle/service/fatal/fatal_u.cpp @@ -0,0 +1,23 @@ +// 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/fatal/fatal_u.h" + +namespace Service::Fatal { + +Fatal_U::Fatal_U(std::shared_ptr 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 new file mode 100644 index 0000000000..4d193857d0 --- /dev/null +++ b/src/core/hle/service/fatal/fatal_u.h @@ -0,0 +1,19 @@ +// 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/fatal/fatal.h" + +namespace Service::Fatal { + +class Fatal_U final : public Module::Interface { +public: + explicit Fatal_U(std::shared_ptr 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 96ea3478ea..cac03ae24c 100644 --- a/src/core/hle/service/fgm/fgm.cpp +++ b/src/core/hle/service/fgm/fgm.cpp @@ -16,26 +16,30 @@ namespace Service::FGM { class IRequest final : public ServiceFramework { public: - explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(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 { public: - explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -46,25 +50,21 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &FGM::Initialize, "Initialize"} - ); }; class FGM_DBG final : public ServiceFramework { public: - explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(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/fgm/fgm.h b/src/core/hle/service/fgm/fgm.h index 9d2465c0fb..89ef7096bb 100644 --- a/src/core/hle/service/fgm/fgm.h +++ b/src/core/hle/service/fgm/fgm.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 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 793b86cc51..c4e3c81f22 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp @@ -11,18 +11,15 @@ namespace Service::FileSystem { -std::optional 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(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 f2a57260e1..79256604f3 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_directory.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.h @@ -29,8 +29,6 @@ private: Result Read(Out out_count, const OutArray out_entries); Result GetEntryCount(Out out_count); - - std::optional 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 78ca90a4af..22cbe2be2c 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp @@ -12,6 +12,18 @@ namespace Service::FileSystem { IFile::IFile(Core::System& system_, FileSys::VirtualFile file_) : ServiceFramework{system_, "IFile"}, backend{std::make_unique(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 992330e149..14348f7fc6 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_file.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_file.h @@ -30,19 +30,6 @@ private: Result Flush(); Result SetSize(s64 size); Result GetSize(Out out_size); - - std::optional 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 6ab4916a36..edd381f57c 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp @@ -13,33 +13,30 @@ namespace Service::FileSystem { -std::optional 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( 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 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 11d3c7fb31..ed03c3ef83 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h @@ -58,7 +58,6 @@ public: Result GetFileSystemAttribute(Out out_attribute); private: - std::optional FindRequest(u32 key) override; std::unique_ptr 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 f6eac6ca10..4af0a4ea2d 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 @@ -12,6 +12,11 @@ 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 31182e9159..3ebeb2cb0a 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 @@ -20,13 +20,6 @@ private: Result Add(std::shared_ptr filesystem); Result Commit(); - std::optional 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 8353b72c24..0cac094caf 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 @@ -17,6 +17,11 @@ 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 7faa4291c0..d2b8eb97cf 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 @@ -45,12 +45,6 @@ private: void FindNormalSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type); void FindTemporaryStorageSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISaveDataInfoReader::ReadSaveDataInfo>, "ReadSaveDataInfo"} - ); std::shared_ptr save_data_controller; std::vector 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 ac884b3b28..50b7d1e765 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp @@ -12,6 +12,15 @@ 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 44d5a6c8bb..e676c52220 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_storage.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.h @@ -18,23 +18,12 @@ public: explicit IStorage(Core::System& system_, FileSys::VirtualFile backend_); private: + FileSys::VirtualFile backend; + Result Read( OutBuffer out_bytes, s64 offset, s64 length); Result GetSize(Out out_size); - - std::optional 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 1f83d6509b..1dcacb0231 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp @@ -9,6 +9,15 @@ 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 fe3abeff1d..b642efe7ad 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_ldr.h +++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.h @@ -18,15 +18,6 @@ class FSP_LDR final : public ServiceFramework { public: explicit FSP_LDR(Core::System& system_); ~FSP_LDR() override; - - std::optional 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 9378e6e0c6..e7941ef9c9 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_pr.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_pr.cpp @@ -9,6 +9,16 @@ 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 bc692151a5..175a3c7a23 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_pr.h +++ b/src/core/hle/service/filesystem/fsp/fsp_pr.h @@ -18,16 +18,6 @@ class FSP_PR final : public ServiceFramework { public: explicit FSP_PR(Core::System& system_); ~FSP_PR() override; - - std::optional 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 cb349636d5..58303a0bd6 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp @@ -47,142 +47,143 @@ namespace Service::FileSystem { -std::optional 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()} { + : 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); + 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 ebda008bcc..156cf4e571 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.h +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.h @@ -115,7 +115,6 @@ private: s64 available_size, s64 journal_size); Result GetCacheStorageSize(s32 index, Out out_data_size, Out out_journal_size); - std::optional FindRequest(u32 key) override; FileSystemController& fsc; const FileSys::ContentProvider& content_provider; const Core::Reporter& reporter; diff --git a/src/core/hle/service/filesystem/fsp/fsp_types.h b/src/core/hle/service/filesystem/fsp/fsp_types.h index 294da6a2de..c704203ad1 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_types.h +++ b/src/core/hle/service/filesystem/fsp/fsp_types.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 diff --git a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp index d8d6289fe1..f4c218db8d 100644 --- a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp +++ b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.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 diff --git a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h index d206e1dea4..6141bae18c 100644 --- a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h +++ b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.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 diff --git a/src/core/hle/service/filesystem/romfs_controller.cpp b/src/core/hle/service/filesystem/romfs_controller.cpp index 19c9cec722..9725d02f4b 100644 --- a/src/core/hle/service/filesystem/romfs_controller.cpp +++ b/src/core/hle/service/filesystem/romfs_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 diff --git a/src/core/hle/service/filesystem/romfs_controller.h b/src/core/hle/service/filesystem/romfs_controller.h index 3c3ead344c..5471e136c3 100644 --- a/src/core/hle/service/filesystem/romfs_controller.h +++ b/src/core/hle/service/filesystem/romfs_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 diff --git a/src/core/hle/service/filesystem/save_data_controller.cpp b/src/core/hle/service/filesystem/save_data_controller.cpp index 8720681d17..d3e22b1552 100644 --- a/src/core/hle/service/filesystem/save_data_controller.cpp +++ b/src/core/hle/service/filesystem/save_data_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 diff --git a/src/core/hle/service/filesystem/save_data_controller.h b/src/core/hle/service/filesystem/save_data_controller.h index dc9d713dfb..afb95cb949 100644 --- a/src/core/hle/service/filesystem/save_data_controller.h +++ b/src/core/hle/service/filesystem/save_data_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 diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp index 5480d22b83..f8690dbb8b 100644 --- a/src/core/hle/service/friend/friend.cpp +++ b/src/core/hle/service/friend/friend.cpp @@ -11,36 +11,137 @@ #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_, Core::System& system_, const char* name) : Interface(std::move(module_), system_, name) {} - ~Friend() override = default; - - std::optional 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 { public: explicit IFriendService(Core::System& system_) : ServiceFramework{system_, "IFriendService"}, service_context{system, "IFriendService"} { - completion_event = service_context.CreateEvent("IFriendService:CompletionEvent"); - } + // 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + completion_event = service_context.CreateEvent("IFriendService:CompletionEvent"); } ~IFriendService() override { @@ -266,134 +367,27 @@ 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 { public: explicit INotificationService(Core::System& system_, Common::UUID uuid_) - : ServiceFramework{system_, "INotificationService"}, uuid{uuid_} - , service_context{system_, "INotificationService"} { - notification_event = service_context.CreateEvent("INotificationService:NotifyEvent"); - } + : 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + notification_event = service_context.CreateEvent("INotificationService:NotifyEvent"); } ~INotificationService() override { @@ -471,13 +465,9 @@ 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 notifications; States states{}; @@ -511,67 +501,61 @@ class IServiceForApplication final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "GetReceivableNeighborInfoCountMax"}, + {10, nullptr, "IsNeighborDetectionEnabled"}, + }; + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"}, - FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"} - ); }; class IServiceForSystem final : public ServiceFramework { public: explicit IServiceForSystem(Core::System& system_) : ServiceFramework{system_, "nd:sys"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + 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); } - - 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.h b/src/core/hle/service/friend/friend.h index 2824dc7866..61ac92fbb4 100644 --- a/src/core/hle/service/friend/friend.h +++ b/src/core/hle/service/friend/friend.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 diff --git a/src/core/hle/service/friend/friend_interface.cpp b/src/core/hle/service/friend/friend_interface.cpp new file mode 100644 index 0000000000..b436d43303 --- /dev/null +++ b/src/core/hle/service/friend/friend_interface.cpp @@ -0,0 +1,23 @@ +// 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/friend/friend_interface.h" + +namespace Service::Friend { + +Friend::Friend(std::shared_ptr 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 new file mode 100644 index 0000000000..0315c62c39 --- /dev/null +++ b/src/core/hle/service/friend/friend_interface.h @@ -0,0 +1,19 @@ +// 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/friend/friend.h" + +namespace Service::Friend { + +class Friend final : public Module::Interface { +public: + explicit Friend(std::shared_ptr 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 203adb7ca7..7eda57ddc3 100644 --- a/src/core/hle/service/glue/arp.cpp +++ b/src/core/hle/service/glue/arp.cpp @@ -35,6 +35,22 @@ std::optional 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; @@ -148,10 +164,16 @@ public: using IssuerFn = std::function)>; explicit IRegistrar(Core::System& system_, IssuerFn&& issuer) - : ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -216,11 +238,6 @@ 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{}; @@ -229,6 +246,15 @@ 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 de966475f9..ec3d809b5b 100644 --- a/src/core/hle/service/glue/arp.h +++ b/src/core/hle/service/glue/arp.h @@ -24,21 +24,6 @@ private: void GetApplicationControlProperty(HLERequestContext& ctx); void GetApplicationControlPropertyWithApplicationId(HLERequestContext& ctx); - std::optional 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; }; @@ -51,14 +36,6 @@ private: void AcquireRegistrar(HLERequestContext& ctx); void UnregisterApplicationInstance(HLERequestContext& ctx); - std::optional 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 registrar; }; diff --git a/src/core/hle/service/glue/bgtc.cpp b/src/core/hle/service/glue/bgtc.cpp index 7c7b5ea13c..360f16f0dd 100644 --- a/src/core/hle/service/glue/bgtc.cpp +++ b/src/core/hle/service/glue/bgtc.cpp @@ -11,7 +11,15 @@ namespace Service::Glue { -BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} {} +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() = default; @@ -24,11 +32,44 @@ 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 0ef0ab902f..129193da1f 100644 --- a/src/core/hle/service/glue/bgtc.h +++ b/src/core/hle/service/glue/bgtc.h @@ -20,57 +20,18 @@ public: ~BGTC_T() override; void OpenTaskService(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{100, &BGTC_T::OpenTaskService, "OpenTaskService"} - ); }; class ITaskService final : public ServiceFramework { public: explicit ITaskService(Core::System& system_); ~ITaskService() override; - - std::optional 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 { public: explicit BGTC_SC(Core::System& system_); ~BGTC_SC() override; - - std::optional 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 80d22a0ca7..322ae45254 100644 --- a/src/core/hle/service/glue/ectx.cpp +++ b/src/core/hle/service/glue/ectx.cpp @@ -12,10 +12,14 @@ namespace Service::Glue { // This is nn::err::context::IContextRegistrar class IContextRegistrar : public ServiceFramework { public: - IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} {} + IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IContextRegistrar::Complete, "Complete"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } ~IContextRegistrar() override = default; @@ -37,21 +41,41 @@ 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 01f109c609..ff48075eda 100644 --- a/src/core/hle/service/glue/ectx.h +++ b/src/core/hle/service/glue/ectx.h @@ -18,30 +18,12 @@ class ECTX_W final : public ServiceFramework { public: explicit ECTX_W(Core::System& system_); ~ECTX_W() override; - - std::optional 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 { public: explicit ECTX_R(Core::System& system_); ~ECTX_R() override; - - std::optional 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 { @@ -51,14 +33,6 @@ public: private: void CreateContextRegistrar(HLERequestContext& ctx); - - std::optional 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/errors.h b/src/core/hle/service/glue/errors.h index 30feaa5c03..9839271447 100644 --- a/src/core/hle/service/glue/errors.h +++ b/src/core/hle/service/glue/errors.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 diff --git a/src/core/hle/service/glue/glue.h b/src/core/hle/service/glue/glue.h index 2a906f5ad6..64d45cfc14 100644 --- a/src/core/hle/service/glue/glue.h +++ b/src/core/hle/service/glue/glue.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 diff --git a/src/core/hle/service/glue/glue_manager.cpp b/src/core/hle/service/glue/glue_manager.cpp index 22f0017044..78fc5ebac3 100644 --- a/src/core/hle/service/glue/glue_manager.cpp +++ b/src/core/hle/service/glue/glue_manager.cpp @@ -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 diff --git a/src/core/hle/service/glue/glue_manager.h b/src/core/hle/service/glue/glue_manager.h index 216aa34c19..6330828834 100644 --- a/src/core/hle/service/glue/glue_manager.h +++ b/src/core/hle/service/glue/glue_manager.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 diff --git a/src/core/hle/service/glue/notif.cpp b/src/core/hle/service/glue/notif.cpp index a369b78ddd..716e4da32d 100644 --- a/src/core/hle/service/glue/notif.cpp +++ b/src/core/hle/service/glue/notif.cpp @@ -17,45 +17,9 @@ namespace Service::Glue { namespace { + constexpr inline std::size_t MaxAlarms = 8; -} -std::optional 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 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, @@ -160,6 +124,18 @@ std::vector::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; @@ -202,13 +178,18 @@ class INotificationSystemEventAccessor final : public ServiceFramework { public: explicit INotificationSystemEventAccessor(Core::System& system_) - : ServiceFramework{system_, "INotificationSystemEventAccessor"} - , service_context{system_, "INotificationSystemEventAccessor"} { - notification_event = service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent"); - } + : ServiceFramework{system_, "INotificationSystemEventAccessor"}, + service_context{system_, "INotificationSystemEventAccessor"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + notification_event = + service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent"); } ~INotificationSystemEventAccessor() { @@ -223,15 +204,38 @@ 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 c5367e5da4..7ae20ba6f8 100644 --- a/src/core/hle/service/glue/notif.h +++ b/src/core/hle/service/glue/notif.h @@ -101,7 +101,6 @@ private: Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id); Result Initialize(ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; NotificationServiceImpl impl; }; @@ -131,7 +130,6 @@ private: Out out_notification_presentation_setting, NotificationChannel notification_channel); - std::optional FindRequest(u32 key) override; NotificationServiceImpl impl; }; } // namespace Service::Glue diff --git a/src/core/hle/service/glue/time/alarm_worker.h b/src/core/hle/service/glue/time/alarm_worker.h index 131d012a6a..c8882fed88 100644 --- a/src/core/hle/service/glue/time/alarm_worker.h +++ b/src/core/hle/service/glue/time/alarm_worker.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 diff --git a/src/core/hle/service/glue/time/file_timestamp_worker.cpp b/src/core/hle/service/glue/time/file_timestamp_worker.cpp index 048ff174c9..60bd688e72 100644 --- a/src/core/hle/service/glue/time/file_timestamp_worker.cpp +++ b/src/core/hle/service/glue/time/file_timestamp_worker.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 diff --git a/src/core/hle/service/glue/time/file_timestamp_worker.h b/src/core/hle/service/glue/time/file_timestamp_worker.h index 5f8b9b0499..58f74e7d29 100644 --- a/src/core/hle/service/glue/time/file_timestamp_worker.h +++ b/src/core/hle/service/glue/time/file_timestamp_worker.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 diff --git a/src/core/hle/service/glue/time/manager.cpp b/src/core/hle/service/glue/time/manager.cpp index 0da790e1c8..0b3312904e 100644 --- a/src/core/hle/service/glue/time/manager.cpp +++ b/src/core/hle/service/glue/time/manager.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 diff --git a/src/core/hle/service/glue/time/manager.h b/src/core/hle/service/glue/time/manager.h index 87e6a21fd5..5a86585754 100644 --- a/src/core/hle/service/glue/time/manager.h +++ b/src/core/hle/service/glue/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 diff --git a/src/core/hle/service/glue/time/pm_state_change_handler.cpp b/src/core/hle/service/glue/time/pm_state_change_handler.cpp index 7470fb2259..0bc37f75da 100644 --- a/src/core/hle/service/glue/time/pm_state_change_handler.cpp +++ b/src/core/hle/service/glue/time/pm_state_change_handler.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 diff --git a/src/core/hle/service/glue/time/pm_state_change_handler.h b/src/core/hle/service/glue/time/pm_state_change_handler.h index 27d9f78726..bf99fa8a14 100644 --- a/src/core/hle/service/glue/time/pm_state_change_handler.h +++ b/src/core/hle/service/glue/time/pm_state_change_handler.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 diff --git a/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp b/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp index 5ebaa33e00..e191405567 100644 --- a/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp +++ b/src/core/hle/service/glue/time/standard_steady_clock_resource.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 diff --git a/src/core/hle/service/glue/time/standard_steady_clock_resource.h b/src/core/hle/service/glue/time/standard_steady_clock_resource.h index 978d6b63b8..b5168cb837 100644 --- a/src/core/hle/service/glue/time/standard_steady_clock_resource.h +++ b/src/core/hle/service/glue/time/standard_steady_clock_resource.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 diff --git a/src/core/hle/service/glue/time/static.cpp b/src/core/hle/service/glue/time/static.cpp index dc7651fd1f..beccf6ce43 100644 --- a/src/core/hle/service/glue/time/static.cpp +++ b/src/core/hle/service/glue/time/static.cpp @@ -24,42 +24,42 @@ namespace Service::Glue::Time { -std::optional 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 time, const char* name) - : ServiceFramework{system_, name}, m_time_m{time->m_time_m}, + : ServiceFramework{system_, name}, m_system{system_}, 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 = - system.ServiceManager().GetService("set:sys", true); + m_system.ServiceManager().GetService("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 && @@ -109,7 +109,7 @@ Result StaticService::GetTimeZoneService(OutInterface out_servi LOG_DEBUG(Service_Time, "called."); *out_service = std::make_shared( - system, m_file_timestamp_worker, m_setup_info.can_write_timezone_device_location, + m_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 5856553461..a52b84bf31 100644 --- a/src/core/hle/service/glue/time/static.h +++ b/src/core/hle/service/glue/time/static.h @@ -72,11 +72,12 @@ public: Result CalculateSpanBetween(Out out_time, InClockSnapshot a, InClockSnapshot b); private: - std::optional FindRequest(u32 key) override; + Core::System& m_system; std::shared_ptr m_set_sys; std::shared_ptr m_time_m; std::shared_ptr m_wrapped_service; + Service::PSC::Time::StaticServiceSetupInfo m_setup_info; std::shared_ptr m_time_sm; std::shared_ptr 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 6e861b4060..52bd651f2b 100644 --- a/src/core/hle/service/glue/time/time_zone.cpp +++ b/src/core/hle/service/glue/time/time_zone.cpp @@ -19,26 +19,6 @@ namespace Service::Glue::Time { -std::optional 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, @@ -50,6 +30,26 @@ 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("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 839d823e67..635070263b 100644 --- a/src/core/hle/service/glue/time/time_zone.h +++ b/src/core/hle/service/glue/time/time_zone.h @@ -80,7 +80,6 @@ public: const Service::PSC::Time::CalendarTime& calendar_time); private: - std::optional FindRequest(u32 key) override; std::shared_ptr m_set_sys; bool m_can_write_timezone_device_location; FileTimestampWorker& m_file_timestamp_worker; diff --git a/src/core/hle/service/glue/time/time_zone_binary.cpp b/src/core/hle/service/glue/time/time_zone_binary.cpp index 3cc1a62afd..eadad551e5 100644 --- a/src/core/hle/service/glue/time/time_zone_binary.cpp +++ b/src/core/hle/service/glue/time/time_zone_binary.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 diff --git a/src/core/hle/service/glue/time/time_zone_binary.h b/src/core/hle/service/glue/time/time_zone_binary.h index 135da631f2..012b933573 100644 --- a/src/core/hle/service/glue/time/time_zone_binary.h +++ b/src/core/hle/service/glue/time/time_zone_binary.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 diff --git a/src/core/hle/service/glue/time/worker.h b/src/core/hle/service/glue/time/worker.h index 69904e6748..f4be2ff367 100644 --- a/src/core/hle/service/glue/time/worker.h +++ b/src/core/hle/service/glue/time/worker.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 diff --git a/src/core/hle/service/gpio/gpio.cpp b/src/core/hle/service/gpio/gpio.cpp index 5441149c65..8b4aa0f5ab 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 { public: - explicit GPIO(Core::System& system_) : ServiceFramework{system_, "gpio"} {} - ~GPIO() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit GPIO(Core::System& system_) + : ServiceFramework{system_, "gpio"} + { + static const FunctionInfo functions[] = { + {0, nullptr, "Cmd0"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Cmd0"} - ); + ~GPIO() override = default; }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/grc/grc.cpp b/src/core/hle/service/grc/grc.cpp index 5f6c84e914..e8e901662d 100644 --- a/src/core/hle/service/grc/grc.cpp +++ b/src/core/hle/service/grc/grc.cpp @@ -14,31 +14,32 @@ namespace Service::GRC { class GRC final : public ServiceFramework { public: - explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class GRC_D final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; diff --git a/src/core/hle/service/grc/grc.h b/src/core/hle/service/grc/grc.h index a3f8a5b90e..4c2b45057d 100644 --- a/src/core/hle/service/grc/grc.h +++ b/src/core/hle/service/grc/grc.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 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 7a4f4cce2c..e0d6d3f2d9 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 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 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 57c31a8df1..f155eaf839 100644 --- a/src/core/hle/service/hid/active_vibration_device_list.h +++ b/src/core/hle/service/hid/active_vibration_device_list.h @@ -29,8 +29,8 @@ public: private: static constexpr std::size_t MaxVibrationDevicesHandles{0x100}; + Result ActivateVibrationDevice(Core::HID::VibrationDeviceHandle vibration_device_handle); - std::optional 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 6f658fa875..44ae767841 100644 --- a/src/core/hle/service/hid/applet_resource.cpp +++ b/src/core/hle/service/hid/applet_resource.cpp @@ -12,17 +12,14 @@ namespace Service::HID { -std::optional 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 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 7b5d915218..40c3852baa 100644 --- a/src/core/hle/service/hid/applet_resource.h +++ b/src/core/hle/service/hid/applet_resource.h @@ -32,7 +32,6 @@ public: private: Result GetSharedMemoryHandle(OutCopyHandle out_shared_memory_handle); - std::optional FindRequest(u32 key) override; u64 aruid{}; std::shared_ptr resource_manager; }; diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 0ea587312b..25096ff36f 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -16,24 +16,19 @@ #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 { public: explicit IHidTemporaryServer(Core::System& system_) - : ServiceFramework{system_, "hid:tmp"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "hid:tmp"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"}, + }; + // clang-format on + RegisterHandlers(functions); } ~IHidTemporaryServer() override = default; }; @@ -41,17 +36,17 @@ public: class AHID_CD final : public ServiceFramework { public: explicit AHID_CD(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } ~AHID_CD() override = default; }; @@ -59,322 +54,22 @@ public: class AHID_HDR final : public ServiceFramework { public: explicit AHID_HDR(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } ~AHID_HDR() override = default; }; -class IHidDebugServer final : public ServiceFramework { -public: - explicit IHidDebugServer(Core::System& system_, std::shared_ptr resource, - std::shared_ptr 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 auto_pilot_buffer) { - AutoPilotState auto_pilot{}; - - auto_pilot.count = - static_cast((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 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 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 GetResourceManager() { - resource_manager->Initialize(); - return resource_manager; - } - - std::optional 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 resource_manager; - std::shared_ptr firmware_settings; -}; - void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); auto firmware_settings = std::make_shared(system); diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index ec5463f4e2..bf8cd44481 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.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 diff --git a/src/core/hle/service/hid/hid_debug_server.cpp b/src/core/hle/service/hid/hid_debug_server.cpp index 091d09dae5..42428a9ff9 100644 --- a/src/core/hle/service/hid/hid_debug_server.cpp +++ b/src/core/hle/service/hid/hid_debug_server.cpp @@ -18,4 +18,298 @@ namespace Service::HID { +IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr resource, + std::shared_ptr 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 auto_pilot_buffer) { + AutoPilotState auto_pilot{}; + + auto_pilot.count = + static_cast((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 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 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 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 20cc1ed541..f48f0205ed 100644 --- a/src/core/hle/service/hid/hid_debug_server.h +++ b/src/core/hle/service/hid/hid_debug_server.h @@ -18,5 +18,31 @@ namespace Service::HID { class ResourceManager; class HidFirmwareSettings; +class IHidDebugServer final : public ServiceFramework { +public: + explicit IHidDebugServer(Core::System& system_, std::shared_ptr resource, + std::shared_ptr settings); + ~IHidDebugServer() override; + +private: + Result DeactivateTouchScreen(); + Result SetTouchScreenAutoPilotState( + InArray auto_pilot_buffer); + Result UnsetTouchScreenAutoPilotState(); + Result GetTouchScreenConfiguration( + Out out_touchscreen_config, + ClientAppletResourceUserId aruid); + Result ProcessTouchScreenAutoTune(); + Result ForceStopTouchScreenManagement(); + Result ForceRestartTouchScreenManagement(u32 basic_gesture_id, + ClientAppletResourceUserId aruid); + Result IsTouchScreenManaged(Out out_is_managed); + Result DeactivateGesture(); + + std::shared_ptr GetResourceManager(); + + std::shared_ptr resource_manager; + std::shared_ptr 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 18e57628d0..9689bce8dd 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 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 resource, std::shared_ptr 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 f2c08e9df8..57a1a04b9c 100644 --- a/src/core/hle/service/hid/hid_server.h +++ b/src/core/hle/service/hid/hid_server.h @@ -265,8 +265,6 @@ private: Result SetTouchScreenResolution(u32 width, u32 height, ClientAppletResourceUserId aruid); Result SetMouseLibraryVersion(ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; - std::shared_ptr resource_manager; std::shared_ptr 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 4df021f443..e544adf03c 100644 --- a/src/core/hle/service/hid/hid_system_server.cpp +++ b/src/core/hle/service/hid/hid_system_server.cpp @@ -22,6 +22,252 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr 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 e5da7bbdac..150b697305 100644 --- a/src/core/hle/service/hid/hid_system_server.h +++ b/src/core/hle/service/hid/hid_system_server.h @@ -84,252 +84,6 @@ private: std::shared_ptr GetResourceManager(); - std::optional 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 326cfbf74b..70bb5437e3 100644 --- a/src/core/hle/service/hid/hidbus.cpp +++ b/src/core/hle/service/hid/hidbus.cpp @@ -26,28 +26,30 @@ namespace Service::HID { // (15ms, 66Hz) constexpr auto hidbus_update_ns = std::chrono::nanoseconds{15 * 1000 * 1000}; -std::optional 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 9ad097150e..19dd894ed3 100644 --- a/src/core/hle/service/hid/hidbus.h +++ b/src/core/hle/service/hid/hidbus.h @@ -147,8 +147,6 @@ private: } } - std::optional FindRequest(u32 key) override; - bool is_hidbus_enabled{false}; HidbusStatusManager hidbus_status{}; std::array devices{}; diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp index a17395b596..3d87e6788d 100644 --- a/src/core/hle/service/hid/irs.cpp +++ b/src/core/hle/service/hid/irs.cpp @@ -29,32 +29,32 @@ namespace Service::IRS { -std::optional 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"} { + // 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 + u8* raw_shared_memory = system.Kernel().GetIrsSharedMem().GetPointer(); + RegisterHandlers(functions); shared_memory = std::construct_at(reinterpret_cast(raw_shared_memory)); npad_device = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); @@ -369,6 +369,16 @@ 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 be81ea75a9..2ca34b9106 100644 --- a/src/core/hle/service/hid/irs.h +++ b/src/core/hle/service/hid/irs.h @@ -157,8 +157,6 @@ private: return static_cast(*processors[index]); } - std::optional FindRequest(u32 key) override; - Core::HID::EmulatedController* npad_device = nullptr; StatusManager* shared_memory = nullptr; std::array, 9> processors{}; @@ -168,16 +166,6 @@ class IRS_SYS final : public ServiceFramework { public: explicit IRS_SYS(Core::System& system); ~IRS_SYS() override; - - std::optional 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 6b8ae7048c..2e41cbd3da 100644 --- a/src/core/hle/service/hid/xcd.cpp +++ b/src/core/hle/service/hid/xcd.cpp @@ -9,6 +9,33 @@ 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 af1dd88ef7..9000110a9a 100644 --- a/src/core/hle/service/hid/xcd.h +++ b/src/core/hle/service/hid/xcd.h @@ -18,33 +18,6 @@ class XCD_SYS final : public ServiceFramework { public: explicit XCD_SYS(Core::System& system_); ~XCD_SYS() override; - - std::optional 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 d0a5e29f8c..0b242768c2 100644 --- a/src/core/hle/service/i2c/i2c.cpp +++ b/src/core/hle/service/i2c/i2c.cpp @@ -17,26 +17,25 @@ namespace Service::I2C { class I2CSession final : public ServiceFramework { public: - explicit I2CSession(Core::System& system_) : ServiceFramework{system_, "I2CSession"} {} + 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); + } ~I2CSession() override = default; - Result Send(InBuffer in_data, u32 transaction_option) { LOG_WARNING(Service, "(stubbed) topt={}", transaction_option); R_THROW(ResultUnknown); } - - std::optional 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 { @@ -46,9 +45,19 @@ enum class I2CDevice : u32 { class I2C final : public ServiceFramework { public: - explicit I2C(Core::System& system_) : ServiceFramework{system_, "i2c"} {} + 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); + } ~I2C() override = default; - Result OpenSessionForDev(OutInterface out_session, s32 bus_idx, u32 slave_address, u32 addressing_mode, u32 speed_mode) { LOG_DEBUG(Service, "(stubbed)"); *out_session = std::make_shared(system); @@ -74,17 +83,6 @@ public: *out_session = std::make_shared(system); R_SUCCEED(); } - - std::optional 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 9059aaf518..ec3a3a8dcb 100644 --- a/src/core/hle/service/jit/jit.cpp +++ b/src/core/hle/service/jit/jit.cpp @@ -37,6 +37,18 @@ 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(); @@ -47,10 +59,6 @@ public: configuration.sys_ro_memory = configuration.user_ro_memory; } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - ~IJitEnvironment() { user_rx.Finalize(system.Kernel()); user_ro.Finalize(system.Kernel()); @@ -240,13 +248,6 @@ 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 process; CodeMemory user_rx; CodeMemory user_ro; @@ -257,10 +258,14 @@ private: class JITU final : public ServiceFramework { public: - explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} {} + explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -289,10 +294,6 @@ 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/jit/jit.h b/src/core/hle/service/jit/jit.h index 19014c75a4..a9ebf146ec 100644 --- a/src/core/hle/service/jit/jit.h +++ b/src/core/hle/service/jit/jit.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-2.0-or-later diff --git a/src/core/hle/service/jit/jit_context.h b/src/core/hle/service/jit/jit_context.h index f17fc5e244..aa9a2d3589 100644 --- a/src/core/hle/service/jit/jit_context.h +++ b/src/core/hle/service/jit/jit_context.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-2.0-or-later diff --git a/src/core/hle/service/lbl/lbl.cpp b/src/core/hle/service/lbl/lbl.cpp index 9b245201ff..68a9bff2df 100644 --- a/src/core/hle/service/lbl/lbl.cpp +++ b/src/core/hle/service/lbl/lbl.cpp @@ -18,10 +18,43 @@ namespace Service::LBL { class LBL final : public ServiceFramework { public: - explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -302,38 +335,6 @@ private: rb.Push(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/lbl/lbl.h b/src/core/hle/service/lbl/lbl.h index e47759c01c..e2cd1b3980 100644 --- a/src/core/hle/service/lbl/lbl.h +++ b/src/core/hle/service/lbl/lbl.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 diff --git a/src/core/hle/service/ldn/lan_discovery.cpp b/src/core/hle/service/ldn/lan_discovery.cpp index f37dbe492f..90adcdcee4 100644 --- a/src/core/hle/service/ldn/lan_discovery.cpp +++ b/src/core/hle/service/ldn/lan_discovery.cpp @@ -1,5 +1,6 @@ -// 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 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ldn/lan_discovery.h b/src/core/hle/service/ldn/lan_discovery.h index 5d0642bd0f..f1f3c4bece 100644 --- a/src/core/hle/service/ldn/lan_discovery.h +++ b/src/core/hle/service/ldn/lan_discovery.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-2.0-or-later diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index 838fe85f79..1a0165fd2e 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -9,6 +9,7 @@ #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" @@ -18,10 +19,14 @@ namespace Service::LDN { class IClientProcessMonitor final : public ServiceFramework { public: - explicit IClientProcessMonitor(Core::System& system_) : ServiceFramework{system_, "IClientProcessMonitor"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } ~IClientProcessMonitor() override = default; private: @@ -29,19 +34,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 { public: - explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } + private: Result CreateMonitorService(OutInterface out_interface) { LOG_DEBUG(Service_LDN, "called"); @@ -49,19 +54,21 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"} - ); }; class ISystemServiceCreator final : public ServiceFramework { public: - explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } + private: Result CreateSystemLocalCommunicationService( OutInterface out_interface) { @@ -78,20 +85,21 @@ private: *out_interface = std::make_shared(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 { public: - explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } + private: Result CreateUserLocalCommunicationService( OutInterface out_interface) { @@ -108,50 +116,22 @@ private: *out_interface = std::make_shared(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 ISfService final : public ServiceFramework { -public: - explicit ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {} - ~ISfService() override = default; - - std::optional 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 { public: - explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_) : ServiceFramework{system_, name_}, is_system{is_system_} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } + private: Result CreateNetworkService(OutInterface out_interface, u32 input, u64 reserved_input) { @@ -170,20 +150,21 @@ 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 { public: - explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} {} + explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } + private: Result CreateMonitorService(OutInterface out_interface, u64 reserved_input) { LOG_INFO(Service_LDN, "called, reserved_input={}", reserved_input); @@ -191,10 +172,6 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"} - ); }; void LoopProcess(Core::System& system) { @@ -204,9 +181,12 @@ void LoopProcess(Core::System& system) { server_manager->RegisterNamedService("ldn:s", std::make_shared(system)); server_manager->RegisterNamedService("ldn:u", std::make_shared(system)); - server_manager->RegisterNamedService("lp2p:app", std::make_shared(system, false, "lp2p:app")); - server_manager->RegisterNamedService("lp2p:sys", std::make_shared(system, true, "lp2p:sys")); - server_manager->RegisterNamedService("lp2p:m", std::make_shared(system)); + server_manager->RegisterNamedService( + "lp2p:app", std::make_shared(system, false, "lp2p:app")); + server_manager->RegisterNamedService( + "lp2p:sys", std::make_shared(system, true, "lp2p:sys")); + server_manager->RegisterNamedService("lp2p:m", + std::make_shared(system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ldn/ldn.h b/src/core/hle/service/ldn/ldn.h index dae037fa8f..76c7f4f439 100644 --- a/src/core/hle/service/ldn/ldn.h +++ b/src/core/hle/service/ldn/ldn.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 diff --git a/src/core/hle/service/ldn/ldn_results.h b/src/core/hle/service/ldn/ldn_results.h index f340bda422..cf6c22b54b 100644 --- a/src/core/hle/service/ldn/ldn_results.h +++ b/src/core/hle/service/ldn/ldn_results.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 diff --git a/src/core/hle/service/ldn/monitor_service.cpp b/src/core/hle/service/ldn/monitor_service.cpp index 6a60b0b3d8..6cb7180b15 100644 --- a/src/core/hle/service/ldn/monitor_service.cpp +++ b/src/core/hle/service/ldn/monitor_service.cpp @@ -10,22 +10,22 @@ namespace Service::LDN { -std::optional 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 9c1acd0a1e..2d4a69c311 100644 --- a/src/core/hle/service/ldn/monitor_service.h +++ b/src/core/hle/service/ldn/monitor_service.h @@ -26,7 +26,6 @@ private: Result InitializeMonitor(); Result FinalizeMonitor(); - std::optional 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 ebe06b2059..5ac663b4c2 100644 --- a/src/core/hle/service/ldn/sf_monitor_service.cpp +++ b/src/core/hle/service/ldn/sf_monitor_service.cpp @@ -10,17 +10,17 @@ namespace Service::LDN { -std::optional 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 09ca16727d..a596093f1b 100644 --- a/src/core/hle/service/ldn/sf_monitor_service.h +++ b/src/core/hle/service/ldn/sf_monitor_service.h @@ -24,7 +24,6 @@ public: private: Result Initialize(Out out_value); Result GetGroupInfo(OutLargeData out_group_info); - std::optional 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 new file mode 100644 index 0000000000..b77672a1b6 --- /dev/null +++ b/src/core/hle/service/ldn/sf_service.cpp @@ -0,0 +1,40 @@ +// 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 "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 new file mode 100644 index 0000000000..ca7a81cf29 --- /dev/null +++ b/src/core/hle/service/ldn/sf_service.h @@ -0,0 +1,24 @@ +// 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/service.h" + +namespace Core { +class System; +} + +namespace Service::LDN { + +class ISfService final : public ServiceFramework { +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 574ba82a0b..95a9bcaf71 100644 --- a/src/core/hle/service/ldn/sf_service_monitor.cpp +++ b/src/core/hle/service/ldn/sf_service_monitor.cpp @@ -10,27 +10,27 @@ namespace Service::LDN { -std::optional 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 5e5e64ae6c..87854b868d 100644 --- a/src/core/hle/service/ldn/sf_service_monitor.h +++ b/src/core/hle/service/ldn/sf_service_monitor.h @@ -23,8 +23,8 @@ public: private: Result Initialize(Out out_value); - Result GetGroupInfo(OutLargeData out_group_info, GroupInfo in_group_info); - std::optional FindRequest(u32 key) override; + Result GetGroupInfo(OutLargeData out_group_info, + GroupInfo in_group_info); }; } // 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 9d3d49aac4..57a1c6a6c2 100644 --- a/src/core/hle/service/ldn/system_local_communication_service.cpp +++ b/src/core/hle/service/ldn/system_local_communication_service.cpp @@ -9,44 +9,44 @@ namespace Service::LDN { -std::optional 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 c7e937e3a2..fa0e45bde4 100644 --- a/src/core/hle/service/ldn/system_local_communication_service.h +++ b/src/core/hle/service/ldn/system_local_communication_service.h @@ -23,7 +23,6 @@ public: private: Result InitializeSystem2(); - std::optional 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 26a742bf0b..7011bd52f2 100644 --- a/src/core/hle/service/ldn/user_local_communication_service.cpp +++ b/src/core/hle/service/ldn/user_local_communication_service.cpp @@ -1,5 +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,46 +22,46 @@ namespace Service::LDN { -std::optional 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 6f832b7a23..720d5e9bf4 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-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once @@ -89,7 +89,6 @@ private: /// Callback to parse and handle a received LDN packet. void OnLDNPacketReceived(const Network::LDNPacket& packet); void OnEventFired(); - std::optional 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 25ecc58fa4..db4d51b49d 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp @@ -12,44 +12,47 @@ namespace Service::LDR { class DebugMonitor final : public ServiceFramework { public: - explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} {} + 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 - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetProgramArgument"}, - FunctionInfo{1, nullptr, "FlushArguments"}, - FunctionInfo{2, nullptr, "GetProcessModuleInfo"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class ProcessManager final : public ServiceFramework { public: - explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class Shell final : public ServiceFramework { public: - explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} {} + 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 - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetProgramArgument"}, - FunctionInfo{1, nullptr, "FlushArguments"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/ldr/ldr.h b/src/core/hle/service/ldr/ldr.h index c9281dbfb2..12a6b1f507 100644 --- a/src/core/hle/service/ldr/ldr.h +++ b/src/core/hle/service/ldr/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 diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index be8cdf9aa9..d631a6dd80 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp @@ -87,7 +87,16 @@ DECLARE_ENUM_FLAG_OPERATORS(LogPacketFlags); class ILogger final : public ServiceFramework { public: - explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} {} + 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); + } + private: void Log(HLERequestContext& ctx) { std::size_t offset{}; @@ -322,25 +331,20 @@ private: }; static_assert(sizeof(LogPacketHeader) == 0x18, "LogPacketHeader is an invalid size"); - std::optional 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> entries{}; LogDestination destination{LogDestination::All}; }; class LM final : public ServiceFramework { public: - explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} {} + explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &LM::OpenLogger, "OpenLogger"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -351,26 +355,21 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &LM::OpenLogger, "OpenLogger"} - ); }; class LM_GET final : public ServiceFramework { public: - explicit LM_GET(Core::System& system_) : ServiceFramework{system_, "lm:get"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } - - 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/lm/lm.h b/src/core/hle/service/lm/lm.h index 0d7c39cbc3..890344f44a 100644 --- a/src/core/hle/service/lm/lm.h +++ b/src/core/hle/service/lm/lm.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 diff --git a/src/core/hle/service/mig/mig.cpp b/src/core/hle/service/mig/mig.cpp index 2560050622..7412674417 100644 --- a/src/core/hle/service/mig/mig.cpp +++ b/src/core/hle/service/mig/mig.cpp @@ -14,50 +14,50 @@ namespace Service::Migration { class MIG_USR final : public ServiceFramework { public: - explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(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/mig/mig.h b/src/core/hle/service/mig/mig.h index c8ed732a5b..39e92a59eb 100644 --- a/src/core/hle/service/mig/mig.h +++ b/src/core/hle/service/mig/mig.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 diff --git a/src/core/hle/service/mii/mii.cpp b/src/core/hle/service/mii/mii.cpp index 642a9e4907..513bb671f8 100644 --- a/src/core/hle/service/mii/mii.cpp +++ b/src/core/hle/service/mii/mii.cpp @@ -22,25 +22,49 @@ namespace Service::Mii { -std::optional IStaticService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IStaticService::GetDatabaseService>, "GetDatabaseService"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - class IDatabaseService final : public ServiceFramework { public: - explicit IDatabaseService(Core::System& system_, std::shared_ptr mii_manager, bool is_system_) - : ServiceFramework{system_, "IDatabaseService"} - , manager{mii_manager} - , is_system{is_system_} { - m_set_sys = system.ServiceManager().GetService("set:sys", true); - manager->Initialize(metadata); - } + explicit IDatabaseService(Core::System& system_, std::shared_ptr 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + m_set_sys = system.ServiceManager().GetService( + "set:sys", true); + manager->Initialize(metadata); } private: @@ -264,45 +288,23 @@ 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 manager = nullptr; DatabaseSessionMetadata metadata{}; bool is_system{}; + std::shared_ptr m_set_sys; }; IStaticService::IStaticService(Core::System& system_, const char* name_, std::shared_ptr 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; @@ -322,10 +324,27 @@ std::shared_ptr IStaticService::GetMiiManager() { class IImageDatabaseService final : public ServiceFramework { public: - explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -342,23 +361,6 @@ 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 ba20db40d7..9ec6f248e5 100644 --- a/src/core/hle/service/mii/mii.h +++ b/src/core/hle/service/mii/mii.h @@ -27,7 +27,6 @@ public: private: Result GetDatabaseService(Out> out_database_service); - std::optional FindRequest(u32 key) override; std::shared_ptr manager{nullptr}; bool is_system{}; }; diff --git a/src/core/hle/service/mii/mii_database.cpp b/src/core/hle/service/mii/mii_database.cpp index d1f4e1f198..6dd9773b2b 100644 --- a/src/core/hle/service/mii/mii_database.cpp +++ b/src/core/hle/service/mii/mii_database.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 diff --git a/src/core/hle/service/mii/mii_database.h b/src/core/hle/service/mii/mii_database.h index 3bd240f93b..6d28696206 100644 --- a/src/core/hle/service/mii/mii_database.h +++ b/src/core/hle/service/mii/mii_database.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 diff --git a/src/core/hle/service/mii/mii_database_manager.h b/src/core/hle/service/mii/mii_database_manager.h index 52c32be82c..52ec3a91cc 100644 --- a/src/core/hle/service/mii/mii_database_manager.h +++ b/src/core/hle/service/mii/mii_database_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 diff --git a/src/core/hle/service/mii/mii_manager.h b/src/core/hle/service/mii/mii_manager.h index 48d8e8bb7d..9c546d2cbf 100644 --- a/src/core/hle/service/mii/mii_manager.h +++ b/src/core/hle/service/mii/mii_manager.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 diff --git a/src/core/hle/service/mii/mii_result.h b/src/core/hle/service/mii/mii_result.h index e2c36e556d..f4964133e7 100644 --- a/src/core/hle/service/mii/mii_result.h +++ b/src/core/hle/service/mii/mii_result.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 diff --git a/src/core/hle/service/mii/mii_types.h b/src/core/hle/service/mii/mii_types.h index 08c6029dff..6afa07ef43 100644 --- a/src/core/hle/service/mii/mii_types.h +++ b/src/core/hle/service/mii/mii_types.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 diff --git a/src/core/hle/service/mii/types/char_info.cpp b/src/core/hle/service/mii/types/char_info.cpp index e90124af4c..b5f4492994 100644 --- a/src/core/hle/service/mii/types/char_info.cpp +++ b/src/core/hle/service/mii/types/char_info.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 diff --git a/src/core/hle/service/mii/types/char_info.h b/src/core/hle/service/mii/types/char_info.h index d0c457fd56..e9c41435e1 100644 --- a/src/core/hle/service/mii/types/char_info.h +++ b/src/core/hle/service/mii/types/char_info.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 diff --git a/src/core/hle/service/mii/types/core_data.cpp b/src/core/hle/service/mii/types/core_data.cpp index ba1da76bae..7f2acea3ef 100644 --- a/src/core/hle/service/mii/types/core_data.cpp +++ b/src/core/hle/service/mii/types/core_data.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 diff --git a/src/core/hle/service/mii/types/core_data.h b/src/core/hle/service/mii/types/core_data.h index 8897e4f3b3..48a1ba5c73 100644 --- a/src/core/hle/service/mii/types/core_data.h +++ b/src/core/hle/service/mii/types/core_data.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 diff --git a/src/core/hle/service/mii/types/raw_data.h b/src/core/hle/service/mii/types/raw_data.h index 9a4cfa738e..f8182847ec 100644 --- a/src/core/hle/service/mii/types/raw_data.h +++ b/src/core/hle/service/mii/types/raw_data.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 diff --git a/src/core/hle/service/mii/types/store_data.cpp b/src/core/hle/service/mii/types/store_data.cpp index 127221fdb6..fcef3850f2 100644 --- a/src/core/hle/service/mii/types/store_data.cpp +++ b/src/core/hle/service/mii/types/store_data.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 diff --git a/src/core/hle/service/mii/types/store_data.h b/src/core/hle/service/mii/types/store_data.h index ed5dfb9494..5d5269a15b 100644 --- a/src/core/hle/service/mii/types/store_data.h +++ b/src/core/hle/service/mii/types/store_data.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 diff --git a/src/core/hle/service/mii/types/ver3_store_data.cpp b/src/core/hle/service/mii/types/ver3_store_data.cpp index c27646fcfd..840e0f35b3 100644 --- a/src/core/hle/service/mii/types/ver3_store_data.cpp +++ b/src/core/hle/service/mii/types/ver3_store_data.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 diff --git a/src/core/hle/service/mii/types/ver3_store_data.h b/src/core/hle/service/mii/types/ver3_store_data.h index 47907bf7d7..f2cb395136 100644 --- a/src/core/hle/service/mii/types/ver3_store_data.h +++ b/src/core/hle/service/mii/types/ver3_store_data.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 diff --git a/src/core/hle/service/mm/mm_u.cpp b/src/core/hle/service/mm/mm_u.cpp index 0b361ecdd2..e5353ee42c 100644 --- a/src/core/hle/service/mm/mm_u.cpp +++ b/src/core/hle/service/mm/mm_u.cpp @@ -49,10 +49,21 @@ public: class MM_U final : public ServiceFramework { public: - explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -201,16 +212,6 @@ private: rb.Push(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 sessions; u32 request_id{1}; }; diff --git a/src/core/hle/service/mm/mm_u.h b/src/core/hle/service/mm/mm_u.h index 43117c9b1c..ab0e76f40a 100644 --- a/src/core/hle/service/mm/mm_u.h +++ b/src/core/hle/service/mm/mm_u.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 diff --git a/src/core/hle/service/mnpp/mnpp.cpp b/src/core/hle/service/mnpp/mnpp.cpp index c5bc306302..11b6f3a386 100644 --- a/src/core/hle/service/mnpp/mnpp.cpp +++ b/src/core/hle/service/mnpp/mnpp.cpp @@ -14,10 +14,15 @@ namespace Service::MNPP { class MNPP_APP final : public ServiceFramework { public: - explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -34,43 +39,38 @@ 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 { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class MNPP_WEB final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; diff --git a/src/core/hle/service/ncm/ncm.cpp b/src/core/hle/service/ncm/ncm.cpp index 4091eadcf9..6c754d5567 100644 --- a/src/core/hle/service/ncm/ncm.cpp +++ b/src/core/hle/service/ncm/ncm.cpp @@ -24,32 +24,33 @@ namespace Service::NCM { class ILocationResolver final : public ServiceFramework { public: explicit ILocationResolver(Core::System& system_, FileSys::StorageId id) - : ServiceFramework{system_, "ILocationResolver"}, storage{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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -59,49 +60,60 @@ private: class IRegisteredLocationResolver final : public ServiceFramework { public: explicit IRegisteredLocationResolver(Core::System& system_) - : ServiceFramework{system_, "IRegisteredLocationResolver"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IAddOnContentLocationResolver final : public ServiceFramework { public: explicit IAddOnContentLocationResolver(Core::System& system_) - : ServiceFramework{system_, "IAddOnContentLocationResolver"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IContentStorage final : public ServiceFramework { public: explicit IContentStorage(Core::System& system_, FileSys::StorageId id) - : ServiceFramework{system_, "IContentStorage"}, storage{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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -240,24 +252,23 @@ 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 { public: explicit IContentMetaDatabase(Core::System& system_, FileSys::StorageId id) - : ServiceFramework{system_, "IContentMetaDatabase"}, storage{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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -345,37 +356,51 @@ 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 entries; }; class LR final : public ServiceFramework { public: - explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} {} + 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 - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenLocationResolver"}, - FunctionInfo{1, nullptr, "OpenRegisteredLocationResolver"}, - FunctionInfo{2, nullptr, "RefreshLocationResolver"}, - FunctionInfo{3, nullptr, "OpenAddOnContentLocationResolver"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class NCM final : public ServiceFramework { public: - explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -400,39 +425,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(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 { public: explicit NCM_V(Core::System& system_) : ServiceFramework{system_, "ncm:v"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "GetSystemVersion"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSystemVersion"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ncm/ncm.h b/src/core/hle/service/ncm/ncm.h index b78efdcd79..1d8bc7a9ea 100644 --- a/src/core/hle/service/ncm/ncm.h +++ b/src/core/hle/service/ncm/ncm.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 diff --git a/src/core/hle/service/nfc/common/device.h b/src/core/hle/service/nfc/common/device.h index d59202d18f..98063bbc29 100644 --- a/src/core/hle/service/nfc/common/device.h +++ b/src/core/hle/service/nfc/common/device.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-2.0-or-later diff --git a/src/core/hle/service/nfc/common/device_manager.h b/src/core/hle/service/nfc/common/device_manager.h index 6c0e6b255e..116ae8cb7e 100644 --- a/src/core/hle/service/nfc/common/device_manager.h +++ b/src/core/hle/service/nfc/common/device_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-3.0-or-later diff --git a/src/core/hle/service/nfc/mifare_result.h b/src/core/hle/service/nfc/mifare_result.h index 16a9171e60..399f01313e 100644 --- a/src/core/hle/service/nfc/mifare_result.h +++ b/src/core/hle/service/nfc/mifare_result.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 diff --git a/src/core/hle/service/nfc/mifare_types.h b/src/core/hle/service/nfc/mifare_types.h index 4679373994..237f60f0de 100644 --- a/src/core/hle/service/nfc/mifare_types.h +++ b/src/core/hle/service/nfc/mifare_types.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 diff --git a/src/core/hle/service/nfc/nfc.cpp b/src/core/hle/service/nfc/nfc.cpp index d3a986faea..f64445835e 100644 --- a/src/core/hle/service/nfc/nfc.cpp +++ b/src/core/hle/service/nfc/nfc.cpp @@ -18,71 +18,74 @@ namespace Service::NFC { class IUser final : public NfcInterface { public: - explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &NfcInterface::Initialize, "InitializeOld"}, - FunctionInfoTyped{1, &NfcInterface::Finalize, "FinalizeOld"}, - FunctionInfoTyped{2, &NfcInterface::GetState, "GetStateOld"}, - FunctionInfoTyped{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, - FunctionInfoTyped{400, &NfcInterface::Initialize, "Initialize"}, - FunctionInfoTyped{401, &NfcInterface::Finalize, "Finalize"}, - FunctionInfoTyped{402, &NfcInterface::GetState, "GetState"}, - FunctionInfoTyped{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, - FunctionInfoTyped{404, &NfcInterface::ListDevices, "ListDevices"}, - FunctionInfoTyped{405, &NfcInterface::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{406, &NfcInterface::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{408, &NfcInterface::StartDetection, "StartDetection"}, - FunctionInfoTyped{409, &NfcInterface::StopDetection, "StopDetection"}, - FunctionInfoTyped{410, &NfcInterface::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{1000, &NfcInterface::ReadMifare, "ReadMifare"}, - FunctionInfoTyped{1001, &NfcInterface::WriteMifare ,"WriteMifare"}, - FunctionInfoTyped{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, - FunctionInfoTyped{1301, nullptr, "KeepPassThroughSession"}, - FunctionInfoTyped{1302, nullptr, "ReleasePassThroughSession"} - ); }; class ISystem final : public NfcInterface { public: - explicit ISystem(Core::System& system_) : NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &NfcInterface::Initialize, "InitializeOld"}, - FunctionInfoTyped{1, &NfcInterface::Finalize, "FinalizeOld"}, - FunctionInfoTyped{2, &NfcInterface::GetState, "GetStateOld"}, - FunctionInfoTyped{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, - FunctionInfoTyped{100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"}, - FunctionInfoTyped{400, &NfcInterface::Initialize, "Initialize"}, - FunctionInfoTyped{401, &NfcInterface::Finalize, "Finalize"}, - FunctionInfoTyped{402, &NfcInterface::GetState, "GetState"}, - FunctionInfoTyped{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, - FunctionInfoTyped{404, &NfcInterface::ListDevices, "ListDevices"}, - FunctionInfoTyped{405, &NfcInterface::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{406, &NfcInterface::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{408, &NfcInterface::StartDetection, "StartDetection"}, - FunctionInfoTyped{409, &NfcInterface::StopDetection, "StopDetection"}, - FunctionInfoTyped{410, &NfcInterface::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"}, - FunctionInfoTyped{510, nullptr, "OutputTestWave"}, - FunctionInfoTyped{1000, &NfcInterface::ReadMifare, "ReadMifare"}, - FunctionInfoTyped{1001, &NfcInterface::WriteMifare, "WriteMifare"}, - FunctionInfoTyped{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, - FunctionInfoTyped{1301, nullptr, "KeepPassThroughSession"}, - FunctionInfoTyped{1302, nullptr, "ReleasePassThroughSession"} - ); }; // MFInterface has an unique interface but it's identical to NfcInterface so we can keep the code @@ -90,49 +93,56 @@ public: using MFInterface = NfcInterface; class MFIUser final : public MFInterface { public: - explicit MFIUser(Core::System& system_) : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} {} + explicit MFIUser(Core::System& system_) + : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} { + // clang-format off + static const FunctionInfoTyped 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &MFIUser::Initialize, "Initialize"}, - FunctionInfoTyped{1, &MFIUser::Finalize, "Finalize"}, - FunctionInfoTyped{2, &MFIUser::ListDevices, "ListDevices"}, - FunctionInfoTyped{3, &MFIUser::StartDetection, "StartDetection"}, - FunctionInfoTyped{4, &MFIUser::StopDetection, "StopDetection"}, - FunctionInfoTyped{5, &MFIUser::ReadMifare, "Read"}, - FunctionInfoTyped{6, &MFIUser::WriteMifare, "Write"}, - FunctionInfoTyped{7, &MFIUser::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{8, &MFIUser::AttachActivateEvent, "GetActivateEventHandle"}, - FunctionInfoTyped{9, &MFIUser::AttachDeactivateEvent, "GetDeactivateEventHandle"}, - FunctionInfoTyped{10, &MFIUser::GetState, "GetState"}, - FunctionInfoTyped{11, &MFIUser::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{12, &MFIUser::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"} - ); }; class IAm final : public ServiceFramework { public: - explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} {} + 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 - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "Finalize"}, - FunctionInfo{2, nullptr, "NotifyForegroundApplet"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class NFC_AM final : public ServiceFramework { public: - explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -143,18 +153,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"} - ); }; class NFC_MF_U final : public ServiceFramework { public: - explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -165,18 +175,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"} - ); }; class NFC_U final : public ServiceFramework { public: - explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -187,18 +197,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"} - ); }; class NFC_SYS final : public ServiceFramework { public: - explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -209,10 +219,6 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(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/nfc/nfc.h b/src/core/hle/service/nfc/nfc.h index d15955b755..bfda30d6f1 100644 --- a/src/core/hle/service/nfc/nfc.h +++ b/src/core/hle/service/nfc/nfc.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 diff --git a/src/core/hle/service/nfc/nfc_interface.h b/src/core/hle/service/nfc/nfc_interface.h index 5cc0d8ec04..a1e0d8d9ca 100644 --- a/src/core/hle/service/nfc/nfc_interface.h +++ b/src/core/hle/service/nfc/nfc_interface.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-2.0-or-later diff --git a/src/core/hle/service/nfc/nfc_result.h b/src/core/hle/service/nfc/nfc_result.h index 464b5fd69a..aab83c326c 100644 --- a/src/core/hle/service/nfc/nfc_result.h +++ b/src/core/hle/service/nfc/nfc_result.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 diff --git a/src/core/hle/service/nfc/nfc_types.h b/src/core/hle/service/nfc/nfc_types.h index 6d44014ea1..6774a9b4d6 100644 --- a/src/core/hle/service/nfc/nfc_types.h +++ b/src/core/hle/service/nfc/nfc_types.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 2023 yuzu Emulator Project diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index bfeb7d5553..e0c24679ab 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp @@ -14,134 +14,145 @@ namespace Service::NFP { class IUser final : public Interface { public: - explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") {} + explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") { + // clang-format off + static const FunctionInfoTyped 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &IUser::Initialize, "Initialize"}, - FunctionInfoTyped{1, &IUser::Finalize, "Finalize"}, - FunctionInfoTyped{2, &IUser::ListDevices, "ListDevices"}, - FunctionInfoTyped{3, &IUser::StartDetection, "StartDetection"}, - FunctionInfoTyped{4, &IUser::StopDetection, "StopDetection"}, - FunctionInfoTyped{5, &IUser::Mount, "Mount"}, - FunctionInfoTyped{6, &IUser::Unmount, "Unmount"}, - FunctionInfoTyped{7, &IUser::OpenApplicationArea, "OpenApplicationArea"}, - FunctionInfoTyped{8, &IUser::GetApplicationArea, "GetApplicationArea"}, - FunctionInfoTyped{9, &IUser::SetApplicationArea, "SetApplicationArea"}, - FunctionInfoTyped{10, &IUser::Flush, "Flush"}, - FunctionInfoTyped{11, &IUser::Restore, "Restore"}, - FunctionInfoTyped{12, &IUser::CreateApplicationArea, "CreateApplicationArea"}, - FunctionInfoTyped{13, &IUser::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{14, &IUser::GetRegisterInfo, "GetRegisterInfo"}, - FunctionInfoTyped{15, &IUser::GetCommonInfo, "GetCommonInfo"}, - FunctionInfoTyped{16, &IUser::GetModelInfo, "GetModelInfo"}, - FunctionInfoTyped{17, &IUser::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{18, &IUser::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{19, &IUser::GetState, "GetState"}, - FunctionInfoTyped{20, &IUser::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{21, &IUser::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"}, - FunctionInfoTyped{23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"}, - FunctionInfoTyped{25, &IUser::StartDetection, "StartDetectionWithFilter"} - ); }; class ISystem final : public Interface { public: - explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") {} + explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") { + // clang-format off + static const FunctionInfoTyped 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &ISystem::InitializeSystem, "InitializeSystem"}, - FunctionInfoTyped{1, &ISystem::FinalizeSystem, "FinalizeSystem"}, - FunctionInfoTyped{2, &ISystem::ListDevices, "ListDevices"}, - FunctionInfoTyped{3, &ISystem::StartDetection, "StartDetection"}, - FunctionInfoTyped{4, &ISystem::StopDetection, "StopDetection"}, - FunctionInfoTyped{5, &ISystem::Mount, "Mount"}, - FunctionInfoTyped{6, &ISystem::Unmount, "Unmount"}, - FunctionInfoTyped{10, &ISystem::Flush, "Flush"}, - FunctionInfoTyped{11, &ISystem::Restore, "Restore"}, - FunctionInfoTyped{12, &ISystem::CreateApplicationArea, "CreateApplicationArea"}, - FunctionInfoTyped{13, &ISystem::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{14, &ISystem::GetRegisterInfo, "GetRegisterInfo"}, - FunctionInfoTyped{15, &ISystem::GetCommonInfo, "GetCommonInfo"}, - FunctionInfoTyped{16, &ISystem::GetModelInfo, "GetModelInfo"}, - FunctionInfoTyped{17, &ISystem::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{18, &ISystem::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{19, &ISystem::GetState, "GetState"}, - FunctionInfoTyped{20, &ISystem::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{21, &ISystem::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{25, &ISystem::StartDetection, "StartDetectionWithFilter"}, - FunctionInfoTyped{100, &ISystem::Format, "Format"}, - FunctionInfoTyped{101, &ISystem::GetAdminInfo, "GetAdminInfo"}, - FunctionInfoTyped{102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, - FunctionInfoTyped{103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, - FunctionInfoTyped{104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"}, - FunctionInfoTyped{105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"}, - FunctionInfoTyped{106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"} - ); }; class IDebug final : public Interface { public: - explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") {} + explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") { + // clang-format off + static const FunctionInfoTyped 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &IDebug::InitializeDebug, "InitializeDebug"}, - FunctionInfoTyped{1, &IDebug::FinalizeDebug, "FinalizeDebug"}, - FunctionInfoTyped{2, &IDebug::ListDevices, "ListDevices"}, - FunctionInfoTyped{3, &IDebug::StartDetection, "StartDetection"}, - FunctionInfoTyped{4, &IDebug::StopDetection, "StopDetection"}, - FunctionInfoTyped{5, &IDebug::Mount, "Mount"}, - FunctionInfoTyped{6, &IDebug::Unmount, "Unmount"}, - FunctionInfoTyped{7, &IDebug::OpenApplicationArea, "OpenApplicationArea"}, - FunctionInfoTyped{8, &IDebug::GetApplicationArea, "GetApplicationArea"}, - FunctionInfoTyped{9, &IDebug::SetApplicationArea, "SetApplicationArea"}, - FunctionInfoTyped{10, &IDebug::Flush, "Flush"}, - FunctionInfoTyped{11, &IDebug::Restore, "Restore"}, - FunctionInfoTyped{12, &IDebug::CreateApplicationArea, "CreateApplicationArea"}, - FunctionInfoTyped{13, &IDebug::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{14, &IDebug::GetRegisterInfo, "GetRegisterInfo"}, - FunctionInfoTyped{15, &IDebug::GetCommonInfo, "GetCommonInfo"}, - FunctionInfoTyped{16, &IDebug::GetModelInfo, "GetModelInfo"}, - FunctionInfoTyped{17, &IDebug::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{18, &IDebug::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{19, &IDebug::GetState, "GetState"}, - FunctionInfoTyped{20, &IDebug::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{21, &IDebug::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"}, - FunctionInfoTyped{23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"}, - FunctionInfoTyped{25, &IDebug::StartDetection, "StartDetectionWithFilter"}, - FunctionInfoTyped{100, &IDebug::Format, "Format"}, - FunctionInfoTyped{101, &IDebug::GetAdminInfo, "GetAdminInfo"}, - FunctionInfoTyped{102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, - FunctionInfoTyped{103, &IDebug::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, - FunctionInfoTyped{104, &IDebug::DeleteRegisterInfo, "DeleteRegisterInfo"}, - FunctionInfoTyped{105, &IDebug::DeleteApplicationArea, "DeleteApplicationArea"}, - FunctionInfoTyped{106, &IDebug::ExistsApplicationArea, "ExistsApplicationArea"}, - FunctionInfoTyped{200, &IDebug::GetAll, "GetAll"}, - FunctionInfoTyped{201, &IDebug::SetAll, "SetAll"}, - FunctionInfoTyped{202, &IDebug::FlushDebug, "FlushDebug"}, - FunctionInfoTyped{203, &IDebug::BreakTag, "BreakTag"}, - FunctionInfoTyped{204, &IDebug::ReadBackupData, "ReadBackupData"}, - FunctionInfoTyped{205, &IDebug::WriteBackupData, "WriteBackupData"}, - FunctionInfoTyped{206, &IDebug::WriteNtf, "WriteNtf"} - ); }; class IUserManager final : public ServiceFramework { public: - explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} {} + 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); + } private: void CreateUserInterface(HLERequestContext& ctx) { @@ -151,21 +162,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IUserManager::CreateUserInterface, "CreateUserInterface"} - ); }; class ISystemManager final : public ServiceFramework { public: - explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} {} + explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -176,18 +184,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"} - ); }; class IDebugManager final : public ServiceFramework { public: - explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} {} + explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -198,10 +206,6 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h index a5aac710b5..e7af7ae39d 100644 --- a/src/core/hle/service/nfp/nfp.h +++ b/src/core/hle/service/nfp/nfp.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 diff --git a/src/core/hle/service/nfp/nfp_interface.h b/src/core/hle/service/nfp/nfp_interface.h index fa985b068e..531db84652 100644 --- a/src/core/hle/service/nfp/nfp_interface.h +++ b/src/core/hle/service/nfp/nfp_interface.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 diff --git a/src/core/hle/service/nfp/nfp_result.h b/src/core/hle/service/nfp/nfp_result.h index 6185338438..528b5417fa 100644 --- a/src/core/hle/service/nfp/nfp_result.h +++ b/src/core/hle/service/nfp/nfp_result.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-2.0-or-later diff --git a/src/core/hle/service/nfp/nfp_types.h b/src/core/hle/service/nfp/nfp_types.h index 8330134d18..108548ea46 100644 --- a/src/core/hle/service/nfp/nfp_types.h +++ b/src/core/hle/service/nfp/nfp_types.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 2022 yuzu Emulator Project diff --git a/src/core/hle/service/ngc/ngc.cpp b/src/core/hle/service/ngc/ngc.cpp index fb3ef39093..e79108a1eb 100644 --- a/src/core/hle/service/ngc/ngc.cpp +++ b/src/core/hle/service/ngc/ngc.cpp @@ -21,10 +21,15 @@ namespace Service::NGC { class IService final : public ServiceFramework { public: - explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -56,19 +61,23 @@ 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 { public: - explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -141,34 +150,25 @@ 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 { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; @@ -179,10 +179,20 @@ static_assert(sizeof(SaveDataHandle) == 0x08); class IUserShimScopedObject final : public ServiceFramework { public: - explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } Result OpenSaveData(Account::Uid unk0, Out unk1) { @@ -200,43 +210,42 @@ 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 { public: - explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } Result Cmd0(u32 unk0, OutInterface out_interface) { LOG_WARNING(Service_NGC, "stubbed"); *out_interface = std::make_shared(system); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IUserService::Cmd0>, "Cmd0"} - ); }; class ISystemShimScopedObject final : public ServiceFramework { public: - explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } Result Cmd108() { @@ -248,36 +257,23 @@ 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 { public: - explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } Result Cmd0(OutInterface out_interface) { LOG_WARNING(Service_NGC, "stubbed"); *out_interface = std::make_shared(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/ngc/ngc.h b/src/core/hle/service/ngc/ngc.h index 823b1aa819..7dc4a46577 100644 --- a/src/core/hle/service/ngc/ngc.h +++ b/src/core/hle/service/ngc/ngc.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 diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 5befe8e943..efada9b807 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -235,6 +235,15 @@ 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"); } @@ -248,6 +257,8 @@ public: } private: + std::vector scan_results; + void Submit(HLERequestContext& ctx) { if (state.load() == State::Finished) { @@ -318,17 +329,6 @@ private: evt_scan_complete->Signal(system.Kernel()); } - std::optional 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 scan_results; KernelHelpers::ServiceContext svc_ctx; Kernel::KEvent* evt_scan_complete{}; @@ -342,6 +342,36 @@ class IRequest final : public ServiceFramework { 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; @@ -464,37 +494,6 @@ private: event1->Signal(system.Kernel()); } - std::optional 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; @@ -509,16 +508,14 @@ private: class INetworkProfile final : public ServiceFramework { public: - explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} { + static const FunctionInfo functions[] = { + {0, nullptr, "Update"}, + {1, nullptr, "PersistOld"}, + {2, nullptr, "Persist"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Update"}, - FunctionInfo{1, nullptr, "PersistOld"}, - FunctionInfo{2, nullptr, "Persist"} - ); }; void IGeneralService::GetClientId(HLERequestContext& ctx) { @@ -1053,70 +1050,78 @@ void IGeneralService::GetCurrentAccessPoint(HLERequestContext& ctx) { rb.Push(ResultSuccess); } -std::optional 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 { public: - explicit NetworkInterface(const char* name, Core::System& system_) : ServiceFramework{system_, name} {} + 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); + } private: void CreateGeneralServiceOld(HLERequestContext& ctx) { @@ -1134,14 +1139,6 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - std::optional 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 3f3535fa93..44859e0c51 100644 --- a/src/core/hle/service/nifm/nifm.h +++ b/src/core/hle/service/nifm/nifm.h @@ -51,7 +51,6 @@ private: void SetBackgroundRequestEnabled(HLERequestContext& ctx); void GetCurrentAccessPoint(HLERequestContext& ctx); void GetScanDataV3(HLERequestContext& ctx); - std::optional 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 c48bf54646..e5f2d85dde 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp @@ -24,13 +24,22 @@ namespace Service::NIM { class IShopServiceAsync final : public ServiceFramework { public: explicit IShopServiceAsync(Core::System& system_) - : ServiceFramework{system_, "IShopServiceAsync"} - , service_context{system_, "IShopServiceAsync"} { - completion_event = service_context.CreateEvent("IShopServiceAsync:Completion"); - } + : 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + completion_event = service_context.CreateEvent("IShopServiceAsync:Completion"); } ~IShopServiceAsync() override { @@ -43,6 +52,15 @@ public: } private: + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* completion_event; + + std::jthread worker; + std::atomic error_code{0}; + + std::mutex data_mutex; + std::vector download_data; + void CancelImpl() { worker.request_stop(); if (worker.joinable()) { @@ -118,30 +136,19 @@ 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 error_code{0}; - std::mutex data_mutex; - std::vector download_data; }; class IShopServiceAccessor final : public ServiceFramework { public: explicit IShopServiceAccessor(Core::System& system_) - : ServiceFramework{system_, "IShopServiceAccessor"} {} + : ServiceFramework{system_, "IShopServiceAccessor"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -153,19 +160,19 @@ private: rb.PushCopyObjects(ctx, async_interface->GetEvent()); rb.PushIpcInterface(ctx, std::move(async_interface)); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"} - ); }; class IShopServiceAccessServer final : public ServiceFramework { public: explicit IShopServiceAccessServer(Core::System& system_) - : ServiceFramework{system_, "IShopServiceAccessServer"} {} + : ServiceFramework{system_, "IShopServiceAccessServer"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -175,252 +182,258 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"} - ); }; class NIM final : public ServiceFramework { public: - explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class NIM_ECA final : public ServiceFramework { public: - explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -450,53 +463,45 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(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 { public: - explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -506,7 +511,19 @@ public: explicit IEnsureNetworkClockAvailabilityService(Core::System& system_) : ServiceFramework{system_, "IEnsureNetworkClockAvailabilityService"}, service_context{system_, "IEnsureNetworkClockAvailabilityService"} { - finished_event = service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent"); + 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"); } ~IEnsureNetworkClockAvailabilityService() override { @@ -563,27 +580,23 @@ private: rb.PushRaw(server_time); } - std::optional 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 { public: - explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -609,24 +622,18 @@ 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 { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; diff --git a/src/core/hle/service/nim/nim.h b/src/core/hle/service/nim/nim.h index e7d599908d..0fad2a71af 100644 --- a/src/core/hle/service/nim/nim.h +++ b/src/core/hle/service/nim/nim.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 diff --git a/src/core/hle/service/npns/npns.cpp b/src/core/hle/service/npns/npns.cpp index 90bf633e8b..b0f74bef06 100644 --- a/src/core/hle/service/npns/npns.cpp +++ b/src/core/hle/service/npns/npns.cpp @@ -19,10 +19,79 @@ class INpnsSystem final : public ServiceFramework { 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} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } ~INpnsSystem() override = default; @@ -71,74 +140,6 @@ 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; @@ -147,10 +148,34 @@ private: class INpnsUser final : public ServiceFramework { public: explicit INpnsUser(Core::System& system_) - : ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} {} + : 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -170,29 +195,6 @@ 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/npns/npns.h b/src/core/hle/service/npns/npns.h index 0019fca763..e54a91a213 100644 --- a/src/core/hle/service/npns/npns.h +++ b/src/core/hle/service/npns/npns.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 diff --git a/src/core/hle/service/ns/account_proxy_interface.cpp b/src/core/hle/service/ns/account_proxy_interface.cpp index 0107e16b72..2e3dcf928d 100644 --- a/src/core/hle/service/ns/account_proxy_interface.cpp +++ b/src/core/hle/service/ns/account_proxy_interface.cpp @@ -10,6 +10,13 @@ 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 37248726a9..14cec4ddbc 100644 --- a/src/core/hle/service/ns/account_proxy_interface.h +++ b/src/core/hle/service/ns/account_proxy_interface.h @@ -14,13 +14,6 @@ class IAccountProxyInterface final : public ServiceFramework 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 7220c52dcb..348649917e 100644 --- a/src/core/hle/service/ns/application_manager_interface.cpp +++ b/src/core/hle/service/ns/application_manager_interface.cpp @@ -25,458 +25,6 @@ namespace Service::NS { -std::optional 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"}, @@ -484,6 +32,458 @@ 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 592068823c..c4ca66f319 100644 --- a/src/core/hle/service/ns/application_manager_interface.h +++ b/src/core/hle/service/ns/application_manager_interface.h @@ -85,7 +85,6 @@ public: void PushApplicationRecord(HLERequestContext& ctx); void ListApplicationTitle(HLERequestContext& ctx); void ListApplicationIcon(HLERequestContext& ctx); - std::optional 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 e1e747f6d2..0ed9514c2c 100644 --- a/src/core/hle/service/ns/application_version_interface.cpp +++ b/src/core/hle/service/ns/application_version_interface.cpp @@ -10,6 +10,25 @@ 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 c1f7710a00..fcbb966a4d 100644 --- a/src/core/hle/service/ns/application_version_interface.h +++ b/src/core/hle/service/ns/application_version_interface.h @@ -14,25 +14,6 @@ class IApplicationVersionInterface final : public ServiceFramework 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 d93c510141..8617280bef 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 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 1cad75bf47..914ea5a42c 100644 --- a/src/core/hle/service/ns/async_result.h +++ b/src/core/hle/service/ns/async_result.h @@ -13,7 +13,6 @@ public: private: Result Cancel(); - std::optional 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 45922ffab3..39b9cb6f70 100644 --- a/src/core/hle/service/ns/content_management_interface.cpp +++ b/src/core/hle/service/ns/content_management_interface.cpp @@ -15,6 +15,22 @@ 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 bddd044b45..df0c51a184 100644 --- a/src/core/hle/service/ns/content_management_interface.h +++ b/src/core/hle/service/ns/content_management_interface.h @@ -24,22 +24,6 @@ public: Result GetTotalSpaceSize(Out out_total_space_size, FileSys::StorageId storage_id); Result GetFreeSpaceSize(Out out_free_space_size, FileSys::StorageId storage_id); Result GetUnknown71(Out out_value_a, Out out_value_b, u8 flag); - - std::optional 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 2fc41cd7dd..5a44c61f1b 100644 --- a/src/core/hle/service/ns/develop_interface.cpp +++ b/src/core/hle/service/ns/develop_interface.cpp @@ -9,6 +9,31 @@ 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 55e54fa38d..d7cb9e7a56 100644 --- a/src/core/hle/service/ns/develop_interface.h +++ b/src/core/hle/service/ns/develop_interface.h @@ -14,31 +14,6 @@ class IDevelopInterface final : public ServiceFramework { public: explicit IDevelopInterface(Core::System& system_); ~IDevelopInterface() override; - - std::optional 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 f9a1e2267a..00593d1edc 100644 --- a/src/core/hle/service/ns/document_interface.cpp +++ b/src/core/hle/service/ns/document_interface.cpp @@ -12,6 +12,15 @@ 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 43a194c3e6..4c8b15b54a 100644 --- a/src/core/hle/service/ns/document_interface.h +++ b/src/core/hle/service/ns/document_interface.h @@ -20,15 +20,6 @@ public: private: Result ResolveApplicationContentPath(ContentPath content_path); Result GetRunningApplicationProgramId(Out out_program_id, u64 caller_program_id); - - std::optional 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 9fe6ca512f..18db60e7b0 100644 --- a/src/core/hle/service/ns/download_task_interface.cpp +++ b/src/core/hle/service/ns/download_task_interface.cpp @@ -11,6 +11,21 @@ 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 0fd2bacd42..1c46339daa 100644 --- a/src/core/hle/service/ns/download_task_interface.h +++ b/src/core/hle/service/ns/download_task_interface.h @@ -18,21 +18,6 @@ public: private: Result EnableAutoCommit(); Result DisableAutoCommit(); - - std::optional 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 951ef4c4b2..0301085670 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 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 e8a1d81491..c3270aee05 100644 --- a/src/core/hle/service/ns/dynamic_rights_interface.h +++ b/src/core/hle/service/ns/dynamic_rights_interface.h @@ -21,8 +21,6 @@ private: Result GetRunningApplicationStatus(Out out_status, u64 rights_handle); Result VerifyActivatedRightsOwners(u64 rights_handle); Result HasAccountRestrictedRightsInRunningApplications(Out out_is_restricted); - - std::optional 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 5687d09a02..b8794bb5fb 100644 --- a/src/core/hle/service/ns/ecommerce_interface.cpp +++ b/src/core/hle/service/ns/ecommerce_interface.cpp @@ -10,6 +10,19 @@ 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 d020ff5ef8..6ff9512123 100644 --- a/src/core/hle/service/ns/ecommerce_interface.h +++ b/src/core/hle/service/ns/ecommerce_interface.h @@ -14,19 +14,6 @@ class IECommerceInterface final : public ServiceFramework { public: explicit IECommerceInterface(Core::System& system_); ~IECommerceInterface() override; - - std::optional 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 1fc6edcc9b..11cdefb4be 100644 --- a/src/core/hle/service/ns/factory_reset_interface.cpp +++ b/src/core/hle/service/ns/factory_reset_interface.cpp @@ -8,21 +8,21 @@ namespace Service::NS { -std::optional 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 3d5700fb71..8181d6b379 100644 --- a/src/core/hle/service/ns/factory_reset_interface.h +++ b/src/core/hle/service/ns/factory_reset_interface.h @@ -14,7 +14,6 @@ class IFactoryResetInterface final : public ServiceFramework 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 ff1654517b..fe057422ce 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 { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; @@ -45,10 +45,18 @@ class IVulnerabilityManagerInterface final : public ServiceFramework { public: explicit IVulnerabilityManagerInterface(Core::System& system_) - : ServiceFramework{system_, "ns:vm"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } ~IVulnerabilityManagerInterface() override = default; @@ -68,15 +76,6 @@ 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/ns.h b/src/core/hle/service/ns/ns.h index f79b4ae3d6..2b14d115ca 100644 --- a/src/core/hle/service/ns/ns.h +++ b/src/core/hle/service/ns/ns.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 diff --git a/src/core/hle/service/ns/ns_results.h b/src/core/hle/service/ns/ns_results.h index 16d2ea6f7b..52f4c0ea59 100644 --- a/src/core/hle/service/ns/ns_results.h +++ b/src/core/hle/service/ns/ns_results.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 diff --git a/src/core/hle/service/ns/platform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp index dea6cb5c16..bf93a2edfa 100644 --- a/src/core/hle/service/ns/platform_service_manager.cpp +++ b/src/core/hle/service/ns/platform_service_manager.cpp @@ -27,28 +27,6 @@ namespace Service::NS { -std::optional 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; @@ -111,6 +89,28 @@ struct IPlatformServiceManager::Impl { IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const char* service_name_) : ServiceFramework{system_, service_name_}, impl{std::make_unique()} { + // 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 fb99a441f5..73521abbc2 100644 --- a/src/core/hle/service/ns/platform_service_manager.h +++ b/src/core/hle/service/ns/platform_service_manager.h @@ -68,12 +68,11 @@ private: Result GetSharedMemoryNativeHandle( OutCopyHandle out_shared_memory_native_handle); Result GetSharedFontInOrderOfPriority(OutArray out_font_codes, - OutArray out_font_offsets, - OutArray out_font_sizes, - Out out_fonts_are_loaded, Out out_font_count, - Set::LanguageCode language_code); + OutArray out_font_offsets, + OutArray out_font_sizes, + Out out_fonts_are_loaded, Out out_font_count, + Set::LanguageCode language_code); - std::optional FindRequest(u32 key) override; struct Impl; std::unique_ptr impl; }; diff --git a/src/core/hle/service/ns/query_service.cpp b/src/core/hle/service/ns/query_service.cpp index 13a1f33866..d22de1d169 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 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()} { + // 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 08267d3165..f5c0ae1058 100644 --- a/src/core/hle/service/ns/query_service.h +++ b/src/core/hle/service/ns/query_service.h @@ -62,7 +62,6 @@ private: OutArray out_stats, InArray application_ids); - std::optional FindRequest(u32 key) override; std::unique_ptr 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 c6cd822d24..1359cdbb95 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,21 +73,6 @@ void SanitizeJPEGImageSize(std::vector& image) { } // namespace -std::optional 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 @@ -99,6 +84,13 @@ 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()); } @@ -130,16 +122,6 @@ private: LOG_DEBUG(Service_NS, "called"); R_SUCCEED(); } - - std::optional 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; @@ -149,6 +131,22 @@ 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 3f68029583..a4a285151a 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,8 +45,6 @@ public: u8 flag1, u8 flag2, u64 application_id); - - std::optional 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 7a7cf9ec58..8ce7851ae2 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,18 +11,17 @@ namespace Service::NS { -std::optional 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 308e753e7d..dd842070e8 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 @@ -24,8 +24,6 @@ private: Result ListApplicationRecord( OutArray out_records, Out out_count, s32 entry_offset); - - std::optional 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 bbf30da3da..7b7f791650 100644 --- a/src/core/hle/service/ns/service_getter_interface.cpp +++ b/src/core/hle/service/ns/service_getter_interface.cpp @@ -20,25 +20,25 @@ namespace Service::NS { -std::optional 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 8c33aafc27..fc36b04325 100644 --- a/src/core/hle/service/ns/service_getter_interface.h +++ b/src/core/hle/service/ns/service_getter_interface.h @@ -45,8 +45,6 @@ public: Result GetContentManagementInterface( Out> out_interface); Result GetDocumentInterface(Out> out_interface); - - std::optional 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 3d1911c852..2711db508c 100644 --- a/src/core/hle/service/ns/system_update_control.cpp +++ b/src/core/hle/service/ns/system_update_control.cpp @@ -11,6 +11,35 @@ 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 acdf048e6c..70794f4abd 100644 --- a/src/core/hle/service/ns/system_update_control.h +++ b/src/core/hle/service/ns/system_update_control.h @@ -14,35 +14,6 @@ class ISystemUpdateControl final : public ServiceFramework public: explicit ISystemUpdateControl(Core::System& system_); ~ISystemUpdateControl() override; - - std::optional 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 044d39835f..3f4d42fdb6 100644 --- a/src/core/hle/service/ns/system_update_interface.cpp +++ b/src/core/hle/service/ns/system_update_interface.cpp @@ -10,32 +10,32 @@ namespace Service::NS { -std::optional 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 2ea14f4f5e..76f8959ed6 100644 --- a/src/core/hle/service/ns/system_update_interface.h +++ b/src/core/hle/service/ns/system_update_interface.h @@ -33,7 +33,7 @@ private: Result GetSystemUpdateNotificationEventForContentDelivery( OutCopyHandle out_event); - std::optional FindRequest(u32 key) override; +private: KernelHelpers::ServiceContext service_context; Event update_notification_event; }; diff --git a/src/core/hle/service/nvdrv/devices/ioctl_serialization.h b/src/core/hle/service/nvdrv/devices/ioctl_serialization.h index c3baa3a75b..37d04e3cf1 100644 --- a/src/core/hle/service/nvdrv/devices/ioctl_serialization.h +++ b/src/core/hle/service/nvdrv/devices/ioctl_serialization.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 2023 yuzu Emulator Project diff --git a/src/core/hle/service/nvdrv/devices/nvdevice.h b/src/core/hle/service/nvdrv/devices/nvdevice.h index 8adaddc60b..d23ec63bae 100644 --- a/src/core/hle/service/nvdrv/devices/nvdevice.h +++ b/src/core/hle/service/nvdrv/devices/nvdevice.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 diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp index 358679b831..1e571be4c9 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp @@ -278,7 +278,7 @@ NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) { params.flags = allowed_mask; } - s32_le ctx_class_number_index = + s32_le ctx_class_number_index = GetObjectContextClassNumberIndex(static_cast(params.class_num)); if (ctx_class_number_index < 0) { LOG_ERROR(Service_NVDRV, "Invalid class number for object context: {:#x}", diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h index 627686757b..1747881d48 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.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 diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h index def9c254d1..e0735b7f01 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.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 diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.h b/src/core/hle/service/nvdrv/devices/nvhost_vic.h index 0cc04354a0..b1cbcb9ad7 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_vic.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.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 diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 81d8a3a63b..b252a2efa5 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp @@ -50,61 +50,55 @@ class NVGEM_C final : public ServiceFramework { public: explicit NVGEM_C(Core::System& system_) : ServiceFramework{system_, "nvgem:c"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + 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); } - 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 { public: explicit NVGEM_CD(Core::System& system_) : ServiceFramework{system_, "nvgem:cd"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "GetAruid"}, + {2, nullptr, "ReadNextBlock"}, + {3, nullptr, "GetNextBlockSize"}, + {4, nullptr, "ReadNextBlock2"}, + }; + RegisterHandlers(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 { public: explicit NVDBG_D(Core::System& system_) : ServiceFramework{system_, "nvdbg:d"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + 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); } - 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 db3dbd9f8e..5fae68adbb 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.cpp +++ b/src/core/hle/service/nvdrv/nvdrv_interface.cpp @@ -245,6 +245,24 @@ void NVDRV::DumpGraphicsMemoryInfo(HLERequestContext& ctx) { NVDRV::NVDRV(Core::System& system_, std::shared_ptr 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 b9b574398a..f628fca7df 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.h +++ b/src/core/hle/service/nvdrv/nvdrv_interface.h @@ -38,27 +38,8 @@ private: void ServiceError(HLERequestContext& ctx, NvResult result); - std::optional 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 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 8e2e4dfacb..a5477faf1a 100644 --- a/src/core/hle/service/nvdrv/nvmemp.cpp +++ b/src/core/hle/service/nvdrv/nvmemp.cpp @@ -11,6 +11,11 @@ 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 e98b07c494..6ff59834fe 100644 --- a/src/core/hle/service/nvdrv/nvmemp.h +++ b/src/core/hle/service/nvdrv/nvmemp.h @@ -22,14 +22,6 @@ public: private: void Open(HLERequestContext& ctx); void GetAruid(HLERequestContext& ctx); - - std::optional 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/binder.h b/src/core/hle/service/nvnflinger/binder.h index 124accb946..6c7ce0ed0f 100644 --- a/src/core/hle/service/nvnflinger/binder.h +++ b/src/core/hle/service/nvnflinger/binder.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-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_item.h b/src/core/hle/service/nvnflinger/buffer_item.h index 7fd808f546..718188d849 100644 --- a/src/core/hle/service/nvnflinger/buffer_item.h +++ b/src/core/hle/service/nvnflinger/buffer_item.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-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_item_consumer.h b/src/core/hle/service/nvnflinger/buffer_item_consumer.h index 9f95c92800..7857569c0f 100644 --- a/src/core/hle/service/nvnflinger/buffer_item_consumer.h +++ b/src/core/hle/service/nvnflinger/buffer_item_consumer.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-FileCopyrightText: Copyright 2012 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_queue_consumer.h b/src/core/hle/service/nvnflinger/buffer_queue_consumer.h index a9226f1c35..84f36285c0 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_consumer.h +++ b/src/core/hle/service/nvnflinger/buffer_queue_consumer.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-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_queue_defs.h b/src/core/hle/service/nvnflinger/buffer_queue_defs.h index 6fd3156f4a..77ebd0a6a0 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_defs.h +++ b/src/core/hle/service/nvnflinger/buffer_queue_defs.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-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_transform_flags.h b/src/core/hle/service/nvnflinger/buffer_transform_flags.h index ffe579718f..6fb40d0a72 100644 --- a/src/core/hle/service/nvnflinger/buffer_transform_flags.h +++ b/src/core/hle/service/nvnflinger/buffer_transform_flags.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-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/consumer_base.h b/src/core/hle/service/nvnflinger/consumer_base.h index b29c16f86b..e187b520ca 100644 --- a/src/core/hle/service/nvnflinger/consumer_base.h +++ b/src/core/hle/service/nvnflinger/consumer_base.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-FileCopyrightText: Copyright 2010 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/consumer_listener.h b/src/core/hle/service/nvnflinger/consumer_listener.h index 74a1939883..4b4d939551 100644 --- a/src/core/hle/service/nvnflinger/consumer_listener.h +++ b/src/core/hle/service/nvnflinger/consumer_listener.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-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp b/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp index d72b49a8e7..5de604233d 100644 --- a/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp +++ b/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp @@ -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-FileCopyrightText: Copyright 2010 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/graphic_buffer_producer.h b/src/core/hle/service/nvnflinger/graphic_buffer_producer.h index 5d7cff7d38..05980eb482 100644 --- a/src/core/hle/service/nvnflinger/graphic_buffer_producer.h +++ b/src/core/hle/service/nvnflinger/graphic_buffer_producer.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-FileCopyrightText: Copyright 2010 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp index c9023374c4..fa1becc34e 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp +++ b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp @@ -11,21 +11,18 @@ namespace Service::Nvnflinger { -std::optional 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 server, std::shared_ptr 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 7d44046115..6b551c91d2 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver.h +++ b/src/core/hle/service/nvnflinger/hos_binder_driver.h @@ -44,7 +44,6 @@ private: OutBuffer parcel_reply, u32 flags); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr m_server; const std::shared_ptr m_surface_flinger; }; diff --git a/src/core/hle/service/nvnflinger/nvnflinger.cpp b/src/core/hle/service/nvnflinger/nvnflinger.cpp index 9e3b68b8a0..48862a747d 100644 --- a/src/core/hle/service/nvnflinger/nvnflinger.cpp +++ b/src/core/hle/service/nvnflinger/nvnflinger.cpp @@ -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-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/nvnflinger.h b/src/core/hle/service/nvnflinger/nvnflinger.h index 5c41f3013c..2f5465e7ef 100644 --- a/src/core/hle/service/nvnflinger/nvnflinger.h +++ b/src/core/hle/service/nvnflinger/nvnflinger.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-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/parcel.h b/src/core/hle/service/nvnflinger/parcel.h index 4567942016..ed85512792 100644 --- a/src/core/hle/service/nvnflinger/parcel.h +++ b/src/core/hle/service/nvnflinger/parcel.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 2021 yuzu Emulator Project diff --git a/src/core/hle/service/nvnflinger/pixel_format.h b/src/core/hle/service/nvnflinger/pixel_format.h index f77d0acfb3..b6e8b5f8a0 100644 --- a/src/core/hle/service/nvnflinger/pixel_format.h +++ b/src/core/hle/service/nvnflinger/pixel_format.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-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/producer_listener.h b/src/core/hle/service/nvnflinger/producer_listener.h index 6bf8aaf1ee..892f6d531d 100644 --- a/src/core/hle/service/nvnflinger/producer_listener.h +++ b/src/core/hle/service/nvnflinger/producer_listener.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-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/status.h b/src/core/hle/service/nvnflinger/status.h index 3fa0fe15b9..7b188b42f5 100644 --- a/src/core/hle/service/nvnflinger/status.h +++ b/src/core/hle/service/nvnflinger/status.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-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp b/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp index ede2a11933..5ba7a31cc8 100644 --- a/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp +++ b/src/core/hle/service/nvnflinger/ui/graphic_buffer.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-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/ui/graphic_buffer.h b/src/core/hle/service/nvnflinger/ui/graphic_buffer.h index da430aa752..099429b3f0 100644 --- a/src/core/hle/service/nvnflinger/ui/graphic_buffer.h +++ b/src/core/hle/service/nvnflinger/ui/graphic_buffer.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-FileCopyrightText: Copyright 2007 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/window.h b/src/core/hle/service/nvnflinger/window.h index 36d6cde3db..78a99f57ae 100644 --- a/src/core/hle/service/nvnflinger/window.h +++ b/src/core/hle/service/nvnflinger/window.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-3.0-or-later diff --git a/src/core/hle/service/olsc/daemon_controller.cpp b/src/core/hle/service/olsc/daemon_controller.cpp index f25888170c..c449c6ff31 100644 --- a/src/core/hle/service/olsc/daemon_controller.cpp +++ b/src/core/hle/service/olsc/daemon_controller.cpp @@ -9,24 +9,26 @@ namespace Service::OLSC { -std::optional 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"} { + // 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 -IDaemonController::IDaemonController(Core::System& system_) : ServiceFramework{system_, "IDaemonController"} {} + RegisterHandlers(functions); +} IDaemonController::~IDaemonController() = default; diff --git a/src/core/hle/service/olsc/daemon_controller.h b/src/core/hle/service/olsc/daemon_controller.h index b90d3ee778..70f3d9e235 100644 --- a/src/core/hle/service/olsc/daemon_controller.h +++ b/src/core/hle/service/olsc/daemon_controller.h @@ -38,8 +38,6 @@ private: Result GetAutonomyTaskStatus(Out out_status, Common::UUID user_id); - std::optional 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 1f6f8419fc..1e50195539 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 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 0ab51c7ca0..e0eac50c28 100644 --- a/src/core/hle/service/olsc/native_handle_holder.h +++ b/src/core/hle/service/olsc/native_handle_holder.h @@ -25,7 +25,6 @@ public: private: Result GetNativeHandle(OutCopyHandle out_event); - std::optional 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 03b8a696f5..a86c525f9a 100644 --- a/src/core/hle/service/olsc/olsc.cpp +++ b/src/core/hle/service/olsc/olsc.cpp @@ -6,179 +6,22 @@ #include "core/hle/service/olsc/olsc.h" #include "core/hle/service/olsc/olsc_service_for_application.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/olsc/olsc_service_for_system_service.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 { public: - explicit ISProfileBgAgentForSystemProcess(Core::System& system_) : ServiceFramework{system_, "spbg:sp"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit ISProfileBgAgentForSystemProcess(Core::System& system_) + : ServiceFramework{system_, "spbg:sp"} + { + static const FunctionInfo functions[] = { + { 100, nullptr, "OpenBgAgentController" }, + }; + RegisterHandlers(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 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 { -public: - explicit IOlscServiceForSystemService(Core::System& system_) - : ServiceFramework{system_, "olsc:s"} { - } - - ~IOlscServiceForSystemService() override = default; - - Result GetTransferTaskListController( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - Result GetRemoteStorageController( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDaemonController( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDataTransferPolicy( - Out 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 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> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::static_pointer_cast(shared_from_this()); - R_SUCCEED(); - } - - std::optional 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.h b/src/core/hle/service/olsc/olsc.h index 620b634fae..62000529c5 100644 --- a/src/core/hle/service/olsc/olsc.h +++ b/src/core/hle/service/olsc/olsc.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 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 8d6b20d7ff..73d7d4ed64 100644 --- a/src/core/hle/service/olsc/olsc_service_for_application.cpp +++ b/src/core/hle/service/olsc/olsc_service_for_application.cpp @@ -9,36 +9,36 @@ namespace Service::OLSC { -std::optional 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 0d92f9ba78..8941659478 100644 --- a/src/core/hle/service/olsc/olsc_service_for_application.h +++ b/src/core/hle/service/olsc/olsc_service_for_application.h @@ -22,8 +22,6 @@ private: Result GetSaveDataBackupSetting(Out out_save_data_backup_setting); Result SetSaveDataBackupSettingEnabled(bool enabled, NS::Uid account_id); - std::optional 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 new file mode 100644 index 0000000000..245bbd5c6b --- /dev/null +++ b/src/core/hle/service/olsc/olsc_service_for_system_service.cpp @@ -0,0 +1,144 @@ +// 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> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IOlscServiceForSystemService::GetRemoteStorageController( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IOlscServiceForSystemService::GetDaemonController( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IOlscServiceForSystemService::GetDataTransferPolicy( + Out 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 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> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::static_pointer_cast(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 new file mode 100644 index 0000000000..d16c8b979b --- /dev/null +++ b/src/core/hle/service/olsc/olsc_service_for_system_service.h @@ -0,0 +1,53 @@ +// 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 + +#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 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 { +public: + explicit IOlscServiceForSystemService(Core::System& system_); + ~IOlscServiceForSystemService() override; + +private: + Result GetTransferTaskListController( + Out> out_interface); + Result GetRemoteStorageController(Out> out_interface); + Result GetDaemonController(Out> out_interface); + Result GetDataTransferPolicy(Out out_policy, u64 application_id); + Result GetTransferTaskErrorInfo(Out out_info, Common::UUID uid, u64 application_id); + Result GetOlscServiceForSystemService( + Out> 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 1e7825da30..817097b426 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 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 20503d9800..21b439013a 100644 --- a/src/core/hle/service/olsc/remote_storage_controller.h +++ b/src/core/hle/service/olsc/remote_storage_controller.h @@ -21,8 +21,6 @@ private: u64 application_id); Result GetDataNewnessByApplicationId(Out out_newness, u64 application_id); Result GetDataInfo(Out> out_data, u64 application_id); - - std::optional 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 af090fc292..95e41cdb51 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 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 74c5eddee3..5f3429879a 100644 --- a/src/core/hle/service/olsc/transfer_task_list_controller.h +++ b/src/core/hle/service/olsc/transfer_task_list_controller.h @@ -27,8 +27,6 @@ private: Result GetTransferTaskProgress(); Result GetCurrentTransferTaskInfo(Out> out_info, u8 unknown); Result FindTransferTaskInfo(Out> out_info, InBuffer in); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::OLSC diff --git a/src/core/hle/service/omm/omm.cpp b/src/core/hle/service/omm/omm.cpp index b95319e26b..cc0b686ab1 100644 --- a/src/core/hle/service/omm/omm.cpp +++ b/src/core/hle/service/omm/omm.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 diff --git a/src/core/hle/service/omm/omm.h b/src/core/hle/service/omm/omm.h index 7bf04688ae..6b100a6d61 100644 --- a/src/core/hle/service/omm/omm.h +++ b/src/core/hle/service/omm/omm.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 diff --git a/src/core/hle/service/omm/operation_mode_manager.cpp b/src/core/hle/service/omm/operation_mode_manager.cpp index e36f606442..1af7714d0d 100644 --- a/src/core/hle/service/omm/operation_mode_manager.cpp +++ b/src/core/hle/service/omm/operation_mode_manager.cpp @@ -10,6 +10,41 @@ 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 ea604c8f60..dd6753757c 100644 --- a/src/core/hle/service/omm/operation_mode_manager.h +++ b/src/core/hle/service/omm/operation_mode_manager.h @@ -18,41 +18,6 @@ class IOperationModeManager final : public ServiceFramework 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 1d46de7f3e..b9e8277f8c 100644 --- a/src/core/hle/service/omm/policy_manager_system.cpp +++ b/src/core/hle/service/omm/policy_manager_system.cpp @@ -10,6 +10,18 @@ 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 c6ff451e61..2fb6eb9293 100644 --- a/src/core/hle/service/omm/policy_manager_system.h +++ b/src/core/hle/service/omm/policy_manager_system.h @@ -18,18 +18,6 @@ class IPolicyManagerSystem final : public ServiceFramework public: explicit IPolicyManagerSystem(Core::System& system_); ~IPolicyManagerSystem() override; - - std::optional 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 4150882695..04ea75b496 100644 --- a/src/core/hle/service/omm/power_state_interface.cpp +++ b/src/core/hle/service/omm/power_state_interface.cpp @@ -10,6 +10,24 @@ 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 fed55a4361..dc1d376a13 100644 --- a/src/core/hle/service/omm/power_state_interface.h +++ b/src/core/hle/service/omm/power_state_interface.h @@ -18,24 +18,6 @@ class IPowerStateInterface final : public ServiceFramework public: explicit IPowerStateInterface(Core::System& system_); ~IPowerStateInterface() override; - - std::optional 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/os/multi_wait.cpp b/src/core/hle/service/os/multi_wait.cpp index 7b80d28bed..c9bb256ab0 100644 --- a/src/core/hle/service/os/multi_wait.cpp +++ b/src/core/hle/service/os/multi_wait.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 diff --git a/src/core/hle/service/os/multi_wait.h b/src/core/hle/service/os/multi_wait.h index 340c611b5b..c9076c21d7 100644 --- a/src/core/hle/service/os/multi_wait.h +++ b/src/core/hle/service/os/multi_wait.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 diff --git a/src/core/hle/service/os/multi_wait_holder.cpp b/src/core/hle/service/os/multi_wait_holder.cpp index 01efa045b5..f3864218c9 100644 --- a/src/core/hle/service/os/multi_wait_holder.cpp +++ b/src/core/hle/service/os/multi_wait_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-2.0-or-later diff --git a/src/core/hle/service/os/multi_wait_holder.h b/src/core/hle/service/os/multi_wait_holder.h index 646395a3f3..3b28ec6b5a 100644 --- a/src/core/hle/service/os/multi_wait_holder.h +++ b/src/core/hle/service/os/multi_wait_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-2.0-or-later diff --git a/src/core/hle/service/os/multi_wait_utils.h b/src/core/hle/service/os/multi_wait_utils.h index 96d3a10f37..d8f3ade4c1 100644 --- a/src/core/hle/service/os/multi_wait_utils.h +++ b/src/core/hle/service/os/multi_wait_utils.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 diff --git a/src/core/hle/service/os/mutex.h b/src/core/hle/service/os/mutex.h index 95ac9b117a..8e29bbb633 100644 --- a/src/core/hle/service/os/mutex.h +++ b/src/core/hle/service/os/mutex.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 diff --git a/src/core/hle/service/pcie/pcie.cpp b/src/core/hle/service/pcie/pcie.cpp index f9aaa2d3b8..d162881ecf 100644 --- a/src/core/hle/service/pcie/pcie.cpp +++ b/src/core/hle/service/pcie/pcie.cpp @@ -15,62 +15,64 @@ namespace Service::PCIe { class ISession final : public ServiceFramework { public: - explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class PCIE final : public ServiceFramework { public: - explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} {} + explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RegisterClassDriver"}, + {1, nullptr, "QueryFunctionsUnregistered"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RegisterClassDriver"}, - FunctionInfo{1, nullptr, "QueryFunctionsUnregistered"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class PCIE_LOG final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; diff --git a/src/core/hle/service/pcie/pcie.h b/src/core/hle/service/pcie/pcie.h index 5c2d4b805b..cf2048ce65 100644 --- a/src/core/hle/service/pcie/pcie.h +++ b/src/core/hle/service/pcie/pcie.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 diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp new file mode 100644 index 0000000000..51953c2657 --- /dev/null +++ b/src/core/hle/service/pctl/parental_control_service.cpp @@ -0,0 +1,498 @@ +// 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 + +#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 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 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 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 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 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 out_safety_level) { + *out_safety_level = 0; + LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level); + R_SUCCEED(); +} + +Result IParentalControlService::GetCurrentSettings(Out out_settings) { + LOG_INFO(Service_PCTL, "called"); + *out_settings = restriction_settings; + R_SUCCEED(); +} + +Result IParentalControlService::GetFreeCommunicationApplicationListCount(Out 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 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 out_length) { + *out_length = 0; + LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length); + R_SUCCEED(); +} + +Result IParentalControlService::IsPairingActive(Out 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 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 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 out_remaining_time) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + *out_remaining_time = std::numeric_limits::max(); + R_SUCCEED(); +} + +Result IParentalControlService::IsRestrictedByPlayTimer(Out 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 out_play_timer_settings) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + *out_play_timer_settings = {}; + R_SUCCEED(); +} + +Result IParentalControlService::GetPlayTimerSettings(Out 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 out_event) { + LOG_INFO(Service_PCTL, "called"); + *out_event = request_suspension_event.GetHandle(); + R_SUCCEED(); +} + +Result IParentalControlService::IsPlayTimerAlarmDisabled(Out 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 out_display_info) { + LOG_DEBUG(Service_PCTL, "called"); + *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; + R_SUCCEED(); +} + +Result IParentalControlService::Unknown1460(u8 in_unk, Out out_display_info) { + LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk); + *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; + R_SUCCEED(); +} + +Result IParentalControlService::GetUnlinkedEvent(OutCopyHandle out_event) { + LOG_INFO(Service_PCTL, "called"); + *out_event = unlinked_event.GetHandle(); + R_SUCCEED(); +} + +Result IParentalControlService::GetStereoVisionRestriction( + Out 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 new file mode 100644 index 0000000000..9dabe3d059 --- /dev/null +++ b/src/core/hle/service/pctl/parental_control_service.h @@ -0,0 +1,99 @@ +// 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 { +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 restriction_bitset, + u64 nacp_flag, u64 application_id); + Result ConfirmResumeApplicationPermission(InBuffer restriction_bitset, + u64 nacp_flag, u64 application_id); + Result ConfirmSnsPostPermission(); + Result ConfirmSystemSettingsPermission(); + Result IsRestrictionTemporaryUnlocked(Out out_is_temporary_unlocked); + Result IsRestrictedSystemSettingsEntered(Out out_is_restricted_system_settings_entered); + Result ConfirmStereoVisionPermission(); + Result EndFreeCommunication(); + Result IsFreeCommunicationAvailable(); + Result IsRestrictionEnabled(Out out_restriction_enabled); + Result GetSafetyLevel(Out out_safety_level); + Result GetCurrentSettings(Out out_settings); + Result GetFreeCommunicationApplicationListCount(Out out_count); + Result ConfirmStereoVisionRestrictionConfigurable(); + Result IsStereoVisionPermitted(Out out_is_permitted); + Result GetPinCodeLength(Out out_length); + Result IsPairingActive(Out out_is_pairing_active); + Result GetSynchronizationEvent(OutCopyHandle out_event); + Result StartPlayTimer(); + Result StopPlayTimer(); + Result IsPlayTimerEnabled(Out out_is_play_timer_enabled); + Result GetPlayTimerRemainingTime(Out out_remaining_time); + Result IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer); + Result GetPlayTimerSettingsOld(Out out_play_timer_settings); + Result GetPlayTimerEventToRequestSuspension(OutCopyHandle out_event); + Result IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled); + Result GetPlayTimerRemainingTimeDisplayInfo(Out out_display_info); + Result Unknown1460(u8 in_unk, Out out_display_info); + Result GetUnlinkedEvent(OutCopyHandle out_event); + Result GetStereoVisionRestriction(Out out_stereo_vision_restriction); + Result SetStereoVisionRestriction(bool stereo_vision_restriction); + Result ResetConfirmedStereoVisionPermission(); + Result GetPlayTimerSettings(Out 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 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 new file mode 100644 index 0000000000..ae278a9bbc --- /dev/null +++ b/src/core/hle/service/pctl/parental_control_service_factory.cpp @@ -0,0 +1,44 @@ +// 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> out_service, ClientProcessId process_id) { + LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); + *out_service = std::make_shared( + system, capability, system.ResolveCallerProgramId(*process_id)); + R_SUCCEED(); +} + +Result IParentalControlServiceFactory::CreateServiceWithoutInitialize( + Out> out_service, ClientProcessId process_id) { + LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); + *out_service = std::make_shared( + 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 new file mode 100644 index 0000000000..0b5afede82 --- /dev/null +++ b/src/core/hle/service/pctl/parental_control_service_factory.h @@ -0,0 +1,34 @@ +// 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/pctl/pctl_types.h" +#include "core/hle/service/service.h" + +namespace Service::PCTL { + +class IParentalControlService; + +class IParentalControlServiceFactory : public ServiceFramework { +public: + explicit IParentalControlServiceFactory(Core::System& system_, const char* name_, + Capability capability_); + ~IParentalControlServiceFactory() override; + + Result CreateService(Out> out_service, + ClientProcessId process_id); + Result CreateServiceWithoutInitialize(Out> 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 4f0fbbe702..37f18a5d58 100644 --- a/src/core/hle/service/pctl/pctl.cpp +++ b/src/core/hle/service/pctl/pctl.cpp @@ -4,636 +4,27 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#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/parental_control_service_factory.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 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 settings; -}; -static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size."); - -// This is nn::pctl::PlayTimerSettings -struct PlayTimerSettings { - std::array 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 { -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 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 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 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 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 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 out_safety_level) { - *out_safety_level = 0; - LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level); - R_SUCCEED(); - } - - Result GetCurrentSettings(Out out_settings) { - LOG_INFO(Service_PCTL, "called"); - *out_settings = restriction_settings; - R_SUCCEED(); - } - - Result GetFreeCommunicationApplicationListCount(Out 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 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 out_length) { - *out_length = 0; - LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length); - R_SUCCEED(); - } - - Result IsPairingActive(Out 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 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 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 out_remaining_time) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - *out_remaining_time = std::numeric_limits::max(); - R_SUCCEED(); - } - - Result IsRestrictedByPlayTimer(Out 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 out_play_timer_settings) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - *out_play_timer_settings = {}; - R_SUCCEED(); - } - - Result GetPlayTimerSettings(Out 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 out_event) { - LOG_INFO(Service_PCTL, "called"); - *out_event = request_suspension_event.GetHandle(); - R_SUCCEED(); - } - - Result IsPlayTimerAlarmDisabled(Out 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 out_display_info) { - LOG_DEBUG(Service_PCTL, "called"); - *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; - R_SUCCEED(); - } - - Result Unknown1460(u8 in_unk, Out out_display_info) { - LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk); - *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; - R_SUCCEED(); - } - - Result GetUnlinkedEvent(OutCopyHandle out_event) { - LOG_INFO(Service_PCTL, "called"); - *out_event = unlinked_event.GetHandle(); - R_SUCCEED(); - } - - Result GetStereoVisionRestriction( - Out 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 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 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 { -public: - explicit IParentalControlServiceFactory(Core::System& system_, const char* name_, Capability capability_) - : ServiceFramework{system_, name_}, capability{capability_} - {} - - ~IParentalControlServiceFactory() override = default; - - Result CreateService(Out> out_service, ClientProcessId process_id) { - LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); - *out_service = std::make_shared( - system, capability, system.ResolveCallerProgramId(*process_id)); - R_SUCCEED(); - } - - Result CreateServiceWithoutInitialize(Out> out_service, ClientProcessId process_id) { - LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); - *out_service = std::make_shared( - system, capability, system.ResolveCallerProgramId(*process_id)); - R_SUCCEED(); - } - -private: - std::optional 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(system); - server_manager->RegisterNamedService("pctl", std::make_shared(system, "pctl", Capability::Application | Capability::SnsPost | Capability::Status | Capability::StereoVision)); + server_manager->RegisterNamedService("pctl", + std::make_shared( + system, "pctl", + Capability::Application | Capability::SnsPost | + Capability::Status | Capability::StereoVision)); // TODO(ogniK): Implement remaining capabilities - server_manager->RegisterNamedService("pctl:a", std::make_shared(system, "pctl:a", Capability::None)); - server_manager->RegisterNamedService("pctl:r", std::make_shared(system, "pctl:r", Capability::None)); - server_manager->RegisterNamedService("pctl:s", std::make_shared(system, "pctl:s", Capability::None)); + server_manager->RegisterNamedService("pctl:a", std::make_shared( + system, "pctl:a", Capability::None)); + server_manager->RegisterNamedService("pctl:r", std::make_shared( + system, "pctl:r", Capability::None)); + server_manager->RegisterNamedService("pctl:s", std::make_shared( + system, "pctl:s", Capability::None)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/pctl/pctl.h b/src/core/hle/service/pctl/pctl.h index 5f9d03d4df..020866aa3d 100644 --- a/src/core/hle/service/pctl/pctl.h +++ b/src/core/hle/service/pctl/pctl.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 diff --git a/src/core/hle/service/pctl/pctl_results.h b/src/core/hle/service/pctl/pctl_results.h new file mode 100644 index 0000000000..0aa4714a9c --- /dev/null +++ b/src/core/hle/service/pctl/pctl_results.h @@ -0,0 +1,18 @@ +// 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/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 new file mode 100644 index 0000000000..3a5a19099d --- /dev/null +++ b/src/core/hle/service/pctl/pctl_types.h @@ -0,0 +1,73 @@ +// 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 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 settings; +}; +static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size."); + +// This is nn::pctl::PlayTimerSettings +struct PlayTimerSettings { + std::array 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 bb3d748527..1b314f3518 100644 --- a/src/core/hle/service/pcv/pcv.cpp +++ b/src/core/hle/service/pcv/pcv.cpp @@ -15,76 +15,91 @@ namespace Service::PCV { class PCV final : public ServiceFramework { public: - explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class PCV_ARB final : public ServiceFramework { public: - explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ReleaseControl"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class PCV_IMM final : public ServiceFramework { public: - explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetClockRate"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class IClkrstSession final : public ServiceFramework { public: explicit IClkrstSession(Core::System& system_, DeviceCode device_code_) - : ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } private: @@ -105,30 +120,25 @@ private: rb.Push(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 { public: - explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -143,26 +153,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(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 { public: - explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {} + explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ReleaseControl"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ReleaseControl"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/pcv/pcv.h b/src/core/hle/service/pcv/pcv.h index bf541e6feb..27eb179ff4 100644 --- a/src/core/hle/service/pcv/pcv.h +++ b/src/core/hle/service/pcv/pcv.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 diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp index 3d431c305f..ff7053b690 100644 --- a/src/core/hle/service/pm/pm.cpp +++ b/src/core/hle/service/pm/pm.cpp @@ -47,7 +47,13 @@ void GetApplicationPidGeneric(Kernel::KernelCore& kernel, HLERequestContext& ctx class BootMode final : public ServiceFramework { public: - explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} {} + explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} { + static const FunctionInfo functions[] = { + {0, &BootMode::GetBootMode, "GetBootMode"}, + {1, &BootMode::SetMaintenanceBoot, "SetMaintenanceBoot"}, + }; + RegisterHandlers(functions); + } private: void GetBootMode(HLERequestContext& ctx) { @@ -67,19 +73,28 @@ private: rb.Push(ResultSuccess); } - std::optional 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 { public: - explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "pm:dmnt"} {} + 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); + } private: void GetProcessId(HLERequestContext& ctx) { @@ -149,26 +164,19 @@ private: rb.PushRaw(program_location); rb.PushRaw(override_status); } - - std::optional 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 { public: - explicit Info(Core::System& system_) : ServiceFramework{system_, "pm:info"} {} + 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); + } private: void GetProgramId(HLERequestContext& ctx) { @@ -210,24 +218,27 @@ private: rb.Push(ResultSuccess); rb.Push(process->GetProcessId()); } - - std::optional 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 { public: - explicit Shell(Core::System& system_) : ServiceFramework{system_, "pm:shell"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -236,19 +247,6 @@ 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/pm/pm.h b/src/core/hle/service/pm/pm.h index 5d4a1a171c..da70cfc6b8 100644 --- a/src/core/hle/service/pm/pm.h +++ b/src/core/hle/service/pm/pm.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 diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index a199c41d2c..e76c3ea93c 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp @@ -21,10 +21,45 @@ namespace Service::PlayReport { class PlayReport final : public ServiceFramework { public: - explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} {} + explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} { + // clang-format off + static const FunctionInfo functions[] = { + {10100, &PlayReport::SaveReport, "SaveReportOld"}, + {10101, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld"}, + {10102, &PlayReport::SaveReport, "SaveReportOld2"}, + {10103, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld2"}, + {10104, &PlayReport::SaveReport, "SaveReportOld3"}, + {10105, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld3"}, + {10106, &PlayReport::SaveReport, "SaveReport"}, + {10107, &PlayReport::SaveReportWithUser, "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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -179,51 +214,21 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{10100, &PlayReport::SaveReport, "SaveReportOld"}, - FunctionInfo{10101, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld"}, - FunctionInfo{10102, &PlayReport::SaveReport, "SaveReportOld2"}, - FunctionInfo{10103, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld2"}, - FunctionInfo{10104, &PlayReport::SaveReport, "SaveReportOld3"}, - FunctionInfo{10105, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld3"}, - FunctionInfo{10106, &PlayReport::SaveReport, "SaveReport"}, - FunctionInfo{10107, &PlayReport::SaveReportWithUser, "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(system); - server_manager->RegisterNamedService("prepo:a", std::make_shared("prepo:a", system)); - server_manager->RegisterNamedService("prepo:a2", std::make_shared("prepo:a2", system)); - server_manager->RegisterNamedService("prepo:m", std::make_shared("prepo:m", system)); - server_manager->RegisterNamedService("prepo:s", std::make_shared("prepo:s", system)); - server_manager->RegisterNamedService("prepo:u", std::make_shared("prepo:u", system)); + server_manager->RegisterNamedService("prepo:a", + std::make_shared("prepo:a", system)); + server_manager->RegisterNamedService("prepo:a2", + std::make_shared("prepo:a2", system)); + server_manager->RegisterNamedService("prepo:m", + std::make_shared("prepo:m", system)); + server_manager->RegisterNamedService("prepo:s", + std::make_shared("prepo:s", system)); + server_manager->RegisterNamedService("prepo:u", + std::make_shared("prepo:u", system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/prepo/prepo.h b/src/core/hle/service/prepo/prepo.h index 2c2462f936..4caf752888 100644 --- a/src/core/hle/service/prepo/prepo.h +++ b/src/core/hle/service/prepo/prepo.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 diff --git a/src/core/hle/service/psc/ovln/ovln_types.h b/src/core/hle/service/psc/ovln/ovln_types.h index f96b52fb49..d827f039fe 100644 --- a/src/core/hle/service/psc/ovln/ovln_types.h +++ b/src/core/hle/service/psc/ovln/ovln_types.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 diff --git a/src/core/hle/service/psc/ovln/receiver.cpp b/src/core/hle/service/psc/ovln/receiver.cpp new file mode 100644 index 0000000000..f43d705126 --- /dev/null +++ b/src/core/hle/service/psc/ovln/receiver.cpp @@ -0,0 +1,118 @@ +// 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 out_event) { + LOG_INFO(Service_PSC, "called"); + *out_event = &receive_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IReceiver::Receive(Out out_notification, Out out_flags) { + u64 tick; + return ReceiveWithTick(out_notification, out_flags, Out(&tick)); +} + +Result IReceiver::ReceiveWithTick(Out out_notification, + Out out_flags, Out 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 new file mode 100644 index 0000000000..5f73d1a66c --- /dev/null +++ b/src/core/hle/service/psc/ovln/receiver.h @@ -0,0 +1,46 @@ +// 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 +#include +#include +#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 { +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 out_event); + Result Receive(Out out_notification, Out out_flags); + Result ReceiveWithTick(Out out_notification, Out out_flags, + Out out_tick); + + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* receive_event; + + std::map>> 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 0df9d802b9..3b0b180725 100644 --- a/src/core/hle/service/psc/ovln/receiver_service.cpp +++ b/src/core/hle/service/psc/ovln/receiver_service.cpp @@ -5,126 +5,19 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/psc/ovln/ovln_types.h" +#include "core/hle/service/psc/ovln/receiver.h" #include "core/hle/service/psc/ovln/receiver_service.h" namespace Service::PSC { -class IReceiver final : public ServiceFramework { -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 out_event) { - LOG_INFO(Service_PSC, "called"); - *out_event = &receive_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result Receive(Out out_notification, Out out_flags) { - u64 tick; - return ReceiveWithTick(out_notification, out_flags, Out(&tick)); - } - - Result ReceiveWithTick(Out out_notification, Out out_flags, Out 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 - } - - std::optional 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>> message_sources; -}; - -std::optional 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"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"}, + }; + // clang-format on + + RegisterHandlers(functions); } 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 bd053cd50c..a7a9b012e8 100644 --- a/src/core/hle/service/psc/ovln/receiver_service.h +++ b/src/core/hle/service/psc/ovln/receiver_service.h @@ -20,8 +20,6 @@ public: private: Result OpenReceiver(Out> out_receiver); - - std::optional 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 new file mode 100644 index 0000000000..dffcd4bc36 --- /dev/null +++ b/src/core/hle/service/psc/ovln/sender.cpp @@ -0,0 +1,35 @@ +// 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" + +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 new file mode 100644 index 0000000000..9b0fe786bd --- /dev/null +++ b/src/core/hle/service/psc/ovln/sender.h @@ -0,0 +1,24 @@ +// 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/psc/ovln/ovln_types.h" +#include "core/hle/service/service.h" + +namespace Service::PSC { + +class ISender final : public ServiceFramework { +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 5a36f1e1ec..8f80a5c461 100644 --- a/src/core/hle/service/psc/ovln/sender_service.cpp +++ b/src/core/hle/service/psc/ovln/sender_service.cpp @@ -5,43 +5,19 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/psc/ovln/ovln_types.h" +#include "core/hle/service/psc/ovln/sender.h" #include "core/hle/service/psc/ovln/sender_service.h" namespace Service::PSC { -class ISender final : public ServiceFramework { -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(); - } - - std::optional 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 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"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ISenderService::OpenSender>, "OpenSender"}, + }; + // clang-format on + + RegisterHandlers(functions); } 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 90a9a33872..8176e85e23 100644 --- a/src/core/hle/service/psc/ovln/sender_service.h +++ b/src/core/hle/service/psc/ovln/sender_service.h @@ -19,9 +19,8 @@ public: ~ISenderService() override; private: - Result OpenSender(Out> out_sender, u32 sender_id, std::array data); - - std::optional FindRequest(u32 key) override; + Result OpenSender(Out> out_sender, u32 sender_id, + std::array data); }; } // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_control.cpp b/src/core/hle/service/psc/pm_control.cpp new file mode 100644 index 0000000000..fc5852f863 --- /dev/null +++ b/src/core/hle/service/psc/pm_control.cpp @@ -0,0 +1,31 @@ +// 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/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 new file mode 100644 index 0000000000..7967f7ab18 --- /dev/null +++ b/src/core/hle/service/psc/pm_control.h @@ -0,0 +1,19 @@ +// 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/service.h" + +namespace Service::PSC { + +class IPmControl final : public ServiceFramework { +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 new file mode 100644 index 0000000000..38ca36ab8f --- /dev/null +++ b/src/core/hle/service/psc/pm_module.cpp @@ -0,0 +1,27 @@ +// 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/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 new file mode 100644 index 0000000000..dac8fcff2a --- /dev/null +++ b/src/core/hle/service/psc/pm_module.h @@ -0,0 +1,19 @@ +// 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/service.h" + +namespace Service::PSC { + +class IPmModule final : public ServiceFramework { +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 new file mode 100644 index 0000000000..d1803bdf48 --- /dev/null +++ b/src/core/hle/service/psc/pm_service.cpp @@ -0,0 +1,31 @@ +// 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/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> out_module) { + LOG_DEBUG(Service_PSC, "called"); + *out_module = std::make_shared(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 new file mode 100644 index 0000000000..721a0602c9 --- /dev/null +++ b/src/core/hle/service/psc/pm_service.h @@ -0,0 +1,25 @@ +// 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::PSC { + +class IPmModule; + +class IPmService final : public ServiceFramework { +public: + explicit IPmService(Core::System& system_); + ~IPmService() override; + +private: + Result GetPmModule(Out> out_module); +}; + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/psc.cpp b/src/core/hle/service/psc/psc.cpp index 553c4f63a4..31fb9f0117 100644 --- a/src/core/hle/service/psc/psc.cpp +++ b/src/core/hle/service/psc/psc.cpp @@ -6,159 +6,102 @@ #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 { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class INS_R final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class INS_S final : public ServiceFramework { public: - explicit INS_S(Core::System& system_) : ServiceFramework{system_, "ins:s"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetNotifyEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class HSHL_SYS final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class HSHL_SET final : public ServiceFramework { public: - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; -class IPmModule final : public ServiceFramework { -public: - explicit IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} {} - ~IPmModule() override = default; - - std::optional 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 { -public: - explicit IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} {} - ~IPmService() override = default; - -private: - Result GetPmModule(Out> out_module) { - LOG_DEBUG(Service_PSC, "called"); - *out_module = std::make_shared(system); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IPmService::GetPmModule>, "GetPmModule"} - ); -}; - -class IPmControl final : public ServiceFramework { -public: - explicit IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} {} - ~IPmControl() override = default; - - std::optional 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) { auto server_manager = std::make_unique(system); diff --git a/src/core/hle/service/psc/psc.h b/src/core/hle/service/psc/psc.h index c83d07ca80..d89e6854cc 100644 --- a/src/core/hle/service/psc/psc.h +++ b/src/core/hle/service/psc/psc.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 diff --git a/src/core/hle/service/psc/time/alarms.cpp b/src/core/hle/service/psc/time/alarms.cpp index c9070896b3..17a795c4c5 100644 --- a/src/core/hle/service/psc/time/alarms.cpp +++ b/src/core/hle/service/psc/time/alarms.cpp @@ -33,7 +33,8 @@ Alarm::~Alarm() { } Alarms::Alarms(Core::System& system, StandardSteadyClockCore& steady_clock, PowerStateRequestManager& power_state_request_manager) - : m_ctx{system, "Psc:Alarms"} + : m_system{system} + , 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")} @@ -135,7 +136,15 @@ Result Alarms::UpdateClosestAndSignal(Kernel::KernelCore& kernel) { IAlarmService::IAlarmService(Core::System& system_, std::shared_ptr 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."); @@ -156,6 +165,17 @@ 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 6d916ca198..0a2fa7fac5 100644 --- a/src/core/hle/service/psc/time/alarms.h +++ b/src/core/hle/service/psc/time/alarms.h @@ -95,6 +95,7 @@ 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; @@ -113,14 +114,6 @@ public: private: void CreateWakeupAlarm(HLERequestContext& ctx); void CreateBackgroundTaskAlarm(HLERequestContext& ctx); - - std::optional 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; }; @@ -135,18 +128,8 @@ private: void Disable(HLERequestContext& ctx); void IsEnabled(HLERequestContext& ctx); - std::optional 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/clocks/ephemeral_network_system_clock_core.h b/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h index 0a68867d94..0abe200206 100644 --- a/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp index 6a74d45946..d0e596c504 100644 --- a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h index 5722d8e965..832c6907a0 100644 --- a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp index 6938d369fe..b3143ead71 100644 --- a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h index bfafc7d71f..47a411e811 100644 --- a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp index 7a72d7aa25..8fc44fd691 100644 --- a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h index bbf98fcd5c..342d6385fd 100644 --- a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h index 32b8bc3bcd..14c8e613f4 100644 --- a/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/steady_clock_core.h b/src/core/hle/service/psc/time/clocks/steady_clock_core.h index f933cc15f8..31be5e25ad 100644 --- a/src/core/hle/service/psc/time/clocks/steady_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/steady_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/system_clock_core.cpp b/src/core/hle/service/psc/time/clocks/system_clock_core.cpp index 2b7466831d..7ca5e8515e 100644 --- a/src/core/hle/service/psc/time/clocks/system_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/system_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/system_clock_core.h b/src/core/hle/service/psc/time/clocks/system_clock_core.h index 0b928432fb..d95bab5191 100644 --- a/src/core/hle/service/psc/time/clocks/system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/system_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp index 22da1fbccc..8666df57f1 100644 --- a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.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 diff --git a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h index a7bea86a25..62890cd5ca 100644 --- a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.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 diff --git a/src/core/hle/service/psc/time/common.cpp b/src/core/hle/service/psc/time/common.cpp index a6d9f02ca3..dce2249ea1 100644 --- a/src/core/hle/service/psc/time/common.cpp +++ b/src/core/hle/service/psc/time/common.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 diff --git a/src/core/hle/service/psc/time/manager.h b/src/core/hle/service/psc/time/manager.h index 2cb8b58a2b..7c771d25f5 100644 --- a/src/core/hle/service/psc/time/manager.h +++ b/src/core/hle/service/psc/time/manager.h @@ -26,20 +26,20 @@ namespace Service::PSC::Time { class TimeManager { public: explicit TimeManager(Core::System& 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} - {} + : 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; StandardSteadyClockCore m_standard_steady_clock; TickBasedSteadyClockCore m_tick_based_steady_clock; diff --git a/src/core/hle/service/psc/time/power_state_request_manager.h b/src/core/hle/service/psc/time/power_state_request_manager.h index 30a0c947d6..325f73913b 100644 --- a/src/core/hle/service/psc/time/power_state_request_manager.h +++ b/src/core/hle/service/psc/time/power_state_request_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 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 795aeb94a8..39af16b6f1 100644 --- a/src/core/hle/service/psc/time/power_state_service.cpp +++ b/src/core/hle/service/psc/time/power_state_service.cpp @@ -9,19 +9,20 @@ namespace Service::PSC::Time { -std::optional 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 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 14d9c1a77a..81b3adf234 100644 --- a/src/core/hle/service/psc/time/power_state_service.h +++ b/src/core/hle/service/psc/time/power_state_service.h @@ -27,7 +27,6 @@ public: Result GetAndClearPowerStateRequest(Out out_cleared, Out out_priority); private: - std::optional 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 be25ee9a70..e9f1407e4d 100644 --- a/src/core/hle/service/psc/time/service_manager.cpp +++ b/src/core/hle/service/psc/time/service_manager.cpp @@ -13,30 +13,6 @@ namespace Service::PSC::Time { - std::optional 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 time, ServerManager* server_manager) : ServiceFramework{system_, "time:m"}, m_time{std::move(time)}, @@ -51,6 +27,30 @@ ServiceManager::ServiceManager(Core::System& system_, std::shared_ptrm_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 a8b94d8939..09cff25038 100644 --- a/src/core/hle/service/psc/time/service_manager.h +++ b/src/core/hle/service/psc/time/service_manager.h @@ -65,8 +65,6 @@ private: void SetupSAndP(); Result GetStaticService(OutInterface out_service, StaticServiceSetupInfo setup_info, const char* name); - std::optional FindRequest(u32 key) override; - std::shared_ptr m_time; ServerManager& m_server_manager; bool m_is_s_and_p_setup{}; diff --git a/src/core/hle/service/psc/time/shared_memory.cpp b/src/core/hle/service/psc/time/shared_memory.cpp index adef6bcd8b..b6841a87cb 100644 --- a/src/core/hle/service/psc/time/shared_memory.cpp +++ b/src/core/hle/service/psc/time/shared_memory.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 diff --git a/src/core/hle/service/psc/time/static.cpp b/src/core/hle/service/psc/time/static.cpp index 2b2b6f1f04..28cff3b764 100644 --- a/src/core/hle/service/psc/time/static.cpp +++ b/src/core/hle/service/psc/time/static.cpp @@ -33,31 +33,6 @@ constexpr Result GetTimeFromTimePointAndContext(s64* out_time, SteadyClockTimePo } } // namespace -std::optional 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 time, const char* name) : ServiceFramework{system_, name}, m_setup_info{setup_info}, m_time{time}, @@ -67,6 +42,31 @@ 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 out_service) { diff --git a/src/core/hle/service/psc/time/static.h b/src/core/hle/service/psc/time/static.h index a86fec178f..52659166f1 100644 --- a/src/core/hle/service/psc/time/static.h +++ b/src/core/hle/service/psc/time/static.h @@ -71,8 +71,6 @@ private: Result GetClockSnapshotImpl(OutClockSnapshot out_snapshot, const SystemClockContext& user_context, const SystemClockContext& network_context, TimeType type); - std::optional FindRequest(u32 key) override; - StaticServiceSetupInfo m_setup_info; std::shared_ptr 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 3d138837d3..1d1551acf9 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 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 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 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 e4de3e3717..8d3d9a6280 100644 --- a/src/core/hle/service/psc/time/steady_clock.h +++ b/src/core/hle/service/psc/time/steady_clock.h @@ -34,8 +34,6 @@ public: Result GetSetupResultValue(Out out_result); Result GetInternalOffset(Out out_internal_offset); - std::optional 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 c08eca0b02..e978ffb5e5 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 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 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 4f7d285d39..0d91aaa735 100644 --- a/src/core/hle/service/psc/time/system_clock.h +++ b/src/core/hle/service/psc/time/system_clock.h @@ -31,7 +31,6 @@ public: Result GetOperationEventReadableHandle(OutCopyHandle out_event); private: - std::optional 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.cpp b/src/core/hle/service/psc/time/time_zone.cpp index 81bfb90929..e537a821db 100644 --- a/src/core/hle/service/psc/time/time_zone.cpp +++ b/src/core/hle/service/psc/time/time_zone.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 diff --git a/src/core/hle/service/psc/time/time_zone.h b/src/core/hle/service/psc/time/time_zone.h index 0e4ed6ed00..68a235e440 100644 --- a/src/core/hle/service/psc/time/time_zone.h +++ b/src/core/hle/service/psc/time/time_zone.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 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 6a717846d3..bd6bb3ba93 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 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 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 fbb107f87c..0067b08258 100644 --- a/src/core/hle/service/psc/time/time_zone_service.h +++ b/src/core/hle/service/psc/time/time_zone_service.h @@ -59,7 +59,6 @@ public: const CalendarTime& calendar_time); private: - std::optional 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 5cad46f997..41d172b71b 100644 --- a/src/core/hle/service/ptm/psm.cpp +++ b/src/core/hle/service/ptm/psm.cpp @@ -21,13 +21,20 @@ namespace Service::PTM { class IPsmSession final : public ServiceFramework { public: explicit IPsmSession(Core::System& system_) - : ServiceFramework{system_, "IPsmSession"} - , service_context{system_, "IPsmSession"} { - state_change_event = service_context.CreateEvent("IPsmSession::state_change_event"); - } + : 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + state_change_event = service_context.CreateEvent("IPsmSession::state_change_event"); } ~IPsmSession() override { @@ -105,15 +112,8 @@ private: rb.Push(ResultSuccess); } - 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,6 +122,31 @@ 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 fe77b23d79..77c38d1f9b 100644 --- a/src/core/hle/service/ptm/psm.h +++ b/src/core/hle/service/ptm/psm.h @@ -28,31 +28,6 @@ private: void GetBatteryVoltageState(HLERequestContext& ctx); void GetBatteryAgePercentage(HLERequestContext& ctx); void GetBatteryChargeInfoFields(HLERequestContext& ctx); - - std::optional 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 ad474ec411..de1d34a688 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 { public: explicit PSM_MANU(Core::System& system_) - : ServiceFramework{system_, "psm:manu"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "EnableVdd50StateControl"}, - FunctionInfo{1, nullptr, "DisableVdd50StateControl"}, - FunctionInfo{2, nullptr, "SetVdd50State"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class POWCTL final : public ServiceFramework { public: explicit POWCTL(Core::System& system_) - : ServiceFramework{system_, "powctl"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenSession"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "powctl"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenSession"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/ptm/ptm.h b/src/core/hle/service/ptm/ptm.h index a0ae03d282..a62877e441 100644 --- a/src/core/hle/service/ptm/ptm.h +++ b/src/core/hle/service/ptm/ptm.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 diff --git a/src/core/hle/service/ptm/ts.cpp b/src/core/hle/service/ptm/ts.cpp index f22ff2ec69..b1ac0c8f11 100644 --- a/src/core/hle/service/ptm/ts.cpp +++ b/src/core/hle/service/ptm/ts.cpp @@ -19,10 +19,16 @@ enum class Location : u8 { class ISession : public ServiceFramework { public: - explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -33,15 +39,20 @@ 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 21f3ac2b70..d8a0d49bf8 100644 --- a/src/core/hle/service/ptm/ts.h +++ b/src/core/hle/service/ptm/ts.h @@ -20,17 +20,6 @@ private: void GetTemperature(HLERequestContext& ctx); void GetTemperatureMilliC(HLERequestContext& ctx); void OpenSession(HLERequestContext& ctx); - - std::optional 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 838ff136f6..167bf04c9a 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -8,334 +8,21 @@ #include #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 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 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 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 reserved_10; - std::array modulus; - std::array 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(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(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 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: @@ -848,21 +535,29 @@ private: class RoInterface : public ServiceFramework { public: - explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr ro, NrrKind nrr_kind) - : ServiceFramework{system_, name_} - , m_ro(ro) - , m_context_id(InvalidContextId) - , m_nrr_kind(nrr_kind) - {} + explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr 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); + } ~RoInterface() { m_ro->UnregisterProcess(system.Kernel(), m_context_id); } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - Result MapManualLoadModuleMemory(Out 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)); @@ -899,14 +594,6 @@ 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 m_ro{}; size_t m_context_id{}; NrrKind m_nrr_kind{}; @@ -919,14 +606,12 @@ class IDebugMonitorInterface final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "GetProcessModuleInfo" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetProcessModuleInfo" } - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ro/ro.h b/src/core/hle/service/ro/ro.h index 74dc085368..c93aac3833 100644 --- a/src/core/hle/service/ro/ro.h +++ b/src/core/hle/service/ro/ro.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 diff --git a/src/core/hle/service/ro/ro_nro_utils.cpp b/src/core/hle/service/ro/ro_nro_utils.cpp new file mode 100644 index 0000000000..1c2a97619d --- /dev/null +++ b/src/core/hle/service/ro/ro_nro_utils.cpp @@ -0,0 +1,188 @@ +// 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 + +#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 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 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 new file mode 100644 index 0000000000..32b97abed2 --- /dev/null +++ b/src/core/hle/service/ro/ro_nro_utils.h @@ -0,0 +1,29 @@ +// 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 + +#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 new file mode 100644 index 0000000000..906378bc7f --- /dev/null +++ b/src/core/hle/service/ro/ro_results.h @@ -0,0 +1,29 @@ +// 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 new file mode 100644 index 0000000000..8e88f43246 --- /dev/null +++ b/src/core/hle/service/ro/ro_types.h @@ -0,0 +1,142 @@ +// 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 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 reserved_10; + std::array modulus; + std::array 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(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(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 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/server_manager.h b/src/core/hle/service/server_manager.h index 5173ce46e1..d86d20b7c5 100644 --- a/src/core/hle/service/server_manager.h +++ b/src/core/hle/service/server_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 diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 2c6e8d1c07..225b92a783 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -19,7 +19,6 @@ #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 { @@ -48,9 +47,24 @@ ServiceFrameworkBase::~ServiceFrameworkBase() { const auto guard = ServiceFrameworkBase::LockService(); } -void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated) { +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) { auto cmd_buf = ctx.CommandBuffer(); - std::string function_name = bool(info) ? info->name : ""; + std::string function_name = info == nullptr ? "" : info->name; 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]); @@ -59,11 +73,7 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, c buf.push_back('}'); system.GetReporter().SaveUnimplementedFunctionReport(ctx, ctx.GetCommand(), function_name, service_name); - if (gated) { - LOG_ERROR(Service, "Version gated {}", fmt::to_string(buf)); - } else { - UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf)); - } + 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}; @@ -71,33 +81,17 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, c } } -[[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 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); - } + 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); 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())) { @@ -107,15 +101,10 @@ void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) { } void ServiceFrameworkBase::InvokeRequestTipc(HLERequestContext& ctx) { - 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); - } + 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); 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 e8bd8683ea..ea98897e79 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h @@ -7,11 +7,7 @@ #pragma once #include -#include #include -#include -#include -#include "frozen/map.h" #include "common/container/unordered_map.h" #include "common/common_types.h" #include "core/hle/service/hle_ipc.h" @@ -81,35 +77,30 @@ protected: [[nodiscard]] virtual std::unique_lock LockService() noexcept { return std::unique_lock{lock_service}; } - - static constexpr u32 MakeVersionGate(std::tuple since, std::tuple 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 { - HandlerFnP handler_callback; - const char* name; - u32 version_gating; - }; - static_assert(std::is_trivially_constructible_v); private: template friend class ServiceFramework; - using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP member, HLERequestContext& ctx); + struct FunctionInfoBase { + u32 expected_header; + HandlerFnP handler_callback; + const char* name; + }; - explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_, u32 max_sessions_, InvokerFn* handler_invoker_); + using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP member, + HLERequestContext& ctx); + + explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_, + u32 max_sessions_, InvokerFn* handler_invoker_); ~ServiceFrameworkBase() override; - virtual std::optional FindRequest(u32 key) = 0; - virtual std::optional FindRequestTipc(u32 key) = 0; - - void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated); + 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); protected: + ::Common::unordered_map handlers; + ::Common::unordered_map 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. @@ -130,7 +121,8 @@ 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 { ... };`) + * from ServiceFramework using the CRTP (`class Foo : public ServiceFramework { ... };`) and + * populate it with handlers by calling #RegisterHandlers. * * 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 @@ -151,77 +143,50 @@ 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. - explicit constexpr FunctionInfoTyped(u32 expected_header_, HandlerFnP handler_callback_, const char* name_, u32 version_gating_ = 0) - : handler_callback{handler_callback_} - , name{name_} - , version_gating{version_gating_} - , expected_header{expected_header_} - {} - HandlerFnP handler_callback; - const char* name; - u32 version_gating; - u32 expected_header; + FunctionInfoTyped(u32 expected_header_, HandlerFnP handler_callback_, const char* name_) + : FunctionInfoBase{expected_header_, HandlerFnP(handler_callback_), name_} {} }; using FunctionInfo = FunctionInfoTyped; - // expected_header serves as a key to 'address' function handlers, thus only include the minimal - template - struct FunctionValueInfo { - explicit constexpr FunctionValueInfo(HandlerFnP handler_callback_, const char* name_, u32 version_gating_) - : handler_callback{handler_callback_} - , name{name_} - , version_gating{version_gating_} - {} - HandlerFnP handler_callback; - const char* name; - u32 version_gating; - }; - - template - //requires (std::same_as && ...) - [[nodiscard]] static consteval frozen::map, sizeof...(Ts)> CreateStaticMap(Ts... args) { - return frozen::map, sizeof...(args)>{ - {args.expected_header, FunctionValueInfo{args.handler_callback, args.name, args.version_gating}}... - }; - } - - // Used exclusively by NFC - template - //requires (std::same_as> && ...) - [[nodiscard]] static consteval frozen::map, sizeof...(Ts)> CreateStaticMapWithClass(Ts... args) { - return frozen::map, sizeof...(args)>{ - {args.expected_header, FunctionValueInfo{args.handler_callback, args.name, args.version_gating}}... - }; - } - - template - [[nodiscard]] static std::optional HandlerTableGenerateWithFind(u32 key, T const& map) { - auto const it = map.find(key); - if (it != map.end()) { - auto const r = it->second; - return std::optional{{ - HandlerFnP(r.handler_callback), - r.name, - r.version_gating - }}; - } - return std::nullopt; - } - - /// @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. + /** + * 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) - {} + : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker) {} - std::optional FindRequest(u32 key) override { - UNREACHABLE(); + /// Registers handlers in the service. + template + void RegisterHandlers(const FunctionInfoTyped (&functions)[N]) { + RegisterHandlers(functions, N); } - std::optional FindRequestTipc(u32 key) override { - UNREACHABLE(); + + /** + * Registers handlers in the service. Usually prefer using the other RegisterHandlers + * overload in order to avoid needing to specify the array size. + */ + template + void RegisterHandlers(const FunctionInfoTyped* functions, std::size_t n) { + RegisterHandlersBase(functions, n); + } + + /// Registers handlers in the service. + template + void RegisterHandlersTipc(const FunctionInfoTyped (&functions)[N]) { + RegisterHandlersTipc(functions, N); + } + + /** + * Registers handlers in the service. Usually prefer using the other RegisterHandlers + * overload in order to avoid needing to specify the array size. + */ + template + void RegisterHandlersTipc(const FunctionInfoTyped* functions, std::size_t n) { + RegisterHandlersBaseTipc(functions, n); } protected: diff --git a/src/core/hle/service/services.h b/src/core/hle/service/services.h index da5281ff29..4072afa3d1 100644 --- a/src/core/hle/service/services.h +++ b/src/core/hle/service/services.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 diff --git a/src/core/hle/service/set/factory_settings_server.cpp b/src/core/hle/service/set/factory_settings_server.cpp index 70d02fab3b..d663283c98 100644 --- a/src/core/hle/service/set/factory_settings_server.cpp +++ b/src/core/hle/service/set/factory_settings_server.cpp @@ -10,6 +10,55 @@ 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 dcc329f9c2..ddffcee643 100644 --- a/src/core/hle/service/set/factory_settings_server.h +++ b/src/core/hle/service/set/factory_settings_server.h @@ -18,55 +18,6 @@ class IFactorySettingsServer final : public ServiceFramework 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 35fb43f7e7..c491675567 100644 --- a/src/core/hle/service/set/firmware_debug_settings_server.cpp +++ b/src/core/hle/service/set/firmware_debug_settings_server.cpp @@ -10,6 +10,23 @@ 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 3727a1a94c..05019faa9f 100644 --- a/src/core/hle/service/set/firmware_debug_settings_server.h +++ b/src/core/hle/service/set/firmware_debug_settings_server.h @@ -18,23 +18,6 @@ class IFirmwareDebugSettingsServer final : public ServiceFramework 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/key_code_map.h b/src/core/hle/service/set/key_code_map.h index c76dc57298..8e010e718b 100644 --- a/src/core/hle/service/set/key_code_map.h +++ b/src/core/hle/service/set/key_code_map.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 diff --git a/src/core/hle/service/set/setting_formats/appln_settings.cpp b/src/core/hle/service/set/setting_formats/appln_settings.cpp index f7c7d5b912..5726a41cdf 100644 --- a/src/core/hle/service/set/setting_formats/appln_settings.cpp +++ b/src/core/hle/service/set/setting_formats/appln_settings.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 diff --git a/src/core/hle/service/set/setting_formats/appln_settings.h b/src/core/hle/service/set/setting_formats/appln_settings.h index ba9af998ab..2128a631e0 100644 --- a/src/core/hle/service/set/setting_formats/appln_settings.h +++ b/src/core/hle/service/set/setting_formats/appln_settings.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 diff --git a/src/core/hle/service/set/setting_formats/device_settings.cpp b/src/core/hle/service/set/setting_formats/device_settings.cpp index 5f295404d9..6e9c321d8e 100644 --- a/src/core/hle/service/set/setting_formats/device_settings.cpp +++ b/src/core/hle/service/set/setting_formats/device_settings.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 diff --git a/src/core/hle/service/set/setting_formats/private_settings.cpp b/src/core/hle/service/set/setting_formats/private_settings.cpp index 81c3624826..c3a67b60eb 100644 --- a/src/core/hle/service/set/setting_formats/private_settings.cpp +++ b/src/core/hle/service/set/setting_formats/private_settings.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 diff --git a/src/core/hle/service/set/setting_formats/private_settings.h b/src/core/hle/service/set/setting_formats/private_settings.h index 6579e95e04..75e3e03886 100644 --- a/src/core/hle/service/set/setting_formats/private_settings.h +++ b/src/core/hle/service/set/setting_formats/private_settings.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 diff --git a/src/core/hle/service/set/setting_formats/system_settings.cpp b/src/core/hle/service/set/setting_formats/system_settings.cpp index 258e213e13..fd70e2ace3 100644 --- a/src/core/hle/service/set/setting_formats/system_settings.cpp +++ b/src/core/hle/service/set/setting_formats/system_settings.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 diff --git a/src/core/hle/service/set/settings.h b/src/core/hle/service/set/settings.h index 03cd4bb661..e6288af2e5 100644 --- a/src/core/hle/service/set/settings.h +++ b/src/core/hle/service/set/settings.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 diff --git a/src/core/hle/service/set/settings_server.cpp b/src/core/hle/service/set/settings_server.cpp index 4580cb723b..942dddc9bc 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 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 2aa487b8b1..c37a65cbc9 100644 --- a/src/core/hle/service/set/settings_server.h +++ b/src/core/hle/service/set/settings_server.h @@ -26,19 +26,31 @@ public: private: Result GetLanguageCode(Out out_language_code); - Result GetAvailableLanguageCodes(Out out_count, OutArray language_codes); - Result MakeLanguageCode(Out out_language_code, Language language); - Result GetAvailableLanguageCodeCount(Out out_count); - Result GetRegionCode(Out out_region_code); - Result GetAvailableLanguageCodes2(Out out_count, OutArray language_codes); - Result GetAvailableLanguageCodeCount2(Out out_count); - Result GetKeyCodeMap(OutLargeData out_key_code_map); - Result GetQuestFlag(Out out_quest_flag); - Result GetKeyCodeMap2(OutLargeData out_key_code_map); - Result GetDeviceNickName(OutLargeData, BufferAttr_HipcMapAlias> out_device_name); - Result GetKeyCodeMapByPort(OutLargeData out_key_code_map, u32 port); - std::optional FindRequest(u32 key) override; + Result GetAvailableLanguageCodes(Out out_count, + OutArray language_codes); + + Result MakeLanguageCode(Out out_language_code, Language language); + + Result GetAvailableLanguageCodeCount(Out out_count); + + Result GetRegionCode(Out out_region_code); + + Result GetAvailableLanguageCodes2( + Out out_count, OutArray language_codes); + + Result GetAvailableLanguageCodeCount2(Out out_count); + + Result GetKeyCodeMap(OutLargeData out_key_code_map); + + Result GetQuestFlag(Out out_quest_flag); + + Result GetKeyCodeMap2(OutLargeData out_key_code_map); + + Result GetDeviceNickName( + OutLargeData, BufferAttr_HipcMapAlias> out_device_name); + + Result GetKeyCodeMapByPort(OutLargeData out_key_code_map, u32 port); }; } // 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 925207d927..52642e37f7 100644 --- a/src/core/hle/service/set/system_settings_server.cpp +++ b/src/core/hle/service/set/system_settings_server.cpp @@ -114,239 +114,240 @@ Result GetFirmwareVersionImpl(FirmwareVersionFormat& out_firmware, Core::System& return ResultSuccess; } -std::optional 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"} { + : 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); + 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 471ed61176..1d56e61f88 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(); - std::optional FindRequest(u32 key) override; + Core::System& m_system; 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 5c196b3218..c75c5437df 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -18,16 +18,7 @@ #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/sm/sm.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" +#include "core/hle/service/sm/sm_controller.h" namespace Service::SM { @@ -36,116 +27,6 @@ constexpr Result ResultAlreadyRegistered(ErrorModule::SM, 4); constexpr Result ResultInvalidServiceName(ErrorModule::SM, 6); constexpr Result ResultNotRegistered(ErrorModule::SM, 7); -class Controller final : public ServiceFramework { -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(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::max)()) { - LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping"); - buffer_size = (std::numeric_limits::max)(); - } - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(static_cast(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(); - - if (requested_size > (std::numeric_limits::max)()) { - LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF"); - requested_size = (std::numeric_limits::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 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(kernel.System()); } @@ -231,51 +112,6 @@ Result ServiceManager::GetServicePort(Kernel::KClientPort** out_client_port, return ResultSuccess; } -/// Interface to "sm:" service -class SM final : public ServiceFramework { -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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - std::optional 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: @@ -358,7 +194,7 @@ Result SM::GetServiceImpl(Kernel::KClientSession** out_client_session, HLEReques // Create a new session. Kernel::KClientSession* session{}; - if (const auto result = client_port->CreateSession(system.Kernel(), &session); result.IsError()) { + if (const auto result = client_port->CreateSession(kernel, &session); result.IsError()) { LOG_ERROR(Service_SM, "called service={} -> error {:#08x}", name, result.raw); return result; } @@ -429,7 +265,42 @@ 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 f17fc60080..c520a46fb2 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h @@ -33,7 +33,29 @@ class SessionRequestHandler; namespace Service::SM { class Controller; -class SM; + +/// Interface to "sm:" service +class SM final : public ServiceFramework { +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 ServiceManager { public: diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp new file mode 100644 index 0000000000..125eb4a247 --- /dev/null +++ b/src/core/hle/service/sm/sm_controller.cpp @@ -0,0 +1,128 @@ +// 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(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::max)()) { + LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping"); + buffer_size = (std::numeric_limits::max)(); + } + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(static_cast(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(); + + if (requested_size > (std::numeric_limits::max)()) { + LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF"); + requested_size = (std::numeric_limits::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 new file mode 100644 index 0000000000..f1fa327ff7 --- /dev/null +++ b/src/core/hle/service/sm/sm_controller.h @@ -0,0 +1,30 @@ +// 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/service.h" + +namespace Core { +class System; +} + +namespace Service::SM { + +class Controller final : public ServiceFramework { +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 63bd7051ca..0137a3be66 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -1083,6 +1083,59 @@ 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); }); @@ -1103,12 +1156,40 @@ std::unique_lock 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 c2aa343d51..5cc3eb5b81 100644 --- a/src/core/hle/service/sockets/bsd.h +++ b/src/core/hle/service/sockets/bsd.h @@ -1,5 +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 @@ -189,58 +190,6 @@ private: protected: std::unique_lock LockService() noexcept override; - - std::optional 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; }; @@ -248,41 +197,12 @@ class BSDCFG final : public ServiceFramework { public: explicit BSDCFG(Core::System& system_, const char *name); ~BSDCFG() override; - - std::optional 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 { public: explicit BSD_NU(Core::System& system_); ~BSD_NU() override; - - std::optional 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 8f042aee75..241f2971ca 100644 --- a/src/core/hle/service/sockets/nsd.cpp +++ b/src/core/hle/service/sockets/nsd.cpp @@ -29,6 +29,38 @@ 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 f3e4d48aff..e4a4588467 100644 --- a/src/core/hle/service/sockets/nsd.h +++ b/src/core/hle/service/sockets/nsd.h @@ -25,38 +25,6 @@ private: void ResolveEx(HLERequestContext& ctx); void GetEnvironmentIdentifier(HLERequestContext& ctx); void GetApplicationServerEnvironmentType(HLERequestContext& ctx); - - std::optional 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 c89705356e..93c01bf786 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -21,6 +21,25 @@ 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; @@ -391,6 +410,14 @@ 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 b365d03b2d..4302edc43e 100644 --- a/src/core/hle/service/sockets/sfdnsres.h +++ b/src/core/hle/service/sockets/sfdnsres.h @@ -26,43 +26,12 @@ private: void GetAddrInfoRequest(HLERequestContext& ctx); void GetAddrInfoRequestWithOptions(HLERequestContext& ctx); void ResolverSetOptionRequest(HLERequestContext& ctx); - - std::optional 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 { public: explicit DNS_PRIV(Core::System& system_); ~DNS_PRIV() override; - - std::optional 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 1c723e96a6..e96d7c5638 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 { public: explicit ETHC_C(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class ETHC_I final : public ServiceFramework { public: explicit ETHC_I(Core::System& system_) - : 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : 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); } }; class ISfDriverServiceCreator final : public ServiceFramework { public: explicit ISfDriverServiceCreator(Core::System& system_) - : ServiceFramework{system_, "eth:nd"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateDriverService"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "eth:nd"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateDriverService"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/sockets/sockets_translate.h b/src/core/hle/service/sockets/sockets_translate.h index bd6721fd3e..b1dfc71961 100644 --- a/src/core/hle/service/sockets/sockets_translate.h +++ b/src/core/hle/service/sockets/sockets_translate.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 diff --git a/src/core/hle/service/spl/spl.cpp b/src/core/hle/service/spl/spl.cpp index ad0251fac5..81be99c360 100644 --- a/src/core/hle/service/spl/spl.cpp +++ b/src/core/hle/service/spl/spl.cpp @@ -8,22 +8,181 @@ namespace Service::SPL { -SPL::SPL(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:") {} +SPL::SPL(Core::System& system_, std::shared_ptr 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() = default; -SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:mig") {} +SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr 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() = default; -SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:fs") {} +SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr 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() = default; -SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:ssl") {} +SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr 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() = default; -SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:es") {} +SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr 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() = default; -SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:manu") {} +SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr 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() = default; } // namespace Service::SPL diff --git a/src/core/hle/service/spl/spl.h b/src/core/hle/service/spl/spl.h index 8f84d2a3d3..83a3cda539 100644 --- a/src/core/hle/service/spl/spl.h +++ b/src/core/hle/service/spl/spl.h @@ -18,177 +18,36 @@ class SPL final : public Module::Interface { public: explicit SPL(Core::System& system_, std::shared_ptr module_); ~SPL() override; - - std::optional 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_); ~SPL_MIG() override; - - std::optional 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_); ~SPL_FS() override; - - std::optional 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_); ~SPL_SSL() override; - - std::optional 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_); ~SPL_ES() override; - - std::optional 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_); ~SPL_MANU() override; - - std::optional 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 594575d9a0..520cb1860b 100644 --- a/src/core/hle/service/spl/spl_module.cpp +++ b/src/core/hle/service/spl/spl_module.cpp @@ -204,15 +204,14 @@ 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_) : Interface(system_, std::move(module_), "csrng") {} - ~CSRNG() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit CSRNG(Core::System& system_, std::shared_ptr module_) + : Interface(system_, std::move(module_), "csrng") { + static const FunctionInfo functions[] = { + {0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"} - ); + ~CSRNG() override = default; }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/spl/spl_results.h b/src/core/hle/service/spl/spl_results.h index dd7ba11f34..8c09be49ab 100644 --- a/src/core/hle/service/spl/spl_results.h +++ b/src/core/hle/service/spl/spl_results.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 diff --git a/src/core/hle/service/spl/spl_types.h b/src/core/hle/service/spl/spl_types.h index 91f9cc0321..d7f0c4afbb 100644 --- a/src/core/hle/service/spl/spl_types.h +++ b/src/core/hle/service/spl/spl_types.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 diff --git a/src/core/hle/service/ssl/cert_store.cpp b/src/core/hle/service/ssl/cert_store.cpp index b321e5d32b..ee5bf8306b 100644 --- a/src/core/hle/service/ssl/cert_store.cpp +++ b/src/core/hle/service/ssl/cert_store.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 diff --git a/src/core/hle/service/ssl/cert_store.h b/src/core/hle/service/ssl/cert_store.h index 613d7b02af..4bbb3c9c1a 100644 --- a/src/core/hle/service/ssl/cert_store.h +++ b/src/core/hle/service/ssl/cert_store.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 diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index c5902079ee..999efd4295 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -74,17 +74,57 @@ struct SslContextSharedData { class ISslConnection final : public ServiceFramework { public: - explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in, std::shared_ptr& shared_data_in, std::unique_ptr&& 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++; - } + explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in, + std::shared_ptr& shared_data_in, + std::unique_ptr&& 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + backend->SetVerifyOption(verify_option); + + shared_data->connection_count++; } ~ISslConnection() { @@ -392,44 +432,6 @@ 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 shared_data; std::unique_ptr backend; @@ -450,9 +452,29 @@ public: explicit ISslContext(Core::System& system_, SslVersion version) : ServiceFramework{system_, "ISslContext"}, ssl_version{version}, shared_data{std::make_shared()} { + 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 shared_data; + void SetOption(HLERequestContext& ctx) { struct Parameters { ContextOption option; @@ -539,36 +561,28 @@ private: LOG_WARNING(Service_SSL, "(STUBBED) called"); R_SUCCEED(); } - - std::optional 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 shared_data; }; class ISslService final : public ServiceFramework { public: - explicit ISslService(Core::System& system_) : ServiceFramework{system_, "ssl"}, cert_store{system} {} + 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 - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -614,116 +628,147 @@ 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 { -public: - explicit ISslServiceForSystem(Core::System& system_) : ServiceFramework{system_, "ssl:s"} {} + 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 - Result CreateContext() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); + 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."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result CreateContextForSystem() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result SetThreadCoreMask() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result GetThreadCoreMask() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result VerifySignature() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; }; - Result GetContextCount() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result GetCertificates() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result GetCertificateBufSize() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result DebugIoctl() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result SetInterfaceVersion() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result FlushSessionCache() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result SetDebugOption() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result GetDebugOption() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result ClearTls12FallbackFlag() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result CreateContextForSystem() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result SetThreadCoreMask() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result GetThreadCoreMask() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result VerifySignature() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - std::optional 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(system); diff --git a/src/core/hle/service/ssl/ssl.h b/src/core/hle/service/ssl/ssl.h index f6e21bbb3b..dc9f2b746b 100644 --- a/src/core/hle/service/ssl/ssl.h +++ b/src/core/hle/service/ssl/ssl.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 diff --git a/src/core/hle/service/ssl/ssl_types.h b/src/core/hle/service/ssl/ssl_types.h index 16623c0fc5..cbd84ad1f9 100644 --- a/src/core/hle/service/ssl/ssl_types.h +++ b/src/core/hle/service/ssl/ssl_types.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 diff --git a/src/core/hle/service/tma/tma.cpp b/src/core/hle/service/tma/tma.cpp index e9198eea64..c2fb33cd16 100644 --- a/src/core/hle/service/tma/tma.cpp +++ b/src/core/hle/service/tma/tma.cpp @@ -19,14 +19,12 @@ class HTC_TENV final : public ServiceFramework { public: explicit HTC_TENV(Core::System& system_) : ServiceFramework{system_, "htc:tenv"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "GetServiceInterface"}, + }; + RegisterHandlers(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 f7dc15e3db..ff2a377172 100644 --- a/src/core/hle/service/usb/usb.cpp +++ b/src/core/hle/service/usb/usb.cpp @@ -17,127 +17,137 @@ namespace Service::USB { class IDsInterface final : public ServiceFramework { public: - explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IDsRootSession final : public ServiceFramework { public: - explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} {} + explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenDsService"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenDsService"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IClientEpSession final : public ServiceFramework { public: explicit IClientEpSession(Core::System& system_) - : ServiceFramework{system_, "IClientEpSession"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IClientIfSession final : public ServiceFramework { public: explicit IClientIfSession(Core::System& system_) - : ServiceFramework{system_, "IClientIfSession"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IClientRootSession final : public ServiceFramework { public: - explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IPdSession final : public ServiceFramework { public: - explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IPdManager final : public ServiceFramework { public: - explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} {} + explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IPdManager::OpenSession, "OpenSession"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -148,39 +158,40 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IPdManager::OpenSession, "OpenSession"} - ); }; class IPdCradleSession final : public ServiceFramework { public: explicit IPdCradleSession(Core::System& system_) - : ServiceFramework{system_, "IPdCradleSession"} {} + : 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IPdCradleManager final : public ServiceFramework { public: - explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} {} + explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -191,64 +202,61 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"} - ); }; class IPmMainService final : public ServiceFramework { public: - explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} {} + 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 - 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 FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IPdManufactureManager final : public ServiceFramework { public: - explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenManufactureSession"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class IQdbManager final : public ServiceFramework { public: - explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ImportQuirkDevices"}, - FunctionInfo{1, nullptr, "HasQuirk"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; class IPmObserverService final : public ServiceFramework { public: - explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetTopologyChangeEvent"}, - FunctionInfo{1, nullptr, "GetFlattenedTopology"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + 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); } }; diff --git a/src/core/hle/service/usb/usb.h b/src/core/hle/service/usb/usb.h index 98376ebc0c..cc25a3b29e 100644 --- a/src/core/hle/service/usb/usb.h +++ b/src/core/hle/service/usb/usb.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 diff --git a/src/core/hle/service/vi/application_display_service.cpp b/src/core/hle/service/vi/application_display_service.cpp index dcebb2eba9..f179ba676a 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 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) : 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 0b5898ee56..d2db391efd 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 FindRequest(u32 key) override; const std::shared_ptr m_container; + KernelHelpers::ServiceContext m_context; std::mutex m_lock{}; std::set 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 f12c564277..2204f77ed4 100644 --- a/src/core/hle/service/vi/application_root_service.cpp +++ b/src/core/hle/service/vi/application_root_service.cpp @@ -14,17 +14,14 @@ namespace Service::VI { -std::optional 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) : 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 4deaa04f4c..b66293b73f 100644 --- a/src/core/hle/service/vi/application_root_service.h +++ b/src/core/hle/service/vi/application_root_service.h @@ -30,7 +30,6 @@ private: Policy policy); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/display.h b/src/core/hle/service/vi/display.h index fceda75e39..543c6ee68d 100644 --- a/src/core/hle/service/vi/display.h +++ b/src/core/hle/service/vi/display.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 diff --git a/src/core/hle/service/vi/display_list.h b/src/core/hle/service/vi/display_list.h index f710ac472c..bf9cf78a27 100644 --- a/src/core/hle/service/vi/display_list.h +++ b/src/core/hle/service/vi/display_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-2.0-or-later diff --git a/src/core/hle/service/vi/layer.h b/src/core/hle/service/vi/layer.h index e4c9c98646..9bd6d033ac 100644 --- a/src/core/hle/service/vi/layer.h +++ b/src/core/hle/service/vi/layer.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 diff --git a/src/core/hle/service/vi/layer_list.h b/src/core/hle/service/vi/layer_list.h index 4afca6f403..8fc7cd3ade 100644 --- a/src/core/hle/service/vi/layer_list.h +++ b/src/core/hle/service/vi/layer_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-2.0-or-later diff --git a/src/core/hle/service/vi/manager_display_service.cpp b/src/core/hle/service/vi/manager_display_service.cpp index 1b3b0f3379..34a0175b49 100644 --- a/src/core/hle/service/vi/manager_display_service.cpp +++ b/src/core/hle/service/vi/manager_display_service.cpp @@ -10,96 +10,96 @@ namespace Service::VI { -std::optional 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) : 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 1c7a79f337..2e05e730c7 100644 --- a/src/core/hle/service/vi/manager_display_service.h +++ b/src/core/hle/service/vi/manager_display_service.h @@ -37,7 +37,6 @@ public: Result SetLayerVisibility(bool visible, u64 layer_id); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr 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 0cc98bc2c0..094261e060 100644 --- a/src/core/hle/service/vi/manager_root_service.cpp +++ b/src/core/hle/service/vi/manager_root_service.cpp @@ -15,21 +15,18 @@ namespace Service::VI { -std::optional 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) : 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 78c0d1f80d..114dc36c07 100644 --- a/src/core/hle/service/vi/manager_root_service.h +++ b/src/core/hle/service/vi/manager_root_service.h @@ -29,7 +29,6 @@ public: Policy policy); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/service_creator.cpp b/src/core/hle/service/vi/service_creator.cpp index 2b8e5f9577..34dbf7baae 100644 --- a/src/core/hle/service/vi/service_creator.cpp +++ b/src/core/hle/service/vi/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-2.0-or-later diff --git a/src/core/hle/service/vi/service_creator.h b/src/core/hle/service/vi/service_creator.h index c6ba1797dc..8b50e94af5 100644 --- a/src/core/hle/service/vi/service_creator.h +++ b/src/core/hle/service/vi/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-2.0-or-later diff --git a/src/core/hle/service/vi/shared_buffer_manager.h b/src/core/hle/service/vi/shared_buffer_manager.h index d1ce57ee27..807db10f31 100644 --- a/src/core/hle/service/vi/shared_buffer_manager.h +++ b/src/core/hle/service/vi/shared_buffer_manager.h @@ -18,10 +18,6 @@ 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 997f0a51fc..aa225f69df 100644 --- a/src/core/hle/service/vi/system_display_service.cpp +++ b/src/core/hle/service/vi/system_display_service.cpp @@ -12,63 +12,63 @@ namespace Service::VI { -std::optional 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) + : 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); } -ISystemDisplayService::ISystemDisplayService(Core::System& system_, std::shared_ptr container) - : ServiceFramework{system_, "ISystemDisplayService"}, m_container{std::move(container)} -{} - ISystemDisplayService::~ISystemDisplayService() = default; Result ISystemDisplayService::GetLayerZ(Out 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 04c9f0977e..a3b88c519d 100644 --- a/src/core/hle/service/vi/system_display_service.h +++ b/src/core/hle/service/vi/system_display_service.h @@ -47,7 +47,6 @@ private: Result CancelSharedFrameBuffer(u64 layer_id, s64 slot); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr 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 c078be37a3..c761f136e2 100644 --- a/src/core/hle/service/vi/system_root_service.cpp +++ b/src/core/hle/service/vi/system_root_service.cpp @@ -14,17 +14,14 @@ namespace Service::VI { -std::optional 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) - : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)} -{} + : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)} { + static const FunctionInfo functions[] = { + {1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"}, + {3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, + }; + RegisterHandlers(functions); +} ISystemRootService::~ISystemRootService() = default; diff --git a/src/core/hle/service/vi/system_root_service.h b/src/core/hle/service/vi/system_root_service.h index baf516fec5..1587e0e30f 100644 --- a/src/core/hle/service/vi/system_root_service.h +++ b/src/core/hle/service/vi/system_root_service.h @@ -29,7 +29,6 @@ private: Out> out_application_display_service, Policy policy); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index b388efaf6f..2ea64f5d32 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.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 diff --git a/src/core/hle/service/vi/vi.h b/src/core/hle/service/vi/vi.h index 7c1f350d84..bcc55228aa 100644 --- a/src/core/hle/service/vi/vi.h +++ b/src/core/hle/service/vi/vi.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 diff --git a/src/core/hle/service/vi/vi_results.h b/src/core/hle/service/vi/vi_results.h index 22bac799f0..89b7317792 100644 --- a/src/core/hle/service/vi/vi_results.h +++ b/src/core/hle/service/vi/vi_results.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-2.0-or-later diff --git a/src/core/hle/service/vi/vi_types.h b/src/core/hle/service/vi/vi_types.h index 95ff663582..2d4287169a 100644 --- a/src/core/hle/service/vi/vi_types.h +++ b/src/core/hle/service/vi/vi_types.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 diff --git a/src/core/hle/service/wlan/wlan.cpp b/src/core/hle/service/wlan/wlan.cpp index fa68ff51ba..bcd357d57a 100644 --- a/src/core/hle/service/wlan/wlan.cpp +++ b/src/core/hle/service/wlan/wlan.cpp @@ -16,248 +16,232 @@ class ILocalManager final : public ServiceFramework { public: explicit ILocalManager(Core::System& system_) : ServiceFramework{system_, "wlan:lcl"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + 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); } - 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 { public: explicit ILocalGetFrame(Core::System& system_) : ServiceFramework{system_, "wlan:lg"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "GetFrameRaw" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetFrameRaw" } - ); }; class ILocalGetActionFrame final : public ServiceFramework { public: explicit ILocalGetActionFrame(Core::System& system_) : ServiceFramework{system_, "wlan:lga"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "GetActionFrame" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetActionFrame" } - ); }; class ISocketGetFrame final : public ServiceFramework { public: explicit ISocketGetFrame(Core::System& system_) : ServiceFramework{system_, "wlan:sg"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "GetFrameRaw" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetFrameRaw" } - ); }; class ISocketManager final : public ServiceFramework { public: explicit ISocketManager(Core::System& system_) : ServiceFramework{system_, "wlan:soc"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + 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); } - 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 { public: explicit IDetectManager(Core::System& system_) : ServiceFramework{system_, "wlan:dtc"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + 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); } - 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 { public: explicit IPrivateServiceCreator(Core::System& system_) : ServiceFramework{system_, "wlan:p"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "CreateWirelessCommunicationService" }, + { 1, nullptr, "CreatePrivateWirelessCommunicationService" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateWirelessCommunicationService"}, - FunctionInfo{1, nullptr, "CreatePrivateWirelessCommunicationService"} - ); }; class ISfDriverServiceCreator final : public ServiceFramework { public: explicit ISfDriverServiceCreator(Core::System& system_) : ServiceFramework{system_, "wlan:nd"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "CreateDriverService" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateDriverService" } - ); }; void LoopProcess(Core::System& system) { diff --git a/tools/README.md b/tools/README.md index f6a520a69c..cde6a21464 100644 --- a/tools/README.md +++ b/tools/README.md @@ -8,7 +8,7 @@ Tools for Eden and other subprojects. When adding new scripts please use `#!/bin ## Binaries -- `maxwell-spirv`: Converts Maxwell shaders (dumped from `.ash` files) into SPIR-V code sent to stdout. +- `maxwell-spirv`: Converts Maxwell shaders (dumped from `.ash` files) into SPIR-V code (emitted into STDOUT). - `maxwell-disas`: Dumb raw Maxwell disassembler. - `maxwell-ir`: Dump generated IR of Maxwell shaders.