public SuperbundleFile AddBundle(string name) { if (name == null) { throw new ArgumentNullException("name"); } name = Helpers.FilterName(name).ToLowerInvariant(); lock (this._Lock) { SuperbundleFile superbundle; if (this._Superbundles.TryGetValue(name, out superbundle) == true) { return(superbundle); } if (IsChunkBundle(name) == false) { var installChunks = this._Layout.InstallManifest.InstallChunks.Where( ic => ic.Superbundles != null && ic.Superbundles.Any(sbi => Helpers.CompareName(name, sbi) == 0) == true); int count = 0; foreach (var installChunk in installChunks) { if (this.AddInstallChunk(installChunk) == false) { continue; } count++; } if (count <= 0) { return(null); } } var superbundlePath = Path.Combine(this._DataPath, Helpers.FilterPath(name) + ".sb"); var tableOfContentsPath = Path.Combine(this._DataPath, Helpers.FilterPath(name) + ".toc"); if (File.Exists(superbundlePath) == false || File.Exists(tableOfContentsPath) == false) { return(null); } var tableOfContents = TableOfContentsFile.Read(tableOfContentsPath); if (tableOfContents.IsCas == false) { throw new NotSupportedException(); } superbundle = SuperbundleFile.Read(superbundlePath); this._Superbundles[name] = superbundle; this._TableOfContents[name] = tableOfContents; return(superbundle); } }
public static void Main(string[] args) { bool convertTextures = false; bool showHelp = false; var options = new OptionSet() { { "convert-textures", "convert textures", v => convertTextures = v != null }, { "h|help", "show this message and exit", v => showHelp = v != null }, }; 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 < 1 || extras.Count > 2 || showHelp == true) { Console.WriteLine("Usage: {0} [OPTIONS]+ input_[sb|toc] [output_dir]", GetExecutableName()); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return; } string bundlePath, superbundlePath, layoutPath, outputBasePath; if (Path.GetExtension(extras[0]) == ".sb") { superbundlePath = Path.GetFullPath(extras[0]); bundlePath = Path.ChangeExtension(superbundlePath, ".toc"); layoutPath = Helpers.FindLayoutPath(superbundlePath); outputBasePath = extras.Count > 1 ? extras[1] : Path.ChangeExtension(superbundlePath, null) + "_unpack"; } else { bundlePath = Path.GetFullPath(extras[0]); superbundlePath = Path.ChangeExtension(bundlePath, ".sb"); layoutPath = Helpers.FindLayoutPath(bundlePath); outputBasePath = extras.Count > 1 ? extras[1] : Path.ChangeExtension(bundlePath, null) + "_unpack"; } if (string.IsNullOrEmpty(layoutPath) == true) { Console.WriteLine("Could not find layout file."); return; } var dataPath = Path.GetDirectoryName(layoutPath) ?? ""; var bundle = TableOfContentsFile.Read(bundlePath); var superbundle = SuperbundleFile.Read(superbundlePath); var extensionsById = ResourceTypes.GetExtensions(); if (bundle.IsCas == false) { throw new NotImplementedException(); } else { var commonBundlePaths = Directory.GetFiles(dataPath, "chunks*.toc", SearchOption.AllDirectories); var commonBundles = new List <TableOfContentsFile>(); foreach (var commonBundlePath in commonBundlePaths) { var commonBundle = TableOfContentsFile.Read(commonBundlePath); commonBundles.Add(commonBundle); } var superbundleName = Path.ChangeExtension(superbundlePath.Substring(dataPath.Length + 1), null); superbundleName = Helpers.FilterName(superbundleName).ToLowerInvariant(); var layout = LayoutFile.Read(layoutPath); var installChunks = GetSuperbundleInstallChunks(layout, superbundleName); var catalogLookup = new CatalogLookup(dataPath); foreach (var installChunk in installChunks) { if (catalogLookup.Add(installChunk.InstallBundle) == false) { Console.WriteLine("Failed to load catalog for '{0}'.", installChunk.Name); } } foreach (var bundleInfo in superbundle.Bundles) { if (bundleInfo.Resources == null) { continue; } foreach (var resourceInfo in bundleInfo.Resources) { var entry = catalogLookup.GetEntry(resourceInfo); if (entry == null) { Console.WriteLine("Could not find catalog entry for '{0}'.", resourceInfo.Name); continue; } if (entry.CompressedSize != resourceInfo.Size) { throw new FormatException(); } var outputName = Helpers.FilterPath(resourceInfo.Name); var outputPath = Path.Combine(outputBasePath, outputName + ".dummy"); var outputParentPath = Path.GetDirectoryName(outputPath); if (string.IsNullOrEmpty(outputParentPath) == false) { Directory.CreateDirectory(outputParentPath); } Console.WriteLine("{0}", resourceInfo.Name); bool wasConverted = false; if (convertTextures == true && resourceInfo.ResourceType == ResourceTypes.Texture) { wasConverted = ConvertTexture(bundleInfo, resourceInfo, entry, outputPath, catalogLookup, commonBundles); } if (wasConverted == false) { string extension; if (extensionsById.TryGetValue(resourceInfo.ResourceType, out extension) == true) { extension = "." + extension; } else { extension = ".#" + resourceInfo.ResourceType.ToString("X8"); } outputPath = Path.Combine(outputBasePath, outputName + extension); using (var output = File.Create(outputPath)) { Extraction.Extract(resourceInfo, entry, output); } } } } } }
public SuperbundleFile MountSuperbundle(string name) { if (string.IsNullOrEmpty("name") == true) { throw new ArgumentNullException("name"); } name = Helpers.FilterName(name).ToLowerInvariant(); lock (this._Lock) { SuperbundleFile superbundle; if (this._Superbundles.TryGetValue(name, out superbundle) == true) { return(superbundle); } if (IsChunkBundle(name) == false) { int count = 0; foreach (var installChunk in this.GetRequiredInstallChunks(name)) { if (this.MountInstallChunk(installChunk) == false) { continue; } count++; } if (count <= 0) { return(null); } } var superbundlePath = Helpers.FilterPath(name) + ".sb"; superbundle = this.ReadFile( superbundlePath, s => { Logger.Debug("Reading superbundle '{0}'", superbundlePath); return(SuperbundleFile.Read(s)); }); if (superbundle == null) { Logger.Warn("Failed to read superbundle '{0}'", superbundlePath); return(null); } var tableOfContentsPath = Helpers.FilterPath(name) + ".toc"; var tableOfContents = this.ReadFile( tableOfContentsPath, s => { Logger.Debug("Reading TOC '{0}'", tableOfContentsPath); return(TableOfContentsFile.Read(s)); }); if (tableOfContents == null) { Logger.Warn("Failed to read TOC '{0}'", tableOfContentsPath); return(null); } if (tableOfContents.IsCas == false) { throw new NotSupportedException(); } this._Superbundles[name] = superbundle; this._TableOfContents[name] = tableOfContents; return(superbundle); } }