private void SfvOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs) { var opts = doWorkEventArgs.Argument as XisoOptions; if (opts == null) { return; } var sfvgen = new SfvGenerator(opts.Target); BinaryReader br = null; try { XisoListAndSize xisoEntries; XisoExtractor.UpdateStatus(string.Format("Generating SFV for {0}", opts.Source)); if (!XisoExtractor.GetFileListAndSize(opts, out xisoEntries, out br)) { return; } long totalDone = 0; XisoExtractor.UpdateOperation("Generating SFV CRC32 values..."); foreach (var entry in xisoEntries.List) { if (!entry.IsFile) { continue; } XisoExtractor.UpdateStatus(string.Format("Calculating CRC32 for: {0}{1} ({2})", entry.Path, entry.Name, Utils.GetSizeReadable(entry.Size))); br.BaseStream.Seek(entry.Offset, SeekOrigin.Begin); var left = entry.Size; uint crc = 0; while (left > 0) { if (XisoExtractor.Abort) { return; } var size = Utils.GetSmallest(0x4000, left); crc = SfvGenerator.Crc.ComputeChecksum(br.ReadBytes((int)size), crc); left -= size; totalDone += size; XisoExtractorFileProgress(null, new EventArg <double, long>(Utils.GetPercentage(entry.Size - left, entry.Size), size)); XisoExtractorTotalProgress(null, new EventArg <double>(Utils.GetPercentage(totalDone, xisoEntries.Size))); } sfvgen.AddFile(Path.Combine(entry.Path, entry.Name), crc); } sfvgen.Save(); } finally { if (br != null) { br.Close(); } } }
private static void SingleExtractDoWork(object sender, DoWorkEventArgs e) { if (!(e.Argument is BwArgs)) { e.Cancel = true; return; } var args = e.Argument as BwArgs; e.Result = XisoExtractor.ExtractXiso(new XisoOptions { Source = args.Source, Target = args.Target, ExcludeSysUpdate = args.SkipSystemUpdate, GenerateFileList = args.GenerateFileList, GenerateSfv = args.GenerateSfv, UseFtp = args.UseFtp, FtpOpts = args.FtpSettings, DeleteIsoOnCompletion = args.DeleteIsoOnCompletion }); }
public static bool SendFile(string file, ref BinaryReader src, long offset, long size, XisoOptions xisoOpts, string path) { if (!Client.IsConnected) { XisoExtractor.UpdateStatus("FTP Not connected!"); return(false); } try { using (var stream = Client.OpenWrite(file)) { if (src.BaseStream.Position != offset) { if (!Seek(ref src, offset, size)) { src.Close(); XisoExtractor.UpdateStatus("Seek failure!"); return(false); } } else if (src.BaseStream.Length < src.BaseStream.Position + size) { src.Close(); XisoExtractor.UpdateStatus("Size failure!"); return(false); } long processed = 0; XISOStatus.UpdateFTPProgress(processed, size); uint crc = 0; while (processed < size) { if (XisoExtractor.Abort) { return(false); } var sendsize = Utils.GetSmallest(size - processed, BufferSize); var data = src.ReadBytes((int)sendsize); stream.Write(data, 0, data.Length); if (xisoOpts.GenerateSfv) { crc = SfvGenerator.Crc.ComputeChecksum(data, crc); } processed += sendsize; var handler = ProgressUpdate; if (handler != null) { handler.Invoke(null, new EventArg <long, long, long>(sendsize, processed, size)); } XISOStatus.UpdateFTPProgress(processed, size); } if (xisoOpts.GenerateSfv) { xisoOpts.SfvGen.AddFile(Path.Combine(path, file), crc); } } } catch (Exception ex) { LastError = ex.Message; MessageBox.Show(string.Format(Resources.XISOFTPTransferError, file, ex), Resources.FTPTransferErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } return(true); }
private void MultiExtractDoWork(object sender, DoWorkEventArgs e) { var sw = new Stopwatch(); sw.Start(); if (!(e.Argument is List <BwArgs>)) { e.Cancel = true; return; } var args = e.Argument as List <BwArgs>; XisoExtractor.MultiSize = 0; var list = new XisoListAndSize[args.Count]; for (var i = 0; i < args.Count; i++) { if (XisoExtractor.Abort) { return; } BinaryReader br; XisoExtractor.UpdateStatus(string.Format("Getting information about {0}", args[i].Source)); args[i].Result = XisoExtractor.GetFileListAndSize(new XisoOptions { Source = args[i].Source, Target = args[i].Target, ExcludeSysUpdate = args[i].SkipSystemUpdate, GenerateFileList = args[i].GenerateFileList, GenerateSfv = args[i].GenerateSfv, UseFtp = args[i].UseFtp, FtpOpts = args[i].FtpSettings, DeleteIsoOnCompletion = args[i].DeleteIsoOnCompletion }, out list[i], out br); if (br != null) { br.Close(); } if (args[i].Result) { XisoExtractor.MultiSize += list[i].Size; } args[i].ErrorMsg = XisoExtractor.GetLastError(); GC.Collect(); } for (var i = 0; i < args.Count; i++) { if (XisoExtractor.Abort) { return; } if (!args[i].Result) { continue; } args[i].Result = XisoExtractor.ExtractXiso(new XisoOptions { Source = args[i].Source, Target = args[i].Target, ExcludeSysUpdate = args[i].SkipSystemUpdate, GenerateFileList = args[i].GenerateFileList, GenerateSfv = args[i].GenerateSfv, UseFtp = args[i].UseFtp, FtpOpts = args[i].FtpSettings, DeleteIsoOnCompletion = args[i].DeleteIsoOnCompletion }, list[i]); args[i].ErrorMsg = XisoExtractor.GetLastError(); } var failed = 0; foreach (var result in args) { if (!result.Result) { failed++; } } e.Result = failed == 0 ? (object)true : args; sw.Stop(); XisoExtractorOnOperation(null, new EventArg <string>(string.Format("Completed Queue after {0:F0} Minute(s) and {1} Second(s)", sw.Elapsed.TotalMinutes, sw.Elapsed.Seconds))); XisoExtractorOnStatus(null, new EventArg <string>(string.Format("Completed Queue after {0:F0} Minute(s) and {1} Second(s)", sw.Elapsed.TotalMinutes, sw.Elapsed.Seconds))); }