/* * Copyright (C) NGINX, Inc. */ #include #include #include #include #include #include "nxt_jni.h" #include "nxt_jni_URLClassLoader.h" #include "nxt_jni_HeaderNamesEnumeration.h" static jlong JNICALL nxt_java_HeaderNamesEnumeration_nextElementPos(JNIEnv *env, jclass cls, jlong headers_ptr, jlong size, jlong pos); static jstring JNICALL nxt_java_HeaderNamesEnumeration_nextElement(JNIEnv *env, jclass cls, jlong headers_ptr, jlong size, jlong pos); static jclass nxt_java_HeaderNamesEnumeration_class; static jmethodID nxt_java_HeaderNamesEnumeration_ctor; int nxt_java_initHeaderNamesEnumeration(JNIEnv *env, jobject cl) { int res; jclass cls; cls = nxt_java_loadClass(env, cl, "nginx.unit.HeaderNamesEnumeration"); if (cls == NULL) { return NXT_UNIT_ERROR; } nxt_java_HeaderNamesEnumeration_class = (*env)->NewGlobalRef(env, cls); (*env)->DeleteLocalRef(env, cls); cls = nxt_java_HeaderNamesEnumeration_class; nxt_java_HeaderNamesEnumeration_ctor = (*env)->GetMethodID(env, cls, "", "(JJ)V"); if (nxt_java_HeaderNamesEnumeration_ctor == NULL) { (*env)->DeleteGlobalRef(env, cls); return NXT_UNIT_ERROR; } JNINativeMethod hnenum_methods[] = { { (char *) "nextElementPos", (char *) "(JJJ)J", nxt_java_HeaderNamesEnumeration_nextElementPos }, { (char *) "nextElement", (char *) "(JJJ)Ljava/lang/String;", nxt_java_HeaderNamesEnumeration_nextElement }, }; res = (*env)->RegisterNatives(env, nxt_java_HeaderNamesEnumeration_class, hnenum_methods, sizeof(hnenum_methods) / sizeof(hnenum_methods[0])); nxt_unit_debug(NULL, "registered HeaderNamesEnumeration methods: %d", res); if (res != 0) { (*env)->DeleteGlobalRef(env, cls); return NXT_UNIT_ERROR; } return NXT_UNIT_OK; } jobject nxt_java_newHeaderNamesEnumeration(JNIEnv *env, nxt_unit_field_t *f, uint32_t fields_count) { return (*env)->NewObject(env, nxt_java_HeaderNamesEnumeration_class, nxt_java_HeaderNamesEnumeration_ctor, nxt_ptr2jlong(f), (jlong) fields_count); } static jlong JNICALL nxt_java_HeaderNamesEnumeration_nextElementPos(JNIEnv *env, jclass cls, jlong headers_ptr, jlong size, jlong pos) { nxt_unit_field_t *f; f = nxt_jlong2ptr(headers_ptr); if (pos >= size) { return size; } if (pos > 0) { while (pos < size && f[pos].hash == f[pos - 1].hash && f[pos].name_length == f[pos - 1].name_length) { pos++; } } return pos; } static jstring JNICALL nxt_java_HeaderNamesEnumeration_nextElement(JNIEnv *env, jclass cls, jlong headers_ptr, jlong size, jlong pos) { char *name, tmp; jstring res; nxt_unit_field_t *f; f = nxt_jlong2ptr(headers_ptr); if (pos > 0) { while (pos < size && f[pos].hash == f[pos - 1].hash && f[pos].name_length == f[pos - 1].name_length) { pos++; } } if (pos >= size) { nxt_java_throw_NoSuchElementException(env, "pos >= size"); return NULL; } f += pos; name = nxt_unit_sptr_get(&f->name); tmp = name[f->name_length]; if (tmp != '\0') { name[f->name_length] = '\0'; } res = (*env)->NewStringUTF(env, name); if (tmp != '\0') { name[f->name_length] = tmp; } return res; }