fceugx/source/ngc/fileop.c

311 lines
7.6 KiB
C
Raw Normal View History

2008-09-02 03:57:21 +02:00
/****************************************************************************
* FCE Ultra 0.98.12
* Nintendo Wii/Gamecube Port
*
* Tantric September 2008
*
* fileop.c
*
* File operations
****************************************************************************/
#include <gccore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ogcsys.h>
#include <zlib.h>
#include "common.h"
#include "fceuconfig.h"
#include "fileop.h"
#include "gcunzip.h"
#include "menudraw.h"
#include "filesel.h"
2008-10-14 11:21:58 +02:00
// FAT file pointer - the only one we should ever use!
FILE * fatfile;
2008-09-02 03:57:21 +02:00
/****************************************************************************
2008-10-28 07:50:07 +01:00
* MountFAT
* Attempts to mount the FAT device specified
* Sets libfat to use the device by default
* Enables read-ahead cache for SD/USB
***************************************************************************/
bool MountFAT(PARTITION_INTERFACE part)
{
bool mounted = fatMountNormalInterface(part, 8);
if(mounted)
{
fatSetDefaultInterface(part);
#ifdef HW_RVL
if(part == PI_INTERNAL_SD || part == PI_USBSTORAGE)
fatEnableReadAhead (part, 6, 64);
#endif
}
return mounted;
}
/****************************************************************************
* UnmountFAT
* Unmounts the FAT device specified
***************************************************************************/
void UnmountFAT(PARTITION_INTERFACE part)
{
if(!fatUnmount(part))
fatUnsafeUnmount(part);
}
2008-09-02 03:57:21 +02:00
2008-10-28 07:50:07 +01:00
/****************************************************************************
* UnmountAllFAT
* Unmounts all FAT devices
***************************************************************************/
void UnmountAllFAT()
{
#ifdef HW_RVL
UnmountFAT(PI_INTERNAL_SD);
UnmountFAT(PI_USBSTORAGE);
#endif
UnmountFAT(PI_SDGECKO_A);
UnmountFAT(PI_SDGECKO_B);
2008-09-02 03:57:21 +02:00
}
/****************************************************************************
2008-10-28 07:50:07 +01:00
* ChangeFATInterface
* Unmounts all devices and attempts to mount/configure the device specified
***************************************************************************/
2008-09-02 03:57:21 +02:00
bool ChangeFATInterface(int method, bool silent)
{
2008-10-28 07:50:07 +01:00
bool mounted = false;
// unmount all FAT devices
UnmountAllFAT();
2008-09-02 03:57:21 +02:00
if(method == METHOD_SD)
{
#ifdef HW_RVL
2008-10-28 07:50:07 +01:00
mounted = MountFAT(PI_INTERNAL_SD); // try Wii internal SD
2008-09-02 03:57:21 +02:00
#endif
2008-10-28 07:50:07 +01:00
if(!mounted) // internal SD not found
mounted = MountFAT(PI_SDGECKO_A); // try SD Gecko on slot A
if(!mounted) // internal SD and SD Gecko (on slot A) not found
mounted = MountFAT(PI_SDGECKO_B); // try SD Gecko on slot B
if(!mounted && !silent) // no SD device found
WaitPrompt ((char *)"SD card not found!");
2008-09-02 03:57:21 +02:00
}
else if(method == METHOD_USB)
{
#ifdef HW_RVL
2008-10-28 07:50:07 +01:00
mounted = MountFAT(PI_USBSTORAGE);
if(!mounted && !silent)
WaitPrompt ((char *)"USB drive not found!");
2008-09-02 03:57:21 +02:00
#endif
}
2008-10-28 07:50:07 +01:00
return mounted;
2008-09-02 03:57:21 +02:00
}
/***************************************************************************
* Browse FAT subdirectories
***************************************************************************/
int
ParseFATdirectory(int method)
{
int nbfiles = 0;
DIR_ITER *fatdir;
char filename[MAXPATHLEN];
struct stat filestat;
char msg[128];
// initialize selection
selection = offset = 0;
// Clear any existing values
memset (&filelist, 0, sizeof (FILEENTRIES) * MAXFILES);
// open the directory
fatdir = diropen(currentdir);
if (fatdir == NULL)
{
sprintf(msg, "Couldn't open %s", currentdir);
WaitPrompt(msg);
// if we can't open the dir, open root dir
sprintf(currentdir,"%s",ROOTFATDIR);
fatdir = diropen(currentdir);
if (fatdir == NULL)
{
sprintf(msg, "Error opening %s", currentdir);
WaitPrompt(msg);
return 0;
}
}
// index files/folders
while(dirnext(fatdir,filename,&filestat) == 0)
{
if(strcmp(filename,".") != 0)
{
memset(&filelist[nbfiles], 0, sizeof(FILEENTRIES));
strncpy(filelist[nbfiles].filename, filename, MAXPATHLEN);
strncpy(filelist[nbfiles].displayname, filename, MAXDISPLAY+1); // crop name for display
filelist[nbfiles].length = filestat.st_size;
filelist[nbfiles].flags = (filestat.st_mode & _IFDIR) == 0 ? 0 : 1; // flag this as a dir
2008-10-13 20:15:03 +02:00
filelist[nbfiles].offset = 0;
2008-09-02 03:57:21 +02:00
nbfiles++;
}
}
// close directory
dirclose(fatdir);
// Sort the file list
qsort(filelist, nbfiles, sizeof(FILEENTRIES), FileSortCallback);
return nbfiles;
}
/****************************************************************************
* LoadFATFile
2008-10-13 20:15:03 +02:00
* length > 0 - partial file read (starting from start)
* length = 0 - full read
***************************************************************************/
2008-09-02 03:57:21 +02:00
int
LoadFATFile (char * rbuffer, int length)
2008-09-02 03:57:21 +02:00
{
char zipbuffer[2048];
char filepath[MAXPATHLEN];
u32 size;
2008-10-13 20:15:03 +02:00
if (!MakeROMPath(filepath, METHOD_SD))
2008-09-02 03:57:21 +02:00
{
WaitPrompt((char*) "Maximum filepath length reached!");
return -1;
}
2008-10-14 11:21:58 +02:00
fatfile = fopen (filepath, "rb");
if (fatfile > 0)
2008-09-02 03:57:21 +02:00
{
if(length > 0) // do a partial read (eg: to check file header)
2008-09-02 03:57:21 +02:00
{
2008-10-14 11:21:58 +02:00
fread (rbuffer, 1, length, fatfile);
size = length;
2008-09-02 03:57:21 +02:00
}
else // load whole file
2008-09-02 03:57:21 +02:00
{
2008-10-14 11:21:58 +02:00
fread (zipbuffer, 1, 2048, fatfile);
if (IsZipFile (zipbuffer))
{
2008-10-14 11:21:58 +02:00
size = UnZipBuffer ((unsigned char *)rbuffer, METHOD_SD); // unzip from FAT
}
else
{
// Just load the file up
2008-10-14 11:21:58 +02:00
fseek(fatfile, 0, SEEK_END);
size = ftell(fatfile); // get filesize
fseek(fatfile, 2048, SEEK_SET); // seek back to point where we left off
memcpy (rbuffer, zipbuffer, 2048); // copy what we already read
2008-10-14 11:21:58 +02:00
fread (rbuffer + 2048, 1, size - 2048, fatfile);
}
2008-09-02 03:57:21 +02:00
}
2008-10-14 11:21:58 +02:00
fclose (fatfile);
2008-09-02 03:57:21 +02:00
return size;
}
else
{
WaitPrompt((char*) "Error opening file");
return 0;
}
}
2008-10-13 20:15:03 +02:00
/****************************************************************************
* LoadFATSzFile
* Loads the selected file # from the specified 7z into rbuffer
* Returns file size
***************************************************************************/
int
LoadFATSzFile(char * filepath, unsigned char * rbuffer)
{
u32 size;
2008-10-14 11:21:58 +02:00
fatfile = fopen (filepath, "rb");
if (fatfile > 0)
2008-10-13 20:15:03 +02:00
{
size = SzExtractFile(filelist[selection].offset, rbuffer);
2008-10-14 11:21:58 +02:00
fclose (fatfile);
2008-10-13 20:15:03 +02:00
return size;
}
else
{
WaitPrompt((char*) "Error opening file");
return 0;
}
}
2008-09-02 03:57:21 +02:00
/****************************************************************************
* Load savebuffer from FAT file
***************************************************************************/
// no buffer is specified - so use savebuffer
2008-09-02 03:57:21 +02:00
int
LoadSaveBufferFromFAT (char *filepath, bool silent)
{
return LoadBufferFromFAT((char *)savebuffer, filepath, silent);
}
int
LoadBufferFromFAT (char * sbuffer, char *filepath, bool silent)
2008-09-02 03:57:21 +02:00
{
2008-10-03 07:24:51 +02:00
int size = 0;
2008-09-02 03:57:21 +02:00
2008-10-14 11:21:58 +02:00
fatfile = fopen (filepath, "rb");
2008-09-02 03:57:21 +02:00
2008-10-14 11:21:58 +02:00
if (fatfile <= 0)
2008-09-02 03:57:21 +02:00
{
if ( !silent )
{
char msg[100];
sprintf(msg, "Couldn't open %s", filepath);
WaitPrompt (msg);
}
return 0;
}
2008-10-03 07:24:51 +02:00
// Just load the file up
2008-10-14 11:21:58 +02:00
fseek(fatfile, 0, SEEK_END); // go to end of file
size = ftell(fatfile); // get filesize
fseek(fatfile, 0, SEEK_SET); // go to start of file
fread (sbuffer, 1, size, fatfile);
fclose (fatfile);
2008-09-02 03:57:21 +02:00
2008-10-03 07:24:51 +02:00
return size;
2008-09-02 03:57:21 +02:00
}
/****************************************************************************
* Write savebuffer to FAT card file
****************************************************************************/
int
SaveBufferToFAT (char *filepath, int datasize, bool silent)
{
if (datasize)
{
2008-10-14 11:21:58 +02:00
fatfile = fopen (filepath, "wb");
2008-09-02 03:57:21 +02:00
2008-10-14 11:21:58 +02:00
if (fatfile <= 0)
2008-09-02 03:57:21 +02:00
{
char msg[100];
sprintf(msg, "Couldn't save %s", filepath);
WaitPrompt (msg);
return 0;
}
2008-10-14 11:21:58 +02:00
fwrite (savebuffer, 1, datasize, fatfile);
fclose (fatfile);
2008-09-02 03:57:21 +02:00
}
return datasize;
}