extern "C" void Java_java_util_zip_Inflater_resetImpl(JNIEnv* env, jobject, jlong handle) { NativeZipStream* stream = toNativeZipStream(handle); int err = inflateReset(&stream->stream); if (err != Z_OK) { throwExceptionForZlibError(env, "java/lang/IllegalArgumentException", err, stream); } }
extern "C" jint Java_java_util_zip_Inflater_inflateImpl(JNIEnv* env, jobject recv, jbyteArray buf, int off, int len, jlong handle) { NativeZipStream* stream = toNativeZipStream(handle); ScopedByteArrayRW out(env, buf); if (out.get() == NULL) { return -1; } stream->stream.next_out = reinterpret_cast<Bytef*>(out.get() + off); stream->stream.avail_out = len; Bytef* initialNextIn = stream->stream.next_in; Bytef* initialNextOut = stream->stream.next_out; int err = inflate(&stream->stream, Z_SYNC_FLUSH); switch (err) { case Z_OK: break; case Z_NEED_DICT: static jfieldID needsDictionary = env->GetFieldID(JniConstants::inflaterClass, "needsDictionary", "Z"); env->SetBooleanField(recv, needsDictionary, JNI_TRUE); break; case Z_STREAM_END: static jfieldID finished = env->GetFieldID(JniConstants::inflaterClass, "finished", "Z"); env->SetBooleanField(recv, finished, JNI_TRUE); break; case Z_STREAM_ERROR: return 0; default: throwExceptionForZlibError(env, "java/util/zip/DataFormatException", err, stream); return -1; } jint bytesRead = stream->stream.next_in - initialNextIn; jint bytesWritten = stream->stream.next_out - initialNextOut; static jfieldID inReadField = env->GetFieldID(JniConstants::inflaterClass, "inRead", "I"); jint inReadValue = env->GetIntField(recv, inReadField); inReadValue += bytesRead; env->SetIntField(recv, inReadField, inReadValue); return bytesWritten; }
extern "C" jlong Java_java_util_zip_Inflater_createStream(JNIEnv* env, jobject, jboolean noHeader) { UniquePtr<NativeZipStream> jstream(new NativeZipStream); if (jstream.get() == NULL) { jniThrowOutOfMemoryError(env, NULL); return -1; } jstream->stream.adler = 1; /* * See zlib.h for documentation of the inflateInit2 windowBits parameter. * * zconf.h says the "requirements for inflate are (in bytes) 1 << windowBits * that is, 32K for windowBits=15 (default value) plus a few kilobytes * for small objects." This means that we can happily use the default * here without worrying about memory consumption. */ int err = inflateInit2(&jstream->stream, noHeader ? -DEF_WBITS : DEF_WBITS); if (err != Z_OK) { throwExceptionForZlibError(env, "java/lang/IllegalArgumentException", err, jstream.get()); return -1; } return reinterpret_cast<uintptr_t>(jstream.release()); }
static void Inflater_resetImpl(JNIEnv* env, jobject, jlong handle) { int err = inflateReset(&toNativeZipStream(handle)->stream); if (err != Z_OK) { throwExceptionForZlibError(env, "java/lang/IllegalArgumentException", err); } }