|
|
|
@ -19,6 +19,7 @@ |
|
|
|
#include "core/hle/service/am/am.h"
|
|
|
|
#include "core/hle/service/am/applet_ae.h"
|
|
|
|
#include "core/hle/service/am/applet_oe.h"
|
|
|
|
#include "core/hle/service/am/applets/applet_mii_edit_types.h"
|
|
|
|
#include "core/hle/service/am/applets/applet_profile_select.h"
|
|
|
|
#include "core/hle/service/am/applets/applet_web_browser.h"
|
|
|
|
#include "core/hle/service/am/applets/applets.h"
|
|
|
|
@ -724,7 +725,7 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, |
|
|
|
{110, nullptr, "OpenMyGpuErrorHandler"}, |
|
|
|
{120, nullptr, "GetAppletLaunchedHistory"}, |
|
|
|
{200, nullptr, "GetOperationModeSystemInfo"}, |
|
|
|
{300, nullptr, "GetSettingsPlatformRegion"}, |
|
|
|
{300, &ICommonStateGetter::GetSettingsPlatformRegion, "GetSettingsPlatformRegion"}, |
|
|
|
{400, nullptr, "ActivateMigrationService"}, |
|
|
|
{401, nullptr, "DeactivateMigrationService"}, |
|
|
|
{500, nullptr, "DisableSleepTillShutdown"}, |
|
|
|
@ -736,6 +737,10 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, |
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
RegisterHandlers(functions); |
|
|
|
|
|
|
|
// Configure applets to be in foreground state
|
|
|
|
msg_queue->PushMessage(AppletMessageQueue::AppletMessage::FocusStateChanged); |
|
|
|
msg_queue->PushMessage(AppletMessageQueue::AppletMessage::ChangeIntoForeground); |
|
|
|
} |
|
|
|
|
|
|
|
ICommonStateGetter::~ICommonStateGetter() = default; |
|
|
|
@ -867,6 +872,14 @@ void ICommonStateGetter::PerformSystemButtonPressingIfInFocus(HLERequestContext& |
|
|
|
rb.Push(ResultSuccess); |
|
|
|
} |
|
|
|
|
|
|
|
void ICommonStateGetter::GetSettingsPlatformRegion(HLERequestContext& ctx) { |
|
|
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 3}; |
|
|
|
rb.Push(ResultSuccess); |
|
|
|
rb.PushEnum(SysPlatformRegion::Global); |
|
|
|
} |
|
|
|
|
|
|
|
void ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled( |
|
|
|
HLERequestContext& ctx) { |
|
|
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
|
|
@ -1324,18 +1337,19 @@ void ILibraryAppletCreator::CreateHandleStorage(HLERequestContext& ctx) { |
|
|
|
|
|
|
|
ILibraryAppletSelfAccessor::ILibraryAppletSelfAccessor(Core::System& system_) |
|
|
|
: ServiceFramework{system_, "ILibraryAppletSelfAccessor"} { |
|
|
|
// clang-format off
|
|
|
|
static const FunctionInfo functions[] = { |
|
|
|
{0, nullptr, "PopInData"}, |
|
|
|
{0, &ILibraryAppletSelfAccessor::PopInData, "PopInData"}, |
|
|
|
{1, nullptr, "PushOutData"}, |
|
|
|
{2, nullptr, "PopInteractiveInData"}, |
|
|
|
{3, nullptr, "PushInteractiveOutData"}, |
|
|
|
{5, nullptr, "GetPopInDataEvent"}, |
|
|
|
{6, nullptr, "GetPopInteractiveInDataEvent"}, |
|
|
|
{10, nullptr, "ExitProcessAndReturn"}, |
|
|
|
{11, nullptr, "GetLibraryAppletInfo"}, |
|
|
|
{11, &ILibraryAppletSelfAccessor::GetLibraryAppletInfo, "GetLibraryAppletInfo"}, |
|
|
|
{12, nullptr, "GetMainAppletIdentityInfo"}, |
|
|
|
{13, nullptr, "CanUseApplicationCore"}, |
|
|
|
{14, nullptr, "GetCallerAppletIdentityInfo"}, |
|
|
|
{14, &ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo, "GetCallerAppletIdentityInfo"}, |
|
|
|
{15, nullptr, "GetMainAppletApplicationControlProperty"}, |
|
|
|
{16, nullptr, "GetMainAppletStorageId"}, |
|
|
|
{17, nullptr, "GetCallerAppletIdentityInfoStack"}, |
|
|
|
@ -1361,10 +1375,126 @@ ILibraryAppletSelfAccessor::ILibraryAppletSelfAccessor(Core::System& system_) |
|
|
|
{140, nullptr, "SetApplicationMemoryReservation"}, |
|
|
|
{150, nullptr, "ShouldSetGpuTimeSliceManually"}, |
|
|
|
}; |
|
|
|
// clang-format on
|
|
|
|
RegisterHandlers(functions); |
|
|
|
|
|
|
|
PushInShowMiiEditData(); |
|
|
|
} |
|
|
|
|
|
|
|
ILibraryAppletSelfAccessor::~ILibraryAppletSelfAccessor() = default; |
|
|
|
void ILibraryAppletSelfAccessor::PopInData(HLERequestContext& ctx) { |
|
|
|
LOG_INFO(Service_AM, "called"); |
|
|
|
|
|
|
|
if (queue_data.empty()) { |
|
|
|
IPC::ResponseBuilder rb{ctx, 2}; |
|
|
|
rb.Push(ResultNoDataInChannel); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
auto data = queue_data.front(); |
|
|
|
queue_data.pop_front(); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|
|
|
rb.Push(ResultSuccess); |
|
|
|
rb.PushIpcInterface<IStorage>(system, std::move(data)); |
|
|
|
} |
|
|
|
|
|
|
|
void ILibraryAppletSelfAccessor::GetLibraryAppletInfo(HLERequestContext& ctx) { |
|
|
|
struct LibraryAppletInfo { |
|
|
|
Applets::AppletId applet_id; |
|
|
|
Applets::LibraryAppletMode library_applet_mode; |
|
|
|
}; |
|
|
|
|
|
|
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
|
|
|
|
|
|
const LibraryAppletInfo applet_info{ |
|
|
|
.applet_id = Applets::AppletId::MiiEdit, |
|
|
|
.library_applet_mode = Applets::LibraryAppletMode::AllForeground, |
|
|
|
}; |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 4}; |
|
|
|
rb.Push(ResultSuccess); |
|
|
|
rb.PushRaw(applet_info); |
|
|
|
} |
|
|
|
|
|
|
|
void ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo(HLERequestContext& ctx) { |
|
|
|
struct AppletIdentityInfo { |
|
|
|
Applets::AppletId applet_id; |
|
|
|
INSERT_PADDING_BYTES(0x4); |
|
|
|
u64 application_id; |
|
|
|
}; |
|
|
|
|
|
|
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
|
|
|
|
|
|
const AppletIdentityInfo applet_info{ |
|
|
|
.applet_id = Applets::AppletId::QLaunch, |
|
|
|
.application_id = 0x0100000000001000ull, |
|
|
|
}; |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 6}; |
|
|
|
rb.Push(ResultSuccess); |
|
|
|
rb.PushRaw(applet_info); |
|
|
|
} |
|
|
|
|
|
|
|
void ILibraryAppletSelfAccessor::PushInShowMiiEditData() { |
|
|
|
struct MiiEditV3 { |
|
|
|
Applets::MiiEditAppletInputCommon common; |
|
|
|
Applets::MiiEditAppletInputV3 input; |
|
|
|
}; |
|
|
|
static_assert(sizeof(MiiEditV3) == 0x100, "MiiEditV3 has incorrect size."); |
|
|
|
|
|
|
|
MiiEditV3 mii_arguments{ |
|
|
|
.common = |
|
|
|
{ |
|
|
|
.version = Applets::MiiEditAppletVersion::Version3, |
|
|
|
.applet_mode = Applets::MiiEditAppletMode::ShowMiiEdit, |
|
|
|
}, |
|
|
|
.input{}, |
|
|
|
}; |
|
|
|
|
|
|
|
std::vector<u8> argument_data(sizeof(mii_arguments)); |
|
|
|
std::memcpy(argument_data.data(), &mii_arguments, sizeof(mii_arguments)); |
|
|
|
|
|
|
|
queue_data.emplace_back(std::move(argument_data)); |
|
|
|
} |
|
|
|
|
|
|
|
IAppletCommonFunctions::IAppletCommonFunctions(Core::System& system_) |
|
|
|
: ServiceFramework{system_, "IAppletCommonFunctions"} { |
|
|
|
// clang-format off
|
|
|
|
static const FunctionInfo functions[] = { |
|
|
|
{0, nullptr, "SetTerminateResult"}, |
|
|
|
{10, nullptr, "ReadThemeStorage"}, |
|
|
|
{11, nullptr, "WriteThemeStorage"}, |
|
|
|
{20, nullptr, "PushToAppletBoundChannel"}, |
|
|
|
{21, nullptr, "TryPopFromAppletBoundChannel"}, |
|
|
|
{40, nullptr, "GetDisplayLogicalResolution"}, |
|
|
|
{42, nullptr, "SetDisplayMagnification"}, |
|
|
|
{50, nullptr, "SetHomeButtonDoubleClickEnabled"}, |
|
|
|
{51, nullptr, "GetHomeButtonDoubleClickEnabled"}, |
|
|
|
{52, nullptr, "IsHomeButtonShortPressedBlocked"}, |
|
|
|
{60, nullptr, "IsVrModeCurtainRequired"}, |
|
|
|
{61, nullptr, "IsSleepRequiredByHighTemperature"}, |
|
|
|
{62, nullptr, "IsSleepRequiredByLowBattery"}, |
|
|
|
{70, &IAppletCommonFunctions::SetCpuBoostRequestPriority, "SetCpuBoostRequestPriority"}, |
|
|
|
{80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"}, |
|
|
|
{81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"}, |
|
|
|
{90, nullptr, "OpenNamedChannelAsParent"}, |
|
|
|
{91, nullptr, "OpenNamedChannelAsChild"}, |
|
|
|
{100, nullptr, "SetApplicationCoreUsageMode"}, |
|
|
|
}; |
|
|
|
// clang-format on
|
|
|
|
|
|
|
|
RegisterHandlers(functions); |
|
|
|
} |
|
|
|
|
|
|
|
IAppletCommonFunctions::~IAppletCommonFunctions() = default; |
|
|
|
|
|
|
|
void IAppletCommonFunctions::SetCpuBoostRequestPriority(HLERequestContext& ctx) { |
|
|
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2}; |
|
|
|
rb.Push(ResultSuccess); |
|
|
|
} |
|
|
|
|
|
|
|
IApplicationFunctions::IApplicationFunctions(Core::System& system_) |
|
|
|
: ServiceFramework{system_, "IApplicationFunctions"}, service_context{system, |
|
|
|
@ -2049,8 +2179,8 @@ IProcessWindingController::IProcessWindingController(Core::System& system_) |
|
|
|
: ServiceFramework{system_, "IProcessWindingController"} { |
|
|
|
// clang-format off
|
|
|
|
static const FunctionInfo functions[] = { |
|
|
|
{0, nullptr, "GetLaunchReason"}, |
|
|
|
{11, nullptr, "OpenCallingLibraryApplet"}, |
|
|
|
{0, &IProcessWindingController::GetLaunchReason, "GetLaunchReason"}, |
|
|
|
{11, &IProcessWindingController::OpenCallingLibraryApplet, "OpenCallingLibraryApplet"}, |
|
|
|
{21, nullptr, "PushContext"}, |
|
|
|
{22, nullptr, "PopContext"}, |
|
|
|
{23, nullptr, "CancelWindingReservation"}, |
|
|
|
@ -2064,4 +2194,46 @@ IProcessWindingController::IProcessWindingController(Core::System& system_) |
|
|
|
} |
|
|
|
|
|
|
|
IProcessWindingController::~IProcessWindingController() = default; |
|
|
|
|
|
|
|
void IProcessWindingController::GetLaunchReason(HLERequestContext& ctx) { |
|
|
|
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|
|
|
|
|
|
|
struct AppletProcessLaunchReason { |
|
|
|
u8 flag; |
|
|
|
INSERT_PADDING_BYTES(3); |
|
|
|
}; |
|
|
|
static_assert(sizeof(AppletProcessLaunchReason) == 0x4, |
|
|
|
"AppletProcessLaunchReason is an invalid size"); |
|
|
|
|
|
|
|
AppletProcessLaunchReason reason{ |
|
|
|
.flag = 0, |
|
|
|
}; |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 3}; |
|
|
|
rb.Push(ResultSuccess); |
|
|
|
rb.PushRaw(reason); |
|
|
|
} |
|
|
|
|
|
|
|
void IProcessWindingController::OpenCallingLibraryApplet(HLERequestContext& ctx) { |
|
|
|
const auto applet_id = Applets::AppletId::MiiEdit; |
|
|
|
const auto applet_mode = Applets::LibraryAppletMode::AllForeground; |
|
|
|
|
|
|
|
LOG_WARNING(Service_AM, "(STUBBED) called with applet_id={:08X}, applet_mode={:08X}", applet_id, |
|
|
|
applet_mode); |
|
|
|
|
|
|
|
const auto& applet_manager{system.GetAppletManager()}; |
|
|
|
const auto applet = applet_manager.GetApplet(applet_id, applet_mode); |
|
|
|
|
|
|
|
if (applet == nullptr) { |
|
|
|
LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2}; |
|
|
|
rb.Push(ResultUnknown); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|
|
|
rb.Push(ResultSuccess); |
|
|
|
rb.PushIpcInterface<ILibraryAppletAccessor>(system, applet); |
|
|
|
} |
|
|
|
} // namespace Service::AM
|