7 changed files with 66 additions and 64 deletions
-
4src/core/CMakeLists.txt
-
56src/core/hle/service/am/process_winding_controller.cpp
-
2src/core/hle/service/am/service/application_proxy.cpp
-
2src/core/hle/service/am/service/library_applet_proxy.cpp
-
54src/core/hle/service/am/service/process_winding_controller.cpp
-
10src/core/hle/service/am/service/process_winding_controller.h
-
2src/core/hle/service/am/service/system_applet_proxy.cpp
@ -1,56 +0,0 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
#include "core/hle/service/am/frontend/applets.h"
|
|||
#include "core/hle/service/am/process_winding_controller.h"
|
|||
#include "core/hle/service/am/service/library_applet_accessor.h"
|
|||
#include "core/hle/service/ipc_helpers.h"
|
|||
|
|||
namespace Service::AM { |
|||
|
|||
IProcessWindingController::IProcessWindingController(Core::System& system_, |
|||
std::shared_ptr<Applet> applet_) |
|||
: ServiceFramework{system_, "IProcessWindingController"}, applet{std::move(applet_)} { |
|||
// clang-format off
|
|||
static const FunctionInfo functions[] = { |
|||
{0, &IProcessWindingController::GetLaunchReason, "GetLaunchReason"}, |
|||
{11, &IProcessWindingController::OpenCallingLibraryApplet, "OpenCallingLibraryApplet"}, |
|||
{21, nullptr, "PushContext"}, |
|||
{22, nullptr, "PopContext"}, |
|||
{23, nullptr, "CancelWindingReservation"}, |
|||
{30, nullptr, "WindAndDoReserved"}, |
|||
{40, nullptr, "ReserveToStartAndWaitAndUnwindThis"}, |
|||
{41, nullptr, "ReserveToStartAndWait"}, |
|||
}; |
|||
// clang-format on
|
|||
|
|||
RegisterHandlers(functions); |
|||
} |
|||
|
|||
IProcessWindingController::~IProcessWindingController() = default; |
|||
|
|||
void IProcessWindingController::GetLaunchReason(HLERequestContext& ctx) { |
|||
LOG_WARNING(Service_AM, "(STUBBED) called"); |
|||
|
|||
IPC::ResponseBuilder rb{ctx, 3}; |
|||
rb.Push(ResultSuccess); |
|||
rb.PushRaw(applet->launch_reason); |
|||
} |
|||
|
|||
void IProcessWindingController::OpenCallingLibraryApplet(HLERequestContext& ctx) { |
|||
const auto caller_applet = applet->caller_applet.lock(); |
|||
if (caller_applet == nullptr) { |
|||
LOG_ERROR(Service_AM, "No calling applet available"); |
|||
|
|||
IPC::ResponseBuilder rb{ctx, 2}; |
|||
rb.Push(ResultUnknown); |
|||
return; |
|||
} |
|||
|
|||
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|||
rb.Push(ResultSuccess); |
|||
rb.PushIpcInterface<ILibraryAppletAccessor>(system, applet->caller_applet_broker, |
|||
caller_applet); |
|||
} |
|||
|
|||
} // namespace Service::AM
|
|||
@ -0,0 +1,54 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|||
|
|||
#include "core/hle/service/am/frontend/applets.h"
|
|||
#include "core/hle/service/am/service/library_applet_accessor.h"
|
|||
#include "core/hle/service/am/service/process_winding_controller.h"
|
|||
#include "core/hle/service/cmif_serialization.h"
|
|||
|
|||
namespace Service::AM { |
|||
|
|||
IProcessWindingController::IProcessWindingController(Core::System& system_, |
|||
std::shared_ptr<Applet> applet) |
|||
: ServiceFramework{system_, "IProcessWindingController"}, m_applet{std::move(applet)} { |
|||
// clang-format off
|
|||
static const FunctionInfo functions[] = { |
|||
{0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"}, |
|||
{11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"}, |
|||
{21, nullptr, "PushContext"}, |
|||
{22, nullptr, "PopContext"}, |
|||
{23, nullptr, "CancelWindingReservation"}, |
|||
{30, nullptr, "WindAndDoReserved"}, |
|||
{40, nullptr, "ReserveToStartAndWaitAndUnwindThis"}, |
|||
{41, nullptr, "ReserveToStartAndWait"}, |
|||
}; |
|||
// clang-format on
|
|||
|
|||
RegisterHandlers(functions); |
|||
} |
|||
|
|||
IProcessWindingController::~IProcessWindingController() = default; |
|||
|
|||
Result IProcessWindingController::GetLaunchReason( |
|||
Out<AppletProcessLaunchReason> out_launch_reason) { |
|||
LOG_INFO(Service_AM, "called"); |
|||
*out_launch_reason = m_applet->launch_reason; |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
Result IProcessWindingController::OpenCallingLibraryApplet( |
|||
Out<SharedPointer<ILibraryAppletAccessor>> out_calling_library_applet) { |
|||
LOG_INFO(Service_AM, "called"); |
|||
|
|||
const auto caller_applet = m_applet->caller_applet.lock(); |
|||
if (caller_applet == nullptr) { |
|||
LOG_ERROR(Service_AM, "No caller applet available"); |
|||
R_THROW(ResultUnknown); |
|||
} |
|||
|
|||
*out_calling_library_applet = std::make_shared<ILibraryAppletAccessor>( |
|||
system, m_applet->caller_applet_broker, caller_applet); |
|||
R_SUCCEED(); |
|||
} |
|||
|
|||
} // namespace Service::AM
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue