Complete support for DEFLATE based wrappers - zlib, gzip, no wrapper
This commit is contained in:
parent
8e6e996392
commit
96cb575986
@ -38,16 +38,27 @@ public class ZlibDecoder extends OneToOneDecoder {
|
|||||||
private final ZStream z = new ZStream();
|
private final ZStream z = new ZStream();
|
||||||
private volatile boolean finished;
|
private volatile boolean finished;
|
||||||
|
|
||||||
// TODO Auto-detect wrappers (zlib, gzip, nowrapper as a fallback)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance.
|
* Creates a new instance with the default wrapper ({@link ZlibWrapper#ZLIB}).
|
||||||
*
|
*
|
||||||
* @throws CompressionException if failed to initialize zlib
|
* @throws CompressionException if failed to initialize zlib
|
||||||
*/
|
*/
|
||||||
public ZlibDecoder() {
|
public ZlibDecoder() {
|
||||||
|
this(ZlibWrapper.ZLIB);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance with the specified wrapper.
|
||||||
|
*
|
||||||
|
* @throws CompressionException if failed to initialize zlib
|
||||||
|
*/
|
||||||
|
public ZlibDecoder(ZlibWrapper wrapper) {
|
||||||
|
if (wrapper == null) {
|
||||||
|
throw new NullPointerException("wrapper");
|
||||||
|
}
|
||||||
|
|
||||||
synchronized (z) {
|
synchronized (z) {
|
||||||
int resultCode = z.inflateInit(JZlib.W_ZLIB);
|
int resultCode = z.inflateInit(ZlibUtil.convertWrapperType(wrapper));
|
||||||
if (resultCode != JZlib.Z_OK) {
|
if (resultCode != JZlib.Z_OK) {
|
||||||
ZlibUtil.fail(z, "initialization failure", resultCode);
|
ZlibUtil.fail(z, "initialization failure", resultCode);
|
||||||
}
|
}
|
||||||
@ -55,7 +66,9 @@ public class ZlibDecoder extends OneToOneDecoder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance with the specified preset dictionary.
|
* Creates a new instance with the specified preset dictionary. The wrapper
|
||||||
|
* is always {@link ZlibWrapper#ZLIB} because it is the only format that
|
||||||
|
* supports the preset dictionary.
|
||||||
*
|
*
|
||||||
* @throws CompressionException if failed to initialize zlib
|
* @throws CompressionException if failed to initialize zlib
|
||||||
*/
|
*/
|
||||||
|
@ -47,12 +47,9 @@ public class ZlibEncoder extends OneToOneEncoder {
|
|||||||
private final ZStream z = new ZStream();
|
private final ZStream z = new ZStream();
|
||||||
private final AtomicBoolean finished = new AtomicBoolean();
|
private final AtomicBoolean finished = new AtomicBoolean();
|
||||||
|
|
||||||
// TODO 'do not compress' once option
|
|
||||||
// TODO support three wrappers - zlib (default), gzip (unsupported by jzlib, but easy to implement), nowrap
|
|
||||||
// TODO Disallow preset dictionary for gzip
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new zlib encoder with the default compression level ({@code 6}).
|
* Creates a new zlib encoder with the default compression level ({@code 6})
|
||||||
|
* and the default wrapper ({@link ZlibWrapper#ZLIB}).
|
||||||
*
|
*
|
||||||
* @throws CompressionException if failed to initialize zlib
|
* @throws CompressionException if failed to initialize zlib
|
||||||
*/
|
*/
|
||||||
@ -61,7 +58,8 @@ public class ZlibEncoder extends OneToOneEncoder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new zlib encoder with the specified {@code compressionLevel}.
|
* Creates a new zlib encoder with the specified {@code compressionLevel}
|
||||||
|
* and the default wrapper ({@link ZlibWrapper#ZLIB}).
|
||||||
*
|
*
|
||||||
* @param compressionLevel
|
* @param compressionLevel
|
||||||
* {@code 1} yields the fastest compression and {@code 9} yields the
|
* {@code 1} yields the fastest compression and {@code 9} yields the
|
||||||
@ -71,12 +69,42 @@ public class ZlibEncoder extends OneToOneEncoder {
|
|||||||
* @throws CompressionException if failed to initialize zlib
|
* @throws CompressionException if failed to initialize zlib
|
||||||
*/
|
*/
|
||||||
public ZlibEncoder(int compressionLevel) {
|
public ZlibEncoder(int compressionLevel) {
|
||||||
|
this(compressionLevel, ZlibWrapper.ZLIB);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new zlib encoder with the default compression level ({@code 6})
|
||||||
|
* and the specified wrapper.
|
||||||
|
*
|
||||||
|
* @throws CompressionException if failed to initialize zlib
|
||||||
|
*/
|
||||||
|
public ZlibEncoder(ZlibWrapper wrapper) {
|
||||||
|
this(6, wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new zlib encoder with the specified {@code compressionLevel}
|
||||||
|
* and the specified wrapper.
|
||||||
|
*
|
||||||
|
* @param compressionLevel
|
||||||
|
* {@code 1} yields the fastest compression and {@code 9} yields the
|
||||||
|
* best compression. {@code 0} means no compression. The default
|
||||||
|
* compression level is {@code 6}.
|
||||||
|
*
|
||||||
|
* @throws CompressionException if failed to initialize zlib
|
||||||
|
*/
|
||||||
|
public ZlibEncoder(int compressionLevel, ZlibWrapper wrapper) {
|
||||||
if (compressionLevel < 0 || compressionLevel > 9) {
|
if (compressionLevel < 0 || compressionLevel > 9) {
|
||||||
throw new IllegalArgumentException("compressionLevel: " + compressionLevel + " (expected: 0-9)");
|
throw new IllegalArgumentException(
|
||||||
|
"compressionLevel: " + compressionLevel +
|
||||||
|
" (expected: 0-9)");
|
||||||
|
}
|
||||||
|
if (wrapper == null) {
|
||||||
|
throw new NullPointerException("wrapper");
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized (z) {
|
synchronized (z) {
|
||||||
int resultCode = z.deflateInit(compressionLevel, JZlib.W_ZLIB); // Default: ZLIB format
|
int resultCode = z.deflateInit(compressionLevel, ZlibUtil.convertWrapperType(wrapper));
|
||||||
if (resultCode != JZlib.Z_OK) {
|
if (resultCode != JZlib.Z_OK) {
|
||||||
ZlibUtil.fail(z, "initialization failure", resultCode);
|
ZlibUtil.fail(z, "initialization failure", resultCode);
|
||||||
}
|
}
|
||||||
@ -85,7 +113,9 @@ public class ZlibEncoder extends OneToOneEncoder {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new zlib encoder with the default compression level ({@code 6})
|
* Creates a new zlib encoder with the default compression level ({@code 6})
|
||||||
* and the specified preset dictionary.
|
* and the specified preset dictionary. The wrapper is always
|
||||||
|
* {@link ZlibWrapper#ZLIB} because it is the only format that supports
|
||||||
|
* the preset dictionary.
|
||||||
*
|
*
|
||||||
* @param dictionary the preset dictionary
|
* @param dictionary the preset dictionary
|
||||||
*
|
*
|
||||||
@ -97,7 +127,9 @@ public class ZlibEncoder extends OneToOneEncoder {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new zlib encoder with the specified {@code compressionLevel}
|
* Creates a new zlib encoder with the specified {@code compressionLevel}
|
||||||
* and the specified preset dictionary.
|
* and the specified preset dictionary. The wrapper is always
|
||||||
|
* {@link ZlibWrapper#ZLIB} because it is the only format that supports
|
||||||
|
* the preset dictionary.
|
||||||
*
|
*
|
||||||
* @param compressionLevel
|
* @param compressionLevel
|
||||||
* {@code 1} yields the fastest compression and {@code 9} yields the
|
* {@code 1} yields the fastest compression and {@code 9} yields the
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.jboss.netty.handler.codec.compression;
|
package org.jboss.netty.handler.codec.compression;
|
||||||
|
|
||||||
|
import org.jboss.netty.util.internal.jzlib.JZlib;
|
||||||
import org.jboss.netty.util.internal.jzlib.ZStream;
|
import org.jboss.netty.util.internal.jzlib.ZStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -35,6 +36,24 @@ final class ZlibUtil {
|
|||||||
(z.msg != null? ": " + z.msg : ""));
|
(z.msg != null? ": " + z.msg : ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Enum<?> convertWrapperType(ZlibWrapper wrapper) {
|
||||||
|
Enum<?> convertedWrapperType;
|
||||||
|
switch (wrapper) {
|
||||||
|
case NONE:
|
||||||
|
convertedWrapperType = JZlib.W_NONE;
|
||||||
|
break;
|
||||||
|
case ZLIB:
|
||||||
|
convertedWrapperType = JZlib.W_ZLIB;
|
||||||
|
break;
|
||||||
|
case GZIP:
|
||||||
|
convertedWrapperType = JZlib.W_GZIP;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
return convertedWrapperType;
|
||||||
|
}
|
||||||
|
|
||||||
private ZlibUtil() {
|
private ZlibUtil() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user