Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/native/java/util/zip/Deflater.c
38830 views
1
/*
2
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
/*
27
* Native method support for java.util.zip.Deflater
28
*/
29
30
#include <stdio.h>
31
#include <stdlib.h>
32
#include "jlong.h"
33
#include "jni.h"
34
#include "jni_util.h"
35
#include <zlib.h>
36
37
#include "java_util_zip_Deflater.h"
38
39
#define DEF_MEM_LEVEL 8
40
41
static jfieldID levelID;
42
static jfieldID strategyID;
43
static jfieldID setParamsID;
44
static jfieldID finishID;
45
static jfieldID finishedID;
46
static jfieldID bufID, offID, lenID;
47
48
JNIEXPORT void JNICALL
49
Java_java_util_zip_Deflater_initIDs(JNIEnv *env, jclass cls)
50
{
51
levelID = (*env)->GetFieldID(env, cls, "level", "I");
52
CHECK_NULL(levelID);
53
strategyID = (*env)->GetFieldID(env, cls, "strategy", "I");
54
CHECK_NULL(strategyID);
55
setParamsID = (*env)->GetFieldID(env, cls, "setParams", "Z");
56
CHECK_NULL(setParamsID);
57
finishID = (*env)->GetFieldID(env, cls, "finish", "Z");
58
CHECK_NULL(finishID);
59
finishedID = (*env)->GetFieldID(env, cls, "finished", "Z");
60
CHECK_NULL(finishedID);
61
bufID = (*env)->GetFieldID(env, cls, "buf", "[B");
62
CHECK_NULL(bufID);
63
offID = (*env)->GetFieldID(env, cls, "off", "I");
64
CHECK_NULL(offID);
65
lenID = (*env)->GetFieldID(env, cls, "len", "I");
66
CHECK_NULL(lenID);
67
}
68
69
JNIEXPORT jlong JNICALL
70
Java_java_util_zip_Deflater_init(JNIEnv *env, jclass cls, jint level,
71
jint strategy, jboolean nowrap)
72
{
73
z_stream *strm = calloc(1, sizeof(z_stream));
74
75
if (strm == 0) {
76
JNU_ThrowOutOfMemoryError(env, 0);
77
return jlong_zero;
78
} else {
79
const char *msg;
80
int ret = deflateInit2(strm, level, Z_DEFLATED,
81
nowrap ? -MAX_WBITS : MAX_WBITS,
82
DEF_MEM_LEVEL, strategy);
83
switch (ret) {
84
case Z_OK:
85
return ptr_to_jlong(strm);
86
case Z_MEM_ERROR:
87
free(strm);
88
JNU_ThrowOutOfMemoryError(env, 0);
89
return jlong_zero;
90
case Z_STREAM_ERROR:
91
free(strm);
92
JNU_ThrowIllegalArgumentException(env, 0);
93
return jlong_zero;
94
default:
95
msg = ((strm->msg != NULL) ? strm->msg :
96
(ret == Z_VERSION_ERROR) ?
97
"zlib returned Z_VERSION_ERROR: "
98
"compile time and runtime zlib implementations differ" :
99
"unknown error initializing zlib library");
100
free(strm);
101
JNU_ThrowInternalError(env, msg);
102
return jlong_zero;
103
}
104
}
105
}
106
107
JNIEXPORT void JNICALL
108
Java_java_util_zip_Deflater_setDictionary(JNIEnv *env, jclass cls, jlong addr,
109
jarray b, jint off, jint len)
110
{
111
Bytef *buf = (*env)->GetPrimitiveArrayCritical(env, b, 0);
112
int res;
113
if (buf == 0) {/* out of memory */
114
return;
115
}
116
res = deflateSetDictionary((z_stream *)jlong_to_ptr(addr), buf + off, len);
117
(*env)->ReleasePrimitiveArrayCritical(env, b, buf, 0);
118
switch (res) {
119
case Z_OK:
120
break;
121
case Z_STREAM_ERROR:
122
JNU_ThrowIllegalArgumentException(env, 0);
123
break;
124
default:
125
JNU_ThrowInternalError(env, ((z_stream *)jlong_to_ptr(addr))->msg);
126
break;
127
}
128
}
129
130
JNIEXPORT jint JNICALL
131
Java_java_util_zip_Deflater_deflateBytes(JNIEnv *env, jobject this, jlong addr,
132
jarray b, jint off, jint len, jint flush)
133
{
134
z_stream *strm = jlong_to_ptr(addr);
135
136
jarray this_buf = (*env)->GetObjectField(env, this, bufID);
137
jint this_off = (*env)->GetIntField(env, this, offID);
138
jint this_len = (*env)->GetIntField(env, this, lenID);
139
jbyte *in_buf;
140
jbyte *out_buf;
141
int res;
142
if ((*env)->GetBooleanField(env, this, setParamsID)) {
143
int level = (*env)->GetIntField(env, this, levelID);
144
int strategy = (*env)->GetIntField(env, this, strategyID);
145
in_buf = (*env)->GetPrimitiveArrayCritical(env, this_buf, 0);
146
if (in_buf == NULL) {
147
// Throw OOME only when length is not zero
148
if (this_len != 0 && (*env)->ExceptionOccurred(env) == NULL)
149
JNU_ThrowOutOfMemoryError(env, 0);
150
return 0;
151
}
152
out_buf = (*env)->GetPrimitiveArrayCritical(env, b, 0);
153
if (out_buf == NULL) {
154
(*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0);
155
if (len != 0 && (*env)->ExceptionOccurred(env) == NULL)
156
JNU_ThrowOutOfMemoryError(env, 0);
157
return 0;
158
}
159
160
strm->next_in = (Bytef *) (in_buf + this_off);
161
strm->next_out = (Bytef *) (out_buf + off);
162
strm->avail_in = this_len;
163
strm->avail_out = len;
164
res = deflateParams(strm, level, strategy);
165
(*env)->ReleasePrimitiveArrayCritical(env, b, out_buf, 0);
166
(*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0);
167
switch (res) {
168
case Z_OK:
169
(*env)->SetBooleanField(env, this, setParamsID, JNI_FALSE);
170
case Z_BUF_ERROR:
171
this_off += this_len - strm->avail_in;
172
(*env)->SetIntField(env, this, offID, this_off);
173
(*env)->SetIntField(env, this, lenID, strm->avail_in);
174
return (jint) (len - strm->avail_out);
175
default:
176
JNU_ThrowInternalError(env, strm->msg);
177
return 0;
178
}
179
} else {
180
jboolean finish = (*env)->GetBooleanField(env, this, finishID);
181
in_buf = (*env)->GetPrimitiveArrayCritical(env, this_buf, 0);
182
if (in_buf == NULL) {
183
if (this_len != 0)
184
JNU_ThrowOutOfMemoryError(env, 0);
185
return 0;
186
}
187
out_buf = (*env)->GetPrimitiveArrayCritical(env, b, 0);
188
if (out_buf == NULL) {
189
(*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0);
190
if (len != 0)
191
JNU_ThrowOutOfMemoryError(env, 0);
192
193
return 0;
194
}
195
196
strm->next_in = (Bytef *) (in_buf + this_off);
197
strm->next_out = (Bytef *) (out_buf + off);
198
strm->avail_in = this_len;
199
strm->avail_out = len;
200
res = deflate(strm, finish ? Z_FINISH : flush);
201
(*env)->ReleasePrimitiveArrayCritical(env, b, out_buf, 0);
202
(*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0);
203
switch (res) {
204
case Z_STREAM_END:
205
(*env)->SetBooleanField(env, this, finishedID, JNI_TRUE);
206
/* fall through */
207
case Z_OK:
208
case Z_BUF_ERROR:
209
this_off += this_len - strm->avail_in;
210
(*env)->SetIntField(env, this, offID, this_off);
211
(*env)->SetIntField(env, this, lenID, strm->avail_in);
212
return len - strm->avail_out;
213
default:
214
JNU_ThrowInternalError(env, strm->msg);
215
return 0;
216
}
217
}
218
}
219
220
JNIEXPORT jint JNICALL
221
Java_java_util_zip_Deflater_getAdler(JNIEnv *env, jclass cls, jlong addr)
222
{
223
return ((z_stream *)jlong_to_ptr(addr))->adler;
224
}
225
226
JNIEXPORT void JNICALL
227
Java_java_util_zip_Deflater_reset(JNIEnv *env, jclass cls, jlong addr)
228
{
229
if (deflateReset((z_stream *)jlong_to_ptr(addr)) != Z_OK) {
230
JNU_ThrowInternalError(env, 0);
231
}
232
}
233
234
JNIEXPORT void JNICALL
235
Java_java_util_zip_Deflater_end(JNIEnv *env, jclass cls, jlong addr)
236
{
237
if (deflateEnd((z_stream *)jlong_to_ptr(addr)) == Z_STREAM_ERROR) {
238
JNU_ThrowInternalError(env, 0);
239
} else {
240
free((z_stream *)jlong_to_ptr(addr));
241
}
242
}
243
244