diff --git a/source/ngc/dvd.cpp b/source/ngc/dvd.cpp index 3e383c4..9f0be17 100644 --- a/source/ngc/dvd.cpp +++ b/source/ngc/dvd.cpp @@ -23,10 +23,11 @@ extern "C" { } #endif +#include "snes9xGX.h" #include "menu.h" #include "gcunzip.h" #include "filebrowser.h" -#include "snes9xGX.h" +#include "fileop.h" #define MAXDVDFILES 2000 @@ -502,7 +503,7 @@ getentry (int entrycount, unsigned char dvdbuffer[]) * The return value is number of files collected, or -1 on failure. ***************************************************************************/ int -ParseDVDdirectory () +ParseDVDdirectory (bool change) { int pdlength; u64 pdoffset; @@ -513,6 +514,9 @@ ParseDVDdirectory () // reset browser ResetBrowser(); + + if(change && !ChangeInterface(METHOD_DVD, NOTSILENT)) + return 0; pdoffset = rdoffset = dvddir; pdlength = dvddirlength; @@ -601,7 +605,7 @@ static bool SwitchDVDFolderR(char * dir, int maxDepth) if(browserList[dirindex].isdir) // only parse directories { UpdateDirName(METHOD_DVD); - ParseDVDdirectory(); + ParseDVDdirectory(false); } else { @@ -636,7 +640,7 @@ bool SwitchDVDFolder(char origdir[]) dvddir = dvdrootdir; dvddirlength = dvdrootlength; browser.dir[0] = 0; - ParseDVDdirectory(); + ParseDVDdirectory(true); return SwitchDVDFolderR(dirptr, 0); } diff --git a/source/ngc/dvd.h b/source/ngc/dvd.h index d21dc36..692c1ce 100644 --- a/source/ngc/dvd.h +++ b/source/ngc/dvd.h @@ -14,7 +14,7 @@ #define _NGCDVD_ bool MountDVD(bool silent); -int ParseDVDdirectory(); +int ParseDVDdirectory(bool change); void SetDVDdirectory(u64 dir, int length); bool SwitchDVDFolder(char dir[]); diff --git a/source/ngc/filebrowser.cpp b/source/ngc/filebrowser.cpp index b67fc36..2e320e8 100644 --- a/source/ngc/filebrowser.cpp +++ b/source/ngc/filebrowser.cpp @@ -501,11 +501,11 @@ int BrowserChangeFolder(int method) switch (method) { case METHOD_DVD: - ParseDVDdirectory(); + ParseDVDdirectory(true); break; default: - ParseDirectory(); + ParseDirectory(method); break; } @@ -530,25 +530,18 @@ OpenGameList () if(method == METHOD_AUTO) method = autoLoadMethod(); - if(ChangeInterface(method, NOTSILENT)) + // change current dir to roms directory + switch(method) { - // change current dir to roms directory - switch(method) - { - case METHOD_DVD: - browser.dir[0] = 0; - ParseDVDdirectory(); // Parse root directory + case METHOD_DVD: + browser.dir[0] = 0; + if(ParseDVDdirectory(true)) // Parse root directory SwitchDVDFolder(GCSettings.LoadFolder); // switch to ROM folder - break; - default: - sprintf(browser.dir, "/%s", GCSettings.LoadFolder); - ParseDirectory(); // Parse root directory - break; - } - } - else - { - ResetBrowser(); + break; + default: + sprintf(browser.dir, "/%s", GCSettings.LoadFolder); + ParseDirectory(method); // Parse root directory + break; } return browser.numEntries; } diff --git a/source/ngc/fileop.cpp b/source/ngc/fileop.cpp index 2203b41..a80dfdd 100644 --- a/source/ngc/fileop.cpp +++ b/source/ngc/fileop.cpp @@ -182,6 +182,7 @@ bool MountFAT(int method) unmountRequired[method] = false; fatUnmount(rootdir); disc->shutdown(); + isMounted[method] = false; } if(!isMounted[method]) { @@ -269,42 +270,51 @@ bool ChangeInterface(int method, bool silent) * Browse subdirectories **************************************************************************/ int -ParseDirectory() +ParseDirectory(int method) { - DIR_ITER *dir; + DIR_ITER *dir = NULL; char fulldir[MAXPATHLEN]; char filename[MAXPATHLEN]; char tmpname[MAXPATHLEN]; struct stat filestat; struct tm * timeinfo; char msg[128]; - - ShowAction("Loading..."); + int retry = 1; // reset browser ResetBrowser(); - // add device to path - sprintf(fulldir, "%s%s", rootdir, browser.dir); + ShowAction("Loading..."); // open the directory - dir = diropen(fulldir); + while(dir == NULL && retry == 1) + { + if(ChangeInterface(method, NOTSILENT)) + { + sprintf(fulldir, "%s%s", rootdir, browser.dir); // add device to path + dir = diropen(fulldir); + if(dir == NULL) + { + unmountRequired[method] = true; + sprintf(msg, "Error opening %s", fulldir); + retry = ErrorPromptRetry(msg); + } + } + } + // if we can't open the dir, try opening the root dir if (dir == NULL) { - sprintf(msg, "Error opening %s", fulldir); - ErrorPrompt(msg); - - // if we can't open the dir, open root dir - sprintf(browser.dir,"/"); - - dir = diropen(rootdir); - - if (dir == NULL) + if(ChangeInterface(method, SILENT)) { - sprintf(msg, "Error opening %s", rootdir); - ErrorPrompt(msg); - return -1; + sprintf(browser.dir,"/"); + dir = diropen(rootdir); + if (dir == NULL) + { + sprintf(msg, "Error opening %s", rootdir); + ErrorPrompt(msg); + return -1; + } } } @@ -430,9 +440,8 @@ LoadFile (char * rbuffer, char *filepath, u32 length, int method, bool silent) char zipbuffer[2048]; u32 size = 0; u32 readsize = 0; - - if(!ChangeInterface(method, silent)) - return 0; + char fullpath[MAXPATHLEN]; + int retry = 1; switch(method) { @@ -451,64 +460,75 @@ LoadFile (char * rbuffer, char *filepath, u32 length, int method, bool silent) // since we're loading a file LWP_SuspendThread (devicethread); - // add device to filepath - char fullpath[1024]; - sprintf(fullpath, "%s%s", rootdir, filepath); - - file = fopen (fullpath, "rb"); - - if (file > 0) + // open the file + while(!size && retry == 1) { - if(length > 0 && length <= 2048) // do a partial read (eg: to check file header) + if(ChangeInterface(method, silent)) { - size = fread (rbuffer, 1, length, file); - } - else // load whole file - { - readsize = fread (zipbuffer, 1, 2048, file); + sprintf(fullpath, "%s%s", rootdir, filepath); // add device to filepath + file = fopen (fullpath, "rb"); - if(readsize > 0) + if(file > 0) { - if (IsZipFile (zipbuffer)) + if(length > 0 && length <= 2048) // do a partial read (eg: to check file header) { - size = UnZipBuffer ((unsigned char *)rbuffer, method); // unzip + size = fread (rbuffer, 1, length, file); } - else + else // load whole file { - struct stat fileinfo; - fstat(file->_file, &fileinfo); - size = fileinfo.st_size; + readsize = fread (zipbuffer, 1, 2048, file); - memcpy (rbuffer, zipbuffer, readsize); // copy what we already read - - u32 offset = readsize; - u32 nextread = 0; - while(offset < size) + if(readsize > 0) { - if(size - offset > 1024*512) nextread = 1024*512; - else nextread = size-offset; - ShowProgress ("Loading...", offset, size); - readsize = fread (rbuffer + offset, 1, nextread, file); // read in 512K chunks + if (IsZipFile (zipbuffer)) + { + size = UnZipBuffer ((unsigned char *)rbuffer, method); // unzip + } + else + { + struct stat fileinfo; + fstat(file->_file, &fileinfo); + size = fileinfo.st_size; - if(readsize <= 0 || readsize > (1024*512)) - break; // read failure + memcpy (rbuffer, zipbuffer, readsize); // copy what we already read - if(readsize > 0) - offset += readsize; + u32 offset = readsize; + u32 nextread = 0; + while(offset < size) + { + if(size - offset > 1024*512) nextread = 1024*512; + 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; + } } - CancelAction(); - - if(offset != size) // # bytes read doesn't match # expected - size = 0; } + fclose (file); + } + } + if(!size) + { + if(!silent) + { + unmountRequired[method] = true; + retry = ErrorPromptRetry("Error loading file!"); + } + else + { + retry = 0; } } - fclose (file); - } - if(!size && !silent) - { - unmountRequired[method] = true; - ErrorPrompt("Error loading file!"); } // go back to checking if devices were inserted/removed @@ -529,12 +549,11 @@ u32 LoadFile(char * filepath, int method, bool silent) u32 SaveFile (char * buffer, char *filepath, u32 datasize, int method, bool silent) { - if(datasize == 0) - return 0; - + char fullpath[MAXPATHLEN]; u32 written = 0; + int retry = 1; - if(!ChangeInterface(method, silent)) + if(datasize == 0) return 0; ShowAction("Saving..."); @@ -542,38 +561,41 @@ SaveFile (char * buffer, char *filepath, u32 datasize, int method, bool silent) if(method == METHOD_MC_SLOTA || method == METHOD_MC_SLOTB) { if(method == METHOD_MC_SLOTA) - written = SaveMCFile (buffer, CARD_SLOTA, filepath, datasize, silent); + return SaveMCFile (buffer, CARD_SLOTA, filepath, datasize, silent); else - written = SaveMCFile (buffer, CARD_SLOTB, filepath, datasize, silent); + return SaveMCFile (buffer, CARD_SLOTB, filepath, datasize, silent); } - else - { - // stop checking if devices were removed/inserted - // since we're saving a file - LWP_SuspendThread (devicethread); - // add device to filepath - char fullpath[1024]; - sprintf(fullpath, "%s%s", rootdir, filepath); + // stop checking if devices were removed/inserted + // since we're saving a file + LWP_SuspendThread (devicethread); - // open file for writing - file = fopen (fullpath, "wb"); - - if (file > 0) + while(!written && retry == 1) + { + if(ChangeInterface(method, silent)) { - written = fwrite (savebuffer, 1, datasize, file); - fclose (file); + sprintf(fullpath, "%s%s", rootdir, filepath); // add device to filepath + file = fopen (fullpath, "wb"); + + if (file > 0) + { + written = fwrite (savebuffer, 1, datasize, file); + if(written < datasize) written = 0; + fclose (file); + } } - if(!written) + { unmountRequired[method] = true; + if(!silent) + retry = ErrorPromptRetry("Error saving file!"); + else + retry = 0; + } + } - // go back to checking if devices were inserted/removed - LWP_ResumeThread (devicethread); - } - - if(!written && !silent) - ErrorPrompt("Error saving file!"); + // go back to checking if devices were inserted/removed + LWP_ResumeThread (devicethread); CancelAction(); return written; diff --git a/source/ngc/fileop.h b/source/ngc/fileop.h index 9acaf9a..7d2d19b 100644 --- a/source/ngc/fileop.h +++ b/source/ngc/fileop.h @@ -27,7 +27,7 @@ void InitDeviceThread(); void MountAllFAT(); void UnmountAllFAT(); bool ChangeInterface(int method, bool silent); -int ParseDirectory(); +int ParseDirectory(int method); void AllocSaveBuffer(); void FreeSaveBuffer(); u32 LoadFile(char * rbuffer, char *filepath, u32 length, int method, bool silent); diff --git a/source/ngc/menu.cpp b/source/ngc/menu.cpp index 472e172..97e99c5 100644 --- a/source/ngc/menu.cpp +++ b/source/ngc/menu.cpp @@ -179,6 +179,7 @@ WindowPrompt(const char *title, const char *msg, const char *btn1Label, const ch promptWindow.Append(&btn2); promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50); + CancelAction(); HaltGui(); mainWindow->SetState(STATE_DISABLED); mainWindow->Append(&promptWindow); @@ -465,13 +466,16 @@ ShowAction (const char *msg) void ErrorPrompt(const char *msg) { - CancelAction(); WindowPrompt("Error", msg, "OK", NULL); } +int ErrorPromptRetry(const char *msg) +{ + return WindowPrompt("Error", msg, "Retry", "Cancel"); +} + void InfoPrompt(const char *msg) { - CancelAction(); WindowPrompt("Information", msg, "OK", NULL); } @@ -1435,7 +1439,7 @@ static int MenuGameSaves(int action) else { strncpy(browser.dir, GCSettings.SaveFolder, 200); - ParseDirectory(); + ParseDirectory(GCSettings.SaveMethod); } for(i=0; i < browser.numEntries; i++) @@ -1485,6 +1489,17 @@ static int MenuGameSaves(int action) { saves.previewImg[j] = new GuiImageData(savebuffer); } + /*char scrfile2[1024]; + sprintf(scrfile, "%s/%s.png", GCSettings.SaveFolder, tmp); + sprintf(scrfile2, "%s/resave/%s.png", GCSettings.SaveFolder, tmp); + + AllocSaveBuffer(); + int scrsize = LoadFile(scrfile, GCSettings.SaveMethod, SILENT); + if(scrsize > 0) + { + //saves.previewImg[j] = new GuiImageData(savebuffer); + SaveFile(scrfile2, scrsize, GCSettings.SaveMethod, SILENT); + }*/ FreeSaveBuffer(); } strftime(saves.date[j], 20, "%a %b %d", &browserList[j].mtime); diff --git a/source/ngc/menu.h b/source/ngc/menu.h index 52c2e0f..527116e 100644 --- a/source/ngc/menu.h +++ b/source/ngc/menu.h @@ -16,6 +16,7 @@ void InitGUIThreads(); void MainMenu (int menuitem); void ErrorPrompt(const char * msg); +int ErrorPromptRetry(const char * msg); void InfoPrompt(const char * msg); void ShowAction (const char *msg); void CancelAction();