in src/native/event_stream_rpc_server.c [359:468]
jlong JNICALL Java_software_amazon_awssdk_crt_eventstream_ServerListener_serverListenerNew(
JNIEnv *env,
jclass jni_class,
jobject jni_server_listener,
jbyteArray jni_host_name,
jshort port,
jlong jni_socket_options,
jlong jni_tls_ctx,
jlong jni_server_bootstrap,
jobject jni_server_listener_handler) {
(void)jni_class;
struct aws_server_bootstrap *server_bootstrap = (struct aws_server_bootstrap *)jni_server_bootstrap;
struct aws_socket_options *socket_options = (struct aws_socket_options *)jni_socket_options;
struct aws_tls_ctx *tls_context = (struct aws_tls_ctx *)jni_tls_ctx;
if (!server_bootstrap) {
aws_jni_throw_runtime_exception(env, "ServerListener.server_listener_new: Invalid ServerBootstrap");
return (jlong)NULL;
}
if (!socket_options) {
aws_jni_throw_runtime_exception(env, "ServerListener.server_listener_new: Invalid SocketOptions");
return (jlong)NULL;
}
struct aws_tls_connection_options connection_options;
AWS_ZERO_STRUCT(connection_options);
struct aws_tls_connection_options *conn_options_ptr = NULL;
struct aws_string *host_name_str = NULL;
if (tls_context) {
aws_tls_connection_options_init_from_ctx(&connection_options, tls_context);
conn_options_ptr = &connection_options;
}
struct aws_allocator *allocator = aws_jni_get_allocator();
struct shutdown_callback_data *callback_data = aws_mem_calloc(allocator, 1, sizeof(struct shutdown_callback_data));
if (!callback_data) {
aws_jni_throw_runtime_exception(env, "ServerListener.server_listener_new: Unable to allocate");
goto error;
}
jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
if (jvmresult != 0) {
aws_jni_throw_runtime_exception(env, "ServerListener.server_listener_new: Unable to get JVM");
goto error;
}
callback_data->java_server_listener = (*env)->NewWeakGlobalRef(env, jni_server_listener);
if (!callback_data->java_server_listener) {
aws_jni_throw_runtime_exception(env, "ServerListener.server_listener_new: Unable to create global weak ref");
goto error;
}
callback_data->java_listener_handler = (*env)->NewGlobalRef(env, jni_server_listener_handler);
if (!callback_data->java_listener_handler) {
aws_jni_throw_runtime_exception(env, "ServerListener.server_listener_new: Unable to create global ref");
goto error;
}
const size_t host_name_len = (*env)->GetArrayLength(env, jni_host_name);
jbyte *host_name = (*env)->GetPrimitiveArrayCritical(env, jni_host_name, NULL);
host_name_str = aws_string_new_from_array(allocator, (uint8_t *)host_name, host_name_len);
(*env)->ReleasePrimitiveArrayCritical(env, jni_host_name, host_name, 0);
if (!host_name_str) {
aws_jni_throw_runtime_exception(env, "ServerListener.server_listener_new: Unable to allocate");
goto error;
}
const char *c_str_host_name = aws_string_c_str(host_name_str);
struct aws_event_stream_rpc_server_listener_options listener_options = {
.socket_options = socket_options,
.on_destroy_callback = s_server_listener_shutdown_complete,
.bootstrap = server_bootstrap,
.tls_options = conn_options_ptr,
.port = port,
.host_name = c_str_host_name,
.user_data = callback_data,
.on_new_connection = s_on_new_connection_fn,
.on_connection_shutdown = s_on_connection_shutdown_fn,
};
struct aws_event_stream_rpc_server_listener *listener =
aws_event_stream_rpc_server_new_listener(allocator, &listener_options);
aws_string_destroy(host_name_str);
host_name_str = NULL;
if (!listener) {
aws_jni_throw_runtime_exception(
env, "ServerBootstrap.server_bootstrap_new: Unable to allocate new aws_event_stream_rpc_server_listener");
goto error;
}
return (jlong)listener;
error:
if (host_name_str) {
aws_string_destroy(host_name_str);
}
if (conn_options_ptr) {
aws_tls_connection_options_clean_up(conn_options_ptr);
}
s_shutdown_callback_data_destroy(env, callback_data);
return (jlong)NULL;
}