SafeByteArray ZLibCodecompressor::process(const SafeByteArray& input) { SafeByteArray output; p->stream.avail_in = static_cast<unsigned int>(input.size()); p->stream.next_in = reinterpret_cast<Bytef*>(const_cast<unsigned char*>(vecptr(input))); size_t outputPosition = 0; do { output.resize(outputPosition + CHUNK_SIZE); p->stream.avail_out = CHUNK_SIZE; p->stream.next_out = reinterpret_cast<Bytef*>(vecptr(output) + outputPosition); int result = processZStream(); if (result != Z_OK && result != Z_BUF_ERROR) { throw ZLibException(/* p->stream.msg */); } outputPosition += CHUNK_SIZE; } while (p->stream.avail_out == 0); if (p->stream.avail_in != 0) { throw ZLibException(); } output.resize(outputPosition - p->stream.avail_out); return output; }
void Inflater::inflate() { size_t avaliableOutput = m_unpackedSize + m_unpackedSize / 100 + 1024; size_t prevTotalOut = m_zlibStream.total_out; if (m_output != NULL) { delete[] m_output; } m_output = new char[avaliableOutput]; m_zlibStream.next_in = (Bytef *)m_input; m_zlibStream.avail_in = m_inputSize; m_zlibStream.next_out = (Bytef *)m_output; m_zlibStream.avail_out = avaliableOutput; int r = ::inflate(&m_zlibStream, Z_SYNC_FLUSH); if (r == Z_STREAM_END) { throw ZLibException(_T("ZLib stream end")); } if (r == Z_NEED_DICT) { throw ZLibException(_T("ZLib need dictionary")); } if (r == Z_STREAM_ERROR) { throw ZLibException(_T("ZLib stream error")); } if (r == Z_MEM_ERROR) { throw ZLibException(_T("ZLib memory error")); } if (r == Z_DATA_ERROR) { throw ZLibException(_T("Zlib data error")); } if (m_zlibStream.avail_in != 0) { throw ZLibException(_T("Not enough buffer size for data decompression")); } m_outputSize = m_zlibStream.total_out - prevTotalOut; }