From 5d6bf75296984eb2d4c7e1486daeb306a5fefa32 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Wed, 10 Apr 2019 14:04:17 -0400 Subject: [PATCH] es: Implement ETicket ListCommonTicket (11) Returns an application specified count of entries of common tickets, starting at offset 0. --- src/core/hle/service/es/es.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp index 9adb39ac35..9a481f41f7 100644 --- a/src/core/hle/service/es/es.cpp +++ b/src/core/hle/service/es/es.cpp @@ -26,7 +26,7 @@ public: {8, &ETicket::GetTitleKey, "GetTitleKey"}, {9, &ETicket::CountCommonTicket, "CountCommonTicket"}, {10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"}, - {11, nullptr, "ListCommonTicket"}, + {11, &ETicket::ListCommonTicket, "ListCommonTicket"}, {12, nullptr, "ListPersonalizedTicket"}, {13, nullptr, "ListMissingPersonalizedTicket"}, {14, nullptr, "GetCommonTicketSize"}, @@ -144,6 +144,29 @@ private: rb.Push(count); } + void ListCommonTicket(Kernel::HLERequestContext& ctx) { + u32 out_entries; + if (keys.GetCommonTickets().empty()) + out_entries = 0; + else + out_entries = ctx.GetWriteBufferSize() / sizeof(u128); + + LOG_DEBUG(Service_ETicket, "called, entries={:016X}", out_entries); + + keys.PopulateTickets(); + const auto tickets = keys.GetCommonTickets(); + std::vector ids; + std::transform(tickets.begin(), tickets.end(), std::back_inserter(ids), + [](const auto& pair) { return pair.first; }); + + out_entries = std::min(ids.size(), out_entries); + ctx.WriteBuffer(ids.data(), out_entries * sizeof(u128)); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(out_entries); + } + }; void InstallInterfaces(SM::ServiceManager& service_manager) {