Author: mturk
Date: Tue Aug 30 07:17:59 2011
New Revision: 1163110
URL: http://svn.apache.org/viewvc?rev=1163110&view=rev
Log:
Add base zlib api
Added:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Local.java
(with props)
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/LocalStrings.properties
(with props)
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Zlib.java
(with props)
commons/sandbox/runtime/trunk/src/main/native/shared/zlib.c (with props)
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestZlib.java
(with props)
Modified:
commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in
Added:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Local.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Local.java?rev=1163110&view=auto
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Local.java
(added)
+++
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Local.java
Tue Aug 30 07:17:59 2011
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.commons.runtime.util.zlib;
+import org.apache.commons.runtime.util.StringManager;
+
+/** Util package private constants
+ */
+class Local
+{
+
+ public static final String Package =
"org.apache.commons.runtime.util.zlib";
+ public static final StringManager sm;
+
+ static {
+ sm = StringManager.getManager(Package);
+ }
+}
+
Propchange:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Local.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/LocalStrings.properties?rev=1163110&view=auto
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/LocalStrings.properties
(added)
+++
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/LocalStrings.properties
Tue Aug 30 07:17:59 2011
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+Z_PARAM_ERROR=Invalid parameter
+Z_DATA_ERROR=Data integrity error is detected in the compressed stream
+
Propchange:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/LocalStrings.properties
------------------------------------------------------------------------------
svn:eol-style = native
Added:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Zlib.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Zlib.java?rev=1163110&view=auto
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Zlib.java
(added)
+++
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Zlib.java
Tue Aug 30 07:17:59 2011
@@ -0,0 +1,406 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.runtime.util.zlib;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import org.apache.commons.runtime.InvalidArgumentException;
+import org.apache.commons.runtime.InvalidDataException;
+import org.apache.commons.runtime.InvalidRangeException;
+import org.apache.commons.runtime.OperationNotPermittedException;
+import org.apache.commons.runtime.OverflowException;
+import org.apache.commons.runtime.Pointer;
+import org.apache.commons.runtime.util.StringManager;
+import org.apache.commons.runtime.util.Utils;
+
+/**
+ * Zlib api.
+ *
+ * @author Mladen Turk
+ * @since Runtime 1.0
+ */
+public final class Zlib
+{
+ /**
+ * Zlib library version string.
+ */
+ public static final String VERSION;
+
+ private static native String version0();
+
+ /* Error codes */
+ private static final int Z_ERRNO = -1;
+ private static final int Z_STREAM_ERROR = -2;
+ private static final int Z_DATA_ERROR = -3;
+ private static final int Z_MEM_ERROR = -4;
+ private static final int Z_BUF_ERROR = -5;
+ private static final int Z_VERSION_ERROR = -6;
+
+ /* Indicates the stream direction */
+ private boolean isCompressing = false;
+
+ static {
+ VERSION = version0();
+ }
+
+ private Zlib()
+ {
+ // No instance
+ }
+
+ private static native int deflate0(byte[] src, int spos,
+ byte[] dst, int dpos, int dlen,
+ int len, int level)
+ throws InvalidArgumentException,
+ OverflowException;
+ private static native int deflate1(ByteBuffer src, int spos,
+ ByteBuffer dst, int dpos, int dlen,
+ int len, int level)
+ throws InvalidArgumentException,
+ OverflowException;
+ private static native int deflate2(long src, long dst, int dlen,
+ int len, int level)
+ throws InvalidArgumentException,
+ InvalidRangeException,
+ OverflowException;
+ private static native int inflate0(byte[] src, int spos,
+ byte[] dst, int dpos, int dlen,
+ int len)
+ throws InvalidArgumentException,
+ InvalidDataException,
+ OverflowException;
+ private static native int inflate1(ByteBuffer src, int spos,
+ ByteBuffer dst, int dpos, int dlen,
+ int len)
+ throws InvalidArgumentException,
+ InvalidDataException,
+ OverflowException;
+ private static native int inflate2(long src,long dst, int dlen,
+ int len)
+ throws InvalidArgumentException,
+ InvalidDataException,
+ OverflowException;
+
+
+ /**
+ * Compress data buffer.
+ * <p>
+ * Compression in this manner is a one-shot event, done with a single call
+ * to this function. There is no mechanism for making additional calls
+ * to provide extra input data. If you want that kind of mechanism, use
+ * the low-level interface.
+ * </p>
+ *
+ * @param src the source data buffer.
+ * @param srcPos starting position in the source buffer.
+ * @param dest destination buffer that will hold compressed data.
+ * @param destPos stating position in the destination buffer.
+ * @param length number of bytes to compress.
+ * @param level compression between {@code 1} and {@code 9} inclusive.
+ *
+ * @return the size of the compressed data.
+ *
+ * @throws InvalidArgumentException if any of the argumets is invalid.
+ * @throws OverflowException if the size of the compressed data exceeds
+ * the size of the destination buffer.
+ */
+ public static int buffToBuffCompress(byte[] src,
+ int srcPos,
+ byte[] dest,
+ int destPos,
+ int length,
+ int level)
+ throws InvalidArgumentException,
+ OverflowException
+ {
+ if (level < 1 || level > 9)
+ throw new InvalidArgumentException();
+ int destLen = dest.length - destPos;
+ if (srcPos < 0 || destPos < 0 || destLen < 1 || length < 1 ||
+ srcPos + length > src.length)
+ throw new ArrayIndexOutOfBoundsException();
+ return deflate0(src, srcPos, dest, destPos, destLen, length, level);
+ }
+
+ /**
+ * Compress data buffer.
+ * <p>
+ * Compression in this manner is a one-shot event, done with a single call
+ * to this function. There is no mechanism for making additional calls
+ * to provide extra input data. If you want that kind of mechanism, use
+ * the low-level interface.
+ * </p>
+ *
+ * @param src the source data buffer.
+ * @param dst destination buffer that will hold compressed data.
+ * @param level compression between {@code 1} and {@code 9} inclusive.
+ *
+ * @throws InvalidArgumentException if any of the argumets is invalid.
+ * @throws OverflowException if the size of the compressed data exceeds
+ * the size of the destination buffer.
+ */
+ public static void buffToBuffCompress(ByteBuffer src,
+ ByteBuffer dst,
+ int level)
+ throws InvalidArgumentException,
+ OverflowException
+ {
+ if (level < 1 || level > 9)
+ throw new InvalidArgumentException();
+ int dstLen = dst.remaining();
+ int length = src.remaining();
+ if (dstLen < 1 || length < 1)
+ throw new ArrayIndexOutOfBoundsException();
+ int s = deflate1(src, src.position(), dst, dst.position(),
+ dstLen, length, level);
+ dst.position(s);
+ }
+
+ /**
+ * Compress data buffer.
+ * <p>
+ * Compression in this manner is a one-shot event, done with a single call
+ * to this function. There is no mechanism for making additional calls
+ * to provide extra input data. If you want that kind of mechanism, use
+ * the low-level interface.
+ * </p>
+ *
+ * @param src the source data buffer.
+ * @param srcPos starting position in the source buffer.
+ * @param dst destination buffer that will hold compressed data.
+ * @param dstPos stating position in the destination buffer.
+ * @param length number of bytes to compress.
+ * @param level compression between {@code 1} and {@code 9} inclusive.
+ *
+ * @return the size of the compressed data.
+ *
+ * @throws InvalidArgumentException if any of the argumets is invalid.
+ * @throws OverflowException if the size of the compressed data exceeds
+ * the size of the destination buffer.
+ */
+ public static long buffToBuffCompress(long src, long dst,
+ int dstLen,
+ int length,
+ int level)
+ throws InvalidArgumentException,
+ InvalidRangeException,
+ OverflowException
+ {
+ if (level < 1 || level > 9)
+ throw new InvalidArgumentException();
+ if (src == 0L || dst == 0L)
+ throw new NullPointerException();
+ if (length < 1 || dstLen < 1)
+ throw new IndexOutOfBoundsException();
+ return deflate2(src, dst, dstLen, length, level);
+ }
+
+ /**
+ * Compress data buffer.
+ * <p>
+ * Compression in this manner is a one-shot event, done with a single call
+ * to this function. The resulting compressed data is a complete bzip2
+ * format data stream. There is no mechanism for making additional calls
+ * to provide extra input data. If you want that kind of mechanism, use
+ * the low-level interface.
+ * </p>
+ *
+ * @param src the source data buffer.
+ * @param srcPos starting position in the source buffer.
+ * @param dst destination buffer that will hold compressed data.
+ * @param dstPos stating position in the destination buffer.
+ * @param length number of bytes to compress.
+ * @param level compression between {@code 1} and {@code 9} inclusive.
+ * @return the size of the compressed data.
+ *
+ * @throws InvalidArgumentException if any of the argumets is invalid.
+ * @throws OverflowException if the size of the compressed data exceeds
+ * the size of the destination buffer.
+ */
+ public static long buffToBuffCompress(Pointer src,
+ long srcPos,
+ Pointer dst,
+ long dstPos,
+ int length,
+ int level)
+ throws InvalidArgumentException,
+ InvalidRangeException,
+ OverflowException
+ {
+ if (src.isNull() || dst.isNull())
+ throw new NullPointerException();
+ if (srcPos < 0L || dstPos < 0L)
+ throw new IndexOutOfBoundsException();
+ long srca = src.address() + srcPos;
+ long dsta = dst.address() + dstPos;
+ int dlen = Utils.toInteger(dst.sizeof() - dstPos);
+ return buffToBuffCompress(srca, dsta, dlen, length, level);
+ }
+
+ /**
+ * Decompress data buffer.
+ * <p>
+ * Because the compression ratio of the compressed data cannot be known
+ * in advance, there is no easy way to guarantee that the output buffer
+ * will be big enough. You may of course make arrangements in your code
+ * to record the size of the uncompressed data, but such a mechanism is
+ * beyond the scope of this library.
+ * </p>
+ *
+ * @param src the source data buffer.
+ * @param srcPos starting position in the source buffer.
+ * @param dest destination buffer that will hold uncompressed data.
+ * @param destPos stating position in the destination buffer.
+ * @param length number of bytes to uncompress.
+ * @return the size of the uncompressed data.
+ *
+ * @throws InvalidArgumentException if any of the argumets is invalid.
+ * @throws InvalidDataException if provided data is corrupt or contains
+ * invalid zlib data.
+ * @throws OverflowException if the size of the uncompressed data exceeds
+ * the size of the destination buffer.
+ */
+ public static int buffToBuffDecompress(byte[] src,
+ int srcPos,
+ byte[] dest,
+ int destPos,
+ int length)
+ throws InvalidArgumentException,
+ InvalidDataException,
+ OverflowException
+ {
+ int destLen = dest.length - destPos;
+ if (srcPos < 0 || destPos < 0 || destLen < 1 || length < 1 ||
+ srcPos + length > src.length)
+ throw new ArrayIndexOutOfBoundsException();
+ return inflate0(src, srcPos, dest, destPos, destLen, length);
+ }
+
+ /**
+ * Decompress data buffer.
+ * <p>
+ * Because the compression ratio of the compressed data cannot be known
+ * in advance, there is no easy way to guarantee that the output buffer
+ * will be big enough. You may of course make arrangements in your code
+ * to record the size of the uncompressed data, but such a mechanism is
+ * beyond the scope of this library.
+ * </p>
+ *
+ * @param src the source data buffer.
+ * @param dst destination buffer that will hold uncompressed data.
+ *
+ * @throws InvalidArgumentException if any of the argumets is invalid.
+ * @throws InvalidDataException if provided data is corrupt or contains
+ * invalid compression data.
+ * @throws OverflowException if the size of the uncompressed data exceeds
+ * the size of the destination buffer.
+ */
+ public static void buffToBuffDecompress(ByteBuffer src,
+ ByteBuffer dst)
+ throws InvalidArgumentException,
+ InvalidDataException,
+ OverflowException
+ {
+ int dstLen = dst.remaining();
+ int length = src.remaining();
+ if (dstLen < 1 || length < 1)
+ throw new ArrayIndexOutOfBoundsException();
+ int p = inflate1(src, src.position(), dst, dst.position(),
+ dstLen, length);
+ dst.position(p);
+ }
+
+ /**
+ * Decompress data buffer.
+ * <p>
+ * Because the compression ratio of the compressed data cannot be known
+ * in advance, there is no easy way to guarantee that the output buffer
+ * will be big enough. You may of course make arrangements in your code
+ * to record the size of the uncompressed data, but such a mechanism is
+ * beyond the scope of this library.
+ * </p>
+ *
+ * @param src the source data buffer.
+ * @param dst destination buffer that will hold uncompressed data.
+ * @param dstLen length of the destination buffer.
+ * @param length number of bytes to uncompress.
+ * @return the size of the uncompressed data.
+ *
+ * @throws InvalidArgumentException if any of the argumets is invalid.
+ * @throws InvalidDataException if provided data is corrupt or contains
+ * invalid compressed data.
+ * @throws OverflowException if the size of the uncompressed data exceeds
+ * the size of the destination buffer.
+ */
+ public static long buffToBuffDecompress(long src,
+ long dst,
+ int dstLen,
+ int length)
+ throws InvalidArgumentException,
+ InvalidDataException,
+ OverflowException
+ {
+ if (src == 0L || dst == 0L)
+ throw new NullPointerException();
+ if (length < 1 || dstLen < 1)
+ throw new IndexOutOfBoundsException();
+ return inflate2(src, dst, dstLen, length);
+ }
+
+ /**
+ * Decompress data buffer.
+ * <p>
+ * Because the compression ratio of the compressed data cannot be known
+ * in advance, there is no easy way to guarantee that the output buffer
+ * will be big enough. You may of course make arrangements in your code
+ * to record the size of the uncompressed data, but such a mechanism is
+ * beyond the scope of this library.
+ * </p>
+ *
+ * @param src the source data buffer.
+ * @param srcPos starting position in the source buffer.
+ * @param dst destination buffer that will hold uncompressed data.
+ * @param dstPos stating position in the destination buffer.
+ * @param length number of bytes to uncompress.
+ * @return the size of the uncompressed data.
+ *
+ * @throws InvalidArgumentException if any of the argumets is invalid.
+ * @throws InvalidDataException if provided data is corrupt or contains
+ * invalid compressed data.
+ * @throws OverflowException if the size of the uncompressed data exceeds
+ * the size of the destination buffer.
+ */
+ public static long buffToBuffDecompress(Pointer src,
+ long srcPos,
+ Pointer dst,
+ long dstPos,
+ int length)
+ throws InvalidArgumentException,
+ InvalidDataException,
+ OverflowException
+ {
+ if (src.isNull() || dst.isNull())
+ throw new NullPointerException();
+ if (srcPos < 0L || dstPos < 0L)
+ throw new IndexOutOfBoundsException();
+ long srca = src.address() + srcPos;
+ long dsta = dst.address() + dstPos;
+ int dlen = Utils.toInteger(dst.sizeof() - dstPos);
+ return buffToBuffDecompress(srca, dsta, dlen, length);
+ }
+
+}
Propchange:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/zlib/Zlib.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in?rev=1163110&r1=1163109&r2=1163110&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in Tue Aug 30
07:17:59 2011
@@ -147,6 +147,7 @@ LIBSOURCES=\
$(TOPDIR)\shared\utime.c \
$(TOPDIR)\shared\uuid.c \
$(TOPDIR)\shared\version.c \
+ $(TOPDIR)\shared\zlib.c \
$(TOPDIR)\shared\buildmark.c
SSLSOURCES=\
Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in?rev=1163110&r1=1163109&r2=1163110&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.unx.in Tue Aug 30
07:17:59 2011
@@ -142,6 +142,7 @@ LIBSOURCES=\
$(TOPDIR)/shared/utime.c \
$(TOPDIR)/shared/uuid.c \
$(TOPDIR)/shared/version.c \
+ $(TOPDIR)/shared/zlib.c \
$(TOPDIR)/shared/buildmark.c
SSLSOURCES=\
Added: commons/sandbox/runtime/trunk/src/main/native/shared/zlib.c
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/zlib.c?rev=1163110&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/zlib.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/zlib.c Tue Aug 30
07:17:59 2011
@@ -0,0 +1,327 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "acr/api.h"
+#include "acr/jniapi.h"
+#include "acr/memory.h"
+#include "acr/string.h"
+
+#include "zlib/zlib.h"
+
+#define ACR_ZLIB_EXPORT(RT, CL, MN) \
+ ACR_JNIEXPORT RT JNICALL
Java_org_apache_commons_runtime_util_zlib_##CL##_##MN
+#define ACR_ZBUFF(S) ((char *)(S) + ACR_ZSIZE)
+
+static int ACR_ZSIZE;
+
+typedef struct acr_zstream {
+ z_stream zs;
+ unsigned int zlen;
+ int state;
+ jboolean eos;
+ void *next_array;
+ char *next_data;
+} acr_zstream;
+
+
+ACR_ZLIB_EXPORT(jstring, Zlib, version0)(JNI_STDARGS)
+{
+ return AcrNewJavaStringU(env, zlibVersion());
+}
+
+ACR_ZLIB_EXPORT(jint, Zlib, deflate0)(JNI_STDARGS, jbyteArray src, jint spos,
+ jbyteArray dst, jint dpos, jint dlen,
+ jint len, jint level)
+{
+ uLongf dstLen;
+ Bytef *scp;
+ Bytef *dcp;
+ int rc;
+
+ dstLen = dlen;
+ scp = JARRAY_CRITICAL(Bytef, src);
+ dcp = JARRAY_CRITICAL(Bytef, dst);
+ if (dcp == 0 || scp == 0) {
+ RELEASE_CRITICAL(src, scp);
+ RELEASE_CRITICAL(dst, dcp);
+ ACR_THROW(ACR_EX_EINVAL, 0);
+ return 0;
+ }
+
+ rc = compress2(dcp + dpos, &dstLen, scp + spos, len, level);
+ RELEASE_CRITICAL(src, scp);
+ RELEASE_CRITICAL(dst, dcp);
+ if (rc == Z_OK)
+ return (jint)dstLen;
+ else if (rc == Z_BUF_ERROR)
+ ACR_THROW(ACR_EX_EOVERFLOW, 0);
+ else
+ ACR_THROW(ACR_EX_EINVAL, 0);
+ return 0;
+}
+
+ACR_ZLIB_EXPORT(jlong, Zlib, deflate1)(JNI_STDARGS, jobject src, jint spos,
+ jobject dst, jint dpos, jint dlen,
+ jint len, jint level)
+{
+ uLongf dstLen;
+ Bytef *scp;
+ Bytef *dcp;
+ int rc;
+
+ dstLen = dlen;
+ if ((scp = (Bytef *)(*env)->GetDirectBufferAddress(env, src)) == 0) {
+ ACR_THROW(ACR_EX_ENULL, 0);
+ return 0;
+ }
+ if ((dcp = (Bytef *)(*env)->GetDirectBufferAddress(env, dst)) == 0) {
+ ACR_THROW(ACR_EX_ENULL, 0);
+ return 0;
+ }
+ rc = compress2(dcp + dpos, &dstLen, scp + spos, len, level);
+ if (rc == Z_OK)
+ return (jint)dstLen;
+ else if (rc == Z_BUF_ERROR)
+ ACR_THROW(ACR_EX_EOVERFLOW, 0);
+ else
+ ACR_THROW(ACR_EX_EINVAL, 0);
+ return 0;
+}
+
+ACR_ZLIB_EXPORT(jint, Zlib, deflate2)(JNI_STDARGS, jlong src, jlong dst,
+ jint dlen, jint len, jint level)
+{
+ uLongf dstLen;
+ Bytef *scp = J2P(src, Bytef *);
+ Bytef *dcp = J2P(dst, Bytef *);
+ int rc;
+
+ dstLen = dlen;
+ rc = compress2(dcp, &dstLen, scp, len, level);
+ if (rc == Z_OK)
+ return (jint)dstLen;
+ else if (rc == Z_BUF_ERROR)
+ ACR_THROW(ACR_EX_EOVERFLOW, 0);
+ else
+ ACR_THROW(ACR_EX_EINVAL, 0);
+ return 0;
+}
+
+ACR_ZLIB_EXPORT(jint, Zlib, inflate0)(JNI_STDARGS, jbyteArray src, jint spos,
+ jbyteArray dst, jint dpos, jint dlen,
+ jint len)
+{
+ uLongf dstLen;
+ Bytef *scp;
+ Bytef *dcp;
+ int rc;
+
+ dstLen = dlen;
+ scp = JARRAY_CRITICAL(Bytef, src);
+ dcp = JARRAY_CRITICAL(Bytef, dst);
+ if (dcp == 0 || scp == 0) {
+ RELEASE_CRITICAL(src, scp);
+ RELEASE_CRITICAL(dst, dcp);
+ ACR_THROW(ACR_EX_EINVAL, 0);
+ return 0;
+ }
+
+ rc = uncompress(dcp + dpos, &dstLen, scp + spos, len);
+ RELEASE_CRITICAL(src, scp);
+ RELEASE_CRITICAL(dst, dcp);
+ if (rc == Z_OK)
+ return (jint)dstLen;
+ else if (rc == Z_BUF_ERROR)
+ ACR_THROW(ACR_EX_EOVERFLOW, 0);
+ else if (rc == Z_MEM_ERROR)
+ ACR_THROW(ACR_EX_ENOMEM, 0);
+ else
+ ACR_THROW_MSG(ACR_EX_EILSEQ, zError(rc));
+ return 0;
+}
+
+ACR_ZLIB_EXPORT(jint, Zlib, inflate1)(JNI_STDARGS, jobject src, jint spos,
+ jobject dst, jint dpos, jint dlen,
+ jint len)
+{
+ uLongf dstLen;
+ Bytef *scp;
+ Bytef *dcp;
+ int rc;
+
+ dstLen = dlen;
+ if ((scp = (Bytef *)(*env)->GetDirectBufferAddress(env, src)) == 0) {
+ ACR_THROW(ACR_EX_ENULL, 0);
+ return 0;
+ }
+ if ((dcp = (Bytef *)(*env)->GetDirectBufferAddress(env, dst)) == 0) {
+ ACR_THROW(ACR_EX_ENULL, 0);
+ return 0;
+ }
+
+ rc = uncompress(dcp + dpos, &dstLen, scp + spos, len);
+ if (rc == Z_OK)
+ return (jint)dstLen;
+ else if (rc == Z_BUF_ERROR)
+ ACR_THROW(ACR_EX_EOVERFLOW, 0);
+ else if (rc == Z_MEM_ERROR)
+ ACR_THROW(ACR_EX_ENOMEM, 0);
+ else
+ ACR_THROW_MSG(ACR_EX_EILSEQ, zError(rc));
+ return 0;
+}
+
+ACR_ZLIB_EXPORT(jlong, Zlib, inflate2)(JNI_STDARGS, jlong src,
+ jlong dst, jint dlen,
+ jint len)
+{
+ uLongf dstLen;
+ Bytef *scp = J2P(src, Bytef *);
+ Bytef *dcp = J2P(dst, Bytef *);
+ int rc;
+
+ dstLen = dlen;
+ rc = uncompress(dcp, &dstLen, scp, len);
+ if (rc == Z_OK)
+ return (jint)dstLen;
+ else if (rc == Z_BUF_ERROR)
+ ACR_THROW(ACR_EX_EOVERFLOW, 0);
+ else if (rc == Z_MEM_ERROR)
+ ACR_THROW(ACR_EX_ENOMEM, 0);
+ else
+ ACR_THROW_MSG(ACR_EX_EILSEQ, zError(rc));
+ return 0;
+}
+
+ACR_ZLIB_EXPORT(jint, ZlibImpl, init0)(JNI_STDARGS)
+{
+ int size = ISIZEOF(acr_zstream);
+ ACR_ZSIZE = ACR_ALIGN_DEFAULT(size);
+ return ACR_ZSIZE;
+}
+
+ACR_ZLIB_EXPORT(jlong, ZlibImpl, newHandle)(JNI_STDARGS, jint zsize)
+{
+ acr_zstream *s;
+ s = ACR_EALLOC(acr_zstream, zsize);
+ if (s != 0)
+ s->zlen = zsize;
+ return P2J(s);
+}
+
+ACR_ZLIB_EXPORT(jint, ZlibImpl, inflateInit2)(JNI_STDARGS,
+ jlong stream,
+ jint windowBits,
+ jint streamSize)
+{
+ int rc;
+ acr_zstream *s = J2P(stream, acr_zstream *);
+
+ rc = inflateInit2((z_streamp)s, windowBits);
+ s->state = 0;
+ s->eos = JNI_FALSE;
+
+ return rc;
+}
+
+ACR_ZLIB_EXPORT(jlong, ZlibImpl, deflateInit2)(JNI_STDARGS, jlong stream,
+ jint level,
+ jint method,
+ jint windowBits,
+ jint memLevel,
+ jint strategy)
+{
+ int rc;
+ acr_zstream *s = J2P(stream, acr_zstream *);
+
+ rc = deflateInit2((z_streamp)s, level, method, windowBits, memLevel,
strategy);
+ s->state = 0;
+ s->eos = JNI_FALSE;
+
+ return rc;
+}
+
+
+ACR_ZLIB_EXPORT(jlong, ZlibImpl, getTotalIn)(JNI_STDARGS, jlong stream)
+{
+ acr_zstream *s = J2P(stream, acr_zstream *);
+ jlong rv = (jlong)s->zs.total_in;
+
+ return rv;
+}
+
+ACR_ZLIB_EXPORT(jlong, ZlibImpl, getTotalOut)(JNI_STDARGS, jlong stream)
+{
+ acr_zstream *s = J2P(stream, acr_zstream *);
+ return (jlong)s->zs.total_out;
+}
+
+ACR_ZLIB_EXPORT(jint, ZlibImpl, getAvailIn)(JNI_STDARGS, jlong stream)
+{
+ acr_zstream *s = J2P(stream, acr_zstream *);
+ return s->zs.avail_in;
+}
+
+ACR_ZLIB_EXPORT(jlong, ZlibImpl, getAvailOut)(JNI_STDARGS, jlong stream)
+{
+ acr_zstream *s = J2P(stream, acr_zstream *);
+ return (jlong)s->zs.avail_out;
+}
+
+ACR_ZLIB_EXPORT(jboolean, ZlibImpl, needsInput)(JNI_STDARGS, jlong stream)
+{
+ acr_zstream *s = J2P(stream, acr_zstream *);
+
+ if (s->state == 0 && s->zs.avail_in == 0)
+ return JNI_TRUE;
+ else
+ return JNI_FALSE;
+}
+
+ACR_ZLIB_EXPORT(jboolean, ZlibImpl, finish)(JNI_STDARGS, jlong stream)
+{
+ jboolean rv = JNI_FALSE;
+ acr_zstream *s = J2P(stream, acr_zstream *);
+
+ if (s->state == 0) {
+ s->state = Z_FINISH;
+ rv = JNI_TRUE;
+ }
+ return rv;
+}
+
+ACR_ZLIB_EXPORT(jboolean, ZlibImpl, finished)(JNI_STDARGS, jlong stream)
+{
+ acr_zstream *s = J2P(stream, acr_zstream *);
+ return s->eos;
+}
+
+ACR_ZLIB_EXPORT(void, ZlibDeflater, close0)(JNI_STDARGS, jlong stream)
+{
+ acr_zstream *s = J2P(stream, acr_zstream *);
+ deflateEnd((z_streamp)s);
+ AcrFree(s->next_array);
+ AcrFree(s);
+}
+
+ACR_ZLIB_EXPORT(void, ZlibInflater, close0)(JNI_STDARGS, jlong stream)
+{
+ acr_zstream *s = J2P(stream, acr_zstream *);
+
+ inflateEnd((z_streamp)s);
+ AcrFree(s->next_array);
+ AcrFree(s);
+}
Propchange: commons/sandbox/runtime/trunk/src/main/native/shared/zlib.c
------------------------------------------------------------------------------
svn:eol-style = native
Added:
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestZlib.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestZlib.java?rev=1163110&view=auto
==============================================================================
---
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestZlib.java
(added)
+++
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestZlib.java
Tue Aug 30 07:17:59 2011
@@ -0,0 +1,51 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.runtime.util.zlib;
+
+import java.io.IOException;
+import java.io.File;
+import org.testng.annotations.*;
+import org.testng.Assert;
+
+public class TestZlib extends Assert
+{
+ private static final String loremIpsum =
+ "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " +
+ "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " +
+ "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " +
+ "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in " +
+ "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla " +
+ "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in " +
+ "culpa qui officia deserunt mollit anim id est laborum.";
+
+
+ @Test(groups = { "core" })
+ public void bufToBuffCompressing()
+ throws Exception
+ {
+ byte[] cd = loremIpsum.getBytes();
+ byte[] dd = new byte[500];
+ byte[] dc = new byte[loremIpsum.length()];
+
+ int sc = Zlib.buffToBuffCompress(cd, 0, dd, 0, cd.length, 9);
+ // 270 is pre-computed length.
+ assertEquals(sc, 270);
+ int sd = Zlib.buffToBuffDecompress(dd, 0, dc, 0, sc);
+ assertEquals(sd, loremIpsum.length());
+ }
+
+}
Propchange:
commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestZlib.java
------------------------------------------------------------------------------
svn:eol-style = native