0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#ifndef ISTREAM_CHAIN_H
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#define ISTREAM_CHAIN_H
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstruct istream_chain;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch/* Flexibly couple input streams into a single chain stream. Input streams can
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch be added after creation of the chain stream, and the chain stream will not
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch signal EOF until all streams are read to EOF and the last stream added was
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch NULL. Streams that were finished to EOF are unreferenced. The chain stream
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch is obviously not seekable and it has no determinable size. The chain_r
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch argument returns a pointer to the chain object. */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstruct istream *i_stream_create_chain(struct istream_chain **chain_r);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen/* Append an input stream to the chain. */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschvoid i_stream_chain_append(struct istream_chain *chain, struct istream *stream);
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen/* Mark the end of the chain. Only then reads from the chain stream can
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen return EOF. */
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenvoid i_stream_chain_append_eof(struct istream_chain *chain);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#endif