view src/lib-fs/istream-fs-file.c @ 18137:3009a1a6f6d5

global: freshen copyright Robomatically: git ls-files | xargs perl -p -i -e 's/(\d+)-201[0-4]/$1-2015/g;s/ (201[0-4]) Dovecot/ $1-2015 Dovecot/' Happy 2015 everyone! Signed-off-by: Phil Carmody <phil@dovecot.fi>
author Phil Carmody <phil@dovecot.fi>
date Mon, 05 Jan 2015 22:20:10 +0200
parents add8c00fb3cc
children 0f22db71df7a
line wrap: on
line source

/* Copyright (c) 2013-2015 Dovecot authors, see the included COPYING file */

#include "lib.h"
#include "istream-private.h"
#include "fs-api-private.h"
#include "istream-fs-file.h"

struct fs_file_istream {
	struct istream_private istream;
	struct fs_file *file;
};

static void i_stream_fs_file_close(struct iostream_private *stream,
				   bool close_parent ATTR_UNUSED)
{
	struct fs_file_istream *fstream = (struct fs_file_istream *)stream;

	if (fstream->istream.parent != NULL)
		i_stream_destroy(&fstream->istream.parent);
	fs_file_deinit(&fstream->file);
}

static ssize_t i_stream_fs_file_read(struct istream_private *stream)
{
	struct fs_file_istream *fstream = (struct fs_file_istream *)stream;
	struct istream *input;

	if (fstream->istream.parent == NULL) {
		input = fs_read_stream(fstream->file,
				       fstream->istream.max_buffer_size);
		i_stream_init_parent(stream, input);
		i_stream_unref(&input);
	}

	i_stream_seek(stream->parent, stream->parent_start_offset +
		      stream->istream.v_offset);
	return i_stream_read_copy_from_parent(&stream->istream);
}

struct istream *
i_stream_create_fs_file(struct fs_file **file, size_t max_buffer_size)
{
	struct fs_file_istream *fstream;
	struct istream *input;

	fstream = i_new(struct fs_file_istream, 1);
	fstream->file = *file;
	fstream->istream.iostream.close = i_stream_fs_file_close;
	fstream->istream.max_buffer_size = max_buffer_size;
	fstream->istream.read = i_stream_fs_file_read;
	fstream->istream.stream_size_passthrough = TRUE;

	fstream->istream.istream.blocking =
		((*file)->flags & FS_OPEN_FLAG_ASYNC) == 0;
	fstream->istream.istream.seekable =
		((*file)->flags & FS_OPEN_FLAG_SEEKABLE) != 0;

	input = i_stream_create(&fstream->istream, NULL, -1);
	i_stream_set_name(input, fs_file_path(*file));
	*file = NULL;
	return input;
}