using AssetRipper.IO.Files.BundleFiles.Archive; using AssetRipper.IO.Files.BundleFiles.FileStream; using AssetRipper.IO.Files.BundleFiles.RawWeb.Raw; using AssetRipper.IO.Files.BundleFiles.RawWeb.Web; using AssetRipper.IO.Files.CompressedFiles.Brotli; using AssetRipper.IO.Files.CompressedFiles.GZip; using AssetRipper.IO.Files.ResourceFiles; using AssetRipper.IO.Files.SerializedFiles; using AssetRipper.IO.Files.Streams.MultiFile; using AssetRipper.IO.Files.Streams.Smart; using AssetRipper.IO.Files.WebFiles; namespace AssetRipper.IO.Files { public static class SchemeReader { private static readonly Stack schemes = new() { SerializedFileScheme.Default, new GZipFileScheme(), new BrotliFileScheme(), new WebFileScheme(), new ArchiveBundleScheme(), new WebBundleScheme(), new RawBundleScheme(), new FileStreamBundleScheme(), }; public static FileBase LoadFile(string filePath) { SmartStream stream = SmartStream.OpenRead(filePath); return ReadFile(stream, MultiFileStream.GetFilePath(filePath), MultiFileStream.GetFileName(filePath)); } public static FileBase ReadFile(byte[] buffer, string filePath, string fileName) { SmartStream smartStream = SmartStream.CreateMemory(buffer, 0, buffer.Length, false); return ReadFile(smartStream, filePath, fileName); } public static FileBase ReadFile(SmartStream stream, string filePath, string fileName) { foreach (IScheme scheme in schemes) { if (scheme.CanRead(stream)) { return scheme.Read(stream, filePath, fileName); } } return new ResourceFile(stream, filePath, fileName); } public static FileBase ReadFile(ResourceFile file) { return ReadFile(file.Stream.CreateReference(), file.FilePath, file.Name); } public static bool IsReadableFile(string filePath) { using SmartStream stream = SmartStream.OpenRead(filePath); foreach (IScheme scheme in schemes) { if (scheme.CanRead(stream)) { return true; } } return false; } /// /// Required for the initialization of /// private static void Add(this Stack stack, IScheme scheme) => stack.Push(scheme); } }