Skip to content

Commit

Permalink
RPCN v0.6
Browse files Browse the repository at this point in the history
  • Loading branch information
RipleyTom committed Jun 10, 2022
1 parent 8d46840 commit 594c350
Show file tree
Hide file tree
Showing 23 changed files with 726 additions and 129 deletions.
210 changes: 196 additions & 14 deletions rpcs3/Emu/Cell/Modules/sceNp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3091,7 +3091,7 @@ error_code sceNpManagerGetOnlineId(vm::ptr<SceNpOnlineId> onlineId)

error_code sceNpManagerGetNpId(ppu_thread&, vm::ptr<SceNpId> npId)
{
sceNp.warning("sceNpManagerGetNpId(npId=*0x%x)", npId);
sceNp.trace("sceNpManagerGetNpId(npId=*0x%x)", npId);

auto& nph = g_fxo->get<named_thread<np::np_handler>>();

Expand Down Expand Up @@ -3821,7 +3821,14 @@ error_code sceNpScoreCreateTitleCtx(vm::cptr<SceNpCommunicationId> communication
return SCE_NP_COMMUNITY_ERROR_INSUFFICIENT_ARGUMENT;
}

return not_an_error(create_score_context(communicationId, passphrase));
s32 id = create_score_context(communicationId, passphrase);

if (id > 0)
{
return not_an_error(id);
}

return id;
}

error_code sceNpScoreDestroyTitleCtx(s32 titleCtxId)
Expand Down Expand Up @@ -3857,7 +3864,21 @@ error_code sceNpScoreCreateTransactionCtx(s32 titleCtxId)
return SCE_NP_COMMUNITY_ERROR_INVALID_ONLINE_ID;
}

return not_an_error(create_score_transaction_context(titleCtxId));
auto score = idm::get<score_ctx>(titleCtxId);

if (!score)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}

s32 id = create_score_transaction_context(score);

if (id > 0)
{
return not_an_error(id);
}

return id;
}

error_code sceNpScoreDestroyTransactionCtx(s32 transId)
Expand Down Expand Up @@ -3885,11 +3906,30 @@ error_code sceNpScoreSetTimeout(s32 ctxId, usecond_t timeout)
return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED;
}

if (timeout > 10000000) // 10 seconds
if (timeout < 10'000'000) // 10 seconds
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ARGUMENT;
}

if (static_cast<u32>(ctxId) >= score_transaction_ctx::id_base)
{
auto trans = idm::get<score_transaction_ctx>(ctxId);
if (!trans)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}
trans->timeout = timeout;
}
else
{
auto score = idm::get<score_ctx>(ctxId);
if (!ctxId)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}
score->timeout = timeout;
}

return CELL_OK;
}

Expand All @@ -3909,6 +3949,25 @@ error_code sceNpScoreSetPlayerCharacterId(s32 ctxId, SceNpScorePcId pcId)
return SCE_NP_COMMUNITY_ERROR_INVALID_ARGUMENT;
}

if (static_cast<u32>(ctxId) >= score_transaction_ctx::id_base)
{
auto trans = idm::get<score_transaction_ctx>(ctxId);
if (!trans)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}
trans->pcId = pcId;
}
else
{
auto score = idm::get<score_ctx>(ctxId);
if (!ctxId)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}
score->pcId = pcId;
}

return CELL_OK;
}

Expand All @@ -3923,11 +3982,14 @@ error_code sceNpScoreWaitAsync(s32 transId, vm::ptr<s32> result)
return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED;
}

if (transId <= 0)
auto trans = idm::get<score_transaction_ctx>(transId);
if (!trans)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}

trans->wait_for_completion();

return CELL_OK;
}

Expand All @@ -3942,17 +4004,26 @@ error_code sceNpScorePollAsync(s32 transId, vm::ptr<s32> result)
return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED;
}

if (transId <= 0)
auto trans = idm::get<score_transaction_ctx>(transId);
if (!trans)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}

auto res = trans->get_score_transaction_status();

if (!res)
{
return not_an_error(1);
}

*result = *res;
return CELL_OK;
}

error_code sceNpScoreGetBoardInfo(s32 transId, SceNpScoreBoardId boardId, vm::ptr<SceNpScoreBoardInfo> boardInfo, vm::ptr<void> option)
{
sceNp.todo("sceNpScoreGetBoardInfo(transId=%d, boardId=%d, boardInfo=*0x%x, option=*0x%x)", transId, boardId, boardInfo, option);
sceNp.warning("sceNpScoreGetBoardInfo(transId=%d, boardId=%d, boardInfo=*0x%x, option=*0x%x)", transId, boardId, boardInfo, option);

auto& nph = g_fxo->get<named_thread<np::np_handler>>();

Expand All @@ -3976,7 +4047,21 @@ error_code sceNpScoreGetBoardInfo(s32 transId, SceNpScoreBoardId boardId, vm::pt
return SCE_NP_COMMUNITY_ERROR_INVALID_ONLINE_ID;
}

return CELL_OK;
auto trans_ctx = idm::get<score_transaction_ctx>(transId);

if (!trans_ctx)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}

