nn_olv: Added community related API (#873)

- Initialize
- Download communities (self-made / favorites / officials)
- Upload communities (create subcommunity)
- Upload favorite status (Add/Delete favorite to a subcommunity)

Enough for support of Mario Kart 8 tournaments
This commit is contained in:
Rambo6Glaz 2023-06-24 14:51:41 +02:00 committed by GitHub
parent 1beec40445
commit a8d157d310
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 3125 additions and 56 deletions

View file

@ -95,6 +95,36 @@ namespace act
return result;
}
uint32 GetTransferableIdEx(uint64* transferableId, uint32 unique, uint8 slot)
{
actPrepareRequest2();
actRequest->requestCode = IOSU_ARC_TRANSFERABLEID;
actRequest->accountSlot = slot;
actRequest->unique = unique;
uint32 result = _doCemuActRequest(actRequest);
*transferableId = _swapEndianU64(actRequest->resultU64.u64);
return result;
}
uint32 AcquireIndependentServiceToken(independentServiceToken_t* token, const char* clientId, uint32 cacheDurationInSeconds)
{
memset(token, 0, sizeof(independentServiceToken_t));
actPrepareRequest();
actRequest->requestCode = IOSU_ARC_ACQUIREINDEPENDENTTOKEN;
actRequest->titleId = CafeSystem::GetForegroundTitleId();
actRequest->titleVersion = CafeSystem::GetForegroundTitleVersion();
actRequest->expiresIn = cacheDurationInSeconds;
strcpy(actRequest->clientId, clientId);
uint32 resultCode = __depr__IOS_Ioctlv(IOS_DEVICE_ACT, IOSU_ACT_REQUEST_CEMU, 1, 1, actBufferVector);
memcpy(token, actRequest->resultBinary.binBuffer, sizeof(independentServiceToken_t));
return getNNReturnCode(resultCode, actRequest);
}
sint32 g_initializeCount = 0; // inc in Initialize and dec in Finalize
uint32 Initialize()
{
@ -170,21 +200,6 @@ uint32 GetPrincipalIdEx(uint32be* principalId, uint8 slot)
return result;
}
uint32 GetTransferableIdEx(uint64* transferableId, uint32 unique, uint8 slot)
{
actPrepareRequest2();
actRequest->requestCode = IOSU_ARC_TRANSFERABLEID;
actRequest->accountSlot = slot;
actRequest->unique = unique;
uint32 result = _doCemuActRequest(actRequest);
*transferableId = _swapEndianU64(actRequest->resultU64.u64);
return result;
}
uint32 GetCountryEx(char* country, uint8 slot)
{
actPrepareRequest2();
@ -278,7 +293,7 @@ void nnActExport_GetTransferableIdEx(PPCInterpreter_t* hCPU)
cemuLog_logDebug(LogType::Force, "nn_act.GetTransferableIdEx(0x{:08x}, 0x{:08x}, {})", hCPU->gpr[3], hCPU->gpr[4], hCPU->gpr[5] & 0xFF);
uint32 r = GetTransferableIdEx(transferableId, unique, slot);
uint32 r = nn::act::GetTransferableIdEx(transferableId, unique, slot);
osLib_returnFromFunction(hCPU, 0); // ResultSuccess
}
@ -589,33 +604,11 @@ void nnActExport_AcquireNexServiceToken(PPCInterpreter_t* hCPU)
osLib_returnFromFunction(hCPU, getNNReturnCode(resultCode, actRequest));
}
struct independentServiceToken_t
{
/* +0x000 */ char token[0x201];
};
static_assert(sizeof(independentServiceToken_t) == 0x201); // todo - verify size
uint32 AcquireIndependentServiceToken(independentServiceToken_t* token, const char* clientId, uint32 cacheDurationInSeconds)
{
memset(token, 0, sizeof(independentServiceToken_t));
actPrepareRequest();
actRequest->requestCode = IOSU_ARC_ACQUIREINDEPENDENTTOKEN;
actRequest->titleId = CafeSystem::GetForegroundTitleId();
actRequest->titleVersion = CafeSystem::GetForegroundTitleVersion();
actRequest->expiresIn = cacheDurationInSeconds;
strcpy(actRequest->clientId, clientId);
uint32 resultCode = __depr__IOS_Ioctlv(IOS_DEVICE_ACT, IOSU_ACT_REQUEST_CEMU, 1, 1, actBufferVector);
memcpy(token, actRequest->resultBinary.binBuffer, sizeof(independentServiceToken_t));
return getNNReturnCode(resultCode, actRequest);
}
void nnActExport_AcquireIndependentServiceToken(PPCInterpreter_t* hCPU)
{
ppcDefineParamMEMPTR(token, independentServiceToken_t, 0);
ppcDefineParamMEMPTR(serviceToken, const char, 1);
uint32 result = AcquireIndependentServiceToken(token.GetPtr(), serviceToken.GetPtr(), 0);
uint32 result = nn::act::AcquireIndependentServiceToken(token.GetPtr(), serviceToken.GetPtr(), 0);
cemuLog_logDebug(LogType::Force, "nn_act.AcquireIndependentServiceToken(0x{}, {}) -> {:x}", (void*)token.GetPtr(), serviceToken.GetPtr(), result);
cemuLog_logDebug(LogType::Force, "Token: {}", serviceToken.GetPtr());
osLib_returnFromFunction(hCPU, result);
@ -626,7 +619,7 @@ void nnActExport_AcquireIndependentServiceToken2(PPCInterpreter_t* hCPU)
ppcDefineParamStructPtr(token, independentServiceToken_t, 0);
ppcDefineParamMEMPTR(clientId, const char, 1);
ppcDefineParamU32(cacheDurationInSeconds, 2);
uint32 result = AcquireIndependentServiceToken(token, clientId.GetPtr(), cacheDurationInSeconds);
uint32 result = nn::act::AcquireIndependentServiceToken(token, clientId.GetPtr(), cacheDurationInSeconds);
cemuLog_logDebug(LogType::Force, "Called nn_act.AcquireIndependentServiceToken2");
osLib_returnFromFunction(hCPU, result);
}
@ -634,7 +627,7 @@ void nnActExport_AcquireIndependentServiceToken2(PPCInterpreter_t* hCPU)
void nnActExport_AcquireEcServiceToken(PPCInterpreter_t* hCPU)
{
ppcDefineParamMEMPTR(pEcServiceToken, independentServiceToken_t, 0);
uint32 result = AcquireIndependentServiceToken(pEcServiceToken.GetPtr(), "71a6f5d6430ea0183e3917787d717c46", 0);
uint32 result = nn::act::AcquireIndependentServiceToken(pEcServiceToken.GetPtr(), "71a6f5d6430ea0183e3917787d717c46", 0);
cemuLog_logDebug(LogType::Force, "Called nn_act.AcquireEcServiceToken");
osLib_returnFromFunction(hCPU, result);
}