rewritten code, many bugfixes

This commit is contained in:
dborth 2009-10-06 07:17:52 +00:00
parent 1fac866d18
commit ff78bdfaa5
6 changed files with 174 additions and 161 deletions

View File

@ -632,7 +632,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

View File

@ -240,7 +240,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;
@ -281,20 +282,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;
@ -319,12 +319,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])
{
@ -332,19 +328,29 @@ bool MountDVD(bool silent)
ISO9660_Unmount();
}
mounted = dvd->isInserted();
if(!mounted)
while(retry)
{
if(!silent)
ErrorPrompt("No disc inserted!");
ShowAction("Loading 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 = ISO9660_Mount();
if(!mounted && !silent)
ErrorPrompt("Invalid DVD.");
mounted = true;
break;
}
}
CancelAction();
isMounted[DEVICE_DVD] = mounted;
@ -418,6 +424,9 @@ char * StripDevice(char * path)
***************************************************************************/
bool ChangeInterface(int device, bool silent)
{
if(isMounted[device])
return true;
bool mounted = false;
switch(device)
@ -576,14 +585,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;
@ -688,8 +700,7 @@ 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;
@ -714,77 +725,64 @@ LoadFile (char * rbuffer, char *filepath, size_t length, bool silent)
else
{
// open the file
while(!size && retry == 1)
{
if(ChangeInterface(device, silent))
while(!size && retry)
{
if(!ChangeInterface(device, silent))
break;
file = fopen (filepath, "rb");
if(file > 0)
if(!file)
{
if(silent)
break;
retry = ErrorPromptRetry("Error opening file!");
continue;
}
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);
readsize = fread (zipbuffer, 1, 32, file);
if(readsize > 0)
if(!readsize)
{
unmountRequired[device] = true;
retry = ErrorPromptRetry("Error reading file!");
continue;
}
if (IsZipFile (zipbuffer))
{
size = UnZipBuffer ((unsigned char *)rbuffer); // unzip
}
else
{
struct stat fileinfo;
if(fstat(file->_file, &fileinfo) == 0)
{
size = fileinfo.st_size;
fseeko(file,0,SEEK_END);
size = ftello(file);
fseeko(file,0,SEEK_SET);
memcpy (rbuffer, zipbuffer, readsize); // copy what we already read
size_t offset = readsize;
size_t nextread = 0;
while(offset < size)
while(!feof(file))
{
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
readsize = fread (rbuffer + offset, 1, 4096, file); // read in next chunk
if(readsize <= 0 || readsize > nextread)
break; // read failure
if(readsize <= 0)
break; // reading finished (or failed)
if(readsize > 0)
offset += readsize;
}
size = offset;
CancelAction();
if(offset != size) // # bytes read doesn't match # expected
size = 0;
}
}
}
}
fclose (file);
}
}
if(!size)
{
if(!silent)
{
unmountRequired[device] = true;
retry = ErrorPromptRetry("Error loading file!");
}
else
{
retry = 0;
}
}
}
}
// go back to checking if devices were inserted/removed
ResumeDeviceThread();
@ -805,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;
@ -815,7 +814,7 @@ SaveFile (char * buffer, char *filepath, size_t datasize, bool silent)
return 0;
// stop checking if devices were removed/inserted
// since we're loading a file
// since we're saving a file
HaltDeviceThread();
// halt parsing
@ -835,16 +834,23 @@ SaveFile (char * buffer, char *filepath, size_t datasize, bool silent)
{
while(!written && retry == 1)
{
if(ChangeInterface(device, silent))
{
if(!ChangeInterface(device, silent))
break;
file = fopen (filepath, "wb");
if (file > 0)
if(!file)
{
size_t writesize, nextwrite;
if(silent)
break;
retry = ErrorPromptRetry("Error creating file!");
continue;
}
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
@ -852,16 +858,11 @@ SaveFile (char * buffer, char *filepath, size_t datasize, bool silent)
}
if(written != datasize) written = 0;
fclose (file);
}
}
if(!written)
{
unmountRequired[device] = true;
if(!silent)
retry = ErrorPromptRetry("Error saving file!");
else
retry = 0;
}
}
}

View File

@ -987,6 +987,7 @@ static int MenuGameSelection()
ExitRequested = 1;
}
HaltParseThread(); // halt parsing
HaltGui();
mainWindow->Remove(&titleTxt);
mainWindow->Remove(&buttonWindow);

View File

