istream-private.h revision 785ee8becdb11e41abaaf64c28eb3923215d1f27
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen#ifndef ISTREAM_PRIVATE_H
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen#define ISTREAM_PRIVATE_H
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen#include "istream.h"
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen#include "iostream-private.h"
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen#define I_STREAM_MIN_SIZE IO_BLOCK_SIZE
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainenstruct io;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainenstruct istream_private {
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen/* inheritance: */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen struct iostream_private iostream;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen/* methods: */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen ssize_t (*read)(struct istream_private *stream);
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen void (*seek)(struct istream_private *stream,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen uoff_t v_offset, bool mark);
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen void (*sync)(struct istream_private *stream);
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen int (*stat)(struct istream_private *stream, bool exact);
64510d2cc23a79d2142030bf5bade44baa490db3Timo Sirainen int (*get_size)(struct istream_private *stream, bool exact, uoff_t *size_r);
64510d2cc23a79d2142030bf5bade44baa490db3Timo Sirainen void (*switch_ioloop)(struct istream_private *stream);
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen/* data: */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen struct istream istream;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen int fd;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen uoff_t start_offset;
f335accff54f408a8bbb328f8098ad458f2ff58eTimo Sirainen struct stat statbuf;
f335accff54f408a8bbb328f8098ad458f2ff58eTimo Sirainen /* added by io_add_istream() -> i_stream_set_io() */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen struct io *io;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen const unsigned char *buffer;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen unsigned char *w_buffer; /* may be NULL */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen size_t buffer_size, max_buffer_size, init_buffer_size;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen size_t skip, pos, try_alloc_limit;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen struct istream *parent; /* for filter streams */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen uoff_t parent_start_offset;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen /* parent stream's expected offset is kept here. i_stream_read()
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen always seeks parent stream to here before calling read(). */
e1b83f64e62cc3e8967c75fcc3f9b5dbb243d3b3Timo Sirainen uoff_t parent_expected_offset;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen /* increased every time the stream is changed (e.g. seek, read).
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen this way streams can check if their parent streams have been
e1b83f64e62cc3e8967c75fcc3f9b5dbb243d3b3Timo Sirainen accessed behind them. */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen unsigned int access_counter;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen string_t *line_str; /* for i_stream_next_line() if w_buffer == NULL */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen bool line_crlf:1;
e1b83f64e62cc3e8967c75fcc3f9b5dbb243d3b3Timo Sirainen bool return_nolf_line:1;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen bool stream_size_passthrough:1; /* stream is parent's size */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen bool nonpersistent_buffers:1;
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen};
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainenstruct istream * ATTR_NOWARN_UNUSED_RESULT
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Siraineni_stream_create(struct istream_private *stream, struct istream *parent, int fd)
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen ATTR_NULL(2);
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen/* Initialize parent lazily after i_stream_create() has already been called. */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainenvoid i_stream_init_parent(struct istream_private *_stream,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen struct istream *parent);
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen
c69a255a68103a50fa3f04a527281a169075403fTimo Sirainenvoid i_stream_compress(struct istream_private *stream);
c69a255a68103a50fa3f04a527281a169075403fTimo Sirainenvoid i_stream_grow_buffer(struct istream_private *stream, size_t bytes);
c69a255a68103a50fa3f04a527281a169075403fTimo Sirainenbool ATTR_NOWARN_UNUSED_RESULT
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Siraineni_stream_try_alloc(struct istream_private *stream,
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen size_t wanted_size, size_t *size_r);
c69a255a68103a50fa3f04a527281a169075403fTimo Sirainenvoid *i_stream_alloc(struct istream_private *stream, size_t size);
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainen/* Free memory allocated by i_stream_*alloc() */
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainenvoid i_stream_free_buffer(struct istream_private *stream);
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainenssize_t i_stream_read_copy_from_parent(struct istream *istream);
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainenvoid i_stream_default_seek_nonseekable(struct istream_private *stream,
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen uoff_t v_offset, bool mark);
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
050975ee630c761ab237fce7b8f84fe189bb02d2Timo Sirainenvoid i_stream_set_io(struct istream *stream, struct io *io);
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainenvoid i_stream_unset_io(struct istream *stream, struct io *io);
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen#endif
687d1dee0e92229232aa8be416897b640df67d07Timo Sirainen