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; }
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; }
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); }
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); } } }
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; } }
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; }
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); }