void CCoder::readBlocks(ISequentialInStream *inStream, UInt64 *inSizeProcessed) { size_t metadata_size = (size_t)read_int(inStream, inSizeProcessed); size_t compressed_size = (size_t)read_int(inStream, inSizeProcessed); std::vector<uint8_t> compressed_buffer; compressed_buffer.assign(compressed_size, 0); if (FAILED(ReadStream(inStream, compressed_buffer.data(), &compressed_size))) return; ReadMemoryStream rms_compressed(compressed_buffer.data(), compressed_buffer.data() + compressed_size); std::unique_ptr<Compressor> c(createMetaDataCompressor()); std::vector<uint8_t> metadata; WriteVectorStream wvs(&metadata); c->decompress(&rms_compressed, &wvs, metadata_size); auto cmp = read_int(inStream, inSizeProcessed); check(cmp == 1234u); ReadMemoryStream rms(&metadata); blocks_.read(&rms); }
void Archive::writeBlocks() { std::vector<uint8_t> temp; WriteVectorStream wvs(&temp); // Write out the blocks into temp. blocks_.write(&wvs); size_t blocks_size = wvs.tell(); files_.write(&wvs); size_t files_size = wvs.tell() - blocks_size; // Compress overhead. std::unique_ptr<Compressor> c(createMetaDataCompressor()); ReadMemoryStream rms(&temp[0], &temp[0] + temp.size()); auto start_pos = stream_->tell(); stream_->leb128Encode(temp.size()); c->compress(&rms, stream_); stream_->leb128Encode(static_cast<uint64_t>(1234u)); std::cout << "(flist=" << files_size << "+" << "blocks=" << blocks_size << ")=" << temp.size() << " -> " << stream_->tell() - start_pos << std::endl << std::endl; }
void Archive::readBlocks() { if (!files_.empty()) { // Already read. return; } auto metadata_size = stream_->leb128Decode(); std::cout << "Metadata size=" << metadata_size << std::endl; // Decompress overhead. std::unique_ptr<Compressor> c(createMetaDataCompressor()); std::vector<uint8_t> metadata; WriteVectorStream wvs(&metadata); auto start_pos = stream_->tell(); c->decompress(stream_, &wvs, metadata_size); auto cmp = stream_->leb128Decode(); check(cmp == 1234u); ReadMemoryStream rms(&metadata); blocks_.read(&rms); files_.read(&rms); }
void CCoder::writeBlocks(ISequentialOutStream *outStream, UInt64 *outSizeProcessed) { std::vector<uint8_t> temp; WriteVectorStream wvs(&temp); blocks_.write(&wvs); std::unique_ptr<Compressor> c(createMetaDataCompressor()); ReadMemoryStream rms(&temp[0], &temp[0] + temp.size()); std::vector<uint8_t> compressed_buffer; WriteVectorStream wvs_compressed(&compressed_buffer); c->compress(&rms, &wvs_compressed); if (FAILED(NCompress::NPackjpg::write_int(outStream, temp.size(), outSizeProcessed))) return; if (FAILED(NCompress::NPackjpg::write_int(outStream, compressed_buffer.size(), outSizeProcessed))) return; if (FAILED(WriteStream(outStream, compressed_buffer.data(), compressed_buffer.size()))) return; *outSizeProcessed += compressed_buffer.size(); NCompress::NPackjpg::write_int(outStream, 1234u, outSizeProcessed); }