summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Subv2017-07-21 13:09:45 -0500
committerGravatar Subv2017-07-21 14:59:25 -0500
commita9bc417f5948dc63f182d31e4ba271aa23efe84d (patch)
tree9d72a9ab1381a7a0d1c1b90f47eeb43043e1b2b8 /src
parentServices/APT: Properly clear the apt parameter after a successful ReceivePara... (diff)
downloadyuzu-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.cpp29
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) {
314void CancelParameter(Service::Interface* self) { 314void 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
330void PrepareToStartApplication(Service::Interface* self) { 347void PrepareToStartApplication(Service::Interface* self) {