xref: /unit/src/java/nxt_jni.c (revision 977)
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
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
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
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
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 *
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
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
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
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