예제 #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 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)));
        }