diff --git a/source/ngc/fceugx.cpp b/source/ngc/fceugx.cpp index e45cb37..129272d 100644 --- a/source/ngc/fceugx.cpp +++ b/source/ngc/fceugx.cpp @@ -72,9 +72,6 @@ unsigned char * nesrom = NULL; static void ExitCleanup() { -#ifdef HW_RVL - ShutoffRumble(); -#endif ShutdownAudio(); StopGX(); @@ -94,6 +91,10 @@ static void ExitCleanup() void ExitApp() { +#ifdef HW_RVL + ShutoffRumble(); +#endif + SavePrefs(SILENT); if (romLoaded && !ConfigRequested && GCSettings.AutoSave == 1) diff --git a/source/ngc/filebrowser.cpp b/source/ngc/filebrowser.cpp index a54c117..0e12bf1 100644 --- a/source/ngc/filebrowser.cpp +++ b/source/ngc/filebrowser.cpp @@ -663,7 +663,7 @@ OpenGameList () { int device = GCSettings.LoadMethod; - if(device == DEVICE_AUTO) + if(device == DEVICE_AUTO && strlen(GCSettings.LoadFolder) > 0) device = autoLoadMethod(); // change current dir to roms directory diff --git a/source/ngc/fileop.cpp b/source/ngc/fileop.cpp index deca497..34ef65a 100644 --- a/source/ngc/fileop.cpp +++ b/source/ngc/fileop.cpp @@ -241,7 +241,8 @@ void UnmountAllFAT() static bool MountFAT(int device, int silent) { - bool mounted = true; // assume our disc is already mounted + bool mounted = false; + int retry = 1; char name[10], name2[10]; const DISC_INTERFACE* disc = NULL; @@ -282,20 +283,19 @@ static bool MountFAT(int device, int silent) disc->shutdown(); isMounted[device] = false; } - if(!isMounted[device]) - { - if(!disc->startup()) - mounted = false; - else if(!fatMountSimple(name, disc)) - mounted = false; - } - - if(!mounted && !silent) + + while(retry) { + if(disc->startup() && fatMountSimple(name, disc)) + mounted = true; + + if(mounted || silent) + break; + if(device == DEVICE_SD) - ErrorPrompt("SD card not found!"); + retry = ErrorPromptRetry("SD card not found!"); else - ErrorPrompt("USB drive not found!"); + retry = ErrorPromptRetry("USB drive not found!"); } isMounted[device] = mounted; @@ -320,12 +320,8 @@ void MountAllFAT() ***************************************************************************/ bool MountDVD(bool silent) { - if(isMounted[DEVICE_DVD]) - return true; - - ShowAction("Loading DVD..."); - bool mounted = false; + int retry = 1; if(unmountRequired[DEVICE_DVD]) { @@ -333,19 +329,29 @@ bool MountDVD(bool silent) ISO9660_Unmount(); } - mounted = dvd->isInserted(); - - if(!mounted) + while(retry) { - if(!silent) - ErrorPrompt("No disc inserted!"); - } - else - { - mounted = ISO9660_Mount(); + ShowAction("Loading DVD..."); - if(!mounted && !silent) - ErrorPrompt("Invalid DVD."); + if(!dvd->isInserted()) + { + if(silent) + break; + + retry = ErrorPromptRetry("No disc inserted!"); + } + else if(!ISO9660_Mount()) + { + if(silent) + break; + + retry = ErrorPromptRetry("Invalid DVD."); + } + else + { + mounted = true; + break; + } } CancelAction(); isMounted[DEVICE_DVD] = mounted; @@ -419,8 +425,11 @@ char * StripDevice(char * path) ***************************************************************************/ bool ChangeInterface(int device, bool silent) { + if(isMounted[device]) + return true; + bool mounted = false; - + switch(device) { case DEVICE_SD: @@ -556,7 +565,7 @@ ParseDirectory(bool waitParse) bool mounted = false; ResetBrowser(); // reset browser - + // open the directory while(dirIter == NULL && retry == 1) { @@ -577,14 +586,17 @@ ParseDirectory(bool waitParse) // if we can't open the dir, try higher levels if (dirIter == NULL) { + char * devEnd = strrchr(browser.dir, '/'); + while(!IsDeviceRoot(browser.dir)) { - char * devEnd = strrchr(browser.dir, '/'); + devEnd[0] = 0; // strip slash + devEnd = strrchr(browser.dir, '/'); if(devEnd == NULL) break; - devEnd[0] = 0; // strip remaining file listing + devEnd[1] = 0; // strip remaining file listing dirIter = diropen(browser.dir); if (dirIter) break; @@ -689,11 +701,10 @@ size_t LoadFile (char * rbuffer, char *filepath, size_t length, bool silent) { char zipbuffer[2048]; - size_t size = 0; - size_t readsize = 0; + size_t size = 0, offset = 0, readsize = 0; int retry = 1; int device; - + if(!FindDevice(filepath, &device)) return 0; @@ -715,73 +726,59 @@ LoadFile (char * rbuffer, char *filepath, size_t length, bool silent) else { // open the file - while(!size && retry == 1) + while(!size && retry) { - if(ChangeInterface(device, silent)) + if(!ChangeInterface(device, silent)) + break; + + file = fopen (filepath, "rb"); + + if(!file) { - file = fopen (filepath, "rb"); - - if(file > 0) - { - if(length > 0 && length <= 2048) // do a partial read (eg: to check file header) - { - size = fread (rbuffer, 1, length, file); - } - else // load whole file - { - readsize = fread (zipbuffer, 1, 2048, file); - - if(readsize > 0) - { - if (IsZipFile (zipbuffer)) - { - size = UnZipBuffer ((unsigned char *)rbuffer); // unzip - } - else - { - struct stat fileinfo; - if(fstat(file->_file, &fileinfo) == 0) - { - size = fileinfo.st_size; - - memcpy (rbuffer, zipbuffer, readsize); // copy what we already read - - size_t offset = readsize; - size_t nextread = 0; - while(offset < size) - { - if(size - offset > 4*1024) nextread = 4*1024; - else nextread = size-offset; - ShowProgress ("Loading...", offset, size); - readsize = fread (rbuffer + offset, 1, nextread, file); // read in next chunk - - if(readsize <= 0 || readsize > nextread) - break; // read failure - - if(readsize > 0) - offset += readsize; - } - CancelAction(); - - if(offset != size) // # bytes read doesn't match # expected - size = 0; - } - } - } - } - fclose (file); - } + if(silent) + break; + + retry = ErrorPromptRetry("Error opening file!"); + continue; } - if(!size) + + if(length > 0 && length <= 2048) // do a partial read (eg: to check file header) { - if(!silent) + size = fread (rbuffer, 1, length, file); + } + else // load whole file + { + readsize = fread (zipbuffer, 1, 32, file); + + if(!readsize) { unmountRequired[device] = true; - retry = ErrorPromptRetry("Error loading file!"); + retry = ErrorPromptRetry("Error reading file!"); + continue; + } + + if (IsZipFile (zipbuffer)) + { + size = UnZipBuffer ((unsigned char *)rbuffer); // unzip } else { - retry = 0; + fseeko(file,0,SEEK_END); + size = ftello(file); + fseeko(file,0,SEEK_SET); + + while(!feof(file)) + { + ShowProgress ("Loading...", offset, size); + readsize = fread (rbuffer + offset, 1, 4096, file); // read in next chunk + + if(readsize <= 0) + break; // reading finished (or failed) + + offset += readsize; + } + size = offset; + CancelAction(); } } } @@ -806,6 +803,7 @@ size_t SaveFile (char * buffer, char *filepath, size_t datasize, bool silent) { size_t written = 0; + size_t writesize, nextwrite; int retry = 1; int device; @@ -840,12 +838,11 @@ SaveFile (char * buffer, char *filepath, size_t datasize, bool silent) { file = fopen (filepath, "wb"); - if (file > 0) + if (file) { - size_t writesize, nextwrite; while(written < datasize) { - if(datasize - written > 4*1024) nextwrite=4*1024; + if(datasize - written > 4096) nextwrite=4096; else nextwrite = datasize-written; writesize = fwrite (buffer+written, 1, nextwrite, file); if(writesize != nextwrite) break; // write failure diff --git a/source/ngc/menu.cpp b/source/ngc/menu.cpp index 572f9bc..3cbecfe 100644 --- a/source/ngc/menu.cpp +++ b/source/ngc/menu.cpp @@ -1029,6 +1029,7 @@ static int MenuGameSelection() ExitRequested = 1; } + HaltParseThread(); // halt parsing HaltGui(); mainWindow->Remove(&titleTxt); mainWindow->Remove(&buttonWindow); diff --git a/source/ngc/networkop.cpp b/source/ngc/networkop.cpp index cdcd396..df47fc3 100644 --- a/source/ngc/networkop.cpp +++ b/source/ngc/networkop.cpp @@ -185,9 +185,14 @@ void InitializeNetwork(bool silent) { // stop if we're already initialized, or if auto-init has failed before // in which case, manual initialization is required - if(networkInit || !autoNetworkInit) + if(networkInit || (silent && !autoNetworkInit)) return; + int retry = 1; + char ip[16]; + char msg[150]; + s32 initResult; + if(!silent) ShowAction ("Initializing network..."); @@ -198,25 +203,25 @@ void InitializeNetwork(bool silent) { inNetworkInit = true; - char ip[16]; - s32 initResult = if_config(ip, NULL, NULL, true); - - if(initResult == 0) + while(retry) { - networkInit = true; - } - else - { - // do not automatically attempt a reconnection - autoNetworkInit = false; - if(!silent) - { - char msg[150]; - sprintf(msg, "Unable to initialize network (Error #: %i)", initResult); - ErrorPrompt(msg); - } + ShowAction ("Initializing network..."); + + initResult = if_config(ip, NULL, NULL, true); + + if(initResult == 0) + networkInit = true; + + if(networkInit || silent) + break; + + sprintf(msg, "Unable to initialize network (Error #: %i)", initResult); + retry = ErrorPromptRetry(msg); } + + // do not automatically attempt a reconnection + autoNetworkInit = false; inNetworkInit = false; } if(!silent) @@ -228,7 +233,6 @@ void CloseShare() if(networkShareInit) smbClose("smb"); networkShareInit = false; - networkInit = false; // trigger a network reinit } /**************************************************************************** @@ -243,6 +247,7 @@ ConnectShare (bool silent) return false; #endif + int retry = 1; int chkS = (strlen(GCSettings.smbshare) > 0) ? 0:1; int chkI = (strlen(GCSettings.smbip) > 0) ? 0:1; @@ -272,27 +277,26 @@ ConnectShare (bool silent) if(!networkInit) InitializeNetwork(silent); - if(networkInit) + if(!networkInit) + return false; + + while(retry) { - if(!networkShareInit) - { - if(!silent) - ShowAction ("Connecting to network share..."); + if(!silent) + ShowAction ("Connecting to network share..."); + + if(smbInit(GCSettings.smbuser, GCSettings.smbpwd, GCSettings.smbshare, GCSettings.smbip)) + networkShareInit = true; - if(smbInit(GCSettings.smbuser, GCSettings.smbpwd, - GCSettings.smbshare, GCSettings.smbip)) - { - networkShareInit = true; - } + if(networkShareInit || silent) + break; - if(!silent) - CancelAction(); - } - - if(!networkShareInit && !silent) - ErrorPrompt("Failed to connect to network share."); + retry = ErrorPromptRetry("Failed to connect to network share."); } + if(!silent) + CancelAction(); + return networkShareInit; } diff --git a/source/ngc/preferences.cpp b/source/ngc/preferences.cpp index fdc7968..6f607e1 100644 --- a/source/ngc/preferences.cpp +++ b/source/ngc/preferences.cpp @@ -355,7 +355,7 @@ SavePrefs (bool silent) int datasize; int offset = 0; int device = 0; - + if(prefpath[0] != 0) { strcpy(filepath, prefpath); @@ -368,17 +368,17 @@ SavePrefs (bool silent) } else { - device = autoLoadMethod(); - + device = autoSaveMethod(silent); + if(device == 0) return false; if(device == DEVICE_MC_SLOTA || device == DEVICE_MC_SLOTB) sprintf(filepath, "%s%s", pathPrefix[device], PREF_FILE_NAME); else - sprintf(filepath, "%sfceugx/%s", pathPrefix[device], PREF_FILE_NAME); + sprintf(filepath, "%s%s/%s", pathPrefix[device], APPFOLDER, PREF_FILE_NAME); } - + if(device == 0) return false; @@ -455,7 +455,7 @@ bool LoadPrefs() bool prefFound = false; char filepath[4][MAXPATHLEN]; int numDevices; - + #ifdef HW_RVL numDevices = 3; sprintf(filepath[0], "%s/%s", appPath, PREF_FILE_NAME);