xref: /aosp_15_r20/external/aws-crt-java/src/native/mqtt5_packets.c (revision 3c7ae9de214676c52d19f01067dc1a404272dc11)
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 #include <jni.h>
6*3c7ae9deSAndroid Build Coastguard Worker 
7*3c7ae9deSAndroid Build Coastguard Worker #include <mqtt5_packets.h>
8*3c7ae9deSAndroid Build Coastguard Worker 
9*3c7ae9deSAndroid Build Coastguard Worker #include <aws/mqtt/v5/mqtt5_client.h>
10*3c7ae9deSAndroid Build Coastguard Worker #include <crt.h>
11*3c7ae9deSAndroid Build Coastguard Worker 
12*3c7ae9deSAndroid Build Coastguard Worker #include <java_class_ids.h>
13*3c7ae9deSAndroid Build Coastguard Worker 
14*3c7ae9deSAndroid Build Coastguard Worker /* on 32-bit platforms, casting pointers to longs throws a warning we don't need */
15*3c7ae9deSAndroid Build Coastguard Worker #if UINTPTR_MAX == 0xffffffff
16*3c7ae9deSAndroid Build Coastguard Worker #    if defined(_MSC_VER)
17*3c7ae9deSAndroid Build Coastguard Worker #        pragma warning(push)
18*3c7ae9deSAndroid Build Coastguard Worker #        pragma warning(disable : 4305) /* 'type cast': truncation from 'jlong' to 'jni_tls_ctx_options *' */
19*3c7ae9deSAndroid Build Coastguard Worker #    else
20*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic push
21*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
22*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
23*3c7ae9deSAndroid Build Coastguard Worker #    endif
24*3c7ae9deSAndroid Build Coastguard Worker #endif
25*3c7ae9deSAndroid Build Coastguard Worker 
26*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
27*3c7ae9deSAndroid Build Coastguard Worker  * STRUCT DEFINITIONS
28*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
29*3c7ae9deSAndroid Build Coastguard Worker 
30*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_connect_view_java_jni {
31*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_connect_view packet;
32*3c7ae9deSAndroid Build Coastguard Worker 
33*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf client_id_buf;
34*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor client_id_cursor;
35*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf username_buf;
36*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor username_cursor;
37*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf password_buf;
38*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor password_cursor;
39*3c7ae9deSAndroid Build Coastguard Worker     uint32_t session_expiry_interval_seconds;
40*3c7ae9deSAndroid Build Coastguard Worker     uint8_t request_response_information;
41*3c7ae9deSAndroid Build Coastguard Worker     uint8_t request_problem_information;
42*3c7ae9deSAndroid Build Coastguard Worker     uint16_t receive_maximum;
43*3c7ae9deSAndroid Build Coastguard Worker     uint16_t topic_alias_maximum;
44*3c7ae9deSAndroid Build Coastguard Worker     uint32_t maximum_packet_size_bytes;
45*3c7ae9deSAndroid Build Coastguard Worker     uint32_t will_delay_interval_seconds;
46*3c7ae9deSAndroid Build Coastguard Worker     uint16_t keep_alive_interval_seconds;
47*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
48*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_holder;
49*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_mqtt5_user_property pointers */
50*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_struct_holder;
51*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_publish_view_java_jni *will_publish_packet;
52*3c7ae9deSAndroid Build Coastguard Worker };
53*3c7ae9deSAndroid Build Coastguard Worker 
54*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_disconnect_view_java_jni {
55*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_disconnect_view packet;
56*3c7ae9deSAndroid Build Coastguard Worker 
57*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf reason_string_buf;
58*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor reason_string_cursor;
59*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf server_reference_buf;
60*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor server_reference_cursor;
61*3c7ae9deSAndroid Build Coastguard Worker     uint32_t session_expiry_interval_seconds;
62*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
63*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_holder;
64*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_mqtt5_user_property pointers */
65*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_struct_holder;
66*3c7ae9deSAndroid Build Coastguard Worker };
67*3c7ae9deSAndroid Build Coastguard Worker 
68*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_publish_view_java_jni {
69*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_publish_view packet;
70*3c7ae9deSAndroid Build Coastguard Worker 
71*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf payload_buf;
72*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor payload_cursor;
73*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf topic_buf;
74*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor topic_cursor;
75*3c7ae9deSAndroid Build Coastguard Worker     enum aws_mqtt5_payload_format_indicator payload_format;
76*3c7ae9deSAndroid Build Coastguard Worker     uint32_t message_expiry_interval_seconds;
77*3c7ae9deSAndroid Build Coastguard Worker     uint16_t topic_alias;
78*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf response_topic_buf;
79*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor response_topic_cursor;
80*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf correlation_data_buf;
81*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor correlation_data_cursor;
82*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf content_type_buf;
83*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor content_type_cursor;
84*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
85*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_holder;
86*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_mqtt5_user_property pointers */
87*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_struct_holder;
88*3c7ae9deSAndroid Build Coastguard Worker };
89*3c7ae9deSAndroid Build Coastguard Worker 
90*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_subscribe_view_java_jni {
91*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_subscribe_view packet;
92*3c7ae9deSAndroid Build Coastguard Worker 
93*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_mqtt5_subscription_view pointers */
94*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list topic_filters;
95*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
96*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_subscription_topic_filters;
97*3c7ae9deSAndroid Build Coastguard Worker     uint32_t subscription_identifier;
98*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
99*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_holder;
100*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_mqtt5_user_property pointers */
101*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_struct_holder;
102*3c7ae9deSAndroid Build Coastguard Worker };
103*3c7ae9deSAndroid Build Coastguard Worker 
104*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_unsubscribe_view_java_jni {
105*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_unsubscribe_view packet;
106*3c7ae9deSAndroid Build Coastguard Worker 
107*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_byte_cursor pointers */
108*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list topic_filters;
109*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
110*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_topic_filters;
111*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
112*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_holder;
113*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_mqtt5_user_property pointers */
114*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list jni_user_properties_struct_holder;
115*3c7ae9deSAndroid Build Coastguard Worker };
116*3c7ae9deSAndroid Build Coastguard Worker 
117*3c7ae9deSAndroid Build Coastguard Worker struct buffer_and_cursor_array_holder_struct {
118*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor cursor;
119*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf buffer;
120*3c7ae9deSAndroid Build Coastguard Worker };
121*3c7ae9deSAndroid Build Coastguard Worker 
122*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
123*3c7ae9deSAndroid Build Coastguard Worker  * HELPER FUNCTIONS
124*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
125*3c7ae9deSAndroid Build Coastguard Worker 
s_populate_user_properties(JNIEnv * env,jobject jni_user_properties_list,size_t java_packet_native_user_property_count,const struct aws_mqtt5_user_property ** java_packet_native_user_properties,struct aws_array_list * java_packet_user_properties_holder,struct aws_array_list * java_packet_user_properties_struct_holder)126*3c7ae9deSAndroid Build Coastguard Worker static int s_populate_user_properties(
127*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
128*3c7ae9deSAndroid Build Coastguard Worker     jobject jni_user_properties_list,
129*3c7ae9deSAndroid Build Coastguard Worker     size_t java_packet_native_user_property_count,
130*3c7ae9deSAndroid Build Coastguard Worker     const struct aws_mqtt5_user_property **java_packet_native_user_properties,
131*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
132*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list *java_packet_user_properties_holder,
133*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_mqtt5_user_property pointers */
134*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list *java_packet_user_properties_struct_holder) {
135*3c7ae9deSAndroid Build Coastguard Worker 
136*3c7ae9deSAndroid Build Coastguard Worker     if (jni_user_properties_list) {
137*3c7ae9deSAndroid Build Coastguard Worker         for (size_t i = 0; i < java_packet_native_user_property_count; i++) {
138*3c7ae9deSAndroid Build Coastguard Worker             jobject jni_property =
139*3c7ae9deSAndroid Build Coastguard Worker                 (*env)->CallObjectMethod(env, jni_user_properties_list, boxed_list_properties.list_get_id, (jint)i);
140*3c7ae9deSAndroid Build Coastguard Worker             if (!jni_property || aws_jni_check_and_clear_exception(env)) {
141*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LOGF_ERROR(
142*3c7ae9deSAndroid Build Coastguard Worker                     AWS_LS_MQTT5_CLIENT,
143*3c7ae9deSAndroid Build Coastguard Worker                     "Could not populate user properties due to being unable to get property in list from Java");
144*3c7ae9deSAndroid Build Coastguard Worker                 return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
145*3c7ae9deSAndroid Build Coastguard Worker             }
146*3c7ae9deSAndroid Build Coastguard Worker 
147*3c7ae9deSAndroid Build Coastguard Worker             jstring jni_property_key =
148*3c7ae9deSAndroid Build Coastguard Worker                 (jstring)(*env)->GetObjectField(env, jni_property, mqtt5_user_property_properties.property_key_id);
149*3c7ae9deSAndroid Build Coastguard Worker             if (aws_jni_check_and_clear_exception(env) || !jni_property_key) {
150*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LOGF_ERROR(
151*3c7ae9deSAndroid Build Coastguard Worker                     AWS_LS_MQTT5_CLIENT,
152*3c7ae9deSAndroid Build Coastguard Worker                     "Could not populate user properties due to exception when getting property key");
153*3c7ae9deSAndroid Build Coastguard Worker                 return aws_raise_error(AWS_ERROR_INVALID_STATE);
154*3c7ae9deSAndroid Build Coastguard Worker             }
155*3c7ae9deSAndroid Build Coastguard Worker             jstring jni_property_value =
156*3c7ae9deSAndroid Build Coastguard Worker                 (jstring)(*env)->GetObjectField(env, jni_property, mqtt5_user_property_properties.property_value_id);
157*3c7ae9deSAndroid Build Coastguard Worker             if (aws_jni_check_and_clear_exception(env) || !jni_property_value) {
158*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LOGF_ERROR(
159*3c7ae9deSAndroid Build Coastguard Worker                     AWS_LS_MQTT5_CLIENT,
160*3c7ae9deSAndroid Build Coastguard Worker                     "Could not populate user properties due to exception when getting property value");
161*3c7ae9deSAndroid Build Coastguard Worker                 return aws_raise_error(AWS_ERROR_INVALID_STATE);
162*3c7ae9deSAndroid Build Coastguard Worker             }
163*3c7ae9deSAndroid Build Coastguard Worker 
164*3c7ae9deSAndroid Build Coastguard Worker             if (!jni_property_key) {
165*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Error reading a user property: Key in user property was NULL!");
166*3c7ae9deSAndroid Build Coastguard Worker                 return aws_raise_error(AWS_ERROR_INVALID_STATE);
167*3c7ae9deSAndroid Build Coastguard Worker             }
168*3c7ae9deSAndroid Build Coastguard Worker             if (!jni_property_value) {
169*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "Error reading a user property: Key in user property was NULL!");
170*3c7ae9deSAndroid Build Coastguard Worker                 return aws_raise_error(AWS_ERROR_INVALID_STATE);
171*3c7ae9deSAndroid Build Coastguard Worker             }
172*3c7ae9deSAndroid Build Coastguard Worker 
173*3c7ae9deSAndroid Build Coastguard Worker             // Get a temporary cursor from JNI, copy it, and then destroy the JNI version, leaving the byte_buffer copy.
174*3c7ae9deSAndroid Build Coastguard Worker             // This gets around JNI stuff going out of scope.
175*3c7ae9deSAndroid Build Coastguard Worker             struct buffer_and_cursor_array_holder_struct holder_property_key;
176*3c7ae9deSAndroid Build Coastguard Worker             struct aws_byte_cursor tmp_cursor = aws_jni_byte_cursor_from_jstring_acquire(env, jni_property_key);
177*3c7ae9deSAndroid Build Coastguard Worker             aws_byte_buf_init_copy_from_cursor(&holder_property_key.buffer, aws_jni_get_allocator(), tmp_cursor);
178*3c7ae9deSAndroid Build Coastguard Worker             holder_property_key.cursor = aws_byte_cursor_from_buf(&holder_property_key.buffer);
179*3c7ae9deSAndroid Build Coastguard Worker             aws_jni_byte_cursor_from_jstring_release(env, jni_property_key, tmp_cursor);
180*3c7ae9deSAndroid Build Coastguard Worker             jni_property_key = NULL;
181*3c7ae9deSAndroid Build Coastguard Worker 
182*3c7ae9deSAndroid Build Coastguard Worker             // Get a temporary cursor from JNI, copy it, and then destroy the JNI version, leaving the byte_buffer copy.
183*3c7ae9deSAndroid Build Coastguard Worker             // This gets around JNI stuff going out of scope.
184*3c7ae9deSAndroid Build Coastguard Worker             struct buffer_and_cursor_array_holder_struct holder_property_value;
185*3c7ae9deSAndroid Build Coastguard Worker             tmp_cursor = aws_jni_byte_cursor_from_jstring_acquire(env, jni_property_value);
186*3c7ae9deSAndroid Build Coastguard Worker             aws_byte_buf_init_copy_from_cursor(&holder_property_value.buffer, aws_jni_get_allocator(), tmp_cursor);
187*3c7ae9deSAndroid Build Coastguard Worker             holder_property_value.cursor = aws_byte_cursor_from_buf(&holder_property_value.buffer);
188*3c7ae9deSAndroid Build Coastguard Worker             aws_jni_byte_cursor_from_jstring_release(env, jni_property_value, tmp_cursor);
189*3c7ae9deSAndroid Build Coastguard Worker             jni_property_value = NULL;
190*3c7ae9deSAndroid Build Coastguard Worker 
191*3c7ae9deSAndroid Build Coastguard Worker             aws_array_list_push_back(java_packet_user_properties_holder, (void *)&holder_property_key);
192*3c7ae9deSAndroid Build Coastguard Worker             aws_array_list_push_back(java_packet_user_properties_holder, (void *)&holder_property_value);
193*3c7ae9deSAndroid Build Coastguard Worker 
194*3c7ae9deSAndroid Build Coastguard Worker             struct aws_mqtt5_user_property jni_property_struct = {
195*3c7ae9deSAndroid Build Coastguard Worker                 .name = holder_property_key.cursor,
196*3c7ae9deSAndroid Build Coastguard Worker                 .value = holder_property_value.cursor,
197*3c7ae9deSAndroid Build Coastguard Worker             };
198*3c7ae9deSAndroid Build Coastguard Worker             aws_array_list_push_back(java_packet_user_properties_struct_holder, (void *)&jni_property_struct);
199*3c7ae9deSAndroid Build Coastguard Worker         }
200*3c7ae9deSAndroid Build Coastguard Worker         *java_packet_native_user_properties =
201*3c7ae9deSAndroid Build Coastguard Worker             (struct aws_mqtt5_user_property *)java_packet_user_properties_struct_holder->data;
202*3c7ae9deSAndroid Build Coastguard Worker     }
203*3c7ae9deSAndroid Build Coastguard Worker     return AWS_OP_SUCCESS;
204*3c7ae9deSAndroid Build Coastguard Worker }
205*3c7ae9deSAndroid Build Coastguard Worker 
s_allocate_user_properties_array_holders(struct aws_allocator * allocator,struct aws_array_list * holder_array,struct aws_array_list * user_property_array,size_t init_entries)206*3c7ae9deSAndroid Build Coastguard Worker static int s_allocate_user_properties_array_holders(
207*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
208*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
209*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list *holder_array,
210*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_mqtt5_user_property pointers */
211*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list *user_property_array,
212*3c7ae9deSAndroid Build Coastguard Worker     size_t init_entries) {
213*3c7ae9deSAndroid Build Coastguard Worker 
214*3c7ae9deSAndroid Build Coastguard Worker     if (init_entries > 0) {
215*3c7ae9deSAndroid Build Coastguard Worker         if (aws_array_list_init_dynamic(
216*3c7ae9deSAndroid Build Coastguard Worker                 holder_array, allocator, 2 * init_entries, sizeof(struct buffer_and_cursor_array_holder_struct)) !=
217*3c7ae9deSAndroid Build Coastguard Worker                 AWS_OP_SUCCESS ||
218*3c7ae9deSAndroid Build Coastguard Worker             aws_array_list_init_dynamic(
219*3c7ae9deSAndroid Build Coastguard Worker                 user_property_array, allocator, 2 * init_entries, sizeof(struct aws_mqtt5_user_property)) !=
220*3c7ae9deSAndroid Build Coastguard Worker                 AWS_OP_SUCCESS) {
221*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
222*3c7ae9deSAndroid Build Coastguard Worker         }
223*3c7ae9deSAndroid Build Coastguard Worker     }
224*3c7ae9deSAndroid Build Coastguard Worker     return AWS_OP_SUCCESS;
225*3c7ae9deSAndroid Build Coastguard Worker }
226*3c7ae9deSAndroid Build Coastguard Worker 
s_cleanup_two_aws_array(JNIEnv * env,struct aws_array_list * user_properties_holder,struct aws_array_list * user_properties_struct_holder)227*3c7ae9deSAndroid Build Coastguard Worker static void s_cleanup_two_aws_array(
228*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
229*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list *user_properties_holder,
230*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list *user_properties_struct_holder) {
231*3c7ae9deSAndroid Build Coastguard Worker 
232*3c7ae9deSAndroid Build Coastguard Worker     (void)env;
233*3c7ae9deSAndroid Build Coastguard Worker     if (aws_array_list_is_valid(user_properties_holder)) {
234*3c7ae9deSAndroid Build Coastguard Worker         /**
235*3c7ae9deSAndroid Build Coastguard Worker          * Note that this ONLY frees the array holders for the non-struct array.
236*3c7ae9deSAndroid Build Coastguard Worker          * We want to keep the struct one in memory since it belongs to a packet or similar.
237*3c7ae9deSAndroid Build Coastguard Worker          * If both need to be freed, then we assume whomever is calling this will handle it.
238*3c7ae9deSAndroid Build Coastguard Worker          */
239*3c7ae9deSAndroid Build Coastguard Worker         for (size_t i = 0; i < aws_array_list_length(user_properties_holder); i++) {
240*3c7ae9deSAndroid Build Coastguard Worker             struct buffer_and_cursor_array_holder_struct holder;
241*3c7ae9deSAndroid Build Coastguard Worker             aws_array_list_get_at(user_properties_holder, &holder, i);
242*3c7ae9deSAndroid Build Coastguard Worker             if (aws_byte_buf_is_valid(&holder.buffer)) {
243*3c7ae9deSAndroid Build Coastguard Worker                 aws_byte_buf_clean_up(&holder.buffer);
244*3c7ae9deSAndroid Build Coastguard Worker             }
245*3c7ae9deSAndroid Build Coastguard Worker         }
246*3c7ae9deSAndroid Build Coastguard Worker         aws_array_list_clean_up(user_properties_holder);
247*3c7ae9deSAndroid Build Coastguard Worker     }
248*3c7ae9deSAndroid Build Coastguard Worker     if (aws_array_list_is_valid(user_properties_struct_holder)) {
249*3c7ae9deSAndroid Build Coastguard Worker         aws_array_list_clean_up(user_properties_struct_holder);
250*3c7ae9deSAndroid Build Coastguard Worker     }
251*3c7ae9deSAndroid Build Coastguard Worker }
252*3c7ae9deSAndroid Build Coastguard Worker 
aws_get_uint16_from_jobject(JNIEnv * env,jobject object,jfieldID object_field,char * object_name,char * field_name,uint16_t * result,bool optional,bool * was_value_set)253*3c7ae9deSAndroid Build Coastguard Worker int aws_get_uint16_from_jobject(
254*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
255*3c7ae9deSAndroid Build Coastguard Worker     jobject object,
256*3c7ae9deSAndroid Build Coastguard Worker     jfieldID object_field,
257*3c7ae9deSAndroid Build Coastguard Worker     char *object_name,
258*3c7ae9deSAndroid Build Coastguard Worker     char *field_name,
259*3c7ae9deSAndroid Build Coastguard Worker     uint16_t *result,
260*3c7ae9deSAndroid Build Coastguard Worker     bool optional,
261*3c7ae9deSAndroid Build Coastguard Worker     bool *was_value_set) {
262*3c7ae9deSAndroid Build Coastguard Worker 
263*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set != NULL) {
264*3c7ae9deSAndroid Build Coastguard Worker         *was_value_set = false;
265*3c7ae9deSAndroid Build Coastguard Worker     }
266*3c7ae9deSAndroid Build Coastguard Worker 
267*3c7ae9deSAndroid Build Coastguard Worker     jobject jlong_obj = (*env)->GetObjectField(env, object, object_field);
268*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
269*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, field_name);
270*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_INVALID_STATE);
271*3c7ae9deSAndroid Build Coastguard Worker     }
272*3c7ae9deSAndroid Build Coastguard Worker     if (jlong_obj) {
273*3c7ae9deSAndroid Build Coastguard Worker         jlong jlong_value = (*env)->CallLongMethod(env, jlong_obj, boxed_long_properties.long_value_method_id);
274*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
275*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, field_name);
276*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
277*3c7ae9deSAndroid Build Coastguard Worker         }
278*3c7ae9deSAndroid Build Coastguard Worker         int64_t jlong_value_check = (int64_t)jlong_value;
279*3c7ae9deSAndroid Build Coastguard Worker         if (jlong_value_check < 0) {
280*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: %s is less than 0", object_name, field_name);
281*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
282*3c7ae9deSAndroid Build Coastguard Worker         } else if (jlong_value_check > UINT16_MAX) {
283*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
284*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT, "%s create_from_java: %s is more than UINT16_MAX", object_name, field_name);
285*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
286*3c7ae9deSAndroid Build Coastguard Worker         }
287*3c7ae9deSAndroid Build Coastguard Worker         *result = (uint16_t)jlong_value;
288*3c7ae9deSAndroid Build Coastguard Worker 
289*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set != NULL) {
290*3c7ae9deSAndroid Build Coastguard Worker             *was_value_set = true;
291*3c7ae9deSAndroid Build Coastguard Worker         }
292*3c7ae9deSAndroid Build Coastguard Worker 
293*3c7ae9deSAndroid Build Coastguard Worker         if (!optional) {
294*3c7ae9deSAndroid Build Coastguard Worker             return AWS_OP_SUCCESS;
295*3c7ae9deSAndroid Build Coastguard Worker         }
296*3c7ae9deSAndroid Build Coastguard Worker     }
297*3c7ae9deSAndroid Build Coastguard Worker 
298*3c7ae9deSAndroid Build Coastguard Worker     if (optional) {
299*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_SUCCESS;
300*3c7ae9deSAndroid Build Coastguard Worker     } else {
301*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
302*3c7ae9deSAndroid Build Coastguard Worker     }
303*3c7ae9deSAndroid Build Coastguard Worker }
304*3c7ae9deSAndroid Build Coastguard Worker 
aws_get_uint32_from_jobject(JNIEnv * env,jobject object,jfieldID object_field,char * object_name,char * field_name,uint32_t * result,bool optional,bool * was_value_set)305*3c7ae9deSAndroid Build Coastguard Worker int aws_get_uint32_from_jobject(
306*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
307*3c7ae9deSAndroid Build Coastguard Worker     jobject object,
308*3c7ae9deSAndroid Build Coastguard Worker     jfieldID object_field,
309*3c7ae9deSAndroid Build Coastguard Worker     char *object_name,
310*3c7ae9deSAndroid Build Coastguard Worker     char *field_name,
311*3c7ae9deSAndroid Build Coastguard Worker     uint32_t *result,
312*3c7ae9deSAndroid Build Coastguard Worker     bool optional,
313*3c7ae9deSAndroid Build Coastguard Worker     bool *was_value_set) {
314*3c7ae9deSAndroid Build Coastguard Worker 
315*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set != NULL) {
316*3c7ae9deSAndroid Build Coastguard Worker         *was_value_set = false;
317*3c7ae9deSAndroid Build Coastguard Worker     }
318*3c7ae9deSAndroid Build Coastguard Worker 
319*3c7ae9deSAndroid Build Coastguard Worker     jobject jlong_obj = (*env)->GetObjectField(env, object, object_field);
320*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
321*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, field_name);
322*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_INVALID_STATE);
323*3c7ae9deSAndroid Build Coastguard Worker     }
324*3c7ae9deSAndroid Build Coastguard Worker     if (jlong_obj) {
325*3c7ae9deSAndroid Build Coastguard Worker         jlong jlong_value = (*env)->CallLongMethod(env, jlong_obj, boxed_long_properties.long_value_method_id);
326*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
327*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, field_name);
328*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
329*3c7ae9deSAndroid Build Coastguard Worker         }
330*3c7ae9deSAndroid Build Coastguard Worker         int64_t jlong_value_check = (int64_t)jlong_value;
331*3c7ae9deSAndroid Build Coastguard Worker         if (jlong_value_check < 0) {
332*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: %s is less than 0", object_name, field_name);
333*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
334*3c7ae9deSAndroid Build Coastguard Worker         } else if (jlong_value_check > UINT32_MAX) {
335*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
336*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT, "%s create_from_java: %s is more than UINT32_MAX", object_name, field_name);
337*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
338*3c7ae9deSAndroid Build Coastguard Worker         }
339*3c7ae9deSAndroid Build Coastguard Worker         *result = (uint32_t)jlong_value_check;
340*3c7ae9deSAndroid Build Coastguard Worker 
341*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set != NULL) {
342*3c7ae9deSAndroid Build Coastguard Worker             *was_value_set = true;
343*3c7ae9deSAndroid Build Coastguard Worker         }
344*3c7ae9deSAndroid Build Coastguard Worker 
345*3c7ae9deSAndroid Build Coastguard Worker         if (!optional) {
346*3c7ae9deSAndroid Build Coastguard Worker             return AWS_OP_SUCCESS;
347*3c7ae9deSAndroid Build Coastguard Worker         }
348*3c7ae9deSAndroid Build Coastguard Worker     }
349*3c7ae9deSAndroid Build Coastguard Worker 
350*3c7ae9deSAndroid Build Coastguard Worker     if (optional) {
351*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_SUCCESS;
352*3c7ae9deSAndroid Build Coastguard Worker     } else {
353*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
354*3c7ae9deSAndroid Build Coastguard Worker     }
355*3c7ae9deSAndroid Build Coastguard Worker }
356*3c7ae9deSAndroid Build Coastguard Worker 
aws_get_uint64_from_jobject(JNIEnv * env,jobject object,jfieldID object_field,char * object_name,char * field_name,uint64_t * result,bool optional,bool * was_value_set)357*3c7ae9deSAndroid Build Coastguard Worker int aws_get_uint64_from_jobject(
358*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
359*3c7ae9deSAndroid Build Coastguard Worker     jobject object,
360*3c7ae9deSAndroid Build Coastguard Worker     jfieldID object_field,
361*3c7ae9deSAndroid Build Coastguard Worker     char *object_name,
362*3c7ae9deSAndroid Build Coastguard Worker     char *field_name,
363*3c7ae9deSAndroid Build Coastguard Worker     uint64_t *result,
364*3c7ae9deSAndroid Build Coastguard Worker     bool optional,
365*3c7ae9deSAndroid Build Coastguard Worker     bool *was_value_set) {
366*3c7ae9deSAndroid Build Coastguard Worker 
367*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set != NULL) {
368*3c7ae9deSAndroid Build Coastguard Worker         *was_value_set = false;
369*3c7ae9deSAndroid Build Coastguard Worker     }
370*3c7ae9deSAndroid Build Coastguard Worker 
371*3c7ae9deSAndroid Build Coastguard Worker     jobject jlong_obj = (*env)->GetObjectField(env, object, object_field);
372*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
373*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, field_name);
374*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_INVALID_STATE);
375*3c7ae9deSAndroid Build Coastguard Worker     }
376*3c7ae9deSAndroid Build Coastguard Worker     if (jlong_obj) {
377*3c7ae9deSAndroid Build Coastguard Worker         jlong jlong_value = (*env)->CallLongMethod(env, jlong_obj, boxed_long_properties.long_value_method_id);
378*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
379*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, field_name);
380*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
381*3c7ae9deSAndroid Build Coastguard Worker         }
382*3c7ae9deSAndroid Build Coastguard Worker         int64_t jlong_value_check = (int64_t)jlong_value;
383*3c7ae9deSAndroid Build Coastguard Worker         if (jlong_value_check < 0) {
384*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: %s is less than 0", object_name, field_name);
385*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
386*3c7ae9deSAndroid Build Coastguard Worker         }
387*3c7ae9deSAndroid Build Coastguard Worker         *result = (uint64_t)jlong_value_check;
388*3c7ae9deSAndroid Build Coastguard Worker 
389*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set != NULL) {
390*3c7ae9deSAndroid Build Coastguard Worker             *was_value_set = true;
391*3c7ae9deSAndroid Build Coastguard Worker         }
392*3c7ae9deSAndroid Build Coastguard Worker 
393*3c7ae9deSAndroid Build Coastguard Worker         if (!optional) {
394*3c7ae9deSAndroid Build Coastguard Worker             return AWS_OP_SUCCESS;
395*3c7ae9deSAndroid Build Coastguard Worker         }
396*3c7ae9deSAndroid Build Coastguard Worker     }
397*3c7ae9deSAndroid Build Coastguard Worker 
398*3c7ae9deSAndroid Build Coastguard Worker     if (optional) {
399*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_SUCCESS;
400*3c7ae9deSAndroid Build Coastguard Worker     } else {
401*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
402*3c7ae9deSAndroid Build Coastguard Worker     }
403*3c7ae9deSAndroid Build Coastguard Worker }
404*3c7ae9deSAndroid Build Coastguard Worker 
aws_get_string_from_jobject(JNIEnv * env,jobject object,jfieldID object_field,char * object_name,char * field_name,struct aws_byte_buf * result_buf,struct aws_byte_cursor * result_cursor,bool is_optional,bool * was_value_set)405*3c7ae9deSAndroid Build Coastguard Worker int aws_get_string_from_jobject(
406*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
407*3c7ae9deSAndroid Build Coastguard Worker     jobject object,
408*3c7ae9deSAndroid Build Coastguard Worker     jfieldID object_field,
409*3c7ae9deSAndroid Build Coastguard Worker     char *object_name,
410*3c7ae9deSAndroid Build Coastguard Worker     char *field_name,
411*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf *result_buf,
412*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor *result_cursor,
413*3c7ae9deSAndroid Build Coastguard Worker     bool is_optional,
414*3c7ae9deSAndroid Build Coastguard Worker     bool *was_value_set) {
415*3c7ae9deSAndroid Build Coastguard Worker 
416*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set != NULL) {
417*3c7ae9deSAndroid Build Coastguard Worker         *was_value_set = false;
418*3c7ae9deSAndroid Build Coastguard Worker     }
419*3c7ae9deSAndroid Build Coastguard Worker 
420*3c7ae9deSAndroid Build Coastguard Worker     jstring jstring_value = (jstring)(*env)->GetObjectField(env, object, object_field);
421*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
422*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, field_name);
423*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_INVALID_STATE);
424*3c7ae9deSAndroid Build Coastguard Worker     }
425*3c7ae9deSAndroid Build Coastguard Worker     if (jstring_value) {
426*3c7ae9deSAndroid Build Coastguard Worker         // Get the data, copy it, and then release the JNI stuff
427*3c7ae9deSAndroid Build Coastguard Worker         struct aws_byte_cursor tmp_cursor = aws_jni_byte_cursor_from_jstring_acquire(env, jstring_value);
428*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_init_copy_from_cursor(result_buf, aws_jni_get_allocator(), tmp_cursor);
429*3c7ae9deSAndroid Build Coastguard Worker         *result_cursor = aws_byte_cursor_from_buf(result_buf);
430*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jstring_release(env, jstring_value, tmp_cursor);
431*3c7ae9deSAndroid Build Coastguard Worker 
432*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set != NULL) {
433*3c7ae9deSAndroid Build Coastguard Worker             *was_value_set = true;
434*3c7ae9deSAndroid Build Coastguard Worker         }
435*3c7ae9deSAndroid Build Coastguard Worker 
436*3c7ae9deSAndroid Build Coastguard Worker         if (!is_optional) {
437*3c7ae9deSAndroid Build Coastguard Worker             return AWS_OP_SUCCESS;
438*3c7ae9deSAndroid Build Coastguard Worker         }
439*3c7ae9deSAndroid Build Coastguard Worker     }
440*3c7ae9deSAndroid Build Coastguard Worker     if (is_optional) {
441*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_SUCCESS;
442*3c7ae9deSAndroid Build Coastguard Worker     } else {
443*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
444*3c7ae9deSAndroid Build Coastguard Worker     }
445*3c7ae9deSAndroid Build Coastguard Worker }
446*3c7ae9deSAndroid Build Coastguard Worker 
aws_get_byte_array_from_jobject(JNIEnv * env,jobject object,jfieldID object_field,char * object_name,char * field_name,struct aws_byte_buf * result_buf,struct aws_byte_cursor * result_cursor,bool optional,bool * was_value_set)447*3c7ae9deSAndroid Build Coastguard Worker int aws_get_byte_array_from_jobject(
448*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
449*3c7ae9deSAndroid Build Coastguard Worker     jobject object,
450*3c7ae9deSAndroid Build Coastguard Worker     jfieldID object_field,
451*3c7ae9deSAndroid Build Coastguard Worker     char *object_name,
452*3c7ae9deSAndroid Build Coastguard Worker     char *field_name,
453*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_buf *result_buf,
454*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor *result_cursor,
455*3c7ae9deSAndroid Build Coastguard Worker     bool optional,
456*3c7ae9deSAndroid Build Coastguard Worker     bool *was_value_set) {
457*3c7ae9deSAndroid Build Coastguard Worker 
458*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set != NULL) {
459*3c7ae9deSAndroid Build Coastguard Worker         *was_value_set = false;
460*3c7ae9deSAndroid Build Coastguard Worker     }
461*3c7ae9deSAndroid Build Coastguard Worker 
462*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray jbyte_array_value = (jbyteArray)(*env)->GetObjectField(env, object, object_field);
463*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
464*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, field_name);
465*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_INVALID_STATE);
466*3c7ae9deSAndroid Build Coastguard Worker     }
467*3c7ae9deSAndroid Build Coastguard Worker     if (jbyte_array_value) {
468*3c7ae9deSAndroid Build Coastguard Worker         // Get the data, copy it, and then release the JNI stuff
469*3c7ae9deSAndroid Build Coastguard Worker         struct aws_byte_cursor tmp_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, jbyte_array_value);
470*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_init_copy_from_cursor(result_buf, aws_jni_get_allocator(), tmp_cursor);
471*3c7ae9deSAndroid Build Coastguard Worker         *result_cursor = aws_byte_cursor_from_buf(result_buf);
472*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, jbyte_array_value, tmp_cursor);
473*3c7ae9deSAndroid Build Coastguard Worker 
474*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set != NULL) {
475*3c7ae9deSAndroid Build Coastguard Worker             *was_value_set = true;
476*3c7ae9deSAndroid Build Coastguard Worker         }
477*3c7ae9deSAndroid Build Coastguard Worker 
478*3c7ae9deSAndroid Build Coastguard Worker         if (!optional) {
479*3c7ae9deSAndroid Build Coastguard Worker             return AWS_OP_SUCCESS;
480*3c7ae9deSAndroid Build Coastguard Worker         }
481*3c7ae9deSAndroid Build Coastguard Worker     }
482*3c7ae9deSAndroid Build Coastguard Worker     if (optional) {
483*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_SUCCESS;
484*3c7ae9deSAndroid Build Coastguard Worker     } else {
485*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
486*3c7ae9deSAndroid Build Coastguard Worker     }
487*3c7ae9deSAndroid Build Coastguard Worker }
488*3c7ae9deSAndroid Build Coastguard Worker 
aws_get_boolean_from_jobject(JNIEnv * env,jobject object,jfieldID object_field,char * object_name,char * field_name,uint8_t * result_boolean_int,bool optional,bool * was_value_set)489*3c7ae9deSAndroid Build Coastguard Worker int aws_get_boolean_from_jobject(
490*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
491*3c7ae9deSAndroid Build Coastguard Worker     jobject object,
492*3c7ae9deSAndroid Build Coastguard Worker     jfieldID object_field,
493*3c7ae9deSAndroid Build Coastguard Worker     char *object_name,
494*3c7ae9deSAndroid Build Coastguard Worker     char *field_name,
495*3c7ae9deSAndroid Build Coastguard Worker     uint8_t *result_boolean_int,
496*3c7ae9deSAndroid Build Coastguard Worker     bool optional,
497*3c7ae9deSAndroid Build Coastguard Worker     bool *was_value_set) {
498*3c7ae9deSAndroid Build Coastguard Worker 
499*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set != NULL) {
500*3c7ae9deSAndroid Build Coastguard Worker         *was_value_set = false;
501*3c7ae9deSAndroid Build Coastguard Worker     }
502*3c7ae9deSAndroid Build Coastguard Worker 
503*3c7ae9deSAndroid Build Coastguard Worker     jobject jboolean_obj = (*env)->GetObjectField(env, object, object_field);
504*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
505*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, field_name);
506*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_INVALID_STATE);
507*3c7ae9deSAndroid Build Coastguard Worker     }
508*3c7ae9deSAndroid Build Coastguard Worker     if (jboolean_obj) {
509*3c7ae9deSAndroid Build Coastguard Worker         jboolean jboolean_value =
510*3c7ae9deSAndroid Build Coastguard Worker             (*env)->CallBooleanMethod(env, jboolean_obj, boxed_boolean_properties.boolean_get_value_id);
511*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
512*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
513*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT,
514*3c7ae9deSAndroid Build Coastguard Worker                 "%s create_from_java: Error getting native value from %s",
515*3c7ae9deSAndroid Build Coastguard Worker                 object_name,
516*3c7ae9deSAndroid Build Coastguard Worker                 field_name);
517*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
518*3c7ae9deSAndroid Build Coastguard Worker         }
519*3c7ae9deSAndroid Build Coastguard Worker         *result_boolean_int = (uint8_t)jboolean_value;
520*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set != NULL) {
521*3c7ae9deSAndroid Build Coastguard Worker             *was_value_set = true;
522*3c7ae9deSAndroid Build Coastguard Worker         }
523*3c7ae9deSAndroid Build Coastguard Worker         if (!optional) {
524*3c7ae9deSAndroid Build Coastguard Worker             return AWS_OP_SUCCESS;
525*3c7ae9deSAndroid Build Coastguard Worker         }
526*3c7ae9deSAndroid Build Coastguard Worker     }
527*3c7ae9deSAndroid Build Coastguard Worker 
528*3c7ae9deSAndroid Build Coastguard Worker     if (optional) {
529*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_SUCCESS;
530*3c7ae9deSAndroid Build Coastguard Worker     } else {
531*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
532*3c7ae9deSAndroid Build Coastguard Worker     }
533*3c7ae9deSAndroid Build Coastguard Worker }
534*3c7ae9deSAndroid Build Coastguard Worker 
aws_get_enum_from_jobject(JNIEnv * env,jobject object,jmethodID object_enum_field,char * object_name,char * enum_name,jmethodID enum_value_field,uint32_t * enum_value_destination,bool optional,bool * was_value_set)535*3c7ae9deSAndroid Build Coastguard Worker int aws_get_enum_from_jobject(
536*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
537*3c7ae9deSAndroid Build Coastguard Worker     jobject object,
538*3c7ae9deSAndroid Build Coastguard Worker     jmethodID object_enum_field,
539*3c7ae9deSAndroid Build Coastguard Worker     char *object_name,
540*3c7ae9deSAndroid Build Coastguard Worker     char *enum_name,
541*3c7ae9deSAndroid Build Coastguard Worker     jmethodID enum_value_field,
542*3c7ae9deSAndroid Build Coastguard Worker     uint32_t *enum_value_destination,
543*3c7ae9deSAndroid Build Coastguard Worker     bool optional,
544*3c7ae9deSAndroid Build Coastguard Worker     bool *was_value_set) {
545*3c7ae9deSAndroid Build Coastguard Worker 
546*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set != NULL) {
547*3c7ae9deSAndroid Build Coastguard Worker         *was_value_set = false;
548*3c7ae9deSAndroid Build Coastguard Worker     }
549*3c7ae9deSAndroid Build Coastguard Worker 
550*3c7ae9deSAndroid Build Coastguard Worker     if (enum_value_destination == NULL) {
551*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(
552*3c7ae9deSAndroid Build Coastguard Worker             AWS_LS_MQTT5_CLIENT,
553*3c7ae9deSAndroid Build Coastguard Worker             "%s create_from_java: Error getting %s due to null destination",
554*3c7ae9deSAndroid Build Coastguard Worker             object_name,
555*3c7ae9deSAndroid Build Coastguard Worker             enum_name);
556*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
557*3c7ae9deSAndroid Build Coastguard Worker     }
558*3c7ae9deSAndroid Build Coastguard Worker 
559*3c7ae9deSAndroid Build Coastguard Worker     jobject jni_retain_handling_type = (*env)->CallObjectMethod(env, object, object_enum_field);
560*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
561*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting %s", object_name, enum_name);
562*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_INVALID_STATE);
563*3c7ae9deSAndroid Build Coastguard Worker     }
564*3c7ae9deSAndroid Build Coastguard Worker     if (jni_retain_handling_type) {
565*3c7ae9deSAndroid Build Coastguard Worker         jint enum_value = (*env)->CallIntMethod(env, jni_retain_handling_type, enum_value_field);
566*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
567*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
568*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting native value from %s", object_name, enum_name);
569*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
570*3c7ae9deSAndroid Build Coastguard Worker         }
571*3c7ae9deSAndroid Build Coastguard Worker         if (enum_value < 0) {
572*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
573*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT,
574*3c7ae9deSAndroid Build Coastguard Worker                 "%s create_from_java: Native value from %s is less than 0",
575*3c7ae9deSAndroid Build Coastguard Worker                 object_name,
576*3c7ae9deSAndroid Build Coastguard Worker                 enum_name);
577*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
578*3c7ae9deSAndroid Build Coastguard Worker         } else if ((int32_t)enum_value > UINT16_MAX) {
579*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
580*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT,
581*3c7ae9deSAndroid Build Coastguard Worker                 "%s create_from_java: Native value from %s is more than UINT16_MAX",
582*3c7ae9deSAndroid Build Coastguard Worker                 object_name,
583*3c7ae9deSAndroid Build Coastguard Worker                 enum_name);
584*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
585*3c7ae9deSAndroid Build Coastguard Worker         }
586*3c7ae9deSAndroid Build Coastguard Worker         *enum_value_destination = (int32_t)enum_value;
587*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set != NULL) {
588*3c7ae9deSAndroid Build Coastguard Worker             *was_value_set = true;
589*3c7ae9deSAndroid Build Coastguard Worker         }
590*3c7ae9deSAndroid Build Coastguard Worker         if (!optional) {
591*3c7ae9deSAndroid Build Coastguard Worker             return AWS_OP_SUCCESS;
592*3c7ae9deSAndroid Build Coastguard Worker         }
593*3c7ae9deSAndroid Build Coastguard Worker     }
594*3c7ae9deSAndroid Build Coastguard Worker     if (optional) {
595*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_SUCCESS;
596*3c7ae9deSAndroid Build Coastguard Worker     } else {
597*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
598*3c7ae9deSAndroid Build Coastguard Worker     }
599*3c7ae9deSAndroid Build Coastguard Worker }
600*3c7ae9deSAndroid Build Coastguard Worker 
s_get_user_properties_from_packet_optional(JNIEnv * env,jobject packet,jfieldID packet_field,char * packet_name,size_t * packet_user_property_count,struct aws_array_list * jni_user_properties_holder,struct aws_array_list * jni_user_properties_struct_holder,const struct aws_mqtt5_user_property ** packet_properties)601*3c7ae9deSAndroid Build Coastguard Worker static int s_get_user_properties_from_packet_optional(
602*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
603*3c7ae9deSAndroid Build Coastguard Worker     jobject packet,
604*3c7ae9deSAndroid Build Coastguard Worker     jfieldID packet_field,
605*3c7ae9deSAndroid Build Coastguard Worker     char *packet_name,
606*3c7ae9deSAndroid Build Coastguard Worker     size_t *packet_user_property_count,
607*3c7ae9deSAndroid Build Coastguard Worker     /* Contains buffer_and_cursor_array_holder_struct pointers */
608*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list *jni_user_properties_holder,
609*3c7ae9deSAndroid Build Coastguard Worker     /* Contains aws_mqtt5_user_property pointers */
610*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list *jni_user_properties_struct_holder,
611*3c7ae9deSAndroid Build Coastguard Worker     const struct aws_mqtt5_user_property **packet_properties) {
612*3c7ae9deSAndroid Build Coastguard Worker 
613*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
614*3c7ae9deSAndroid Build Coastguard Worker 
615*3c7ae9deSAndroid Build Coastguard Worker     jobject jni_list = (*env)->GetObjectField(env, packet, packet_field);
616*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
617*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting user properties list", packet_name);
618*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_INVALID_STATE);
619*3c7ae9deSAndroid Build Coastguard Worker     }
620*3c7ae9deSAndroid Build Coastguard Worker     if (jni_list) {
621*3c7ae9deSAndroid Build Coastguard Worker         jint jni_user_properties_size = (*env)->CallIntMethod(env, jni_list, boxed_list_properties.list_size_id);
622*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
623*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
624*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting user properties list size", packet_name);
625*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
626*3c7ae9deSAndroid Build Coastguard Worker         }
627*3c7ae9deSAndroid Build Coastguard Worker         *packet_user_property_count = (size_t)jni_user_properties_size;
628*3c7ae9deSAndroid Build Coastguard Worker         if (AWS_OP_SUCCESS != s_allocate_user_properties_array_holders(
629*3c7ae9deSAndroid Build Coastguard Worker                                   allocator,
630*3c7ae9deSAndroid Build Coastguard Worker                                   jni_user_properties_holder,
631*3c7ae9deSAndroid Build Coastguard Worker                                   jni_user_properties_struct_holder,
632*3c7ae9deSAndroid Build Coastguard Worker                                   *packet_user_property_count)) {
633*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
634*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT, "%s create_from_java: Could not create user properties array", packet_name);
635*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
636*3c7ae9deSAndroid Build Coastguard Worker         }
637*3c7ae9deSAndroid Build Coastguard Worker         int populate_result = s_populate_user_properties(
638*3c7ae9deSAndroid Build Coastguard Worker             env,
639*3c7ae9deSAndroid Build Coastguard Worker             jni_list,
640*3c7ae9deSAndroid Build Coastguard Worker             *packet_user_property_count,
641*3c7ae9deSAndroid Build Coastguard Worker             packet_properties,
642*3c7ae9deSAndroid Build Coastguard Worker             jni_user_properties_holder,
643*3c7ae9deSAndroid Build Coastguard Worker             jni_user_properties_struct_holder);
644*3c7ae9deSAndroid Build Coastguard Worker         if (populate_result != AWS_OP_SUCCESS) {
645*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
646*3c7ae9deSAndroid Build Coastguard Worker         }
647*3c7ae9deSAndroid Build Coastguard Worker     }
648*3c7ae9deSAndroid Build Coastguard Worker     return AWS_OP_SUCCESS;
649*3c7ae9deSAndroid Build Coastguard Worker }
650*3c7ae9deSAndroid Build Coastguard Worker 
s_get_qos_from_packet(JNIEnv * env,jobject packet,jmethodID packet_field,char * packet_name,enum aws_mqtt5_qos * packet_qos,bool optional,bool * was_value_set)651*3c7ae9deSAndroid Build Coastguard Worker static int s_get_qos_from_packet(
652*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
653*3c7ae9deSAndroid Build Coastguard Worker     jobject packet,
654*3c7ae9deSAndroid Build Coastguard Worker     jmethodID packet_field,
655*3c7ae9deSAndroid Build Coastguard Worker     char *packet_name,
656*3c7ae9deSAndroid Build Coastguard Worker     enum aws_mqtt5_qos *packet_qos,
657*3c7ae9deSAndroid Build Coastguard Worker     bool optional,
658*3c7ae9deSAndroid Build Coastguard Worker     bool *was_value_set) {
659*3c7ae9deSAndroid Build Coastguard Worker 
660*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set != NULL) {
661*3c7ae9deSAndroid Build Coastguard Worker         *was_value_set = false;
662*3c7ae9deSAndroid Build Coastguard Worker     }
663*3c7ae9deSAndroid Build Coastguard Worker 
664*3c7ae9deSAndroid Build Coastguard Worker     jobject jni_qos = (*env)->CallObjectMethod(env, packet, packet_field);
665*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
666*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting QoS", packet_name);
667*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
668*3c7ae9deSAndroid Build Coastguard Worker     }
669*3c7ae9deSAndroid Build Coastguard Worker     if (jni_qos) {
670*3c7ae9deSAndroid Build Coastguard Worker         jint jni_qos_value = (*env)->CallIntMethod(env, jni_qos, mqtt5_packet_qos_properties.qos_get_value_id);
671*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
672*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
673*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT, "%s create_from_java: Error getting native value from QoS", packet_name);
674*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
675*3c7ae9deSAndroid Build Coastguard Worker         }
676*3c7ae9deSAndroid Build Coastguard Worker         *packet_qos = (enum aws_mqtt5_qos)jni_qos_value;
677*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set != NULL) {
678*3c7ae9deSAndroid Build Coastguard Worker             *was_value_set = true;
679*3c7ae9deSAndroid Build Coastguard Worker         }
680*3c7ae9deSAndroid Build Coastguard Worker         if (!optional) {
681*3c7ae9deSAndroid Build Coastguard Worker             return AWS_OP_SUCCESS;
682*3c7ae9deSAndroid Build Coastguard Worker         }
683*3c7ae9deSAndroid Build Coastguard Worker     } else {
684*3c7ae9deSAndroid Build Coastguard Worker         if (!optional) {
685*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "%s create_from_java: QoS not found", packet_name);
686*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_STATE);
687*3c7ae9deSAndroid Build Coastguard Worker         }
688*3c7ae9deSAndroid Build Coastguard Worker     }
689*3c7ae9deSAndroid Build Coastguard Worker     if (optional) {
690*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_SUCCESS;
691*3c7ae9deSAndroid Build Coastguard Worker     } else {
692*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
693*3c7ae9deSAndroid Build Coastguard Worker     }
694*3c7ae9deSAndroid Build Coastguard Worker }
695*3c7ae9deSAndroid Build Coastguard Worker 
696*3c7ae9deSAndroid Build Coastguard Worker static char s_connect_packet_string[] = "ConnectPacket";
697*3c7ae9deSAndroid Build Coastguard Worker static char s_disconnect_packet_string[] = "DisconnectPacket";
698*3c7ae9deSAndroid Build Coastguard Worker static char s_publish_packet_string[] = "PublishPacket";
699*3c7ae9deSAndroid Build Coastguard Worker static char s_subscribe_packet_string[] = "SubscribePacket";
700*3c7ae9deSAndroid Build Coastguard Worker static char s_unsubscribe_packet_string[] = "UnsubscribePacket";
701*3c7ae9deSAndroid Build Coastguard Worker 
702*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
703*3c7ae9deSAndroid Build Coastguard Worker  * CONNECT PACKET FUNCTIONS
704*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
705*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_connect_view_java_destroy(JNIEnv * env,struct aws_allocator * allocator,struct aws_mqtt5_packet_connect_view_java_jni * java_packet)706*3c7ae9deSAndroid Build Coastguard Worker void aws_mqtt5_packet_connect_view_java_destroy(
707*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
708*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
709*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_connect_view_java_jni *java_packet) {
710*3c7ae9deSAndroid Build Coastguard Worker     if (!java_packet) {
711*3c7ae9deSAndroid Build Coastguard Worker         return;
712*3c7ae9deSAndroid Build Coastguard Worker     }
713*3c7ae9deSAndroid Build Coastguard Worker     AWS_LOGF_DEBUG(AWS_LS_MQTT5_CLIENT, "id=%p: Destroying ConnectPacket", (void *)java_packet);
714*3c7ae9deSAndroid Build Coastguard Worker 
715*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->client_id_buf)) {
716*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->client_id_buf);
717*3c7ae9deSAndroid Build Coastguard Worker     }
718*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->username_buf)) {
719*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->username_buf);
720*3c7ae9deSAndroid Build Coastguard Worker     }
721*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->password_buf)) {
722*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->password_buf);
723*3c7ae9deSAndroid Build Coastguard Worker     }
724*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet->will_publish_packet) {
725*3c7ae9deSAndroid Build Coastguard Worker         aws_mqtt5_packet_publish_view_java_destroy(env, allocator, java_packet->will_publish_packet);
726*3c7ae9deSAndroid Build Coastguard Worker     }
727*3c7ae9deSAndroid Build Coastguard Worker 
728*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_two_aws_array(
729*3c7ae9deSAndroid Build Coastguard Worker         env, &java_packet->jni_user_properties_holder, &java_packet->jni_user_properties_struct_holder);
730*3c7ae9deSAndroid Build Coastguard Worker     aws_mem_release(allocator, java_packet);
731*3c7ae9deSAndroid Build Coastguard Worker }
732*3c7ae9deSAndroid Build Coastguard Worker 
733*3c7ae9deSAndroid Build Coastguard Worker /**
734*3c7ae9deSAndroid Build Coastguard Worker  * Creates a JNI connack packet from the given Java connack packet and returns it. It creates a new packet but it does
735*3c7ae9deSAndroid Build Coastguard Worker  * NOT free it. You will need to call aws_mqtt5_packet_connect_view_java_destroy when you are done with it.
736*3c7ae9deSAndroid Build Coastguard Worker  */
aws_mqtt5_packet_connect_view_create_from_java(JNIEnv * env,struct aws_allocator * allocator,jobject java_connect_packet)737*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_connect_view_java_jni *aws_mqtt5_packet_connect_view_create_from_java(
738*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
739*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
740*3c7ae9deSAndroid Build Coastguard Worker     jobject java_connect_packet) {
741*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_connect_view_java_jni *java_packet =
742*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_mqtt5_packet_connect_view_java_jni));
743*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet == NULL) {
744*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "ConnectPacket create_from_java: Creating new ConnectPacket failed");
745*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
746*3c7ae9deSAndroid Build Coastguard Worker     }
747*3c7ae9deSAndroid Build Coastguard Worker 
748*3c7ae9deSAndroid Build Coastguard Worker     /* Needed to track if optionals are set or not */
749*3c7ae9deSAndroid Build Coastguard Worker     bool was_value_set = false;
750*3c7ae9deSAndroid Build Coastguard Worker 
751*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_uint16_from_jobject(
752*3c7ae9deSAndroid Build Coastguard Worker             env,
753*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
754*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_keep_alive_interval_seconds_field_id,
755*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
756*3c7ae9deSAndroid Build Coastguard Worker             "keep alive interval seconds",
757*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->keep_alive_interval_seconds,
758*3c7ae9deSAndroid Build Coastguard Worker             true,
759*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
760*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
761*3c7ae9deSAndroid Build Coastguard Worker     }
762*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
763*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.keep_alive_interval_seconds = java_packet->keep_alive_interval_seconds;
764*3c7ae9deSAndroid Build Coastguard Worker     }
765*3c7ae9deSAndroid Build Coastguard Worker 
766*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_string_from_jobject(
767*3c7ae9deSAndroid Build Coastguard Worker             env,
768*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
769*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_client_id_field_id,
770*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
771*3c7ae9deSAndroid Build Coastguard Worker             "client ID",
772*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->client_id_buf,
773*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->client_id_cursor,
774*3c7ae9deSAndroid Build Coastguard Worker             true,
775*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
776*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
777*3c7ae9deSAndroid Build Coastguard Worker     }
778*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
779*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.client_id = java_packet->client_id_cursor;
780*3c7ae9deSAndroid Build Coastguard Worker     }
781*3c7ae9deSAndroid Build Coastguard Worker 
782*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_string_from_jobject(
783*3c7ae9deSAndroid Build Coastguard Worker             env,
784*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
785*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_username_field_id,
786*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
787*3c7ae9deSAndroid Build Coastguard Worker             "username",
788*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->username_buf,
789*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->username_cursor,
790*3c7ae9deSAndroid Build Coastguard Worker             true,
791*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
792*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
793*3c7ae9deSAndroid Build Coastguard Worker     }
794*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
795*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.username = &java_packet->username_cursor;
796*3c7ae9deSAndroid Build Coastguard Worker     }
797*3c7ae9deSAndroid Build Coastguard Worker 
798*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_byte_array_from_jobject(
799*3c7ae9deSAndroid Build Coastguard Worker             env,
800*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
801*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_password_field_id,
802*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
803*3c7ae9deSAndroid Build Coastguard Worker             "password",
804*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->password_buf,
805*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->password_cursor,
806*3c7ae9deSAndroid Build Coastguard Worker             true,
807*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
808*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
809*3c7ae9deSAndroid Build Coastguard Worker     }
810*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
811*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.password = &java_packet->password_cursor;
812*3c7ae9deSAndroid Build Coastguard Worker     }
813*3c7ae9deSAndroid Build Coastguard Worker 
814*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_uint32_from_jobject(
815*3c7ae9deSAndroid Build Coastguard Worker             env,
816*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
817*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_session_expiry_interval_seconds_field_id,
818*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
819*3c7ae9deSAndroid Build Coastguard Worker             "session expiry interval seconds",
820*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->session_expiry_interval_seconds,
821*3c7ae9deSAndroid Build Coastguard Worker             true,
822*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
823*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
824*3c7ae9deSAndroid Build Coastguard Worker     }
825*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
826*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.session_expiry_interval_seconds = &java_packet->session_expiry_interval_seconds;
827*3c7ae9deSAndroid Build Coastguard Worker     }
828*3c7ae9deSAndroid Build Coastguard Worker 
829*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_boolean_from_jobject(
830*3c7ae9deSAndroid Build Coastguard Worker             env,
831*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
832*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_request_response_information_field_id,
833*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
834*3c7ae9deSAndroid Build Coastguard Worker             "request response information",
835*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->request_response_information,
836*3c7ae9deSAndroid Build Coastguard Worker             true,
837*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
838*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
839*3c7ae9deSAndroid Build Coastguard Worker     }
840*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
841*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.request_response_information = &java_packet->request_response_information;
842*3c7ae9deSAndroid Build Coastguard Worker     }
843*3c7ae9deSAndroid Build Coastguard Worker 
844*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_boolean_from_jobject(
845*3c7ae9deSAndroid Build Coastguard Worker             env,
846*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
847*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_request_problem_information_field_id,
848*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
849*3c7ae9deSAndroid Build Coastguard Worker             "request problem information",
850*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->request_problem_information,
851*3c7ae9deSAndroid Build Coastguard Worker             true,
852*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
853*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
854*3c7ae9deSAndroid Build Coastguard Worker     }
855*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
856*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.request_problem_information = &java_packet->request_problem_information;
857*3c7ae9deSAndroid Build Coastguard Worker     }
858*3c7ae9deSAndroid Build Coastguard Worker 
859*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_uint16_from_jobject(
860*3c7ae9deSAndroid Build Coastguard Worker             env,
861*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
862*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_receive_maximum_field_id,
863*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
864*3c7ae9deSAndroid Build Coastguard Worker             "receive maximum",
865*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->receive_maximum,
866*3c7ae9deSAndroid Build Coastguard Worker             true,
867*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
868*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
869*3c7ae9deSAndroid Build Coastguard Worker     }
870*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
871*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.receive_maximum = &java_packet->receive_maximum;
872*3c7ae9deSAndroid Build Coastguard Worker     }
873*3c7ae9deSAndroid Build Coastguard Worker 
874*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_uint32_from_jobject(
875*3c7ae9deSAndroid Build Coastguard Worker             env,
876*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
877*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_maximum_packet_size_bytes_field_id,
878*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
879*3c7ae9deSAndroid Build Coastguard Worker             "maximum packet size",
880*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->maximum_packet_size_bytes,
881*3c7ae9deSAndroid Build Coastguard Worker             true,
882*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
883*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
884*3c7ae9deSAndroid Build Coastguard Worker     }
885*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
886*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.maximum_packet_size_bytes = &java_packet->maximum_packet_size_bytes;
887*3c7ae9deSAndroid Build Coastguard Worker     }
888*3c7ae9deSAndroid Build Coastguard Worker 
889*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_uint32_from_jobject(
890*3c7ae9deSAndroid Build Coastguard Worker             env,
891*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
892*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_will_delay_interval_seconds_field_id,
893*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
894*3c7ae9deSAndroid Build Coastguard Worker             "will delay interval",
895*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->will_delay_interval_seconds,
896*3c7ae9deSAndroid Build Coastguard Worker             true,
897*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
898*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
899*3c7ae9deSAndroid Build Coastguard Worker     }
900*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
901*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.will_delay_interval_seconds = &java_packet->will_delay_interval_seconds;
902*3c7ae9deSAndroid Build Coastguard Worker     }
903*3c7ae9deSAndroid Build Coastguard Worker 
904*3c7ae9deSAndroid Build Coastguard Worker     jobject jni_will_packet =
905*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetObjectField(env, java_connect_packet, mqtt5_connect_packet_properties.connect_will_field_id);
906*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
907*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "ConnectPacket create_from_java: Error getting will packet");
908*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
909*3c7ae9deSAndroid Build Coastguard Worker     }
910*3c7ae9deSAndroid Build Coastguard Worker     if (jni_will_packet) {
911*3c7ae9deSAndroid Build Coastguard Worker         java_packet->will_publish_packet =
912*3c7ae9deSAndroid Build Coastguard Worker             aws_mqtt5_packet_publish_view_create_from_java(env, allocator, jni_will_packet);
913*3c7ae9deSAndroid Build Coastguard Worker         if (java_packet->will_publish_packet == NULL) {
914*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "ConnectPacket create_from_java: Error getting will packet");
915*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
916*3c7ae9deSAndroid Build Coastguard Worker         }
917*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.will = &java_packet->will_publish_packet->packet;
918*3c7ae9deSAndroid Build Coastguard Worker     }
919*3c7ae9deSAndroid Build Coastguard Worker 
920*3c7ae9deSAndroid Build Coastguard Worker     if (s_get_user_properties_from_packet_optional(
921*3c7ae9deSAndroid Build Coastguard Worker             env,
922*3c7ae9deSAndroid Build Coastguard Worker             java_connect_packet,
923*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_connect_packet_properties.connect_user_properties_field_id,
924*3c7ae9deSAndroid Build Coastguard Worker             s_connect_packet_string,
925*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_property_count,
926*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_holder,
927*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_struct_holder,
928*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_properties) == AWS_OP_ERR) {
929*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
930*3c7ae9deSAndroid Build Coastguard Worker     }
931*3c7ae9deSAndroid Build Coastguard Worker 
932*3c7ae9deSAndroid Build Coastguard Worker     return java_packet;
933*3c7ae9deSAndroid Build Coastguard Worker 
934*3c7ae9deSAndroid Build Coastguard Worker on_error:
935*3c7ae9deSAndroid Build Coastguard Worker 
936*3c7ae9deSAndroid Build Coastguard Worker     /* Clean up */
937*3c7ae9deSAndroid Build Coastguard Worker     aws_mqtt5_packet_connect_view_java_destroy(env, allocator, java_packet);
938*3c7ae9deSAndroid Build Coastguard Worker     return NULL;
939*3c7ae9deSAndroid Build Coastguard Worker }
940*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_connect_view_get_packet(struct aws_mqtt5_packet_connect_view_java_jni * java_packet)941*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_connect_view *aws_mqtt5_packet_connect_view_get_packet(
942*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_connect_view_java_jni *java_packet) {
943*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet) {
944*3c7ae9deSAndroid Build Coastguard Worker         return &java_packet->packet;
945*3c7ae9deSAndroid Build Coastguard Worker     } else {
946*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
947*3c7ae9deSAndroid Build Coastguard Worker     }
948*3c7ae9deSAndroid Build Coastguard Worker }
949*3c7ae9deSAndroid Build Coastguard Worker 
950*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
951*3c7ae9deSAndroid Build Coastguard Worker  * PACKET DISCONNECT FUNCTIONS
952*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
953*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_disconnect_view_java_destroy(JNIEnv * env,struct aws_allocator * allocator,struct aws_mqtt5_packet_disconnect_view_java_jni * java_packet)954*3c7ae9deSAndroid Build Coastguard Worker void aws_mqtt5_packet_disconnect_view_java_destroy(
955*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
956*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
957*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_disconnect_view_java_jni *java_packet) {
958*3c7ae9deSAndroid Build Coastguard Worker     if (!java_packet) {
959*3c7ae9deSAndroid Build Coastguard Worker         return;
960*3c7ae9deSAndroid Build Coastguard Worker     }
961*3c7ae9deSAndroid Build Coastguard Worker     AWS_LOGF_DEBUG(AWS_LS_MQTT5_CLIENT, "id=%p: Destroying DisconnectPacket", (void *)java_packet);
962*3c7ae9deSAndroid Build Coastguard Worker 
963*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->reason_string_buf)) {
964*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->reason_string_buf);
965*3c7ae9deSAndroid Build Coastguard Worker     }
966*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->server_reference_buf)) {
967*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->server_reference_buf);
968*3c7ae9deSAndroid Build Coastguard Worker     }
969*3c7ae9deSAndroid Build Coastguard Worker 
970*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_two_aws_array(
971*3c7ae9deSAndroid Build Coastguard Worker         env, &java_packet->jni_user_properties_holder, &java_packet->jni_user_properties_struct_holder);
972*3c7ae9deSAndroid Build Coastguard Worker     aws_mem_release(allocator, java_packet);
973*3c7ae9deSAndroid Build Coastguard Worker }
974*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_disconnect_view_create_from_java(JNIEnv * env,struct aws_allocator * allocator,jobject java_disconnect_packet)975*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_disconnect_view_java_jni *aws_mqtt5_packet_disconnect_view_create_from_java(
976*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
977*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
978*3c7ae9deSAndroid Build Coastguard Worker     jobject java_disconnect_packet) {
979*3c7ae9deSAndroid Build Coastguard Worker 
980*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_disconnect_view_java_jni *java_packet =
981*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_mqtt5_packet_disconnect_view_java_jni));
982*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet == NULL) {
983*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "DisconnectPacket create_from_java: Creating new DisconnectPacket failed");
984*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
985*3c7ae9deSAndroid Build Coastguard Worker     }
986*3c7ae9deSAndroid Build Coastguard Worker 
987*3c7ae9deSAndroid Build Coastguard Worker     /* Needed to track if optionals are set or not */
988*3c7ae9deSAndroid Build Coastguard Worker     bool was_value_set = false;
989*3c7ae9deSAndroid Build Coastguard Worker 
990*3c7ae9deSAndroid Build Coastguard Worker     uint32_t reason_code_enum;
991*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_enum_from_jobject(
992*3c7ae9deSAndroid Build Coastguard Worker             env,
993*3c7ae9deSAndroid Build Coastguard Worker             java_disconnect_packet,
994*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_disconnect_packet_properties.disconnect_get_reason_code_id,
995*3c7ae9deSAndroid Build Coastguard Worker             s_disconnect_packet_string,
996*3c7ae9deSAndroid Build Coastguard Worker             "reason code",
997*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_disconnect_reason_code_properties.code_get_value_id,
998*3c7ae9deSAndroid Build Coastguard Worker             &reason_code_enum,
999*3c7ae9deSAndroid Build Coastguard Worker             true,
1000*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1001*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1002*3c7ae9deSAndroid Build Coastguard Worker     }
1003*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1004*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.reason_code = (enum aws_mqtt5_disconnect_reason_code)reason_code_enum;
1005*3c7ae9deSAndroid Build Coastguard Worker     }
1006*3c7ae9deSAndroid Build Coastguard Worker 
1007*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_uint32_from_jobject(
1008*3c7ae9deSAndroid Build Coastguard Worker             env,
1009*3c7ae9deSAndroid Build Coastguard Worker             java_disconnect_packet,
1010*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_disconnect_packet_properties.disconnect_session_expiry_interval_seconds_field_id,
1011*3c7ae9deSAndroid Build Coastguard Worker             s_disconnect_packet_string,
1012*3c7ae9deSAndroid Build Coastguard Worker             "session expiry interval seconds",
1013*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->session_expiry_interval_seconds,
1014*3c7ae9deSAndroid Build Coastguard Worker             true,
1015*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1016*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1017*3c7ae9deSAndroid Build Coastguard Worker     }
1018*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1019*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.session_expiry_interval_seconds = &java_packet->session_expiry_interval_seconds;
1020*3c7ae9deSAndroid Build Coastguard Worker     }
1021*3c7ae9deSAndroid Build Coastguard Worker 
1022*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_string_from_jobject(
1023*3c7ae9deSAndroid Build Coastguard Worker             env,
1024*3c7ae9deSAndroid Build Coastguard Worker             java_disconnect_packet,
1025*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_disconnect_packet_properties.disconnect_reason_string_field_id,
1026*3c7ae9deSAndroid Build Coastguard Worker             s_disconnect_packet_string,
1027*3c7ae9deSAndroid Build Coastguard Worker             "reason string",
1028*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->reason_string_buf,
1029*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->reason_string_cursor,
1030*3c7ae9deSAndroid Build Coastguard Worker             true,
1031*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1032*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1033*3c7ae9deSAndroid Build Coastguard Worker     }
1034*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1035*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.reason_string = &java_packet->reason_string_cursor;
1036*3c7ae9deSAndroid Build Coastguard Worker     }
1037*3c7ae9deSAndroid Build Coastguard Worker 
1038*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_string_from_jobject(
1039*3c7ae9deSAndroid Build Coastguard Worker             env,
1040*3c7ae9deSAndroid Build Coastguard Worker             java_disconnect_packet,
1041*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_disconnect_packet_properties.disconnect_session_server_reference_field_id,
1042*3c7ae9deSAndroid Build Coastguard Worker             s_disconnect_packet_string,
1043*3c7ae9deSAndroid Build Coastguard Worker             "server reference",
1044*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->server_reference_buf,
1045*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->server_reference_cursor,
1046*3c7ae9deSAndroid Build Coastguard Worker             true,
1047*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1048*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1049*3c7ae9deSAndroid Build Coastguard Worker     }
1050*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1051*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.server_reference = &java_packet->server_reference_cursor;
1052*3c7ae9deSAndroid Build Coastguard Worker     }
1053*3c7ae9deSAndroid Build Coastguard Worker 
1054*3c7ae9deSAndroid Build Coastguard Worker     if (s_get_user_properties_from_packet_optional(
1055*3c7ae9deSAndroid Build Coastguard Worker             env,
1056*3c7ae9deSAndroid Build Coastguard Worker             java_disconnect_packet,
1057*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_disconnect_packet_properties.disconnect_user_properties_field_id,
1058*3c7ae9deSAndroid Build Coastguard Worker             s_disconnect_packet_string,
1059*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_property_count,
1060*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_holder,
1061*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_struct_holder,
1062*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_properties) == AWS_OP_ERR) {
1063*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1064*3c7ae9deSAndroid Build Coastguard Worker     }
1065*3c7ae9deSAndroid Build Coastguard Worker 
1066*3c7ae9deSAndroid Build Coastguard Worker     return java_packet;
1067*3c7ae9deSAndroid Build Coastguard Worker 
1068*3c7ae9deSAndroid Build Coastguard Worker on_error:
1069*3c7ae9deSAndroid Build Coastguard Worker 
1070*3c7ae9deSAndroid Build Coastguard Worker     /* Clean up */
1071*3c7ae9deSAndroid Build Coastguard Worker     aws_mqtt5_packet_disconnect_view_java_destroy(env, allocator, java_packet);
1072*3c7ae9deSAndroid Build Coastguard Worker     return NULL;
1073*3c7ae9deSAndroid Build Coastguard Worker }
1074*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_disconnect_view_get_packet(struct aws_mqtt5_packet_disconnect_view_java_jni * java_packet)1075*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_disconnect_view *aws_mqtt5_packet_disconnect_view_get_packet(
1076*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_disconnect_view_java_jni *java_packet) {
1077*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet) {
1078*3c7ae9deSAndroid Build Coastguard Worker         return &java_packet->packet;
1079*3c7ae9deSAndroid Build Coastguard Worker     } else {
1080*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1081*3c7ae9deSAndroid Build Coastguard Worker     }
1082*3c7ae9deSAndroid Build Coastguard Worker }
1083*3c7ae9deSAndroid Build Coastguard Worker 
1084*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
1085*3c7ae9deSAndroid Build Coastguard Worker  * PUBLISH PACKET FUNCTIONS
1086*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
1087*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_publish_view_java_destroy(JNIEnv * env,struct aws_allocator * allocator,struct aws_mqtt5_packet_publish_view_java_jni * java_packet)1088*3c7ae9deSAndroid Build Coastguard Worker void aws_mqtt5_packet_publish_view_java_destroy(
1089*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
1090*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
1091*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_publish_view_java_jni *java_packet) {
1092*3c7ae9deSAndroid Build Coastguard Worker     if (!java_packet) {
1093*3c7ae9deSAndroid Build Coastguard Worker         return;
1094*3c7ae9deSAndroid Build Coastguard Worker     }
1095*3c7ae9deSAndroid Build Coastguard Worker     AWS_LOGF_DEBUG(AWS_LS_MQTT5_CLIENT, "id=%p: Destroying PublishPacket", (void *)java_packet);
1096*3c7ae9deSAndroid Build Coastguard Worker 
1097*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->payload_buf)) {
1098*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->payload_buf);
1099*3c7ae9deSAndroid Build Coastguard Worker     }
1100*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->topic_buf)) {
1101*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->topic_buf);
1102*3c7ae9deSAndroid Build Coastguard Worker     }
1103*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->response_topic_buf)) {
1104*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->response_topic_buf);
1105*3c7ae9deSAndroid Build Coastguard Worker     }
1106*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->correlation_data_buf)) {
1107*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->correlation_data_buf);
1108*3c7ae9deSAndroid Build Coastguard Worker     }
1109*3c7ae9deSAndroid Build Coastguard Worker     if (aws_byte_buf_is_valid(&java_packet->content_type_buf)) {
1110*3c7ae9deSAndroid Build Coastguard Worker         aws_byte_buf_clean_up(&java_packet->content_type_buf);
1111*3c7ae9deSAndroid Build Coastguard Worker     }
1112*3c7ae9deSAndroid Build Coastguard Worker 
1113*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_two_aws_array(
1114*3c7ae9deSAndroid Build Coastguard Worker         env, &java_packet->jni_user_properties_holder, &java_packet->jni_user_properties_struct_holder);
1115*3c7ae9deSAndroid Build Coastguard Worker     aws_mem_release(allocator, java_packet);
1116*3c7ae9deSAndroid Build Coastguard Worker }
1117*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_publish_view_create_from_java(JNIEnv * env,struct aws_allocator * allocator,jobject java_publish_packet)1118*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_publish_view_java_jni *aws_mqtt5_packet_publish_view_create_from_java(
1119*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
1120*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
1121*3c7ae9deSAndroid Build Coastguard Worker     jobject java_publish_packet) {
1122*3c7ae9deSAndroid Build Coastguard Worker 
1123*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_publish_view_java_jni *java_packet =
1124*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_mqtt5_packet_publish_view_java_jni));
1125*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet == NULL) {
1126*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "PublishPacket create_from_java: Creating new PublishPacket failed");
1127*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1128*3c7ae9deSAndroid Build Coastguard Worker     }
1129*3c7ae9deSAndroid Build Coastguard Worker 
1130*3c7ae9deSAndroid Build Coastguard Worker     /* Needed to track if optionals are set or not */
1131*3c7ae9deSAndroid Build Coastguard Worker     bool was_value_set = false;
1132*3c7ae9deSAndroid Build Coastguard Worker 
1133*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_byte_array_from_jobject(
1134*3c7ae9deSAndroid Build Coastguard Worker             env,
1135*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1136*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_payload_field_id,
1137*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1138*3c7ae9deSAndroid Build Coastguard Worker             "payload",
1139*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->correlation_data_buf,
1140*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->payload_cursor,
1141*3c7ae9deSAndroid Build Coastguard Worker             true,
1142*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1143*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1144*3c7ae9deSAndroid Build Coastguard Worker     }
1145*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1146*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.payload = java_packet->payload_cursor;
1147*3c7ae9deSAndroid Build Coastguard Worker     }
1148*3c7ae9deSAndroid Build Coastguard Worker 
1149*3c7ae9deSAndroid Build Coastguard Worker     if (s_get_qos_from_packet(
1150*3c7ae9deSAndroid Build Coastguard Worker             env,
1151*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1152*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_get_qos_id,
1153*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1154*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.qos,
1155*3c7ae9deSAndroid Build Coastguard Worker             false,
1156*3c7ae9deSAndroid Build Coastguard Worker             NULL) == AWS_OP_ERR) {
1157*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "PublishPacket create_from_java: QOS not found");
1158*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1159*3c7ae9deSAndroid Build Coastguard Worker     }
1160*3c7ae9deSAndroid Build Coastguard Worker 
1161*3c7ae9deSAndroid Build Coastguard Worker     uint8_t packet_retain;
1162*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_boolean_from_jobject(
1163*3c7ae9deSAndroid Build Coastguard Worker             env,
1164*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1165*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_retain_field_id,
1166*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1167*3c7ae9deSAndroid Build Coastguard Worker             "retain",
1168*3c7ae9deSAndroid Build Coastguard Worker             &packet_retain,
1169*3c7ae9deSAndroid Build Coastguard Worker             true,
1170*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1171*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1172*3c7ae9deSAndroid Build Coastguard Worker     }
1173*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1174*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.retain = (bool)packet_retain;
1175*3c7ae9deSAndroid Build Coastguard Worker     }
1176*3c7ae9deSAndroid Build Coastguard Worker 
1177*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_string_from_jobject(
1178*3c7ae9deSAndroid Build Coastguard Worker             env,
1179*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1180*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_topic_field_id,
1181*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1182*3c7ae9deSAndroid Build Coastguard Worker             "topic",
1183*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->topic_buf,
1184*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->topic_cursor,
1185*3c7ae9deSAndroid Build Coastguard Worker             false,
1186*3c7ae9deSAndroid Build Coastguard Worker             NULL) == AWS_OP_ERR) {
1187*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "PublishPacket create_from_java: No topic found");
1188*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1189*3c7ae9deSAndroid Build Coastguard Worker     }
1190*3c7ae9deSAndroid Build Coastguard Worker     java_packet->packet.topic = java_packet->topic_cursor;
1191*3c7ae9deSAndroid Build Coastguard Worker 
1192*3c7ae9deSAndroid Build Coastguard Worker     uint32_t format_enum;
1193*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_enum_from_jobject(
1194*3c7ae9deSAndroid Build Coastguard Worker             env,
1195*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1196*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_get_payload_format_id,
1197*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1198*3c7ae9deSAndroid Build Coastguard Worker             "payload format",
1199*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_payload_format_indicator_properties.format_get_value_id,
1200*3c7ae9deSAndroid Build Coastguard Worker             &format_enum,
1201*3c7ae9deSAndroid Build Coastguard Worker             true,
1202*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1203*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1204*3c7ae9deSAndroid Build Coastguard Worker     }
1205*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1206*3c7ae9deSAndroid Build Coastguard Worker         java_packet->payload_format = (enum aws_mqtt5_payload_format_indicator)format_enum;
1207*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.payload_format = &java_packet->payload_format;
1208*3c7ae9deSAndroid Build Coastguard Worker     }
1209*3c7ae9deSAndroid Build Coastguard Worker 
1210*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_uint32_from_jobject(
1211*3c7ae9deSAndroid Build Coastguard Worker             env,
1212*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1213*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_message_expiry_interval_seconds_field_id,
1214*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1215*3c7ae9deSAndroid Build Coastguard Worker             "message expiry interval seconds",
1216*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->message_expiry_interval_seconds,
1217*3c7ae9deSAndroid Build Coastguard Worker             true,
1218*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1219*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1220*3c7ae9deSAndroid Build Coastguard Worker     }
1221*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1222*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.message_expiry_interval_seconds = &java_packet->message_expiry_interval_seconds;
1223*3c7ae9deSAndroid Build Coastguard Worker     }
1224*3c7ae9deSAndroid Build Coastguard Worker 
1225*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_uint16_from_jobject(
1226*3c7ae9deSAndroid Build Coastguard Worker             env,
1227*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1228*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_topic_alias_field_id,
1229*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1230*3c7ae9deSAndroid Build Coastguard Worker             "topic alias",
1231*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->topic_alias,
1232*3c7ae9deSAndroid Build Coastguard Worker             true,
1233*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1234*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1235*3c7ae9deSAndroid Build Coastguard Worker     }
1236*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1237*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.topic_alias = &java_packet->topic_alias;
1238*3c7ae9deSAndroid Build Coastguard Worker     }
1239*3c7ae9deSAndroid Build Coastguard Worker 
1240*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_string_from_jobject(
1241*3c7ae9deSAndroid Build Coastguard Worker             env,
1242*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1243*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_response_topic_field_id,
1244*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1245*3c7ae9deSAndroid Build Coastguard Worker             "response topic",
1246*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->response_topic_buf,
1247*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->response_topic_cursor,
1248*3c7ae9deSAndroid Build Coastguard Worker             true,
1249*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1250*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1251*3c7ae9deSAndroid Build Coastguard Worker     }
1252*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1253*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.response_topic = &java_packet->response_topic_cursor;
1254*3c7ae9deSAndroid Build Coastguard Worker     }
1255*3c7ae9deSAndroid Build Coastguard Worker 
1256*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_byte_array_from_jobject(
1257*3c7ae9deSAndroid Build Coastguard Worker             env,
1258*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1259*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_correlation_data_field_id,
1260*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1261*3c7ae9deSAndroid Build Coastguard Worker             "correlation data",
1262*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->correlation_data_buf,
1263*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->correlation_data_cursor,
1264*3c7ae9deSAndroid Build Coastguard Worker             true,
1265*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1266*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1267*3c7ae9deSAndroid Build Coastguard Worker     }
1268*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1269*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.correlation_data = &java_packet->correlation_data_cursor;
1270*3c7ae9deSAndroid Build Coastguard Worker     }
1271*3c7ae9deSAndroid Build Coastguard Worker 
1272*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_string_from_jobject(
1273*3c7ae9deSAndroid Build Coastguard Worker             env,
1274*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1275*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_content_type_field_id,
1276*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1277*3c7ae9deSAndroid Build Coastguard Worker             "content type",
1278*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->content_type_buf,
1279*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->content_type_cursor,
1280*3c7ae9deSAndroid Build Coastguard Worker             true,
1281*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1282*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1283*3c7ae9deSAndroid Build Coastguard Worker     }
1284*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1285*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.content_type = &java_packet->content_type_cursor;
1286*3c7ae9deSAndroid Build Coastguard Worker     }
1287*3c7ae9deSAndroid Build Coastguard Worker 
1288*3c7ae9deSAndroid Build Coastguard Worker     if (s_get_user_properties_from_packet_optional(
1289*3c7ae9deSAndroid Build Coastguard Worker             env,
1290*3c7ae9deSAndroid Build Coastguard Worker             java_publish_packet,
1291*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_publish_packet_properties.publish_user_properties_field_id,
1292*3c7ae9deSAndroid Build Coastguard Worker             s_publish_packet_string,
1293*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_property_count,
1294*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_holder,
1295*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_struct_holder,
1296*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_properties) == AWS_OP_ERR) {
1297*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1298*3c7ae9deSAndroid Build Coastguard Worker     }
1299*3c7ae9deSAndroid Build Coastguard Worker 
1300*3c7ae9deSAndroid Build Coastguard Worker     return java_packet;
1301*3c7ae9deSAndroid Build Coastguard Worker 
1302*3c7ae9deSAndroid Build Coastguard Worker on_error:
1303*3c7ae9deSAndroid Build Coastguard Worker 
1304*3c7ae9deSAndroid Build Coastguard Worker     /* Clean up */
1305*3c7ae9deSAndroid Build Coastguard Worker     aws_mqtt5_packet_publish_view_java_destroy(env, allocator, java_packet);
1306*3c7ae9deSAndroid Build Coastguard Worker     return NULL;
1307*3c7ae9deSAndroid Build Coastguard Worker }
1308*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_publish_view_get_packet(struct aws_mqtt5_packet_publish_view_java_jni * java_packet)1309*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_publish_view *aws_mqtt5_packet_publish_view_get_packet(
1310*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_publish_view_java_jni *java_packet) {
1311*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet) {
1312*3c7ae9deSAndroid Build Coastguard Worker         return &java_packet->packet;
1313*3c7ae9deSAndroid Build Coastguard Worker     } else {
1314*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1315*3c7ae9deSAndroid Build Coastguard Worker     }
1316*3c7ae9deSAndroid Build Coastguard Worker }
1317*3c7ae9deSAndroid Build Coastguard Worker 
1318*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
1319*3c7ae9deSAndroid Build Coastguard Worker  * SUBSCRIBE PACKET FUNCTIONS
1320*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
1321*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_subscribe_view_java_destroy(JNIEnv * env,struct aws_allocator * allocator,struct aws_mqtt5_packet_subscribe_view_java_jni * java_packet)1322*3c7ae9deSAndroid Build Coastguard Worker void aws_mqtt5_packet_subscribe_view_java_destroy(
1323*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
1324*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
1325*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_subscribe_view_java_jni *java_packet) {
1326*3c7ae9deSAndroid Build Coastguard Worker     if (!java_packet) {
1327*3c7ae9deSAndroid Build Coastguard Worker         return;
1328*3c7ae9deSAndroid Build Coastguard Worker     }
1329*3c7ae9deSAndroid Build Coastguard Worker     AWS_LOGF_DEBUG(AWS_LS_MQTT5_CLIENT, "id=%p: Destroying SubscribePacket", (void *)java_packet);
1330*3c7ae9deSAndroid Build Coastguard Worker 
1331*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_two_aws_array(
1332*3c7ae9deSAndroid Build Coastguard Worker         env, &java_packet->jni_user_properties_holder, &java_packet->jni_user_properties_struct_holder);
1333*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_two_aws_array(env, &java_packet->jni_subscription_topic_filters, &java_packet->topic_filters);
1334*3c7ae9deSAndroid Build Coastguard Worker     aws_mem_release(allocator, java_packet);
1335*3c7ae9deSAndroid Build Coastguard Worker }
1336*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_subscribe_view_create_from_java(JNIEnv * env,struct aws_allocator * allocator,jobject java_subscribe_packet)1337*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_subscribe_view_java_jni *aws_mqtt5_packet_subscribe_view_create_from_java(
1338*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
1339*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
1340*3c7ae9deSAndroid Build Coastguard Worker     jobject java_subscribe_packet) {
1341*3c7ae9deSAndroid Build Coastguard Worker 
1342*3c7ae9deSAndroid Build Coastguard Worker     jobject jni_subscriptions = (*env)->GetObjectField(
1343*3c7ae9deSAndroid Build Coastguard Worker         env, java_subscribe_packet, mqtt5_subscribe_packet_properties.subscribe_subscriptions_field_id);
1344*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
1345*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1346*3c7ae9deSAndroid Build Coastguard Worker     }
1347*3c7ae9deSAndroid Build Coastguard Worker     if (!jni_subscriptions) {
1348*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(
1349*3c7ae9deSAndroid Build Coastguard Worker             AWS_LS_MQTT5_CLIENT,
1350*3c7ae9deSAndroid Build Coastguard Worker             "SubscribePacket create_from_java: Creating new SubscribePacket failed due to no subscriptions!");
1351*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1352*3c7ae9deSAndroid Build Coastguard Worker     }
1353*3c7ae9deSAndroid Build Coastguard Worker     jint jni_subscriptions_size = (*env)->CallIntMethod(env, jni_subscriptions, boxed_list_properties.list_size_id);
1354*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
1355*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1356*3c7ae9deSAndroid Build Coastguard Worker     }
1357*3c7ae9deSAndroid Build Coastguard Worker     size_t subscriptions_filter_size = (size_t)jni_subscriptions_size;
1358*3c7ae9deSAndroid Build Coastguard Worker 
1359*3c7ae9deSAndroid Build Coastguard Worker     if (subscriptions_filter_size <= 0) {
1360*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "SubscribePacket create_from_java: subscriptions count is 0");
1361*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1362*3c7ae9deSAndroid Build Coastguard Worker     }
1363*3c7ae9deSAndroid Build Coastguard Worker 
1364*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_subscribe_view_java_jni *java_packet =
1365*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_mqtt5_packet_subscribe_view_java_jni));
1366*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet == NULL) {
1367*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "SubscribePacket create_from_java: Creating new SubscribePacket failed");
1368*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1369*3c7ae9deSAndroid Build Coastguard Worker     }
1370*3c7ae9deSAndroid Build Coastguard Worker     int array_init = aws_array_list_init_dynamic(
1371*3c7ae9deSAndroid Build Coastguard Worker         &java_packet->topic_filters, allocator, subscriptions_filter_size, sizeof(struct aws_mqtt5_subscription_view));
1372*3c7ae9deSAndroid Build Coastguard Worker     if (array_init != AWS_OP_SUCCESS) {
1373*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "SubscribePacket create_from_java: Creating new SubscribePacket failed");
1374*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1375*3c7ae9deSAndroid Build Coastguard Worker     }
1376*3c7ae9deSAndroid Build Coastguard Worker     int jni_array_init = aws_array_list_init_dynamic(
1377*3c7ae9deSAndroid Build Coastguard Worker         &java_packet->jni_subscription_topic_filters,
1378*3c7ae9deSAndroid Build Coastguard Worker         allocator,
1379*3c7ae9deSAndroid Build Coastguard Worker         subscriptions_filter_size,
1380*3c7ae9deSAndroid Build Coastguard Worker         sizeof(struct buffer_and_cursor_array_holder_struct));
1381*3c7ae9deSAndroid Build Coastguard Worker     if (jni_array_init != AWS_OP_SUCCESS) {
1382*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "SubscribePacket create_from_java: Creating new SubscribePacket failed");
1383*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1384*3c7ae9deSAndroid Build Coastguard Worker     }
1385*3c7ae9deSAndroid Build Coastguard Worker 
1386*3c7ae9deSAndroid Build Coastguard Worker     /* Needed to track if optionals are set or not */
1387*3c7ae9deSAndroid Build Coastguard Worker     bool was_value_set = false;
1388*3c7ae9deSAndroid Build Coastguard Worker 
1389*3c7ae9deSAndroid Build Coastguard Worker     if (aws_get_uint32_from_jobject(
1390*3c7ae9deSAndroid Build Coastguard Worker             env,
1391*3c7ae9deSAndroid Build Coastguard Worker             java_subscribe_packet,
1392*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_subscribe_packet_properties.subscribe_subscription_identifier_field_id,
1393*3c7ae9deSAndroid Build Coastguard Worker             s_subscribe_packet_string,
1394*3c7ae9deSAndroid Build Coastguard Worker             "subscription identifier",
1395*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->subscription_identifier,
1396*3c7ae9deSAndroid Build Coastguard Worker             true,
1397*3c7ae9deSAndroid Build Coastguard Worker             &was_value_set) == AWS_OP_ERR) {
1398*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1399*3c7ae9deSAndroid Build Coastguard Worker     }
1400*3c7ae9deSAndroid Build Coastguard Worker     if (was_value_set) {
1401*3c7ae9deSAndroid Build Coastguard Worker         java_packet->packet.subscription_identifier = &java_packet->subscription_identifier;
1402*3c7ae9deSAndroid Build Coastguard Worker     }
1403*3c7ae9deSAndroid Build Coastguard Worker 
1404*3c7ae9deSAndroid Build Coastguard Worker     java_packet->packet.subscription_count = subscriptions_filter_size;
1405*3c7ae9deSAndroid Build Coastguard Worker     for (size_t i = 0; i < subscriptions_filter_size; i++) {
1406*3c7ae9deSAndroid Build Coastguard Worker         /* Populate */
1407*3c7ae9deSAndroid Build Coastguard Worker         struct aws_mqtt5_subscription_view subscription_view;
1408*3c7ae9deSAndroid Build Coastguard Worker         struct buffer_and_cursor_array_holder_struct holder;
1409*3c7ae9deSAndroid Build Coastguard Worker 
1410*3c7ae9deSAndroid Build Coastguard Worker         jobject jni_packet_subscribe_subscription =
1411*3c7ae9deSAndroid Build Coastguard Worker             (*env)->CallObjectMethod(env, jni_subscriptions, boxed_list_properties.list_get_id, (jint)i);
1412*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
1413*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "SubscribePacket create_from_java: Error getting topic filters");
1414*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
1415*3c7ae9deSAndroid Build Coastguard Worker         }
1416*3c7ae9deSAndroid Build Coastguard Worker 
1417*3c7ae9deSAndroid Build Coastguard Worker         jstring jni_topic_filter = (jstring)(*env)->CallObjectMethod(
1418*3c7ae9deSAndroid Build Coastguard Worker             env, jni_packet_subscribe_subscription, mqtt5_subscription_properties.subscribe_get_topic_filter_id);
1419*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
1420*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
1421*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT, "SubscribePacket create_from_java: Error getting subscription topic filter");
1422*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
1423*3c7ae9deSAndroid Build Coastguard Worker         }
1424*3c7ae9deSAndroid Build Coastguard Worker         if (jni_topic_filter) {
1425*3c7ae9deSAndroid Build Coastguard Worker             // Get a temporary cursor from JNI, copy it, and then destroy the JNI version, leaving the byte_buffer copy.
1426*3c7ae9deSAndroid Build Coastguard Worker             // This gets around JNI stuff going out of scope.
1427*3c7ae9deSAndroid Build Coastguard Worker             struct aws_byte_cursor tmp_cursor = aws_jni_byte_cursor_from_jstring_acquire(env, jni_topic_filter);
1428*3c7ae9deSAndroid Build Coastguard Worker             aws_byte_buf_init_copy_from_cursor(&holder.buffer, aws_jni_get_allocator(), tmp_cursor);
1429*3c7ae9deSAndroid Build Coastguard Worker             holder.cursor = aws_byte_cursor_from_buf(&holder.buffer);
1430*3c7ae9deSAndroid Build Coastguard Worker             aws_jni_byte_cursor_from_jstring_release(env, jni_topic_filter, tmp_cursor);
1431*3c7ae9deSAndroid Build Coastguard Worker             subscription_view.topic_filter = holder.cursor;
1432*3c7ae9deSAndroid Build Coastguard Worker             jni_topic_filter = NULL;
1433*3c7ae9deSAndroid Build Coastguard Worker         } else {
1434*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
1435*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT, "SubscribePacket create_from_java: subscription topic filter is required");
1436*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
1437*3c7ae9deSAndroid Build Coastguard Worker         }
1438*3c7ae9deSAndroid Build Coastguard Worker 
1439*3c7ae9deSAndroid Build Coastguard Worker         if (s_get_qos_from_packet(
1440*3c7ae9deSAndroid Build Coastguard Worker                 env,
1441*3c7ae9deSAndroid Build Coastguard Worker                 jni_packet_subscribe_subscription,
1442*3c7ae9deSAndroid Build Coastguard Worker                 mqtt5_subscription_properties.subscribe_get_qos_id,
1443*3c7ae9deSAndroid Build Coastguard Worker                 s_subscribe_packet_string,
1444*3c7ae9deSAndroid Build Coastguard Worker                 &subscription_view.qos,
1445*3c7ae9deSAndroid Build Coastguard Worker                 false,
1446*3c7ae9deSAndroid Build Coastguard Worker                 NULL) == AWS_OP_ERR) {
1447*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "SubscribePacket create_from_java: subscription QoS is required");
1448*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
1449*3c7ae9deSAndroid Build Coastguard Worker         }
1450*3c7ae9deSAndroid Build Coastguard Worker 
1451*3c7ae9deSAndroid Build Coastguard Worker         uint8_t subscription_no_local;
1452*3c7ae9deSAndroid Build Coastguard Worker         if (aws_get_boolean_from_jobject(
1453*3c7ae9deSAndroid Build Coastguard Worker                 env,
1454*3c7ae9deSAndroid Build Coastguard Worker                 jni_packet_subscribe_subscription,
1455*3c7ae9deSAndroid Build Coastguard Worker                 mqtt5_subscription_properties.subscribe_no_local_field_id,
1456*3c7ae9deSAndroid Build Coastguard Worker                 s_subscribe_packet_string,
1457*3c7ae9deSAndroid Build Coastguard Worker                 "no local",
1458*3c7ae9deSAndroid Build Coastguard Worker                 &subscription_no_local,
1459*3c7ae9deSAndroid Build Coastguard Worker                 true,
1460*3c7ae9deSAndroid Build Coastguard Worker                 &was_value_set) != AWS_OP_SUCCESS) {
1461*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
1462*3c7ae9deSAndroid Build Coastguard Worker         }
1463*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set) {
1464*3c7ae9deSAndroid Build Coastguard Worker             subscription_view.no_local = (bool)subscription_no_local;
1465*3c7ae9deSAndroid Build Coastguard Worker         }
1466*3c7ae9deSAndroid Build Coastguard Worker 
1467*3c7ae9deSAndroid Build Coastguard Worker         uint8_t retain_as_published;
1468*3c7ae9deSAndroid Build Coastguard Worker         if (aws_get_boolean_from_jobject(
1469*3c7ae9deSAndroid Build Coastguard Worker                 env,
1470*3c7ae9deSAndroid Build Coastguard Worker                 jni_packet_subscribe_subscription,
1471*3c7ae9deSAndroid Build Coastguard Worker                 mqtt5_subscription_properties.subscribe_retain_as_published_field_id,
1472*3c7ae9deSAndroid Build Coastguard Worker                 s_subscribe_packet_string,
1473*3c7ae9deSAndroid Build Coastguard Worker                 "retain as published",
1474*3c7ae9deSAndroid Build Coastguard Worker                 &retain_as_published,
1475*3c7ae9deSAndroid Build Coastguard Worker                 true,
1476*3c7ae9deSAndroid Build Coastguard Worker                 &was_value_set) != AWS_OP_SUCCESS) {
1477*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
1478*3c7ae9deSAndroid Build Coastguard Worker         }
1479*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set) {
1480*3c7ae9deSAndroid Build Coastguard Worker             subscription_view.retain_as_published = (bool)retain_as_published;
1481*3c7ae9deSAndroid Build Coastguard Worker         }
1482*3c7ae9deSAndroid Build Coastguard Worker 
1483*3c7ae9deSAndroid Build Coastguard Worker         uint32_t retain_enum;
1484*3c7ae9deSAndroid Build Coastguard Worker         if (aws_get_enum_from_jobject(
1485*3c7ae9deSAndroid Build Coastguard Worker                 env,
1486*3c7ae9deSAndroid Build Coastguard Worker                 jni_packet_subscribe_subscription,
1487*3c7ae9deSAndroid Build Coastguard Worker                 mqtt5_subscription_properties.subscribe_get_retain_handling_type_id,
1488*3c7ae9deSAndroid Build Coastguard Worker                 s_subscribe_packet_string,
1489*3c7ae9deSAndroid Build Coastguard Worker                 "subscription retain handling type",
1490*3c7ae9deSAndroid Build Coastguard Worker                 mqtt5_retain_handling_type_properties.retain_get_value_id,
1491*3c7ae9deSAndroid Build Coastguard Worker                 &retain_enum,
1492*3c7ae9deSAndroid Build Coastguard Worker                 true,
1493*3c7ae9deSAndroid Build Coastguard Worker                 &was_value_set) == AWS_OP_ERR) {
1494*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
1495*3c7ae9deSAndroid Build Coastguard Worker         }
1496*3c7ae9deSAndroid Build Coastguard Worker         if (was_value_set) {
1497*3c7ae9deSAndroid Build Coastguard Worker             subscription_view.retain_handling_type = (enum aws_mqtt5_retain_handling_type)retain_enum;
1498*3c7ae9deSAndroid Build Coastguard Worker         }
1499*3c7ae9deSAndroid Build Coastguard Worker 
1500*3c7ae9deSAndroid Build Coastguard Worker         aws_array_list_push_back(&java_packet->topic_filters, (void *)&subscription_view);
1501*3c7ae9deSAndroid Build Coastguard Worker         aws_array_list_push_back(&java_packet->jni_subscription_topic_filters, (void *)&holder);
1502*3c7ae9deSAndroid Build Coastguard Worker     }
1503*3c7ae9deSAndroid Build Coastguard Worker     java_packet->packet.subscriptions = (struct aws_mqtt5_subscription_view *)java_packet->topic_filters.data;
1504*3c7ae9deSAndroid Build Coastguard Worker 
1505*3c7ae9deSAndroid Build Coastguard Worker     if (s_get_user_properties_from_packet_optional(
1506*3c7ae9deSAndroid Build Coastguard Worker             env,
1507*3c7ae9deSAndroid Build Coastguard Worker             java_subscribe_packet,
1508*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_subscribe_packet_properties.subscribe_user_properties_field_id,
1509*3c7ae9deSAndroid Build Coastguard Worker             s_subscribe_packet_string,
1510*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_property_count,
1511*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_holder,
1512*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_struct_holder,
1513*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_properties) == AWS_OP_ERR) {
1514*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1515*3c7ae9deSAndroid Build Coastguard Worker     }
1516*3c7ae9deSAndroid Build Coastguard Worker 
1517*3c7ae9deSAndroid Build Coastguard Worker     return java_packet;
1518*3c7ae9deSAndroid Build Coastguard Worker 
1519*3c7ae9deSAndroid Build Coastguard Worker on_error:
1520*3c7ae9deSAndroid Build Coastguard Worker 
1521*3c7ae9deSAndroid Build Coastguard Worker     /* Clean up */
1522*3c7ae9deSAndroid Build Coastguard Worker     aws_mqtt5_packet_subscribe_view_java_destroy(env, allocator, java_packet);
1523*3c7ae9deSAndroid Build Coastguard Worker     return NULL;
1524*3c7ae9deSAndroid Build Coastguard Worker }
1525*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_subscribe_view_get_packet(struct aws_mqtt5_packet_subscribe_view_java_jni * java_packet)1526*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_subscribe_view *aws_mqtt5_packet_subscribe_view_get_packet(
1527*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_subscribe_view_java_jni *java_packet) {
1528*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet) {
1529*3c7ae9deSAndroid Build Coastguard Worker         return &java_packet->packet;
1530*3c7ae9deSAndroid Build Coastguard Worker     } else {
1531*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1532*3c7ae9deSAndroid Build Coastguard Worker     }
1533*3c7ae9deSAndroid Build Coastguard Worker }
1534*3c7ae9deSAndroid Build Coastguard Worker 
1535*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
1536*3c7ae9deSAndroid Build Coastguard Worker  * UNSUBSCRIBE PACKET FUNCTIONS
1537*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
1538*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_unsubscribe_view_java_destroy(JNIEnv * env,struct aws_allocator * allocator,struct aws_mqtt5_packet_unsubscribe_view_java_jni * java_packet)1539*3c7ae9deSAndroid Build Coastguard Worker void aws_mqtt5_packet_unsubscribe_view_java_destroy(
1540*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
1541*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
1542*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_unsubscribe_view_java_jni *java_packet) {
1543*3c7ae9deSAndroid Build Coastguard Worker     if (!java_packet) {
1544*3c7ae9deSAndroid Build Coastguard Worker         return;
1545*3c7ae9deSAndroid Build Coastguard Worker     }
1546*3c7ae9deSAndroid Build Coastguard Worker     AWS_LOGF_DEBUG(AWS_LS_MQTT5_CLIENT, "id=%p: Destroying UnsubscribePacket", (void *)java_packet);
1547*3c7ae9deSAndroid Build Coastguard Worker 
1548*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_two_aws_array(
1549*3c7ae9deSAndroid Build Coastguard Worker         env, &java_packet->jni_user_properties_holder, &java_packet->jni_user_properties_struct_holder);
1550*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_two_aws_array(env, &java_packet->jni_topic_filters, &java_packet->topic_filters);
1551*3c7ae9deSAndroid Build Coastguard Worker     aws_mem_release(allocator, java_packet);
1552*3c7ae9deSAndroid Build Coastguard Worker }
1553*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_unsubscribe_view_create_from_java(JNIEnv * env,struct aws_allocator * allocator,jobject java_unsubscribe_packet)1554*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_unsubscribe_view_java_jni *aws_mqtt5_packet_unsubscribe_view_create_from_java(
1555*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
1556*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
1557*3c7ae9deSAndroid Build Coastguard Worker     jobject java_unsubscribe_packet) {
1558*3c7ae9deSAndroid Build Coastguard Worker 
1559*3c7ae9deSAndroid Build Coastguard Worker     jobject jni_topic_filters = (*env)->GetObjectField(
1560*3c7ae9deSAndroid Build Coastguard Worker         env, java_unsubscribe_packet, mqtt5_unsubscribe_packet_properties.unsubscribe_subscriptions_field_id);
1561*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
1562*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1563*3c7ae9deSAndroid Build Coastguard Worker     }
1564*3c7ae9deSAndroid Build Coastguard Worker     if (!jni_topic_filters) {
1565*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(
1566*3c7ae9deSAndroid Build Coastguard Worker             AWS_LS_MQTT5_CLIENT,
1567*3c7ae9deSAndroid Build Coastguard Worker             "UnsubscribePacket create_from_java: Creating new UnsubscribePacket failed due to no topic filters");
1568*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1569*3c7ae9deSAndroid Build Coastguard Worker     }
1570*3c7ae9deSAndroid Build Coastguard Worker 
1571*3c7ae9deSAndroid Build Coastguard Worker     size_t topic_filter_size = 0;
1572*3c7ae9deSAndroid Build Coastguard Worker     jint jni_topic_filter_size = (*env)->CallIntMethod(env, jni_topic_filters, boxed_list_properties.list_size_id);
1573*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
1574*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(
1575*3c7ae9deSAndroid Build Coastguard Worker             AWS_LS_MQTT5_CLIENT,
1576*3c7ae9deSAndroid Build Coastguard Worker             "UnsubscribePacket create_from_java: Created new UnsubscribePacket failed due to no topic filters");
1577*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1578*3c7ae9deSAndroid Build Coastguard Worker     }
1579*3c7ae9deSAndroid Build Coastguard Worker     int32_t jni_topic_filter_size_check = (int32_t)jni_topic_filter_size;
1580*3c7ae9deSAndroid Build Coastguard Worker     if (jni_topic_filter_size_check < 0) {
1581*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(AWS_LS_MQTT5_CLIENT, "UnsubscribePacket create_from_java: No topic filters found");
1582*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1583*3c7ae9deSAndroid Build Coastguard Worker     } else {
1584*3c7ae9deSAndroid Build Coastguard Worker         topic_filter_size = (size_t)jni_topic_filter_size;
1585*3c7ae9deSAndroid Build Coastguard Worker     }
1586*3c7ae9deSAndroid Build Coastguard Worker 
1587*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_unsubscribe_view_java_jni *java_packet =
1588*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_mqtt5_packet_unsubscribe_view_java_jni));
1589*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet == NULL) {
1590*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(
1591*3c7ae9deSAndroid Build Coastguard Worker             AWS_LS_MQTT5_CLIENT, "UnsubscribePacket create_from_java: Creating new UnsubscribePacket failed");
1592*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1593*3c7ae9deSAndroid Build Coastguard Worker     }
1594*3c7ae9deSAndroid Build Coastguard Worker     int array_init = aws_array_list_init_dynamic(
1595*3c7ae9deSAndroid Build Coastguard Worker         &java_packet->topic_filters, allocator, topic_filter_size, sizeof(struct aws_byte_cursor));
1596*3c7ae9deSAndroid Build Coastguard Worker     if (array_init != AWS_OP_SUCCESS) {
1597*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(
1598*3c7ae9deSAndroid Build Coastguard Worker             AWS_LS_MQTT5_CLIENT, "UnsubscribePacket create_from_java: Creating new UnsubscribePacket failed");
1599*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1600*3c7ae9deSAndroid Build Coastguard Worker     }
1601*3c7ae9deSAndroid Build Coastguard Worker     int jni_array_init = aws_array_list_init_dynamic(
1602*3c7ae9deSAndroid Build Coastguard Worker         &java_packet->jni_topic_filters,
1603*3c7ae9deSAndroid Build Coastguard Worker         allocator,
1604*3c7ae9deSAndroid Build Coastguard Worker         topic_filter_size,
1605*3c7ae9deSAndroid Build Coastguard Worker         sizeof(struct buffer_and_cursor_array_holder_struct));
1606*3c7ae9deSAndroid Build Coastguard Worker     if (jni_array_init != AWS_OP_SUCCESS) {
1607*3c7ae9deSAndroid Build Coastguard Worker         AWS_LOGF_ERROR(
1608*3c7ae9deSAndroid Build Coastguard Worker             AWS_LS_MQTT5_CLIENT, "UnsubscribePacket create_from_java: Creating new UnsubscribePacket failed");
1609*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1610*3c7ae9deSAndroid Build Coastguard Worker     }
1611*3c7ae9deSAndroid Build Coastguard Worker 
1612*3c7ae9deSAndroid Build Coastguard Worker     java_packet->packet.topic_filter_count = topic_filter_size;
1613*3c7ae9deSAndroid Build Coastguard Worker 
1614*3c7ae9deSAndroid Build Coastguard Worker     for (size_t i = 0; i < topic_filter_size; i++) {
1615*3c7ae9deSAndroid Build Coastguard Worker         /* Populate */
1616*3c7ae9deSAndroid Build Coastguard Worker         struct buffer_and_cursor_array_holder_struct holder;
1617*3c7ae9deSAndroid Build Coastguard Worker 
1618*3c7ae9deSAndroid Build Coastguard Worker         jstring jni_topic_filter =
1619*3c7ae9deSAndroid Build Coastguard Worker             (jstring)(*env)->CallObjectMethod(env, jni_topic_filters, boxed_list_properties.list_get_id, (jint)i);
1620*3c7ae9deSAndroid Build Coastguard Worker         if (aws_jni_check_and_clear_exception(env)) {
1621*3c7ae9deSAndroid Build Coastguard Worker             AWS_LOGF_ERROR(
1622*3c7ae9deSAndroid Build Coastguard Worker                 AWS_LS_MQTT5_CLIENT, "UnsubscribePacket create_from_java: Error getting subscription topic filter");
1623*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
1624*3c7ae9deSAndroid Build Coastguard Worker         }
1625*3c7ae9deSAndroid Build Coastguard Worker         if (jni_topic_filter) {
1626*3c7ae9deSAndroid Build Coastguard Worker             // Get a temporary cursor from JNI, copy it, and then destroy the JNI version, leaving the byte_buffer copy.
1627*3c7ae9deSAndroid Build Coastguard Worker             // This gets around JNI stuff going out of scope.
1628*3c7ae9deSAndroid Build Coastguard Worker             struct aws_byte_cursor tmp_cursor = aws_jni_byte_cursor_from_jstring_acquire(env, jni_topic_filter);
1629*3c7ae9deSAndroid Build Coastguard Worker             aws_byte_buf_init_copy_from_cursor(&holder.buffer, aws_jni_get_allocator(), tmp_cursor);
1630*3c7ae9deSAndroid Build Coastguard Worker             holder.cursor = aws_byte_cursor_from_buf(&holder.buffer);
1631*3c7ae9deSAndroid Build Coastguard Worker             aws_jni_byte_cursor_from_jstring_release(env, jni_topic_filter, tmp_cursor);
1632*3c7ae9deSAndroid Build Coastguard Worker             jni_topic_filter = NULL;
1633*3c7ae9deSAndroid Build Coastguard Worker         }
1634*3c7ae9deSAndroid Build Coastguard Worker         aws_array_list_push_back(&java_packet->topic_filters, (void *)&holder.cursor);
1635*3c7ae9deSAndroid Build Coastguard Worker         aws_array_list_push_back(&java_packet->jni_topic_filters, (void *)&holder);
1636*3c7ae9deSAndroid Build Coastguard Worker     }
1637*3c7ae9deSAndroid Build Coastguard Worker     java_packet->packet.topic_filters = (struct aws_byte_cursor *)java_packet->topic_filters.data;
1638*3c7ae9deSAndroid Build Coastguard Worker 
1639*3c7ae9deSAndroid Build Coastguard Worker     if (s_get_user_properties_from_packet_optional(
1640*3c7ae9deSAndroid Build Coastguard Worker             env,
1641*3c7ae9deSAndroid Build Coastguard Worker             java_unsubscribe_packet,
1642*3c7ae9deSAndroid Build Coastguard Worker             mqtt5_unsubscribe_packet_properties.unsubscribe_user_properties_field_id,
1643*3c7ae9deSAndroid Build Coastguard Worker             s_unsubscribe_packet_string,
1644*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_property_count,
1645*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_holder,
1646*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->jni_user_properties_struct_holder,
1647*3c7ae9deSAndroid Build Coastguard Worker             &java_packet->packet.user_properties) == AWS_OP_ERR) {
1648*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
1649*3c7ae9deSAndroid Build Coastguard Worker     }
1650*3c7ae9deSAndroid Build Coastguard Worker 
1651*3c7ae9deSAndroid Build Coastguard Worker     return java_packet;
1652*3c7ae9deSAndroid Build Coastguard Worker 
1653*3c7ae9deSAndroid Build Coastguard Worker on_error:
1654*3c7ae9deSAndroid Build Coastguard Worker 
1655*3c7ae9deSAndroid Build Coastguard Worker     /* Clean up */
1656*3c7ae9deSAndroid Build Coastguard Worker     aws_mqtt5_packet_unsubscribe_view_java_destroy(env, allocator, java_packet);
1657*3c7ae9deSAndroid Build Coastguard Worker     return NULL;
1658*3c7ae9deSAndroid Build Coastguard Worker }
1659*3c7ae9deSAndroid Build Coastguard Worker 
aws_mqtt5_packet_unsubscribe_view_get_packet(struct aws_mqtt5_packet_unsubscribe_view_java_jni * java_packet)1660*3c7ae9deSAndroid Build Coastguard Worker struct aws_mqtt5_packet_unsubscribe_view *aws_mqtt5_packet_unsubscribe_view_get_packet(
1661*3c7ae9deSAndroid Build Coastguard Worker     struct aws_mqtt5_packet_unsubscribe_view_java_jni *java_packet) {
1662*3c7ae9deSAndroid Build Coastguard Worker     if (java_packet) {
1663*3c7ae9deSAndroid Build Coastguard Worker         return &java_packet->packet;
1664*3c7ae9deSAndroid Build Coastguard Worker     } else {
1665*3c7ae9deSAndroid Build Coastguard Worker         return NULL;
1666*3c7ae9deSAndroid Build Coastguard Worker     }
1667*3c7ae9deSAndroid Build Coastguard Worker }
1668*3c7ae9deSAndroid Build Coastguard Worker 
1669*3c7ae9deSAndroid Build Coastguard Worker #if UINTPTR_MAX == 0xffffffff
1670*3c7ae9deSAndroid Build Coastguard Worker #    if defined(_MSC_VER)
1671*3c7ae9deSAndroid Build Coastguard Worker #        pragma warning(pop)
1672*3c7ae9deSAndroid Build Coastguard Worker #    else
1673*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic pop
1674*3c7ae9deSAndroid Build Coastguard Worker #    endif
1675*3c7ae9deSAndroid Build Coastguard Worker #endif
1676