1*977Smax.romanov@gmail.com
2*977Smax.romanov@gmail.com /*
3*977Smax.romanov@gmail.com * Copyright (C) NGINX, Inc.
4*977Smax.romanov@gmail.com */
5*977Smax.romanov@gmail.com
6*977Smax.romanov@gmail.com #include <nxt_auto_config.h>
7*977Smax.romanov@gmail.com
8*977Smax.romanov@gmail.com #include <jni.h>
9*977Smax.romanov@gmail.com #include <nxt_unit.h>
10*977Smax.romanov@gmail.com #include <nxt_unit_field.h>
11*977Smax.romanov@gmail.com
12*977Smax.romanov@gmail.com #include "nxt_jni.h"
13*977Smax.romanov@gmail.com
14*977Smax.romanov@gmail.com
15*977Smax.romanov@gmail.com static jclass nxt_java_NoSuchElementException_class;
16*977Smax.romanov@gmail.com static jclass nxt_java_IOException_class;
17*977Smax.romanov@gmail.com static jclass nxt_java_IllegalStateException_class;
18*977Smax.romanov@gmail.com static jclass nxt_java_File_class;
19*977Smax.romanov@gmail.com static jmethodID nxt_java_File_ctor;
20*977Smax.romanov@gmail.com
21*977Smax.romanov@gmail.com static inline char nxt_java_lowcase(char c);
22*977Smax.romanov@gmail.com
23*977Smax.romanov@gmail.com
24*977Smax.romanov@gmail.com int
nxt_java_jni_init(JNIEnv * env)25*977Smax.romanov@gmail.com nxt_java_jni_init(JNIEnv *env)
26*977Smax.romanov@gmail.com {
27*977Smax.romanov@gmail.com jclass cls;
28*977Smax.romanov@gmail.com
29*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/util/NoSuchElementException");
30*977Smax.romanov@gmail.com if (cls == NULL) {
31*977Smax.romanov@gmail.com return NXT_UNIT_ERROR;
32*977Smax.romanov@gmail.com }
33*977Smax.romanov@gmail.com
34*977Smax.romanov@gmail.com nxt_java_NoSuchElementException_class = (*env)->NewGlobalRef(env, cls);
35*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls);
36*977Smax.romanov@gmail.com
37*977Smax.romanov@gmail.com
38*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/io/IOException");
39*977Smax.romanov@gmail.com if (cls == NULL) {
40*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_NoSuchElementException_class);
41*977Smax.romanov@gmail.com return NXT_UNIT_ERROR;
42*977Smax.romanov@gmail.com }
43*977Smax.romanov@gmail.com
44*977Smax.romanov@gmail.com nxt_java_IOException_class = (*env)->NewGlobalRef(env, cls);
45*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls);
46*977Smax.romanov@gmail.com
47*977Smax.romanov@gmail.com
48*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/lang/IllegalStateException");
49*977Smax.romanov@gmail.com if (cls == NULL) {
50*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_NoSuchElementException_class);
51*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IOException_class);
52*977Smax.romanov@gmail.com return NXT_UNIT_ERROR;
53*977Smax.romanov@gmail.com }
54*977Smax.romanov@gmail.com
55*977Smax.romanov@gmail.com nxt_java_IllegalStateException_class = (*env)->NewGlobalRef(env, cls);
56*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls);
57*977Smax.romanov@gmail.com
58*977Smax.romanov@gmail.com
59*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/io/File");
60*977Smax.romanov@gmail.com if (cls == NULL) {
61*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_NoSuchElementException_class);
62*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IOException_class);
63*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IllegalStateException_class);
64*977Smax.romanov@gmail.com return NXT_UNIT_ERROR;
65*977Smax.romanov@gmail.com }
66*977Smax.romanov@gmail.com
67*977Smax.romanov@gmail.com nxt_java_File_class = (*env)->NewGlobalRef(env, cls);
68*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls);
69*977Smax.romanov@gmail.com
70*977Smax.romanov@gmail.com
71*977Smax.romanov@gmail.com nxt_java_File_ctor = (*env)->GetMethodID(env, nxt_java_File_class, "<init>",
72*977Smax.romanov@gmail.com "(Ljava/lang/String;)V");
73*977Smax.romanov@gmail.com if (nxt_java_File_ctor == NULL) {
74*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_NoSuchElementException_class);
75*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IOException_class);
76*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_IllegalStateException_class);
77*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, nxt_java_File_class);
78*977Smax.romanov@gmail.com return NXT_UNIT_ERROR;
79*977Smax.romanov@gmail.com }
80*977Smax.romanov@gmail.com
81*977Smax.romanov@gmail.com return NXT_UNIT_OK;
82*977Smax.romanov@gmail.com }
83*977Smax.romanov@gmail.com
84*977Smax.romanov@gmail.com
85*977Smax.romanov@gmail.com void
nxt_java_throw_NoSuchElementException(JNIEnv * env,const char * msg)86*977Smax.romanov@gmail.com nxt_java_throw_NoSuchElementException(JNIEnv *env, const char *msg)
87*977Smax.romanov@gmail.com {
88*977Smax.romanov@gmail.com (*env)->ThrowNew(env, nxt_java_NoSuchElementException_class, msg);
89*977Smax.romanov@gmail.com }
90*977Smax.romanov@gmail.com
91*977Smax.romanov@gmail.com
92*977Smax.romanov@gmail.com void
nxt_java_throw_IOException(JNIEnv * env,const char * msg)93*977Smax.romanov@gmail.com nxt_java_throw_IOException(JNIEnv *env, const char *msg)
94*977Smax.romanov@gmail.com {
95*977Smax.romanov@gmail.com (*env)->ThrowNew(env, nxt_java_IOException_class, msg);
96*977Smax.romanov@gmail.com }
97*977Smax.romanov@gmail.com
98*977Smax.romanov@gmail.com
99*977Smax.romanov@gmail.com void
nxt_java_throw_IllegalStateException(JNIEnv * env,const char * msg)100*977Smax.romanov@gmail.com nxt_java_throw_IllegalStateException(JNIEnv *env, const char *msg)
101*977Smax.romanov@gmail.com {
102*977Smax.romanov@gmail.com (*env)->ThrowNew(env, nxt_java_IllegalStateException_class, msg);
103*977Smax.romanov@gmail.com }
104*977Smax.romanov@gmail.com
105*977Smax.romanov@gmail.com
106*977Smax.romanov@gmail.com nxt_unit_field_t *
nxt_java_findHeader(nxt_unit_field_t * f,nxt_unit_field_t * end,const char * name,uint8_t name_len)107*977Smax.romanov@gmail.com nxt_java_findHeader(nxt_unit_field_t *f, nxt_unit_field_t *end,
108*977Smax.romanov@gmail.com const char *name, uint8_t name_len)
109*977Smax.romanov@gmail.com {
110*977Smax.romanov@gmail.com const char *field_name;
111*977Smax.romanov@gmail.com
112*977Smax.romanov@gmail.com for (/* void */ ; f < end; f++) {
113*977Smax.romanov@gmail.com if (f->skip != 0 || f->name_length != name_len) {
114*977Smax.romanov@gmail.com continue;
115*977Smax.romanov@gmail.com }
116*977Smax.romanov@gmail.com
117*977Smax.romanov@gmail.com field_name = nxt_unit_sptr_get(&f->name);
118*977Smax.romanov@gmail.com
119*977Smax.romanov@gmail.com if (nxt_java_strcaseeq(name, field_name, name_len)) {
120*977Smax.romanov@gmail.com return f;
121*977Smax.romanov@gmail.com }
122*977Smax.romanov@gmail.com }
123*977Smax.romanov@gmail.com
124*977Smax.romanov@gmail.com return NULL;
125*977Smax.romanov@gmail.com }
126*977Smax.romanov@gmail.com
127*977Smax.romanov@gmail.com
128*977Smax.romanov@gmail.com int
nxt_java_strcaseeq(const char * str1,const char * str2,int len)129*977Smax.romanov@gmail.com nxt_java_strcaseeq(const char *str1, const char *str2, int len)
130*977Smax.romanov@gmail.com {
131*977Smax.romanov@gmail.com char c1, c2;
132*977Smax.romanov@gmail.com const char *end1;
133*977Smax.romanov@gmail.com
134*977Smax.romanov@gmail.com end1 = str1 + len;
135*977Smax.romanov@gmail.com
136*977Smax.romanov@gmail.com while (str1 < end1) {
137*977Smax.romanov@gmail.com c1 = nxt_java_lowcase(*str1++);
138*977Smax.romanov@gmail.com c2 = nxt_java_lowcase(*str2++);
139*977Smax.romanov@gmail.com
140*977Smax.romanov@gmail.com if (c1 != c2) {
141*977Smax.romanov@gmail.com return 0;
142*977Smax.romanov@gmail.com }
143*977Smax.romanov@gmail.com }
144*977Smax.romanov@gmail.com
145*977Smax.romanov@gmail.com return 1;
146*977Smax.romanov@gmail.com }
147*977Smax.romanov@gmail.com
148*977Smax.romanov@gmail.com
149*977Smax.romanov@gmail.com static inline char
nxt_java_lowcase(char c)150*977Smax.romanov@gmail.com nxt_java_lowcase(char c)
151*977Smax.romanov@gmail.com {
152*977Smax.romanov@gmail.com return (c >= 'A' && c <= 'Z') ? c | 0x20 : c;
153*977Smax.romanov@gmail.com }
154*977Smax.romanov@gmail.com
155*977Smax.romanov@gmail.com
156*977Smax.romanov@gmail.com jstring
nxt_java_newString(JNIEnv * env,char * str,uint32_t len)157*977Smax.romanov@gmail.com nxt_java_newString(JNIEnv *env, char *str, uint32_t len)
158*977Smax.romanov@gmail.com {
159*977Smax.romanov@gmail.com char tmp;
160*977Smax.romanov@gmail.com jstring res;
161*977Smax.romanov@gmail.com
162*977Smax.romanov@gmail.com tmp = str[len];
163*977Smax.romanov@gmail.com
164*977Smax.romanov@gmail.com if (tmp != '\0') {
165*977Smax.romanov@gmail.com str[len] = '\0';
166*977Smax.romanov@gmail.com }
167*977Smax.romanov@gmail.com
168*977Smax.romanov@gmail.com res = (*env)->NewStringUTF(env, str);
169*977Smax.romanov@gmail.com
170*977Smax.romanov@gmail.com if (tmp != '\0') {
171*977Smax.romanov@gmail.com str[len] = tmp;
172*977Smax.romanov@gmail.com }
173*977Smax.romanov@gmail.com
174*977Smax.romanov@gmail.com return res;
175*977Smax.romanov@gmail.com }
176