Exemple #1
0
        private void ParseBundleFormat6(EndianStream stream, bool isPadding)
        {
            long bundleSize     = stream.ReadInt64();
            int  compressSize   = stream.ReadInt32();
            int  decompressSize = stream.ReadInt32();
            int  flag           = stream.ReadInt32();

            if (isPadding)
            {
                stream.BaseStream.Position++;
            }

            long blockPosition;
            long dataPosition;
            int  isDataFirst = flag & 0x80;

            if (isDataFirst != 0)
            {
                blockPosition = stream.BaseStream.Length - compressSize;
                dataPosition  = stream.BaseStream.Position;
            }
            else
            {
                blockPosition = stream.BaseStream.Position;
                dataPosition  = stream.BaseStream.Position + compressSize;
            }

            stream.BaseStream.Position = blockPosition;
            BundleCompressType compressType = (BundleCompressType)(flag & 0x3F);

            switch (compressType)
            {
            case BundleCompressType.None:
                ParseBundle6BlockInfo(stream, ref blockPosition, stream, ref dataPosition);
                ParseBundle6Files(stream, ref blockPosition, stream, ref dataPosition);
                break;

            case BundleCompressType.LZMA:
                using (MemoryStream memStream = SevenZipHelper.DecompressLZMASSizeStream(stream.BaseStream, compressSize))
                {
                    using (EndianStream decBlockStream = new EndianStream(memStream, EndianType.BigEndian))
                    {
                        // update position acerding to newly created stream
                        blockPosition = 0;
                        using (EndianStream decDataStream = ParseBundle6BlockInfo(decBlockStream, ref blockPosition, stream, ref dataPosition))
                        {
                            ParseBundle6Files(decBlockStream, ref blockPosition, decDataStream, ref dataPosition);
                        }
                    }
                }
                break;

            case BundleCompressType.LZ4:
            case BundleCompressType.LZ4HZ:
                using (MemoryStream memStream = new MemoryStream(decompressSize))
                {
                    using (Lz4Stream lzStream = new Lz4Stream(stream.BaseStream, compressSize))
                    {
                        lzStream.Read(memStream, decompressSize);
                    }
                    using (EndianStream decBlockStream = new EndianStream(memStream, EndianType.BigEndian))
                    {
                        // update position acerding to newly created stream
                        blockPosition = 0;
                        using (EndianStream decDataStream = ParseBundle6BlockInfo(decBlockStream, ref blockPosition, stream, ref dataPosition))
                        {
                            ParseBundle6Files(decBlockStream, ref blockPosition, decDataStream, ref dataPosition);
                        }
                    }
                }
                break;

            default:
                throw new NotImplementedException($"Bundle compression '{compressType}' isn't supported");
            }
        }