Exemplo n.º 1
0
static int zlib_stream_nonblock_read_ready(avs_stream_abstract_t *stream_) {
    zlib_stream_t *stream = (zlib_stream_t *) stream_;
    if (stream->zlib.avail_out < stream->output_buffer_size) {
        return 1;
    }
    if (zlib_stream_flush(stream)) {
        return -1;
    }
    return stream->zlib.avail_out < stream->output_buffer_size;
}
Exemplo n.º 2
0
static int zlib_stream_nonblock_write_ready(avs_stream_abstract_t *stream_,
                                            size_t *out_ready_capacity_bytes) {
    zlib_stream_t *stream = (zlib_stream_t *) stream_;
    if (stream->zlib.avail_in > 0 && zlib_stream_flush(stream)) {
        return -1;
    }
    *out_ready_capacity_bytes =
            stream->input_buffer_size - stream->zlib.avail_in;
    return 0;
}
Exemplo n.º 3
0
static int zlib_stream_write_some(avs_stream_abstract_t *stream_,
                                  const void *data,
                                  size_t *inout_data_length) {
    zlib_stream_t *stream = (zlib_stream_t *) stream_;
    if (stream->error == Z_STREAM_END || stream->flush != Z_NO_FLUSH) {
        LOG(ERROR, "Stream finished");
        return -1;
    }
    if (*inout_data_length
            > stream->input_buffer_size - stream->zlib.avail_in) {
        if (zlib_stream_flush(stream)) {
            return -1;
        }
    }
    if (*inout_data_length
            > stream->input_buffer_size - stream->zlib.avail_in) {
        *inout_data_length = stream->input_buffer_size - stream->zlib.avail_in;
    }
    memcpy(stream->zlib.next_in + stream->zlib.avail_in,
           data, *inout_data_length);
    stream->zlib.avail_in += (unsigned) *inout_data_length;
    return zlib_stream_flush(stream);
}
Exemplo n.º 4
0
    void flush_one(disk_stream *inflight,
		   unsigned long superp)
    {
      if(inflight->compressed) {
	zlib_stream_flush(inflight, superp);
      }
      else {
	unsigned long disk_buffer_pos = inflight->disk_pos[superp];
	unsigned long disk_page_offset = disk_buffer_pos % DISK_PAGE_SIZE;
	if(disk_page_offset > 0) {
	  write_to_file(inflight->superp_fd[superp],
			inflight->disk_pages[superp],
			DISK_PAGE_SIZE);
	}
      }
    }
Exemplo n.º 5
0
static int zlib_stream_peek(avs_stream_abstract_t *stream_,
                            size_t offset) {
    zlib_stream_t *stream = (zlib_stream_t *) stream_;
    if (offset > stream->output_buffer_size) {
        LOG(ERROR, "cannot peek - buffer is too small");
        return EOF;
    }
    if (stream->zlib.avail_out + offset >= stream->output_buffer_size) {
        if (zlib_stream_flush(stream)) {
            return EOF;
        }
    }
    if (stream->zlib.avail_out + offset < stream->output_buffer_size) {
        return GET_OUTPUT_BUFFER(stream)[offset];
    } else {
        return EOF;
    }
}
Exemplo n.º 6
0
static int zlib_stream_read(avs_stream_abstract_t *stream_,
                            size_t *out_bytes_read,
                            char *out_message_finished,
                            void *buffer,
                            size_t buffer_length) {
    zlib_stream_t *stream = (zlib_stream_t *) stream_;
    size_t ready_bytes =
            AVS_MIN(buffer_length,
                    stream->output_buffer_size - stream->zlib.avail_out);
    *out_bytes_read = 0;
    *out_message_finished = 0;
    if (ready_bytes) {
        memcpy(buffer, GET_OUTPUT_BUFFER(stream), ready_bytes);
        memmove(GET_OUTPUT_BUFFER(stream),
                GET_OUTPUT_BUFFER(stream) + ready_bytes,
                (stream->output_buffer_size - stream->zlib.avail_out)
                - ready_bytes);
        stream->zlib.avail_out += (unsigned) ready_bytes;
        *out_bytes_read += ready_bytes;
    }
    if (*out_bytes_read < buffer_length && stream->error != Z_STREAM_END) {
        unsigned avail_out_orig = stream->zlib.avail_out;
        stream->zlib.next_out = ((uint8_t *) buffer) + *out_bytes_read;
        stream->zlib.avail_out = (unsigned) (buffer_length - *out_bytes_read);
        zlib_stream_flush(stream);
        *out_bytes_read = buffer_length - stream->zlib.avail_out;
        stream->zlib.avail_out = avail_out_orig;
    }
    stream->zlib.next_out = GET_OUTPUT_BUFFER(stream)
            + (stream->output_buffer_size - stream->zlib.avail_out);
    if (stream->error == Z_STREAM_END) {
        if (stream->zlib.avail_out >= stream->output_buffer_size) {
            *out_message_finished = 1;
        }
    } else if (stream->error != Z_OK) {
        LOG(ERROR, "zlib operation error (%d): %s",
            stream->error, get_zlib_msg(stream));
        return -1;
    }
    return 0;
}
Exemplo n.º 7
0
static int zlib_stream_finish_message(avs_stream_abstract_t *stream_) {
    zlib_stream_t *stream = (zlib_stream_t *) stream_;
    stream->flush = Z_FINISH;
    return zlib_stream_flush(stream);
}