mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-05-17 14:37:02 +02:00
[hle/ns] implement IReadOnlyApplicationControlDataInterface::ListApplicationIcon
Signed-off-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
parent
5322bce4b8
commit
6dfcdbf6fc
5 changed files with 102 additions and 88 deletions
|
|
@ -137,7 +137,7 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
|
||||||
{405, nullptr, "ListApplicationControlCacheEntryInfo"},
|
{405, nullptr, "ListApplicationControlCacheEntryInfo"},
|
||||||
{406, nullptr, "GetApplicationControlProperty"},
|
{406, nullptr, "GetApplicationControlProperty"},
|
||||||
{407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"},
|
{407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"},
|
||||||
{408, nullptr, "ListApplicationIcon"},
|
{408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"},
|
||||||
{411, nullptr, "Unknown411"}, //19.0.0+
|
{411, nullptr, "Unknown411"}, //19.0.0+
|
||||||
{412, nullptr, "Unknown412"}, //19.0.0+
|
{412, nullptr, "Unknown412"}, //19.0.0+
|
||||||
{413, nullptr, "Unknown413"}, //19.0.0+
|
{413, nullptr, "Unknown413"}, //19.0.0+
|
||||||
|
|
@ -848,4 +848,9 @@ void IApplicationManagerInterface::ListApplicationTitle(HLERequestContext& ctx)
|
||||||
IReadOnlyApplicationControlDataInterface(system).ListApplicationTitle(ctx);
|
IReadOnlyApplicationControlDataInterface(system).ListApplicationTitle(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IApplicationManagerInterface::ListApplicationIcon(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_NS, "called");
|
||||||
|
IReadOnlyApplicationControlDataInterface(system).ListApplicationIcon(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service::NS
|
} // namespace Service::NS
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,7 @@ public:
|
||||||
u64 application_id);
|
u64 application_id);
|
||||||
|
|
||||||
void ListApplicationTitle(HLERequestContext& ctx);
|
void ListApplicationTitle(HLERequestContext& ctx);
|
||||||
|
void ListApplicationIcon(HLERequestContext& ctx);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
KernelHelpers::ServiceContext service_context;
|
KernelHelpers::ServiceContext service_context;
|
||||||
|
|
|
||||||
|
|
@ -12,12 +12,16 @@
|
||||||
#include <stb_image_write.h>
|
#include <stb_image_write.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "common/logging.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "core/file_sys/control_metadata.h"
|
#include "core/file_sys/control_metadata.h"
|
||||||
#include "core/file_sys/patch_manager.h"
|
#include "core/file_sys/patch_manager.h"
|
||||||
#include "core/file_sys/vfs/vfs.h"
|
#include "core/file_sys/vfs/vfs.h"
|
||||||
#include "core/hle/kernel/k_transfer_memory.h"
|
#include "core/hle/kernel/k_transfer_memory.h"
|
||||||
|
#include "core/hle/result.h"
|
||||||
#include "core/hle/service/cmif_serialization.h"
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
|
#include "core/hle/service/cmif_types.h"
|
||||||
|
#include "core/hle/service/hle_ipc.h"
|
||||||
#include "core/hle/service/ns/language.h"
|
#include "core/hle/service/ns/language.h"
|
||||||
#include "core/hle/service/ns/ns_types.h"
|
#include "core/hle/service/ns/ns_types.h"
|
||||||
#include "core/hle/service/ns/ns_results.h"
|
#include "core/hle/service/ns/ns_results.h"
|
||||||
|
|
@ -73,24 +77,26 @@ void SanitizeJPEGImageSize(std::vector<u8>& image) {
|
||||||
|
|
||||||
// IAsyncValue implementation for ListApplicationTitle
|
// IAsyncValue implementation for ListApplicationTitle
|
||||||
// https://switchbrew.org/wiki/NS_services#ListApplicationTitle
|
// https://switchbrew.org/wiki/NS_services#ListApplicationTitle
|
||||||
class IAsyncValueForListApplicationTitle final : public ServiceFramework<IAsyncValueForListApplicationTitle> {
|
class IAsyncValue final : public ServiceFramework<IAsyncValue> {
|
||||||
public:
|
public:
|
||||||
explicit IAsyncValueForListApplicationTitle(Core::System& system_, s32 offset, s32 size)
|
explicit IAsyncValue(Core::System& system_, s32 offset, s32 size)
|
||||||
: ServiceFramework{system_, "IAsyncValue"}, service_context{system_, "IAsyncValue"},
|
: ServiceFramework{system_, "IAsyncValue"}
|
||||||
data_offset{offset}, data_size{size} {
|
, service_context{system_, "IAsyncValue"}
|
||||||
|
, data_offset{offset}
|
||||||
|
, data_size{size}
|
||||||
|
{
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, &IAsyncValueForListApplicationTitle::GetSize, "GetSize"},
|
{0, D<&IAsyncValue::GetSize>, "GetSize"},
|
||||||
{1, &IAsyncValueForListApplicationTitle::Get, "Get"},
|
{1, D<&IAsyncValue::Get>, "Get"},
|
||||||
{2, &IAsyncValueForListApplicationTitle::Cancel, "Cancel"},
|
{2, D<&IAsyncValue::Cancel>, "Cancel"},
|
||||||
{3, &IAsyncValueForListApplicationTitle::GetErrorContext, "GetErrorContext"},
|
{3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"},
|
||||||
};
|
};
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
completion_event = service_context.CreateEvent("IAsyncValue:Completion");
|
completion_event = service_context.CreateEvent("IAsyncValue:Completion");
|
||||||
completion_event->GetReadableEvent().Signal();
|
completion_event->GetReadableEvent().Signal();
|
||||||
}
|
}
|
||||||
|
|
||||||
~IAsyncValueForListApplicationTitle() override {
|
~IAsyncValue() override {
|
||||||
service_context.CloseEvent(completion_event);
|
service_context.CloseEvent(completion_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,35 +105,24 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void GetSize(HLERequestContext& ctx) {
|
Result GetSize(Out<s64> out_data_size) {
|
||||||
LOG_DEBUG(Service_NS, "called");
|
LOG_DEBUG(Service_NS, "called");
|
||||||
IPC::ResponseBuilder rb{ctx, 4};
|
*out_data_size = data_size;
|
||||||
rb.Push(ResultSuccess);
|
R_SUCCEED();
|
||||||
rb.Push<s64>(data_size);
|
|
||||||
}
|
}
|
||||||
|
Result Get(OutBuffer<BufferAttr_HipcMapAlias> out_data_offset) {
|
||||||
void Get(HLERequestContext& ctx) {
|
|
||||||
LOG_DEBUG(Service_NS, "called");
|
LOG_DEBUG(Service_NS, "called");
|
||||||
std::vector<u8> buffer(sizeof(s32));
|
std::memcpy(out_data_offset.data(), &data_offset, sizeof(s32));
|
||||||
std::memcpy(buffer.data(), &data_offset, sizeof(s32));
|
R_SUCCEED();
|
||||||
ctx.WriteBuffer(buffer);
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
}
|
}
|
||||||
|
Result Cancel() {
|
||||||
void Cancel(HLERequestContext& ctx) {
|
|
||||||
LOG_DEBUG(Service_NS, "called");
|
LOG_DEBUG(Service_NS, "called");
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
R_SUCCEED();
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
}
|
}
|
||||||
|
Result GetErrorContext() {
|
||||||
void GetErrorContext(HLERequestContext& ctx) {
|
|
||||||
LOG_DEBUG(Service_NS, "called");
|
LOG_DEBUG(Service_NS, "called");
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
R_SUCCEED();
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
KernelHelpers::ServiceContext service_context;
|
KernelHelpers::ServiceContext service_context;
|
||||||
Kernel::KEvent* completion_event{};
|
Kernel::KEvent* completion_event{};
|
||||||
s32 data_offset;
|
s32 data_offset;
|
||||||
|
|
@ -145,6 +140,7 @@ IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterfa
|
||||||
{3, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
|
{3, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
|
||||||
{4, nullptr, "SelectApplicationDesiredLanguage"},
|
{4, nullptr, "SelectApplicationDesiredLanguage"},
|
||||||
{5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"},
|
{5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"},
|
||||||
|
{10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"},
|
||||||
{13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"},
|
{13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"},
|
||||||
{19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"},
|
{19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"},
|
||||||
};
|
};
|
||||||
|
|
@ -161,8 +157,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData(
|
||||||
LOG_INFO(Service_NS, "called with control_source={}, application_id={:016X}",
|
LOG_INFO(Service_NS, "called with control_source={}, application_id={:016X}",
|
||||||
application_control_source, application_id);
|
application_control_source, application_id);
|
||||||
|
|
||||||
const FileSys::PatchManager pm{application_id, system.GetFileSystemController(),
|
const FileSys::PatchManager pm{application_id, system.GetFileSystemController(), system.GetContentProvider()};
|
||||||
system.GetContentProvider()};
|
|
||||||
const auto control = pm.GetControlMetadata();
|
const auto control = pm.GetControlMetadata();
|
||||||
const auto size = out_buffer.size();
|
const auto size = out_buffer.size();
|
||||||
|
|
||||||
|
|
@ -170,8 +165,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData(
|
||||||
const auto total_size = sizeof(FileSys::RawNACP) + icon_size;
|
const auto total_size = sizeof(FileSys::RawNACP) + icon_size;
|
||||||
|
|
||||||
if (size < total_size) {
|
if (size < total_size) {
|
||||||
LOG_ERROR(Service_NS, "output buffer is too small! (actual={:016X}, expected_min=0x4000)",
|
LOG_ERROR(Service_NS, "output buffer is too small! (actual={:016X}, expected_min=0x4000)", size);
|
||||||
size);
|
|
||||||
R_THROW(ResultUnknown);
|
R_THROW(ResultUnknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -179,8 +173,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData(
|
||||||
const auto bytes = control.first->GetRawBytes();
|
const auto bytes = control.first->GetRawBytes();
|
||||||
std::memcpy(out_buffer.data(), bytes.data(), bytes.size());
|
std::memcpy(out_buffer.data(), bytes.data(), bytes.size());
|
||||||
} else {
|
} else {
|
||||||
LOG_WARNING(Service_NS, "missing NACP data for application_id={:016X}, defaulting to zero",
|
LOG_WARNING(Service_NS, "missing NACP data for application_id={:016X}, defaulting to zero", application_id);
|
||||||
application_id);
|
|
||||||
std::memset(out_buffer.data(), 0, sizeof(FileSys::RawNACP));
|
std::memset(out_buffer.data(), 0, sizeof(FileSys::RawNACP));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -205,15 +198,12 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage(
|
||||||
// Convert to application language, get priority list
|
// Convert to application language, get priority list
|
||||||
const auto application_language = ConvertToApplicationLanguage(language_code);
|
const auto application_language = ConvertToApplicationLanguage(language_code);
|
||||||
if (application_language == std::nullopt) {
|
if (application_language == std::nullopt) {
|
||||||
LOG_ERROR(Service_NS, "Could not convert application language! language_code={}",
|
LOG_ERROR(Service_NS, "Could not convert application language! language_code={}", language_code);
|
||||||
language_code);
|
|
||||||
R_THROW(Service::NS::ResultApplicationLanguageNotFound);
|
R_THROW(Service::NS::ResultApplicationLanguageNotFound);
|
||||||
}
|
}
|
||||||
const auto priority_list = GetApplicationLanguagePriorityList(*application_language);
|
const auto priority_list = GetApplicationLanguagePriorityList(*application_language);
|
||||||
if (!priority_list) {
|
if (!priority_list) {
|
||||||
LOG_ERROR(Service_NS,
|
LOG_ERROR(Service_NS, "Could not find application language priorities! application_language={}", *application_language);
|
||||||
"Could not find application language priorities! application_language={}",
|
|
||||||
*application_language);
|
|
||||||
R_THROW(Service::NS::ResultApplicationLanguageNotFound);
|
R_THROW(Service::NS::ResultApplicationLanguageNotFound);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -257,8 +247,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData2(
|
||||||
const auto nacp_size = sizeof(FileSys::RawNACP);
|
const auto nacp_size = sizeof(FileSys::RawNACP);
|
||||||
|
|
||||||
if (size < nacp_size) {
|
if (size < nacp_size) {
|
||||||
LOG_ERROR(Service_NS, "output buffer is too small! (actual={:016X}, expected_min={:08X})",
|
LOG_ERROR(Service_NS, "output buffer is too small! (actual={:016X}, expected_min={:08X})", size, nacp_size);
|
||||||
size, nacp_size);
|
|
||||||
R_THROW(ResultUnknown);
|
R_THROW(ResultUnknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -309,63 +298,83 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData2(
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IReadOnlyApplicationControlDataInterface::ListApplicationIcon(HLERequestContext& ctx) {
|
||||||
void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestContext& ctx) {
|
LOG_WARNING(Service_NS, "(stubbed)");
|
||||||
/*
|
|
||||||
IPC::RequestParser rp{ctx};
|
|
||||||
auto control_source = rp.PopRaw<u8>();
|
|
||||||
rp.Skip(7, false);
|
|
||||||
auto transfer_memory_size = rp.Pop<u64>();
|
|
||||||
*/
|
|
||||||
|
|
||||||
const auto app_ids_buffer = ctx.ReadBuffer();
|
const auto app_ids_buffer = ctx.ReadBuffer();
|
||||||
const size_t app_count = app_ids_buffer.size() / sizeof(u64);
|
const u64 app_count = app_ids_buffer.size() / sizeof(u64);
|
||||||
|
|
||||||
std::vector<u64> application_ids(app_count);
|
|
||||||
if (app_count > 0) {
|
|
||||||
std::memcpy(application_ids.data(), app_ids_buffer.data(), app_count * sizeof(u64));
|
|
||||||
}
|
|
||||||
|
|
||||||
auto t_mem_obj = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(ctx.GetCopyHandle(0));
|
auto t_mem_obj = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(ctx.GetCopyHandle(0));
|
||||||
auto* t_mem = t_mem_obj.GetPointerUnsafe();
|
auto* t_mem = t_mem_obj.GetPointerUnsafe();
|
||||||
|
|
||||||
constexpr size_t title_entry_size = sizeof(FileSys::LanguageEntry);
|
size_t out_length = 0;
|
||||||
const size_t total_data_size = app_count * title_entry_size;
|
|
||||||
|
|
||||||
constexpr s32 data_offset = 0;
|
|
||||||
|
|
||||||
if (t_mem != nullptr && app_count > 0) {
|
if (t_mem != nullptr && app_count > 0) {
|
||||||
auto& memory = system.ApplicationMemory();
|
auto& memory = system.ApplicationMemory();
|
||||||
const auto t_mem_address = t_mem->GetSourceAddress();
|
const auto t_mem_address = t_mem->GetSourceAddress();
|
||||||
|
// u64 - app count
|
||||||
|
memory.WriteBlock(t_mem_address + out_length, &app_count, sizeof(u64));
|
||||||
|
out_length += sizeof(u64);
|
||||||
|
// [list of u64] - size of icons
|
||||||
for (size_t i = 0; i < app_count; ++i) {
|
for (size_t i = 0; i < app_count; ++i) {
|
||||||
const u64 app_id = application_ids[i];
|
const u64 app_id = app_ids_buffer[i];
|
||||||
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(),
|
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()};
|
||||||
system.GetContentProvider()};
|
|
||||||
const auto control = pm.GetControlMetadata();
|
const auto control = pm.GetControlMetadata();
|
||||||
|
u64 full_size = control.second->GetSize();
|
||||||
FileSys::LanguageEntry entry{};
|
memory.WriteBlock(t_mem_address + out_length, &full_size, sizeof(u64));
|
||||||
if (control.first != nullptr) {
|
out_length += sizeof(u64);
|
||||||
entry = control.first->GetLanguageEntry();
|
}
|
||||||
|
// [list of raw icon data]
|
||||||
|
std::vector<u8> full_icon_data;
|
||||||
|
for (size_t i = 0; i < app_count; ++i) {
|
||||||
|
const u64 app_id = app_ids_buffer[i];
|
||||||
|
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()};
|
||||||
|
const auto control = pm.GetControlMetadata();
|
||||||
|
auto const full_size = control.second->GetSize();
|
||||||
|
if (full_size > 0) {
|
||||||
|
full_icon_data.resize(full_size);
|
||||||
|
control.second->Read(full_icon_data.data(), full_size, 0);
|
||||||
|
memory.WriteBlock(t_mem_address + out_length, full_icon_data.data(), full_size);
|
||||||
|
out_length += full_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t offset = i * title_entry_size;
|
|
||||||
memory.WriteBlock(t_mem_address + offset, &entry, title_entry_size);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
auto async_value = std::make_shared<IAsyncValue>(system, 0, s32(out_length));
|
||||||
auto async_value = std::make_shared<IAsyncValueForListApplicationTitle>(
|
|
||||||
system, data_offset, static_cast<s32>(total_data_size));
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1, 1};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
rb.PushCopyObjects(async_value->ReadableEvent());
|
rb.PushCopyObjects(async_value->ReadableEvent());
|
||||||
rb.PushIpcInterface(std::move(async_value));
|
rb.PushIpcInterface(std::move(async_value));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData3(
|
void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestContext& ctx) {
|
||||||
OutBuffer<BufferAttr_HipcMapAlias> out_buffer, Out<u32> out_flags_a, Out<u32> out_flags_b,
|
const auto app_ids_buffer = ctx.ReadBuffer();
|
||||||
Out<u32> out_actual_size, ApplicationControlSource application_control_source, u8 flag1, u8 flag2, u64 application_id) {
|
const size_t app_count = app_ids_buffer.size() / sizeof(u64);
|
||||||
|
auto t_mem_obj = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(ctx.GetCopyHandle(0));
|
||||||
|
auto* t_mem = t_mem_obj.GetPointerUnsafe();
|
||||||
|
constexpr size_t title_entry_size = sizeof(FileSys::LanguageEntry);
|
||||||
|
const size_t total_data_size = app_count * title_entry_size;
|
||||||
|
constexpr s32 data_offset = 0;
|
||||||
|
if (t_mem != nullptr && app_count > 0) {
|
||||||
|
auto& memory = system.ApplicationMemory();
|
||||||
|
const auto t_mem_address = t_mem->GetSourceAddress();
|
||||||
|
for (size_t i = 0; i < app_count; ++i) {
|
||||||
|
const u64 app_id = app_ids_buffer[i];
|
||||||
|
const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()};
|
||||||
|
const auto control = pm.GetControlMetadata();
|
||||||
|
FileSys::LanguageEntry entry{};
|
||||||
|
if (control.first != nullptr) {
|
||||||
|
entry = control.first->GetLanguageEntry();
|
||||||
|
}
|
||||||
|
const size_t offset = i * title_entry_size;
|
||||||
|
memory.WriteBlock(t_mem_address + offset, &entry, title_entry_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
auto async_value = std::make_shared<IAsyncValue>(system, data_offset, s32(total_data_size));
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 1, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushCopyObjects(async_value->ReadableEvent());
|
||||||
|
rb.PushIpcInterface(std::move(async_value));
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData3(OutBuffer<BufferAttr_HipcMapAlias> out_buffer, Out<u32> out_flags_a, Out<u32> out_flags_b, Out<u32> out_actual_size, ApplicationControlSource application_control_source, u8 flag1, u8 flag2, u64 application_id) {
|
||||||
LOG_INFO(Service_NS, "called with control_source={}, flags=({:02X},{:02X}), application_id={:016X}",
|
LOG_INFO(Service_NS, "called with control_source={}, flags=({:02X},{:02X}), application_id={:016X}",
|
||||||
application_control_source, flag1, flag2, application_id);
|
application_control_source, flag1, flag2, application_id);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ public:
|
||||||
u8 flag1,
|
u8 flag1,
|
||||||
u8 flag2,
|
u8 flag2,
|
||||||
u64 application_id);
|
u64 application_id);
|
||||||
|
void ListApplicationIcon(HLERequestContext& ctx);
|
||||||
void ListApplicationTitle(HLERequestContext& ctx);
|
void ListApplicationTitle(HLERequestContext& ctx);
|
||||||
Result GetApplicationControlData3(
|
Result GetApplicationControlData3(
|
||||||
OutBuffer<BufferAttr_HipcMapAlias> out_buffer,
|
OutBuffer<BufferAttr_HipcMapAlias> out_buffer,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
|
@ -16,10 +16,8 @@ IReadOnlyApplicationRecordInterface::IReadOnlyApplicationRecordInterface(Core::S
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"},
|
{0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"},
|
||||||
{1, nullptr, "NotifyApplicationFailure"},
|
{1, nullptr, "NotifyApplicationFailure"},
|
||||||
{2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>,
|
{2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"},
|
||||||
"IsDataCorruptedResult"},
|
{3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"},
|
||||||
{3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>,
|
|
||||||
"ListApplicationRecord"},
|
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue