service/aoc: Pop all passed values where applicable
A few of the aoc service stubs/implementations weren't fully popping all of the parameters passed to them. This ensures that all parameters are popped and, at minimum, logged out.
This commit is contained in:
parent
195b54602f
commit
819d229e76
1 changed files with 47 additions and 14 deletions
|
@ -75,7 +75,15 @@ AOC_U::AOC_U() : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs
|
||||||
AOC_U::~AOC_U() = default;
|
AOC_U::~AOC_U() = default;
|
||||||
|
|
||||||
void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) {
|
void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_AOC, "called");
|
struct Parameters {
|
||||||
|
u64 process_id;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Parameters) == 8);
|
||||||
|
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
const auto params = rp.PopRaw<Parameters>();
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_AOC, "called. process_id={}", params.process_id);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
@ -94,23 +102,32 @@ void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) {
|
void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
struct Parameters {
|
||||||
|
u32 offset;
|
||||||
|
u32 count;
|
||||||
|
u64 process_id;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Parameters) == 16);
|
||||||
|
|
||||||
const auto offset = rp.PopRaw<u32>();
|
IPC::RequestParser rp{ctx};
|
||||||
auto count = rp.PopRaw<u32>();
|
const auto [offset, count, process_id] = rp.PopRaw<Parameters>();
|
||||||
LOG_DEBUG(Service_AOC, "called with offset={}, count={}", offset, count);
|
|
||||||
|
LOG_DEBUG(Service_AOC, "called with offset={}, count={}, process_id={}", offset, count,
|
||||||
|
process_id);
|
||||||
|
|
||||||
const auto current = Core::System::GetInstance().CurrentProcess()->GetTitleID();
|
const auto current = Core::System::GetInstance().CurrentProcess()->GetTitleID();
|
||||||
|
|
||||||
std::vector<u32> out;
|
std::vector<u32> out;
|
||||||
for (size_t i = 0; i < add_on_content.size(); ++i) {
|
for (size_t i = 0; i < add_on_content.size(); ++i) {
|
||||||
if ((add_on_content[i] & DLC_BASE_TITLE_ID_MASK) == current)
|
if ((add_on_content[i] & DLC_BASE_TITLE_ID_MASK) == current) {
|
||||||
out.push_back(static_cast<u32>(add_on_content[i] & 0x7FF));
|
out.push_back(static_cast<u32>(add_on_content[i] & 0x7FF));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const auto& disabled = Settings::values.disabled_addons[current];
|
const auto& disabled = Settings::values.disabled_addons[current];
|
||||||
if (std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end())
|
if (std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end()) {
|
||||||
out = {};
|
out = {};
|
||||||
|
}
|
||||||
|
|
||||||
if (out.size() < offset) {
|
if (out.size() < offset) {
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
@ -119,22 +136,31 @@ void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
count = static_cast<u32>(std::min<size_t>(out.size() - offset, count));
|
const auto out_count = static_cast<u32>(std::min<size_t>(out.size() - offset, count));
|
||||||
std::rotate(out.begin(), out.begin() + offset, out.end());
|
std::rotate(out.begin(), out.begin() + offset, out.end());
|
||||||
out.resize(count);
|
out.resize(out_count);
|
||||||
|
|
||||||
ctx.WriteBuffer(out);
|
ctx.WriteBuffer(out);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.Push(count);
|
rb.Push(out_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AOC_U::GetAddOnContentBaseId(Kernel::HLERequestContext& ctx) {
|
void AOC_U::GetAddOnContentBaseId(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_AOC, "called");
|
struct Parameters {
|
||||||
|
u64 process_id;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Parameters) == 8);
|
||||||
|
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
const auto params = rp.PopRaw<Parameters>();
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_AOC, "called. process_id={}", params.process_id);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 4};
|
IPC::ResponseBuilder rb{ctx, 4};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
|
||||||
const auto title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID();
|
const auto title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID();
|
||||||
FileSys::PatchManager pm{title_id};
|
FileSys::PatchManager pm{title_id};
|
||||||
|
|
||||||
|
@ -148,10 +174,17 @@ void AOC_U::GetAddOnContentBaseId(Kernel::HLERequestContext& ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AOC_U::PrepareAddOnContent(Kernel::HLERequestContext& ctx) {
|
void AOC_U::PrepareAddOnContent(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
struct Parameters {
|
||||||
|
s32 addon_index;
|
||||||
|
u64 process_id;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(Parameters) == 16);
|
||||||
|
|
||||||
const auto aoc_id = rp.PopRaw<u32>();
|
IPC::RequestParser rp{ctx};
|
||||||
LOG_WARNING(Service_AOC, "(STUBBED) called with aoc_id={:08X}", aoc_id);
|
const auto [addon_index, process_id] = rp.PopRaw<Parameters>();
|
||||||
|
|
||||||
|
LOG_WARNING(Service_AOC, "(STUBBED) called with addon_index={}, process_id={}", addon_index,
|
||||||
|
process_id);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
|
Loading…
Reference in a new issue