@Override protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception { int origSize = msg.readableBytes(); if ( origSize < threshold ) { DefinedPacket.writeVarInt( 0, out ); out.writeBytes( msg ); } else { DefinedPacket.writeVarInt( origSize, out ); zlib.process( msg, out ); } } }
@Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { int size = DefinedPacket.readVarInt( in ); if ( size == 0 ) { out.add( in.slice().retain() ); in.skipBytes( in.readableBytes() ); } else { ByteBuf decompressed = ctx.alloc().directBuffer(); try { zlib.process( in, decompressed ); Preconditions.checkState( decompressed.readableBytes() == size, "Decompressed packet size mismatch" ); out.add( decompressed ); decompressed = null; } finally { if ( decompressed != null ) { decompressed.release(); } } } } }
@Override protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception { int origSize = msg.readableBytes(); if ( origSize < threshold ) { DefinedPacket.writeVarInt( 0, out ); out.writeBytes( msg ); } else { DefinedPacket.writeVarInt( origSize, out ); zlib.process( msg, out ); } } }
@Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { int decompressedSize = DefinedPacket.readVarInt( in ); if ( decompressedSize == 0 ) { out.add( in.slice().retain() ); in.skipBytes( in.readableBytes() ); } else { Preconditions.checkArgument(decompressedSize >= compressionThreshold, "Decompressed size %s less than compression threshold %s", decompressedSize, compressionThreshold); ByteBuf decompressed = ctx.alloc().directBuffer(); try { zlib.process( in, decompressed ); Preconditions.checkArgument( decompressed.readableBytes() == decompressedSize, "Decompressed size %s is not equal to decompressed bytes", decompressedSize, decompressed.readableBytes()); out.add( decompressed ); decompressed = null; } finally { if ( decompressed != null ) { decompressed.release(); } } } } }
inflaterLocal.get().process(source, decompressed); return decompressed; } catch (DataFormatException e) {
deflaterLocal.get().process(source, destination);