mirror of
https://github.com/cemu-project/Cemu.git
synced 2024-11-25 18:46:55 +01:00
Fix NEX DataStore uploads (nlibcurl) and stub Miiverse PostApp (#888)
This commit is contained in:
parent
9499870cc9
commit
b0ae008a89
@ -504,7 +504,7 @@ void export_curl_multi_fdset(PPCInterpreter_t* hCPU)
|
|||||||
// fd write set
|
// fd write set
|
||||||
for (uint32 i = 0; i < h_writeFd.fd_count; i++)
|
for (uint32 i = 0; i < h_writeFd.fd_count; i++)
|
||||||
{
|
{
|
||||||
cemu_assert_debug(false);
|
hostFdSet(h_writeFd.fd_array[i], writeFd.GetPtr());
|
||||||
}
|
}
|
||||||
// fd exception set
|
// fd exception set
|
||||||
for (uint32 i = 0; i < h_exceptionFd.fd_count; i++)
|
for (uint32 i = 0; i < h_exceptionFd.fd_count; i++)
|
||||||
@ -907,6 +907,7 @@ int sockopt_callback(void* clientp, curl_socket_t curlfd, curlsocktype purpose)
|
|||||||
|
|
||||||
size_t read_callback(char* buffer, size_t size, size_t nitems, void* instream)
|
size_t read_callback(char* buffer, size_t size, size_t nitems, void* instream)
|
||||||
{
|
{
|
||||||
|
nitems = std::min<uint32>(nitems, 0x4000);
|
||||||
CURL_t* curl = (CURL_t*)instream;
|
CURL_t* curl = (CURL_t*)instream;
|
||||||
|
|
||||||
cemuLog_logDebug(LogType::Force, "read_callback(0x{}, 0x{:x}, 0x{:x}, 0x{:08x}) [func: 0x{:x}]", (void*)buffer, size, nitems, curl->in_set.GetMPTR(), curl->fread_func_set.GetMPTR());
|
cemuLog_logDebug(LogType::Force, "read_callback(0x{}, 0x{:x}, 0x{:x}, 0x{:08x}) [func: 0x{:x}]", (void*)buffer, size, nitems, curl->in_set.GetMPTR(), curl->fread_func_set.GetMPTR());
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
#include "nn_olv_DownloadCommunityTypes.h"
|
#include "nn_olv_DownloadCommunityTypes.h"
|
||||||
#include "nn_olv_UploadFavoriteTypes.h"
|
#include "nn_olv_UploadFavoriteTypes.h"
|
||||||
|
|
||||||
|
#include "Cafe/OS/libs/proc_ui/proc_ui.h"
|
||||||
|
#include "Cafe/OS/libs/coreinit/coreinit_Time.h"
|
||||||
|
|
||||||
namespace nn
|
namespace nn
|
||||||
{
|
{
|
||||||
namespace olv
|
namespace olv
|
||||||
@ -198,10 +201,35 @@ namespace nn
|
|||||||
osLib_returnFromFunction(hCPU, memory_getVirtualOffsetFromPointer(&portalAppParam->serviceToken));
|
osLib_returnFromFunction(hCPU, memory_getVirtualOffsetFromPointer(&portalAppParam->serviceToken));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 UploadPostDataByPostApp(void *postParam)
|
static SysAllocator<OSThread_t> s_OlvReleaseBgThread;
|
||||||
|
SysAllocator<uint8, 1024> s_OlvReleaseBgThreadStack;
|
||||||
|
SysAllocator<char, 32> s_OlvReleaseBgThreadName;
|
||||||
|
|
||||||
|
void StubPostAppReleaseBackground(PPCInterpreter_t* hCPU)
|
||||||
{
|
{
|
||||||
cemuLog_log(LogType::Force, "UploadPostDataByPostApp() called. Returning error");
|
coreinit::OSSleepTicks(ESPRESSO_TIMER_CLOCK * 2); // Sleep 2s
|
||||||
return BUILD_NN_RESULT(NN_RESULT_LEVEL_STATUS, NN_RESULT_MODULE_NN_OLV, 0); // undefined error
|
ProcUI_SendForegroundMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
sint32 StubPostApp(void* pAnyPostParam)
|
||||||
|
{
|
||||||
|
coreinit::OSCreateThreadType(s_OlvReleaseBgThread.GetPtr(), RPLLoader_MakePPCCallable(StubPostAppReleaseBackground), 0, nullptr, s_OlvReleaseBgThreadStack.GetPtr() + s_OlvReleaseBgThreadStack.GetByteSize(), (sint32)s_OlvReleaseBgThreadStack.GetByteSize(), 0, (1 << 1) | (1 << 3), OSThread_t::THREAD_TYPE::TYPE_APP);
|
||||||
|
coreinit::OSResumeThread(s_OlvReleaseBgThread.GetPtr());
|
||||||
|
strcpy(s_OlvReleaseBgThreadName.GetPtr(), "StubPostApp!");
|
||||||
|
coreinit::OSSetThreadName(s_OlvReleaseBgThread.GetPtr(),s_OlvReleaseBgThreadName.GetPtr());
|
||||||
|
return OLV_RESULT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
sint32 StubPostAppResult()
|
||||||
|
{
|
||||||
|
return OLV_RESULT_STATUS(301); // Cancelled post app
|
||||||
|
}
|
||||||
|
|
||||||
|
// Somehow required, MK8 doesn't even seem to care about the error codes lol
|
||||||
|
char* UploadedPostData_GetPostId(char* pPostData)
|
||||||
|
{
|
||||||
|
pPostData[4] = '\0';
|
||||||
|
return &pPostData[4];
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/kinnay/NintendoClients/wiki/Wii-U-Error-Codes#act-error-codes
|
// https://github.com/kinnay/NintendoClients/wiki/Wii-U-Error-Codes#act-error-codes
|
||||||
@ -272,7 +300,16 @@ namespace nn
|
|||||||
|
|
||||||
osLib_addFunction("nn_olv", "GetServiceToken__Q4_2nn3olv6hidden14PortalAppParamCFv", exportPortalAppParam_GetServiceToken);
|
osLib_addFunction("nn_olv", "GetServiceToken__Q4_2nn3olv6hidden14PortalAppParamCFv", exportPortalAppParam_GetServiceToken);
|
||||||
|
|
||||||
cafeExportRegisterFunc(UploadPostDataByPostApp, "nn_olv", "UploadPostDataByPostApp__Q2_2nn3olvFPCQ3_2nn3olv28UploadPostDataByPostAppParam", LogType::Placeholder);
|
cafeExportRegisterFunc(StubPostApp, "nn_olv", "UploadPostDataByPostApp__Q2_2nn3olvFPCQ3_2nn3olv28UploadPostDataByPostAppParam", LogType::Force);
|
||||||
|
cafeExportRegisterFunc(StubPostApp, "nn_olv", "UploadCommentDataByPostApp__Q2_2nn3olvFPCQ3_2nn3olv31UploadCommentDataByPostAppParam", LogType::Force);
|
||||||
|
cafeExportRegisterFunc(StubPostApp, "nn_olv", "UploadDirectMessageDataByPostApp__Q2_2nn3olvFPCQ3_2nn3olv37UploadDirectMessageDataByPostAppParam", LogType::Force);
|
||||||
|
|
||||||
|
cafeExportRegisterFunc(StubPostAppResult, "nn_olv", "GetResultByPostApp__Q2_2nn3olvFv", LogType::Force);
|
||||||
|
cafeExportRegisterFunc(StubPostAppResult, "nn_olv", "GetResultWithUploadedPostDataByPostApp__Q2_2nn3olvFPQ3_2nn3olv16UploadedPostData", LogType::Force);
|
||||||
|
cafeExportRegisterFunc(StubPostAppResult, "nn_olv", "GetResultWithUploadedDirectMessageDataByPostApp__Q2_2nn3olvFPQ3_2nn3olv25UploadedDirectMessageData", LogType::Force);
|
||||||
|
cafeExportRegisterFunc(StubPostAppResult, "nn_olv", "GetResultWithUploadedCommentDataByPostApp__Q2_2nn3olvFPQ3_2nn3olv19UploadedCommentData", LogType::Force);
|
||||||
|
|
||||||
|
cafeExportRegisterFunc(UploadedPostData_GetPostId, "nn_olv", "GetPostId__Q3_2nn3olv16UploadedPostDataCFv", LogType::Force);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,38 @@ uint32 ProcUIInForeground(PPCInterpreter_t* hCPU)
|
|||||||
return 1; // true means application is in foreground
|
return 1; // true means application is in foreground
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 ProcUIRegisterCallback(uint32 message, MPTR callback, void* data, sint32 ukn)
|
struct ProcUICallback
|
||||||
{
|
{
|
||||||
|
MPTR callback;
|
||||||
|
void* data;
|
||||||
|
sint32 priority;
|
||||||
|
};
|
||||||
|
std::unordered_map<uint32, ProcUICallback> g_Callbacks;
|
||||||
|
|
||||||
|
uint32 ProcUIRegisterCallback(uint32 message, MPTR callback, void* data, sint32 priority)
|
||||||
|
{
|
||||||
|
g_Callbacks.insert_or_assign(message, ProcUICallback{ .callback = callback, .data = data, .priority = priority });
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProcUI_SendBackgroundMessage()
|
||||||
|
{
|
||||||
|
if (g_Callbacks.contains(PROCUI_STATUS_BACKGROUND))
|
||||||
|
{
|
||||||
|
ProcUICallback& callback = g_Callbacks[PROCUI_STATUS_BACKGROUND];
|
||||||
|
PPCCoreCallback(callback.callback, callback.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcUI_SendForegroundMessage()
|
||||||
|
{
|
||||||
|
if (g_Callbacks.contains(PROCUI_STATUS_FOREGROUND))
|
||||||
|
{
|
||||||
|
ProcUICallback& callback = g_Callbacks[PROCUI_STATUS_FOREGROUND];
|
||||||
|
PPCCoreCallback(callback.callback, callback.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void procui_load()
|
void procui_load()
|
||||||
{
|
{
|
||||||
cafeExportRegister("proc_ui", ProcUIRegisterCallback, LogType::ProcUi);
|
cafeExportRegister("proc_ui", ProcUIRegisterCallback, LogType::ProcUi);
|
||||||
|
@ -1,2 +1,5 @@
|
|||||||
|
|
||||||
void procui_load();
|
void procui_load();
|
||||||
|
|
||||||
|
void ProcUI_SendForegroundMessage();
|
||||||
|
void ProcUI_SendBackgroundMessage();
|
Loading…
Reference in New Issue
Block a user