From 28e304aeb5684d9a69e55dce57de6e7013805996 Mon Sep 17 00:00:00 2001 From: libertyernie Date: Sat, 28 Jul 2018 15:45:29 -0500 Subject: [PATCH] Fix compilation errors with latest libOGC/devkitPPC (Partially ported from snes9xgx: https://github.com/dborth/snes9xgx/commit/a4177458176bfdf2881aebf3204c0a4fb5083640) --- source/fceugx.cpp | 11 +- source/fceugx.h | 1 + source/fceultra/boards/emu2413.h | 12 +- source/fceultra/cart.cpp | 2 +- source/fceultra/cart.h | 26 +- source/filebrowser.cpp | 18 +- source/fileop.cpp | 10 +- source/gcaudio.cpp | 2 +- source/gcaudio.h | 2 +- source/gcvideo.cpp | 2 +- source/networkop.cpp | 800 +++++++++++++++---------------- source/preferences.cpp | 6 +- 12 files changed, 448 insertions(+), 444 deletions(-) diff --git a/source/fceugx.cpp b/source/fceugx.cpp index 3054953..eeac17c 100644 --- a/source/fceugx.cpp +++ b/source/fceugx.cpp @@ -47,15 +47,16 @@ #include "fceultra/types.h" -void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count); -void FCEUD_UpdatePulfrich(uint8 *XBuf, int32 *Buffer, int Count); -void FCEUD_UpdateLeft(uint8 *XBuf, int32 *Buffer, int Count); -void FCEUD_UpdateRight(uint8 *XBuf, int32 *Buffer, int Count); +void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int32 Count); +void FCEUD_UpdatePulfrich(uint8 *XBuf, int32 *Buffer, int32 Count); +void FCEUD_UpdateLeft(uint8 *XBuf, int32 *Buffer, int32 Count); +void FCEUD_UpdateRight(uint8 *XBuf, int32 *Buffer, int32 Count); extern "C" { #ifdef USE_VM #include "utils/vm/vm.h" #endif +extern char* strcasestr(const char *, const char *); extern void __exception_setreload(int t); } @@ -292,7 +293,7 @@ bool SaneIOS(u32 ios) static bool gecko = false; static mutex_t gecko_mutex = 0; -static ssize_t __out_write(struct _reent *r, int fd, const char *ptr, size_t len) +static ssize_t __out_write(struct _reent *r, void* fd, const char *ptr, size_t len) { if (!gecko || len == 0) return len; diff --git a/source/fceugx.h b/source/fceugx.h index e1f45fb..61fa546 100644 --- a/source/fceugx.h +++ b/source/fceugx.h @@ -12,6 +12,7 @@ #ifndef _FCEUGX_H_ #define _FCEUGX_H_ +#define MAXPATHLEN 1024 #include #include "fceultra/driver.h" diff --git a/source/fceultra/boards/emu2413.h b/source/fceultra/boards/emu2413.h index 463f788..2489c1e 100644 --- a/source/fceultra/boards/emu2413.h +++ b/source/fceultra/boards/emu2413.h @@ -17,14 +17,14 @@ extern "C" { #endif -typedef unsigned char uint8 ; -typedef signed char int8 ; +typedef uint8_t uint8 ; +typedef int8_t int8 ; -typedef unsigned short uint16 ; -typedef signed short int16 ; +typedef uint16_t uint16 ; +typedef int16_t int16 ; -typedef unsigned int uint32 ; -typedef signed int int32 ; +typedef uint32_t uint32 ; +typedef int32_t int32 ; #define PI 3.14159265358979323846 diff --git a/source/fceultra/cart.cpp b/source/fceultra/cart.cpp index 8ebc00e..ff2f93b 100644 --- a/source/fceultra/cart.cpp +++ b/source/fceultra/cart.cpp @@ -240,7 +240,7 @@ void setchr2r(int r, uint32 A, uint32 V) { PPUCHRRAM &= ~(3 << (A >> 10)); } -void setchr4r(int r, unsigned int A, unsigned int V) { +void setchr4r(int r, uint32 A, uint32 V) { if (!CHRptr[r]) return; FCEUPPU_LineUpdate(); V &= CHRmask4[r]; diff --git a/source/fceultra/cart.h b/source/fceultra/cart.h index 9d3b0b8..f0dba59 100644 --- a/source/fceultra/cart.h +++ b/source/fceultra/cart.h @@ -66,21 +66,21 @@ void setprg8(uint32 A, uint32 V); void setprg16(uint32 A, uint32 V); void setprg32(uint32 A, uint32 V); -void setprg2r(int r, unsigned int A, unsigned int V); -void setprg4r(int r, unsigned int A, unsigned int V); -void setprg8r(int r, unsigned int A, unsigned int V); -void setprg16r(int r, unsigned int A, unsigned int V); -void setprg32r(int r, unsigned int A, unsigned int V); +void setprg2r(int r, uint32 A, uint32 V); +void setprg4r(int r, uint32 A, uint32 V); +void setprg8r(int r, uint32 A, uint32 V); +void setprg16r(int r, uint32 A, uint32 V); +void setprg32r(int r, uint32 A, uint32 V); -void setchr1r(int r, unsigned int A, unsigned int V); -void setchr2r(int r, unsigned int A, unsigned int V); -void setchr4r(int r, unsigned int A, unsigned int V); -void setchr8r(int r, unsigned int V); +void setchr1r(int r, uint32 A, uint32 V); +void setchr2r(int r, uint32 A, uint32 V); +void setchr4r(int r, uint32 A, uint32 V); +void setchr8r(int r, uint32 V); -void setchr1(unsigned int A, unsigned int V); -void setchr2(unsigned int A, unsigned int V); -void setchr4(unsigned int A, unsigned int V); -void setchr8(unsigned int V); +void setchr1(uint32 A, uint32 V); +void setchr2(uint32 A, uint32 V); +void setchr4(uint32 A, uint32 V); +void setchr8(uint32 V); void setmirror(int t); void setmirrorw(int a, int b, int c, int d); diff --git a/source/filebrowser.cpp b/source/filebrowser.cpp index f075d5a..ad06ad5 100644 --- a/source/filebrowser.cpp +++ b/source/filebrowser.cpp @@ -331,7 +331,7 @@ int FileSortCallback(const void *f1, const void *f2) if(((BROWSERENTRY *)f1)->isdir && !(((BROWSERENTRY *)f2)->isdir)) return -1; if(!(((BROWSERENTRY *)f1)->isdir) && ((BROWSERENTRY *)f2)->isdir) return 1; - return stricmp(((BROWSERENTRY *)f1)->filename, ((BROWSERENTRY *)f2)->filename); + return strcasecmp(((BROWSERENTRY *)f1)->filename, ((BROWSERENTRY *)f2)->filename); } /**************************************************************************** @@ -366,7 +366,7 @@ static bool IsValidROM() char * zippedFilename = NULL; - if(stricmp(p, ".zip") == 0 && !inSz) + if(strcasecmp(p, ".zip") == 0 && !inSz) { // we need to check the file extension of the first file in the archive zippedFilename = GetFirstZipFilename (); @@ -380,12 +380,12 @@ static bool IsValidROM() if(p != NULL) { if ( - stricmp(p, ".nes") == 0 || - stricmp(p, ".fds") == 0 || - stricmp(p, ".nsf") == 0 || - stricmp(p, ".unf") == 0 || - stricmp(p, ".nez") == 0 || - stricmp(p, ".unif") == 0 + strcasecmp(p, ".nes") == 0 || + strcasecmp(p, ".fds") == 0 || + strcasecmp(p, ".nsf") == 0 || + strcasecmp(p, ".unf") == 0 || + strcasecmp(p, ".nez") == 0 || + strcasecmp(p, ".unif") == 0 ) { if(zippedFilename) free(zippedFilename); @@ -411,7 +411,7 @@ bool IsSz() char * p = strrchr(browserList[browser.selIndex].filename, '.'); if (p != NULL) - if(stricmp(p, ".7z") == 0) + if(strcasecmp(p, ".7z") == 0) return true; } return false; diff --git a/source/fileop.cpp b/source/fileop.cpp index dff271e..f292127 100644 --- a/source/fileop.cpp +++ b/source/fileop.cpp @@ -566,11 +566,11 @@ static bool ParseDirEntries() if(ext == NULL) continue; - if( stricmp(ext, "nes") != 0 && stricmp(ext, "fds") != 0 && - stricmp(ext, "nsf") != 0 && stricmp(ext, "unf") != 0 && - stricmp(ext, "nez") != 0 && stricmp(ext, "unif") != 0 && - stricmp(ext, "gba") != 0 && - stricmp(ext, "zip") != 0 && stricmp(ext, "7z") != 0) + if( strcasecmp(ext, "nes") != 0 && strcasecmp(ext, "fds") != 0 && + strcasecmp(ext, "nsf") != 0 && strcasecmp(ext, "unf") != 0 && + strcasecmp(ext, "nez") != 0 && strcasecmp(ext, "unif") != 0 && + strcasecmp(ext, "gba") != 0 && + strcasecmp(ext, "zip") != 0 && strcasecmp(ext, "7z") != 0) continue; } } diff --git a/source/gcaudio.cpp b/source/gcaudio.cpp index a41d751..b5b5f47 100644 --- a/source/gcaudio.cpp +++ b/source/gcaudio.cpp @@ -156,7 +156,7 @@ void ShutdownAudio() * Puts incoming mono samples into mixbuffer * Splits mono samples into two channels (stereo) ****************************************************************************/ -void PlaySound( int *Buffer, int count ) +void PlaySound( int32 *Buffer, int count ) { int i; u16 sample; diff --git a/source/gcaudio.h b/source/gcaudio.h index d43523d..5ea3247 100644 --- a/source/gcaudio.h +++ b/source/gcaudio.h @@ -12,7 +12,7 @@ void InitialiseAudio(); void ResetAudio(); -void PlaySound( int *Buffer, int samples ); +void PlaySound( int32 *Buffer, int samples ); void SwitchAudioMode(int mode); void ShutdownAudio(); void UpdateSampleRate(int rate); diff --git a/source/gcvideo.cpp b/source/gcvideo.cpp index 2126517..639b71c 100644 --- a/source/gcvideo.cpp +++ b/source/gcvideo.cpp @@ -34,7 +34,7 @@ int FDSSwitchRequested; /*** External 2D Video ***/ /*** 2D Video Globals ***/ GXRModeObj *vmode = NULL; // Graphics Mode Object -static unsigned int *xfb[2] = { NULL, NULL }; // Framebuffers +static u32 *xfb[2] = { NULL, NULL }; // Framebuffers static int whichfb = 0; // Frame buffer toggle int screenheight = 480; int screenwidth = 640; diff --git a/source/networkop.cpp b/source/networkop.cpp index 27aaa65..f668e78 100644 --- a/source/networkop.cpp +++ b/source/networkop.cpp @@ -1,400 +1,400 @@ -/**************************************************************************** - * FCE Ultra - * Nintendo Wii/Gamecube Port - * - * Tantric December 2008 - * - * networkop.cpp - * - * Network and SMB support routines - ****************************************************************************/ - -#include -#include -#include -#include -#include -#include - -#include "fceugx.h" -#include "menu.h" -#include "fileop.h" -#include "filebrowser.h" -#include "utils/http.h" -#include "utils/unzip/unzip.h" -#include "utils/unzip/miniunz.h" - -static bool networkInit = false; -static bool networkShareInit = false; -char wiiIP[16] = { 0 }; - -#ifdef HW_RVL -static int netHalt = 0; -static bool updateChecked = false; // true if checked for app update -static char updateURL[128]; // URL of app update -bool updateFound = false; // true if an app update was found - -/**************************************************************************** - * UpdateCheck - * Checks for an update for the application - ***************************************************************************/ - -void UpdateCheck() -{ - // we only check for an update if we have internet + SD/USB - if(updateChecked || !networkInit) - return; - - if(!isMounted[DEVICE_SD] && !isMounted[DEVICE_USB]) - return; - - updateChecked = true; - u8 tmpbuffer[256]; - - if (http_request("http://www.wiimc.org/files/fceugx-update.xml", NULL, tmpbuffer, 256, SILENT) <= 0) - return; - - mxml_node_t *xml; - mxml_node_t *item; - - xml = mxmlLoadString(NULL, (char *)tmpbuffer, MXML_TEXT_CALLBACK); - - if(!xml) - return; - - // check settings version - item = mxmlFindElement(xml, xml, "app", "version", NULL, MXML_DESCEND); - if(item) // a version entry exists - { - const char * version = mxmlElementGetAttr(item, "version"); - - if(version && strlen(version) == 5) - { - int verMajor = version[0] - '0'; - int verMinor = version[2] - '0'; - int verPoint = version[4] - '0'; - int curMajor = APPVERSION[0] - '0'; - int curMinor = APPVERSION[2] - '0'; - int curPoint = APPVERSION[4] - '0'; - - // check that the versioning is valid and is a newer version - if((verMajor >= 0 && verMajor <= 9 && - verMinor >= 0 && verMinor <= 9 && - verPoint >= 0 && verPoint <= 9) && - (verMajor > curMajor || - (verMajor == curMajor && verMinor > curMinor) || - (verMajor == curMajor && verMinor == curMinor && verPoint > curPoint))) - { - item = mxmlFindElement(xml, xml, "file", NULL, NULL, MXML_DESCEND); - if(item) - { - const char * tmp = mxmlElementGetAttr(item, "url"); - if(tmp) - { - snprintf(updateURL, 128, "%s", tmp); - updateFound = true; - } - } - } - } - } - mxmlDelete(xml); -} - -static bool unzipArchive(char * zipfilepath, char * unzipfolderpath) -{ - unzFile uf = unzOpen(zipfilepath); - if (uf==NULL) - return false; - - if(chdir(unzipfolderpath)) // can't access dir - { - makedir(unzipfolderpath); // attempt to make dir - if(chdir(unzipfolderpath)) // still can't access dir - return false; - } - - extractZip(uf,0,1,0); - - unzCloseCurrentFile(uf); - return true; -} - -bool DownloadUpdate() -{ - bool result = false; - - if(updateURL[0] == 0 || appPath[0] == 0 || !ChangeInterface(appPath, NOTSILENT)) - { - ErrorPrompt("Update failed!"); - updateFound = false; // updating is finished (successful or not!) - return false; - } - - // stop checking if devices were removed/inserted - // since we're saving a file - HaltDeviceThread(); - - int device; - FindDevice(appPath, &device); - - char updateFile[50]; - sprintf(updateFile, "%s%s Update.zip", pathPrefix[device], APPNAME); - - FILE * hfile = fopen (updateFile, "wb"); - - if (hfile) - { - if(http_request(updateURL, hfile, NULL, (1024*1024*10), NOTSILENT) > 0) - { - fclose (hfile); - result = unzipArchive(updateFile, (char *)pathPrefix[device]); - } - else - { - fclose (hfile); - } - remove(updateFile); // delete update file - } - - // go back to checking if devices were inserted/removed - ResumeDeviceThread(); - - if(result) - InfoPrompt("Update successful!"); - else - ErrorPrompt("Update failed!"); - - updateFound = false; // updating is finished (successful or not!) - return result; -} - -/**************************************************************************** - * InitializeNetwork - * Initializes the Wii/GameCube network interface - ***************************************************************************/ - -static lwp_t networkthread = LWP_THREAD_NULL; -static u8 netstack[32768] ATTRIBUTE_ALIGN (32); - -static void * netcb (void *arg) -{ - s32 res=-1; - int retry; - int wait; - static bool prevInit = false; - - while(netHalt != 2) - { - retry = 5; - - while (retry>0 && (netHalt != 2)) - { - if(prevInit) - { - int i; - net_deinit(); - for(i=0; i < 400 && (netHalt != 2); i++) // 10 seconds to try to reset - { - res = net_get_status(); - if(res != -EBUSY) // trying to init net so we can't kill the net - { - usleep(2000); - net_wc24cleanup(); //kill the net - prevInit=false; // net_wc24cleanup is called only once - usleep(20000); - break; - } - usleep(20000); - } - } - - usleep(2000); - res = net_init_async(NULL, NULL); - - if(res != 0) - { - sleep(1); - retry--; - continue; - } - - res = net_get_status(); - wait = 400; // only wait 8 sec - while (res == -EBUSY && wait > 0 && (netHalt != 2)) - { - usleep(20000); - res = net_get_status(); - wait--; - } - - if(res==0) break; - retry--; - usleep(2000); - } - if (res == 0) - { - struct in_addr hostip; - hostip.s_addr = net_gethostip(); - if (hostip.s_addr) - { - strcpy(wiiIP, inet_ntoa(hostip)); - networkInit = true; - prevInit = true; - } - } - if(netHalt != 2) LWP_SuspendThread(networkthread); - } - return NULL; -} - -/**************************************************************************** - * StartNetworkThread - * - * Signals the network thread to resume, or creates a new thread - ***************************************************************************/ -void StartNetworkThread() -{ - netHalt = 0; - - if(networkthread == LWP_THREAD_NULL) - LWP_CreateThread(&networkthread, netcb, NULL, netstack, 8192, 40); - else - LWP_ResumeThread(networkthread); -} - -/**************************************************************************** - * StopNetworkThread - * - * Signals the network thread to stop - ***************************************************************************/ -void StopNetworkThread() -{ - if(networkthread == LWP_THREAD_NULL || !LWP_ThreadIsSuspended(networkthread)) - return; - - netHalt = 2; - LWP_ResumeThread(networkthread); - - // wait for thread to finish - LWP_JoinThread(networkthread, NULL); - networkthread = LWP_THREAD_NULL; -} - -#endif - -bool InitializeNetwork(bool silent) -{ -#ifdef HW_RVL - StopNetworkThread(); - - if(networkInit && net_gethostip() > 0) - return true; - - networkInit = false; -#else - if(networkInit) - return true; -#endif - - int retry = 1; - - while(retry) - { - ShowAction("Initializing network..."); - -#ifdef HW_RVL - u64 start = gettime(); - StartNetworkThread(); - - while (!LWP_ThreadIsSuspended(networkthread)) - { - usleep(50 * 1000); - - if(diff_sec(start, gettime()) > 10) // wait for 10 seconds max for net init - break; - } -#else - networkInit = !(if_config(wiiIP, NULL, NULL, true) < 0); -#endif - - CancelAction(); - - if(networkInit || silent) - break; - - retry = ErrorPromptRetry("Unable to initialize network!"); -#ifdef HW_RVL - if(networkInit && net_gethostip() > 0) -#else - if(networkInit) -#endif - return true; - } - return networkInit; -} - -void CloseShare() -{ - if(networkShareInit) - smbClose("smb"); - networkShareInit = false; - isMounted[DEVICE_SMB] = false; -} - -/**************************************************************************** - * Mount SMB Share - ****************************************************************************/ - -bool -ConnectShare (bool silent) -{ - if(!InitializeNetwork(silent)) - return false; - - if(networkShareInit) - return true; - - int retry = 1; - int chkS = (strlen(GCSettings.smbshare) > 0) ? 0:1; - int chkI = (strlen(GCSettings.smbip) > 0) ? 0:1; - - // check that all parameters have been set - if(chkS + chkI > 0) - { - if(!silent) - { - char msg[50]; - char msg2[100]; - if(chkS + chkI > 1) // more than one thing is wrong - sprintf(msg, "Check settings.xml."); - else if(chkS) - sprintf(msg, "Share name is blank."); - else if(chkI) - sprintf(msg, "Share IP is blank."); - - sprintf(msg2, "Invalid network settings - %s", msg); - ErrorPrompt(msg2); - } - return false; - } - - while(retry) - { - if(!silent) - ShowAction ("Connecting to network share..."); - - if(smbInit(GCSettings.smbuser, GCSettings.smbpwd, GCSettings.smbshare, GCSettings.smbip)) - networkShareInit = true; - - if(networkShareInit || silent) - break; - - retry = ErrorPromptRetry("Failed to connect to network share."); - } - - if(!silent) - CancelAction(); - - return networkShareInit; -} +/**************************************************************************** + * FCE Ultra + * Nintendo Wii/Gamecube Port + * + * Tantric December 2008 + * + * networkop.cpp + * + * Network and SMB support routines + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "fceugx.h" +#include "menu.h" +#include "fileop.h" +#include "filebrowser.h" +#include "utils/http.h" +#include "utils/unzip/unzip.h" +#include "utils/unzip/miniunz.h" + +static bool networkInit = false; +static bool networkShareInit = false; +char wiiIP[16] = { 0 }; + +#ifdef HW_RVL +static int netHalt = 0; +static bool updateChecked = false; // true if checked for app update +static char updateURL[128]; // URL of app update +bool updateFound = false; // true if an app update was found + +/**************************************************************************** + * UpdateCheck + * Checks for an update for the application + ***************************************************************************/ + +void UpdateCheck() +{ + // we only check for an update if we have internet + SD/USB + if(updateChecked || !networkInit) + return; + + if(!isMounted[DEVICE_SD] && !isMounted[DEVICE_USB]) + return; + + updateChecked = true; + u8 tmpbuffer[256]; + + if (http_request("http://www.wiimc.org/files/fceugx-update.xml", NULL, tmpbuffer, 256, SILENT) <= 0) + return; + + mxml_node_t *xml; + mxml_node_t *item; + + xml = mxmlLoadString(NULL, (char *)tmpbuffer, MXML_TEXT_CALLBACK); + + if(!xml) + return; + + // check settings version + item = mxmlFindElement(xml, xml, "app", "version", NULL, MXML_DESCEND); + if(item) // a version entry exists + { + const char * version = mxmlElementGetAttr(item, "version"); + + if(version && strlen(version) == 5) + { + int verMajor = version[0] - '0'; + int verMinor = version[2] - '0'; + int verPoint = version[4] - '0'; + int curMajor = APPVERSION[0] - '0'; + int curMinor = APPVERSION[2] - '0'; + int curPoint = APPVERSION[4] - '0'; + + // check that the versioning is valid and is a newer version + if((verMajor >= 0 && verMajor <= 9 && + verMinor >= 0 && verMinor <= 9 && + verPoint >= 0 && verPoint <= 9) && + (verMajor > curMajor || + (verMajor == curMajor && verMinor > curMinor) || + (verMajor == curMajor && verMinor == curMinor && verPoint > curPoint))) + { + item = mxmlFindElement(xml, xml, "file", NULL, NULL, MXML_DESCEND); + if(item) + { + const char * tmp = mxmlElementGetAttr(item, "url"); + if(tmp) + { + snprintf(updateURL, 128, "%s", tmp); + updateFound = true; + } + } + } + } + } + mxmlDelete(xml); +} + +static bool unzipArchive(char * zipfilepath, char * unzipfolderpath) +{ + unzFile uf = unzOpen(zipfilepath); + if (uf==NULL) + return false; + + if(chdir(unzipfolderpath)) // can't access dir + { + makedir(unzipfolderpath); // attempt to make dir + if(chdir(unzipfolderpath)) // still can't access dir + return false; + } + + extractZip(uf,0,1,0); + + unzCloseCurrentFile(uf); + return true; +} + +bool DownloadUpdate() +{ + bool result = false; + + if(updateURL[0] == 0 || appPath[0] == 0 || !ChangeInterface(appPath, NOTSILENT)) + { + ErrorPrompt("Update failed!"); + updateFound = false; // updating is finished (successful or not!) + return false; + } + + // stop checking if devices were removed/inserted + // since we're saving a file + HaltDeviceThread(); + + int device; + FindDevice(appPath, &device); + + char updateFile[50]; + sprintf(updateFile, "%s%s Update.zip", pathPrefix[device], APPNAME); + + FILE * hfile = fopen (updateFile, "wb"); + + if (hfile) + { + if(http_request(updateURL, hfile, NULL, (1024*1024*10), NOTSILENT) > 0) + { + fclose (hfile); + result = unzipArchive(updateFile, (char *)pathPrefix[device]); + } + else + { + fclose (hfile); + } + remove(updateFile); // delete update file + } + + // go back to checking if devices were inserted/removed + ResumeDeviceThread(); + + if(result) + InfoPrompt("Update successful!"); + else + ErrorPrompt("Update failed!"); + + updateFound = false; // updating is finished (successful or not!) + return result; +} + +/**************************************************************************** + * InitializeNetwork + * Initializes the Wii/GameCube network interface + ***************************************************************************/ + +static lwp_t networkthread = LWP_THREAD_NULL; +static u8 netstack[32768] ATTRIBUTE_ALIGN (32); + +static void * netcb (void *arg) +{ + s32 res=-1; + int retry; + int wait; + static bool prevInit = false; + + while(netHalt != 2) + { + retry = 5; + + while (retry>0 && (netHalt != 2)) + { + if(prevInit) + { + int i; + net_deinit(); + for(i=0; i < 400 && (netHalt != 2); i++) // 10 seconds to try to reset + { + res = net_get_status(); + if(res != -EBUSY) // trying to init net so we can't kill the net + { + usleep(2000); + net_wc24cleanup(); //kill the net + prevInit=false; // net_wc24cleanup is called only once + usleep(20000); + break; + } + usleep(20000); + } + } + + usleep(2000); + res = net_init_async(NULL, NULL); + + if(res != 0) + { + sleep(1); + retry--; + continue; + } + + res = net_get_status(); + wait = 400; // only wait 8 sec + while (res == -EBUSY && wait > 0 && (netHalt != 2)) + { + usleep(20000); + res = net_get_status(); + wait--; + } + + if(res==0) break; + retry--; + usleep(2000); + } + if (res == 0) + { + struct in_addr hostip; + hostip.s_addr = net_gethostip(); + if (hostip.s_addr) + { + strcpy(wiiIP, inet_ntoa(hostip)); + networkInit = true; + prevInit = true; + } + } + if(netHalt != 2) LWP_SuspendThread(networkthread); + } + return NULL; +} + +/**************************************************************************** + * StartNetworkThread + * + * Signals the network thread to resume, or creates a new thread + ***************************************************************************/ +void StartNetworkThread() +{ + netHalt = 0; + + if(networkthread == LWP_THREAD_NULL) + LWP_CreateThread(&networkthread, netcb, NULL, netstack, 8192, 40); + else + LWP_ResumeThread(networkthread); +} + +/**************************************************************************** + * StopNetworkThread + * + * Signals the network thread to stop + ***************************************************************************/ +void StopNetworkThread() +{ + if(networkthread == LWP_THREAD_NULL || !LWP_ThreadIsSuspended(networkthread)) + return; + + netHalt = 2; + LWP_ResumeThread(networkthread); + + // wait for thread to finish + LWP_JoinThread(networkthread, NULL); + networkthread = LWP_THREAD_NULL; +} + +#endif + +bool InitializeNetwork(bool silent) +{ +#ifdef HW_RVL + StopNetworkThread(); + + if(networkInit && net_gethostip() > 0) + return true; + + networkInit = false; +#else + if(networkInit) + return true; +#endif + + int retry = 1; + + while(retry) + { + ShowAction("Initializing network..."); + +#ifdef HW_RVL + u64 start = gettime(); + StartNetworkThread(); + + while (!LWP_ThreadIsSuspended(networkthread)) + { + usleep(50 * 1000); + + if(diff_sec(start, gettime()) > 10) // wait for 10 seconds max for net init + break; + } +#else + networkInit = !(if_config(wiiIP, NULL, NULL, true, 10) < 0); +#endif + + CancelAction(); + + if(networkInit || silent) + break; + + retry = ErrorPromptRetry("Unable to initialize network!"); +#ifdef HW_RVL + if(networkInit && net_gethostip() > 0) +#else + if(networkInit) +#endif + return true; + } + return networkInit; +} + +void CloseShare() +{ + if(networkShareInit) + smbClose("smb"); + networkShareInit = false; + isMounted[DEVICE_SMB] = false; +} + +/**************************************************************************** + * Mount SMB Share + ****************************************************************************/ + +bool +ConnectShare (bool silent) +{ + if(!InitializeNetwork(silent)) + return false; + + if(networkShareInit) + return true; + + int retry = 1; + int chkS = (strlen(GCSettings.smbshare) > 0) ? 0:1; + int chkI = (strlen(GCSettings.smbip) > 0) ? 0:1; + + // check that all parameters have been set + if(chkS + chkI > 0) + { + if(!silent) + { + char msg[50]; + char msg2[100]; + if(chkS + chkI > 1) // more than one thing is wrong + sprintf(msg, "Check settings.xml."); + else if(chkS) + sprintf(msg, "Share name is blank."); + else if(chkI) + sprintf(msg, "Share IP is blank."); + + sprintf(msg2, "Invalid network settings - %s", msg); + ErrorPrompt(msg2); + } + return false; + } + + while(retry) + { + if(!silent) + ShowAction ("Connecting to network share..."); + + if(smbInit(GCSettings.smbuser, GCSettings.smbpwd, GCSettings.smbshare, GCSettings.smbip)) + networkShareInit = true; + + if(networkShareInit || silent) + break; + + retry = ErrorPromptRetry("Failed to connect to network share."); + } + + if(!silent) + CancelAction(); + + return networkShareInit; +} diff --git a/source/preferences.cpp b/source/preferences.cpp index cb2e8fe..7766f3d 100644 --- a/source/preferences.cpp +++ b/source/preferences.cpp @@ -65,7 +65,7 @@ static void createXMLSetting(const char * name, const char * description, const mxmlElementSetAttr(item, "description", description); } -static void createXMLController(unsigned int controller[], const char * name, const char * description) +static void createXMLController(u32 controller[], const char * name, const char * description) { item = mxmlNewElement(section, "controller"); mxmlElementSetAttr(item, "name", name); @@ -154,7 +154,9 @@ preparePrefsData () createXMLSection("Menu", "Menu Settings"); +#ifdef HW_RVL createXMLSetting("WiimoteOrientation", "Wiimote Orientation", toStr(GCSettings.WiimoteOrientation)); +#endif createXMLSetting("ExitAction", "Exit Action", toStr(GCSettings.ExitAction)); createXMLSetting("MusicVolume", "Music Volume", toStr(GCSettings.MusicVolume)); createXMLSetting("SFXVolume", "Sound Effects Volume", toStr(GCSettings.SFXVolume)); @@ -225,7 +227,7 @@ static void loadXMLSetting(float * var, const char * name) * Load XML elements into variables for a controller mapping ***************************************************************************/ -static void loadXMLController(unsigned int controller[], const char * name) +static void loadXMLController(u32 controller[], const char * name) { item = mxmlFindElement(xml, xml, "controller", "name", name, MXML_DESCEND);