public static ArchiveBlockDescriptor Create(uint magic, BinaryReader reader) { ArchiveBlockDescriptor ret = null; switch (magic) { case Signatures.ArchiveIndex: ret = new ArchiveIndex(); ret.Populate(magic, reader); break; case Signatures.Pack: ret = new PackDescriptor(); ret.Populate(magic, reader); break; case Signatures.Archive: ret = new AssetArchiveResourceContainerDescriptor(); ret.Populate(magic, reader); break; } //if (ret == null) // Debug.WriteLine($"WARN: Unknown magic: {magic:X8}"); return(ret); }
private IEnumerable <ArchiveBlockDescriptor> GetDescriptors(BlockTable blockTable) { foreach (var entry in blockTable) { if (entry.BlockSize == 0) { continue; } using (var mappedStream = File.CreateViewStream(entry.DirectoryOffset, entry.BlockSize, MemoryMappedFileAccess.Read)) using (var binaryReader = new BinaryReader(mappedStream)) { var magic = binaryReader.ReadUInt32(); var blockDescriptor = ArchiveBlockDescriptor.Create(magic, binaryReader); if (blockDescriptor != null) { yield return(blockDescriptor); } } } }