Improved FindVirtualFile() function

This commit is contained in:
d0k3 2016-03-22 19:44:21 +01:00
parent 762dce04cd
commit 0d521004a1
3 changed files with 24 additions and 12 deletions

View File

@ -156,7 +156,7 @@ bool PathCopyVirtual(const char* destdir, const char* orig) {
if (oname == NULL) return false; // not a proper origin path
oname++;
snprintf(dest, 256, "%s/%s", destdir, oname);
snprintf(dest, 255, "%s/%s", destdir, oname);
TruncateString(deststr, dest, 36, 8);
TruncateString(origstr, orig, 36, 8);
@ -166,9 +166,9 @@ bool PathCopyVirtual(const char* destdir, const char* orig) {
VirtualFile ovfile;
u32 osize;
if (!FindVirtualFile(&dvfile, dest))
if (!FindVirtualFile(&dvfile, dest, 0))
return false;
if (!FindVirtualFile(&ovfile, orig))
if (!FindVirtualFile(&ovfile, orig, 0))
return false;
osize = ovfile.size;
if (dvfile.size != osize) { // almost impossible, but so what...
@ -196,13 +196,23 @@ bool PathCopyVirtual(const char* destdir, const char* orig) {
FIL ofile;
u32 osize;
if (!FindVirtualFile(&dvfile, dest))
return false;
if (f_open(&ofile, orig, FA_READ | FA_OPEN_EXISTING) != FR_OK)
return false;
f_lseek(&ofile, 0);
f_sync(&ofile);
osize = f_size(&ofile);
if (!FindVirtualFile(&dvfile, dest, 0)) {
if (!FindVirtualFile(&dvfile, dest, osize)) {
f_close(&ofile);
return false;
}
snprintf(dest, 255, "%s/%s", destdir, dvfile.name);
if (!ShowPrompt(true, "Entry not found: %s\nInject into %s instead?", deststr, dest)) {
f_close(&ofile);
return false;
}
TruncateString(deststr, dest, 36, 8);
}
if (dvfile.size != osize) {
char osizestr[32];
char dsizestr[32];
@ -239,7 +249,7 @@ bool PathCopyVirtual(const char* destdir, const char* orig) {
FIL dfile;
u32 osize;
if (!FindVirtualFile(&ovfile, orig))
if (!FindVirtualFile(&ovfile, orig, 0))
return false;
// check if destination exists
if (f_stat(dest, NULL) == FR_OK) {
@ -563,7 +573,7 @@ bool GetVirtualDirContentsWorker(DirStruct* contents, const char* path) {
VirtualFile vfile;
DirEntry* entry = &(contents->entry[contents->n_entries]);
snprintf(entry->path, 256, "%s/%s", path, virtualFileList[n]);
if (!FindVirtualFile(&vfile, entry->path)) continue;
if (!FindVirtualFile(&vfile, entry->path, 0)) continue;
entry->name = entry->path + strnlen(path, 256) + 1;
entry->size = vfile.size;
entry->type = T_FILE;

View File

@ -22,8 +22,8 @@ VirtualFile virtualFileTemplates[] = {
{ "nand.bin" , 0x00000000, 0x00000000, 0xFF, VFLAG_ON_ALL | VFLAG_NAND_SIZE },
{ "nand_minsize.bin" , 0x00000000, 0x3AF00000, 0xFF, VFLAG_ON_O3DS },
{ "nand_minsize.bin" , 0x00000000, 0x4D800000, 0xFF, VFLAG_ON_N3DS | VFLAG_ON_NO3DS },
{ "nand_hdr.bin" , 0x00000000, 0x00000200, 0xFF, VFLAG_ON_ALL },
{ "sector0x96.bin" , 0x00012C00, 0x00000200, 0xFF, VFLAG_ON_ALL }
{ "sector0x96.bin" , 0x00012C00, 0x00000200, 0xFF, VFLAG_ON_ALL },
{ "nand_hdr.bin" , 0x00000000, 0x00000200, 0xFF, VFLAG_ON_ALL }
};
u32 IsVirtualPath(const char* path) {
@ -45,7 +45,7 @@ bool CheckVirtualPath(const char* path) {
return false;
}
bool FindVirtualFile(VirtualFile* vfile, const char* path)
bool FindVirtualFile(VirtualFile* vfile, const char* path, u32 size)
{
char* fname = strchr(path, '/');
bool on_emunand = false;
@ -68,7 +68,9 @@ bool FindVirtualFile(VirtualFile* vfile, const char* path)
VirtualFile* curr_template = NULL;
for (u32 i = 0; i < n_templates; i++) {
curr_template = &virtualFileTemplates[i];
if ((curr_template->flags & nand_type) && (strncmp(fname, curr_template->name, 32) == 0))
if ((curr_template->flags & nand_type) && (strncasecmp(fname, curr_template->name, 32) == 0))
break;
else if (size && (curr_template->size == size)) //search by size should be a last resort solution
break;
curr_template = NULL;
}

View File

@ -23,6 +23,6 @@ typedef struct {
u32 IsVirtualPath(const char* path);
bool CheckVirtualPath(const char* path);
bool FindVirtualFile(VirtualFile* vfile, const char* path);
bool FindVirtualFile(VirtualFile* vfile, const char* path, u32 size);
int ReadVirtualFile(const VirtualFile* vfile, u8* buffer, u32 offset, u32 count);
int WriteVirtualFile(const VirtualFile* vfile, const u8* buffer, u32 offset, u32 count);