protected async Task<int> ProcessUncompressedBulkData(ByteArrayReader reader, BulkDataCompressionTypes compressionFlags) {
      DomainCompressedChunkBulkData compressedChunk = new DomainCompressedChunkBulkData();

      CompressedChunks.Add(compressedChunk);

      int builderSize = await compressedChunk.BuildCompressedChunk(reader, compressionFlags);

      return builderSize;
    }
Ejemplo n.º 2
0
        public async Task <ByteArrayReader> DecompressChunk(uint flags)
        {
            const BulkDataCompressionTypes nothingTodo = BulkDataCompressionTypes.Unused | BulkDataCompressionTypes.StoreInSeparatefile;

            if (((BulkDataCompressionTypes)BulkDataFlags & nothingTodo) > 0)
            {
                return(null);
            }

            byte[] chunkData = new byte[Header.Blocks.Sum(block => block.UncompressedSize)];

            int uncompressedOffset = 0;

            foreach (DomainCompressedChunkBlock block in Header.Blocks)
            {
                if (((BulkDataCompressionTypes)BulkDataFlags & BulkDataCompressionTypes.LZO_ENC) > 0)
                {
                    await block.CompressedData.Decrypt();
                }

                byte[] decompressed;

                const BulkDataCompressionTypes validCompression = BulkDataCompressionTypes.LZO | BulkDataCompressionTypes.LZO_ENC;

                if (((BulkDataCompressionTypes)BulkDataFlags & validCompression) > 0)
                {
                    decompressed = await block.CompressedData.Decompress(block.UncompressedSize);
                }
                else
                {
                    if (BulkDataFlags == 0)
                    {
                        decompressed = block.CompressedData.GetBytes();
                    }
                    else
                    {
                        throw new Exception($"Unsupported bulk data compression type 0x{BulkDataFlags:X8}");
                    }
                }

                int offset = uncompressedOffset;

                await Task.Run(() => Array.ConstrainedCopy(decompressed, 0, chunkData, offset, block.UncompressedSize));

                uncompressedOffset += block.UncompressedSize;
            }

            return(ByteArrayReader.CreateNew(chunkData, 0));
        }
Ejemplo n.º 3
0
        public override int GetBuilderSize()
        {
            BuilderSize = PropertyHeader.GetBuilderSize()
                          + base.GetBuilderSize()
                          + sizeof(int);

            foreach (byte[] Sound in Sounds)
            {
                BulkDataCompressionTypes flags = Sound == null || Sound.Length == 0 ? BulkDataCompressionTypes.Unused | BulkDataCompressionTypes.StoreInSeparatefile : BulkDataCompressionTypes.LZO_ENC;

                BuilderSize += Task.Run(() => ProcessUncompressedBulkData(ByteArrayReader.CreateNew(Sound, 0), flags)).Result
                               + sizeof(int) * 2;
            }

            return(BuilderSize);
        }
Ejemplo n.º 4
0
        public override int GetBuilderSize()
        {
            BuilderSize = PropertyHeader.GetBuilderSize()
                          + base.GetBuilderSize()
                          + sizeof(int);

            foreach (DomainMipMap mipMap in MipMaps)
            {
                BulkDataCompressionTypes flags = mipMap.ImageData == null || mipMap.ImageData.Length == 0 ? BulkDataCompressionTypes.Unused | BulkDataCompressionTypes.StoreInSeparatefile : BulkDataCompressionTypes.LZO_ENC;

                BuilderSize += Task.Run(() => ProcessUncompressedBulkData(ByteArrayReader.CreateNew(mipMap.ImageData, 0), flags)).Result
                               + sizeof(int) * 2;
            }

            BuilderSize += Guid.Length;

            return(BuilderSize);
        }
    public async Task<int> BuildCompressedChunk(ByteArrayReader reader, BulkDataCompressionTypes compressionFlags) {
      BulkDataFlags = (uint)compressionFlags;

      int builderSize = sizeof(uint)
                      + sizeof(int) * 3;

      if ((compressionFlags & NothingToDo) > 0) return builderSize;

      reader.Seek(0);

      UncompressedSize = reader.Remaining;

      Header = new DomainCompressedChunkHeader();

      builderSize += await Header.BuildCompressedChunkHeader(reader, BulkDataFlags);

      CompressedSize = builderSize - 16;

      return builderSize;
    }
Ejemplo n.º 6
0
        public async Task <int> BuildExistingCompressedChunk(ByteArrayReader reader, BulkDataCompressionTypes compressionFlags)
        {
            BulkDataFlags = (uint)compressionFlags;

            int builderSize = sizeof(uint)
                              + sizeof(int) * 3;

            if ((compressionFlags & NothingToDo) > 0)
            {
                return(builderSize);
            }

            reader.Seek(0);

            UncompressedSize = reader.Remaining;

            builderSize += await Header.BuildExistingCompressedChunkHeader(reader, BulkDataFlags);

            CompressedSize = builderSize - 16;

            return(builderSize);
        }
Ejemplo n.º 7
0
        protected async Task <int> ProcessExistingBulkData(int index, ByteArrayReader reader, BulkDataCompressionTypes compressionFlags)
        {
            int builderSize = await CompressedChunks[index].BuildExistingCompressedChunk(reader, compressionFlags);

            return(builderSize);
        }
Ejemplo n.º 8
0
        protected async Task <int> ProcessUncompressedBulkData(ByteArrayReader reader, BulkDataCompressionTypes compressionFlags)
        {
            DomainCompressedChunkBulkData compressedChunk = new DomainCompressedChunkBulkData();

            CompressedChunks.Add(compressedChunk);

            int builderSize = await compressedChunk.BuildCompressedChunk(reader, compressionFlags);

            return(builderSize);
        }
    protected async Task<int> ProcessExistingBulkData(int index, ByteArrayReader reader, BulkDataCompressionTypes compressionFlags) {
      int builderSize = await CompressedChunks[index].BuildExistingCompressedChunk(reader, compressionFlags);

      return builderSize;
    }