Clans: implemented IDM & ctx for requests

Signed-off-by: zeph <zephyrzefa15@gmail.com>
This commit is contained in:
zeph 2025-12-08 13:57:07 +01:00
parent 7378657c4b
commit fed72dcf90
No known key found for this signature in database
3 changed files with 233 additions and 142 deletions

View File

@ -138,16 +138,15 @@ error_code sceNpClansCreateRequest(vm::ptr<SceNpClansRequestHandle> handle, u64
} }
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpClansError res = clans_manager.client->createRequest();
s32 reqId = 0;
SceNpClansError res = clans_manager.client->createRequest(&reqId);
if (res != SCE_NP_CLANS_SUCCESS) if (res != SCE_NP_CLANS_SUCCESS)
{ {
return res; return res;
} }
// TODO: replace this mock request with an actual vm::write32(handle.addr(), static_cast<u32>(reqId));
// generator that yields an actual request.
vm::var<struct SceNpClansRequest> req;
vm::write32(handle.addr(), req.addr());
return CELL_OK; return CELL_OK;
} }
@ -160,7 +159,10 @@ error_code sceNpClansDestroyRequest(vm::ptr<SceNpClansRequestHandle> handle)
} }
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpClansError res = clans_manager.client->destroyRequest();
s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError res = clans_manager.client->destroyRequest(reqId);
if (res != SCE_NP_CLANS_SUCCESS) if (res != SCE_NP_CLANS_SUCCESS)
{ {
return res; return res;
@ -177,7 +179,10 @@ error_code sceNpClansAbortRequest(vm::ptr<SceNpClansRequestHandle> handle)
} }
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
clans_manager.client->destroyRequest();
s32 reqId = static_cast<s32>(handle.addr());
clans_manager.client->destroyRequest(reqId);
return CELL_OK; return CELL_OK;
} }
@ -259,7 +264,9 @@ error_code sceNpClansGetClanList(vm::ptr<SceNpClansRequestHandle> handle, vm::cp
SceNpClansEntry host_clanList[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; SceNpClansEntry host_clanList[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {};
SceNpClansPagingResult host_pageResult = {}; SceNpClansPagingResult host_pageResult = {};
SceNpClansError ret = clans_manager.client->getClanList(nph, &host_paging, host_clanList, &host_pageResult); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->getClanList(nph, reqId, &host_paging, host_clanList, &host_pageResult);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -365,7 +372,9 @@ error_code sceNpClansSearchByName(vm::ptr<SceNpClansRequestHandle> handle, vm::c
SceNpClansClanBasicInfo host_results[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; SceNpClansClanBasicInfo host_results[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {};
SceNpClansPagingResult host_pageResult = {}; SceNpClansPagingResult host_pageResult = {};
SceNpClansError ret = clans_manager.client->clanSearch(&host_paging, &host_search, host_results, &host_pageResult); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->clanSearch(reqId, &host_paging, &host_search, host_results, &host_pageResult);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -397,7 +406,9 @@ error_code sceNpClansGetClanInfo(vm::ptr<SceNpClansRequestHandle> handle, SceNpC
SceNpClansClanInfo host_info = {}; SceNpClansClanInfo host_info = {};
SceNpClansError ret = clans_manager.client->getClanInfo(clanId, &host_info); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->getClanInfo(reqId, clanId, &host_info);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -427,7 +438,9 @@ error_code sceNpClansUpdateClanInfo(vm::ptr<SceNpClansRequestHandle> handle, Sce
SceNpClansUpdatableClanInfo host_info = {}; SceNpClansUpdatableClanInfo host_info = {};
std::memcpy(&host_info, info.get_ptr(), sizeof(SceNpClansUpdatableClanInfo)); std::memcpy(&host_info, info.get_ptr(), sizeof(SceNpClansUpdatableClanInfo));
SceNpClansError ret = clans_manager.client->updateClanInfo(nph, clanId, &host_info); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->updateClanInfo(nph, reqId, clanId, &host_info);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -473,7 +486,9 @@ error_code sceNpClansGetMemberList(vm::ptr<SceNpClansRequestHandle> handle, SceN
SceNpClansMemberEntry* host_memList_addr = new SceNpClansMemberEntry[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX]; SceNpClansMemberEntry* host_memList_addr = new SceNpClansMemberEntry[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX];
SceNpClansPagingResult host_pageResult = {}; SceNpClansPagingResult host_pageResult = {};
SceNpClansError ret = clans_manager.client->getMemberList(nph, clanId, &host_paging, status, host_memList_addr, &host_pageResult); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->getMemberList(nph, reqId, clanId, &host_paging, status, host_memList_addr, &host_pageResult);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
delete[] host_memList_addr; delete[] host_memList_addr;
@ -510,7 +525,9 @@ error_code sceNpClansGetMemberInfo(vm::ptr<SceNpClansRequestHandle> handle, SceN
SceNpClansMemberEntry host_memInfo = {}; SceNpClansMemberEntry host_memInfo = {};
SceNpClansError ret = clans_manager.client->getMemberInfo(nph, clanId, host_npid, &host_memInfo); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->getMemberInfo(nph, reqId, clanId, host_npid, &host_memInfo);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -539,7 +556,9 @@ error_code sceNpClansUpdateMemberInfo(vm::ptr<SceNpClansRequestHandle> handle, S
SceNpClansUpdatableMemberInfo host_info = {}; SceNpClansUpdatableMemberInfo host_info = {};
std::memcpy(&host_info, info.get_ptr(), sizeof(SceNpClansUpdatableMemberInfo)); std::memcpy(&host_info, info.get_ptr(), sizeof(SceNpClansUpdatableMemberInfo));
SceNpClansError ret = clans_manager.client->updateMemberInfo(nph, clanId, &host_info); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->updateMemberInfo(nph, reqId, clanId, &host_info);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -566,7 +585,9 @@ error_code sceNpClansChangeMemberRole(vm::ptr<SceNpClansRequestHandle> handle, S
SceNpId host_npid = {}; SceNpId host_npid = {};
std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId));
SceNpClansError ret = clans_manager.client->changeMemberRole(nph, clanId, host_npid, role); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->changeMemberRole(nph, reqId, clanId, host_npid, static_cast<SceNpClansMemberRole>(role));
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -616,7 +637,9 @@ error_code sceNpClansJoinClan(vm::ptr<SceNpClansRequestHandle> handle, SceNpClan
auto& nph = g_fxo->get<named_thread<np::np_handler>>(); auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpClansError ret = clans_manager.client->joinClan(nph, clanId); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->joinClan(nph, reqId, clanId);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -635,7 +658,9 @@ error_code sceNpClansLeaveClan(vm::ptr<SceNpClansRequestHandle> handle, SceNpCla
auto& nph = g_fxo->get<named_thread<np::np_handler>>(); auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpClansError ret = clans_manager.client->leaveClan(nph, clanId); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->leaveClan(nph, reqId, clanId);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -676,7 +701,9 @@ error_code sceNpClansKickMember(vm::ptr<SceNpClansRequestHandle> handle, SceNpCl
std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage));
} }
SceNpClansError ret = clans_manager.client->kickMember(nph, clanId, host_npid, &host_message); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->kickMember(nph, reqId, clanId, host_npid, &host_message);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -717,7 +744,9 @@ error_code sceNpClansSendInvitation(vm::ptr<SceNpClansRequestHandle> handle, Sce
std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage));
} }
SceNpClansError ret = clans_manager.client->sendInvitation(nph, clanId, host_npid, &host_message); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->sendInvitation(nph, reqId, clanId, host_npid, &host_message);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -744,7 +773,9 @@ error_code sceNpClansCancelInvitation(vm::ptr<SceNpClansRequestHandle> handle, S
SceNpId host_npid = {}; SceNpId host_npid = {};
std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId));
SceNpClansError ret = clans_manager.client->cancelInvitation(nph, clanId, host_npid); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->cancelInvitation(nph, reqId, clanId, host_npid);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -777,7 +808,14 @@ error_code sceNpClansSendInvitationResponse(vm::ptr<SceNpClansRequestHandle> han
std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage));
} }
SceNpClansError ret = clans_manager.client->sendInvitationResponse(nph, clanId, &host_message, accept); if (message)
{
std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage));
}
s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->sendInvitationResponse(nph, reqId, clanId, &host_message, accept);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -810,7 +848,9 @@ error_code sceNpClansSendMembershipRequest(vm::ptr<SceNpClansRequestHandle> hand
std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage));
} }
SceNpClansError ret = clans_manager.client->requestMembership(nph, clanId, &host_message); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->requestMembership(nph, reqId, clanId, &host_message);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -829,7 +869,9 @@ error_code sceNpClansCancelMembershipRequest(vm::ptr<SceNpClansRequestHandle> ha
auto& nph = g_fxo->get<named_thread<np::np_handler>>(); auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpClansError ret = clans_manager.client->cancelRequestMembership(nph, clanId); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->cancelRequestMembership(nph, reqId, clanId);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
@ -871,7 +913,9 @@ error_code sceNpClansSendMembershipResponse(vm::ptr<SceNpClansRequestHandle> han
std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage));
} }
SceNpClansError ret = clans_manager.client->sendMembershipResponse(nph, clanId, host_npid, &host_message, allow); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->sendMembershipResponse(nph, reqId, clanId, host_npid, &host_message, allow);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -914,10 +958,12 @@ error_code sceNpClansGetBlacklist(vm::ptr<SceNpClansRequestHandle> handle, SceNp
host_paging.max = 0; host_paging.max = 0;
} }
SceNpClansBlacklistEntry host_bl[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; SceNpClansBlacklistEntry host_blacklist[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {};
SceNpClansPagingResult host_pageResult = {}; SceNpClansPagingResult host_pageResult = {};
SceNpClansError ret = clans_manager.client->getBlacklist(nph, clanId, &host_paging, host_bl, &host_pageResult); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->getBlacklist(nph, reqId, clanId, &host_paging, host_blacklist, &host_pageResult);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -925,21 +971,21 @@ error_code sceNpClansGetBlacklist(vm::ptr<SceNpClansRequestHandle> handle, SceNp
if (bl && host_pageResult.count > 0) if (bl && host_pageResult.count > 0)
{ {
std::memcpy(bl.get_ptr(), host_bl, sizeof(SceNpClansBlacklistEntry) * host_pageResult.count); std::memcpy(bl.get_ptr(), host_blacklist, sizeof(SceNpClansBlacklistEntry) * host_pageResult.count);
} }
std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult));
return CELL_OK; return CELL_OK;
} }
error_code sceNpClansAddBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handle, SceNpClanId clanId, vm::cptr<SceNpId> npid) error_code sceNpClansAddBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handle, SceNpClanId clanId, vm::cptr<SceNpId> member)
{ {
if (!g_fxo->get<sce_np_clans_manager>().is_initialized) if (!g_fxo->get<sce_np_clans_manager>().is_initialized)
{ {
return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; return SCE_NP_CLANS_ERROR_NOT_INITIALIZED;
} }
if (!npid) if (!member)
{ {
return SCE_NP_CLANS_ERROR_INVALID_ARGUMENT; return SCE_NP_CLANS_ERROR_INVALID_ARGUMENT;
} }
@ -947,10 +993,12 @@ error_code sceNpClansAddBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handle,
auto& nph = g_fxo->get<named_thread<np::np_handler>>(); auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpId host_npid = {}; SceNpId host_member = {};
std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); std::memcpy(&host_member, member.get_ptr(), sizeof(SceNpId));
SceNpClansError ret = clans_manager.client->addBlacklistEntry(nph, clanId, host_npid); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->addBlacklistEntry(nph, reqId, clanId, host_member);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -959,14 +1007,14 @@ error_code sceNpClansAddBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handle,
return CELL_OK; return CELL_OK;
} }
error_code sceNpClansRemoveBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handle, SceNpClanId clanId, vm::cptr<SceNpId> npid) error_code sceNpClansRemoveBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handle, SceNpClanId clanId, vm::cptr<SceNpId> member)
{ {
if (!g_fxo->get<sce_np_clans_manager>().is_initialized) if (!g_fxo->get<sce_np_clans_manager>().is_initialized)
{ {
return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; return SCE_NP_CLANS_ERROR_NOT_INITIALIZED;
} }
if (!npid) if (!member)
{ {
return SCE_NP_CLANS_ERROR_INVALID_ARGUMENT; return SCE_NP_CLANS_ERROR_INVALID_ARGUMENT;
} }
@ -974,10 +1022,12 @@ error_code sceNpClansRemoveBlacklistEntry(vm::ptr<SceNpClansRequestHandle> handl
auto& nph = g_fxo->get<named_thread<np::np_handler>>(); auto& nph = g_fxo->get<named_thread<np::np_handler>>();
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
SceNpId host_npid = {}; SceNpId host_member = {};
std::memcpy(&host_npid, npid.get_ptr(), sizeof(SceNpId)); std::memcpy(&host_member, member.get_ptr(), sizeof(SceNpId));
SceNpClansError ret = clans_manager.client->removeBlacklistEntry(nph, clanId, host_npid); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->removeBlacklistEntry(nph, reqId, clanId, host_member);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -1020,10 +1070,12 @@ error_code sceNpClansRetrieveAnnouncements(vm::ptr<SceNpClansRequestHandle> hand
host_paging.max = 0; host_paging.max = 0;
} }
SceNpClansMessageEntry host_mlist[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {}; SceNpClansMessageEntry host_announcements[SCE_NP_CLANS_PAGING_REQUEST_PAGE_MAX] = {};
SceNpClansPagingResult host_pageResult = {}; SceNpClansPagingResult host_pageResult = {};
SceNpClansError ret = clans_manager.client->retrieveAnnouncements(nph, clanId, &host_paging, host_mlist, &host_pageResult); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->retrieveAnnouncements(nph, reqId, clanId, &host_paging, host_announcements, &host_pageResult);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
@ -1031,7 +1083,7 @@ error_code sceNpClansRetrieveAnnouncements(vm::ptr<SceNpClansRequestHandle> hand
if (mlist && host_pageResult.count > 0) if (mlist && host_pageResult.count > 0)
{ {
std::memcpy(mlist.get_ptr(), host_mlist, sizeof(SceNpClansMessageEntry) * host_pageResult.count); std::memcpy(mlist.get_ptr(), host_announcements, sizeof(SceNpClansMessageEntry) * host_pageResult.count);
} }
std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult)); std::memcpy(pageResult.get_ptr(), &host_pageResult, sizeof(SceNpClansPagingResult));
@ -1058,8 +1110,8 @@ error_code sceNpClansPostAnnouncement(vm::ptr<SceNpClansRequestHandle> handle, S
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
auto& nph = g_fxo->get<named_thread<np::np_handler>>(); auto& nph = g_fxo->get<named_thread<np::np_handler>>();
SceNpClansMessage host_message = {}; SceNpClansMessage host_announcement = {};
std::memcpy(&host_message, message.get_ptr(), sizeof(SceNpClansMessage)); std::memcpy(&host_announcement, message.get_ptr(), sizeof(SceNpClansMessage));
SceNpClansMessageData host_data = {}; SceNpClansMessageData host_data = {};
if (data) if (data)
@ -1067,15 +1119,16 @@ error_code sceNpClansPostAnnouncement(vm::ptr<SceNpClansRequestHandle> handle, S
std::memcpy(&host_data, data.get_ptr(), sizeof(SceNpClansMessageData)); std::memcpy(&host_data, data.get_ptr(), sizeof(SceNpClansMessageData));
} }
SceNpClansMessageId host_mId = 0; s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->postAnnouncement(nph, clanId, &host_message, &host_data, duration, &host_mId); SceNpClansMessageId host_announcementId = 0;
SceNpClansError ret = clans_manager.client->postAnnouncement(nph, reqId, clanId, &host_announcement, &host_data, duration, &host_announcementId);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;
} }
*mId = host_mId; *mId = host_announcementId;
return CELL_OK; return CELL_OK;
} }
@ -1090,7 +1143,9 @@ error_code sceNpClansRemoveAnnouncement(vm::ptr<SceNpClansRequestHandle> handle,
auto& clans_manager = g_fxo->get<sce_np_clans_manager>(); auto& clans_manager = g_fxo->get<sce_np_clans_manager>();
auto& nph = g_fxo->get<named_thread<np::np_handler>>(); auto& nph = g_fxo->get<named_thread<np::np_handler>>();
SceNpClansError ret = clans_manager.client->deleteAnnouncement(nph, clanId, mId); s32 reqId = static_cast<s32>(handle.addr());
SceNpClansError ret = clans_manager.client->deleteAnnouncement(nph, reqId, clanId, mId);
if (ret != SCE_NP_CLANS_SUCCESS) if (ret != SCE_NP_CLANS_SUCCESS)
{ {
return ret; return ret;

View File

@ -1,3 +1,4 @@
#include "Emu/Cell/Modules/sceNpClans.h"
#include "stdafx.h" #include "stdafx.h"
#include <util/types.hpp> #include <util/types.hpp>
@ -129,50 +130,85 @@ namespace clan
return realsize; return realsize;
} }
struct clan_request_ctx
{
clan_request_ctx()
{
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);
}
}
~clan_request_ctx()
{
if (curl)
{
curl_easy_cleanup(curl);
curl = nullptr;
}
}
CURL* curl = nullptr;
// TODO: this was arbitrarily chosen -- see if there's a real amount
static const u32 SCE_NP_CLANS_MAX_CTX_NUM = 16;
static const u32 id_base = 0xA001;
static const u32 id_step = 1;
static const u32 id_count = SCE_NP_CLANS_MAX_CTX_NUM;
SAVESTATE_INIT_POS(55);
};
clans_client::clans_client() clans_client::clans_client()
{ {
g_cfg_clans.load(); g_cfg_clans.load();
createRequest();
} }
clans_client::~clans_client() clans_client::~clans_client()
{ {
destroyRequest(); idm::clear<clan_request_ctx>();
} }
SceNpClansError clans_client::createRequest() SceNpClansError clans_client::createRequest(s32* reqId)
{ {
if (curl) const s32 id = idm::make<clan_request_ctx>();
return SceNpClansError::SCE_NP_CLANS_SUCCESS;
curl = curl_easy_init(); if (id == id_manager::id_traits<clan_request_ctx>::invalid)
if (!curl)
{ {
return SceNpClansError::SCE_NP_CLANS_ERROR_EXCEEDS_MAX;
}
auto ctx = idm::get_unlocked<clan_request_ctx>(id);
if (!ctx || !ctx->curl)
{
idm::remove<clan_request_ctx>(id);
return SceNpClansError::SCE_NP_CLANS_ERROR_NOT_INITIALIZED; return SceNpClansError::SCE_NP_CLANS_ERROR_NOT_INITIALIZED;
} }
curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); *reqId = id;
return SceNpClansError::SCE_NP_CLANS_SUCCESS; return SceNpClansError::SCE_NP_CLANS_SUCCESS;
} }
SceNpClansError clans_client::destroyRequest() SceNpClansError clans_client::destroyRequest(s32 reqId)
{ {
if (curl) if (idm::remove<clan_request_ctx>(reqId))
{ return SceNpClansError::SCE_NP_CLANS_SUCCESS;
curl_easy_cleanup(curl);
curl = nullptr;
}
return SceNpClansError::SCE_NP_CLANS_SUCCESS; return SceNpClansError::SCE_NP_CLANS_ERROR_INVALID_ARGUMENT;
} }
SceNpClansError clans_client::sendRequest(ClanRequestAction action, ClanManagerOperationType opType, pugi::xml_document* xmlBody, pugi::xml_document* outResponse) SceNpClansError clans_client::sendRequest(s32 reqId, ClanRequestAction action, ClanManagerOperationType opType, pugi::xml_document* xmlBody, pugi::xml_document* outResponse)
{ {
if (!curl) auto ctx = idm::get_unlocked<clan_request_ctx>(reqId);
if (!ctx || !ctx->curl)
return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; return SCE_NP_CLANS_ERROR_NOT_INITIALIZED;
CURL* curl = ctx->curl;
ClanRequestType reqType = ClanRequestType::FUNC; ClanRequestType reqType = ClanRequestType::FUNC;
pugi::xml_node clan = xmlBody->child("clan"); pugi::xml_node clan = xmlBody->child("clan");
if (clan && clan.child("ticket")) if (clan && clan.child("ticket"))
@ -203,7 +239,7 @@ namespace clan
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, xml.c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, xml.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, xml.size()); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, xml.size());
res = curl_easy_perform(curl); CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) if (res != CURLE_OK)
{ {
@ -215,10 +251,10 @@ namespace clan
response_buffer.push_back('\0'); response_buffer.push_back('\0');
pugi::xml_parse_result res = outResponse->load_string(response_buffer.data()); pugi::xml_parse_result xml_res = outResponse->load_string(response_buffer.data());
if (!res) if (!xml_res)
{ {
clan_log.error("XML parsing failed: %s", res.description()); clan_log.error("XML parsing failed: %s", xml_res.description());
return SCE_NP_CLANS_ERROR_BAD_RESPONSE; return SCE_NP_CLANS_ERROR_BAD_RESPONSE;
} }
@ -288,7 +324,7 @@ namespace clan
} }
#pragma region Outgoing API Requests #pragma region Outgoing API Requests
SceNpClansError clans_client::getClanList(np::np_handler& nph, SceNpClansPagingRequest* paging, SceNpClansEntry* clanList, SceNpClansPagingResult* pageResult) SceNpClansError clans_client::getClanList(np::np_handler& nph, s32 reqId, SceNpClansPagingRequest* paging, SceNpClansEntry* clanList, SceNpClansPagingResult* pageResult)
{ {
pugi::xml_document doc = pugi::xml_document(); pugi::xml_document doc = pugi::xml_document();
pugi::xml_node clan = doc.append_child("clan"); pugi::xml_node clan = doc.append_child("clan");
@ -299,7 +335,7 @@ namespace clan
clan.append_child("max").text().set(paging->max); clan.append_child("max").text().set(paging->max);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
SceNpClansError clanRes = sendRequest(ClanRequestAction::GetClanList, ClanManagerOperationType::VIEW, &doc, &response); SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetClanList, ClanManagerOperationType::VIEW, &doc, &response);
if (clanRes != SCE_NP_CLANS_SUCCESS) if (clanRes != SCE_NP_CLANS_SUCCESS)
return clanRes; return clanRes;
@ -362,14 +398,14 @@ namespace clan
return SCE_NP_CLANS_SUCCESS; return SCE_NP_CLANS_SUCCESS;
} }
SceNpClansError clans_client::getClanInfo(SceNpClanId clanId, SceNpClansClanInfo* clanInfo) SceNpClansError clans_client::getClanInfo(s32 reqId, SceNpClanId clanId, SceNpClansClanInfo* clanInfo)
{ {
pugi::xml_document doc = pugi::xml_document(); pugi::xml_document doc = pugi::xml_document();
pugi::xml_node clan = doc.append_child("clan"); pugi::xml_node clan = doc.append_child("clan");
clan.append_child("id").text().set(clanId); clan.append_child("id").text().set(clanId);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
SceNpClansError clanRes = sendRequest(ClanRequestAction::GetClanInfo, ClanManagerOperationType::VIEW, &doc, &response); SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetClanInfo, ClanManagerOperationType::VIEW, &doc, &response);
if (clanRes != SCE_NP_CLANS_SUCCESS) if (clanRes != SCE_NP_CLANS_SUCCESS)
return clanRes; return clanRes;
@ -401,7 +437,7 @@ namespace clan
return SCE_NP_CLANS_SUCCESS; return SCE_NP_CLANS_SUCCESS;
} }
SceNpClansError clans_client::getMemberInfo(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMemberEntry* memInfo) SceNpClansError clans_client::getMemberInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMemberEntry* memInfo)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -414,7 +450,7 @@ namespace clan
clan.append_child("jid").text().set(jid_str.c_str()); clan.append_child("jid").text().set(jid_str.c_str());
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
SceNpClansError clanRes = sendRequest(ClanRequestAction::GetMemberInfo, ClanManagerOperationType::VIEW, &doc, &response); SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetMemberInfo, ClanManagerOperationType::VIEW, &doc, &response);
if (clanRes != SCE_NP_CLANS_SUCCESS) if (clanRes != SCE_NP_CLANS_SUCCESS)
return clanRes; return clanRes;
@ -469,7 +505,7 @@ namespace clan
return SCE_NP_CLANS_SUCCESS; return SCE_NP_CLANS_SUCCESS;
} }
SceNpClansError clans_client::getMemberList(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMemberStatus /*status*/, SceNpClansMemberEntry* memList, SceNpClansPagingResult* pageResult) SceNpClansError clans_client::getMemberList(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMemberStatus /*status*/, SceNpClansMemberEntry* memList, SceNpClansPagingResult* pageResult)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -481,7 +517,7 @@ namespace clan
clan.append_child("max").text().set(paging->max); clan.append_child("max").text().set(paging->max);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
SceNpClansError clanRes = sendRequest(ClanRequestAction::GetMemberList, ClanManagerOperationType::VIEW, &doc, &response); SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetMemberList, ClanManagerOperationType::VIEW, &doc, &response);
if (clanRes != SCE_NP_CLANS_SUCCESS) if (clanRes != SCE_NP_CLANS_SUCCESS)
return clanRes; return clanRes;
@ -545,7 +581,7 @@ namespace clan
return SCE_NP_CLANS_SUCCESS; return SCE_NP_CLANS_SUCCESS;
} }
SceNpClansError clans_client::getBlacklist(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* pageResult) SceNpClansError clans_client::getBlacklist(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* pageResult)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -557,7 +593,7 @@ namespace clan
clan.append_child("max").text().set(paging->max); clan.append_child("max").text().set(paging->max);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
SceNpClansError clanRes = sendRequest(ClanRequestAction::GetBlacklist, ClanManagerOperationType::VIEW, &doc, &response); SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::GetBlacklist, ClanManagerOperationType::VIEW, &doc, &response);
if (clanRes != SCE_NP_CLANS_SUCCESS) if (clanRes != SCE_NP_CLANS_SUCCESS)
return clanRes; return clanRes;
@ -609,7 +645,7 @@ namespace clan
return SCE_NP_CLANS_SUCCESS; return SCE_NP_CLANS_SUCCESS;
} }
SceNpClansError clans_client::addBlacklistEntry(np::np_handler& nph, SceNpClanId clanId, SceNpId npId) SceNpClansError clans_client::addBlacklistEntry(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -622,10 +658,10 @@ namespace clan
clan.append_child("jid").text().set(jid_str.c_str()); clan.append_child("jid").text().set(jid_str.c_str());
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::RecordBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::RecordBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::removeBlacklistEntry(np::np_handler& nph, SceNpClanId clanId, SceNpId npId) SceNpClansError clans_client::removeBlacklistEntry(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -638,10 +674,10 @@ namespace clan
clan.append_child("jid").text().set(jid_str.c_str()); clan.append_child("jid").text().set(jid_str.c_str());
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::DeleteBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::DeleteBlacklistEntry, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::clanSearch(SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clanList, SceNpClansPagingResult* pageResult) SceNpClansError clans_client::clanSearch(s32 reqId, SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clanList, SceNpClansPagingResult* pageResult)
{ {
pugi::xml_document doc = pugi::xml_document(); pugi::xml_document doc = pugi::xml_document();
pugi::xml_node clan = doc.append_child("clan"); pugi::xml_node clan = doc.append_child("clan");
@ -656,7 +692,7 @@ namespace clan
name.append_attribute("value").set_value(search->name); name.append_attribute("value").set_value(search->name);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
SceNpClansError clanRes = sendRequest(ClanRequestAction::ClanSearch, ClanManagerOperationType::VIEW, &doc, &response); SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::ClanSearch, ClanManagerOperationType::VIEW, &doc, &response);
if (clanRes != SCE_NP_CLANS_SUCCESS) if (clanRes != SCE_NP_CLANS_SUCCESS)
return clanRes; return clanRes;
@ -703,7 +739,7 @@ namespace clan
return SCE_NP_CLANS_SUCCESS; return SCE_NP_CLANS_SUCCESS;
} }
SceNpClansError clans_client::requestMembership(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* /*message*/) SceNpClansError clans_client::requestMembership(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* /*message*/)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -713,10 +749,10 @@ namespace clan
clan.append_child("id").text().set(clanId); clan.append_child("id").text().set(clanId);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::RequestMembership, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::RequestMembership, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::cancelRequestMembership(np::np_handler& nph, SceNpClanId clanId) SceNpClansError clans_client::cancelRequestMembership(np::np_handler& nph, s32 reqId, SceNpClanId clanId)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -726,10 +762,10 @@ namespace clan
clan.append_child("id").text().set(clanId); clan.append_child("id").text().set(clanId);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::CancelRequestMembership, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::CancelRequestMembership, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::sendMembershipResponse(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/, b8 allow) SceNpClansError clans_client::sendMembershipResponse(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/, b8 allow)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -742,10 +778,10 @@ namespace clan
clan.append_child("jid").text().set(jid_str.c_str()); clan.append_child("jid").text().set(jid_str.c_str());
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(allow ? ClanRequestAction::AcceptMembershipRequest : ClanRequestAction::DeclineMembershipRequest, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, allow ? ClanRequestAction::AcceptMembershipRequest : ClanRequestAction::DeclineMembershipRequest, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::sendInvitation(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/) SceNpClansError clans_client::sendInvitation(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -758,10 +794,10 @@ namespace clan
clan.append_child("jid").text().set(jid_str.c_str()); clan.append_child("jid").text().set(jid_str.c_str());
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::SendInvitation, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::SendInvitation, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::cancelInvitation(np::np_handler& nph, SceNpClanId clanId, SceNpId npId) SceNpClansError clans_client::cancelInvitation(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -774,10 +810,10 @@ namespace clan
clan.append_child("jid").text().set(jid_str.c_str()); clan.append_child("jid").text().set(jid_str.c_str());
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::CancelInvitation, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::CancelInvitation, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::sendInvitationResponse(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* /*message*/, b8 accept) SceNpClansError clans_client::sendInvitationResponse(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* /*message*/, b8 accept)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -787,10 +823,10 @@ namespace clan
clan.append_child("id").text().set(clanId); clan.append_child("id").text().set(clanId);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(accept ? ClanRequestAction::AcceptInvitation : ClanRequestAction::DeclineInvitation, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, accept ? ClanRequestAction::AcceptInvitation : ClanRequestAction::DeclineInvitation, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::updateMemberInfo(np::np_handler& nph, SceNpClanId clanId, SceNpClansUpdatableMemberInfo* info) SceNpClansError clans_client::updateMemberInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansUpdatableMemberInfo* info)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -824,10 +860,10 @@ namespace clan
size.text().set(info->binData1Size); size.text().set(info->binData1Size);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::UpdateMemberInfo, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::UpdateMemberInfo, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::updateClanInfo(np::np_handler& nph, SceNpClanId clanId, SceNpClansUpdatableClanInfo* info) SceNpClansError clans_client::updateClanInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansUpdatableClanInfo* info)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -842,10 +878,10 @@ namespace clan
description.text().set(info->description); description.text().set(info->description);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::UpdateClanInfo, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::UpdateClanInfo, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::joinClan(np::np_handler& nph, SceNpClanId clanId) SceNpClansError clans_client::joinClan(np::np_handler& nph, s32 reqId, SceNpClanId clanId)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -855,10 +891,10 @@ namespace clan
clan.append_child("id").text().set(clanId); clan.append_child("id").text().set(clanId);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::JoinClan, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::JoinClan, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::leaveClan(np::np_handler& nph, SceNpClanId clanId) SceNpClansError clans_client::leaveClan(np::np_handler& nph, s32 reqId, SceNpClanId clanId)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -868,10 +904,10 @@ namespace clan
clan.append_child("id").text().set(clanId); clan.append_child("id").text().set(clanId);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::LeaveClan, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::LeaveClan, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::kickMember(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/) SceNpClansError clans_client::kickMember(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* /*message*/)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -884,10 +920,10 @@ namespace clan
clan.append_child("jid").text().set(jid_str.c_str()); clan.append_child("jid").text().set(jid_str.c_str());
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::KickMember, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::KickMember, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::changeMemberRole(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMemberRole role) SceNpClansError clans_client::changeMemberRole(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMemberRole role)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -903,10 +939,10 @@ namespace clan
roleNode.text().set(static_cast<uint32_t>(role)); roleNode.text().set(static_cast<uint32_t>(role));
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::ChangeMemberRole, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::ChangeMemberRole, ClanManagerOperationType::UPDATE, &doc, &response);
} }
SceNpClansError clans_client::retrieveAnnouncements(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* pageResult) SceNpClansError clans_client::retrieveAnnouncements(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* pageResult)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -918,7 +954,7 @@ namespace clan
clan.append_child("max").text().set(paging->max); clan.append_child("max").text().set(paging->max);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
SceNpClansError clanRes = sendRequest(ClanRequestAction::RetrieveAnnouncements, ClanManagerOperationType::VIEW, &doc, &response); SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::RetrieveAnnouncements, ClanManagerOperationType::VIEW, &doc, &response);
if (clanRes != SCE_NP_CLANS_SUCCESS) if (clanRes != SCE_NP_CLANS_SUCCESS)
return clanRes; return clanRes;
@ -987,7 +1023,7 @@ namespace clan
return SCE_NP_CLANS_SUCCESS; return SCE_NP_CLANS_SUCCESS;
} }
SceNpClansError clans_client::postAnnouncement(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* announcement, SceNpClansMessageData* /*data*/, u32 duration, SceNpClansMessageId* msgId) SceNpClansError clans_client::postAnnouncement(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* announcement, SceNpClansMessageData* /*data*/, u32 duration, SceNpClansMessageId* msgId)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -1006,7 +1042,7 @@ namespace clan
expireDate.text().set(duration); expireDate.text().set(duration);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
SceNpClansError clanRes = sendRequest(ClanRequestAction::PostAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response); SceNpClansError clanRes = sendRequest(reqId, ClanRequestAction::PostAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response);
if (clanRes != SCE_NP_CLANS_SUCCESS) if (clanRes != SCE_NP_CLANS_SUCCESS)
return clanRes; return clanRes;
@ -1018,7 +1054,7 @@ namespace clan
return SCE_NP_CLANS_SUCCESS; return SCE_NP_CLANS_SUCCESS;
} }
SceNpClansError clans_client::deleteAnnouncement(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessageId announcementId) SceNpClansError clans_client::deleteAnnouncement(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessageId announcementId)
{ {
std::string ticket = getClanTicket(nph); std::string ticket = getClanTicket(nph);
@ -1029,7 +1065,7 @@ namespace clan
clan.append_child("msg-id").text().set(announcementId); clan.append_child("msg-id").text().set(announcementId);
pugi::xml_document response = pugi::xml_document(); pugi::xml_document response = pugi::xml_document();
return sendRequest(ClanRequestAction::DeleteAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response); return sendRequest(reqId, ClanRequestAction::DeleteAnnouncement, ClanManagerOperationType::UPDATE, &doc, &response);
} }
} }
#pragma endregion #pragma endregion

