istream-private.h revision 6f08b98ac63c25b747120d0c8f8e319b4e26ab0f
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#ifndef ISTREAM_PRIVATE_H
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#define ISTREAM_PRIVATE_H
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "istream.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#include "iostream-private.h"
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#define I_STREAM_MIN_SIZE IO_BLOCK_SIZE
5b62dea2f88165f3f4d87bba9011343f3ff415ffTimo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstruct istream_private {
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen/* inheritance: */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct iostream_private iostream;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
b004d46b9bfe4144761fa5c3f3a4cd4a4b8c957fTimo Sirainen/* methods: */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen ssize_t (*read)(struct istream_private *stream);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen void (*seek)(struct istream_private *stream,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen uoff_t v_offset, bool mark);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen void (*sync)(struct istream_private *stream);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const struct stat *(*stat)(struct istream_private *stream, bool exact);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen int (*get_size)(struct istream_private *stream, bool exact, uoff_t *size_r);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen/* data: */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct istream istream;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
2271d1a3dfc7191e610f039e86b9245bbc5dfb8cTimo Sirainen int fd;
2271d1a3dfc7191e610f039e86b9245bbc5dfb8cTimo Sirainen uoff_t abs_start_offset;
2271d1a3dfc7191e610f039e86b9245bbc5dfb8cTimo Sirainen struct stat statbuf;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const unsigned char *buffer;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen unsigned char *w_buffer; /* may be NULL */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen size_t buffer_size, max_buffer_size, init_buffer_size;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen size_t skip, pos;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct istream *parent; /* for filter streams */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen uoff_t parent_start_offset;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* parent stream's expected offset is kept here. i_stream_read()
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen always seeks parent stream to here before calling read(). */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen uoff_t parent_expected_offset;
dd4f30895ebbddd77e000472fbadcb3128ae2883Timo Sirainen
dd4f30895ebbddd77e000472fbadcb3128ae2883Timo Sirainen /* increased every time the stream is changed (e.g. seek, read).
57bf90f66f393c2807b2fc543655013f61d1d9e4Timo Sirainen this way streams can check if their parent streams have been
57bf90f66f393c2807b2fc543655013f61d1d9e4Timo Sirainen accessed behind them. */
5b62dea2f88165f3f4d87bba9011343f3ff415ffTimo Sirainen unsigned int access_counter;
5b62dea2f88165f3f4d87bba9011343f3ff415ffTimo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen string_t *line_str; /* for i_stream_next_line() if w_buffer == NULL */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen unsigned int line_crlf:1;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen unsigned int return_nolf_line:1;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen unsigned int stream_size_passthrough:1; /* stream is parent's size */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen};
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstruct istream * ATTR_NOWARN_UNUSED_RESULT
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Siraineni_stream_create(struct istream_private *stream, struct istream *parent, int fd)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen ATTR_NULL(2);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid i_stream_compress(struct istream_private *stream);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid i_stream_grow_buffer(struct istream_private *stream, size_t bytes);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenbool ATTR_NOWARN_UNUSED_RESULT
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Siraineni_stream_try_alloc(struct istream_private *stream,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen size_t wanted_size, size_t *size_r);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid *i_stream_alloc(struct istream_private *stream, size_t size);
ssize_t i_stream_read_copy_from_parent(struct istream *istream);
void i_stream_default_seek_nonseekable(struct istream_private *stream,
uoff_t v_offset, bool mark);
#endif