package net.md_5.bungee.jni.zlib;
import com.google.common.base.Preconditions;
import io.netty.buffer.ByteBuf;
import java.util.zip.DataFormatException;
import lombok.Getter;
public class NativeZlib implements BungeeZlib
{
@Getter
private final NativeCompressImpl nativeCompress = new NativeCompressImpl();
/*============================================================================*/
private boolean compress;
private long ctx;
@Override
public void init(boolean compress, int level)
{
free();
this.compress = compress;
this.ctx = nativeCompress.init( compress, level );
}
@Override
public void free()
{
if ( ctx != 0 )
{
nativeCompress.end( ctx, compress );
ctx = 0;
}
nativeCompress.consumed = 0;
nativeCompress.finished = false;
}
@Override
public void process(ByteBuf in, ByteBuf out) throws DataFormatException
{
// Smoke tests
in.memoryAddress();
out.memoryAddress();
Preconditions.checkState( ctx != 0, "Invalid pointer to compress!" );
while ( !nativeCompress.finished && ( compress || in.isReadable() ) )
{
out.ensureWritable( 8192 );
int processed = nativeCompress.process( ctx, in.memoryAddress() + in.readerIndex(), in.readableBytes(), out.memoryAddress() + out.writerIndex(), out.writableBytes(), compress );
in.readerIndex( in.readerIndex() + nativeCompress.consumed );
out.writerIndex( out.writerIndex() + processed );
}
nativeCompress.reset( ctx, compress );
nativeCompress.consumed = 0;
nativeCompress.finished = false;
}
}