Move and tidy up nn::olv::PortalAppParam code needed for Miiverse applet.

This commit is contained in:
Arian Kordi 2025-12-17 19:37:52 -05:00
parent a8508c7369
commit 1c24dd2a6f
3 changed files with 51 additions and 98 deletions

View File

@ -15,53 +15,6 @@ namespace nn
{
namespace olv
{
static const char* startUrlTemplate = "%s/titles/show?src=menu";
struct PortalAppParam_t
{
/* +0x1A5C3C */ char paramPack[0x200];
/* +0x1A663B */ char serviceToken[0x201];
/* +0x1A5E3C */ char startUrl[0x7ff]; // https://portal-us.olv.nintendo.net/titles/show?src=menu
};
uint32 StubPortalApp([[maybe_unused]] void* pPortalAppParam)
{
// Response to either a size or pointer.
// In any case, it usually ignores 0 or null.
return 0;
}
void exportPortalAppParam_GetParamPack(PPCInterpreter_t* hCPU)
{
// r3 = PortalAppParam
ppcDefineParamTypePtr(portalAppParam, PortalAppParam_t, 0);
strcpy(portalAppParam->paramPack, g_ParamPack.encodedParamPack);
osLib_returnFromFunction(hCPU, memory_getVirtualOffsetFromPointer(&portalAppParam->serviceToken));
}
void exportPortalAppParam_GetServiceToken(PPCInterpreter_t* hCPU)
{
// r3 = PortalAppParam
ppcDefineParamTypePtr(portalAppParam, PortalAppParam_t, 0);
strcpy(portalAppParam->serviceToken, g_DiscoveryResults.serviceToken);
osLib_returnFromFunction(hCPU, memory_getVirtualOffsetFromPointer(&portalAppParam->serviceToken));
}
void exportPortalAppParam_GetStartUrl(PPCInterpreter_t* hCPU)
{
// r3 = PortalAppParam
ppcDefineParamTypePtr(portalAppParam, PortalAppParam_t, 0);
cemu_assert_debug(g_DiscoveryResults.portalEndpoint[0]);
snprintf(portalAppParam->startUrl, sizeof(portalAppParam->startUrl),
startUrlTemplate, g_DiscoveryResults.portalEndpoint);
osLib_returnFromFunction(hCPU, memory_getVirtualOffsetFromPointer(&portalAppParam->startUrl));
}
static SysAllocator<OSThread_t> s_OlvReleaseBgThread;
SysAllocator<uint8, 1024> s_OlvReleaseBgThreadStack;
SysAllocator<char, 32> s_OlvReleaseBgThreadName;
@ -155,11 +108,6 @@ namespace nn
loadOliveUploadFavoriteTypes();
loadOlivePostAndTopicTypes();
// TODO: loadOlivePortalAppTypes
osLib_addFunction("nn_olv", "GetParamPack__Q4_2nn3olv6hidden14PortalAppParamCFv", exportPortalAppParam_GetParamPack);
osLib_addFunction("nn_olv", "GetServiceToken__Q4_2nn3olv6hidden14PortalAppParamCFv", exportPortalAppParam_GetServiceToken);
osLib_addFunction("nn_olv", "GetStartUrl__Q4_2nn3olv6hidden14PortalAppParamCFv", exportPortalAppParam_GetStartUrl);
cafeExportRegisterFunc(GetErrorCode, "nn_olv", "GetErrorCode__Q2_2nn3olvFRCQ2_2nn6Result", LogType::NN_OLV);
cafeExportRegisterFunc(StubPostApp, "nn_olv", "UploadPostDataByPostApp__Q2_2nn3olvFPCQ3_2nn3olv28UploadPostDataByPostAppParam", LogType::NN_OLV);
@ -171,14 +119,6 @@ namespace nn
cafeExportRegisterFunc(StubPostAppResult, "nn_olv", "GetResultWithUploadedDirectMessageDataByPostApp__Q2_2nn3olvFPQ3_2nn3olv25UploadedDirectMessageData", LogType::NN_OLV);
cafeExportRegisterFunc(StubPostAppResult, "nn_olv", "GetResultWithUploadedCommentDataByPostApp__Q2_2nn3olvFPQ3_2nn3olv19UploadedCommentData", LogType::NN_OLV);
cafeExportRegisterFunc(StubPortalApp, "nn_olv", "GetAppDataSize__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
cafeExportRegisterFunc(StubPortalApp, "nn_olv", "GetAppData__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
cafeExportRegisterFunc(StubPortalApp, "nn_olv", "GetDefaultBodyMemo__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
cafeExportRegisterFunc(StubPortalApp, "nn_olv", "GetExternalBinaryDataSize__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
cafeExportRegisterFunc(StubPortalApp, "nn_olv", "GetExternalBinaryData__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
cafeExportRegisterFunc(StubPortalApp, "nn_olv", "GetExternalImageDataSize__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
cafeExportRegisterFunc(StubPortalApp, "nn_olv", "GetExternalImageData__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
cafeExportRegisterFunc(UploadedPostData_GetPostId, "nn_olv", "GetPostId__Q3_2nn3olv16UploadedPostDataCFv", LogType::NN_OLV);
}
@ -188,4 +128,4 @@ namespace nn
}
}
}
}

View File

@ -279,8 +279,15 @@ namespace nn
sint32 InitializePortalApp(nn::olv::PortalAppParam* pPortalAppParam, nn::olv::InitializeParam* pInitializeParam)
{
// todo - stub
Initialize(pInitializeParam);
sint32 result = Initialize(pInitializeParam);
if (result != OLV_RESULT_SUCCESS)
return result;
memcpy(pPortalAppParam->m_ParamPack, g_ParamPack.encodedParamPack, sizeof(g_ParamPack.encodedParamPack));
memcpy(pPortalAppParam->m_ServiceToken, g_DiscoveryResults.serviceToken, sizeof(g_DiscoveryResults.serviceToken));
snprintf(reinterpret_cast<char*>(pPortalAppParam->m_StartUrl), sizeof(pPortalAppParam->m_StartUrl),
"%s/titles/show?src=menu", g_DiscoveryResults.portalEndpoint);
return OLV_RESULT_SUCCESS;
}
@ -303,4 +310,4 @@ namespace nn
return g_IsInitialized;
}
}
}
}

