3 changed files with 180 additions and 0 deletions
-
2src/core/CMakeLists.txt
-
138src/core/hle/service/am/service/application_accessor.cpp
-
40src/core/hle/service/am/service/application_accessor.h
@ -0,0 +1,138 @@ |
|||
// 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> 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<Kernel::KReadableEvent> out_event) { |
|||
LOG_INFO(Service_AM, "called"); |
|||
*out_event = m_applet->caller_applet_broker->GetStateChangedEvent().GetHandle(); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IApplicationAccessor::PushLaunchParameter(LaunchParameterKind kind, |
|||
SharedPointer<IStorage> 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<BufferAttr_HipcMapAlias> out_control_property) { |
|||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|||
R_THROW(ResultUnknown); |
|||
} |
|||
|
|||
Result IApplicationAccessor::SetUsers(bool enable, |
|||
InArray<Common::UUID, BufferAttr_HipcMapAlias> user_ids) { |
|||
LOG_INFO(Service_AM, "called, enable={} user_id_count={}", enable, user_ids.size()); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IApplicationAccessor::GetCurrentLibraryApplet( |
|||
Out<SharedPointer<ILibraryAppletAccessor>> 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<bool> out_is_available) { |
|||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|||
*out_is_available = true; |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IApplicationAccessor::GetNsRightsEnvironmentHandle(Out<u64> 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
|
|||
@ -0,0 +1,40 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include "common/uuid.h" |
|||
#include "core/hle/service/am/am_types.h" |
|||
#include "core/hle/service/cmif_types.h" |
|||
#include "core/hle/service/service.h" |
|||
|
|||
namespace Service::AM { |
|||
|
|||
struct Applet; |
|||
class ILibraryAppletAccessor; |
|||
class IStorage; |
|||
|
|||
class IApplicationAccessor final : public ServiceFramework<IApplicationAccessor> { |
|||
public: |
|||
explicit IApplicationAccessor(Core::System& system_, std::shared_ptr<Applet> applet); |
|||
~IApplicationAccessor() override; |
|||
|
|||
private: |
|||
Result Start(); |
|||
Result RequestExit(); |
|||
Result Terminate(); |
|||
Result GetResult(); |
|||
Result GetAppletStateChangedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event); |
|||
Result PushLaunchParameter(LaunchParameterKind kind, SharedPointer<IStorage> storage); |
|||
Result GetApplicationControlProperty(OutBuffer<BufferAttr_HipcMapAlias> out_control_property); |
|||
Result SetUsers(bool enable, InArray<Common::UUID, BufferAttr_HipcMapAlias> user_ids); |
|||
Result GetCurrentLibraryApplet(Out<SharedPointer<ILibraryAppletAccessor>> out_accessor); |
|||
Result RequestForApplicationToGetForeground(); |
|||
Result CheckRightsEnvironmentAvailable(Out<bool> out_is_available); |
|||
Result GetNsRightsEnvironmentHandle(Out<u64> out_handle); |
|||
Result ReportApplicationExitTimeout(); |
|||
|
|||
const std::shared_ptr<Applet> m_applet; |
|||
}; |
|||
|
|||
} // namespace Service::AM |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue