예제 #1
0
        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();
                }
            }
        }
예제 #2
0
        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
            });
        }
예제 #3
0
 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);
 }
예제 #4
0
        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)));
        }