/*
	Zlib – библиотека сжатия данных общего назначения. Версия 1.1.0
	Это изменённая объектно-ориентированная версия библиотеки, полностью
	совместимая с оригинальной библиотекой.
	
	Copyright © 1995–2005 Jean-loup Gailly и Mark Adler
	Copyright © 2000–2011 ymnk, JCraft, Inc.
	Copyright © 2016, 2019 Малик Разработчик
	
	Эта библиотека поставляется «как есть», без каких-либо явных или
	подразумеваемых гарантий. Ни при каких обстоятельствах авторы не
	несут какой-либо ответственности в случае потери данных вследствие
	использования данной библиотеки.
	
	Разрешается всем использовать эту библиотеку для любых целей, в том
	числе и для коммерческих приложений, а также изменять её и
	распространять свободно при соблюдении следующих условий:
	
		1. Оригинал библиотеки не должен быть искажён; вы не должны
	заявлять, что именно вы написали оригинальную библиотеку. Если вы
	используете эту библиотеку в своём программном продукте, то ссылка
	на авторов библиотеки была бы желательна, но это не является
	обязательным требованием.
	
		2. Изменённые версии исходных текстов должны быть отчётливо
	маркированы и не должны выдаваться за оригинал библиотеки.
	
		3. Эти замечания не могут быть удалены либо изменены при
	каком-либо варианте распространения исходных текстов.
*/


package malik.emulator.compression.zlib;

public final class Deflater extends ZStream
{
	private boolean finished;

	public Deflater()
	{
	}

	public Deflater(int level)
			throws GZIPException
	{
		this(level, MAX_WBITS, false);
	}

	public Deflater(int level, boolean nowrap)
			throws GZIPException
	{
		this(level, MAX_WBITS, nowrap);
	}

	public Deflater(int level, int bits)
			throws GZIPException
	{
		this(level, bits, false);
	}

	public Deflater(int level, int bits, boolean nowrap)
			throws GZIPException
	{
		int ret;
		if((ret = init(level, bits, nowrap)) != OK)
		{
			throw new GZIPException(Integer.toString(ret) + ": " + msg);
		}
	}

	public Deflater(int level, int bits, int memlevel)
			throws GZIPException
	{
		int ret;
		if((ret = init(level, bits, memlevel)) != OK)
		{
			throw new GZIPException(Integer.toString(ret) + ": " + msg);
		}
	}

	public int deflate(int flush)
	{
		if(dstate == null)
		{
			return STREAM_ERROR;
		}
		int ret = dstate.deflate(flush);
		if(ret == STREAM_END)
		{
			finished = true;
		}
		return ret;
	}

	public int init(int level)
	{
		return init(level, MAX_WBITS);
	}

	public int init(int level, boolean nowrap)
	{
		return init(level, MAX_WBITS, nowrap);
	}

	public int init(int level, int bits)
	{
		return init(level, bits, false);
	}

	public int init(int level, int bits, int memlevel)
	{
		finished = false;
		return (dstate = new Deflate(this)).deflateInit(level, bits, memlevel);
	}

	public int init(int level, int bits, boolean nowrap)
	{
		finished = false;
		return (dstate = new Deflate(this)).deflateInit(level, nowrap ? -bits : bits);
	}

	public int setDictionary(byte[] dictionary, int dictLength)
	{
		return dstate == null ? STREAM_ERROR : dstate.deflateSetDictionary(dictionary, dictLength);
	}

	public int params(int level, int strategy)
	{
		return dstate == null ? STREAM_ERROR : dstate.deflateParams(level, strategy);
	}

	public int copy(Deflater src)
	{
		finished = src.finished;
		return Deflate.deflateCopy(this, src);
	}

	public int end()
	{
		int result;
		finished = true;
		if(dstate == null)
		{
			return STREAM_ERROR;
		}
		result = dstate.deflateEnd();
		dstate = null;
		free();
		return result;
	}

	public boolean finished()
	{
		return finished;
	}
}
