static void i_stream_seekable_seek(struct istream_private *stream, uoff_t v_offset, bool mark) { if (v_offset <= stream->istream.v_offset) { /* seeking backwards */ stream->istream.v_offset = v_offset; stream->skip = stream->pos = 0; } else { /* we can't skip over data we haven't yet read and written to our buffer/temp file */ i_stream_default_seek_nonseekable(stream, v_offset, mark); } }
static void i_stream_qp_decoder_seek(struct istream_private *stream, uoff_t v_offset, bool mark) { if (v_offset < stream->istream.v_offset) { /* seeking backwards - go back to beginning and seek forward from there. */ stream->parent_expected_offset = stream->parent_start_offset; stream->skip = stream->pos = 0; stream->istream.v_offset = 0; i_stream_seek(stream->parent, 0); } i_stream_default_seek_nonseekable(stream, v_offset, mark); }
static void i_stream_base64_encoder_seek(struct istream_private *stream, uoff_t v_offset, bool mark) { struct base64_encoder_istream *bstream = (struct base64_encoder_istream *)stream; if (v_offset < stream->istream.v_offset) { /* seeking backwards - go back to beginning and seek forward from there. */ stream->parent_expected_offset = stream->parent_start_offset; stream->skip = stream->pos = 0; stream->istream.v_offset = 0; bstream->cur_line_len = 0; i_stream_seek(stream->parent, 0); } i_stream_default_seek_nonseekable(stream, v_offset, mark); }