#include"CCompressZlib.h"
#include"../Macro.h"
#include"../mstring.h"
#include"../Debug/CAssert.h"

#include<zlib.h>
#include<zconf.h>

namespace Maid
{

/*!
 	@class	CCompressZlib CCompressZlib.h
 	@brief	Zlib による圧縮・展開アルゴリズムルーチン
 */

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! データを圧縮する
/*!
 	引数などは ICompress::Encode() を参照すること
 */
unt CCompressZlib::Encode( const void* pSrc, unt SrcLenght, void* pDst, unt DstLength ) const
{
	z_stream	Zstream;
	ZERO( &Zstream, sizeof(Zstream) ); 

	if( deflateInit(&Zstream, Z_DEFAULT_COMPRESSION)!=Z_OK ) { MAID_ASSERT( true, "エラー" ); }


	Zstream.next_in   = (unt08*)pSrc;
	Zstream.avail_in  = SrcLenght;
	Zstream.next_out  = (unt08*)pDst;
	Zstream.avail_out = DstLength;

	const int ret = ::deflate(&Zstream, Z_FINISH);
	if( ret!=Z_STREAM_END )
	{
		deflateEnd(&Zstream);
		return SrcLenght;
	}


	const unt EncSize = Zstream.total_out;	//圧縮後のサイズ

	deflateEnd(&Zstream);

	return EncSize;
}



/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! データを展開する
/*!
 	引数などは ICompress::Decode() を参照すること
 */
unt CCompressZlib::Decode( const void* pSrc, unt SrcLenght, void* pDst, unt DstLength ) const
{
	z_stream	Zstream;
	ZERO( &Zstream, sizeof(Zstream) ); 

	if( inflateInit(&Zstream)!=Z_OK ) {	MAID_ASSERT( true, "エラー" ); }

	Zstream.next_in   = (unt08*)pSrc;
	Zstream.avail_in  = SrcLenght;
	Zstream.next_out  = (unt08*)pDst;
	Zstream.avail_out = DstLength;

	if( ::inflate(&Zstream, Z_FINISH)!=Z_STREAM_END )
	{
		MAID_ASSERT( true, "エラー" );
	}
	const unt DecSize = Zstream.total_out;	//展開後のサイズ

	inflateEnd(&Zstream);

	return DecSize;
}

}