nph.get_board_infos(trans_ctx, boardId, boardInfo, false);

if (!(*trans_ctx->result))
{
return CELL_OK;
}

return *trans_ctx->result;
}

error_code sceNpScoreGetBoardInfoAsync(s32 transId, SceNpScoreBoardId boardId, vm::ptr<SceNpScoreBoardInfo> boardInfo, s32 prio, vm::ptr<void> option)
Expand All @@ -3995,6 +4080,20 @@ error_code sceNpScoreGetBoardInfoAsync(s32 transId, SceNpScoreBoardId boardId, v
return SCE_NP_COMMUNITY_ERROR_INVALID_ARGUMENT;
}

if (nph.get_psn_status() != SCE_NP_MANAGER_STATUS_ONLINE)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ONLINE_ID;
}

auto trans_ctx = idm::get<score_transaction_ctx>(transId);

if (!trans_ctx)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}

nph.get_board_infos(trans_ctx, boardId, boardInfo, true);

return CELL_OK;
}

Expand Down Expand Up @@ -4521,6 +4620,14 @@ error_code sceNpScoreAbortTransaction(s32 transId)
return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED;
}

auto trans = idm::get<score_transaction_ctx>(transId);
if (!trans)
{
return SCE_NP_COMMUNITY_ERROR_INVALID_ID;
}

trans->abort_score_transaction();

return CELL_OK;
}

