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");
            }
        }
Пример #2
0
        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");
            }
        }