in src/native/mqtt_connection.c [372:459]
void JNICALL Java_software_amazon_awssdk_crt_mqtt_MqttClientConnection_mqttClientConnectionConnect(
JNIEnv *env,
jclass jni_class,
jlong jni_connection,
jstring jni_endpoint,
jshort jni_port,
jlong jni_socket_options,
jlong jni_tls_ctx,
jstring jni_client_id,
jboolean jni_clean_session,
jint keep_alive_secs,
jshort ping_timeout_ms,
jint protocol_operation_timeout_ms) {
(void)jni_class;
struct mqtt_jni_connection *connection = (struct mqtt_jni_connection *)jni_connection;
if (!connection) {
aws_jni_throw_runtime_exception(env, "MqttClientConnection.mqtt_connect: Connection is invalid/null");
return;
}
struct aws_byte_cursor client_id;
AWS_ZERO_STRUCT(client_id);
struct aws_byte_cursor endpoint = aws_jni_byte_cursor_from_jstring_acquire(env, jni_endpoint);
uint16_t port = jni_port;
if (!port) {
aws_jni_throw_runtime_exception(
env,
"MqttClientConnection.mqtt_new: Endpoint should be in the format hostname:port and port must be between 1 "
"and 65535");
goto cleanup;
}
struct mqtt_jni_async_callback *connect_callback = mqtt_jni_async_callback_new(connection, NULL);
if (connect_callback == NULL) {
aws_jni_throw_runtime_exception(env, "MqttClientConnection.mqtt_connect: Failed to create async callback");
goto cleanup;
}
s_mqtt_jni_connection_acquire(connection);
struct aws_socket_options default_socket_options;
AWS_ZERO_STRUCT(default_socket_options);
default_socket_options.type = AWS_SOCKET_STREAM;
default_socket_options.connect_timeout_ms = 3000;
struct aws_socket_options *socket_options = &default_socket_options;
if (jni_socket_options) {
socket_options = (struct aws_socket_options *)jni_socket_options;
}
memcpy(&connection->socket_options, socket_options, sizeof(struct aws_socket_options));
/* if a tls_ctx was provided, initialize tls options */
struct aws_tls_ctx *tls_ctx = (struct aws_tls_ctx *)jni_tls_ctx;
struct aws_tls_connection_options *tls_options = NULL;
if (tls_ctx) {
tls_options = &connection->tls_options;
aws_tls_connection_options_init_from_ctx(tls_options, tls_ctx);
aws_tls_connection_options_set_server_name(tls_options, aws_jni_get_allocator(), &endpoint);
}
client_id = aws_jni_byte_cursor_from_jstring_acquire(env, jni_client_id);
bool clean_session = jni_clean_session != 0;
struct aws_mqtt_connection_options connect_options;
AWS_ZERO_STRUCT(connect_options);
connect_options.host_name = endpoint;
connect_options.port = port;
connect_options.socket_options = &connection->socket_options;
connect_options.tls_options = tls_options;
connect_options.client_id = client_id;
connect_options.keep_alive_time_secs = (uint16_t)keep_alive_secs;
connect_options.ping_timeout_ms = ping_timeout_ms;
connect_options.protocol_operation_timeout_ms = protocol_operation_timeout_ms;
connect_options.clean_session = clean_session;
connect_options.on_connection_complete = s_on_connection_complete;
connect_options.user_data = connect_callback;
int result = aws_mqtt_client_connection_connect(connection->client_connection, &connect_options);
if (result != AWS_OP_SUCCESS) {
s_mqtt_jni_connection_release(connection);
mqtt_jni_async_callback_destroy(connect_callback);
aws_jni_throw_runtime_exception(
env, "MqttClientConnection.mqtt_connect: aws_mqtt_client_connection_connect failed");
}
cleanup:
aws_jni_byte_cursor_from_jstring_release(env, jni_endpoint, endpoint);
aws_jni_byte_cursor_from_jstring_release(env, jni_client_id, client_id);
}