Expand Down Expand Up @@ -5092,7 +5199,15 @@ error_code sceNpSignalingGetConnectionStatus(u32 ctx_id, u32 conn_id, vm::ptr<s3

const auto si = sigh.get_sig_infos(conn_id);

*conn_status = si.connStatus;
if (si.connStatus == SCE_NP_SIGNALING_CONN_STATUS_ACTIVE && si.ext_status == ext_sign_peer)
{
*conn_status = SCE_NP_SIGNALING_CONN_STATUS_INACTIVE;
}
else
{
*conn_status = si.connStatus;
}

if (peer_addr)
(*peer_addr).np_s_addr = si.addr; // infos.addr is already BE
if (peer_port)
Expand All @@ -5103,7 +5218,7 @@ error_code sceNpSignalingGetConnectionStatus(u32 ctx_id, u32 conn_id, vm::ptr<s3

error_code sceNpSignalingGetConnectionInfo(u32 ctx_id, u32 conn_id, s32 code, vm::ptr<SceNpSignalingConnectionInfo> info)
{
sceNp.todo("sceNpSignalingGetConnectionInfo(ctx_id=%d, conn_id=%d, code=%d, info=*0x%x)", ctx_id, conn_id, code, info);
sceNp.warning("sceNpSignalingGetConnectionInfo(ctx_id=%d, conn_id=%d, code=%d, info=*0x%x)", ctx_id, conn_id, code, info);

auto& nph = g_fxo->get<named_thread<np::np_handler>>();

Expand All @@ -5112,17 +5227,64 @@ error_code sceNpSignalingGetConnectionInfo(u32 ctx_id, u32 conn_id, s32 code, vm
return SCE_NP_SIGNALING_ERROR_NOT_INITIALIZED;
}

if (!info)
if (!info || code < 1 || code > 6)
{
return SCE_NP_SIGNALING_ERROR_INVALID_ARGUMENT;
}

switch (code)
{
case SCE_NP_SIGNALING_CONN_INFO_RTT:
{
info->rtt = 20000; // HACK
break;
}
case SCE_NP_SIGNALING_CONN_INFO_BANDWIDTH:
{
info->bandwidth = 10'000'000; // 10 MBPS HACK
break;
}
case SCE_NP_SIGNALING_CONN_INFO_PEER_NPID:
{
auto& sigh = g_fxo->get<named_thread<signaling_handler>>();
const auto si = sigh.get_sig_infos(conn_id);
info->npId = si.npid;
break;
}
case SCE_NP_SIGNALING_CONN_INFO_PEER_ADDRESS:
{
auto& sigh = g_fxo->get<named_thread<signaling_handler>>();
const auto si = sigh.get_sig_infos(conn_id);
info->address.port = std::bit_cast<u16, be_t<u16>>(si.port);
info->address.addr.np_s_addr = si.addr;
break;
}
case SCE_NP_SIGNALING_CONN_INFO_MAPPED_ADDRESS:
{
auto& sigh = g_fxo->get<named_thread<signaling_handler>>();
const auto si = sigh.get_sig_infos(conn_id);
info->address.port = std::bit_cast<u16, be_t<u16>>(si.mapped_port);
info->address.addr.np_s_addr = si.mapped_addr;
break;
}
case SCE_NP_SIGNALING_CONN_INFO_PACKET_LOSS:
{
info->packet_loss = 1; // HACK
break;
}
default:
{
sceNp.fatal("sceNpSignalingGetConnectionInfo Unimplemented code: %d", code);
return CELL_OK;
}
}

return CELL_OK;
}

error_code sceNpSignalingGetConnectionFromNpId(u32 ctx_id, vm::ptr<SceNpId> npId, vm::ptr<u32> conn_id)
{
sceNp.todo("sceNpSignalingGetConnectionFromNpId(ctx_id=%d, npId=*0x%x, conn_id=*0x%x)", ctx_id, npId, conn_id);
sceNp.notice("sceNpSignalingGetConnectionFromNpId(ctx_id=%d, npId=*0x%x, conn_id=*0x%x)", ctx_id, npId, conn_id);

auto& nph = g_fxo->get<named_thread<np::np_handler>>();

Expand All @@ -5136,12 +5298,22 @@ error_code sceNpSignalingGetConnectionFromNpId(u32 ctx_id, vm::ptr<SceNpId> npId
return SCE_NP_SIGNALING_ERROR_INVALID_ARGUMENT;
}

auto& sigh = g_fxo->get<named_thread<signaling_handler>>();
const auto found_conn_id = sigh.get_conn_id_from_npid(npId.get_ptr());

if (!found_conn_id)
{
return SCE_NP_SIGNALING_ERROR_CONN_NOT_FOUND;
}

*conn_id = *found_conn_id;

return CELL_OK;
}

error_code sceNpSignalingGetConnectionFromPeerAddress(u32 ctx_id, vm::ptr<np_in_addr> peer_addr, np_in_port_t peer_port, vm::ptr<u32> conn_id)
error_code sceNpSignalingGetConnectionFromPeerAddress(u32 ctx_id, np_in_addr_t peer_addr, np_in_port_t peer_port, vm::ptr<u32> conn_id)
{
sceNp.todo("sceNpSignalingGetConnectionFromPeerAddress(ctx_id=%d, peer_addr=*0x%x, peer_port=%d, conn_id=*0x%x)", ctx_id, peer_addr, peer_port, conn_id);
sceNp.warning("sceNpSignalingGetConnectionFromPeerAddress(ctx_id=%d, peer_addr=0x%x, peer_port=%d, conn_id=*0x%x)", ctx_id, peer_addr, peer_port, conn_id);

auto& nph = g_fxo->get<named_thread<np::np_handler>>();

Expand All @@ -5155,6 +5327,16 @@ error_code sceNpSignalingGetConnectionFromPeerAddress(u32 ctx_id, vm::ptr<np_in_
return SCE_NP_SIGNALING_ERROR_INVALID_ARGUMENT;
}

auto& sigh = g_fxo->get<named_thread<signaling_handler>>();
const auto found_conn_id = sigh.get_conn_id_from_addr(peer_addr, peer_port);

if (!found_conn_id)
{
return SCE_NP_SIGNALING_ERROR_CONN_NOT_FOUND;
}

*conn_id = *found_conn_id;

return CELL_OK;
}

Expand Down
10 changes: 8 additions & 2 deletions rpcs3/Emu/Cell/Modules/sceNp2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -611,6 +611,11 @@ error_code sceNpMatching2SignalingGetConnectionInfo(
return SCE_NP_MATCHING2_ERROR_NOT_INITIALIZED;
}

if (!connInfo || code < 1 || code > 6)
{
return SCE_NP_MATCHING2_ERROR_INVALID_ARGUMENT;
}

switch (code)
{
case SCE_NP_SIGNALING_CONN_INFO_RTT:
Expand All @@ -625,8 +630,9 @@ error_code sceNpMatching2SignalingGetConnectionInfo(
}
case SCE_NP_SIGNALING_CONN_INFO_PEER_NPID:
{
// TODO: need an update to whole signaling as matching2 signaling ignores npids atm
sceNp2.fatal("sceNpMatching2SignalingGetConnectionInfo Unimplemented SCE_NP_SIGNALING_CONN_INFO_PEER_NPID");
auto& sigh = g_fxo->get<named_thread<signaling_handler>>();
const auto si = sigh.get_sig2_infos(roomId, memberId);
connInfo->npId = si.npid;
break;
}
case SCE_NP_SIGNALING_CONN_INFO_PEER_ADDRESS:
Expand Down

0 comments on commit 594c350

Please sign in to comment.