diff --git a/config/SZBE69_B8/objects.json b/config/SZBE69_B8/objects.json index 71b5e2f93..1bc3b44b2 100644 --- a/config/SZBE69_B8/objects.json +++ b/config/SZBE69_B8/objects.json @@ -1439,7 +1439,7 @@ "system/utl/FileStream.cpp": "Matching", "system/utl/GlitchFinder.cpp": "NonMatching", "system/utl/HangBlock_Wii.cpp": "Matching", - "system/utl/HttpWii.cpp": "MISSING", + "system/utl/HttpWii.cpp": "NonMatching", "system/utl/HxGuid.cpp": "Matching", "system/utl/IntPacker.cpp": "Matching", "system/utl/JobMgr.cpp": "NonMatching", diff --git a/src/sdk/RVL_SDK/revolution/sc/scapi.h b/src/sdk/RVL_SDK/revolution/sc/scapi.h index 93680dabf..f468254ae 100644 --- a/src/sdk/RVL_SDK/revolution/sc/scapi.h +++ b/src/sdk/RVL_SDK/revolution/sc/scapi.h @@ -50,48 +50,50 @@ typedef enum { } SCSensorBarPos; typedef struct SCIdleMode { - u8 wc24; // at 0x0 + u8 wc24; // at 0x0 u8 slotLight; // at 0x1 } SCIdleMode; typedef struct SCBtDeviceInfo { - BD_ADDR devAddr; // size 0x06, offset 0x00 + BD_ADDR devAddr; // size 0x06, offset 0x00 struct small_dev_info small; // size 0x40, offset 0x06 } SCBtDeviceInfo; typedef struct SCBtDeviceInfoArray { - u8 num; // size 0x001, offset 0x000 // name known from asserts + u8 num; // size 0x001, offset 0x000 // name known from asserts union { struct { SCBtDeviceInfo registered[WUD_MAX_DEV_ENTRY_FOR_STD]; // at 0x1 - SCBtDeviceInfo active[WUD_MAX_CHANNELS]; // at 0x2BD + SCBtDeviceInfo active[WUD_MAX_CHANNELS]; // at 0x2BD }; struct { /* NOTE: functions in WUD act as if the above is only one buffer * (see __wudSecurityEventStackCallback, case BTA_DM_LINK_DOWN_EVT) */ - SCBtDeviceInfo devices[14]; // size 0x3d4, offset 0x001 - SCBtDeviceInfo wbc; // size 0x046, offset 0x3d5 - SCBtDeviceInfo at_0x41b; // size 0x046, offset 0x41b + SCBtDeviceInfo devices[14]; // size 0x3d4, offset 0x001 + SCBtDeviceInfo wbc; // size 0x046, offset 0x3d5 + SCBtDeviceInfo at_0x41b; // size 0x046, offset 0x41b }; }; -} SCBtDeviceInfoArray; // size 0x461 +} SCBtDeviceInfoArray; // size 0x461 typedef struct SCBtCmpDevInfo { - BD_ADDR devAddr; // size 0x06, offset 0x00 + BD_ADDR devAddr; // size 0x06, offset 0x00 struct small_dev_info small; // size 0x40, offset 0x06 - LINK_KEY linkKey; // size 0x10, offset 0x30 // ? or just a buffer + LINK_KEY linkKey; // size 0x10, offset 0x30 // ? or just a buffer } SCBtCmpDevInfo; // size 0x56 typedef struct SCBtCmpDevInfoArray { - u8 num; // size 0x001, offset 0x000 // name known from asserts - SCBtCmpDevInfo devices[6]; // size 0x204, offset 0x001 + u8 num; // size 0x001, offset 0x000 // name known from asserts + SCBtCmpDevInfo devices[6]; // size 0x204, offset 0x001 } SCBtCmpDevInfoArray; // size 0x205 +BOOL SCCheckPCMessageRestriction(void); + u8 SCGetAspectRatio(void); s8 SCGetDisplayOffsetH(void); u8 SCGetEuRgb60Mode(void); -void SCGetIdleMode(SCIdleMode* mode); +void SCGetIdleMode(SCIdleMode *mode); u8 SCGetLanguage(void); u8 SCGetProgressiveMode(void); u8 SCGetScreenSaverMode(void); diff --git a/src/sdk/RevoEX/nhttp/nhttp.h b/src/sdk/RevoEX/nhttp/nhttp.h new file mode 100644 index 000000000..91251a64f --- /dev/null +++ b/src/sdk/RevoEX/nhttp/nhttp.h @@ -0,0 +1,17 @@ +#pragma once +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int NHTTPGetError(); + +void NHTTPStartup(void *, void *, int); + +void NHTTPCleanupAsync(void *); +int NHTTPCancelConnection(void *); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/src/system/math/StreamChecksum.cpp b/src/system/math/StreamChecksum.cpp index 4575fc665..cb26d013e 100644 --- a/src/system/math/StreamChecksum.cpp +++ b/src/system/math/StreamChecksum.cpp @@ -63,7 +63,7 @@ bool StreamChecksumValidator::Validate() { void StreamChecksumValidator::HandleError(const char *c) { TheDebug << MakeString(c); - ThePlatformMgr.SetDiskError((DiskError)3); + ThePlatformMgr.SetDiskError(kFailedChecksum); } bool StreamChecksumValidator::SetFileChecksum(bool b) { diff --git a/src/system/os/PlatformMgr.h b/src/system/os/PlatformMgr.h index 9b0d13b76..bc961319f 100644 --- a/src/system/os/PlatformMgr.h +++ b/src/system/os/PlatformMgr.h @@ -95,6 +95,7 @@ class PlatformMgr : public MsgSource, public ContentMgr::Callback { bool IsEthernetCableConnected(); void PreInit(); void RegionInit(); + void Init(); void UpdateSigninState(); void SetUserSignedIn(int); void SetUserSignedOut(int); @@ -239,4 +240,7 @@ DECLARE_MESSAGE(PartyMembersChangedMsg, "party_members_changed") END_MESSAGE DECLARE_MESSAGE(EnumerateMessagesCompleteMsg, "enumerate_messages_complete") +END_MESSAGE + +DECLARE_MESSAGE(WiiDiscErrorMsg, "wii_disc_error") END_MESSAGE \ No newline at end of file diff --git a/src/system/os/PlatformMgr_Wii.cpp b/src/system/os/PlatformMgr_Wii.cpp index af0ad9a55..ce8ff4dc1 100644 --- a/src/system/os/PlatformMgr_Wii.cpp +++ b/src/system/os/PlatformMgr_Wii.cpp @@ -4,8 +4,11 @@ #include "os/PlatformMgr.h" #include "os/Joypad_Wii.h" #include "os/CritSec.h" +#include "system/obj/Dir.h" +#include "system/utl/HttpWii.h" #include "meta/Profile.h" #include "meta/WiiProfileMgr.h" +#include "RevoEX/nhttp/nhttp.h" #include "revolution/gx/GXTypes.h" #include "revolution/os/OSReset.h" #include "revolution/os/OSThread.h" @@ -130,6 +133,18 @@ void PlatformMgr::RegionInit() { } } +void PlatformMgr::Init() { + mHomeMenuWii->Init(); + SetName("platform_mgr", ObjectDir::sMainDir); + JoypadSubscribe(this); + SetScreenSaver(true); + TheHttpWii.Init(); + UpdateSigninState(); + mIsOnlineRestricted = SCCheckPCMessageRestriction(); + TheContentMgr->RegisterCallback(this, false); + SOHeapInit(); +} + void PlatformMgr::SetNotifyUILocation(NotifyLocation) {} bool PlatformMgr::IsEthernetCableConnected() { return mEthernetCableConnected; } @@ -338,6 +353,8 @@ void PlatformMgr::ClearNetError() { mHasNetError = 0; } +int PlatformMgr::GetLastNHTTPError() { return NHTTPGetError(); } + int PlatformMgr::GetLastDNSError() { return -gDNSError; } void PlatformMgr::SetConnected(bool connected) { mConnected = connected; } @@ -363,7 +380,30 @@ bool PlatformMgr::OnMsg(const ButtonUpMsg &msg) { return false; } -void PlatformMgr::SetDiskError(DiskError err) {} +void PlatformMgr::SetDiskError(DiskError err) { + if (mDiskError != kFailedChecksum && mDiskError != err) { + mDiskError = err; + if (err == kNoDiskError) { + mDiscErrorMgr->SetDiscError(false); + mDiscErrorMgr->mRetryError = false; + mDiscErrorMgr->mMovieReadError = false; + } else if (err == kDiskError) { + mDiscErrorMgr->SetDiscError(true); + mDiscErrorMgr->mRetryError = true; + } else if (err == kWrongDisk) { + mDiscErrorMgr->SetDiscError(true); + mDiscErrorMgr->mRetryError = false; + } + if (err != kNoDiskError) { + if (mNetworkPlay == false) { + } else { + } + } + if (mDiskError == kFailedChecksum) { + TheDebug.Exit(1, true); + } + } +} void WiiPowerCallback() { gPowerCallback = kQuitShutdown; } void WiiResetCallback() { gPowerCallback = kQuitRestart; } diff --git a/src/system/utl/HttpWii.cpp b/src/system/utl/HttpWii.cpp new file mode 100644 index 000000000..d0cbe3e37 --- /dev/null +++ b/src/system/utl/HttpWii.cpp @@ -0,0 +1,104 @@ +#include "HttpWii.h" +#include "system/os/Debug.h" +#include "system/utl/MemMgr.h" +#include + +HttpWii TheHttpWii; + +void *CommerceEcAlloc(int sz, int al) { + void *r = NULL; + if (sz != 0) + r = _MemAlloc(sz, al); + return r; +} + +void *CommerceEcFree(void *ptr) { + if (ptr == NULL) + return; + _MemFree(ptr); +} + +const char *HttpWii::GetNHTTPErrorString(NHTTPError err) { + if (err == NHTTP_ERROR_SYSTEM) { + return "NHTTP_ERROR_SYSTEM"; + } else if (err < NHTTP_NUM_ERRORS) { + static const char *table[NHTTP_NUM_ERRORS] = { "NHTTP_ERROR_NONE", + "NHTTP_ERROR_ALLOC", + "NHTTP_ERROR_TOOMANYREQ", + "NHTTP_ERROR_SOCKET", + "NHTTP_ERROR_DNS", + "NHTTP_ERROR_CONNECT", + "NHTTP_ERROR_BUFFULL", + "NHTTP_ERROR_HTTPPARSE", + "NHTTP_ERROR_CANCELED", + "NHTTP_ERROR_REVOLUTIONSDK", + "NHTTP_ERROR_REVOLUTIONWIFI", + "NHTTP_ERROR_UNKNOWN", + "NHTTP_ERROR_DNS_PROXY", + "NHTTP_ERROR_CONNECT_PROXY", + "NHTTP_ERROR_SSL", + "NHTTP_ERROR_BUSY" }; + return table[err]; + } else { + TheDebug.Fail(FormatString("unknown NHTTPError! (added recently?)").Str()); + return "unknown (internal error)"; + } +} + +HttpWii::HttpWii() {} +HttpWii::~HttpWii() {} + +void HttpWii::Init() { mDataBuffer = NULL; } + +void HttpWii::Start() { + if (mStatus != 1) { + NHTTPStartup(CommerceEcAlloc, CommerceEcFree, 0x11); + mStatus = 1; + } +} + +void HttpWii::CleanupCallback() { TheHttpWii.mStatus = 0; } + +BOOL gWaitingOnCancelToComplete; + +void HttpWii::Stop() { + if (mStatus == 1) { + CancelAsyncAll(); + mStatus = 2; + gWaitingOnCancelToComplete = false; + } +} + +int HttpWii::GetStatus() { + if (mStatus == 2) { + for (int i = 0; i < NUM_HTTPWII_HANDLES; i++) { + if (mHandles[i] != NULL) { + unsigned long r; + if (CompleteAsync(i, r) == 0) + return mStatus; + } + } + if (gWaitingOnCancelToComplete == false) { + NHTTPCleanupAsync(CleanupCallback); + gWaitingOnCancelToComplete = true; + } + } + return mStatus; +} + +int HttpWii::CancelAsync(int task) { + BOOL r; + if (mHandles[task] == NULL) { + r = false; + } else { + r = (bool)NHTTPCancelConnection(mHandles[task]); + } + return r; +} + +int HttpWii::CancelAsyncAll() { + for (int i = 0; i < NUM_HTTPWII_HANDLES; i++) { + CancelAsync(i); + } + return TRUE; +} diff --git a/src/system/utl/HttpWii.h b/src/system/utl/HttpWii.h new file mode 100644 index 000000000..8b8ee9ac6 --- /dev/null +++ b/src/system/utl/HttpWii.h @@ -0,0 +1,48 @@ +#pragma once +#include "obj/Data.h" +#include "os/Timer.h" + +#define NUM_HTTPWII_HANDLES 10 + +extern "C" { +void *CommerceEcAlloc(int, int); +void *CommerceEcFree(void *); +} + +enum NHTTPError { + NHTTP_NUM_ERRORS = 0x10, + NHTTP_ERROR_SYSTEM = -1 +}; + +class HttpWii { +public: + HttpWii(); + ~HttpWii(); + + void Init(); + void Start(); + void Stop(); + int GetStatus(); + int GetFileAsync(const char *, void *, int); + int CompleteAsync(int, unsigned long &); + int CancelAsync(int task); + int CancelAsyncAll(); + + static void CleanupCallback(); + static const char *GetNHTTPErrorString(NHTTPError err); + + bool mServerVerifySSL; + bool mUseSSL; + bool mUseFileLoad; + char *mRootCA; + unsigned long mCertSize; + DataArray *mServerInfo; + void *mDataBuffer; + int mDataBufferSize; + void *mHandles[NUM_HTTPWII_HANDLES]; + unsigned int mLastReceived[NUM_HTTPWII_HANDLES]; + Timer mTimeout[NUM_HTTPWII_HANDLES]; + int mStatus; // ?? +}; + +extern HttpWii TheHttpWii;