public static void Main(string[] args) { bool showHelp = false; string currentProject = null; var options = new OptionSet() { { "h|help", "show this message and exit", v => showHelp = v != null }, { "p|project=", "override current project", v => currentProject = v }, }; List <string> extras; try { extras = options.Parse(args); } catch (OptionException e) { Console.Write("{0}: ", GetExecutableName()); Console.WriteLine(e.Message); Console.WriteLine("Try `{0} --help' for more information.", GetExecutableName()); return; } if (extras.Count != 0 || showHelp == true) { Console.WriteLine("Usage: {0} [OPTIONS]+", GetExecutableName()); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return; } Console.WriteLine("Loading project..."); var manager = Manager.Load(currentProject); if (manager.ActiveProject == null) { Console.WriteLine("Nothing to do: no active project loaded."); return; } var project = manager.ActiveProject; HashList <ulong> knownHashes = null; var installPath = project.InstallPath; var listsPath = project.ListsPath; if (installPath == null) { Console.WriteLine("Could not detect install path."); return; } if (listsPath == null) { Console.WriteLine("Could not detect lists path."); return; } Console.WriteLine("Searching for archives..."); var archivePaths = new List <string>(); archivePaths.AddRange(Directory.GetFiles(installPath, "*.a", SearchOption.AllDirectories)); archivePaths.RemoveAll(p => p.Contains("_unpack") == true); var outputPaths = new List <string>(); var breakdown = new Breakdown(); var tracking = new Tracking(); Console.WriteLine("Processing..."); for (int i = 0; i < archivePaths.Count; i++) { var archivePath = archivePaths[i]; var outputPath = GetListPath(installPath, archivePath); if (outputPath == null) { throw new InvalidOperationException(); } Console.WriteLine(outputPath); outputPath = Path.Combine(listsPath, outputPath); if (outputPaths.Contains(outputPath) == true) { throw new InvalidOperationException(); } outputPaths.Add(outputPath); if (File.Exists(archivePath + ".bak") == true) { archivePath += ".bak"; } using (var input = File.OpenRead(archivePath)) { IArchiveFile archive; if (ArchiveFile.IsValid(input) == true) { archive = new ArchiveFile(); } else if (Gibbed.Antibirth.FileFormats.ArchiveFile.IsValid(input) == true) { archive = new Gibbed.Antibirth.FileFormats.ArchiveFile(); } else { throw new NotSupportedException(); } archive.Deserialize(input); knownHashes = manager.LoadListsFileNames(); if (knownHashes == null) { throw new InvalidOperationException(); } HandleEntries(archive.Entries.Select(e => e.NameHash).Distinct(), knownHashes, tracking, breakdown, outputPath); } } using (var output = new StreamWriter(Path.Combine(Path.Combine(listsPath, "files"), "status.txt"))) { output.WriteLine( "{0}", new Breakdown() { Known = tracking.Names.Distinct().Count(), Total = tracking.Hashes.Distinct().Count(), }); } }
public static void Main(string[] args) { bool showHelp = false; string currentProject = null; var options = new OptionSet() { { "h|help", "show this message and exit", v => showHelp = v != null }, { "p|project=", "override current project", v => currentProject = v }, }; List <string> extras; try { extras = options.Parse(args); } catch (OptionException e) { Console.Write("{0}: ", GetExecutableName()); Console.WriteLine(e.Message); Console.WriteLine("Try `{0} --help' for more information.", GetExecutableName()); return; } if (extras.Count != 0 || showHelp == true) { Console.WriteLine("Usage: {0} [OPTIONS]+", GetExecutableName()); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return; } Console.WriteLine("Loading project..."); var manager = Manager.Load(currentProject); if (manager.ActiveProject == null) { Console.WriteLine("Nothing to do: no active project loaded."); return; } var project = manager.ActiveProject; var version = -1; HashList <ulong> knownHashes = null; HashList <ulong> subFatHashes = null; var installPath = project.InstallPath; var listsPath = project.ListsPath; if (installPath == null) { Console.WriteLine("Could not detect install path."); return; } if (listsPath == null) { Console.WriteLine("Could not detect lists path."); return; } Console.WriteLine("Searching for archives..."); var fatPaths = new List <string>(); fatPaths.AddRange(Directory.GetFiles(installPath, "*.fat", SearchOption.AllDirectories)); var outputPaths = new List <string>(); var breakdown = new Breakdown(); var tracking = new Tracking(); Console.WriteLine("Processing..."); for (int i = 0; i < fatPaths.Count; i++) { var fatPath = fatPaths[i]; var datPath = Path.ChangeExtension(fatPath, ".dat"); var outputPath = GetListPath(installPath, fatPath); if (outputPath == null) { throw new InvalidOperationException(); } Console.WriteLine(outputPath); outputPath = Path.Combine(listsPath, outputPath); if (outputPaths.Contains(outputPath) == true) { throw new InvalidOperationException(); } outputPaths.Add(outputPath); if (File.Exists(fatPath + ".bak") == true) { fatPath += ".bak"; datPath += ".bak"; } var fat = new BigFile(); using (var input = File.OpenRead(fatPath)) { fat.Deserialize(input); } if (version == -1) { version = fat.Version; knownHashes = manager.LoadListsFileNames(fat.Version); subFatHashes = manager.LoadListsSubFatNames(fat.Version); } else if (version != fat.Version) { throw new InvalidOperationException(); } if (knownHashes == null || subFatHashes == null) { throw new InvalidOperationException(); } HandleEntries(fat.Entries.Select(e => e.NameHash).Distinct(), knownHashes, tracking, breakdown, outputPath); using (var input = File.OpenRead(datPath)) { foreach (var headerEntry in fat.Entries.Where(e => subFatHashes.Contains(e.NameHash) == true)) { var subFat = new SubFatFile(); using (var temp = new MemoryStream()) { Big.EntryDecompression.Decompress(headerEntry, input, temp); temp.Position = 0; subFat.Deserialize(temp, fat); } var matchingSubFats = fat.SubFats .Where(sf => subFat.Entries.SequenceEqual(sf.Entries)) .ToArray(); if (matchingSubFats.Length == 0) { continue; } if (matchingSubFats.Length > 1) { throw new InvalidOperationException(); } var subfatPath = GetListPath(installPath, fatPath, FilterEntryName(subFatHashes[headerEntry.NameHash])); if (subfatPath == null) { throw new InvalidOperationException(); } Console.WriteLine(subfatPath); subfatPath = Path.Combine(listsPath, subfatPath); HandleEntries(subFat.Entries.Select(e => e.NameHash), knownHashes, tracking, breakdown, subfatPath); } } } using (var output = new StreamWriter(Path.Combine(Path.Combine(listsPath, "files"), "status.txt"))) { output.WriteLine("{0}", new Breakdown() { Known = tracking.Names.Distinct().Count(), Total = tracking.Hashes.Distinct().Count(), }); } }