Example #1
0
        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);
                            }
                        }
                    }
                }
            }
        }
Example #3
0
        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);
            }
        }