xref: /unit/src/java/nxt_jni_HeaderNamesEnumeration.c (revision 977:4f9268f27b57)
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 <nxt_unit.h>
9*977Smax.romanov@gmail.com #include <nxt_unit_request.h>
10*977Smax.romanov@gmail.com #include <jni.h>
11*977Smax.romanov@gmail.com #include <stdio.h>
12*977Smax.romanov@gmail.com 
13*977Smax.romanov@gmail.com #include "nxt_jni.h"
14*977Smax.romanov@gmail.com #include "nxt_jni_URLClassLoader.h"
15*977Smax.romanov@gmail.com #include "nxt_jni_HeaderNamesEnumeration.h"
16*977Smax.romanov@gmail.com 
17*977Smax.romanov@gmail.com 
18*977Smax.romanov@gmail.com static jlong JNICALL nxt_java_HeaderNamesEnumeration_nextElementPos(JNIEnv *env,
19*977Smax.romanov@gmail.com     jclass cls, jlong headers_ptr, jlong size, jlong pos);
20*977Smax.romanov@gmail.com static jstring JNICALL nxt_java_HeaderNamesEnumeration_nextElement(JNIEnv *env,
21*977Smax.romanov@gmail.com     jclass cls, jlong headers_ptr, jlong size, jlong pos);
22*977Smax.romanov@gmail.com 
23*977Smax.romanov@gmail.com 
24*977Smax.romanov@gmail.com static jclass     nxt_java_HeaderNamesEnumeration_class;
25*977Smax.romanov@gmail.com static jmethodID  nxt_java_HeaderNamesEnumeration_ctor;
26*977Smax.romanov@gmail.com 
27*977Smax.romanov@gmail.com 
28*977Smax.romanov@gmail.com int
nxt_java_initHeaderNamesEnumeration(JNIEnv * env,jobject cl)29*977Smax.romanov@gmail.com nxt_java_initHeaderNamesEnumeration(JNIEnv *env, jobject cl)
30*977Smax.romanov@gmail.com {
31*977Smax.romanov@gmail.com     int     res;
32*977Smax.romanov@gmail.com     jclass  cls;
33*977Smax.romanov@gmail.com 
34*977Smax.romanov@gmail.com     cls = nxt_java_loadClass(env, cl, "nginx.unit.HeaderNamesEnumeration");
35*977Smax.romanov@gmail.com     if (cls == NULL) {
36*977Smax.romanov@gmail.com         return NXT_UNIT_ERROR;
37*977Smax.romanov@gmail.com     }
38*977Smax.romanov@gmail.com 
39*977Smax.romanov@gmail.com     nxt_java_HeaderNamesEnumeration_class = (*env)->NewGlobalRef(env, cls);
40*977Smax.romanov@gmail.com     (*env)->DeleteLocalRef(env, cls);
41*977Smax.romanov@gmail.com     cls = nxt_java_HeaderNamesEnumeration_class;
42*977Smax.romanov@gmail.com 
43*977Smax.romanov@gmail.com     nxt_java_HeaderNamesEnumeration_ctor = (*env)->GetMethodID(env, cls,
44*977Smax.romanov@gmail.com         "<init>", "(JJ)V");
45*977Smax.romanov@gmail.com     if (nxt_java_HeaderNamesEnumeration_ctor == NULL) {
46*977Smax.romanov@gmail.com         (*env)->DeleteGlobalRef(env, cls);
47*977Smax.romanov@gmail.com         return NXT_UNIT_ERROR;
48*977Smax.romanov@gmail.com     }
49*977Smax.romanov@gmail.com 
50*977Smax.romanov@gmail.com     JNINativeMethod hnenum_methods[] = {
51*977Smax.romanov@gmail.com         { (char *) "nextElementPos",
52*977Smax.romanov@gmail.com           (char *) "(JJJ)J",
53*977Smax.romanov@gmail.com           nxt_java_HeaderNamesEnumeration_nextElementPos },
54*977Smax.romanov@gmail.com 
55*977Smax.romanov@gmail.com         { (char *) "nextElement",
56*977Smax.romanov@gmail.com           (char *) "(JJJ)Ljava/lang/String;",
57*977Smax.romanov@gmail.com           nxt_java_HeaderNamesEnumeration_nextElement },
58*977Smax.romanov@gmail.com     };
59*977Smax.romanov@gmail.com 
60*977Smax.romanov@gmail.com     res = (*env)->RegisterNatives(env, nxt_java_HeaderNamesEnumeration_class,
61*977Smax.romanov@gmail.com                                   hnenum_methods,
62*977Smax.romanov@gmail.com                                   sizeof(hnenum_methods)
63*977Smax.romanov@gmail.com                                       / sizeof(hnenum_methods[0]));
64*977Smax.romanov@gmail.com 
65*977Smax.romanov@gmail.com     nxt_unit_debug(NULL, "registered HeaderNamesEnumeration methods: %d", res);
66*977Smax.romanov@gmail.com 
67*977Smax.romanov@gmail.com     if (res != 0) {
68*977Smax.romanov@gmail.com         (*env)->DeleteGlobalRef(env, cls);
69*977Smax.romanov@gmail.com         return NXT_UNIT_ERROR;
70*977Smax.romanov@gmail.com     }
71*977Smax.romanov@gmail.com 
72*977Smax.romanov@gmail.com     return NXT_UNIT_OK;
73*977Smax.romanov@gmail.com }
74*977Smax.romanov@gmail.com 
75*977Smax.romanov@gmail.com 
76*977Smax.romanov@gmail.com jobject
nxt_java_newHeaderNamesEnumeration(JNIEnv * env,nxt_unit_field_t * f,uint32_t fields_count)77*977Smax.romanov@gmail.com nxt_java_newHeaderNamesEnumeration(JNIEnv *env, nxt_unit_field_t *f,
78*977Smax.romanov@gmail.com     uint32_t fields_count)
79*977Smax.romanov@gmail.com {
80*977Smax.romanov@gmail.com     return (*env)->NewObject(env,
81*977Smax.romanov@gmail.com         nxt_java_HeaderNamesEnumeration_class,
82*977Smax.romanov@gmail.com         nxt_java_HeaderNamesEnumeration_ctor, nxt_ptr2jlong(f),
83*977Smax.romanov@gmail.com         (jlong) fields_count);
84*977Smax.romanov@gmail.com }
85*977Smax.romanov@gmail.com 
86*977Smax.romanov@gmail.com 
87*977Smax.romanov@gmail.com static jlong JNICALL
nxt_java_HeaderNamesEnumeration_nextElementPos(JNIEnv * env,jclass cls,jlong headers_ptr,jlong size,jlong pos)88*977Smax.romanov@gmail.com nxt_java_HeaderNamesEnumeration_nextElementPos(JNIEnv *env, jclass cls,
89*977Smax.romanov@gmail.com     jlong headers_ptr, jlong size, jlong pos)
90*977Smax.romanov@gmail.com {
91*977Smax.romanov@gmail.com     nxt_unit_field_t  *f;
92*977Smax.romanov@gmail.com 
93*977Smax.romanov@gmail.com     f = nxt_jlong2ptr(headers_ptr);
94*977Smax.romanov@gmail.com 
95*977Smax.romanov@gmail.com     if (pos >= size) {
96*977Smax.romanov@gmail.com         return size;
97*977Smax.romanov@gmail.com     }
98*977Smax.romanov@gmail.com 
99*977Smax.romanov@gmail.com     if (pos > 0) {
100*977Smax.romanov@gmail.com         while (pos < size
101*977Smax.romanov@gmail.com                && f[pos].hash == f[pos - 1].hash
102*977Smax.romanov@gmail.com                && f[pos].name_length == f[pos - 1].name_length)
103*977Smax.romanov@gmail.com         {
104*977Smax.romanov@gmail.com             pos++;
105*977Smax.romanov@gmail.com         }
106*977Smax.romanov@gmail.com     }
107*977Smax.romanov@gmail.com 
108*977Smax.romanov@gmail.com     return pos;
109*977Smax.romanov@gmail.com }
110*977Smax.romanov@gmail.com 
111*977Smax.romanov@gmail.com 
112*977Smax.romanov@gmail.com static jstring JNICALL
nxt_java_HeaderNamesEnumeration_nextElement(JNIEnv * env,jclass cls,jlong headers_ptr,jlong size,jlong pos)113*977Smax.romanov@gmail.com nxt_java_HeaderNamesEnumeration_nextElement(JNIEnv *env, jclass cls,
114*977Smax.romanov@gmail.com     jlong headers_ptr, jlong size, jlong pos)
115*977Smax.romanov@gmail.com {
116*977Smax.romanov@gmail.com     char              *name, tmp;
117*977Smax.romanov@gmail.com     jstring           res;
118*977Smax.romanov@gmail.com     nxt_unit_field_t  *f;
119*977Smax.romanov@gmail.com 
120*977Smax.romanov@gmail.com     f = nxt_jlong2ptr(headers_ptr);
121*977Smax.romanov@gmail.com 
122*977Smax.romanov@gmail.com     if (pos > 0) {
123*977Smax.romanov@gmail.com         while (pos < size
124*977Smax.romanov@gmail.com                && f[pos].hash == f[pos - 1].hash
125*977Smax.romanov@gmail.com                && f[pos].name_length == f[pos - 1].name_length)
126*977Smax.romanov@gmail.com         {
127*977Smax.romanov@gmail.com             pos++;
128*977Smax.romanov@gmail.com         }
129*977Smax.romanov@gmail.com     }
130*977Smax.romanov@gmail.com 
131*977Smax.romanov@gmail.com     if (pos >= size) {
132*977Smax.romanov@gmail.com         nxt_java_throw_NoSuchElementException(env, "pos >= size");
133*977Smax.romanov@gmail.com 
134*977Smax.romanov@gmail.com         return NULL;
135*977Smax.romanov@gmail.com     }
136*977Smax.romanov@gmail.com 
137*977Smax.romanov@gmail.com     f += pos;
138*977Smax.romanov@gmail.com 
139*977Smax.romanov@gmail.com     name = nxt_unit_sptr_get(&f->name);
140*977Smax.romanov@gmail.com     tmp = name[f->name_length];
141*977Smax.romanov@gmail.com 
142*977Smax.romanov@gmail.com     if (tmp != '\0') {
143*977Smax.romanov@gmail.com         name[f->name_length] = '\0';
144*977Smax.romanov@gmail.com     }
145*977Smax.romanov@gmail.com 
146*977Smax.romanov@gmail.com     res = (*env)->NewStringUTF(env, name);
147*977Smax.romanov@gmail.com 
148*977Smax.romanov@gmail.com     if (tmp != '\0') {
149*977Smax.romanov@gmail.com         name[f->name_length] = tmp;
150*977Smax.romanov@gmail.com     }
151*977Smax.romanov@gmail.com 
152*977Smax.romanov@gmail.com     return res;
153*977Smax.romanov@gmail.com }
154