diff --git a/dep/rainterface/RA_Consoles.h b/dep/rainterface/RA_Consoles.h index 20aab4738..59839b64f 100644 --- a/dep/rainterface/RA_Consoles.h +++ b/dep/rainterface/RA_Consoles.h @@ -76,6 +76,7 @@ enum ConsoleID MegaDuck = 69, Zeebo = 70, Arduboy = 71, + WASM4 = 72, NumConsoleIDs }; diff --git a/dep/rainterface/RA_Interface.cpp b/dep/rainterface/RA_Interface.cpp index ddf90c1c9..215253850 100644 --- a/dep/rainterface/RA_Interface.cpp +++ b/dep/rainterface/RA_Interface.cpp @@ -20,12 +20,14 @@ static int (CCONV* _RA_InitClientOffline)(HWND hMainWnd, const char* sC static void (CCONV* _RA_InstallSharedFunctions)(int(*)(), void(*)(), void(*)(), void(*)(), void(*)(char*), void(*)(), void(*)(const char*)) = nullptr; static void (CCONV* _RA_SetForceRepaint)(int bEnable) = nullptr; static HMENU (CCONV* _RA_CreatePopupMenu)() = nullptr; +static int (CCONV* _RA_GetPopupMenuItems)(RA_MenuItem*) = nullptr; static void (CCONV* _RA_InvokeDialog)(LPARAM nID) = nullptr; static void (CCONV* _RA_SetUserAgentDetail)(const char* sDetail); static void (CCONV* _RA_AttemptLogin)(int bBlocking) = nullptr; static int (CCONV* _RA_SetConsoleID)(unsigned int nConsoleID) = nullptr; static void (CCONV* _RA_ClearMemoryBanks)() = nullptr; static void (CCONV* _RA_InstallMemoryBank)(int nBankID, RA_ReadMemoryFunc* pReader, RA_WriteMemoryFunc* pWriter, int nBankSize) = nullptr; +static void (CCONV* _RA_InstallMemoryBankBlockReader)(int nBankID, RA_ReadMemoryBlockFunc* pReader) = nullptr; static int (CCONV* _RA_Shutdown)() = nullptr; // Overlay static int (CCONV* _RA_IsOverlayFullyVisible)() = nullptr; @@ -134,11 +136,22 @@ void RA_InstallMemoryBank(int nBankID, RA_ReadMemoryFunc pReader, RA_WriteMemory _RA_InstallMemoryBank(nBankID, pReader, pWriter, nBankSize); } +void RA_InstallMemoryBankBlockReader(int nBankID, RA_ReadMemoryBlockFunc pReader) +{ + if (_RA_InstallMemoryBankBlockReader != nullptr) + _RA_InstallMemoryBankBlockReader(nBankID, pReader); +} + HMENU RA_CreatePopupMenu(void) { return (_RA_CreatePopupMenu != nullptr) ? _RA_CreatePopupMenu() : nullptr; } +int RA_GetPopupMenuItems(RA_MenuItem *pItems) +{ + return (_RA_GetPopupMenuItems != nullptr) ? _RA_GetPopupMenuItems(pItems) : 0; +} + void RA_UpdateAppTitle(const char* sCustomMsg) { if (_RA_UpdateAppTitle != nullptr) @@ -293,6 +306,7 @@ static BOOL DoBlockingHttpCall(const char* sHostUrl, const char* sRequestedPage, { BOOL bResults = FALSE, bSuccess = FALSE; HINTERNET hSession = nullptr, hConnect = nullptr, hRequest = nullptr; + size_t nHostnameLen; WCHAR wBuffer[1024]; size_t nTemp; @@ -313,6 +327,17 @@ static BOOL DoBlockingHttpCall(const char* sHostUrl, const char* sRequestedPage, nPort = INTERNET_DEFAULT_HTTPS_PORT; } + const char* sPort = strchr(sHostName, ':'); + if (sPort) + { + nHostnameLen = sPort - sHostName; + nPort = atoi(sPort + 1); + } + else + { + nHostnameLen = strlen(sHostName); + } + // Use WinHttpOpen to obtain a session handle. hSession = WinHttpOpen(L"RetroAchievements Client Bootstrap", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, @@ -327,10 +352,11 @@ static BOOL DoBlockingHttpCall(const char* sHostUrl, const char* sRequestedPage, else { #if defined(_MSC_VER) && _MSC_VER >= 1400 - mbstowcs_s(&nTemp, wBuffer, sizeof(wBuffer) / sizeof(wBuffer[0]), sHostName, strlen(sHostName) + 1); + mbstowcs_s(&nTemp, wBuffer, sizeof(wBuffer) / sizeof(wBuffer[0]), sHostName, nHostnameLen); #else - nTemp = mbstowcs(wBuffer, sHostName, strlen(sHostName) + 1); + nTemp = mbstowcs(wBuffer, sHostName, nHostnameLen); #endif + if (nTemp > 0) { hConnect = WinHttpConnect(hSession, wBuffer, nPort, 0); @@ -659,12 +685,14 @@ static const char* CCONV _RA_InstallIntegration() _RA_InstallSharedFunctions = (void(CCONV*)(int(*)(), void(*)(), void(*)(), void(*)(), void(*)(char*), void(*)(), void(*)(const char*))) GetProcAddress(g_hRADLL, "_RA_InstallSharedFunctionsExt"); _RA_SetForceRepaint = (void(CCONV*)(int)) GetProcAddress(g_hRADLL, "_RA_SetForceRepaint"); _RA_CreatePopupMenu = (HMENU(CCONV*)(void)) GetProcAddress(g_hRADLL, "_RA_CreatePopupMenu"); + _RA_GetPopupMenuItems = (int(CCONV*)(RA_MenuItem*)) GetProcAddress(g_hRADLL, "_RA_GetPopupMenuItems"); _RA_InvokeDialog = (void(CCONV*)(LPARAM)) GetProcAddress(g_hRADLL, "_RA_InvokeDialog"); _RA_SetUserAgentDetail = (void(CCONV*)(const char*)) GetProcAddress(g_hRADLL, "_RA_SetUserAgentDetail"); _RA_AttemptLogin = (void(CCONV*)(int)) GetProcAddress(g_hRADLL, "_RA_AttemptLogin"); _RA_SetConsoleID = (int(CCONV*)(unsigned int)) GetProcAddress(g_hRADLL, "_RA_SetConsoleID"); _RA_ClearMemoryBanks = (void(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_ClearMemoryBanks"); _RA_InstallMemoryBank = (void(CCONV*)(int, RA_ReadMemoryFunc*, RA_WriteMemoryFunc*, int)) GetProcAddress(g_hRADLL, "_RA_InstallMemoryBank"); + _RA_InstallMemoryBankBlockReader = (void(CCONV*)(int, RA_ReadMemoryBlockFunc*)) GetProcAddress(g_hRADLL, "_RA_InstallMemoryBankBlockReader"); _RA_Shutdown = (int(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_Shutdown"); _RA_IsOverlayFullyVisible = (int(CCONV*)()) GetProcAddress(g_hRADLL, "_RA_IsOverlayFullyVisible"); _RA_SetPaused = (void(CCONV*)(int)) GetProcAddress(g_hRADLL, "_RA_SetPaused"); @@ -983,12 +1011,14 @@ void RA_Shutdown() _RA_InstallSharedFunctions = nullptr; _RA_SetForceRepaint = nullptr; _RA_CreatePopupMenu = nullptr; + _RA_GetPopupMenuItems = nullptr; _RA_InvokeDialog = nullptr; _RA_SetUserAgentDetail = nullptr; _RA_AttemptLogin = nullptr; _RA_SetConsoleID = nullptr; _RA_ClearMemoryBanks = nullptr; _RA_InstallMemoryBank = nullptr; + _RA_InstallMemoryBankBlockReader = nullptr; _RA_Shutdown = nullptr; _RA_IsOverlayFullyVisible = nullptr; _RA_SetPaused = nullptr; diff --git a/dep/rainterface/RA_Interface.h b/dep/rainterface/RA_Interface.h index 568a760cc..763ff90c7 100644 --- a/dep/rainterface/RA_Interface.h +++ b/dep/rainterface/RA_Interface.h @@ -72,6 +72,21 @@ extern HMENU RA_CreatePopupMenu(void); #define IDM_RA_MENUSTART 1700 #define IDM_RA_MENUEND 1739 +typedef struct RA_MenuItem +{ + LPCWSTR sLabel; + LPARAM nID; + int bChecked; +} RA_MenuItem; + +/** + * Gets items for building a popup menu. + * + * @param pItems Pre-allocated array to populate [should contain space for at least 32 items] + * @return Number of items populated in the items array + */ +extern int RA_GetPopupMenuItems(RA_MenuItem *pItems); + /** * Called when a menu item in the popup menu is selected. * @@ -127,6 +142,9 @@ typedef void (RA_WriteMemoryFunc)(unsigned int nAddress, unsigned char nValue); */ extern void RA_InstallMemoryBank(int nBankID, RA_ReadMemoryFunc pReader, RA_WriteMemoryFunc pWriter, int nBankSize); +typedef unsigned int (RA_ReadMemoryBlockFunc)(unsigned int nAddress, unsigned char* pBuffer, unsigned int nBytes); +extern void RA_InstallMemoryBankBlockReader(int nBankID, RA_ReadMemoryBlockFunc pReader); + /** * Deinitializes and unloads the DLL. */