// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/result.h" #include "core/hle/service/am/am_types.h" #include "core/hle/service/am/applet.h" #include "core/hle/service/am/applet_data_broker.h" #include "core/hle/service/am/applet_manager.h" #include "core/hle/service/am/service/application_accessor.h" #include "core/hle/service/am/service/library_applet_accessor.h" #include "core/hle/service/am/service/storage.h" #include "core/hle/service/cmif_serialization.h" namespace Service::AM { IApplicationAccessor::IApplicationAccessor(Core::System& system_, std::shared_ptr applet) : ServiceFramework{system_, "IApplicationAccessor"}, m_applet(std::move(applet)) { // clang-format off static const FunctionInfo functions[] = { {0, D<&IApplicationAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"}, {1, nullptr, "IsCompleted"}, {10, D<&IApplicationAccessor::Start>, "Start"}, {20, D<&IApplicationAccessor::RequestExit>, "RequestExit"}, {25, D<&IApplicationAccessor::Terminate>, "Terminate"}, {30, D<&IApplicationAccessor::GetResult>, "GetResult"}, {101, D<&IApplicationAccessor::RequestForApplicationToGetForeground>, "RequestForApplicationToGetForeground"}, {110, nullptr, "TerminateAllLibraryApplets"}, {111, nullptr, "AreAnyLibraryAppletsLeft"}, {112, D<&IApplicationAccessor::GetCurrentLibraryApplet>, "GetCurrentLibraryApplet"}, {120, nullptr, "GetApplicationId"}, {121, D<&IApplicationAccessor::PushLaunchParameter>, "PushLaunchParameter"}, {122, D<&IApplicationAccessor::GetApplicationControlProperty>, "GetApplicationControlProperty"}, {123, nullptr, "GetApplicationLaunchProperty"}, {124, nullptr, "GetApplicationLaunchRequestInfo"}, {130, D<&IApplicationAccessor::SetUsers>, "SetUsers"}, {131, D<&IApplicationAccessor::CheckRightsEnvironmentAvailable>, "CheckRightsEnvironmentAvailable"}, {132, D<&IApplicationAccessor::GetNsRightsEnvironmentHandle>, "GetNsRightsEnvironmentHandle"}, {140, nullptr, "GetDesirableUids"}, {150, D<&IApplicationAccessor::ReportApplicationExitTimeout>, "ReportApplicationExitTimeout"}, {160, nullptr, "SetApplicationAttribute"}, {170, nullptr, "HasSaveDataAccessPermission"}, {180, nullptr, "PushToFriendInvitationStorageChannel"}, {190, nullptr, "PushToNotificationStorageChannel"}, {200, nullptr, "RequestApplicationSoftReset"}, {201, nullptr, "RestartApplicationTimer"}, }; // clang-format on RegisterHandlers(functions); } IApplicationAccessor::~IApplicationAccessor() = default; Result IApplicationAccessor::Start() { LOG_INFO(Service_AM, "called"); m_applet->process->Run(); R_SUCCEED(); } Result IApplicationAccessor::RequestExit() { LOG_INFO(Service_AM, "called"); m_applet->message_queue.RequestExit(); R_SUCCEED(); } Result IApplicationAccessor::Terminate() { LOG_INFO(Service_AM, "called"); m_applet->process->Terminate(); R_SUCCEED(); } Result IApplicationAccessor::GetResult() { LOG_INFO(Service_AM, "called"); R_SUCCEED(); } Result IApplicationAccessor::GetAppletStateChangedEvent( OutCopyHandle out_event) { LOG_INFO(Service_AM, "called"); *out_event = m_applet->caller_applet_broker->GetStateChangedEvent().GetHandle(); R_SUCCEED(); } Result IApplicationAccessor::PushLaunchParameter(LaunchParameterKind kind, SharedPointer storage) { LOG_INFO(Service_AM, "called, kind={}", kind); switch (kind) { case LaunchParameterKind::AccountPreselectedUser: m_applet->preselected_user_launch_parameter.push_back(storage->GetData()); R_SUCCEED(); default: R_THROW(ResultUnknown); } } Result IApplicationAccessor::GetApplicationControlProperty( OutBuffer out_control_property) { LOG_WARNING(Service_AM, "(STUBBED) called"); R_THROW(ResultUnknown); } Result IApplicationAccessor::SetUsers(bool enable, InArray user_ids) { LOG_INFO(Service_AM, "called, enable={} user_id_count={}", enable, user_ids.size()); R_SUCCEED(); } Result IApplicationAccessor::GetCurrentLibraryApplet( Out> out_accessor) { LOG_INFO(Service_AM, "(STUBBED) called"); *out_accessor = nullptr; R_SUCCEED(); } Result IApplicationAccessor::RequestForApplicationToGetForeground() { LOG_WARNING(Service_AM, "(STUBBED) called"); R_THROW(ResultUnknown); } Result IApplicationAccessor::CheckRightsEnvironmentAvailable(Out out_is_available) { LOG_WARNING(Service_AM, "(STUBBED) called"); *out_is_available = true; R_SUCCEED(); } Result IApplicationAccessor::GetNsRightsEnvironmentHandle(Out out_handle) { LOG_WARNING(Service_AM, "(STUBBED) called"); *out_handle = 0xdeadbeef; R_SUCCEED(); } Result IApplicationAccessor::ReportApplicationExitTimeout() { LOG_ERROR(Service_AM, "called"); R_SUCCEED(); } } // namespace Service::AM