@@ -378,16 +378,6 @@ int aws_mqtt5_packet_connect_view_validate(const struct aws_mqtt5_packet_connect
378378 }
379379 }
380380
381- if (connect_options -> metrics != NULL ) {
382- if (aws_mqtt_validate_iot_sdk_metrics_utf8 (connect_options -> metrics )) {
383- AWS_LOGF_ERROR (
384- AWS_LS_MQTT5_GENERAL ,
385- "id=%p: aws_mqtt5_packet_connect_view - metrics not valid UTF-8" ,
386- (void * )connect_options );
387- return aws_raise_error (AWS_ERROR_MQTT5_CONNECT_OPTIONS_VALIDATION );
388- }
389- }
390-
391381 if (connect_options -> receive_maximum != NULL ) {
392382 if (* connect_options -> receive_maximum == 0 ) {
393383 AWS_LOGF_ERROR (
@@ -645,7 +635,9 @@ void aws_mqtt5_packet_connect_storage_clean_up(struct aws_mqtt5_packet_connect_s
645635 aws_byte_buf_clean_up_secure (& storage -> storage );
646636}
647637
648- static size_t s_aws_mqtt5_packet_connect_compute_storage_size (const struct aws_mqtt5_packet_connect_view * view ) {
638+ static size_t s_aws_mqtt5_packet_connect_compute_storage_size (
639+ const struct aws_mqtt5_packet_connect_view * view ,
640+ const struct aws_mqtt5_client_options * options ) {
649641 if (view == NULL ) {
650642 return 0 ;
651643 }
@@ -654,10 +646,10 @@ static size_t s_aws_mqtt5_packet_connect_compute_storage_size(const struct aws_m
654646
655647 storage_size += view -> client_id .len ;
656648 if (view -> username != NULL ) {
657- if (view -> metrics ) {
649+ if (options && options -> metrics ) {
658650 size_t username_size = 0 ;
659651 aws_mqtt_append_sdk_metrics_to_username (
660- aws_default_allocator (), view -> username , * view -> metrics , NULL , & username_size );
652+ aws_default_allocator (), view -> username , * options -> metrics , NULL , & username_size );
661653 storage_size += username_size ;
662654 } else {
663655 storage_size += view -> username -> len ;
@@ -670,8 +662,6 @@ static size_t s_aws_mqtt5_packet_connect_compute_storage_size(const struct aws_m
670662 storage_size +=
671663 s_aws_mqtt5_user_property_set_compute_storage_size (view -> user_properties , view -> user_property_count );
672664
673- storage_size += aws_mqtt_iot_sdk_metrics_compute_storage_size (view -> metrics );
674-
675665 if (view -> authentication_method != NULL ) {
676666 storage_size += view -> authentication_method -> len ;
677667 }
@@ -686,12 +676,13 @@ static size_t s_aws_mqtt5_packet_connect_compute_storage_size(const struct aws_m
686676int aws_mqtt5_packet_connect_storage_init (
687677 struct aws_mqtt5_packet_connect_storage * storage ,
688678 struct aws_allocator * allocator ,
689- const struct aws_mqtt5_packet_connect_view * view ) {
679+ const struct aws_mqtt5_packet_connect_view * view ,
680+ const struct aws_mqtt5_client_options * client_config ) {
690681 AWS_ZERO_STRUCT (* storage );
691682
692683 struct aws_mqtt5_packet_connect_view * storage_view = & storage -> storage_view ;
693684
694- size_t storage_capacity = s_aws_mqtt5_packet_connect_compute_storage_size (view );
685+ size_t storage_capacity = s_aws_mqtt5_packet_connect_compute_storage_size (view , client_config );
695686 if (aws_byte_buf_init (& storage -> storage , allocator , storage_capacity )) {
696687 return AWS_OP_ERR ;
697688 }
@@ -710,10 +701,10 @@ int aws_mqtt5_packet_connect_storage_init(
710701 AWS_ZERO_STRUCT (metrics_username_buf );
711702
712703 /* Apply metrics to username if configured */
713- if (view -> metrics ) {
704+ if (client_config -> metrics != NULL ) {
714705 struct aws_byte_cursor username_cur = storage -> username ;
715706 if (aws_mqtt_append_sdk_metrics_to_username (
716- allocator , & username_cur , * view -> metrics , & metrics_username_buf , NULL )) {
707+ allocator , & username_cur , * client_config -> metrics , & metrics_username_buf , NULL )) {
717708 return AWS_OP_ERR ;
718709 }
719710 storage -> username = aws_byte_cursor_from_buf (& metrics_username_buf );
@@ -846,7 +837,8 @@ static void s_destroy_operation_connect(void *object) {
846837
847838struct aws_mqtt5_operation_connect * aws_mqtt5_operation_connect_new (
848839 struct aws_allocator * allocator ,
849- const struct aws_mqtt5_packet_connect_view * connect_options ) {
840+ const struct aws_mqtt5_packet_connect_view * connect_options ,
841+ const struct aws_mqtt5_client_options * client_config ) {
850842 AWS_PRECONDITION (allocator != NULL );
851843 AWS_PRECONDITION (connect_options != NULL );
852844
@@ -867,7 +859,8 @@ struct aws_mqtt5_operation_connect *aws_mqtt5_operation_connect_new(
867859 aws_priority_queue_node_init (& connect_op -> base .priority_queue_node );
868860 connect_op -> base .impl = connect_op ;
869861
870- if (aws_mqtt5_packet_connect_storage_init (& connect_op -> options_storage , allocator , connect_options )) {
862+ if (aws_mqtt5_packet_connect_storage_init (
863+ & connect_op -> options_storage , allocator , connect_options , client_config )) {
871864 goto error ;
872865 }
873866
@@ -3420,6 +3413,13 @@ int aws_mqtt5_client_options_validate(const struct aws_mqtt5_client_options *opt
34203413 }
34213414 }
34223415
3416+ if (options -> metrics != NULL ) {
3417+ if (aws_mqtt_validate_iot_sdk_metrics_utf8 (options -> metrics )) {
3418+ AWS_LOGF_ERROR (AWS_LS_MQTT5_GENERAL , "invalid metrics in mqtt5 client configuration" );
3419+ return aws_raise_error (AWS_ERROR_MQTT5_CONNECT_OPTIONS_VALIDATION );
3420+ }
3421+ }
3422+
34233423 return AWS_OP_SUCCESS ;
34243424}
34253425
@@ -3835,21 +3835,28 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
38353835 return NULL ;
38363836 }
38373837
3838+ struct aws_mqtt5_client_options * options_view = & options_storage -> options ;
3839+
38383840 options_storage -> allocator = allocator ;
38393841 options_storage -> host_name = aws_string_new_from_cursor (allocator , & options -> host_name );
3842+ options_view -> host_name = aws_byte_cursor_from_string (options_storage -> host_name );
38403843 if (options_storage -> host_name == NULL ) {
38413844 goto error ;
38423845 }
38433846
38443847 options_storage -> port = options -> port ;
3848+ options_view -> port = options_storage -> port ;
3849+
38453850 options_storage -> bootstrap = aws_client_bootstrap_acquire (options -> bootstrap );
3851+ options_view -> bootstrap = options_storage -> bootstrap ;
38463852
38473853 if (options -> socket_options != NULL ) {
38483854 options_storage -> socket_options = * options -> socket_options ;
38493855 } else {
38503856 options_storage -> socket_options .type = AWS_SOCKET_STREAM ;
38513857 options_storage -> socket_options .connect_timeout_ms = AWS_MQTT5_DEFAULT_SOCKET_CONNECT_TIMEOUT_MS ;
38523858 }
3859+ options_view -> socket_options = & options_storage -> socket_options ;
38533860
38543861 if (options -> tls_options != NULL ) {
38553862 if (aws_tls_connection_options_copy (& options_storage -> tls_options , options -> tls_options )) {
@@ -3866,6 +3873,7 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
38663873 }
38673874 }
38683875 }
3876+ options_view -> tls_options = options_storage -> tls_options_ptr ;
38693877
38703878 if (options -> http_proxy_options != NULL ) {
38713879 /* Ignore a specified proxy connection type and use TUNNEL unconditionally as only this proxy type works. */
@@ -3878,32 +3886,50 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
38783886 aws_http_proxy_options_init_from_config (
38793887 & options_storage -> http_proxy_options , options_storage -> http_proxy_config );
38803888 }
3889+ options_view -> http_proxy_options = options -> http_proxy_options ;
38813890
38823891 options_storage -> websocket_handshake_transform = options -> websocket_handshake_transform ;
3892+ options_view -> websocket_handshake_transform = options_storage -> websocket_handshake_transform ;
38833893 options_storage -> websocket_handshake_transform_user_data = options -> websocket_handshake_transform_user_data ;
3894+ options_view -> websocket_handshake_transform_user_data = options_storage -> websocket_handshake_transform_user_data ;
38843895
38853896 options_storage -> publish_received_handler = options -> publish_received_handler ;
3897+ options_view -> publish_received_handler = options_storage -> publish_received_handler ;
38863898 options_storage -> publish_received_handler_user_data = options -> publish_received_handler_user_data ;
3899+ options_view -> publish_received_handler_user_data = options_storage -> publish_received_handler_user_data ;
38873900
38883901 options_storage -> session_behavior = options -> session_behavior ;
3902+ options_view -> session_behavior = options_storage -> session_behavior ;
38893903 options_storage -> extended_validation_and_flow_control_options =
38903904 options -> extended_validation_and_flow_control_options ;
3905+ options_view -> extended_validation_and_flow_control_options =
3906+ options_storage -> extended_validation_and_flow_control_options ;
38913907 options_storage -> offline_queue_behavior = options -> offline_queue_behavior ;
3908+ options_view -> offline_queue_behavior = options_storage -> offline_queue_behavior ;
38923909
38933910 options_storage -> retry_jitter_mode = options -> retry_jitter_mode ;
3911+ options_view -> retry_jitter_mode = options_storage -> retry_jitter_mode ;
38943912 options_storage -> min_reconnect_delay_ms = options -> min_reconnect_delay_ms ;
3913+ options_view -> min_reconnect_delay_ms = options_storage -> min_reconnect_delay_ms ;
38953914 options_storage -> max_reconnect_delay_ms = options -> max_reconnect_delay_ms ;
3915+ options_view -> max_reconnect_delay_ms = options_storage -> max_reconnect_delay_ms ;
38963916 options_storage -> min_connected_time_to_reset_reconnect_delay_ms =
38973917 options -> min_connected_time_to_reset_reconnect_delay_ms ;
3918+ options_view -> min_connected_time_to_reset_reconnect_delay_ms =
3919+ options_storage -> min_connected_time_to_reset_reconnect_delay_ms ;
38983920
38993921 options_storage -> ping_timeout_ms = options -> ping_timeout_ms ;
3922+ options_view -> ping_timeout_ms = options_storage -> ping_timeout_ms ;
39003923 options_storage -> connack_timeout_ms = options -> connack_timeout_ms ;
3924+ options_view -> connack_timeout_ms = options_storage -> connack_timeout_ms ;
39013925
39023926 options_storage -> ack_timeout_seconds = options -> ack_timeout_seconds ;
3927+ options_view -> ack_timeout_seconds = options_storage -> ack_timeout_seconds ;
39033928
39043929 if (options -> topic_aliasing_options != NULL ) {
39053930 options_storage -> topic_aliasing_options = * options -> topic_aliasing_options ;
39063931 }
3932+ options_view -> topic_aliasing_options = & options_storage -> topic_aliasing_options ;
39073933
39083934 struct aws_byte_buf auto_assign_id_buf ;
39093935 AWS_ZERO_STRUCT (auto_assign_id_buf );
@@ -3965,18 +3991,23 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
39653991
39663992 options_storage -> connect = aws_mem_calloc (allocator , 1 , sizeof (struct aws_mqtt5_packet_connect_storage ));
39673993 int connect_storage_result =
3968- aws_mqtt5_packet_connect_storage_init (options_storage -> connect , allocator , & connect_options );
3994+ aws_mqtt5_packet_connect_storage_init (options_storage -> connect , allocator , & connect_options , options );
39693995
39703996 aws_byte_buf_clean_up (& auto_assign_id_buf );
39713997 if (connect_storage_result != AWS_OP_SUCCESS ) {
39723998 goto error ;
39733999 }
4000+ options_view -> connect_options = & options_storage -> connect -> storage_view ;
39744001
39754002 options_storage -> lifecycle_event_handler = options -> lifecycle_event_handler ;
4003+ options_view -> lifecycle_event_handler = options_storage -> lifecycle_event_handler ;
39764004 options_storage -> lifecycle_event_handler_user_data = options -> lifecycle_event_handler_user_data ;
4005+ options_view -> lifecycle_event_handler_user_data = options_storage -> lifecycle_event_handler_user_data ;
39774006
39784007 options_storage -> client_termination_handler = options -> client_termination_handler ;
4008+ options_view -> client_termination_handler = options_storage -> client_termination_handler ;
39794009 options_storage -> client_termination_handler_user_data = options -> client_termination_handler_user_data ;
4010+ options_view -> client_termination_handler_user_data = options_storage -> client_termination_handler_user_data ;
39804011
39814012 s_apply_zero_valued_defaults_to_client_options_storage (options_storage );
39824013
@@ -3988,6 +4019,11 @@ struct aws_mqtt5_client_options_storage *aws_mqtt5_client_options_storage_new(
39884019 options_storage -> host_resolution_override .resolve_frequency_ns = aws_timestamp_convert (
39894020 options_storage -> max_reconnect_delay_ms , AWS_TIMESTAMP_MILLIS , AWS_TIMESTAMP_NANOS , NULL );
39904021 }
4022+ options_view -> host_resolution_override = & options_storage -> host_resolution_override ;
4023+
4024+ // TODO: Placehold for metrics storage implemnetation.
4025+ // options_storage->metrics = options->metrics;
4026+ // options_view->metrics = options_storage->metrics;
39914027
39924028 return options_storage ;
39934029
0 commit comments