1*3c7ae9deSAndroid Build Coastguard Worker /**
2*3c7ae9deSAndroid Build Coastguard Worker * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3*3c7ae9deSAndroid Build Coastguard Worker * SPDX-License-Identifier: Apache-2.0.
4*3c7ae9deSAndroid Build Coastguard Worker */
5*3c7ae9deSAndroid Build Coastguard Worker
6*3c7ae9deSAndroid Build Coastguard Worker #include <jni.h>
7*3c7ae9deSAndroid Build Coastguard Worker
8*3c7ae9deSAndroid Build Coastguard Worker #include <crt.h>
9*3c7ae9deSAndroid Build Coastguard Worker #include <java_class_ids.h>
10*3c7ae9deSAndroid Build Coastguard Worker #include <mqtt5_packets.h>
11*3c7ae9deSAndroid Build Coastguard Worker #include <mqtt5_utils.h>
12*3c7ae9deSAndroid Build Coastguard Worker
13*3c7ae9deSAndroid Build Coastguard Worker /* on 32-bit platforms, casting pointers to longs throws a warning we don't need */
14*3c7ae9deSAndroid Build Coastguard Worker #if UINTPTR_MAX == 0xffffffff
15*3c7ae9deSAndroid Build Coastguard Worker # if defined(_MSC_VER)
16*3c7ae9deSAndroid Build Coastguard Worker # pragma warning(push)
17*3c7ae9deSAndroid Build Coastguard Worker # pragma warning(disable : 4305) /* 'type cast': truncation from 'jlong' to 'jni_tls_ctx_options *' */
18*3c7ae9deSAndroid Build Coastguard Worker # else
19*3c7ae9deSAndroid Build Coastguard Worker # pragma GCC diagnostic push
20*3c7ae9deSAndroid Build Coastguard Worker # pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
21*3c7ae9deSAndroid Build Coastguard Worker # pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
22*3c7ae9deSAndroid Build Coastguard Worker # endif
23*3c7ae9deSAndroid Build Coastguard Worker #endif
24*3c7ae9deSAndroid Build Coastguard Worker
s_set_jni_uint32_t_field_in_packet(JNIEnv * env,const uint32_t * native_integer,jobject packet,jfieldID field_id,char * field_name,bool optional)25*3c7ae9deSAndroid Build Coastguard Worker int s_set_jni_uint32_t_field_in_packet(
26*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
27*3c7ae9deSAndroid Build Coastguard Worker const uint32_t *native_integer,
28*3c7ae9deSAndroid Build Coastguard Worker jobject packet,
29*3c7ae9deSAndroid Build Coastguard Worker jfieldID field_id,
30*3c7ae9deSAndroid Build Coastguard Worker char *field_name,
31*3c7ae9deSAndroid Build Coastguard Worker bool optional) {
32*3c7ae9deSAndroid Build Coastguard Worker
33*3c7ae9deSAndroid Build Coastguard Worker if (native_integer != NULL) {
34*3c7ae9deSAndroid Build Coastguard Worker jobject jni_long = (*env)->NewObject(
35*3c7ae9deSAndroid Build Coastguard Worker env, boxed_long_properties.long_class, boxed_long_properties.constructor, (jlong)*native_integer);
36*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
37*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not create uint32 field %s", field_name);
38*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
39*3c7ae9deSAndroid Build Coastguard Worker }
40*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(env, packet, field_id, jni_long);
41*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
42*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not set uint32 field %s", field_name);
43*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
44*3c7ae9deSAndroid Build Coastguard Worker }
45*3c7ae9deSAndroid Build Coastguard Worker if (!optional) {
46*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
47*3c7ae9deSAndroid Build Coastguard Worker }
48*3c7ae9deSAndroid Build Coastguard Worker }
49*3c7ae9deSAndroid Build Coastguard Worker if (optional) {
50*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
51*3c7ae9deSAndroid Build Coastguard Worker } else {
52*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
53*3c7ae9deSAndroid Build Coastguard Worker }
54*3c7ae9deSAndroid Build Coastguard Worker }
55*3c7ae9deSAndroid Build Coastguard Worker
s_set_jni_uint16_t_field_in_packet(JNIEnv * env,const uint16_t * native_integer,jobject packet,jfieldID field_id,char * field_name,bool optional)56*3c7ae9deSAndroid Build Coastguard Worker int s_set_jni_uint16_t_field_in_packet(
57*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
58*3c7ae9deSAndroid Build Coastguard Worker const uint16_t *native_integer,
59*3c7ae9deSAndroid Build Coastguard Worker jobject packet,
60*3c7ae9deSAndroid Build Coastguard Worker jfieldID field_id,
61*3c7ae9deSAndroid Build Coastguard Worker char *field_name,
62*3c7ae9deSAndroid Build Coastguard Worker bool optional) {
63*3c7ae9deSAndroid Build Coastguard Worker if (native_integer != NULL) {
64*3c7ae9deSAndroid Build Coastguard Worker jobject jni_int = (*env)->NewObject(
65*3c7ae9deSAndroid Build Coastguard Worker env,
66*3c7ae9deSAndroid Build Coastguard Worker boxed_integer_properties.integer_class,
67*3c7ae9deSAndroid Build Coastguard Worker boxed_integer_properties.integer_constructor_id,
68*3c7ae9deSAndroid Build Coastguard Worker (jint)*native_integer);
69*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
70*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not create uint16 field %s", field_name);
71*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
72*3c7ae9deSAndroid Build Coastguard Worker }
73*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(env, packet, field_id, jni_int);
74*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
75*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not set uint16 field %s", field_name);
76*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
77*3c7ae9deSAndroid Build Coastguard Worker }
78*3c7ae9deSAndroid Build Coastguard Worker if (!optional) {
79*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
80*3c7ae9deSAndroid Build Coastguard Worker }
81*3c7ae9deSAndroid Build Coastguard Worker }
82*3c7ae9deSAndroid Build Coastguard Worker if (optional) {
83*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
84*3c7ae9deSAndroid Build Coastguard Worker } else {
85*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
86*3c7ae9deSAndroid Build Coastguard Worker }
87*3c7ae9deSAndroid Build Coastguard Worker }
88*3c7ae9deSAndroid Build Coastguard Worker
s_set_jni_bool_field_in_packet(JNIEnv * env,const bool * native_boolean,jobject packet,jfieldID field_id,char * field_name,bool optional)89*3c7ae9deSAndroid Build Coastguard Worker int s_set_jni_bool_field_in_packet(
90*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
91*3c7ae9deSAndroid Build Coastguard Worker const bool *native_boolean,
92*3c7ae9deSAndroid Build Coastguard Worker jobject packet,
93*3c7ae9deSAndroid Build Coastguard Worker jfieldID field_id,
94*3c7ae9deSAndroid Build Coastguard Worker char *field_name,
95*3c7ae9deSAndroid Build Coastguard Worker bool optional) {
96*3c7ae9deSAndroid Build Coastguard Worker if (native_boolean != NULL) {
97*3c7ae9deSAndroid Build Coastguard Worker jobject jni_boolean = (*env)->NewObject(
98*3c7ae9deSAndroid Build Coastguard Worker env,
99*3c7ae9deSAndroid Build Coastguard Worker boxed_boolean_properties.boolean_class,
100*3c7ae9deSAndroid Build Coastguard Worker boxed_boolean_properties.boolean_constructor_id,
101*3c7ae9deSAndroid Build Coastguard Worker (jboolean)*native_boolean);
102*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
103*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not create boolean field %s", field_name);
104*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
105*3c7ae9deSAndroid Build Coastguard Worker }
106*3c7ae9deSAndroid Build Coastguard Worker
107*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(env, packet, field_id, jni_boolean);
108*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
109*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not set boolean field %s", field_name);
110*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
111*3c7ae9deSAndroid Build Coastguard Worker }
112*3c7ae9deSAndroid Build Coastguard Worker
113*3c7ae9deSAndroid Build Coastguard Worker if (!optional) {
114*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
115*3c7ae9deSAndroid Build Coastguard Worker }
116*3c7ae9deSAndroid Build Coastguard Worker }
117*3c7ae9deSAndroid Build Coastguard Worker if (optional) {
118*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
119*3c7ae9deSAndroid Build Coastguard Worker } else {
120*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
121*3c7ae9deSAndroid Build Coastguard Worker }
122*3c7ae9deSAndroid Build Coastguard Worker }
123*3c7ae9deSAndroid Build Coastguard Worker
s_set_jni_string_field_in_packet(JNIEnv * env,const struct aws_byte_cursor * native_cursor,jobject packet,jfieldID field_id,char * field_name,bool optional)124*3c7ae9deSAndroid Build Coastguard Worker int s_set_jni_string_field_in_packet(
125*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
126*3c7ae9deSAndroid Build Coastguard Worker const struct aws_byte_cursor *native_cursor,
127*3c7ae9deSAndroid Build Coastguard Worker jobject packet,
128*3c7ae9deSAndroid Build Coastguard Worker jfieldID field_id,
129*3c7ae9deSAndroid Build Coastguard Worker char *field_name,
130*3c7ae9deSAndroid Build Coastguard Worker bool optional) {
131*3c7ae9deSAndroid Build Coastguard Worker if (native_cursor != NULL) {
132*3c7ae9deSAndroid Build Coastguard Worker jstring jni_string = aws_jni_string_from_cursor(env, native_cursor);
133*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(env, packet, field_id, jni_string);
134*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
135*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not set string field %s", field_name);
136*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
137*3c7ae9deSAndroid Build Coastguard Worker }
138*3c7ae9deSAndroid Build Coastguard Worker if (!optional) {
139*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
140*3c7ae9deSAndroid Build Coastguard Worker }
141*3c7ae9deSAndroid Build Coastguard Worker }
142*3c7ae9deSAndroid Build Coastguard Worker if (optional) {
143*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
144*3c7ae9deSAndroid Build Coastguard Worker } else {
145*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
146*3c7ae9deSAndroid Build Coastguard Worker }
147*3c7ae9deSAndroid Build Coastguard Worker }
148*3c7ae9deSAndroid Build Coastguard Worker
s_set_jni_byte_array_field_in_packet(JNIEnv * env,const struct aws_byte_cursor * native_cursor,jobject packet,jfieldID field_id,char * field_name,bool optional)149*3c7ae9deSAndroid Build Coastguard Worker int s_set_jni_byte_array_field_in_packet(
150*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
151*3c7ae9deSAndroid Build Coastguard Worker const struct aws_byte_cursor *native_cursor,
152*3c7ae9deSAndroid Build Coastguard Worker jobject packet,
153*3c7ae9deSAndroid Build Coastguard Worker jfieldID field_id,
154*3c7ae9deSAndroid Build Coastguard Worker char *field_name,
155*3c7ae9deSAndroid Build Coastguard Worker bool optional) {
156*3c7ae9deSAndroid Build Coastguard Worker if (native_cursor != NULL) {
157*3c7ae9deSAndroid Build Coastguard Worker jbyteArray jni_byte = aws_jni_byte_array_from_cursor(env, native_cursor);
158*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(env, packet, field_id, jni_byte);
159*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
160*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not set string field %s", field_name);
161*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
162*3c7ae9deSAndroid Build Coastguard Worker }
163*3c7ae9deSAndroid Build Coastguard Worker if (!optional) {
164*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
165*3c7ae9deSAndroid Build Coastguard Worker }
166*3c7ae9deSAndroid Build Coastguard Worker }
167*3c7ae9deSAndroid Build Coastguard Worker if (optional) {
168*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
169*3c7ae9deSAndroid Build Coastguard Worker } else {
170*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
171*3c7ae9deSAndroid Build Coastguard Worker }
172*3c7ae9deSAndroid Build Coastguard Worker }
173*3c7ae9deSAndroid Build Coastguard Worker
s_set_user_properties_field(JNIEnv * env,const size_t user_property_count,const struct aws_mqtt5_user_property * packet_properties,jobject packet,jfieldID user_property_field_id)174*3c7ae9deSAndroid Build Coastguard Worker int s_set_user_properties_field(
175*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
176*3c7ae9deSAndroid Build Coastguard Worker const size_t user_property_count,
177*3c7ae9deSAndroid Build Coastguard Worker const struct aws_mqtt5_user_property *packet_properties,
178*3c7ae9deSAndroid Build Coastguard Worker jobject packet,
179*3c7ae9deSAndroid Build Coastguard Worker jfieldID user_property_field_id) {
180*3c7ae9deSAndroid Build Coastguard Worker /* No properties - nothing to do */
181*3c7ae9deSAndroid Build Coastguard Worker if (packet_properties == NULL) {
182*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
183*3c7ae9deSAndroid Build Coastguard Worker }
184*3c7ae9deSAndroid Build Coastguard Worker
185*3c7ae9deSAndroid Build Coastguard Worker if (user_property_count > 0) {
186*3c7ae9deSAndroid Build Coastguard Worker jobject jni_user_properties_list = (*env)->NewObject(
187*3c7ae9deSAndroid Build Coastguard Worker env, boxed_array_list_properties.list_class, boxed_array_list_properties.list_constructor_id);
188*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
189*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not make new user properties list");
190*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
191*3c7ae9deSAndroid Build Coastguard Worker }
192*3c7ae9deSAndroid Build Coastguard Worker
193*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(env, packet, user_property_field_id, jni_user_properties_list);
194*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
195*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not set new user properties list");
196*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
197*3c7ae9deSAndroid Build Coastguard Worker }
198*3c7ae9deSAndroid Build Coastguard Worker
199*3c7ae9deSAndroid Build Coastguard Worker for (size_t i = 0; i < user_property_count; ++i) {
200*3c7ae9deSAndroid Build Coastguard Worker const struct aws_mqtt5_user_property *property = &packet_properties[i];
201*3c7ae9deSAndroid Build Coastguard Worker jstring jni_new_property_name = aws_jni_string_from_cursor(env, &property->name);
202*3c7ae9deSAndroid Build Coastguard Worker jstring jni_new_property_value = aws_jni_string_from_cursor(env, &property->value);
203*3c7ae9deSAndroid Build Coastguard Worker
204*3c7ae9deSAndroid Build Coastguard Worker jobject jni_new_property = (*env)->NewObject(
205*3c7ae9deSAndroid Build Coastguard Worker env,
206*3c7ae9deSAndroid Build Coastguard Worker mqtt5_user_property_properties.user_property_class,
207*3c7ae9deSAndroid Build Coastguard Worker mqtt5_user_property_properties.property_constructor_id,
208*3c7ae9deSAndroid Build Coastguard Worker jni_new_property_name,
209*3c7ae9deSAndroid Build Coastguard Worker jni_new_property_value);
210*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
211*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not make new user property");
212*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
213*3c7ae9deSAndroid Build Coastguard Worker }
214*3c7ae9deSAndroid Build Coastguard Worker
215*3c7ae9deSAndroid Build Coastguard Worker jboolean jni_add_result = (*env)->CallBooleanMethod(
216*3c7ae9deSAndroid Build Coastguard Worker env, jni_user_properties_list, boxed_list_properties.list_add_id, jni_new_property);
217*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
218*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Could not add new user property");
219*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
220*3c7ae9deSAndroid Build Coastguard Worker }
221*3c7ae9deSAndroid Build Coastguard Worker
222*3c7ae9deSAndroid Build Coastguard Worker if ((bool)jni_add_result == false) {
223*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
224*3c7ae9deSAndroid Build Coastguard Worker }
225*3c7ae9deSAndroid Build Coastguard Worker }
226*3c7ae9deSAndroid Build Coastguard Worker }
227*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
228*3c7ae9deSAndroid Build Coastguard Worker }
229*3c7ae9deSAndroid Build Coastguard Worker
s_set_int_enum_in_packet(JNIEnv * env,const int * int_enum,jobject packet,jmethodID set_enum_field_id,bool optional)230*3c7ae9deSAndroid Build Coastguard Worker int s_set_int_enum_in_packet(
231*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
232*3c7ae9deSAndroid Build Coastguard Worker const int *int_enum,
233*3c7ae9deSAndroid Build Coastguard Worker jobject packet,
234*3c7ae9deSAndroid Build Coastguard Worker jmethodID set_enum_field_id,
235*3c7ae9deSAndroid Build Coastguard Worker bool optional) {
236*3c7ae9deSAndroid Build Coastguard Worker
237*3c7ae9deSAndroid Build Coastguard Worker if (int_enum) {
238*3c7ae9deSAndroid Build Coastguard Worker if (*int_enum < 0) {
239*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
240*3c7ae9deSAndroid Build Coastguard Worker }
241*3c7ae9deSAndroid Build Coastguard Worker (*env)->CallVoidMethod(env, packet, set_enum_field_id, (jint)*int_enum);
242*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
243*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
244*3c7ae9deSAndroid Build Coastguard Worker }
245*3c7ae9deSAndroid Build Coastguard Worker
246*3c7ae9deSAndroid Build Coastguard Worker if (!optional) {
247*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
248*3c7ae9deSAndroid Build Coastguard Worker }
249*3c7ae9deSAndroid Build Coastguard Worker }
250*3c7ae9deSAndroid Build Coastguard Worker
251*3c7ae9deSAndroid Build Coastguard Worker if (optional) {
252*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_SUCCESS;
253*3c7ae9deSAndroid Build Coastguard Worker } else {
254*3c7ae9deSAndroid Build Coastguard Worker return AWS_OP_ERR;
255*3c7ae9deSAndroid Build Coastguard Worker }
256*3c7ae9deSAndroid Build Coastguard Worker }
257*3c7ae9deSAndroid Build Coastguard Worker
s_aws_mqtt5_client_create_jni_connack_packet_from_native(JNIEnv * env,const struct aws_mqtt5_packet_connack_view * native_connack_data)258*3c7ae9deSAndroid Build Coastguard Worker jobject s_aws_mqtt5_client_create_jni_connack_packet_from_native(
259*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
260*3c7ae9deSAndroid Build Coastguard Worker const struct aws_mqtt5_packet_connack_view *native_connack_data) {
261*3c7ae9deSAndroid Build Coastguard Worker
262*3c7ae9deSAndroid Build Coastguard Worker jobject connack_data = (*env)->NewObject(
263*3c7ae9deSAndroid Build Coastguard Worker env,
264*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_packet_class,
265*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_constructor_id);
266*3c7ae9deSAndroid Build Coastguard Worker
267*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetBooleanField(
268*3c7ae9deSAndroid Build Coastguard Worker env,
269*3c7ae9deSAndroid Build Coastguard Worker connack_data,
270*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_session_present_field_id,
271*3c7ae9deSAndroid Build Coastguard Worker (jboolean)native_connack_data->session_present);
272*3c7ae9deSAndroid Build Coastguard Worker
273*3c7ae9deSAndroid Build Coastguard Worker int reason_code_int = (int)native_connack_data->reason_code;
274*3c7ae9deSAndroid Build Coastguard Worker if (reason_code_int < 0) {
275*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Error when creating ConnAckPacket from native: Reason code is negative!");
276*3c7ae9deSAndroid Build Coastguard Worker return NULL;
277*3c7ae9deSAndroid Build Coastguard Worker }
278*3c7ae9deSAndroid Build Coastguard Worker (*env)->CallVoidMethod(
279*3c7ae9deSAndroid Build Coastguard Worker env, connack_data, mqtt5_connack_packet_properties.connack_native_add_reason_code_id, (jint)reason_code_int);
280*3c7ae9deSAndroid Build Coastguard Worker
281*3c7ae9deSAndroid Build Coastguard Worker /* Set all of the optional data in Java classes */
282*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_uint32_t_field_in_packet(
283*3c7ae9deSAndroid Build Coastguard Worker env,
284*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->session_expiry_interval,
285*3c7ae9deSAndroid Build Coastguard Worker connack_data,
286*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_session_expiry_interval_field_id,
287*3c7ae9deSAndroid Build Coastguard Worker "session expiry interval",
288*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
289*3c7ae9deSAndroid Build Coastguard Worker return NULL;
290*3c7ae9deSAndroid Build Coastguard Worker }
291*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_uint16_t_field_in_packet(
292*3c7ae9deSAndroid Build Coastguard Worker env,
293*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->receive_maximum,
294*3c7ae9deSAndroid Build Coastguard Worker connack_data,
295*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_receive_maximum_field_id,
296*3c7ae9deSAndroid Build Coastguard Worker "receive maximum",
297*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
298*3c7ae9deSAndroid Build Coastguard Worker return NULL;
299*3c7ae9deSAndroid Build Coastguard Worker };
300*3c7ae9deSAndroid Build Coastguard Worker
301*3c7ae9deSAndroid Build Coastguard Worker if (native_connack_data->maximum_qos) {
302*3c7ae9deSAndroid Build Coastguard Worker int *maximum_qos_int = (int *)native_connack_data->maximum_qos;
303*3c7ae9deSAndroid Build Coastguard Worker if (s_set_int_enum_in_packet(
304*3c7ae9deSAndroid Build Coastguard Worker env,
305*3c7ae9deSAndroid Build Coastguard Worker maximum_qos_int,
306*3c7ae9deSAndroid Build Coastguard Worker connack_data,
307*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_native_add_maximum_qos_id,
308*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
309*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(
310*3c7ae9deSAndroid Build Coastguard Worker AWS_LS_MQTT5_CLIENT, "Error when creating ConnAckPacket from native: Could not set maximum QOS");
311*3c7ae9deSAndroid Build Coastguard Worker return NULL;
312*3c7ae9deSAndroid Build Coastguard Worker }
313*3c7ae9deSAndroid Build Coastguard Worker }
314*3c7ae9deSAndroid Build Coastguard Worker
315*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_bool_field_in_packet(
316*3c7ae9deSAndroid Build Coastguard Worker env,
317*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->retain_available,
318*3c7ae9deSAndroid Build Coastguard Worker connack_data,
319*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_retain_available_field_id,
320*3c7ae9deSAndroid Build Coastguard Worker "retain available",
321*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
322*3c7ae9deSAndroid Build Coastguard Worker return NULL;
323*3c7ae9deSAndroid Build Coastguard Worker }
324*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_uint32_t_field_in_packet(
325*3c7ae9deSAndroid Build Coastguard Worker env,
326*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->maximum_packet_size,
327*3c7ae9deSAndroid Build Coastguard Worker connack_data,
328*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_maximum_packet_size_field_id,
329*3c7ae9deSAndroid Build Coastguard Worker "maximum packet size",
330*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
331*3c7ae9deSAndroid Build Coastguard Worker return NULL;
332*3c7ae9deSAndroid Build Coastguard Worker }
333*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_string_field_in_packet(
334*3c7ae9deSAndroid Build Coastguard Worker env,
335*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->assigned_client_identifier,
336*3c7ae9deSAndroid Build Coastguard Worker connack_data,
337*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_assigned_client_identifier_field_id,
338*3c7ae9deSAndroid Build Coastguard Worker "assigned client identifier",
339*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
340*3c7ae9deSAndroid Build Coastguard Worker return NULL;
341*3c7ae9deSAndroid Build Coastguard Worker }
342*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_uint16_t_field_in_packet(
343*3c7ae9deSAndroid Build Coastguard Worker env,
344*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->topic_alias_maximum,
345*3c7ae9deSAndroid Build Coastguard Worker connack_data,
346*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_topic_alias_maximum_field_id,
347*3c7ae9deSAndroid Build Coastguard Worker "topic alias maximum",
348*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
349*3c7ae9deSAndroid Build Coastguard Worker return NULL;
350*3c7ae9deSAndroid Build Coastguard Worker };
351*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_string_field_in_packet(
352*3c7ae9deSAndroid Build Coastguard Worker env,
353*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->reason_string,
354*3c7ae9deSAndroid Build Coastguard Worker connack_data,
355*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_reason_string_field_id,
356*3c7ae9deSAndroid Build Coastguard Worker "reason string",
357*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
358*3c7ae9deSAndroid Build Coastguard Worker return NULL;
359*3c7ae9deSAndroid Build Coastguard Worker }
360*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_bool_field_in_packet(
361*3c7ae9deSAndroid Build Coastguard Worker env,
362*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->wildcard_subscriptions_available,
363*3c7ae9deSAndroid Build Coastguard Worker connack_data,
364*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_wildcard_subscriptions_available_field_id,
365*3c7ae9deSAndroid Build Coastguard Worker "wildcard subscriptions available",
366*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
367*3c7ae9deSAndroid Build Coastguard Worker return NULL;
368*3c7ae9deSAndroid Build Coastguard Worker };
369*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_bool_field_in_packet(
370*3c7ae9deSAndroid Build Coastguard Worker env,
371*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->subscription_identifiers_available,
372*3c7ae9deSAndroid Build Coastguard Worker connack_data,
373*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_subscription_identifiers_available_field_id,
374*3c7ae9deSAndroid Build Coastguard Worker "subscription identifiers available",
375*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
376*3c7ae9deSAndroid Build Coastguard Worker return NULL;
377*3c7ae9deSAndroid Build Coastguard Worker };
378*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_bool_field_in_packet(
379*3c7ae9deSAndroid Build Coastguard Worker env,
380*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->shared_subscriptions_available,
381*3c7ae9deSAndroid Build Coastguard Worker connack_data,
382*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_shared_subscriptions_available_field_id,
383*3c7ae9deSAndroid Build Coastguard Worker "shared subscriptions available",
384*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
385*3c7ae9deSAndroid Build Coastguard Worker return NULL;
386*3c7ae9deSAndroid Build Coastguard Worker };
387*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_uint16_t_field_in_packet(
388*3c7ae9deSAndroid Build Coastguard Worker env,
389*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->server_keep_alive,
390*3c7ae9deSAndroid Build Coastguard Worker connack_data,
391*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_server_keep_alive_field_id,
392*3c7ae9deSAndroid Build Coastguard Worker "server keep alive",
393*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
394*3c7ae9deSAndroid Build Coastguard Worker return NULL;
395*3c7ae9deSAndroid Build Coastguard Worker };
396*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_string_field_in_packet(
397*3c7ae9deSAndroid Build Coastguard Worker env,
398*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->response_information,
399*3c7ae9deSAndroid Build Coastguard Worker connack_data,
400*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_response_information_field_id,
401*3c7ae9deSAndroid Build Coastguard Worker "response information",
402*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
403*3c7ae9deSAndroid Build Coastguard Worker return NULL;
404*3c7ae9deSAndroid Build Coastguard Worker }
405*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_string_field_in_packet(
406*3c7ae9deSAndroid Build Coastguard Worker env,
407*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->server_reference,
408*3c7ae9deSAndroid Build Coastguard Worker connack_data,
409*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_server_reference_field_id,
410*3c7ae9deSAndroid Build Coastguard Worker "server reference",
411*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
412*3c7ae9deSAndroid Build Coastguard Worker return NULL;
413*3c7ae9deSAndroid Build Coastguard Worker }
414*3c7ae9deSAndroid Build Coastguard Worker
415*3c7ae9deSAndroid Build Coastguard Worker if (s_set_user_properties_field(
416*3c7ae9deSAndroid Build Coastguard Worker env,
417*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->user_property_count,
418*3c7ae9deSAndroid Build Coastguard Worker native_connack_data->user_properties,
419*3c7ae9deSAndroid Build Coastguard Worker connack_data,
420*3c7ae9deSAndroid Build Coastguard Worker mqtt5_connack_packet_properties.connack_user_properties_field_id) != AWS_OP_SUCCESS) {
421*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(
422*3c7ae9deSAndroid Build Coastguard Worker AWS_LS_MQTT5_CLIENT, "Error when creating ConnAckPacket from native: could not add user property!");
423*3c7ae9deSAndroid Build Coastguard Worker return NULL;
424*3c7ae9deSAndroid Build Coastguard Worker }
425*3c7ae9deSAndroid Build Coastguard Worker
426*3c7ae9deSAndroid Build Coastguard Worker return connack_data;
427*3c7ae9deSAndroid Build Coastguard Worker }
428*3c7ae9deSAndroid Build Coastguard Worker
s_aws_mqtt5_client_create_jni_disconnect_packet_from_native(JNIEnv * env,const struct aws_mqtt5_packet_disconnect_view * native_disconnect_data)429*3c7ae9deSAndroid Build Coastguard Worker jobject s_aws_mqtt5_client_create_jni_disconnect_packet_from_native(
430*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
431*3c7ae9deSAndroid Build Coastguard Worker const struct aws_mqtt5_packet_disconnect_view *native_disconnect_data) {
432*3c7ae9deSAndroid Build Coastguard Worker
433*3c7ae9deSAndroid Build Coastguard Worker jobject disconnect_packet_data = (*env)->NewObject(
434*3c7ae9deSAndroid Build Coastguard Worker env,
435*3c7ae9deSAndroid Build Coastguard Worker mqtt5_disconnect_packet_properties.disconnect_packet_class,
436*3c7ae9deSAndroid Build Coastguard Worker mqtt5_disconnect_packet_properties.disconnect_constructor_id);
437*3c7ae9deSAndroid Build Coastguard Worker
438*3c7ae9deSAndroid Build Coastguard Worker int reason_code_int = (int)native_disconnect_data->reason_code;
439*3c7ae9deSAndroid Build Coastguard Worker if (s_set_int_enum_in_packet(
440*3c7ae9deSAndroid Build Coastguard Worker env,
441*3c7ae9deSAndroid Build Coastguard Worker &reason_code_int,
442*3c7ae9deSAndroid Build Coastguard Worker disconnect_packet_data,
443*3c7ae9deSAndroid Build Coastguard Worker mqtt5_disconnect_packet_properties.disconnect_native_add_disconnect_reason_code_id,
444*3c7ae9deSAndroid Build Coastguard Worker false) != AWS_OP_SUCCESS) {
445*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(
446*3c7ae9deSAndroid Build Coastguard Worker AWS_LS_MQTT5_CLIENT, "Error when creating DisconnectPacket from native: Could not set reason code");
447*3c7ae9deSAndroid Build Coastguard Worker return NULL;
448*3c7ae9deSAndroid Build Coastguard Worker }
449*3c7ae9deSAndroid Build Coastguard Worker
450*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_uint32_t_field_in_packet(
451*3c7ae9deSAndroid Build Coastguard Worker env,
452*3c7ae9deSAndroid Build Coastguard Worker native_disconnect_data->session_expiry_interval_seconds,
453*3c7ae9deSAndroid Build Coastguard Worker disconnect_packet_data,
454*3c7ae9deSAndroid Build Coastguard Worker mqtt5_disconnect_packet_properties.disconnect_session_expiry_interval_seconds_field_id,
455*3c7ae9deSAndroid Build Coastguard Worker "session expiry interval seconds",
456*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
457*3c7ae9deSAndroid Build Coastguard Worker return NULL;
458*3c7ae9deSAndroid Build Coastguard Worker }
459*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_string_field_in_packet(
460*3c7ae9deSAndroid Build Coastguard Worker env,
461*3c7ae9deSAndroid Build Coastguard Worker native_disconnect_data->reason_string,
462*3c7ae9deSAndroid Build Coastguard Worker disconnect_packet_data,
463*3c7ae9deSAndroid Build Coastguard Worker mqtt5_disconnect_packet_properties.disconnect_reason_string_field_id,
464*3c7ae9deSAndroid Build Coastguard Worker "reason string",
465*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
466*3c7ae9deSAndroid Build Coastguard Worker return NULL;
467*3c7ae9deSAndroid Build Coastguard Worker }
468*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_string_field_in_packet(
469*3c7ae9deSAndroid Build Coastguard Worker env,
470*3c7ae9deSAndroid Build Coastguard Worker native_disconnect_data->server_reference,
471*3c7ae9deSAndroid Build Coastguard Worker disconnect_packet_data,
472*3c7ae9deSAndroid Build Coastguard Worker mqtt5_disconnect_packet_properties.disconnect_session_server_reference_field_id,
473*3c7ae9deSAndroid Build Coastguard Worker "server reference",
474*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
475*3c7ae9deSAndroid Build Coastguard Worker return NULL;
476*3c7ae9deSAndroid Build Coastguard Worker }
477*3c7ae9deSAndroid Build Coastguard Worker
478*3c7ae9deSAndroid Build Coastguard Worker if (s_set_user_properties_field(
479*3c7ae9deSAndroid Build Coastguard Worker env,
480*3c7ae9deSAndroid Build Coastguard Worker native_disconnect_data->user_property_count,
481*3c7ae9deSAndroid Build Coastguard Worker native_disconnect_data->user_properties,
482*3c7ae9deSAndroid Build Coastguard Worker disconnect_packet_data,
483*3c7ae9deSAndroid Build Coastguard Worker mqtt5_disconnect_packet_properties.disconnect_user_properties_field_id) != AWS_OP_SUCCESS) {
484*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(
485*3c7ae9deSAndroid Build Coastguard Worker AWS_LS_MQTT5_CLIENT, "Error when creating DisconnectPacket from native: could not add user property!");
486*3c7ae9deSAndroid Build Coastguard Worker return NULL;
487*3c7ae9deSAndroid Build Coastguard Worker }
488*3c7ae9deSAndroid Build Coastguard Worker
489*3c7ae9deSAndroid Build Coastguard Worker return disconnect_packet_data;
490*3c7ae9deSAndroid Build Coastguard Worker }
491*3c7ae9deSAndroid Build Coastguard Worker
s_aws_mqtt5_client_create_jni_negotiated_settings_from_native(JNIEnv * env,const struct aws_mqtt5_negotiated_settings * native_negotiated_settings_data)492*3c7ae9deSAndroid Build Coastguard Worker jobject s_aws_mqtt5_client_create_jni_negotiated_settings_from_native(
493*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
494*3c7ae9deSAndroid Build Coastguard Worker const struct aws_mqtt5_negotiated_settings *native_negotiated_settings_data) {
495*3c7ae9deSAndroid Build Coastguard Worker
496*3c7ae9deSAndroid Build Coastguard Worker jobject negotiated_settings_data = (*env)->NewObject(
497*3c7ae9deSAndroid Build Coastguard Worker env,
498*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_class,
499*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_constructor_id);
500*3c7ae9deSAndroid Build Coastguard Worker
501*3c7ae9deSAndroid Build Coastguard Worker (*env)->CallVoidMethod(
502*3c7ae9deSAndroid Build Coastguard Worker env,
503*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
504*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_native_set_qos_id,
505*3c7ae9deSAndroid Build Coastguard Worker (jint)native_negotiated_settings_data->maximum_qos);
506*3c7ae9deSAndroid Build Coastguard Worker aws_jni_check_and_clear_exception(env); /* To hide JNI warning */
507*3c7ae9deSAndroid Build Coastguard Worker
508*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetLongField(
509*3c7ae9deSAndroid Build Coastguard Worker env,
510*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
511*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_session_expiry_interval_field_id,
512*3c7ae9deSAndroid Build Coastguard Worker (jlong)native_negotiated_settings_data->session_expiry_interval);
513*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetIntField(
514*3c7ae9deSAndroid Build Coastguard Worker env,
515*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
516*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_receive_maximum_from_server_field_id,
517*3c7ae9deSAndroid Build Coastguard Worker (jint)native_negotiated_settings_data->receive_maximum_from_server);
518*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetLongField(
519*3c7ae9deSAndroid Build Coastguard Worker env,
520*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
521*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_maximum_packet_size_to_server_field_id,
522*3c7ae9deSAndroid Build Coastguard Worker (jlong)native_negotiated_settings_data->maximum_packet_size_to_server);
523*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetIntField(
524*3c7ae9deSAndroid Build Coastguard Worker env,
525*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
526*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_topic_alias_maximum_to_server_field_id,
527*3c7ae9deSAndroid Build Coastguard Worker (jint)native_negotiated_settings_data->topic_alias_maximum_to_server);
528*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetIntField(
529*3c7ae9deSAndroid Build Coastguard Worker env,
530*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
531*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_topic_alias_maximum_to_client_field_id,
532*3c7ae9deSAndroid Build Coastguard Worker (jint)native_negotiated_settings_data->topic_alias_maximum_to_client);
533*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetIntField(
534*3c7ae9deSAndroid Build Coastguard Worker env,
535*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
536*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_server_keep_alive_field_id,
537*3c7ae9deSAndroid Build Coastguard Worker (jint)native_negotiated_settings_data->server_keep_alive);
538*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetBooleanField(
539*3c7ae9deSAndroid Build Coastguard Worker env,
540*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
541*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_retain_available_field_id,
542*3c7ae9deSAndroid Build Coastguard Worker (jboolean)native_negotiated_settings_data->retain_available);
543*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetBooleanField(
544*3c7ae9deSAndroid Build Coastguard Worker env,
545*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
546*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_wildcard_subscriptions_available_field_id,
547*3c7ae9deSAndroid Build Coastguard Worker (jboolean)native_negotiated_settings_data->wildcard_subscriptions_available);
548*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetBooleanField(
549*3c7ae9deSAndroid Build Coastguard Worker env,
550*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
551*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_subscription_identifiers_available_field_id,
552*3c7ae9deSAndroid Build Coastguard Worker (jboolean)native_negotiated_settings_data->subscription_identifiers_available);
553*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetBooleanField(
554*3c7ae9deSAndroid Build Coastguard Worker env,
555*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
556*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_shared_subscriptions_available_field_id,
557*3c7ae9deSAndroid Build Coastguard Worker (jboolean)native_negotiated_settings_data->shared_subscriptions_available);
558*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetBooleanField(
559*3c7ae9deSAndroid Build Coastguard Worker env,
560*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
561*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_rejoined_session_field_id,
562*3c7ae9deSAndroid Build Coastguard Worker (jboolean)native_negotiated_settings_data->rejoined_session);
563*3c7ae9deSAndroid Build Coastguard Worker
564*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_cursor client_id_storage_cursor =
565*3c7ae9deSAndroid Build Coastguard Worker aws_byte_cursor_from_buf(&native_negotiated_settings_data->client_id_storage);
566*3c7ae9deSAndroid Build Coastguard Worker jstring jni_assigned_client_id = aws_jni_string_from_cursor(env, &client_id_storage_cursor);
567*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(
568*3c7ae9deSAndroid Build Coastguard Worker env,
569*3c7ae9deSAndroid Build Coastguard Worker negotiated_settings_data,
570*3c7ae9deSAndroid Build Coastguard Worker mqtt5_negotiated_settings_properties.negotiated_settings_assigned_client_id_field_id,
571*3c7ae9deSAndroid Build Coastguard Worker jni_assigned_client_id);
572*3c7ae9deSAndroid Build Coastguard Worker
573*3c7ae9deSAndroid Build Coastguard Worker return negotiated_settings_data;
574*3c7ae9deSAndroid Build Coastguard Worker }
575*3c7ae9deSAndroid Build Coastguard Worker
s_aws_mqtt5_client_create_jni_publish_packet_from_native(JNIEnv * env,const struct aws_mqtt5_packet_publish_view * publish)576*3c7ae9deSAndroid Build Coastguard Worker jobject s_aws_mqtt5_client_create_jni_publish_packet_from_native(
577*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
578*3c7ae9deSAndroid Build Coastguard Worker const struct aws_mqtt5_packet_publish_view *publish) {
579*3c7ae9deSAndroid Build Coastguard Worker jobject publish_packet_data = (*env)->NewObject(
580*3c7ae9deSAndroid Build Coastguard Worker env,
581*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_packet_class,
582*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_constructor_id);
583*3c7ae9deSAndroid Build Coastguard Worker
584*3c7ae9deSAndroid Build Coastguard Worker jbyteArray jni_payload = aws_jni_byte_array_from_cursor(env, &publish->payload);
585*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(
586*3c7ae9deSAndroid Build Coastguard Worker env, publish_packet_data, mqtt5_publish_packet_properties.publish_payload_field_id, jni_payload);
587*3c7ae9deSAndroid Build Coastguard Worker
588*3c7ae9deSAndroid Build Coastguard Worker int publish_qos_int = (int)publish->qos;
589*3c7ae9deSAndroid Build Coastguard Worker if (s_set_int_enum_in_packet(
590*3c7ae9deSAndroid Build Coastguard Worker env,
591*3c7ae9deSAndroid Build Coastguard Worker &publish_qos_int,
592*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
593*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_native_set_qos_id,
594*3c7ae9deSAndroid Build Coastguard Worker false) != AWS_OP_SUCCESS) {
595*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Error when creating PublishPacket from native: Could not set QOS");
596*3c7ae9deSAndroid Build Coastguard Worker return NULL;
597*3c7ae9deSAndroid Build Coastguard Worker }
598*3c7ae9deSAndroid Build Coastguard Worker
599*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_bool_field_in_packet(
600*3c7ae9deSAndroid Build Coastguard Worker env,
601*3c7ae9deSAndroid Build Coastguard Worker &publish->retain,
602*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
603*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_retain_field_id,
604*3c7ae9deSAndroid Build Coastguard Worker "retain",
605*3c7ae9deSAndroid Build Coastguard Worker false) != AWS_OP_SUCCESS) {
606*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Error when creating PublishPacket from native: Could not set retain");
607*3c7ae9deSAndroid Build Coastguard Worker return NULL;
608*3c7ae9deSAndroid Build Coastguard Worker }
609*3c7ae9deSAndroid Build Coastguard Worker
610*3c7ae9deSAndroid Build Coastguard Worker jstring jni_topic = aws_jni_string_from_cursor(env, &publish->topic);
611*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(env, publish_packet_data, mqtt5_publish_packet_properties.publish_topic_field_id, jni_topic);
612*3c7ae9deSAndroid Build Coastguard Worker
613*3c7ae9deSAndroid Build Coastguard Worker if (publish->payload_format) {
614*3c7ae9deSAndroid Build Coastguard Worker if (s_set_int_enum_in_packet(
615*3c7ae9deSAndroid Build Coastguard Worker env,
616*3c7ae9deSAndroid Build Coastguard Worker (int *)publish->payload_format,
617*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
618*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_native_set_payload_format_indicator_id,
619*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
620*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(
621*3c7ae9deSAndroid Build Coastguard Worker AWS_LS_MQTT5_CLIENT, "Error when creating PublishPacket from native: Could not set payload format");
622*3c7ae9deSAndroid Build Coastguard Worker return NULL;
623*3c7ae9deSAndroid Build Coastguard Worker }
624*3c7ae9deSAndroid Build Coastguard Worker }
625*3c7ae9deSAndroid Build Coastguard Worker
626*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_uint32_t_field_in_packet(
627*3c7ae9deSAndroid Build Coastguard Worker env,
628*3c7ae9deSAndroid Build Coastguard Worker publish->message_expiry_interval_seconds,
629*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
630*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_message_expiry_interval_seconds_field_id,
631*3c7ae9deSAndroid Build Coastguard Worker "message expiry interval seconds",
632*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
633*3c7ae9deSAndroid Build Coastguard Worker return NULL;
634*3c7ae9deSAndroid Build Coastguard Worker }
635*3c7ae9deSAndroid Build Coastguard Worker
636*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_uint16_t_field_in_packet(
637*3c7ae9deSAndroid Build Coastguard Worker env,
638*3c7ae9deSAndroid Build Coastguard Worker publish->topic_alias,
639*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
640*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_topic_alias_field_id,
641*3c7ae9deSAndroid Build Coastguard Worker "topic alias",
642*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
643*3c7ae9deSAndroid Build Coastguard Worker return NULL;
644*3c7ae9deSAndroid Build Coastguard Worker }
645*3c7ae9deSAndroid Build Coastguard Worker
646*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_string_field_in_packet(
647*3c7ae9deSAndroid Build Coastguard Worker env,
648*3c7ae9deSAndroid Build Coastguard Worker publish->response_topic,
649*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
650*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_response_topic_field_id,
651*3c7ae9deSAndroid Build Coastguard Worker "response topic",
652*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
653*3c7ae9deSAndroid Build Coastguard Worker return NULL;
654*3c7ae9deSAndroid Build Coastguard Worker }
655*3c7ae9deSAndroid Build Coastguard Worker
656*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_byte_array_field_in_packet(
657*3c7ae9deSAndroid Build Coastguard Worker env,
658*3c7ae9deSAndroid Build Coastguard Worker publish->correlation_data,
659*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
660*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_correlation_data_field_id,
661*3c7ae9deSAndroid Build Coastguard Worker "correlation data",
662*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
663*3c7ae9deSAndroid Build Coastguard Worker return NULL;
664*3c7ae9deSAndroid Build Coastguard Worker }
665*3c7ae9deSAndroid Build Coastguard Worker
666*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_string_field_in_packet(
667*3c7ae9deSAndroid Build Coastguard Worker env,
668*3c7ae9deSAndroid Build Coastguard Worker publish->content_type,
669*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
670*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_content_type_field_id,
671*3c7ae9deSAndroid Build Coastguard Worker "content type",
672*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
673*3c7ae9deSAndroid Build Coastguard Worker return NULL;
674*3c7ae9deSAndroid Build Coastguard Worker }
675*3c7ae9deSAndroid Build Coastguard Worker
676*3c7ae9deSAndroid Build Coastguard Worker if (publish->subscription_identifier_count && publish->subscription_identifiers) {
677*3c7ae9deSAndroid Build Coastguard Worker jobject jni_subscription_identifiers = (*env)->NewObject(
678*3c7ae9deSAndroid Build Coastguard Worker env, boxed_array_list_properties.list_class, boxed_array_list_properties.list_constructor_id);
679*3c7ae9deSAndroid Build Coastguard Worker (*env)->SetObjectField(
680*3c7ae9deSAndroid Build Coastguard Worker env,
681*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
682*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_subscription_identifiers_field_id,
683*3c7ae9deSAndroid Build Coastguard Worker jni_subscription_identifiers);
684*3c7ae9deSAndroid Build Coastguard Worker
685*3c7ae9deSAndroid Build Coastguard Worker for (size_t i = 0; i < publish->subscription_identifier_count; ++i) {
686*3c7ae9deSAndroid Build Coastguard Worker const uint32_t *identifier = &publish->subscription_identifiers[i];
687*3c7ae9deSAndroid Build Coastguard Worker jobject jni_identifier_obj = (*env)->NewObject(
688*3c7ae9deSAndroid Build Coastguard Worker env, boxed_long_properties.long_class, boxed_long_properties.constructor, (jlong)*identifier);
689*3c7ae9deSAndroid Build Coastguard Worker jboolean jni_add_result = (*env)->CallBooleanMethod(
690*3c7ae9deSAndroid Build Coastguard Worker env, jni_subscription_identifiers, boxed_list_properties.list_add_id, jni_identifier_obj);
691*3c7ae9deSAndroid Build Coastguard Worker if (aws_jni_check_and_clear_exception(env)) {
692*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(
693*3c7ae9deSAndroid Build Coastguard Worker AWS_LS_MQTT5_CLIENT,
694*3c7ae9deSAndroid Build Coastguard Worker "When creating PublishPacket from native could not add subscription identifier!");
695*3c7ae9deSAndroid Build Coastguard Worker return NULL;
696*3c7ae9deSAndroid Build Coastguard Worker }
697*3c7ae9deSAndroid Build Coastguard Worker if ((bool)jni_add_result == false) {
698*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(
699*3c7ae9deSAndroid Build Coastguard Worker AWS_LS_MQTT5_CLIENT,
700*3c7ae9deSAndroid Build Coastguard Worker "When creating PublishPacket from native could not add subscription identifier!");
701*3c7ae9deSAndroid Build Coastguard Worker return NULL;
702*3c7ae9deSAndroid Build Coastguard Worker }
703*3c7ae9deSAndroid Build Coastguard Worker }
704*3c7ae9deSAndroid Build Coastguard Worker }
705*3c7ae9deSAndroid Build Coastguard Worker
706*3c7ae9deSAndroid Build Coastguard Worker if (s_set_user_properties_field(
707*3c7ae9deSAndroid Build Coastguard Worker env,
708*3c7ae9deSAndroid Build Coastguard Worker publish->user_property_count,
709*3c7ae9deSAndroid Build Coastguard Worker publish->user_properties,
710*3c7ae9deSAndroid Build Coastguard Worker publish_packet_data,
711*3c7ae9deSAndroid Build Coastguard Worker mqtt5_publish_packet_properties.publish_user_properties_field_id) == AWS_OP_ERR) {
712*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "When creating PublishPacket from native could not add user properties!");
713*3c7ae9deSAndroid Build Coastguard Worker return NULL;
714*3c7ae9deSAndroid Build Coastguard Worker }
715*3c7ae9deSAndroid Build Coastguard Worker
716*3c7ae9deSAndroid Build Coastguard Worker return publish_packet_data;
717*3c7ae9deSAndroid Build Coastguard Worker }
718*3c7ae9deSAndroid Build Coastguard Worker
s_aws_mqtt5_client_create_jni_puback_packet_from_native(JNIEnv * env,struct aws_mqtt5_packet_puback_view * puback_packet)719*3c7ae9deSAndroid Build Coastguard Worker jobject s_aws_mqtt5_client_create_jni_puback_packet_from_native(
720*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
721*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_puback_view *puback_packet) {
722*3c7ae9deSAndroid Build Coastguard Worker /* Make the PubAck packet */
723*3c7ae9deSAndroid Build Coastguard Worker jobject puback_packet_data = (*env)->NewObject(
724*3c7ae9deSAndroid Build Coastguard Worker env, mqtt5_puback_packet_properties.puback_packet_class, mqtt5_puback_packet_properties.puback_constructor_id);
725*3c7ae9deSAndroid Build Coastguard Worker
726*3c7ae9deSAndroid Build Coastguard Worker int reason_code_int = (int)puback_packet->reason_code;
727*3c7ae9deSAndroid Build Coastguard Worker if (s_set_int_enum_in_packet(
728*3c7ae9deSAndroid Build Coastguard Worker env,
729*3c7ae9deSAndroid Build Coastguard Worker &reason_code_int,
730*3c7ae9deSAndroid Build Coastguard Worker puback_packet_data,
731*3c7ae9deSAndroid Build Coastguard Worker mqtt5_puback_packet_properties.puback_native_add_reason_code_id,
732*3c7ae9deSAndroid Build Coastguard Worker false) != AWS_OP_SUCCESS) {
733*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Error when creating PubAck result from native: Could not set reason code");
734*3c7ae9deSAndroid Build Coastguard Worker return NULL;
735*3c7ae9deSAndroid Build Coastguard Worker }
736*3c7ae9deSAndroid Build Coastguard Worker if (s_set_jni_string_field_in_packet(
737*3c7ae9deSAndroid Build Coastguard Worker env,
738*3c7ae9deSAndroid Build Coastguard Worker puback_packet->reason_string,
739*3c7ae9deSAndroid Build Coastguard Worker puback_packet_data,
740*3c7ae9deSAndroid Build Coastguard Worker mqtt5_puback_packet_properties.puback_reason_string_field_id,
741*3c7ae9deSAndroid Build Coastguard Worker "reason string",
742*3c7ae9deSAndroid Build Coastguard Worker true) != AWS_OP_SUCCESS) {
743*3c7ae9deSAndroid Build Coastguard Worker return NULL;
744*3c7ae9deSAndroid Build Coastguard Worker }
745*3c7ae9deSAndroid Build Coastguard Worker if (s_set_user_properties_field(
746*3c7ae9deSAndroid Build Coastguard Worker env,
747*3c7ae9deSAndroid Build Coastguard Worker puback_packet->user_property_count,
748*3c7ae9deSAndroid Build Coastguard Worker puback_packet->user_properties,
749*3c7ae9deSAndroid Build Coastguard Worker puback_packet_data,
750*3c7ae9deSAndroid Build Coastguard Worker mqtt5_puback_packet_properties.puback_user_properties_field_id) == AWS_OP_ERR) {
751*3c7ae9deSAndroid Build Coastguard Worker AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "When creating PubAckPacket from native could not add user property!");
752*3c7ae9deSAndroid Build Coastguard Worker return NULL;
753*3c7ae9deSAndroid Build Coastguard Worker }
754*3c7ae9deSAndroid Build Coastguard Worker return puback_packet_data;
755*3c7ae9deSAndroid Build Coastguard Worker }
756