View File

@ -3,6 +3,7 @@
#include <3rdparty/curl/curl/include/curl/curl.h> #include <3rdparty/curl/curl/include/curl/curl.h>
#include <Emu/Cell/Modules/sceNpClans.h> #include <Emu/Cell/Modules/sceNpClans.h>
#include <Emu/NP/np_handler.h> #include <Emu/NP/np_handler.h>
#include <Emu/IdManager.h>
#include <pugixml.hpp> #include <pugixml.hpp>
namespace clan namespace clan
@ -62,11 +63,10 @@ namespace clan
class clans_client class clans_client
{ {
private: private:
CURL* curl = nullptr;
CURLcode res = CURLE_OK;
static size_t curlWriteCallback(void* data, size_t size, size_t nmemb, void* clientp); static size_t curlWriteCallback(void* data, size_t size, size_t nmemb, void* clientp);
SceNpClansError sendRequest(ClanRequestAction action, ClanManagerOperationType type, pugi::xml_document* xmlBody, pugi::xml_document* outResponse); SceNpClansError sendRequest(s32 reqId, ClanRequestAction action, ClanManagerOperationType type, pugi::xml_document* xmlBody, pugi::xml_document* outResponse);
/// @brief Forge and get a V2.1 Ticket for clan operations /// @brief Forge and get a V2.1 Ticket for clan operations
std::string getClanTicket(np::np_handler& nph); std::string getClanTicket(np::np_handler& nph);
@ -75,41 +75,41 @@ namespace clan
clans_client(); clans_client();
~clans_client(); ~clans_client();
SceNpClansError createRequest(); SceNpClansError createRequest(s32* reqId);
SceNpClansError destroyRequest(); SceNpClansError destroyRequest(s32 reqId);
SceNpClansError clanSearch(SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clanList, SceNpClansPagingResult* pageResult); SceNpClansError clanSearch(s32 reqId, SceNpClansPagingRequest* paging, SceNpClansSearchableName* search, SceNpClansClanBasicInfo* clanList, SceNpClansPagingResult* pageResult);
SceNpClansError getClanList(np::np_handler& nph, SceNpClansPagingRequest* paging, SceNpClansEntry* clanList, SceNpClansPagingResult* pageResult); SceNpClansError getClanList(np::np_handler& nph, s32 reqId, SceNpClansPagingRequest* paging, SceNpClansEntry* clanList, SceNpClansPagingResult* pageResult);
SceNpClansError getClanInfo(SceNpClanId clanId, SceNpClansClanInfo* clanInfo); SceNpClansError getClanInfo(s32 reqId, SceNpClanId clanId, SceNpClansClanInfo* clanInfo);
SceNpClansError getMemberInfo(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMemberEntry* memInfo); SceNpClansError getMemberInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMemberEntry* memInfo);
SceNpClansError getMemberList(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMemberStatus status, SceNpClansMemberEntry* memList, SceNpClansPagingResult* pageResult); SceNpClansError getMemberList(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMemberStatus status, SceNpClansMemberEntry* memList, SceNpClansPagingResult* pageResult);
SceNpClansError getBlacklist(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* pageResult); SceNpClansError getBlacklist(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansBlacklistEntry* bl, SceNpClansPagingResult* pageResult);
SceNpClansError addBlacklistEntry(np::np_handler& nph, SceNpClanId clanId, SceNpId npId); SceNpClansError addBlacklistEntry(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId);
SceNpClansError removeBlacklistEntry(np::np_handler& nph, SceNpClanId clanId, SceNpId npId); SceNpClansError removeBlacklistEntry(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId);
SceNpClansError requestMembership(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* message); SceNpClansError requestMembership(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* message);
SceNpClansError cancelRequestMembership(np::np_handler& nph, SceNpClanId clanId); SceNpClansError cancelRequestMembership(np::np_handler& nph, s32 reqId, SceNpClanId clanId);
SceNpClansError sendMembershipResponse(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message, b8 allow); SceNpClansError sendMembershipResponse(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message, b8 allow);
SceNpClansError sendInvitation(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message); SceNpClansError sendInvitation(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message);
SceNpClansError cancelInvitation(np::np_handler& nph, SceNpClanId clanId, SceNpId npId); SceNpClansError cancelInvitation(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId);
SceNpClansError sendInvitationResponse(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* message, b8 accept); SceNpClansError sendInvitationResponse(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* message, b8 accept);
SceNpClansError joinClan(np::np_handler& nph, SceNpClanId clanId); SceNpClansError joinClan(np::np_handler& nph, s32 reqId, SceNpClanId clanId);
SceNpClansError leaveClan(np::np_handler& nph, SceNpClanId clanId); SceNpClansError leaveClan(np::np_handler& nph, s32 reqId, SceNpClanId clanId);
SceNpClansError updateMemberInfo(np::np_handler& nph, SceNpClanId clanId, SceNpClansUpdatableMemberInfo* info); SceNpClansError updateMemberInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansUpdatableMemberInfo* info);
SceNpClansError updateClanInfo(np::np_handler& nph, SceNpClanId clanId, SceNpClansUpdatableClanInfo* info); SceNpClansError updateClanInfo(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansUpdatableClanInfo* info);
SceNpClansError kickMember(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message); SceNpClansError kickMember(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMessage* message);
SceNpClansError changeMemberRole(np::np_handler& nph, SceNpClanId clanId, SceNpId npId, SceNpClansMemberRole role); SceNpClansError changeMemberRole(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpId npId, SceNpClansMemberRole role);
SceNpClansError retrieveAnnouncements(np::np_handler& nph, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* pageResult); SceNpClansError retrieveAnnouncements(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansPagingRequest* paging, SceNpClansMessageEntry* announcements, SceNpClansPagingResult* pageResult);
SceNpClansError postAnnouncement(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessage* announcement, SceNpClansMessageData* data, u32 duration, SceNpClansMessageId* announcementId); SceNpClansError postAnnouncement(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessage* announcement, SceNpClansMessageData* data, u32 duration, SceNpClansMessageId* announcementId);
SceNpClansError deleteAnnouncement(np::np_handler& nph, SceNpClanId clanId, SceNpClansMessageId announcementId); SceNpClansError deleteAnnouncement(np::np_handler& nph, s32 reqId, SceNpClanId clanId, SceNpClansMessageId announcementId);
}; };
} // namespace clan } // namespace clan