From dc0793b731f87569b730a037524beb6ad4309698 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sun, 7 Nov 2021 17:26:30 +0100 Subject: [PATCH] NP: Implement sceNpMatching2DeleteServerContext --- rpcs3/Emu/Cell/Modules/sceNp.cpp | 2 +- rpcs3/Emu/Cell/Modules/sceNp2.cpp | 9 ++++++++- rpcs3/Emu/NP/np_handler.h | 1 + rpcs3/Emu/NP/np_requests.cpp | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index cc314b9bf4..ae26d7d47e 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -710,7 +710,7 @@ error_code sceNpBasicRegisterContextSensitiveHandler(vm::cptrget>(); diff --git a/rpcs3/Emu/Cell/Modules/sceNp2.cpp b/rpcs3/Emu/Cell/Modules/sceNp2.cpp index 2d393c7bb5..c1ce125c56 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp2.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp2.cpp @@ -1299,7 +1299,7 @@ error_code sceNpMatching2SignalingSetCtxOpt(SceNpMatching2ContextId ctxId, s32 o error_code sceNpMatching2DeleteServerContext( SceNpMatching2ContextId ctxId, vm::cptr reqParam, vm::cptr optParam, vm::ptr assignedReqId) { - sceNp2.todo("sceNpMatching2DeleteServerContext(ctxId=%d, reqParam=*0x%x, optParam=*0x%x, assignedReqId=*0x%x)", ctxId, reqParam, optParam, assignedReqId); + sceNp2.warning("sceNpMatching2DeleteServerContext(ctxId=%d, reqParam=*0x%x, optParam=*0x%x, assignedReqId=*0x%x)", ctxId, reqParam, optParam, assignedReqId); auto& nph = g_fxo->get>(); if (auto res = generic_match2_error_check(nph, ctxId, reqParam, assignedReqId); res != CELL_OK) @@ -1307,6 +1307,13 @@ error_code sceNpMatching2DeleteServerContext( return res; } + if (reqParam->serverId == 0) + { + return SCE_NP_MATCHING2_ERROR_INVALID_SERVER_ID; + } + + *assignedReqId = nph.delete_server_context(ctxId, optParam, reqParam->serverId); + return CELL_OK; } diff --git a/rpcs3/Emu/NP/np_handler.h b/rpcs3/Emu/NP/np_handler.h index e73c600feb..c8af8f3ba4 100644 --- a/rpcs3/Emu/NP/np_handler.h +++ b/rpcs3/Emu/NP/np_handler.h @@ -92,6 +92,7 @@ namespace np // Asynchronous requests u32 get_server_status(SceNpMatching2ContextId ctx_id, vm::cptr optParam, u16 server_id); u32 create_server_context(SceNpMatching2ContextId ctx_id, vm::cptr optParam, u16 server_id); + u32 delete_server_context(SceNpMatching2ContextId ctx_id, vm::cptr optParam, u16 server_id); u32 get_world_list(SceNpMatching2ContextId ctx_id, vm::cptr optParam, u16 server_id); u32 create_join_room(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2CreateJoinRoomRequest* req); u32 join_room(SceNpMatching2ContextId ctx_id, vm::cptr optParam, const SceNpMatching2JoinRoomRequest* req); diff --git a/rpcs3/Emu/NP/np_requests.cpp b/rpcs3/Emu/NP/np_requests.cpp index ef8e22b374..7c1cdeae7e 100644 --- a/rpcs3/Emu/NP/np_requests.cpp +++ b/rpcs3/Emu/NP/np_requests.cpp @@ -69,6 +69,22 @@ namespace np return req_id; } + u32 np_handler::delete_server_context(SceNpMatching2ContextId ctx_id, vm::cptr optParam, u16 /*server_id*/) + { + u32 req_id = generate_callback_info(ctx_id, optParam); + u32 event_key = get_event_key(); + + const auto cb_info = take_pending_request(req_id); + + sysutil_register_cb([=](ppu_thread& cb_ppu) -> s32 + { + cb_info.cb(cb_ppu, cb_info.ctx_id, req_id, SCE_NP_MATCHING2_REQUEST_EVENT_DeleteServerContext, event_key, 0, 0, cb_info.cb_arg); + return 0; + }); + + return req_id; + } + u32 np_handler::get_world_list(SceNpMatching2ContextId ctx_id, vm::cptr optParam, u16 server_id) { u32 req_id = generate_callback_info(ctx_id, optParam);