/**************************************************************************** * LoadSzFile * Loads the selected file # from the specified 7z into rbuffer * Returns file size ***************************************************************************/ size_t LoadSzFile(char * filepath, unsigned char * rbuffer) { size_t size = 0; // stop checking if devices were removed/inserted // since we're loading a file HaltDeviceThread(); // halt parsing HaltParseThread(); file = fopen (filepath, "rb"); if (file > 0) { size = SzExtractFile(browserList[browser.selIndex].filenum, rbuffer); fclose (file); } else { ErrorPrompt("Error opening file!"); } // go back to checking if devices were inserted/removed ResumeDeviceThread(); return size; }
/**************************************************************************** * SaveFile * Write buffer to file ***************************************************************************/ 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; if(!FindDevice(filepath, &device)) return 0; if(datasize == 0) return 0; // stop checking if devices were removed/inserted // since we're saving a file HaltDeviceThread(); // halt parsing HaltParseThread(); ShowAction("Saving..."); while(!written && retry == 1) { if(!ChangeInterface(device, silent)) break; file = fopen (filepath, "wb"); if(!file) { if(silent) break; retry = ErrorPromptRetry("Error creating file!"); continue; } while(written < datasize) { if(datasize - written > 4096) nextwrite=4096; else nextwrite = datasize-written; writesize = fwrite (buffer+written, 1, nextwrite, file); if(writesize != nextwrite) break; // write failure written += writesize; } fclose (file); if(written != datasize) written = 0; if(!written) { unmountRequired[device] = true; if(silent) break; retry = ErrorPromptRetry("Error saving file!"); } } // go back to checking if devices were inserted/removed ResumeDeviceThread(); CancelAction(); return written; }
/**************************************************************************** * LoadFile ***************************************************************************/ size_t LoadFile (char * rbuffer, char *filepath, size_t length, bool silent) { char zipbuffer[2048]; size_t size = 0, offset = 0, readsize = 0; int retry = 1; int device; if(!FindDevice(filepath, &device)) return 0; // stop checking if devices were removed/inserted // since we're loading a file HaltDeviceThread(); // halt parsing HaltParseThread(); // open the file while(retry) { if(!ChangeInterface(device, silent)) break; file = fopen (filepath, "rb"); 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, 32, file); if(!readsize) { unmountRequired[device] = true; retry = ErrorPromptRetry("Error reading file!"); fclose (file); continue; } if (IsZipFile (zipbuffer)) { size = UnZipBuffer ((unsigned char *)rbuffer); // unzip } else { fseeko(file,0,SEEK_END); size = ftello(file); fseeko(file,0,SEEK_SET); while(!feof(file)) { // If the size requested is *less* than the filesize, only read that much - we don't want to overrun the buffer int toread = 4096; if (length > 0 && offset+toread > length) { toread = length - offset; } ShowProgress ("Loading...", offset, size); readsize = fread (rbuffer + offset, 1, 4096, file); // read in next chunk if(readsize <= 0) break; // reading finished (or failed) offset += readsize; if (length > 0 && offset >= length) { break; } } size = offset; CancelAction(); } } retry = 0; fclose (file); } // go back to checking if devices were inserted/removed ResumeDeviceThread(); CancelAction(); return size; }
int SzParse(char * filepath) { if(!filepath) return 0; int device; if(!FindDevice(browser.dir, &device) || !GetFileSize(browser.selIndex)) return 0; int nbfiles = 0; // save the length/offset of this file unsigned int filelen = browserList[browser.selIndex].length; // setup archive stream SzArchiveStream.offset = 0; SzArchiveStream.len = filelen; SzArchiveStream.pos = 0; // open file file = fopen (filepath, "rb"); if(!file) return 0; // set szMethod to current chosen load device szMethod = device; // set handler functions for reading data from SD/USB/SMB/DVD SzArchiveStream.InStream.Read = SzFileReadImp; SzArchiveStream.InStream.Seek = SzFileSeekImp; // set default 7Zip SDK handlers for allocation and freeing memory SzAllocImp.Alloc = SzAlloc; SzAllocImp.Free = SzFree; SzAllocTempImp.Alloc = SzAllocTemp; SzAllocTempImp.Free = SzFreeTemp; // prepare CRC and 7Zip database structures InitCrcTable(); SzArDbExInit(&SzDb); // open the archive SzRes = SzArchiveOpen(&SzArchiveStream.InStream, &SzDb, &SzAllocImp, &SzAllocTempImp); if (SzRes != SZ_OK) { SzDisplayError(SzRes); // free memory used by the 7z SDK SzClose(); } else // archive opened successfully { if(SzDb.Database.NumFiles > 0) { // Parses the 7z into a full file listing HaltParseThread(); // halt parsing ResetBrowser(); // reset browser // add '..' folder in case the user wants exit the 7z AddBrowserEntry(); sprintf(browserList[0].displayname, "Up One Level"); browserList[0].isdir = 1; browserList[0].length = filelen; browserList[0].icon = ICON_FOLDER; // get contents and parse them into file list structure unsigned int SzI, SzJ; SzJ = 1; for (SzI = 0; SzI < SzDb.Database.NumFiles; SzI++) { SzF = SzDb.Database.Files + SzI; // skip directories if (SzF->IsDirectory) continue; if(!AddBrowserEntry()) { ResetBrowser(); ErrorPrompt("Out of memory: too many files!"); SzClose(); SzJ = 0; break; } // parse information about this file to the file list structure snprintf(browserList[SzJ].filename, MAXJOLIET, "%s", SzF->Name); StripExt(browserList[SzJ].displayname, browserList[SzJ].filename); browserList[SzJ].length = SzF->Size; // filesize browserList[SzJ].isdir = 0; // only files will be displayed (-> no flags) browserList[SzJ].filenum = SzI; // the extraction function identifies the file with this number SzJ++; } nbfiles = SzJ; } else { SzClose(); } } CancelAction(); // close file fclose(file); return nbfiles; }
/**************************************************************************** * BrowserChangeFolder * * Update current directory and set new entry list if directory has changed ***************************************************************************/ int BrowserChangeFolder() { int device = 0; FindDevice(browser.dir, &device); if(inSz && browser.selIndex == 0) // inside a 7z, requesting to leave { inSz = false; SzClose(); } if(!UpdateDirName()) return -1; HaltParseThread(); CleanupPath(browser.dir); ResetBrowser(); if(browser.dir[0] != 0) { if(strstr(browser.dir, ".7z")) { BrowserLoadSz(); } else { ParseDirectory(true, true); } FindAndSelectLastLoadedFile(); } if(browser.numEntries == 0) { browser.dir[0] = 0; int i=0; #ifdef HW_RVL AddBrowserEntry(); sprintf(browserList[i].filename, "sd:/"); sprintf(browserList[i].displayname, "SD Card"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_SD; i++; AddBrowserEntry(); sprintf(browserList[i].filename, "usb:/"); sprintf(browserList[i].displayname, "USB Mass Storage"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_USB; i++; #else AddBrowserEntry(); sprintf(browserList[i].filename, "carda:/"); sprintf(browserList[i].displayname, "SD Gecko Slot A"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_SD; i++; AddBrowserEntry(); sprintf(browserList[i].filename, "cardb:/"); sprintf(browserList[i].displayname, "SD Gecko Slot B"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_SD; i++; #endif AddBrowserEntry(); sprintf(browserList[i].filename, "smb:/"); sprintf(browserList[i].displayname, "Network Share"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_SMB; i++; AddBrowserEntry(); sprintf(browserList[i].filename, "dvd:/"); sprintf(browserList[i].displayname, "Data DVD"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_DVD; i++; browser.numEntries += i; } if(browser.dir[0] == 0) { GCSettings.LoadFolder[0] = 0; GCSettings.LoadMethod = 0; } else { char * path = StripDevice(browser.dir); if(path != NULL) strcpy(GCSettings.LoadFolder, path); FindDevice(browser.dir, &GCSettings.LoadMethod); } return browser.numEntries; }
/**************************************************************************** * BrowserChangeFolder * * Update current directory and set new entry list if directory has changed ***************************************************************************/ int BrowserChangeFolder() { int device = 0; FindDevice(browser.dir, &device); if(!UpdateDirName()){ return -1; } HaltParseThread(); // halt parsing CleanupPath(browser.dir); ResetBrowser(); // reset browser if(browser.dir[0] != 0){ ParseDirectory(); } if(browser.numEntries == 0) { browser.dir[0] = 0; int i=0; #if 0 AddBrowserEntry(); sprintf(browserList[i].filename, "uda:/"); sprintf(browserList[i].displayname, "USB Mass Storage"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_USB; i++; AddBrowserEntry(); sprintf(browserList[i].filename, "sda0:/"); sprintf(browserList[i].displayname, "Hard Drive"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_SD; i++; AddBrowserEntry(); sprintf(browserList[i].filename, "smb:/"); sprintf(browserList[i].displayname, "Network Share"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_SMB; i++; AddBrowserEntry(); sprintf(browserList[i].filename, "dvd:/"); sprintf(browserList[i].displayname, "Data DVD"); browserList[i].length = 0; browserList[i].isdir = 1; browserList[i].icon = ICON_DVD; i++; #else // dynamic use int iusb = 0; int ihdd = 0; int imisc = 0; for (int id = 3; id < STD_MAX; id++) { if (devoptab_list[id]->structSize) { AddBrowserEntry(); sprintf(browserList[i].filename, "%s:/", devoptab_list[id]->name); browserList[i].length = 0; browserList[i].isdir = 1; switch(browserList[i].filename[0]) { case 'u': { browserList[i].icon = ICON_USB; sprintf(browserList[i].displayname, "USB Mass Storage %d", iusb++); break; } case 's': { browserList[i].icon = ICON_SD; sprintf(browserList[i].displayname, "Hard Drive %d", ihdd++); break; } default: { browserList[i].icon = ICON_DVD; sprintf(browserList[i].displayname, "DVD %d", imisc++); break; } } printf("findDevices : %s\r\n", browserList[i].filename); i++; } } #endif browser.numEntries += i; } if(browser.dir[0] == 0) { GCSettings.LoadFolder[0] = 0; GCSettings.LoadMethod = 0; } else { char * path = StripDevice(browser.dir); if(path != NULL) strcpy(GCSettings.LoadFolder, path); FindDevice(browser.dir, &GCSettings.LoadMethod); } return browser.numEntries; }