mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-31 16:09:03 -05:00 
			
		
		
		
	Merge pull request #2716 from lioncash/hle-global
service/am: Remove usages of global system accessors
This commit is contained in:
		| @@ -56,7 +56,8 @@ struct LaunchParameters { | ||||
| }; | ||||
| static_assert(sizeof(LaunchParameters) == 0x88); | ||||
|  | ||||
| IWindowController::IWindowController() : ServiceFramework("IWindowController") { | ||||
| IWindowController::IWindowController(Core::System& system_) | ||||
|     : ServiceFramework("IWindowController"), system{system_} { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, nullptr, "CreateWindow"}, | ||||
| @@ -75,7 +76,7 @@ IWindowController::IWindowController() : ServiceFramework("IWindowController") { | ||||
| IWindowController::~IWindowController() = default; | ||||
|  | ||||
| void IWindowController::GetAppletResourceUserId(Kernel::HLERequestContext& ctx) { | ||||
|     const u64 process_id = Core::System::GetInstance().Kernel().CurrentProcess()->GetProcessID(); | ||||
|     const u64 process_id = system.CurrentProcess()->GetProcessID(); | ||||
|  | ||||
|     LOG_DEBUG(Service_AM, "called. Process ID=0x{:016X}", process_id); | ||||
|  | ||||
| @@ -231,8 +232,9 @@ IDebugFunctions::IDebugFunctions() : ServiceFramework{"IDebugFunctions"} { | ||||
|  | ||||
| IDebugFunctions::~IDebugFunctions() = default; | ||||
|  | ||||
| ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger) | ||||
|     : ServiceFramework("ISelfController"), nvflinger(std::move(nvflinger)) { | ||||
| ISelfController::ISelfController(Core::System& system_, | ||||
|                                  std::shared_ptr<NVFlinger::NVFlinger> nvflinger_) | ||||
|     : ServiceFramework("ISelfController"), nvflinger(std::move(nvflinger_)) { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, nullptr, "Exit"}, | ||||
| @@ -280,7 +282,7 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto& kernel = system_.Kernel(); | ||||
|     launchable_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual, | ||||
|                                                               "ISelfController:LaunchableEvent"); | ||||
|  | ||||
| @@ -501,8 +503,7 @@ void ISelfController::GetAccumulatedSuspendedTickChangedEvent(Kernel::HLERequest | ||||
|     rb.PushCopyObjects(accumulated_suspended_tick_changed_event.readable); | ||||
| } | ||||
|  | ||||
| AppletMessageQueue::AppletMessageQueue() { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
| AppletMessageQueue::AppletMessageQueue(Kernel::KernelCore& kernel) { | ||||
|     on_new_message = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual, | ||||
|                                                             "AMMessageQueue:OnMessageRecieved"); | ||||
|     on_operation_mode_changed = Kernel::WritableEvent::CreateEventPair( | ||||
| @@ -937,9 +938,8 @@ void IStorageAccessor::Read(Kernel::HLERequestContext& ctx) { | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
| } | ||||
|  | ||||
| ILibraryAppletCreator::ILibraryAppletCreator(u64 current_process_title_id) | ||||
|     : ServiceFramework("ILibraryAppletCreator"), | ||||
|       current_process_title_id(current_process_title_id) { | ||||
| ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_) | ||||
|     : ServiceFramework("ILibraryAppletCreator"), system{system_} { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, &ILibraryAppletCreator::CreateLibraryApplet, "CreateLibraryApplet"}, | ||||
|         {1, nullptr, "TerminateAllLibraryApplets"}, | ||||
| @@ -961,8 +961,8 @@ void ILibraryAppletCreator::CreateLibraryApplet(Kernel::HLERequestContext& ctx) | ||||
|     LOG_DEBUG(Service_AM, "called with applet_id={:08X}, applet_mode={:08X}", | ||||
|               static_cast<u32>(applet_id), applet_mode); | ||||
|  | ||||
|     const auto& applet_manager{Core::System::GetInstance().GetAppletManager()}; | ||||
|     const auto applet = applet_manager.GetApplet(applet_id, current_process_title_id); | ||||
|     const auto& applet_manager{system.GetAppletManager()}; | ||||
|     const auto applet = applet_manager.GetApplet(applet_id); | ||||
|  | ||||
|     if (applet == nullptr) { | ||||
|         LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", static_cast<u32>(applet_id)); | ||||
| @@ -999,8 +999,7 @@ void ILibraryAppletCreator::CreateTransferMemoryStorage(Kernel::HLERequestContex | ||||
|     const auto handle{rp.Pop<Kernel::Handle>()}; | ||||
|  | ||||
|     const auto transfer_mem = | ||||
|         Core::System::GetInstance().CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>( | ||||
|             handle); | ||||
|         system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(handle); | ||||
|  | ||||
|     if (transfer_mem == nullptr) { | ||||
|         LOG_ERROR(Service_AM, "shared_mem is a nullpr for handle={:08X}", handle); | ||||
| @@ -1018,7 +1017,8 @@ void ILibraryAppletCreator::CreateTransferMemoryStorage(Kernel::HLERequestContex | ||||
|     rb.PushIpcInterface(std::make_shared<IStorage>(std::move(memory))); | ||||
| } | ||||
|  | ||||
| IApplicationFunctions::IApplicationFunctions() : ServiceFramework("IApplicationFunctions") { | ||||
| IApplicationFunctions::IApplicationFunctions(Core::System& system_) | ||||
|     : ServiceFramework("IApplicationFunctions"), system{system_} { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {1, &IApplicationFunctions::PopLaunchParameter, "PopLaunchParameter"}, | ||||
| @@ -1180,7 +1180,7 @@ void IApplicationFunctions::GetDesiredLanguage(Kernel::HLERequestContext& ctx) { | ||||
|     // Get supported languages from NACP, if possible | ||||
|     // Default to 0 (all languages supported) | ||||
|     u32 supported_languages = 0; | ||||
|     FileSys::PatchManager pm{Core::System::GetInstance().CurrentProcess()->GetTitleID()}; | ||||
|     FileSys::PatchManager pm{system.CurrentProcess()->GetTitleID()}; | ||||
|  | ||||
|     const auto res = pm.GetControlMetadata(); | ||||
|     if (res.first != nullptr) { | ||||
| @@ -1188,8 +1188,8 @@ void IApplicationFunctions::GetDesiredLanguage(Kernel::HLERequestContext& ctx) { | ||||
|     } | ||||
|  | ||||
|     // Call IApplicationManagerInterface implementation. | ||||
|     auto& service_manager = Core::System::GetInstance().ServiceManager(); | ||||
|     auto ns_am2 = service_manager.GetService<Service::NS::NS>("ns:am2"); | ||||
|     auto& service_manager = system.ServiceManager(); | ||||
|     auto ns_am2 = service_manager.GetService<NS::NS>("ns:am2"); | ||||
|     auto app_man = ns_am2->GetApplicationManagerInterface(); | ||||
|  | ||||
|     // Get desired application language | ||||
| @@ -1261,8 +1261,8 @@ void IApplicationFunctions::ExtendSaveData(Kernel::HLERequestContext& ctx) { | ||||
|               "new_journal={:016X}", | ||||
|               static_cast<u8>(type), user_id[1], user_id[0], new_normal_size, new_journal_size); | ||||
|  | ||||
|     FileSystem::WriteSaveDataSize(type, Core::CurrentProcess()->GetTitleID(), user_id, | ||||
|                                   {new_normal_size, new_journal_size}); | ||||
|     const auto title_id = system.CurrentProcess()->GetTitleID(); | ||||
|     FileSystem::WriteSaveDataSize(type, title_id, user_id, {new_normal_size, new_journal_size}); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 4}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
| @@ -1281,8 +1281,8 @@ void IApplicationFunctions::GetSaveDataSize(Kernel::HLERequestContext& ctx) { | ||||
|     LOG_DEBUG(Service_AM, "called with type={:02X}, user_id={:016X}{:016X}", static_cast<u8>(type), | ||||
|               user_id[1], user_id[0]); | ||||
|  | ||||
|     const auto size = | ||||
|         FileSystem::ReadSaveDataSize(type, Core::CurrentProcess()->GetTitleID(), user_id); | ||||
|     const auto title_id = system.CurrentProcess()->GetTitleID(); | ||||
|     const auto size = FileSystem::ReadSaveDataSize(type, title_id, user_id); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 6}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
| @@ -1300,9 +1300,9 @@ void IApplicationFunctions::GetGpuErrorDetectedSystemEvent(Kernel::HLERequestCon | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, | ||||
|                        std::shared_ptr<NVFlinger::NVFlinger> nvflinger, Core::System& system) { | ||||
|     auto message_queue = std::make_shared<AppletMessageQueue>(); | ||||
|     message_queue->PushMessage(AppletMessageQueue::AppletMessage::FocusStateChanged); // Needed on | ||||
|                                                                                       // game boot | ||||
|     auto message_queue = std::make_shared<AppletMessageQueue>(system.Kernel()); | ||||
|     // Needed on game boot | ||||
|     message_queue->PushMessage(AppletMessageQueue::AppletMessage::FocusStateChanged); | ||||
|  | ||||
|     std::make_shared<AppletAE>(nvflinger, message_queue, system)->InstallAsService(service_manager); | ||||
|     std::make_shared<AppletOE>(nvflinger, message_queue, system)->InstallAsService(service_manager); | ||||
|   | ||||
| @@ -10,12 +10,15 @@ | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Service { | ||||
| namespace NVFlinger { | ||||
| namespace Kernel { | ||||
| class KernelCore; | ||||
| } | ||||
|  | ||||
| namespace Service::NVFlinger { | ||||
| class NVFlinger; | ||||
| } | ||||
|  | ||||
| namespace AM { | ||||
| namespace Service::AM { | ||||
|  | ||||
| enum SystemLanguage { | ||||
|     Japanese = 0, | ||||
| @@ -47,7 +50,7 @@ public: | ||||
|         PerformanceModeChanged = 31, | ||||
|     }; | ||||
|  | ||||
|     AppletMessageQueue(); | ||||
|     explicit AppletMessageQueue(Kernel::KernelCore& kernel); | ||||
|     ~AppletMessageQueue(); | ||||
|  | ||||
|     const Kernel::SharedPtr<Kernel::ReadableEvent>& GetMesssageRecieveEvent() const; | ||||
| @@ -65,12 +68,14 @@ private: | ||||
|  | ||||
| class IWindowController final : public ServiceFramework<IWindowController> { | ||||
| public: | ||||
|     IWindowController(); | ||||
|     explicit IWindowController(Core::System& system_); | ||||
|     ~IWindowController() override; | ||||
|  | ||||
| private: | ||||
|     void GetAppletResourceUserId(Kernel::HLERequestContext& ctx); | ||||
|     void AcquireForegroundRights(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| class IAudioController final : public ServiceFramework<IAudioController> { | ||||
| @@ -113,7 +118,8 @@ public: | ||||
|  | ||||
| class ISelfController final : public ServiceFramework<ISelfController> { | ||||
| public: | ||||
|     explicit ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger); | ||||
|     explicit ISelfController(Core::System& system_, | ||||
|                              std::shared_ptr<NVFlinger::NVFlinger> nvflinger_); | ||||
|     ~ISelfController() override; | ||||
|  | ||||
| private: | ||||
| @@ -208,7 +214,7 @@ private: | ||||
|  | ||||
| class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> { | ||||
| public: | ||||
|     ILibraryAppletCreator(u64 current_process_title_id); | ||||
|     explicit ILibraryAppletCreator(Core::System& system_); | ||||
|     ~ILibraryAppletCreator() override; | ||||
|  | ||||
| private: | ||||
| @@ -216,12 +222,12 @@ private: | ||||
|     void CreateStorage(Kernel::HLERequestContext& ctx); | ||||
|     void CreateTransferMemoryStorage(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     u64 current_process_title_id; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| class IApplicationFunctions final : public ServiceFramework<IApplicationFunctions> { | ||||
| public: | ||||
|     IApplicationFunctions(); | ||||
|     explicit IApplicationFunctions(Core::System& system_); | ||||
|     ~IApplicationFunctions() override; | ||||
|  | ||||
| private: | ||||
| @@ -245,6 +251,7 @@ private: | ||||
|     void GetGpuErrorDetectedSystemEvent(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     Kernel::EventPair gpu_error_detected_event; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| class IHomeMenuFunctions final : public ServiceFramework<IHomeMenuFunctions> { | ||||
| @@ -278,5 +285,4 @@ public: | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, | ||||
|                        std::shared_ptr<NVFlinger::NVFlinger> nvflinger, Core::System& system); | ||||
|  | ||||
| } // namespace AM | ||||
| } // namespace Service | ||||
| } // namespace Service::AM | ||||
|   | ||||
| @@ -50,7 +50,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<ISelfController>(nvflinger); | ||||
|         rb.PushIpcInterface<ISelfController>(system, nvflinger); | ||||
|     } | ||||
|  | ||||
|     void GetWindowController(Kernel::HLERequestContext& ctx) { | ||||
| @@ -58,7 +58,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IWindowController>(); | ||||
|         rb.PushIpcInterface<IWindowController>(system); | ||||
|     } | ||||
|  | ||||
|     void GetAudioController(Kernel::HLERequestContext& ctx) { | ||||
| @@ -98,7 +98,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<ILibraryAppletCreator>(system.CurrentProcess()->GetTitleID()); | ||||
|         rb.PushIpcInterface<ILibraryAppletCreator>(system); | ||||
|     } | ||||
|  | ||||
|     void GetApplicationFunctions(Kernel::HLERequestContext& ctx) { | ||||
| @@ -106,7 +106,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IApplicationFunctions>(); | ||||
|         rb.PushIpcInterface<IApplicationFunctions>(system); | ||||
|     } | ||||
|  | ||||
|     std::shared_ptr<NVFlinger::NVFlinger> nvflinger; | ||||
| @@ -154,7 +154,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<ISelfController>(nvflinger); | ||||
|         rb.PushIpcInterface<ISelfController>(system, nvflinger); | ||||
|     } | ||||
|  | ||||
|     void GetWindowController(Kernel::HLERequestContext& ctx) { | ||||
| @@ -162,7 +162,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IWindowController>(); | ||||
|         rb.PushIpcInterface<IWindowController>(system); | ||||
|     } | ||||
|  | ||||
|     void GetAudioController(Kernel::HLERequestContext& ctx) { | ||||
| @@ -194,7 +194,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<ILibraryAppletCreator>(system.CurrentProcess()->GetTitleID()); | ||||
|         rb.PushIpcInterface<ILibraryAppletCreator>(system); | ||||
|     } | ||||
|  | ||||
|     void GetHomeMenuFunctions(Kernel::HLERequestContext& ctx) { | ||||
|   | ||||
| @@ -4,7 +4,6 @@ | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "core/hle/ipc_helpers.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/service/am/am.h" | ||||
| #include "core/hle/service/am/applet_oe.h" | ||||
| #include "core/hle/service/nvflinger/nvflinger.h" | ||||
| @@ -64,7 +63,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IWindowController>(); | ||||
|         rb.PushIpcInterface<IWindowController>(system); | ||||
|     } | ||||
|  | ||||
|     void GetSelfController(Kernel::HLERequestContext& ctx) { | ||||
| @@ -72,7 +71,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<ISelfController>(nvflinger); | ||||
|         rb.PushIpcInterface<ISelfController>(system, nvflinger); | ||||
|     } | ||||
|  | ||||
|     void GetCommonStateGetter(Kernel::HLERequestContext& ctx) { | ||||
| @@ -88,7 +87,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<ILibraryAppletCreator>(system.CurrentProcess()->GetTitleID()); | ||||
|         rb.PushIpcInterface<ILibraryAppletCreator>(system); | ||||
|     } | ||||
|  | ||||
|     void GetApplicationFunctions(Kernel::HLERequestContext& ctx) { | ||||
| @@ -96,7 +95,7 @@ private: | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushIpcInterface<IApplicationFunctions>(); | ||||
|         rb.PushIpcInterface<IApplicationFunctions>(system); | ||||
|     } | ||||
|  | ||||
|     std::shared_ptr<NVFlinger::NVFlinger> nvflinger; | ||||
|   | ||||
| @@ -23,8 +23,7 @@ | ||||
|  | ||||
| namespace Service::AM::Applets { | ||||
|  | ||||
| AppletDataBroker::AppletDataBroker() { | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
| AppletDataBroker::AppletDataBroker(Kernel::KernelCore& kernel) { | ||||
|     state_changed_event = Kernel::WritableEvent::CreateEventPair( | ||||
|         kernel, Kernel::ResetType::Manual, "ILibraryAppletAccessor:StateChangedEvent"); | ||||
|     pop_out_data_event = Kernel::WritableEvent::CreateEventPair( | ||||
| @@ -121,7 +120,7 @@ Kernel::SharedPtr<Kernel::ReadableEvent> AppletDataBroker::GetStateChangedEvent( | ||||
|     return state_changed_event.readable; | ||||
| } | ||||
|  | ||||
| Applet::Applet() = default; | ||||
| Applet::Applet(Kernel::KernelCore& kernel_) : broker{kernel_} {} | ||||
|  | ||||
| Applet::~Applet() = default; | ||||
|  | ||||
| @@ -154,7 +153,7 @@ AppletFrontendSet::AppletFrontendSet(AppletFrontendSet&&) noexcept = default; | ||||
|  | ||||
| AppletFrontendSet& AppletFrontendSet::operator=(AppletFrontendSet&&) noexcept = default; | ||||
|  | ||||
| AppletManager::AppletManager() = default; | ||||
| AppletManager::AppletManager(Core::System& system_) : system{system_} {} | ||||
|  | ||||
| AppletManager::~AppletManager() = default; | ||||
|  | ||||
| @@ -216,28 +215,28 @@ void AppletManager::ClearAll() { | ||||
|     frontend = {}; | ||||
| } | ||||
|  | ||||
| std::shared_ptr<Applet> AppletManager::GetApplet(AppletId id, u64 current_process_title_id) const { | ||||
| std::shared_ptr<Applet> AppletManager::GetApplet(AppletId id) const { | ||||
|     switch (id) { | ||||
|     case AppletId::Auth: | ||||
|         return std::make_shared<Auth>(*frontend.parental_controls); | ||||
|         return std::make_shared<Auth>(system, *frontend.parental_controls); | ||||
|     case AppletId::Error: | ||||
|         return std::make_shared<Error>(*frontend.error); | ||||
|         return std::make_shared<Error>(system, *frontend.error); | ||||
|     case AppletId::ProfileSelect: | ||||
|         return std::make_shared<ProfileSelect>(*frontend.profile_select); | ||||
|         return std::make_shared<ProfileSelect>(system, *frontend.profile_select); | ||||
|     case AppletId::SoftwareKeyboard: | ||||
|         return std::make_shared<SoftwareKeyboard>(*frontend.software_keyboard); | ||||
|         return std::make_shared<SoftwareKeyboard>(system, *frontend.software_keyboard); | ||||
|     case AppletId::PhotoViewer: | ||||
|         return std::make_shared<PhotoViewer>(*frontend.photo_viewer); | ||||
|         return std::make_shared<PhotoViewer>(system, *frontend.photo_viewer); | ||||
|     case AppletId::LibAppletShop: | ||||
|         return std::make_shared<WebBrowser>(*frontend.web_browser, current_process_title_id, | ||||
|         return std::make_shared<WebBrowser>(system, *frontend.web_browser, | ||||
|                                             frontend.e_commerce.get()); | ||||
|     case AppletId::LibAppletOff: | ||||
|         return std::make_shared<WebBrowser>(*frontend.web_browser, current_process_title_id); | ||||
|         return std::make_shared<WebBrowser>(system, *frontend.web_browser); | ||||
|     default: | ||||
|         UNIMPLEMENTED_MSG( | ||||
|             "No backend implementation exists for applet_id={:02X}! Falling back to stub applet.", | ||||
|             static_cast<u8>(id)); | ||||
|         return std::make_shared<StubApplet>(id); | ||||
|         return std::make_shared<StubApplet>(system, id); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -12,6 +12,10 @@ | ||||
|  | ||||
| union ResultCode; | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Core::Frontend { | ||||
| class ECommerceApplet; | ||||
| class ErrorApplet; | ||||
| @@ -22,6 +26,10 @@ class SoftwareKeyboardApplet; | ||||
| class WebBrowserApplet; | ||||
| } // namespace Core::Frontend | ||||
|  | ||||
| namespace Kernel { | ||||
| class KernelCore; | ||||
| } | ||||
|  | ||||
| namespace Service::AM { | ||||
|  | ||||
| class IStorage; | ||||
| @@ -53,7 +61,7 @@ enum class AppletId : u32 { | ||||
|  | ||||
| class AppletDataBroker final { | ||||
| public: | ||||
|     AppletDataBroker(); | ||||
|     explicit AppletDataBroker(Kernel::KernelCore& kernel_); | ||||
|     ~AppletDataBroker(); | ||||
|  | ||||
|     struct RawChannelData { | ||||
| @@ -108,7 +116,7 @@ private: | ||||
|  | ||||
| class Applet { | ||||
| public: | ||||
|     Applet(); | ||||
|     explicit Applet(Kernel::KernelCore& kernel_); | ||||
|     virtual ~Applet(); | ||||
|  | ||||
|     virtual void Initialize(); | ||||
| @@ -179,7 +187,7 @@ struct AppletFrontendSet { | ||||
|  | ||||
| class AppletManager { | ||||
| public: | ||||
|     AppletManager(); | ||||
|     explicit AppletManager(Core::System& system_); | ||||
|     ~AppletManager(); | ||||
|  | ||||
|     void SetAppletFrontendSet(AppletFrontendSet set); | ||||
| @@ -187,10 +195,11 @@ public: | ||||
|     void SetDefaultAppletsIfMissing(); | ||||
|     void ClearAll(); | ||||
|  | ||||
|     std::shared_ptr<Applet> GetApplet(AppletId id, u64 current_process_title_id) const; | ||||
|     std::shared_ptr<Applet> GetApplet(AppletId id) const; | ||||
|  | ||||
| private: | ||||
|     AppletFrontendSet frontend; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| } // namespace Applets | ||||
|   | ||||
| @@ -85,7 +85,8 @@ ResultCode Decode64BitError(u64 error) { | ||||
|  | ||||
| } // Anonymous namespace | ||||
|  | ||||
| Error::Error(const Core::Frontend::ErrorApplet& frontend) : frontend(frontend) {} | ||||
| Error::Error(Core::System& system_, const Core::Frontend::ErrorApplet& frontend_) | ||||
|     : Applet{system_.Kernel()}, frontend(frontend_), system{system_} {} | ||||
|  | ||||
| Error::~Error() = default; | ||||
|  | ||||
| @@ -145,8 +146,8 @@ void Error::Execute() { | ||||
|     } | ||||
|  | ||||
|     const auto callback = [this] { DisplayCompleted(); }; | ||||
|     const auto title_id = Core::CurrentProcess()->GetTitleID(); | ||||
|     const auto& reporter{Core::System::GetInstance().GetReporter()}; | ||||
|     const auto title_id = system.CurrentProcess()->GetTitleID(); | ||||
|     const auto& reporter{system.GetReporter()}; | ||||
|  | ||||
|     switch (mode) { | ||||
|     case ErrorAppletMode::ShowError: | ||||
|   | ||||
| @@ -7,6 +7,10 @@ | ||||
| #include "core/hle/result.h" | ||||
| #include "core/hle/service/am/applets/applets.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::AM::Applets { | ||||
|  | ||||
| enum class ErrorAppletMode : u8 { | ||||
| @@ -21,7 +25,7 @@ enum class ErrorAppletMode : u8 { | ||||
|  | ||||
| class Error final : public Applet { | ||||
| public: | ||||
|     explicit Error(const Core::Frontend::ErrorApplet& frontend); | ||||
|     explicit Error(Core::System& system_, const Core::Frontend::ErrorApplet& frontend_); | ||||
|     ~Error() override; | ||||
|  | ||||
|     void Initialize() override; | ||||
| @@ -42,6 +46,7 @@ private: | ||||
|     std::unique_ptr<ErrorArguments> args; | ||||
|  | ||||
|     bool complete = false; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::AM::Applets | ||||
|   | ||||
| @@ -37,7 +37,8 @@ static void LogCurrentStorage(AppletDataBroker& broker, std::string_view prefix) | ||||
|     } | ||||
| } | ||||
|  | ||||
| Auth::Auth(Core::Frontend::ParentalControlsApplet& frontend) : frontend(frontend) {} | ||||
| Auth::Auth(Core::System& system_, Core::Frontend::ParentalControlsApplet& frontend_) | ||||
|     : Applet{system_.Kernel()}, frontend(frontend_) {} | ||||
|  | ||||
| Auth::~Auth() = default; | ||||
|  | ||||
| @@ -151,7 +152,8 @@ void Auth::AuthFinished(bool successful) { | ||||
|     broker.SignalStateChanged(); | ||||
| } | ||||
|  | ||||
| PhotoViewer::PhotoViewer(const Core::Frontend::PhotoViewerApplet& frontend) : frontend(frontend) {} | ||||
| PhotoViewer::PhotoViewer(Core::System& system_, const Core::Frontend::PhotoViewerApplet& frontend_) | ||||
|     : Applet{system_.Kernel()}, frontend(frontend_), system{system_} {} | ||||
|  | ||||
| PhotoViewer::~PhotoViewer() = default; | ||||
|  | ||||
| @@ -185,7 +187,7 @@ void PhotoViewer::Execute() { | ||||
|     const auto callback = [this] { ViewFinished(); }; | ||||
|     switch (mode) { | ||||
|     case PhotoViewerAppletMode::CurrentApp: | ||||
|         frontend.ShowPhotosForApplication(Core::CurrentProcess()->GetTitleID(), callback); | ||||
|         frontend.ShowPhotosForApplication(system.CurrentProcess()->GetTitleID(), callback); | ||||
|         break; | ||||
|     case PhotoViewerAppletMode::AllApps: | ||||
|         frontend.ShowAllPhotos(callback); | ||||
| @@ -200,7 +202,8 @@ void PhotoViewer::ViewFinished() { | ||||
|     broker.SignalStateChanged(); | ||||
| } | ||||
|  | ||||
| StubApplet::StubApplet(AppletId id) : id(id) {} | ||||
| StubApplet::StubApplet(Core::System& system_, AppletId id_) | ||||
|     : Applet{system_.Kernel()}, id(id_), system{system_} {} | ||||
|  | ||||
| StubApplet::~StubApplet() = default; | ||||
|  | ||||
| @@ -209,7 +212,7 @@ void StubApplet::Initialize() { | ||||
|     Applet::Initialize(); | ||||
|  | ||||
|     const auto data = broker.PeekDataToAppletForDebug(); | ||||
|     Core::System::GetInstance().GetReporter().SaveUnimplementedAppletReport( | ||||
|     system.GetReporter().SaveUnimplementedAppletReport( | ||||
|         static_cast<u32>(id), common_args.arguments_version, common_args.library_version, | ||||
|         common_args.theme_color, common_args.play_startup_sound, common_args.system_tick, | ||||
|         data.normal, data.interactive); | ||||
|   | ||||
| @@ -6,6 +6,10 @@ | ||||
|  | ||||
| #include "core/hle/service/am/applets/applets.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::AM::Applets { | ||||
|  | ||||
| enum class AuthAppletType : u32 { | ||||
| @@ -16,7 +20,7 @@ enum class AuthAppletType : u32 { | ||||
|  | ||||
| class Auth final : public Applet { | ||||
| public: | ||||
|     explicit Auth(Core::Frontend::ParentalControlsApplet& frontend); | ||||
|     explicit Auth(Core::System& system_, Core::Frontend::ParentalControlsApplet& frontend_); | ||||
|     ~Auth() override; | ||||
|  | ||||
|     void Initialize() override; | ||||
| @@ -45,7 +49,7 @@ enum class PhotoViewerAppletMode : u8 { | ||||
|  | ||||
| class PhotoViewer final : public Applet { | ||||
| public: | ||||
|     explicit PhotoViewer(const Core::Frontend::PhotoViewerApplet& frontend); | ||||
|     explicit PhotoViewer(Core::System& system_, const Core::Frontend::PhotoViewerApplet& frontend_); | ||||
|     ~PhotoViewer() override; | ||||
|  | ||||
|     void Initialize() override; | ||||
| @@ -60,11 +64,12 @@ private: | ||||
|     const Core::Frontend::PhotoViewerApplet& frontend; | ||||
|     bool complete = false; | ||||
|     PhotoViewerAppletMode mode = PhotoViewerAppletMode::CurrentApp; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| class StubApplet final : public Applet { | ||||
| public: | ||||
|     explicit StubApplet(AppletId id); | ||||
|     explicit StubApplet(Core::System& system_, AppletId id_); | ||||
|     ~StubApplet() override; | ||||
|  | ||||
|     void Initialize() override; | ||||
| @@ -76,6 +81,7 @@ public: | ||||
|  | ||||
| private: | ||||
|     AppletId id; | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::AM::Applets | ||||
|   | ||||
| @@ -15,8 +15,9 @@ namespace Service::AM::Applets { | ||||
|  | ||||
| constexpr ResultCode ERR_USER_CANCELLED_SELECTION{ErrorModule::Account, 1}; | ||||
|  | ||||
| ProfileSelect::ProfileSelect(const Core::Frontend::ProfileSelectApplet& frontend) | ||||
|     : frontend(frontend) {} | ||||
| ProfileSelect::ProfileSelect(Core::System& system_, | ||||
|                              const Core::Frontend::ProfileSelectApplet& frontend_) | ||||
|     : Applet{system_.Kernel()}, frontend(frontend_) {} | ||||
|  | ||||
| ProfileSelect::~ProfileSelect() = default; | ||||
|  | ||||
|   | ||||
| @@ -11,6 +11,10 @@ | ||||
| #include "core/hle/result.h" | ||||
| #include "core/hle/service/am/applets/applets.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::AM::Applets { | ||||
|  | ||||
| struct UserSelectionConfig { | ||||
| @@ -29,7 +33,8 @@ static_assert(sizeof(UserSelectionOutput) == 0x18, "UserSelectionOutput has inco | ||||
|  | ||||
| class ProfileSelect final : public Applet { | ||||
| public: | ||||
|     explicit ProfileSelect(const Core::Frontend::ProfileSelectApplet& frontend); | ||||
|     explicit ProfileSelect(Core::System& system_, | ||||
|                            const Core::Frontend::ProfileSelectApplet& frontend_); | ||||
|     ~ProfileSelect() override; | ||||
|  | ||||
|     void Initialize() override; | ||||
|   | ||||
| @@ -39,8 +39,9 @@ static Core::Frontend::SoftwareKeyboardParameters ConvertToFrontendParameters( | ||||
|     return params; | ||||
| } | ||||
|  | ||||
| SoftwareKeyboard::SoftwareKeyboard(const Core::Frontend::SoftwareKeyboardApplet& frontend) | ||||
|     : frontend(frontend) {} | ||||
| SoftwareKeyboard::SoftwareKeyboard(Core::System& system_, | ||||
|                                    const Core::Frontend::SoftwareKeyboardApplet& frontend_) | ||||
|     : Applet{system_.Kernel()}, frontend(frontend_) {} | ||||
|  | ||||
| SoftwareKeyboard::~SoftwareKeyboard() = default; | ||||
|  | ||||
|   | ||||
| @@ -16,6 +16,10 @@ | ||||
|  | ||||
| union ResultCode; | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::AM::Applets { | ||||
|  | ||||
| enum class KeysetDisable : u32 { | ||||
| @@ -55,7 +59,8 @@ static_assert(sizeof(KeyboardConfig) == 0x3E0, "KeyboardConfig has incorrect siz | ||||
|  | ||||
| class SoftwareKeyboard final : public Applet { | ||||
| public: | ||||
|     explicit SoftwareKeyboard(const Core::Frontend::SoftwareKeyboardApplet& frontend); | ||||
|     explicit SoftwareKeyboard(Core::System& system_, | ||||
|                               const Core::Frontend::SoftwareKeyboardApplet& frontend_); | ||||
|     ~SoftwareKeyboard() override; | ||||
|  | ||||
|     void Initialize() override; | ||||
|   | ||||
| @@ -190,8 +190,9 @@ std::map<WebArgTLVType, std::vector<u8>> GetWebArguments(const std::vector<u8>& | ||||
|     return out; | ||||
| } | ||||
|  | ||||
| FileSys::VirtualFile GetApplicationRomFS(u64 title_id, FileSys::ContentRecordType type) { | ||||
|     const auto& installed{Core::System::GetInstance().GetContentProvider()}; | ||||
| FileSys::VirtualFile GetApplicationRomFS(const Core::System& system, u64 title_id, | ||||
|                                          FileSys::ContentRecordType type) { | ||||
|     const auto& installed{system.GetContentProvider()}; | ||||
|     const auto res = installed.GetEntry(title_id, type); | ||||
|  | ||||
|     if (res != nullptr) { | ||||
| @@ -207,10 +208,10 @@ FileSys::VirtualFile GetApplicationRomFS(u64 title_id, FileSys::ContentRecordTyp | ||||
|  | ||||
| } // Anonymous namespace | ||||
|  | ||||
| WebBrowser::WebBrowser(Core::Frontend::WebBrowserApplet& frontend, u64 current_process_title_id, | ||||
|                        Core::Frontend::ECommerceApplet* frontend_e_commerce) | ||||
|     : frontend(frontend), frontend_e_commerce(frontend_e_commerce), | ||||
|       current_process_title_id(current_process_title_id) {} | ||||
| WebBrowser::WebBrowser(Core::System& system_, Core::Frontend::WebBrowserApplet& frontend_, | ||||
|                        Core::Frontend::ECommerceApplet* frontend_e_commerce_) | ||||
|     : Applet{system_.Kernel()}, frontend(frontend_), | ||||
|       frontend_e_commerce(frontend_e_commerce_), system{system_} {} | ||||
|  | ||||
| WebBrowser::~WebBrowser() = default; | ||||
|  | ||||
| @@ -266,7 +267,7 @@ void WebBrowser::UnpackRomFS() { | ||||
|     ASSERT(offline_romfs != nullptr); | ||||
|     const auto dir = | ||||
|         FileSys::ExtractRomFS(offline_romfs, FileSys::RomFSExtractionType::SingleDiscard); | ||||
|     const auto& vfs{Core::System::GetInstance().GetFilesystem()}; | ||||
|     const auto& vfs{system.GetFilesystem()}; | ||||
|     const auto temp_dir = vfs->CreateDirectory(temporary_dir, FileSys::Mode::ReadWrite); | ||||
|     FileSys::VfsRawCopyD(dir, temp_dir); | ||||
|  | ||||
| @@ -470,10 +471,10 @@ void WebBrowser::InitializeOffline() { | ||||
|     } | ||||
|  | ||||
|     if (title_id == 0) { | ||||
|         title_id = current_process_title_id; | ||||
|         title_id = system.CurrentProcess()->GetTitleID(); | ||||
|     } | ||||
|  | ||||
|     offline_romfs = GetApplicationRomFS(title_id, type); | ||||
|     offline_romfs = GetApplicationRomFS(system, title_id, type); | ||||
|     if (offline_romfs == nullptr) { | ||||
|         status = ResultCode(-1); | ||||
|         LOG_ERROR(Service_AM, "Failed to find offline data for request!"); | ||||
|   | ||||
| @@ -9,6 +9,10 @@ | ||||
| #include "core/hle/service/am/am.h" | ||||
| #include "core/hle/service/am/applets/applets.h" | ||||
|  | ||||
| namespace Core { | ||||
| class System; | ||||
| } | ||||
|  | ||||
| namespace Service::AM::Applets { | ||||
|  | ||||
| enum class ShimKind : u32; | ||||
| @@ -17,8 +21,8 @@ enum class WebArgTLVType : u16; | ||||
|  | ||||
| class WebBrowser final : public Applet { | ||||
| public: | ||||
|     WebBrowser(Core::Frontend::WebBrowserApplet& frontend, u64 current_process_title_id, | ||||
|                Core::Frontend::ECommerceApplet* frontend_e_commerce = nullptr); | ||||
|     WebBrowser(Core::System& system_, Core::Frontend::WebBrowserApplet& frontend_, | ||||
|                Core::Frontend::ECommerceApplet* frontend_e_commerce_ = nullptr); | ||||
|  | ||||
|     ~WebBrowser() override; | ||||
|  | ||||
| @@ -59,8 +63,6 @@ private: | ||||
|     bool unpacked = false; | ||||
|     ResultCode status = RESULT_SUCCESS; | ||||
|  | ||||
|     u64 current_process_title_id; | ||||
|  | ||||
|     ShimKind kind; | ||||
|     std::map<WebArgTLVType, std::vector<u8>> args; | ||||
|  | ||||
| @@ -74,6 +76,8 @@ private: | ||||
|     std::optional<u128> user_id; | ||||
|     std::optional<bool> shop_full_display; | ||||
|     std::string shop_extra_parameter; | ||||
|  | ||||
|     Core::System& system; | ||||
| }; | ||||
|  | ||||
| } // namespace Service::AM::Applets | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 David
					David