/*
    This file is part of libmicrospdy
    Copyright Copyright (C) 2012 Andrey Uzunov

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @file compression.h
 * @brief  zlib handling functions
 * @author Andrey Uzunov
 */

#ifndef COMPRESSION_H
#define COMPRESSION_H

#include "platform.h"

/* size of buffers used by zlib on (de)compressing */
#define SPDYF_ZLIB_CHUNK 16384


/**
 * Initializes the zlib stream for compression. Must be called once
 * for a session on initialization.
 *
 * @param strm Zlib stream on which we work
 * @return SPDY_NO if zlib failed. SPDY_YES otherwise
 */		
int
SPDYF_zlib_deflate_init(z_stream *strm);


/**
 * Deinitializes the zlib stream for compression. Should be called once
 * for a session on cleaning up.
 *
 * @param strm Zlib stream on which we work
 */	
void
SPDYF_zlib_deflate_end(z_stream *strm);


/**
 * Compressing stream with zlib.
 *
 * @param strm Zlib stream on which we work
 * @param src stream of the data to be compressed
 * @param src_size size of the data
 * @param data_used the number of bytes from src_stream that were used
 * 					TODO do we need
 * @param dest the resulting compressed stream. Should be NULL. Must be
 * 					freed later manually.
 * @param dest_size size of the data after compression
 * @return SPDY_NO if malloc or zlib failed. SPDY_YES otherwise
 */
int
SPDYF_zlib_deflate(z_stream *strm,
					const void *src,
					size_t src_size,
					size_t *data_used,
					void **dest,
					size_t *dest_size);
     

/**
 * Initializes the zlib stream for decompression. Must be called once
 * for a session.
 *
 * @param strm Zlib stream on which we work
 * @return SPDY_NO if zlib failed. SPDY_YES otherwise
 */	                 
int
SPDYF_zlib_inflate_init(z_stream *strm);


/**
 * Deinitializes the zlib stream for decompression. Should be called once
 * for a session on cleaning up.
 *
 * @param strm Zlib stream on which we work
 */	
void
SPDYF_zlib_inflate_end(z_stream *strm);


/**
 * Decompressing stream with zlib.
 *
 * @param strm Zlib stream on which we work
 * @param src stream of the data to be decompressed
 * @param src_size size of the data
 * @param dest the resulting decompressed stream. Should be NULL. Must
 * 				be freed manually.
 * @param dest_size size of the data after decompression
 * @return SPDY_NO if malloc or zlib failed. SPDY_YES otherwise. If the
 * 			function fails, the SPDY session must be closed
 */
int
SPDYF_zlib_inflate(z_stream *strm,
					const void *src,
					size_t src_size,
					void **dest,
					size_t *dest_size);

#endif