private async Task <ByteArrayReader> decompressChunks() { int start = CompressedChunks.Min(ch => ch.UncompressedOffset); int totalSize = CompressedChunks.SelectMany(ch => ch.Header.Blocks).Aggregate(start, (total, block) => total + block.UncompressedSize); byte[] data = new byte[totalSize]; foreach (DomainCompressedChunk chunk in CompressedChunks) { byte[] chunkData = new byte[chunk.Header.Blocks.Sum(block => block.UncompressedSize)]; int uncompressedOffset = 0; foreach (DomainCompressedChunkBlock block in chunk.Header.Blocks) { if (((CompressionTypes)CompressionFlags & CompressionTypes.LZO_ENC) > 0) { await block.CompressedData.Decrypt(); } byte[] decompressed = await block.CompressedData.Decompress(block.UncompressedSize); int offset = uncompressedOffset; await Task.Run(() => Array.ConstrainedCopy(decompressed, 0, chunkData, offset, block.UncompressedSize)); uncompressedOffset += block.UncompressedSize; } await Task.Run(() => Array.ConstrainedCopy(chunkData, 0, data, chunk.UncompressedOffset, chunk.Header.UncompressedSize)); } return(ByteArrayReader.CreateNew(data, start)); }
public override int GetBuilderSize() { if (CompressedChunks.Any()) { throw new NotSupportedException("Cannot rebuild compressed files. Yet."); } if (Signature == Signatures.EncryptedSignature) { throw new NotSupportedException("Cannot rebuild fully encrypted files. Yet."); } BuilderSize = sizeof(uint) * 7 + sizeof(ushort) * 2 + sizeof(int) * 10 + Group.GetBuilderSize() + Guid.Length + GenerationTable.Sum(gen => gen.GetBuilderSize()); BuilderNameTableOffset = BuilderSize; BuilderSize += NameTable.Sum(name => name.GetBuilderSize()); BuilderImportTableOffset = BuilderSize; BuilderSize += ImportTable.Sum(import => import.GetBuilderSize()); BuilderExportTableOffset = BuilderSize; BuilderSize += ExportTable.Sum(export => export.GetBuilderSize()); BuilderDependsTableOffset = BuilderSize; BuilderSize += DependsTable.Length; ExportTable.Aggregate(BuilderSize, (current, export) => current + export.GetObjectSize(current)); return(BuilderSize); }