/**************************************************************************** * 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; }
bool DownloadUpdate() { bool result = false; if(updateURL[0] == 0 || appPath[0] == 0 || !ChangeInterface(appPath, NOTSILENT)) { ErrorPrompt("Update failed!"); updateFound = false; // updating is finished (successful or not!) return false; } // stop checking if devices were removed/inserted // since we're saving a file HaltDeviceThread(); int device; FindDevice(appPath, &device); char updateFile[50]; sprintf(updateFile, "%s%s Update.zip", pathPrefix[device], APPNAME); FILE * hfile = fopen (updateFile, "wb"); if (hfile) { if(http_request(updateURL, hfile, NULL, (1024*1024*10), NOTSILENT) > 0) { fclose (hfile); result = unzipArchive(updateFile, (char *)pathPrefix[device]); } else { fclose (hfile); } remove(updateFile); // delete update file } // go back to checking if devices were inserted/removed ResumeDeviceThread(); if(result) InfoPrompt("Update successful!"); else ErrorPrompt("Update failed!"); updateFound = false; // updating is finished (successful or not!) return result; }
bool DownloadUpdate() { bool result = false; if(strlen(updateURL) > 0) { // stop checking if devices were removed/inserted // since we're saving a file HaltDeviceThread(); FILE * hfile; char updateFile[50]; sprintf(updateFile, "sd:/%s Update.zip", APPNAME); hfile = fopen (updateFile, "wb"); if (hfile > 0) { int retval; retval = http_request(updateURL, hfile, NULL, (1024*1024*5)); fclose (hfile); } bool unzipResult = unzipArchive(updateFile, (char *)"sd:/"); remove(updateFile); // delete update file if(unzipResult) { result = true; InfoPrompt("Update successful!"); } else { result = false; ErrorPrompt("Update failed!"); } updateFound = false; // updating is finished (successful or not!) // go back to checking if devices were inserted/removed ResumeDeviceThread(); } return result; }
/**************************************************************************** * 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; }
bool DownloadUpdate() { bool result = false; if(updateURL[0] == 0 || appPath[0] == 0 || !ChangeInterface(appPath, NOTSILENT)) { ErrorPrompt("Did you unplug your SD/USB?"); return false; } // stop checking if devices were removed/inserted // since we're saving a file HaltDeviceThread(); int device; FindDevice(appPath, &device); char updateFile[50]; sprintf(updateFile, "%s%sUpdate.zip", pathPrefix[device], APPNAME); FILE * hfile = fopen (updateFile, "wb"); if (hfile) { if(http_request(updateURL, hfile, NULL, (1024*1024*10), NOTSILENT, 0) > 0) { ShowAction("Extracting update..."); fclose (hfile); CSHA1 sha1; if(sha1.HashFile(updateFile)){ char fileHash[41]=""; sha1.Final(); sha1.ReportHash(fileHash, 0); if(!strcasecmp(fileHash, updateHash)){ char destPath[256]; sprintf(destPath, "%sapps", pathPrefix[device]); result = unzipArchive(updateFile, destPath); }else{ ErrorPrompt("Corrupted file!"); } }else{ ErrorPrompt("Could not verify file!"); } } else { ErrorPrompt("Unable to download!"); fclose (hfile); } remove(updateFile); // delete update file }else{ ErrorPrompt("Unable to write to SD/USB!"); } // go back to checking if devices were inserted/removed ResumeDeviceThread(); if(result){ InfoPrompt("Update successful!"); } CancelAction(); return result; }