diff options
| author | 2017-07-21 13:09:45 -0500 | |
|---|---|---|
| committer | 2017-07-21 14:59:25 -0500 | |
| commit | a9bc417f5948dc63f182d31e4ba271aa23efe84d (patch) | |
| tree | 9d72a9ab1381a7a0d1c1b90f47eeb43043e1b2b8 /src | |
| parent | Services/APT: Properly clear the apt parameter after a successful ReceivePara... (diff) | |
| download | yuzu-a9bc417f5948dc63f182d31e4ba271aa23efe84d.tar.gz yuzu-a9bc417f5948dc63f182d31e4ba271aa23efe84d.tar.xz yuzu-a9bc417f5948dc63f182d31e4ba271aa23efe84d.zip | |
Services/APT: Reset the APT parameter inside CancelParameter if the conditions are met.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/apt/apt.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index b6c013d43..9cfb7f71e 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp | |||
| @@ -314,17 +314,34 @@ void GlanceParameter(Service::Interface* self) { | |||
| 314 | void CancelParameter(Service::Interface* self) { | 314 | void CancelParameter(Service::Interface* self) { |
| 315 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0xF, 4, 0); // 0xF0100 | 315 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0xF, 4, 0); // 0xF0100 |
| 316 | 316 | ||
| 317 | u32 check_sender = rp.Pop<u32>(); | 317 | bool check_sender = rp.Pop<bool>(); |
| 318 | u32 sender_appid = rp.Pop<u32>(); | 318 | u32 sender_appid = rp.Pop<u32>(); |
| 319 | u32 check_receiver = rp.Pop<u32>(); | 319 | bool check_receiver = rp.Pop<bool>(); |
| 320 | u32 receiver_appid = rp.Pop<u32>(); | 320 | u32 receiver_appid = rp.Pop<u32>(); |
| 321 | |||
| 322 | bool cancellation_success = true; | ||
| 323 | |||
| 324 | if (!next_parameter) { | ||
| 325 | cancellation_success = false; | ||
| 326 | } else { | ||
| 327 | if (check_sender && next_parameter->sender_id != sender_appid) | ||
| 328 | cancellation_success = false; | ||
| 329 | |||
| 330 | if (check_receiver && next_parameter->destination_id != receiver_appid) | ||
| 331 | cancellation_success = false; | ||
| 332 | } | ||
| 333 | |||
| 334 | if (cancellation_success) | ||
| 335 | next_parameter = boost::none; | ||
| 336 | |||
| 321 | IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | 337 | IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |
| 338 | |||
| 322 | rb.Push(RESULT_SUCCESS); // No error | 339 | rb.Push(RESULT_SUCCESS); // No error |
| 323 | rb.Push(true); // Set to Success | 340 | rb.Push(cancellation_success); |
| 324 | 341 | ||
| 325 | LOG_WARNING(Service_APT, "(STUBBED) called check_sender=0x%08X, sender_appid=0x%08X, " | 342 | LOG_DEBUG(Service_APT, "called check_sender=%u, sender_appid=0x%08X, " |
| 326 | "check_receiver=0x%08X, receiver_appid=0x%08X", | 343 | "check_receiver=%u, receiver_appid=0x%08X", |
| 327 | check_sender, sender_appid, check_receiver, receiver_appid); | 344 | check_sender, sender_appid, check_receiver, receiver_appid); |
| 328 | } | 345 | } |
| 329 | 346 | ||
| 330 | void PrepareToStartApplication(Service::Interface* self) { | 347 | void PrepareToStartApplication(Service::Interface* self) { |