istream-private.h revision 439dd06aec3301e65d650f6dc1d4a1a00b356b4f
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen#ifndef ISTREAM_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#define ISTREAM_PRIVATE_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen#include "istream.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "iostream-private.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
1dd875d96ab5640f78250079961c10e99ed4aa79Timo Sirainen#define I_STREAM_MIN_SIZE IO_BLOCK_SIZE
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainenstruct istream_private {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* inheritance: */
89b548af722113acb5d63dfffb44423cb60f91e4Timo Sirainen struct iostream_private iostream;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* methods: */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen ssize_t (*read)(struct istream_private *stream);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen void (*seek)(struct istream_private *stream,
66ae183b6e895216037bd921367670f4b0665911Timo Sirainen uoff_t v_offset, bool mark);
e86d0d34fe365da4c7ca4312d575bfcbf3a01c0eTimo Sirainen void (*sync)(struct istream_private *stream);
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen int (*stat)(struct istream_private *stream, bool exact);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int (*get_size)(struct istream_private *stream, bool exact, uoff_t *size_r);
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* data: */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct istream istream;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int fd;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen uoff_t abs_start_offset;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen struct stat statbuf;
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen const unsigned char *buffer;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned char *w_buffer; /* may be NULL */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen size_t buffer_size, max_buffer_size, init_buffer_size;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen size_t skip, pos, try_alloc_limit;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct istream *parent; /* for filter streams */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uoff_t parent_start_offset;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen /* parent stream's expected offset is kept here. i_stream_read()
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen always seeks parent stream to here before calling read(). */
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen uoff_t parent_expected_offset;
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen /* increased every time the stream is changed (e.g. seek, read).
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen this way streams can check if their parent streams have been
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen accessed behind them. */
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen unsigned int access_counter;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen string_t *line_str; /* for i_stream_next_line() if w_buffer == NULL */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen unsigned int line_crlf:1;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen unsigned int return_nolf_line:1;
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen unsigned int stream_size_passthrough:1; /* stream is parent's size */
5aeb15e5817fbd4b1d8de540aa7673e3819a8030Timo Sirainen};
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainenstruct istream * ATTR_NOWARN_UNUSED_RESULT
bb10ebcf076c959c752f583746d83805d7686df8Timo Siraineni_stream_create(struct istream_private *stream, struct istream *parent, int fd)
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen ATTR_NULL(2);
3ccab0bac68040f179a7de45c516cec258e28fdbTimo Sirainen
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenvoid i_stream_compress(struct istream_private *stream);
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainenvoid i_stream_grow_buffer(struct istream_private *stream, size_t bytes);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenbool ATTR_NOWARN_UNUSED_RESULT
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Siraineni_stream_try_alloc(struct istream_private *stream,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen size_t wanted_size, size_t *size_r);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid *i_stream_alloc(struct istream_private *stream, size_t size);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenssize_t i_stream_read_copy_from_parent(struct istream *istream);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid i_stream_default_seek_nonseekable(struct istream_private *stream,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen uoff_t v_offset, bool mark);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
9f32b9444d2a6db8f556d2c49ffceab1a59791ffTimo Sirainen#endif
9f32b9444d2a6db8f556d2c49ffceab1a59791ffTimo Sirainen