private void ReadFileStreamMetadata(Stream stream, long basePosition) { BundleFileStreamHeader header = Header.FileStream; if (header.Flags.IsBlocksInfoAtTheEnd()) { stream.Position = basePosition + (header.Size - header.CompressedBlocksInfoSize); } CompressionType metaCompression = header.Flags.GetCompression(); switch (metaCompression) { case CompressionType.None: { ReadMetadata(stream, header.UncompressedBlocksInfoSize); } break; case CompressionType.Lzma: { using (MemoryStream uncompressedStream = new MemoryStream(new byte[header.UncompressedBlocksInfoSize])) { SevenZipHelper.DecompressLZMAStream(stream, header.CompressedBlocksInfoSize, uncompressedStream, header.UncompressedBlocksInfoSize); uncompressedStream.Position = 0; ReadMetadata(uncompressedStream, header.UncompressedBlocksInfoSize); } } break; case CompressionType.Lz4: case CompressionType.Lz4HC: { using (MemoryStream uncompressedStream = new MemoryStream(new byte[header.UncompressedBlocksInfoSize])) { using (Lz4DecodeStream decodeStream = new Lz4DecodeStream(stream, header.CompressedBlocksInfoSize)) { decodeStream.ReadBuffer(uncompressedStream, header.UncompressedBlocksInfoSize); } uncompressedStream.Position = 0; ReadMetadata(uncompressedStream, header.UncompressedBlocksInfoSize); } } break; default: throw new NotSupportedException($"Bundle compression '{metaCompression}' isn't supported"); } }
private void Read530Metadata(BundleReader reader, long headerSize) { if (Header.Flags.IsMetadataAtTheEnd()) { reader.BaseStream.Position = Header.BundleSize - Header.MetadataCompressedSize; } BundleCompressType metaCompression = Header.Flags.GetCompression(); switch (metaCompression) { case BundleCompressType.None: { Metadata.Read(reader); long expectedPosition = Header.Flags.IsMetadataAtTheEnd() ? Header.BundleSize : headerSize + Header.MetadataDecompressedSize; if (reader.BaseStream.Position != expectedPosition) { throw new Exception($"Read {reader.BaseStream.Position - headerSize} but expected {Header.MetadataDecompressedSize}"); } } break; case BundleCompressType.LZMA: { using (MemoryStream stream = new MemoryStream(new byte[Header.MetadataDecompressedSize])) { SevenZipHelper.DecompressLZMASizeStream(reader.BaseStream, Header.MetadataCompressedSize, stream); using (BundleReader decompressReader = new BundleReader(stream, reader.EndianType, reader.Type, reader.Generation)) { Metadata.Read(decompressReader); } if (stream.Position != Header.MetadataDecompressedSize) { throw new Exception($"Read {stream.Position} but expected {Header.MetadataDecompressedSize}"); } } } break; case BundleCompressType.LZ4: case BundleCompressType.LZ4HZ: { using (MemoryStream stream = new MemoryStream(new byte[Header.MetadataDecompressedSize])) { using (Lz4DecodeStream decodeStream = new Lz4DecodeStream(reader.BaseStream, Header.MetadataCompressedSize)) { decodeStream.ReadBuffer(stream, Header.MetadataDecompressedSize); } stream.Position = 0; using (BundleReader decompressReader = new BundleReader(stream, reader.EndianType, reader.Type, reader.Generation)) { Metadata.Read(decompressReader); } if (stream.Position != Header.MetadataDecompressedSize) { throw new Exception($"Read {stream.Position} but expected {Header.MetadataDecompressedSize}"); } } } break; default: throw new NotSupportedException($"Bundle compression '{metaCompression}' isn't supported"); } }