/*
 * Copyright (C) 2009-2011 the libgit2 contributors
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */
#include "common.h"
#include "protocol.h"
#include "pkt.h"
#include "buffer.h"

int git_protocol_store_refs(git_protocol *p, const char *data, size_t len)
{
	git_buf *buf = &p->buf;
	git_vector *refs = p->refs;
	int error;
	const char *line_end, *ptr;

	if (len == 0) { /* EOF */
		if (buf->size != 0)
			return p->error = git__throw(GIT_ERROR, "EOF and unprocessed data");
		else
			return 0;
	}

	git_buf_put(buf, data, len);
	ptr = buf->ptr;
	while (1) {
		git_pkt *pkt;

		if (buf->size == 0)
			return 0;

		error = git_pkt_parse_line(&pkt, ptr, &line_end, buf->size);
		if (error == GIT_ESHORTBUFFER)
			return 0; /* Ask for more */
		if (error < GIT_SUCCESS)
			return p->error = git__rethrow(error, "Failed to parse pkt-line");

		git_buf_consume(buf, line_end);
		error = git_vector_insert(refs, pkt);
		if (error < GIT_SUCCESS)
			return p->error = git__rethrow(error, "Failed to add pkt to list");

		if (pkt->type == GIT_PKT_FLUSH)
			p->flush = 1;
	}

	return error;
}