@ -21,6 +21,7 @@ ConnectShare (bool silent)
#include <network.h>
#include <smb.h>
#include <mxml.h>
#include <malloc.h>
#include "unzip.h"
#include "miniunz.h"
@ -183,9 +184,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...");
@ -196,25 +202,25 @@ void InitializeNetwork(bool silent)
{
inNetworkInit = true;
char ip[16];
s32 initResult = if_config(ip, NULL, NULL, true);
while(retry)
{
if(!silent)
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);
}
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);
}
}
inNetworkInit = false;
}
if(!silent)
@ -226,7 +232,6 @@ void CloseShare()
if(networkShareInit)
smbClose("smb");
networkShareInit = false;
networkInit = false; // trigger a network reinit
}
/****************************************************************************
@ -241,6 +246,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;
@ -270,26 +276,25 @@ ConnectShare (bool silent)
if(!networkInit)
InitializeNetwork(silent);
if(networkInit)
{
if(!networkShareInit)
if(!networkInit)
return false;
while(retry)
{
if(!silent)
ShowAction ("Connecting to network share...");
if(smbInit(GCSettings.smbuser, GCSettings.smbpwd,
GCSettings.smbshare, GCSettings.smbip))
{
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();
}
if(!networkShareInit && !silent)
ErrorPrompt("Failed to connect to network share.");
}
return networkShareInit;
}

View File

@ -547,6 +547,7 @@ decodePalsData ()
* Save Preferences
***************************************************************************/
static char prefpath[MAXPATHLEN] = { 0 };
static char palpath[MAXPATHLEN] = { 0 };
bool
SavePrefs (bool silent)
@ -568,7 +569,7 @@ SavePrefs (bool silent)
}
else
{
device = autoLoadMethod();
device = autoSaveMethod(silent);
if(device == 0)
return false;
@ -576,7 +577,7 @@ SavePrefs (bool silent)
if(device == DEVICE_MC_SLOTA || device == DEVICE_MC_SLOTB)
sprintf(filepath, "%s%s", pathPrefix[device], PREF_FILE_NAME);
else
sprintf(filepath, "%ssnes9x/%s", pathPrefix[device], PREF_FILE_NAME);
sprintf(filepath, "%s%s/%s", pathPrefix[device], APPFOLDER, PREF_FILE_NAME);
}
if(device == 0)
@ -690,9 +691,9 @@ bool SavePalettes(bool silent)
int offset = 0;
int device = 0;
if(prefpath[0] != 0)
if(palpath[0] != 0)
{
strcpy(filepath, prefpath);
strcpy(filepath, palpath);
FindDevice(filepath, &device);
}
else if(appPath[0] != 0)
@ -702,7 +703,7 @@ bool SavePalettes(bool silent)
}
else
{
device = autoLoadMethod();
device = autoSaveMethod(silent);
if(device == 0)
return false;
@ -710,7 +711,7 @@ bool SavePalettes(bool silent)
if(device == DEVICE_MC_SLOTA || device == DEVICE_MC_SLOTB)
sprintf(filepath, "%s%s", pathPrefix[device], PAL_FILE_NAME);
else
sprintf(filepath, "%ssnes9x/%s", pathPrefix[device], PAL_FILE_NAME);
sprintf(filepath, "%s%s/%s", pathPrefix[device], APPFOLDER, PAL_FILE_NAME);
}
if(device == 0)
@ -787,6 +788,7 @@ bool LoadPalettes()
int offset = 0;
char filepath[4][MAXPATHLEN];
int numDevices;
int i;
AllocSaveBuffer ();
@ -803,7 +805,7 @@ bool LoadPalettes()
sprintf(filepath[3], "mcb:/%s", PAL_FILE_NAME);
#endif
for(int i=0; i<numDevices; i++)
for(i=0; i<numDevices; i++)
{
offset = LoadFile(filepath[i], SILENT);
@ -814,6 +816,9 @@ bool LoadPalettes()
if (offset > 0)
retval = decodePalsData ();
if(retval)
strcpy(palpath, filepath[i]);
FreeSaveBuffer ();
// add hard-coded palettes

View File

@ -61,9 +61,6 @@ extern FILE *out;
static void ExitCleanup()
{
#ifdef HW_RVL
ShutoffRumble();
#endif
ShutdownAudio();
StopGX();
if (out) fclose(out);
@ -84,6 +81,10 @@ static void ExitCleanup()
void ExitApp()
{
#ifdef HW_RVL
ShutoffRumble();
#endif
SavePrefs(SILENT);
if (ROMLoaded && !ConfigRequested && GCSettings.AutoSave == 1)