diff options
| author | 2019-04-10 14:05:12 -0400 | |
|---|---|---|
| committer | 2019-07-07 21:38:33 -0400 | |
| commit | 669a21babb89c670746ed0a3ba89543a70f8e05e (patch) | |
| tree | e5756017612c3ea21a62079b0a6d62799641dff0 /src | |
| parent | es: Implement ETicket ListCommonTicket (11) (diff) | |
| download | yuzu-669a21babb89c670746ed0a3ba89543a70f8e05e.tar.gz yuzu-669a21babb89c670746ed0a3ba89543a70f8e05e.tar.xz yuzu-669a21babb89c670746ed0a3ba89543a70f8e05e.zip | |
es: Implement ETicket ListPersonalizedTicket (12)
Returns an application-specific number of entries of personal tickets, starting at offset 0.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/es/es.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp index 9a481f41f..d136566fc 100644 --- a/src/core/hle/service/es/es.cpp +++ b/src/core/hle/service/es/es.cpp | |||
| @@ -27,7 +27,7 @@ public: | |||
| 27 | {9, &ETicket::CountCommonTicket, "CountCommonTicket"}, | 27 | {9, &ETicket::CountCommonTicket, "CountCommonTicket"}, |
| 28 | {10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"}, | 28 | {10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"}, |
| 29 | {11, &ETicket::ListCommonTicket, "ListCommonTicket"}, | 29 | {11, &ETicket::ListCommonTicket, "ListCommonTicket"}, |
| 30 | {12, nullptr, "ListPersonalizedTicket"}, | 30 | {12, &ETicket::ListPersonalizedTicket, "ListPersonalizedTicket"}, |
| 31 | {13, nullptr, "ListMissingPersonalizedTicket"}, | 31 | {13, nullptr, "ListMissingPersonalizedTicket"}, |
| 32 | {14, nullptr, "GetCommonTicketSize"}, | 32 | {14, nullptr, "GetCommonTicketSize"}, |
| 33 | {15, nullptr, "GetPersonalizedTicketSize"}, | 33 | {15, nullptr, "GetPersonalizedTicketSize"}, |
| @@ -167,6 +167,29 @@ private: | |||
| 167 | rb.Push<u32>(out_entries); | 167 | rb.Push<u32>(out_entries); |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | void ListPersonalizedTicket(Kernel::HLERequestContext& ctx) { | ||
| 171 | u32 out_entries; | ||
| 172 | if (keys.GetPersonalizedTickets().empty()) | ||
| 173 | out_entries = 0; | ||
| 174 | else | ||
| 175 | out_entries = ctx.GetWriteBufferSize() / sizeof(u128); | ||
| 176 | |||
| 177 | LOG_DEBUG(Service_ETicket, "called, entries={:016X}", out_entries); | ||
| 178 | |||
| 179 | keys.PopulateTickets(); | ||
| 180 | const auto tickets = keys.GetPersonalizedTickets(); | ||
| 181 | std::vector<u128> ids; | ||
| 182 | std::transform(tickets.begin(), tickets.end(), std::back_inserter(ids), | ||
| 183 | [](const auto& pair) { return pair.first; }); | ||
| 184 | |||
| 185 | out_entries = std::min<u32>(ids.size(), out_entries); | ||
| 186 | ctx.WriteBuffer(ids.data(), out_entries * sizeof(u128)); | ||
| 187 | |||
| 188 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 189 | rb.Push(RESULT_SUCCESS); | ||
| 190 | rb.Push<u32>(out_entries); | ||
| 191 | } | ||
| 192 | |||
| 170 | }; | 193 | }; |
| 171 | 194 | ||
| 172 | void InstallInterfaces(SM::ServiceManager& service_manager) { | 195 | void InstallInterfaces(SM::ServiceManager& service_manager) { |