/*	$CoreSDI: buffer.h,v 1.6 2001/08/30 21:33:13 claudio Exp $	*/

/*
 *   Copyright (c) 2000, 2001, Core SDI S.A., Argentina
 *   All rights reserved
 *  
 *   Redistribution and use in source and binary forms, with or without
 *   modification, are permitted provided that the following conditions
 *   are met:
 *  
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *   3. Neither name of the Core SDI S.A. nor the names of its contributors
 *      may be used to endorse or promote products derived from this software
 *      without specific prior written permission.
 *  
 *   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 *   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 *   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 *   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef BUFFER_H
#define BUFFER_H

#include <openssl/evp.h>

typedef struct _buffer {
	u_int8_t *buf_data;	/* Buffer				*/
	int32_t   buf_size;	/* Buffer length			*/
	int32_t   buf_rpos;	/* Next position to retrieve data	*/
	int32_t   buf_wpos;	/* Next position to store data		*/
} BUFFER;

#define BUFFER_ENCRYPT	1
#define BUFFER_DECRYPT	0
#define BUFFER_CLEAN	1
#define BUFFER_NOCLEAN	0

BUFFER *	buf_create (int32_t);
void		buf_release (BUFFER *, int);
void		buf_reset (BUFFER *);

int32_t		buf_available (BUFFER *);
int		buf_isempty (BUFFER *);
int		buf_isfull (BUFFER *);
int32_t		buf_util_space (BUFFER *);
int32_t		buf_size (BUFFER *);

int32_t		buf_put_raw (BUFFER *, const void *, ssize_t);
int32_t		buf_put_int32 (BUFFER *, int32_t);
int32_t		buf_get_raw (BUFFER *, void *, ssize_t);
int32_t		buf_get_int32 (BUFFER *, int32_t *);

int		buf_compress (BUFFER *, BUFFER *, int, int *);
int		buf_uncompress (BUFFER *, BUFFER *, int *);

void		buf_cipher (BUFFER *, BUFFER *, const EVP_CIPHER *,
			    unsigned char *, int);

#ifndef WIN32
int32_t		buf_write (BUFFER *, int);
int32_t		buf_read (BUFFER *, int, int32_t);
#else
int32_t		buf_write (BUFFER *, SOCKET);
int32_t		buf_read (BUFFER *, SOCKET, int32_t);
#endif /* WIN32 */

#endif /* BUFFER_H */