View File

@ -106,6 +106,9 @@ namespace nn
public:
PortalAppParam()
{
m_ParamPack[0] = 0;
m_ServiceToken[0] = 0;
m_StartUrl[0] = 0;
}
static PortalAppParam* __ctor(PortalAppParam* _this)
{
@ -117,39 +120,39 @@ namespace nn
else
return new (_this) PortalAppParam();
}
/*
struct PortalAppParam {
uint appDataSize; // for all sizes, if it is 0 then it returns null pointer
char appData[1024];
uint defaultBodyMemoSize;
char defaultBodyMemo[153644];
uint externalImageDataSize;
char externalImageData[524288];
uint externalBinaryDataSize;
char externalBinaryData[1048576];
char paramPack[512];
char startUrl[2047];
char serviceToken[513];
uint startType;
char bodyText[512]; // may actually be u16, as in, utf-16
char topicTag[304];
char searchKey[1520];
char externalUrl[256];
uint bodyTextMaxLength; // why is it back here
char feeling; // it is just a char
char padding_0[3];
uint communityId;
uint userPid;
uint flags;
char postId[32];
int useWebHost; // unknown, only referenced when initializing?, when 0 portalHost is used otherwise webHost
char webHost[2047]; // actually the api url
char portalHost[2047]; // portal-us.olv.nintendo.net
undefined padding_1[3434]; // unreferenced, alignment?
};
*/
};
uint8be* GetParamPack()
{
return m_ParamPack;
}
static uint8be* __GetParamPack(PortalAppParam* _this)
{
return _this->GetParamPack();
}
uint8be* GetServiceToken()
{
return m_ServiceToken;
}
static uint8be* __GetServiceToken(PortalAppParam* _this)
{
return _this->GetServiceToken();
}
uint8be* GetStartUrl()
{
return m_StartUrl;
}
static uint8be* __GetStartUrl(PortalAppParam* _this)
{
return _this->GetStartUrl();
}
public:
/* +0x1A5C3C */ uint8be m_ParamPack[0x200];
/* +0x1A663B */ uint8be m_ServiceToken[0x201]; // IndependentServiceToken for Miiverse title
/* +0x1A5E3C */ uint8be m_StartUrl[0x7ff]; // https://portal-us.olv.nintendo.net/titles/show?src=menu
};
namespace Report
{
@ -164,7 +167,6 @@ namespace nn
static void loadOliveInitializeTypes()
{
cafeExportRegisterFunc(Initialize, "nn_olv", "Initialize__Q2_2nn3olvFPCQ3_2nn3olv15InitializeParam", LogType::NN_OLV);
cafeExportRegisterFunc(InitializePortalApp, "nn_olv", "InitializePortalApp__Q3_2nn3olv6hiddenFPQ4_2nn3olv6hidden14PortalAppParamPCQ3_2nn3olv15InitializeParam", LogType::NN_OLV);
cafeExportRegisterFunc(IsInitialized, "nn_olv", "IsInitialized__Q2_2nn3olvFv", LogType::NN_OLV);
cafeExportRegisterFunc(Report::GetReportTypes, "nn_olv", "GetReportTypes__Q3_2nn3olv6ReportFv", LogType::NN_OLV);
cafeExportRegisterFunc(Report::SetReportTypes, "nn_olv", "SetReportTypes__Q3_2nn3olv6ReportFUi", LogType::NN_OLV);
@ -175,7 +177,11 @@ namespace nn
cafeExportRegisterFunc(InitializeParam::__SetReportTypes, "nn_olv", "SetReportTypes__Q3_2nn3olv15InitializeParamFUi", LogType::NN_OLV);
cafeExportRegisterFunc(InitializeParam::__SetSysArgs, "nn_olv", "SetSysArgs__Q3_2nn3olv15InitializeParamFPCvUi", LogType::NN_OLV);
cafeExportRegisterFunc(InitializePortalApp, "nn_olv", "InitializePortalApp__Q3_2nn3olv6hiddenFPQ4_2nn3olv6hidden14PortalAppParamPCQ3_2nn3olv15InitializeParam", LogType::NN_OLV);
cafeExportRegisterFunc(PortalAppParam::__ctor, "nn_olv", "__ct__Q4_2nn3olv6hidden14PortalAppParamFv", LogType::NN_OLV);
cafeExportRegisterFunc(PortalAppParam::__GetParamPack, "nn_olv", "GetParamPack__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
cafeExportRegisterFunc(PortalAppParam::__GetServiceToken, "nn_olv", "GetServiceToken__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
cafeExportRegisterFunc(PortalAppParam::__GetStartUrl, "nn_olv", "GetStartUrl__Q4_2nn3olv6hidden14PortalAppParamCFv", LogType::NN_OLV);
}
}
}
}