-added more accurate progress bar for copy

gc game from usb to sd
-made the gc disc installer progress bar more
accurate too ;)
-deleting a gamecube game will now delete all
files found in the directory, more accurate lol
This commit is contained in:
fix94.1 2012-03-05 09:48:13 +00:00
parent 83b8c5dcf7
commit b23d86b5bc
6 changed files with 53 additions and 45 deletions

View File

@ -32,6 +32,7 @@ static u32 blockIdx = 0;
static u32 blockInfo[2] = {0,0}; static u32 blockInfo[2] = {0,0};
static u32 blockReady = 0; static u32 blockReady = 0;
static u32 stopThread; static u32 stopThread;
static u64 folderSize = 0;
// return false if the file doesn't exist // return false if the file doesn't exist
bool fsop_GetFileSizeBytes (char *path, size_t *filesize) // for me stats st_size report always 0 :( bool fsop_GetFileSizeBytes (char *path, size_t *filesize) // for me stats st_size report always 0 :(
@ -198,12 +199,6 @@ bool fsop_CopyFile (char *source, char *target, progress_callback_t spinner, voi
usleep (5); usleep (5);
bytes = 0; bytes = 0;
bool spinnerFlag = false;
if (strstr (source, "game.iso")) {
spinner(bytes, size, spinner_data);
spinnerFlag = true;
}
u32 bi; u32 bi;
do do
{ {
@ -223,7 +218,8 @@ bool fsop_CopyFile (char *source, char *target, progress_callback_t spinner, voi
if (rb == 0) err = 1; if (rb == 0) err = 1;
bytes += rb; bytes += rb;
if (spinnerFlag) spinner(bytes, size, spinner_data); if (spinner)
spinner(bytes, folderSize, spinner_data);
} }
while (bytes < size && err == 0); while (bytes < size && err == 0);
@ -295,10 +291,43 @@ static bool doCopyFolder (char *source, char *target, progress_callback_t spinne
return ret; return ret;
} }
bool fsop_CopyFolder (char *source, char *target, progress_callback_t spinner, void *spinner_data) bool fsop_CopyFolder (char *source, char *target, progress_callback_t spinner, void *spinner_data)
{ {
gprintf("DML game USB->SD job started!\n"); gprintf("DML game USB->SD job started!\n");
folderSize = fsop_GetFolderBytes(source);
return doCopyFolder(source, target, spinner, spinner_data); return doCopyFolder(source, target, spinner, spinner_data);
} }
void fsop_deleteFolder(char *source)
{
DIR *pdir;
struct dirent *pent;
char newSource[300];
pdir = opendir(source);
while ((pent=readdir(pdir)) != NULL)
{
// Skip it
if (strcmp (pent->d_name, ".") == 0 || strcmp (pent->d_name, "..") == 0)
continue;
sprintf (newSource, "%s/%s", source, pent->d_name);
// If it is a folder... recurse...
if (fsop_DirExist(newSource))
{
fsop_deleteFolder(newSource);
}
else // It is a file !
{
gprintf("Deleting file: %s\n",newSource);
remove(newSource);
}
}
closedir(pdir);
gprintf("Deleting directory: %s\n",source);
unlink(source);
}

View File

@ -15,6 +15,7 @@ u32 fsop_GetFreeSpaceKb (char *path);
bool fsop_DirExist (char *path); bool fsop_DirExist (char *path);
bool fsop_CopyFile (char *source, char *target, progress_callback_t spinner, void *spinner_data); bool fsop_CopyFile (char *source, char *target, progress_callback_t spinner, void *spinner_data);
bool fsop_CopyFolder (char *source, char *target, progress_callback_t spinner, void *spinner_data); bool fsop_CopyFolder (char *source, char *target, progress_callback_t spinner, void *spinner_data);
void fsop_deleteFolder(char *source);
#endif #endif

View File

@ -6,6 +6,7 @@
#include "gecko.h" #include "gecko.h"
#include "fileOps.h" #include "fileOps.h"
#include "utils.h" #include "utils.h"
#include "defines.h"
#define SRAM_ENGLISH 0 #define SRAM_ENGLISH 0
#define SRAM_GERMAN 1 #define SRAM_GERMAN 1
@ -94,48 +95,20 @@ void set_language(u8 lang)
while(!__SYS_SyncSram()); while(!__SYS_SyncSram());
} }
void DML_RemoveGame(const char *discid, const char* partition)
{
int num = 6;
const char *fl[6] = {"%s:/games/%s/game.iso","%s:/games/%s/sys/boot.bin","%s:/games/%s/sys/bi2.bin",
"%s:/games/%s/sys/apploader.img","%s:/games/%s/sys","%s:/games/%s"};
char fname[MAX_FAT_PATH];
FILE *f;
DIR *dir;
int i;
for(i = 0; i < num; i++)
{
sprintf(fname, fl[i], partition, discid);
f = fopen((char*)fname, "r");
if(f)
{
gprintf("Deleting %s...\n",fname);
fclose(f);
remove(fname);
}
dir = opendir((char*)fname);
if(dir)
{
gprintf("Deleting %s...\n",fname);
closedir(dir);
unlink((char*)fname);
}
}
}
bool DML_GameIsInstalled(char *discid, const char* partition) bool DML_GameIsInstalled(char *discid, const char* partition)
{ {
char filepath[MAX_FAT_PATH]; char folder[12];
sprintf(filepath, "%s:/games/%s/game.iso", partition, discid); char source[300];
snprintf(folder, sizeof(folder), DML_DIR, partition);
snprintf(source, sizeof(source), "%s/%s", folder, discid);
gprintf("Filepath on SD: %s\n", filepath); FILE *f = fopen(source, "r");
FILE *f = fopen(filepath, "r");
if (f) if (f)
{ {
gprintf("Found on %s: %s\n", partition, source);
fclose(f); fclose(f);
return true; return true;
} }
gprintf("Not found\n"); gprintf("Not found on %s: %s\n", partition, source);
return false; return false;
} }

View File

@ -7,7 +7,6 @@ extern "C"
#define GC_H_ #define GC_H_
void set_video_mode(int i); void set_video_mode(int i);
void set_language(u8 lang); void set_language(u8 lang);
void DML_RemoveGame(const char *discid, const char* partition);
bool DML_GameIsInstalled(char *discid, const char* partition); bool DML_GameIsInstalled(char *discid, const char* partition);
#endif //GC_H_ #endif //GC_H_

View File

@ -273,6 +273,8 @@ s32 GCDump::DumpGame(progress_callback_t spinner, message_callback_t message, vo
memset(ReadBuffer,0,toread); memset(ReadBuffer,0,toread);
fwrite(ReadBuffer,1,toread,f); fwrite(ReadBuffer,1,toread,f);
correction -= toread; correction -= toread;
if(spinner)
spinner(wrote+toread, DiscSizeCalculated, spinner_data);
} }
break; break;
} }

View File

@ -370,7 +370,11 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
} }
else else
{ {
DML_RemoveGame(m_cf.getHdr()->path, DeviceName[currentPartition]); char folder[12];
char source[300];
snprintf(folder, sizeof(folder), DML_DIR, DeviceName[currentPartition]);
snprintf(source, sizeof(source), "%s/%s", folder, m_cf.getHdr()->path);
fsop_deleteFolder(source);
upd_dml = true; upd_dml = true;
} }
if(m_cfg.getBool("GENERAL", "delete_cover_and_game", true)) if(m_cfg.getBool("GENERAL", "delete_cover_and_game", true))