mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06: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