Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}