mirror of
https://git.suyu.dev/suyu/suyu
synced 2024-12-27 20:02:37 -06:00
service: am: Implement cabinet applet backend
This commit is contained in:
parent
b193d40d22
commit
fb57cd26a1
9 changed files with 362 additions and 7 deletions
|
@ -120,6 +120,8 @@ add_library(core STATIC
|
||||||
file_sys/vfs_vector.h
|
file_sys/vfs_vector.h
|
||||||
file_sys/xts_archive.cpp
|
file_sys/xts_archive.cpp
|
||||||
file_sys/xts_archive.h
|
file_sys/xts_archive.h
|
||||||
|
frontend/applets/cabinet.cpp
|
||||||
|
frontend/applets/cabinet.h
|
||||||
frontend/applets/controller.cpp
|
frontend/applets/controller.cpp
|
||||||
frontend/applets/controller.h
|
frontend/applets/controller.h
|
||||||
frontend/applets/error.cpp
|
frontend/applets/error.cpp
|
||||||
|
@ -312,6 +314,8 @@ add_library(core STATIC
|
||||||
hle/service/am/applet_ae.h
|
hle/service/am/applet_ae.h
|
||||||
hle/service/am/applet_oe.cpp
|
hle/service/am/applet_oe.cpp
|
||||||
hle/service/am/applet_oe.h
|
hle/service/am/applet_oe.h
|
||||||
|
hle/service/am/applets/applet_cabinet.cpp
|
||||||
|
hle/service/am/applets/applet_cabinet.h
|
||||||
hle/service/am/applets/applet_controller.cpp
|
hle/service/am/applets/applet_controller.cpp
|
||||||
hle/service/am/applets/applet_controller.h
|
hle/service/am/applets/applet_controller.h
|
||||||
hle/service/am/applets/applet_error.cpp
|
hle/service/am/applets/applet_error.cpp
|
||||||
|
|
20
src/core/frontend/applets/cabinet.cpp
Normal file
20
src/core/frontend/applets/cabinet.cpp
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "common/logging/log.h"
|
||||||
|
#include "core/frontend/applets/cabinet.h"
|
||||||
|
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
namespace Core::Frontend {
|
||||||
|
|
||||||
|
CabinetApplet::~CabinetApplet() = default;
|
||||||
|
|
||||||
|
void DefaultCabinetApplet::ShowCabinetApplet(
|
||||||
|
std::function<void(bool, const std::string&)> callback, const CabinetParameters& parameters,
|
||||||
|
std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const {
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
callback(false, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Core::Frontend
|
36
src/core/frontend/applets/cabinet.h
Normal file
36
src/core/frontend/applets/cabinet.h
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include "core/hle/service/nfp/nfp_types.h"
|
||||||
|
|
||||||
|
namespace Service::NFP {
|
||||||
|
class NfpDevice;
|
||||||
|
} // namespace Service::NFP
|
||||||
|
|
||||||
|
namespace Core::Frontend {
|
||||||
|
|
||||||
|
struct CabinetParameters {
|
||||||
|
Service::NFP::TagInfo tag_info;
|
||||||
|
Service::NFP::RegisterInfo register_info;
|
||||||
|
Service::NFP::CabinetMode mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CabinetApplet {
|
||||||
|
public:
|
||||||
|
virtual ~CabinetApplet();
|
||||||
|
virtual void ShowCabinetApplet(std::function<void(bool, const std::string&)> callback,
|
||||||
|
const CabinetParameters& parameters,
|
||||||
|
std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class DefaultCabinetApplet final : public CabinetApplet {
|
||||||
|
public:
|
||||||
|
void ShowCabinetApplet(std::function<void(bool, const std::string&)> callback,
|
||||||
|
const CabinetParameters& parameters,
|
||||||
|
std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Core::Frontend
|
169
src/core/hle/service/am/applets/applet_cabinet.cpp
Normal file
169
src/core/hle/service/am/applets/applet_cabinet.cpp
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "common/assert.h"
|
||||||
|
#include "common/logging/log.h"
|
||||||
|
#include "core/core.h"
|
||||||
|
#include "core/frontend/applets/cabinet.h"
|
||||||
|
#include "core/hid/hid_core.h"
|
||||||
|
#include "core/hle/kernel/k_event.h"
|
||||||
|
#include "core/hle/kernel/k_readable_event.h"
|
||||||
|
#include "core/hle/service/am/am.h"
|
||||||
|
#include "core/hle/service/am/applets/applet_cabinet.h"
|
||||||
|
#include "core/hle/service/mii/mii_manager.h"
|
||||||
|
#include "core/hle/service/nfp/nfp_device.h"
|
||||||
|
|
||||||
|
namespace Service::AM::Applets {
|
||||||
|
|
||||||
|
Cabinet::Cabinet(Core::System& system_, LibraryAppletMode applet_mode_,
|
||||||
|
const Core::Frontend::CabinetApplet& frontend_)
|
||||||
|
: Applet{system_, applet_mode_}, frontend{frontend_}, system{system_}, service_context{
|
||||||
|
system_,
|
||||||
|
"CabinetApplet"} {
|
||||||
|
|
||||||
|
availability_change_event =
|
||||||
|
service_context.CreateEvent("CabinetApplet:AvailabilityChangeEvent");
|
||||||
|
}
|
||||||
|
|
||||||
|
Cabinet::~Cabinet() = default;
|
||||||
|
|
||||||
|
void Cabinet::Initialize() {
|
||||||
|
Applet::Initialize();
|
||||||
|
|
||||||
|
LOG_INFO(Service_HID, "Initializing Cabinet Applet.");
|
||||||
|
|
||||||
|
LOG_ERROR(Service_HID,
|
||||||
|
"Initializing Applet with common_args: arg_version={}, lib_version={}, "
|
||||||
|
"play_startup_sound={}, size={}, system_tick={}, theme_color={}",
|
||||||
|
common_args.arguments_version, common_args.library_version,
|
||||||
|
common_args.play_startup_sound, common_args.size, common_args.system_tick,
|
||||||
|
common_args.theme_color);
|
||||||
|
|
||||||
|
const auto storage = broker.PopNormalDataToApplet();
|
||||||
|
ASSERT(storage != nullptr);
|
||||||
|
|
||||||
|
const auto applet_input_data = storage->GetData();
|
||||||
|
ASSERT(applet_input_data.size() >= sizeof(StartParamForAmiiboSettings));
|
||||||
|
|
||||||
|
std::memcpy(&applet_input_common, applet_input_data.data(),
|
||||||
|
sizeof(StartParamForAmiiboSettings));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Cabinet::TransactionComplete() const {
|
||||||
|
return is_complete;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result Cabinet::GetStatus() const {
|
||||||
|
return ResultSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cabinet::ExecuteInteractive() {
|
||||||
|
ASSERT_MSG(false, "Attempted to call interactive execution on non-interactive applet.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cabinet::Execute() {
|
||||||
|
if (is_complete) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto callback = [this](bool apply_changes, const std::string& amiibo_name) {
|
||||||
|
DisplayCompleted(apply_changes, amiibo_name);
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: listen on all controllers
|
||||||
|
if (nfp_device == nullptr) {
|
||||||
|
nfp_device = std::make_shared<Service::NFP::NfpDevice>(
|
||||||
|
system.HIDCore().GetFirstNpadId(), system, service_context, availability_change_event);
|
||||||
|
nfp_device->Initialize();
|
||||||
|
nfp_device->StartDetection(Service::NFP::TagProtocol::All);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Core::Frontend::CabinetParameters parameters{
|
||||||
|
.tag_info = applet_input_common.tag_info,
|
||||||
|
.register_info = applet_input_common.register_info,
|
||||||
|
.mode = applet_input_common.applet_mode,
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (applet_input_common.applet_mode) {
|
||||||
|
case Service::NFP::CabinetMode::StartNicknameAndOwnerSettings:
|
||||||
|
case Service::NFP::CabinetMode::StartGameDataEraser:
|
||||||
|
case Service::NFP::CabinetMode::StartRestorer:
|
||||||
|
case Service::NFP::CabinetMode::StartFormatter:
|
||||||
|
frontend.ShowCabinetApplet(callback, parameters, nfp_device);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
UNIMPLEMENTED_MSG("Unknown CabinetMode={}", applet_input_common.applet_mode);
|
||||||
|
DisplayCompleted(false, {});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cabinet::DisplayCompleted(bool apply_changes, const std::string& amiibo_name) {
|
||||||
|
Service::Mii::MiiManager manager;
|
||||||
|
ReturnValueForAmiiboSettings applet_output{};
|
||||||
|
|
||||||
|
if (!apply_changes) {
|
||||||
|
Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nfp_device->GetCurrentState() != Service::NFP::DeviceState::TagFound &&
|
||||||
|
nfp_device->GetCurrentState() != Service::NFP::DeviceState::TagMounted) {
|
||||||
|
Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nfp_device->GetCurrentState() != Service::NFP::DeviceState::TagFound) {
|
||||||
|
nfp_device->Mount(Service::NFP::MountTarget::All);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (applet_input_common.applet_mode) {
|
||||||
|
case Service::NFP::CabinetMode::StartNicknameAndOwnerSettings: {
|
||||||
|
Service::NFP::AmiiboName name{};
|
||||||
|
memccpy(name.data(), amiibo_name.data(), 0, name.size());
|
||||||
|
nfp_device->SetNicknameAndOwner(name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Service::NFP::CabinetMode::StartGameDataEraser:
|
||||||
|
nfp_device->DeleteApplicationArea();
|
||||||
|
break;
|
||||||
|
case Service::NFP::CabinetMode::StartRestorer:
|
||||||
|
nfp_device->RestoreAmiibo();
|
||||||
|
break;
|
||||||
|
case Service::NFP::CabinetMode::StartFormatter:
|
||||||
|
nfp_device->DeleteAllData();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
UNIMPLEMENTED_MSG("Unknown CabinetMode={}", applet_input_common.applet_mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
applet_output.device_handle = applet_input_common.device_handle;
|
||||||
|
applet_output.result = CabinetResult::Success;
|
||||||
|
nfp_device->GetRegisterInfo(applet_output.register_info);
|
||||||
|
nfp_device->GetTagInfo(applet_output.tag_info);
|
||||||
|
nfp_device->Finalize();
|
||||||
|
|
||||||
|
std::vector<u8> out_data(sizeof(ReturnValueForAmiiboSettings));
|
||||||
|
std::memcpy(out_data.data(), &applet_output, sizeof(ReturnValueForAmiiboSettings));
|
||||||
|
|
||||||
|
is_complete = true;
|
||||||
|
|
||||||
|
broker.PushNormalDataFromApplet(std::make_shared<IStorage>(system, std::move(out_data)));
|
||||||
|
broker.SignalStateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cabinet::Cancel() {
|
||||||
|
ReturnValueForAmiiboSettings applet_output{};
|
||||||
|
applet_output.device_handle = applet_input_common.device_handle;
|
||||||
|
applet_output.result = CabinetResult::Cancel;
|
||||||
|
nfp_device->Finalize();
|
||||||
|
|
||||||
|
std::vector<u8> out_data(sizeof(ReturnValueForAmiiboSettings));
|
||||||
|
std::memcpy(out_data.data(), &applet_output, sizeof(ReturnValueForAmiiboSettings));
|
||||||
|
|
||||||
|
is_complete = true;
|
||||||
|
|
||||||
|
broker.PushNormalDataFromApplet(std::make_shared<IStorage>(system, std::move(out_data)));
|
||||||
|
broker.SignalStateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Service::AM::Applets
|
99
src/core/hle/service/am/applets/applet_cabinet.h
Normal file
99
src/core/hle/service/am/applets/applet_cabinet.h
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
#include "core/hle/result.h"
|
||||||
|
#include "core/hle/service/am/applets/applets.h"
|
||||||
|
#include "core/hle/service/kernel_helpers.h"
|
||||||
|
#include "core/hle/service/nfp/nfp_types.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class KEvent;
|
||||||
|
class KReadableEvent;
|
||||||
|
} // namespace Kernel
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class System;
|
||||||
|
} // namespace Core
|
||||||
|
|
||||||
|
namespace Service::NFP {
|
||||||
|
class NfpDevice;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Service::AM::Applets {
|
||||||
|
|
||||||
|
enum class CabinetAppletVersion : s32 {
|
||||||
|
Version1 = 0x1,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class CabinetResult : u8 {
|
||||||
|
Cancel,
|
||||||
|
Success,
|
||||||
|
};
|
||||||
|
|
||||||
|
// This is nn::nfp::AmiiboSettingsStartParam
|
||||||
|
struct AmiiboSettingsStartParam {
|
||||||
|
u64 device_handle;
|
||||||
|
std::array<u8, 0x20> param_1;
|
||||||
|
std::array<u8, 0x1> param_2;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(AmiiboSettingsStartParam) == 0x30,
|
||||||
|
"AmiiboSettingsStartParam is an invalid size");
|
||||||
|
|
||||||
|
// This is nn::nfp::StartParamForAmiiboSettings
|
||||||
|
struct StartParamForAmiiboSettings {
|
||||||
|
u8 param_1;
|
||||||
|
Service::NFP::CabinetMode applet_mode;
|
||||||
|
u8 flags;
|
||||||
|
u8 amiibo_settings_1;
|
||||||
|
u64 device_handle;
|
||||||
|
Service::NFP::TagInfo tag_info;
|
||||||
|
Service::NFP::RegisterInfo register_info;
|
||||||
|
std::array<u8, 0x20> amiibo_settings_3;
|
||||||
|
INSERT_PADDING_BYTES(0x20);
|
||||||
|
};
|
||||||
|
static_assert(sizeof(StartParamForAmiiboSettings) == 0x1A8,
|
||||||
|
"StartParamForAmiiboSettings is an invalid size");
|
||||||
|
|
||||||
|
// This is nn::nfp::ReturnValueForAmiiboSettings
|
||||||
|
struct ReturnValueForAmiiboSettings {
|
||||||
|
CabinetResult result;
|
||||||
|
INSERT_PADDING_BYTES(0x3);
|
||||||
|
u64 device_handle;
|
||||||
|
Service::NFP::TagInfo tag_info;
|
||||||
|
Service::NFP::RegisterInfo register_info;
|
||||||
|
INSERT_PADDING_BYTES(0x24);
|
||||||
|
};
|
||||||
|
static_assert(sizeof(ReturnValueForAmiiboSettings) == 0x190,
|
||||||
|
"ReturnValueForAmiiboSettings is an invalid size");
|
||||||
|
|
||||||
|
class Cabinet final : public Applet {
|
||||||
|
public:
|
||||||
|
explicit Cabinet(Core::System& system_, LibraryAppletMode applet_mode_,
|
||||||
|
const Core::Frontend::CabinetApplet& frontend_);
|
||||||
|
~Cabinet() override;
|
||||||
|
|
||||||
|
void Initialize() override;
|
||||||
|
|
||||||
|
bool TransactionComplete() const override;
|
||||||
|
Result GetStatus() const override;
|
||||||
|
void ExecuteInteractive() override;
|
||||||
|
void Execute() override;
|
||||||
|
void DisplayCompleted(bool apply_changes, const std::string& amiibo_name);
|
||||||
|
void Cancel();
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Core::Frontend::CabinetApplet& frontend;
|
||||||
|
Core::System& system;
|
||||||
|
|
||||||
|
bool is_complete{false};
|
||||||
|
std::shared_ptr<Service::NFP::NfpDevice> nfp_device;
|
||||||
|
Kernel::KEvent* availability_change_event;
|
||||||
|
KernelHelpers::ServiceContext service_context;
|
||||||
|
StartParamForAmiiboSettings applet_input_common{};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Service::AM::Applets
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
|
#include "core/frontend/applets/cabinet.h"
|
||||||
#include "core/frontend/applets/controller.h"
|
#include "core/frontend/applets/controller.h"
|
||||||
#include "core/frontend/applets/error.h"
|
#include "core/frontend/applets/error.h"
|
||||||
#include "core/frontend/applets/general_frontend.h"
|
#include "core/frontend/applets/general_frontend.h"
|
||||||
|
@ -16,6 +17,7 @@
|
||||||
#include "core/hle/service/am/am.h"
|
#include "core/hle/service/am/am.h"
|
||||||
#include "core/hle/service/am/applet_ae.h"
|
#include "core/hle/service/am/applet_ae.h"
|
||||||
#include "core/hle/service/am/applet_oe.h"
|
#include "core/hle/service/am/applet_oe.h"
|
||||||
|
#include "core/hle/service/am/applets/applet_cabinet.h"
|
||||||
#include "core/hle/service/am/applets/applet_controller.h"
|
#include "core/hle/service/am/applets/applet_controller.h"
|
||||||
#include "core/hle/service/am/applets/applet_error.h"
|
#include "core/hle/service/am/applets/applet_error.h"
|
||||||
#include "core/hle/service/am/applets/applet_general_backend.h"
|
#include "core/hle/service/am/applets/applet_general_backend.h"
|
||||||
|
@ -171,13 +173,15 @@ void Applet::Initialize() {
|
||||||
|
|
||||||
AppletFrontendSet::AppletFrontendSet() = default;
|
AppletFrontendSet::AppletFrontendSet() = default;
|
||||||
|
|
||||||
AppletFrontendSet::AppletFrontendSet(ControllerApplet controller_applet, ErrorApplet error_applet,
|
AppletFrontendSet::AppletFrontendSet(CabinetApplet cabinet_applet,
|
||||||
|
ControllerApplet controller_applet, ErrorApplet error_applet,
|
||||||
MiiEdit mii_edit_,
|
MiiEdit mii_edit_,
|
||||||
ParentalControlsApplet parental_controls_applet,
|
ParentalControlsApplet parental_controls_applet,
|
||||||
PhotoViewer photo_viewer_, ProfileSelect profile_select_,
|
PhotoViewer photo_viewer_, ProfileSelect profile_select_,
|
||||||
SoftwareKeyboard software_keyboard_, WebBrowser web_browser_)
|
SoftwareKeyboard software_keyboard_, WebBrowser web_browser_)
|
||||||
: controller{std::move(controller_applet)}, error{std::move(error_applet)},
|
: cabinet{std::move(cabinet_applet)}, controller{std::move(controller_applet)},
|
||||||
mii_edit{std::move(mii_edit_)}, parental_controls{std::move(parental_controls_applet)},
|
error{std::move(error_applet)}, mii_edit{std::move(mii_edit_)},
|
||||||
|
parental_controls{std::move(parental_controls_applet)},
|
||||||
photo_viewer{std::move(photo_viewer_)}, profile_select{std::move(profile_select_)},
|
photo_viewer{std::move(photo_viewer_)}, profile_select{std::move(profile_select_)},
|
||||||
software_keyboard{std::move(software_keyboard_)}, web_browser{std::move(web_browser_)} {}
|
software_keyboard{std::move(software_keyboard_)}, web_browser{std::move(web_browser_)} {}
|
||||||
|
|
||||||
|
@ -196,6 +200,10 @@ const AppletFrontendSet& AppletManager::GetAppletFrontendSet() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppletManager::SetAppletFrontendSet(AppletFrontendSet set) {
|
void AppletManager::SetAppletFrontendSet(AppletFrontendSet set) {
|
||||||
|
if (set.cabinet != nullptr) {
|
||||||
|
frontend.cabinet = std::move(set.cabinet);
|
||||||
|
}
|
||||||
|
|
||||||
if (set.controller != nullptr) {
|
if (set.controller != nullptr) {
|
||||||
frontend.controller = std::move(set.controller);
|
frontend.controller = std::move(set.controller);
|
||||||
}
|
}
|
||||||
|
@ -235,6 +243,10 @@ void AppletManager::SetDefaultAppletFrontendSet() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppletManager::SetDefaultAppletsIfMissing() {
|
void AppletManager::SetDefaultAppletsIfMissing() {
|
||||||
|
if (frontend.cabinet == nullptr) {
|
||||||
|
frontend.cabinet = std::make_unique<Core::Frontend::DefaultCabinetApplet>();
|
||||||
|
}
|
||||||
|
|
||||||
if (frontend.controller == nullptr) {
|
if (frontend.controller == nullptr) {
|
||||||
frontend.controller =
|
frontend.controller =
|
||||||
std::make_unique<Core::Frontend::DefaultControllerApplet>(system.HIDCore());
|
std::make_unique<Core::Frontend::DefaultControllerApplet>(system.HIDCore());
|
||||||
|
@ -279,6 +291,8 @@ std::shared_ptr<Applet> AppletManager::GetApplet(AppletId id, LibraryAppletMode
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case AppletId::Auth:
|
case AppletId::Auth:
|
||||||
return std::make_shared<Auth>(system, mode, *frontend.parental_controls);
|
return std::make_shared<Auth>(system, mode, *frontend.parental_controls);
|
||||||
|
case AppletId::Cabinet:
|
||||||
|
return std::make_shared<Cabinet>(system, mode, *frontend.cabinet);
|
||||||
case AppletId::Controller:
|
case AppletId::Controller:
|
||||||
return std::make_shared<Controller>(system, mode, *frontend.controller);
|
return std::make_shared<Controller>(system, mode, *frontend.controller);
|
||||||
case AppletId::Error:
|
case AppletId::Error:
|
||||||
|
|
|
@ -16,6 +16,7 @@ class System;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Core::Frontend {
|
namespace Core::Frontend {
|
||||||
|
class CabinetApplet;
|
||||||
class ControllerApplet;
|
class ControllerApplet;
|
||||||
class ECommerceApplet;
|
class ECommerceApplet;
|
||||||
class ErrorApplet;
|
class ErrorApplet;
|
||||||
|
@ -176,6 +177,7 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AppletFrontendSet {
|
struct AppletFrontendSet {
|
||||||
|
using CabinetApplet = std::unique_ptr<Core::Frontend::CabinetApplet>;
|
||||||
using ControllerApplet = std::unique_ptr<Core::Frontend::ControllerApplet>;
|
using ControllerApplet = std::unique_ptr<Core::Frontend::ControllerApplet>;
|
||||||
using ErrorApplet = std::unique_ptr<Core::Frontend::ErrorApplet>;
|
using ErrorApplet = std::unique_ptr<Core::Frontend::ErrorApplet>;
|
||||||
using MiiEdit = std::unique_ptr<Core::Frontend::MiiEditApplet>;
|
using MiiEdit = std::unique_ptr<Core::Frontend::MiiEditApplet>;
|
||||||
|
@ -186,10 +188,11 @@ struct AppletFrontendSet {
|
||||||
using WebBrowser = std::unique_ptr<Core::Frontend::WebBrowserApplet>;
|
using WebBrowser = std::unique_ptr<Core::Frontend::WebBrowserApplet>;
|
||||||
|
|
||||||
AppletFrontendSet();
|
AppletFrontendSet();
|
||||||
AppletFrontendSet(ControllerApplet controller_applet, ErrorApplet error_applet,
|
AppletFrontendSet(CabinetApplet cabinet_applet, ControllerApplet controller_applet,
|
||||||
MiiEdit mii_edit_, ParentalControlsApplet parental_controls_applet,
|
ErrorApplet error_applet, MiiEdit mii_edit_,
|
||||||
PhotoViewer photo_viewer_, ProfileSelect profile_select_,
|
ParentalControlsApplet parental_controls_applet, PhotoViewer photo_viewer_,
|
||||||
SoftwareKeyboard software_keyboard_, WebBrowser web_browser_);
|
ProfileSelect profile_select_, SoftwareKeyboard software_keyboard_,
|
||||||
|
WebBrowser web_browser_);
|
||||||
~AppletFrontendSet();
|
~AppletFrontendSet();
|
||||||
|
|
||||||
AppletFrontendSet(const AppletFrontendSet&) = delete;
|
AppletFrontendSet(const AppletFrontendSet&) = delete;
|
||||||
|
@ -198,6 +201,7 @@ struct AppletFrontendSet {
|
||||||
AppletFrontendSet(AppletFrontendSet&&) noexcept;
|
AppletFrontendSet(AppletFrontendSet&&) noexcept;
|
||||||
AppletFrontendSet& operator=(AppletFrontendSet&&) noexcept;
|
AppletFrontendSet& operator=(AppletFrontendSet&&) noexcept;
|
||||||
|
|
||||||
|
CabinetApplet cabinet;
|
||||||
ControllerApplet controller;
|
ControllerApplet controller;
|
||||||
ErrorApplet error;
|
ErrorApplet error;
|
||||||
MiiEdit mii_edit;
|
MiiEdit mii_edit;
|
||||||
|
|
|
@ -99,6 +99,13 @@ enum class TagProtocol : u32 {
|
||||||
All = 0xFFFFFFFFU,
|
All = 0xFFFFFFFFU,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class CabinetMode : u8 {
|
||||||
|
StartNicknameAndOwnerSettings,
|
||||||
|
StartGameDataEraser,
|
||||||
|
StartRestorer,
|
||||||
|
StartFormatter,
|
||||||
|
};
|
||||||
|
|
||||||
using UniqueSerialNumber = std::array<u8, 7>;
|
using UniqueSerialNumber = std::array<u8, 7>;
|
||||||
using LockBytes = std::array<u8, 2>;
|
using LockBytes = std::array<u8, 2>;
|
||||||
using HashData = std::array<u8, 0x20>;
|
using HashData = std::array<u8, 0x20>;
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "configuration/configure_tas.h"
|
#include "configuration/configure_tas.h"
|
||||||
#include "core/file_sys/vfs.h"
|
#include "core/file_sys/vfs.h"
|
||||||
#include "core/file_sys/vfs_real.h"
|
#include "core/file_sys/vfs_real.h"
|
||||||
|
#include "core/frontend/applets/cabinet.h"
|
||||||
#include "core/frontend/applets/controller.h"
|
#include "core/frontend/applets/controller.h"
|
||||||
#include "core/frontend/applets/general_frontend.h"
|
#include "core/frontend/applets/general_frontend.h"
|
||||||
#include "core/frontend/applets/mii_edit.h"
|
#include "core/frontend/applets/mii_edit.h"
|
||||||
|
@ -1547,6 +1548,7 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p
|
||||||
system->SetFilesystem(vfs);
|
system->SetFilesystem(vfs);
|
||||||
|
|
||||||
system->SetAppletFrontendSet({
|
system->SetAppletFrontendSet({
|
||||||
|
nullptr, // Amiibo Manager
|
||||||
std::make_unique<QtControllerSelector>(*this), // Controller Selector
|
std::make_unique<QtControllerSelector>(*this), // Controller Selector
|
||||||
std::make_unique<QtErrorDisplay>(*this), // Error Display
|
std::make_unique<QtErrorDisplay>(*this), // Error Display
|
||||||
nullptr, // Mii Editor
|
nullptr, // Mii Editor
|
||||||
|
|
Loading…
Reference in a new issue