15 changed files with 220 additions and 212 deletions
-
2src/android/app/src/main/jni/native.cpp
-
8src/core/CMakeLists.txt
-
12src/core/hle/service/am/am.cpp
-
6src/core/hle/service/am/am_types.h
-
73src/core/hle/service/am/applet_ae.cpp
-
39src/core/hle/service/am/applet_ae.h
-
42src/core/hle/service/am/applet_oe.cpp
-
37src/core/hle/service/am/applet_oe.h
-
3src/core/hle/service/am/frontend/applets.cpp
-
80src/core/hle/service/am/service/all_system_applet_proxies_service.cpp
-
47src/core/hle/service/am/service/all_system_applet_proxies_service.h
-
42src/core/hle/service/am/service/application_proxy_service.cpp
-
35src/core/hle/service/am/service/application_proxy_service.h
-
3src/yuzu/configuration/configure_input.cpp
-
3src/yuzu/main.cpp
@ -1,73 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||
|
|
||||
#include "core/hle/service/am/applet_ae.h"
|
|
||||
#include "core/hle/service/am/applet_manager.h"
|
|
||||
#include "core/hle/service/am/library_applet_proxy.h"
|
|
||||
#include "core/hle/service/am/system_applet_proxy.h"
|
|
||||
#include "core/hle/service/ipc_helpers.h"
|
|
||||
|
|
||||
namespace Service::AM { |
|
||||
|
|
||||
AppletAE::AppletAE(Nvnflinger::Nvnflinger& nvnflinger_, Core::System& system_) |
|
||||
: ServiceFramework{system_, "appletAE"}, nvnflinger{nvnflinger_} { |
|
||||
// clang-format off
|
|
||||
static const FunctionInfo functions[] = { |
|
||||
{100, &AppletAE::OpenSystemAppletProxy, "OpenSystemAppletProxy"}, |
|
||||
{200, &AppletAE::OpenLibraryAppletProxyOld, "OpenLibraryAppletProxyOld"}, |
|
||||
{201, &AppletAE::OpenLibraryAppletProxy, "OpenLibraryAppletProxy"}, |
|
||||
{300, nullptr, "OpenOverlayAppletProxy"}, |
|
||||
{350, nullptr, "OpenSystemApplicationProxy"}, |
|
||||
{400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"}, |
|
||||
{410, nullptr, "GetSystemAppletControllerForDebug"}, |
|
||||
{1000, nullptr, "GetDebugFunctions"}, |
|
||||
}; |
|
||||
// clang-format on
|
|
||||
|
|
||||
RegisterHandlers(functions); |
|
||||
} |
|
||||
|
|
||||
AppletAE::~AppletAE() = default; |
|
||||
|
|
||||
void AppletAE::OpenSystemAppletProxy(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
if (const auto applet = GetAppletFromContext(ctx)) { |
|
||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushIpcInterface<ISystemAppletProxy>(nvnflinger, applet, system); |
|
||||
} else { |
|
||||
UNIMPLEMENTED(); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultUnknown); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void AppletAE::OpenLibraryAppletProxy(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
if (const auto applet = GetAppletFromContext(ctx)) { |
|
||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushIpcInterface<ILibraryAppletProxy>(nvnflinger, applet, system); |
|
||||
} else { |
|
||||
UNIMPLEMENTED(); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultUnknown); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void AppletAE::OpenLibraryAppletProxyOld(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
return OpenLibraryAppletProxy(ctx); |
|
||||
} |
|
||||
|
|
||||
std::shared_ptr<Applet> AppletAE::GetAppletFromContext(HLERequestContext& ctx) { |
|
||||
const auto aruid = ctx.GetPID(); |
|
||||
return system.GetAppletManager().GetByAppletResourceUserId(aruid); |
|
||||
} |
|
||||
|
|
||||
} // namespace Service::AM
|
|
||||
@ -1,39 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project |
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
|
|
||||
#pragma once |
|
||||
|
|
||||
#include <memory> |
|
||||
|
|
||||
#include "core/hle/service/service.h" |
|
||||
|
|
||||
namespace Service { |
|
||||
namespace FileSystem { |
|
||||
class FileSystemController; |
|
||||
} |
|
||||
|
|
||||
namespace Nvnflinger { |
|
||||
class Nvnflinger; |
|
||||
} |
|
||||
|
|
||||
namespace AM { |
|
||||
|
|
||||
struct Applet; |
|
||||
|
|
||||
class AppletAE final : public ServiceFramework<AppletAE> { |
|
||||
public: |
|
||||
explicit AppletAE(Nvnflinger::Nvnflinger& nvnflinger_, Core::System& system_); |
|
||||
~AppletAE() override; |
|
||||
|
|
||||
private: |
|
||||
void OpenSystemAppletProxy(HLERequestContext& ctx); |
|
||||
void OpenLibraryAppletProxy(HLERequestContext& ctx); |
|
||||
void OpenLibraryAppletProxyOld(HLERequestContext& ctx); |
|
||||
|
|
||||
std::shared_ptr<Applet> GetAppletFromContext(HLERequestContext& ctx); |
|
||||
|
|
||||
Nvnflinger::Nvnflinger& nvnflinger; |
|
||||
}; |
|
||||
|
|
||||
} // namespace AM |
|
||||
} // namespace Service |
|
||||
@ -1,42 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||
|
|
||||
#include "core/hle/service/am/am.h"
|
|
||||
#include "core/hle/service/am/applet_manager.h"
|
|
||||
#include "core/hle/service/am/applet_oe.h"
|
|
||||
#include "core/hle/service/am/application_proxy.h"
|
|
||||
#include "core/hle/service/ipc_helpers.h"
|
|
||||
|
|
||||
namespace Service::AM { |
|
||||
|
|
||||
AppletOE::AppletOE(Nvnflinger::Nvnflinger& nvnflinger_, Core::System& system_) |
|
||||
: ServiceFramework{system_, "appletOE"}, nvnflinger{nvnflinger_} { |
|
||||
static const FunctionInfo functions[] = { |
|
||||
{0, &AppletOE::OpenApplicationProxy, "OpenApplicationProxy"}, |
|
||||
}; |
|
||||
RegisterHandlers(functions); |
|
||||
} |
|
||||
|
|
||||
AppletOE::~AppletOE() = default; |
|
||||
|
|
||||
void AppletOE::OpenApplicationProxy(HLERequestContext& ctx) { |
|
||||
LOG_DEBUG(Service_AM, "called"); |
|
||||
|
|
||||
if (const auto applet = GetAppletFromContext(ctx)) { |
|
||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
|
||||
rb.Push(ResultSuccess); |
|
||||
rb.PushIpcInterface<IApplicationProxy>(nvnflinger, applet, system); |
|
||||
} else { |
|
||||
UNIMPLEMENTED(); |
|
||||
|
|
||||
IPC::ResponseBuilder rb{ctx, 2}; |
|
||||
rb.Push(ResultUnknown); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
std::shared_ptr<Applet> AppletOE::GetAppletFromContext(HLERequestContext& ctx) { |
|
||||
const auto aruid = ctx.GetPID(); |
|
||||
return system.GetAppletManager().GetByAppletResourceUserId(aruid); |
|
||||
} |
|
||||
|
|
||||
} // namespace Service::AM
|
|
||||
@ -1,37 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project |
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
|
|
||||
#pragma once |
|
||||
|
|
||||
#include <memory> |
|
||||
|
|
||||
#include "core/hle/service/service.h" |
|
||||
|
|
||||
namespace Service { |
|
||||
namespace FileSystem { |
|
||||
class FileSystemController; |
|
||||
} |
|
||||
|
|
||||
namespace Nvnflinger { |
|
||||
class Nvnflinger; |
|
||||
} |
|
||||
|
|
||||
namespace AM { |
|
||||
|
|
||||
struct Applet; |
|
||||
|
|
||||
class AppletOE final : public ServiceFramework<AppletOE> { |
|
||||
public: |
|
||||
explicit AppletOE(Nvnflinger::Nvnflinger& nvnflinger_, Core::System& system_); |
|
||||
~AppletOE() override; |
|
||||
|
|
||||
private: |
|
||||
void OpenApplicationProxy(HLERequestContext& ctx); |
|
||||
|
|
||||
std::shared_ptr<Applet> GetAppletFromContext(HLERequestContext& ctx); |
|
||||
|
|
||||
Nvnflinger::Nvnflinger& nvnflinger; |
|
||||
}; |
|
||||
|
|
||||
} // namespace AM |
|
||||
} // namespace Service |
|
||||
@ -0,0 +1,80 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
|
||||
|
#include "core/core.h"
|
||||
|
#include "core/hle/service/am/applet_manager.h"
|
||||
|
#include "core/hle/service/am/library_applet_proxy.h"
|
||||
|
#include "core/hle/service/am/service/all_system_applet_proxies_service.h"
|
||||
|
#include "core/hle/service/am/system_applet_proxy.h"
|
||||
|
#include "core/hle/service/cmif_serialization.h"
|
||||
|
|
||||
|
namespace Service::AM { |
||||
|
|
||||
|
IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(Core::System& system_, |
||||
|
Nvnflinger::Nvnflinger& nvnflinger) |
||||
|
: ServiceFramework{system_, "appletAE"}, m_nvnflinger{nvnflinger} { |
||||
|
// clang-format off
|
||||
|
static const FunctionInfo functions[] = { |
||||
|
{100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"}, |
||||
|
{200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"}, |
||||
|
{201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"}, |
||||
|
{300, nullptr, "OpenOverlayAppletProxy"}, |
||||
|
{350, nullptr, "OpenSystemApplicationProxy"}, |
||||
|
{400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"}, |
||||
|
{410, nullptr, "GetSystemAppletControllerForDebug"}, |
||||
|
{1000, nullptr, "GetDebugFunctions"}, |
||||
|
}; |
||||
|
// clang-format on
|
||||
|
|
||||
|
RegisterHandlers(functions); |
||||
|
} |
||||
|
|
||||
|
IAllSystemAppletProxiesService::~IAllSystemAppletProxiesService() = default; |
||||
|
|
||||
|
Result IAllSystemAppletProxiesService::OpenSystemAppletProxy( |
||||
|
Out<SharedPointer<ISystemAppletProxy>> out_system_applet_proxy, ClientProcessId pid, |
||||
|
InCopyHandle<Kernel::KProcess> process_handle) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
|
||||
|
if (const auto applet = this->GetAppletFromProcessId(pid); applet) { |
||||
|
*out_system_applet_proxy = |
||||
|
std::make_shared<ISystemAppletProxy>(m_nvnflinger, applet, system); |
||||
|
R_SUCCEED(); |
||||
|
} else { |
||||
|
UNIMPLEMENTED(); |
||||
|
R_THROW(ResultUnknown); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Result IAllSystemAppletProxiesService::OpenLibraryAppletProxy( |
||||
|
Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid, |
||||
|
InCopyHandle<Kernel::KProcess> process_handle, |
||||
|
InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
|
||||
|
if (const auto applet = this->GetAppletFromProcessId(pid); applet) { |
||||
|
*out_library_applet_proxy = |
||||
|
std::make_shared<ILibraryAppletProxy>(m_nvnflinger, applet, system); |
||||
|
R_SUCCEED(); |
||||
|
} else { |
||||
|
UNIMPLEMENTED(); |
||||
|
R_THROW(ResultUnknown); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Result IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld( |
||||
|
Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid, |
||||
|
InCopyHandle<Kernel::KProcess> process_handle) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
|
||||
|
AppletAttribute attribute{}; |
||||
|
R_RETURN( |
||||
|
this->OpenLibraryAppletProxy(out_library_applet_proxy, pid, process_handle, attribute)); |
||||
|
} |
||||
|
|
||||
|
std::shared_ptr<Applet> IAllSystemAppletProxiesService::GetAppletFromProcessId( |
||||
|
ProcessId process_id) { |
||||
|
return system.GetAppletManager().GetByAppletResourceUserId(process_id.pid); |
||||
|
} |
||||
|
|
||||
|
} // namespace Service::AM
|
||||
@ -0,0 +1,47 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include "core/hle/service/cmif_types.h" |
||||
|
#include "core/hle/service/service.h" |
||||
|
|
||||
|
namespace Service { |
||||
|
|
||||
|
namespace Nvnflinger { |
||||
|
class Nvnflinger; |
||||
|
} |
||||
|
|
||||
|
namespace AM { |
||||
|
|
||||
|
struct Applet; |
||||
|
struct AppletAttribute; |
||||
|
class ILibraryAppletProxy; |
||||
|
class ISystemAppletProxy; |
||||
|
|
||||
|
class IAllSystemAppletProxiesService final |
||||
|
: public ServiceFramework<IAllSystemAppletProxiesService> { |
||||
|
public: |
||||
|
explicit IAllSystemAppletProxiesService(Core::System& system_, |
||||
|
Nvnflinger::Nvnflinger& nvnflinger); |
||||
|
~IAllSystemAppletProxiesService() override; |
||||
|
|
||||
|
private: |
||||
|
Result OpenSystemAppletProxy(Out<SharedPointer<ISystemAppletProxy>> out_system_applet_proxy, |
||||
|
ClientProcessId pid, |
||||
|
InCopyHandle<Kernel::KProcess> process_handle); |
||||
|
Result OpenLibraryAppletProxy(Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, |
||||
|
ClientProcessId pid, |
||||
|
InCopyHandle<Kernel::KProcess> process_handle, |
||||
|
InLargeData<AppletAttribute, BufferAttr_HipcMapAlias> attribute); |
||||
|
Result OpenLibraryAppletProxyOld( |
||||
|
Out<SharedPointer<ILibraryAppletProxy>> out_library_applet_proxy, ClientProcessId pid, |
||||
|
InCopyHandle<Kernel::KProcess> process_handle); |
||||
|
|
||||
|
private: |
||||
|
std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId pid); |
||||
|
Nvnflinger::Nvnflinger& m_nvnflinger; |
||||
|
}; |
||||
|
|
||||
|
} // namespace AM |
||||
|
} // namespace Service |
||||
@ -0,0 +1,42 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
|
||||
|
#include "core/core.h"
|
||||
|
#include "core/hle/service/am/am.h"
|
||||
|
#include "core/hle/service/am/applet_manager.h"
|
||||
|
#include "core/hle/service/am/application_proxy.h"
|
||||
|
#include "core/hle/service/am/service/application_proxy_service.h"
|
||||
|
#include "core/hle/service/cmif_serialization.h"
|
||||
|
|
||||
|
namespace Service::AM { |
||||
|
|
||||
|
IApplicationProxyService::IApplicationProxyService(Core::System& system_, |
||||
|
Nvnflinger::Nvnflinger& nvnflinger) |
||||
|
: ServiceFramework{system_, "appletOE"}, m_nvnflinger{nvnflinger} { |
||||
|
static const FunctionInfo functions[] = { |
||||
|
{0, D<&IApplicationProxyService::OpenApplicationProxy>, "OpenApplicationProxy"}, |
||||
|
}; |
||||
|
RegisterHandlers(functions); |
||||
|
} |
||||
|
|
||||
|
IApplicationProxyService::~IApplicationProxyService() = default; |
||||
|
|
||||
|
Result IApplicationProxyService::OpenApplicationProxy( |
||||
|
Out<SharedPointer<IApplicationProxy>> out_application_proxy, ClientProcessId pid, |
||||
|
InCopyHandle<Kernel::KProcess> process_handle) { |
||||
|
LOG_DEBUG(Service_AM, "called"); |
||||
|
|
||||
|
if (const auto applet = this->GetAppletFromProcessId(pid)) { |
||||
|
*out_application_proxy = std::make_shared<IApplicationProxy>(m_nvnflinger, applet, system); |
||||
|
R_SUCCEED(); |
||||
|
} else { |
||||
|
UNIMPLEMENTED(); |
||||
|
R_THROW(ResultUnknown); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
std::shared_ptr<Applet> IApplicationProxyService::GetAppletFromProcessId(ProcessId process_id) { |
||||
|
return system.GetAppletManager().GetByAppletResourceUserId(process_id.pid); |
||||
|
} |
||||
|
|
||||
|
} // namespace Service::AM
|
||||
@ -0,0 +1,35 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include "core/hle/service/cmif_types.h" |
||||
|
#include "core/hle/service/service.h" |
||||
|
|
||||
|
namespace Service { |
||||
|
|
||||
|
namespace Nvnflinger { |
||||
|
class Nvnflinger; |
||||
|
} |
||||
|
|
||||
|
namespace AM { |
||||
|
|
||||
|
struct Applet; |
||||
|
class IApplicationProxy; |
||||
|
|
||||
|
class IApplicationProxyService final : public ServiceFramework<IApplicationProxyService> { |
||||
|
public: |
||||
|
explicit IApplicationProxyService(Core::System& system_, Nvnflinger::Nvnflinger& nvnflinger); |
||||
|
~IApplicationProxyService() override; |
||||
|
|
||||
|
private: |
||||
|
Result OpenApplicationProxy(Out<SharedPointer<IApplicationProxy>> out_application_proxy, |
||||
|
ClientProcessId pid, InCopyHandle<Kernel::KProcess> process_handle); |
||||
|
|
||||
|
private: |
||||
|
std::shared_ptr<Applet> GetAppletFromProcessId(ProcessId pid); |
||||
|
Nvnflinger::Nvnflinger& m_nvnflinger; |
||||
|
}; |
||||
|
|
||||
|
} // namespace AM |
||||
|
} // namespace Service |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue