/*
 * Copyright (C) the libgit2 contributors. All rights reserved.
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */
#ifndef INCLUDE_filebuf_h__
#define INCLUDE_filebuf_h__

#include "common.h"

#include "futils.h"
#include "hash.h"
#include <zlib.h>

#ifdef GIT_THREADS
#	define GIT_FILEBUF_THREADS
#endif

#define GIT_FILEBUF_HASH_CONTENTS		(1 << 0)
#define GIT_FILEBUF_APPEND				(1 << 2)
#define GIT_FILEBUF_FORCE				(1 << 3)
#define GIT_FILEBUF_TEMPORARY			(1 << 4)
#define GIT_FILEBUF_DO_NOT_BUFFER		(1 << 5)
#define GIT_FILEBUF_FSYNC				(1 << 6)
#define GIT_FILEBUF_DEFLATE_SHIFT		(7)

#define GIT_FILELOCK_EXTENSION ".lock\0"
#define GIT_FILELOCK_EXTLENGTH 6

typedef struct git_filebuf git_filebuf;
struct git_filebuf {
	char *path_original;
	char *path_lock;

	int (*write)(git_filebuf *file, void *source, size_t len);

	bool compute_digest;
	git_hash_ctx digest;

	unsigned char *buffer;
	unsigned char *z_buf;

	z_stream zs;
	int flush_mode;

	size_t buf_size, buf_pos;
	git_file fd;
	bool fd_is_open;
	bool created_lock;
	bool did_rename;
	bool do_not_buffer;
	bool do_fsync;
	int last_error;
};

#define GIT_FILEBUF_INIT {0}

/*
 * The git_filebuf object lifecycle is:
 * - Allocate git_filebuf, preferably using GIT_FILEBUF_INIT.
 *
 * - Call git_filebuf_open() to initialize the filebuf for use.
 *
 * - Make as many calls to git_filebuf_write(), git_filebuf_printf(),
 *   git_filebuf_reserve() as you like. The error codes for these
 *   functions don't need to be checked. They are stored internally
 *   by the file buffer.
 *
 * - While you are writing, you may call git_filebuf_hash() to get
 *   the hash of all you have written so far. This function will
 *   fail if any of the previous writes to the buffer failed.
 *
 * - To close the git_filebuf, you may call git_filebuf_commit() or
 *   git_filebuf_commit_at() to save the file, or
 *   git_filebuf_cleanup() to abandon the file.  All of these will
 *   free the git_filebuf object. Likewise, all of these will fail
 *   if any of the previous writes to the buffer failed, and set
 *   an error code accordingly.
 */
int git_filebuf_write(git_filebuf *lock, const void *buff, size_t len);
int git_filebuf_reserve(git_filebuf *file, void **buff, size_t len);
int git_filebuf_printf(git_filebuf *file, const char *format, ...) GIT_FORMAT_PRINTF(2, 3);

int git_filebuf_open(git_filebuf *lock, const char *path, int flags, mode_t mode);
int git_filebuf_open_withsize(git_filebuf *file, const char *path, int flags, mode_t mode, size_t size);
int git_filebuf_commit(git_filebuf *lock);
int git_filebuf_commit_at(git_filebuf *lock, const char *path);
void git_filebuf_cleanup(git_filebuf *lock);
int git_filebuf_hash(git_oid *oid, git_filebuf *file);
int git_filebuf_flush(git_filebuf *file);
int git_filebuf_stats(time_t *mtime, size_t *size, git_filebuf *file);

#endif
