コード例 #1
0
        public void ProgressIsZeroAfterAddingOneSubprogress()
        {
            IProgressReporter parentProgress = new FakeProgressReporter();
            ProgressReporter  progress       = new ProgressReporter(parentProgress);

            progress.AddSubProgress(1);

            Assert.AreEqual(0, parentProgress.Progress);
            Assert.AreEqual(0, progress.Progress);
            Assert.AreEqual(0, progress[0].Progress);
        }
コード例 #2
0
        private void ExtractFiles(IEnumerable <string> folders, string searchPattern,
                                  IExtractor extractor, ProgressReporter progress)
        {
            List <ExtractionPaths> paths = EnumerateFiles(folders, searchPattern).ToList();

            progress.AddSubProgress(paths.Count);

            for (int i = 0; i < paths.Count; ++i)
            {
                extractor.Extract(paths[i], progress[i]);
            }
        }
コード例 #3
0
        /// <summary>
        /// Starts the extraction process from the original game's files.
        /// </summary>
        /// <param name="progress">ProgressReporter to report the progress to.</param>
        public void Extract(ProgressReporter progress)
        {
            SafeNativeMethods.SetDllDirectory("libs/");

            progress.AddSubProgress(5, weight: 1);
            progress.AddSubProgress(1, weight: 10); // there are 5k SMK files in the MFF file.

            var dbiExtractor = new DbiExtractor();

            var cdMusicExtractor = new CompactDiscMusicExtractor();
            var mdbExtractor     = new MdbExtractor();
            var zipMdbExtractor  = new ZippedMdbExtractor(mdbExtractor);
            var smkExtractor     = new SmackerVideoExtractor();
            var mffExtractor     = new MffExtractor(smkExtractor);

            Directory.CreateDirectory(m_tempFilesPath);

            Parallel.Invoke
            (
                () => cdMusicExtractor.Extract
                (
                    new ExtractionPaths
            {
                OriginalFileName = $@"{m_originalFilesPath[0]}:\",
                OriginalFilePath = $@"{m_originalFilesPath[0]}:\",
                OutputDirectory  = Path.Combine(m_newFilesPath, "Music"),
                TempDirectory    = m_tempFilesPath
            }, progress[0]
                ),

                () => ExtractFiles(GetMdbFolders(), "*.mdb", mdbExtractor, progress[1]),
                () => ExtractFiles(GetMdbFolders(), "*.zip", zipMdbExtractor, progress[2]),
                () => ExtractFiles(GetDbiFolders(), "*.dbi", dbiExtractor, progress[3]),
                () => ExtractFiles(GetSmkImageFolders(), "*.smk", smkExtractor, progress[4]),
                () => ExtractFiles(GetMffFolders(), "*.ff", mffExtractor, progress[5])
            );

            Directory.Delete(m_tempFilesPath, recursive: true);
        }
コード例 #4
0
        public void ProgressAfterReportingOneSubprogress()
        {
            IProgressReporter parentProgress = new FakeProgressReporter();
            ProgressReporter  progress       = new ProgressReporter(parentProgress);

            progress.AddSubProgress(1);

            progress[0].Report(40);

            Assert.AreEqual(40, parentProgress.Progress);
            Assert.AreEqual(40, progress.Progress);
            Assert.AreEqual(40, progress[0].Progress);
        }
コード例 #5
0
        public void ProgressAfterReportingTwoLevelsOfSubprogress()
        {
            IProgressReporter parentProgress = new FakeProgressReporter();
            ProgressReporter  progress       = new ProgressReporter(parentProgress);

            progress.AddSubProgress(1);
            progress[0].AddSubProgress(1);

            progress[0][0].Report(45);

            Assert.AreEqual(45, parentProgress.Progress);
            Assert.AreEqual(45, progress.Progress);
            Assert.AreEqual(45, progress[0].Progress);
            Assert.AreEqual(45, progress[0][0].Progress);
        }
コード例 #6
0
        public void ProgressAfterReportingTwoSubprogress()
        {
            IProgressReporter parentProgress = new FakeProgressReporter();
            ProgressReporter  progress       = new ProgressReporter(parentProgress);

            progress.AddSubProgress(2);

            progress[0].Report(100);
            progress[1].Report(50);

            Assert.AreEqual(75, parentProgress.Progress);
            Assert.AreEqual(75, progress.Progress);
            Assert.AreEqual(100, progress[0].Progress);
            Assert.AreEqual(50, progress[1].Progress);
        }
コード例 #7
0
        public void Extract(ExtractionPaths paths, ProgressReporter progress = null)
        {
            char driveLetter = Path.GetFullPath(paths.OriginalFilePath)[0];

            if (!m_drive.Open(driveLetter))
            {
                throw new InvalidOperationException($"Cannot open drive {driveLetter}");
            }

            if (!m_drive.Refresh())
            {
                throw new InvalidOperationException($"Cannot refresh drive {driveLetter}");
            }

            var audioTracks = GetAudioTracks().ToList();

            progress?.AddSubProgress(audioTracks.Count);

            for (int i = 0; i < audioTracks.Count; i++)
            {
                ReadAudioTrack(audioTracks[i], paths, progress?[i]);
            }
        }