summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacobkeeler <jacob.keeler@livioradio.com>2021-04-14 16:50:29 -0400
committerjacobkeeler <jacob.keeler@livioradio.com>2021-04-14 16:50:29 -0400
commit1b3f0f4c83769a6e63893075122b9bda52a28282 (patch)
treebb372e2cbb5c63953a685aa6ec18a032939eb52e
parentba49ca4c7b953385a1ce2963a8f6e439271f0d2d (diff)
parent6fbff3ab06b04fadc29f8dce5feb5ad98556ea14 (diff)
downloadsdl_core-feature/update_travis_20_04.tar.gz
Merge remote-tracking branch 'origin/develop' into feature/update_travis_20_04feature/update_travis_20_04
-rw-r--r--.github/PULL_REQUEST_TEMPLATE.md2
-rw-r--r--src/3rd_party/CMakeLists.txt25
-rwxr-xr-xsrc/appMain/hmi_capabilities.json154
-rw-r--r--src/appMain/sdl_preloaded_pt.json74
-rw-r--r--src/appMain/smartDeviceLink.ini3
-rw-r--r--src/components/application_manager/include/application_manager/application.h9
-rw-r--r--src/components/application_manager/include/application_manager/application_impl.h3
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h21
-rw-r--r--src/components/application_manager/include/application_manager/hmi_capabilities_impl.h5
-rw-r--r--src/components/application_manager/include/application_manager/message_helper.h18
-rw-r--r--src/components/application_manager/include/application_manager/policies/policy_handler.h4
-rw-r--r--src/components/application_manager/include/application_manager/smart_object_keys.h10
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc6
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt5
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h64
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h2
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h12
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h19
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h10
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h50
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h81
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h10
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h6
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h25
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc63
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc13
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc7
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc69
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc40
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc26
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc4
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc80
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc32
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc6
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc75
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc94
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc90
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc18
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc13
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc180
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc5
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc9
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc10
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc101
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc53
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc203
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc41
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc19
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc107
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc43
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc21
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc388
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc4
-rw-r--r--src/components/application_manager/src/application_impl.cc36
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc189
-rw-r--r--src/components/application_manager/src/application_state.cc2
-rw-r--r--src/components/application_manager/src/hmi_capabilities_impl.cc16
-rw-r--r--src/components/application_manager/src/message_helper/message_helper.cc53
-rw-r--r--src/components/application_manager/src/policies/policy_handler.cc17
-rw-r--r--src/components/application_manager/src/resumption/resumption_data_processor_impl.cc25
-rw-r--r--src/components/application_manager/src/rpc_service_impl.cc5
-rw-r--r--src/components/application_manager/src/smart_object_keys.cc11
-rw-r--r--src/components/application_manager/test/application_impl_test.cc26
-rw-r--r--src/components/application_manager/test/hmi_capabilities_test.cc35
-rw-r--r--src/components/application_manager/test/include/application_manager/commands/commands_test.h25
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_application.h5
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h2
-rw-r--r--src/components/application_manager/test/include/application_manager/mock_message_helper.h6
-rw-r--r--src/components/application_manager/test/mock_message_helper.cc8
-rw-r--r--src/components/application_manager/test/policy_handler_test.cc13
-rw-r--r--src/components/config_profile/include/config_profile/profile.h6
-rw-r--r--src/components/config_profile/src/profile.cc11
-rw-r--r--src/components/connection_handler/include/connection_handler/connection_handler_impl.h2
-rw-r--r--src/components/connection_handler/src/connection_handler_impl.cc37
-rw-r--r--src/components/connection_handler/test/connection_handler_impl_test.cc69
-rw-r--r--src/components/hmi_message_handler/include/hmi_message_handler/websocket_session.h3
-rw-r--r--src/components/hmi_message_handler/src/websocket_session.cc16
-rw-r--r--src/components/include/application_manager/application_manager.h13
-rw-r--r--src/components/include/application_manager/hmi_capabilities.h17
-rw-r--r--src/components/include/application_manager/policies/policy_handler_interface.h14
-rw-r--r--src/components/include/connection_handler/connection_handler.h20
-rw-r--r--src/components/include/connection_handler/connection_handler_observer.h8
-rw-r--r--src/components/include/media_manager/media_manager.h8
-rw-r--r--src/components/include/policy/policy_external/policy/policy_manager.h18
-rw-r--r--src/components/include/policy/policy_regular/policy/policy_manager.h13
-rw-r--r--src/components/include/protocol/bson_object_keys.h6
-rw-r--r--src/components/include/protocol_handler/protocol_handler.h16
-rw-r--r--src/components/include/protocol_handler/session_observer.h7
-rw-r--r--src/components/include/security_manager/security_manager_settings.h1
-rw-r--r--src/components/include/test/application_manager/mock_application_manager.h8
-rw-r--r--src/components/include/test/application_manager/policies/mock_policy_handler_interface.h3
-rw-r--r--src/components/include/test/connection_handler/mock_connection_handler.h2
-rw-r--r--src/components/include/test/connection_handler/mock_connection_handler_observer.h2
-rw-r--r--src/components/include/test/media_manager/mock_media_manager.h1
-rw-r--r--src/components/include/test/policy/policy_external/policy/mock_cache_manager.h2
-rw-r--r--src/components/include/test/policy/policy_external/policy/mock_policy_manager.h3
-rw-r--r--src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h2
-rw-r--r--src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h2
-rw-r--r--src/components/include/test/protocol_handler/mock_protocol_handler.h4
-rw-r--r--src/components/include/test/security_manager/mock_security_manager_settings.h1
-rw-r--r--src/components/include/utils/semantic_version.h6
-rw-r--r--src/components/interfaces/HMI_API.xml211
-rw-r--r--src/components/media_manager/include/media_manager/media_manager_impl.h10
-rw-r--r--src/components/media_manager/src/file_streamer_adapter.cc2
-rw-r--r--src/components/media_manager/src/media_manager_impl.cc75
-rw-r--r--src/components/media_manager/src/pipe_streamer_adapter.cc2
-rw-r--r--src/components/media_manager/src/socket_streamer_adapter.cc2
-rw-r--r--src/components/media_manager/src/streamer_adapter.cc4
-rw-r--r--src/components/media_manager/test/media_manager_impl_test.cc14
-rw-r--r--src/components/policy/policy_external/include/policy/cache_manager.h10
-rw-r--r--src/components/policy/policy_external/include/policy/cache_manager_interface.h14
-rw-r--r--src/components/policy/policy_external/include/policy/policy_manager_impl.h9
-rw-r--r--src/components/policy/policy_external/include/policy/policy_table/types.h1
-rw-r--r--src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml2
-rw-r--r--src/components/policy/policy_external/include/policy/policy_types.h1
-rw-r--r--src/components/policy/policy_external/include/policy/pt_ext_representation.h8
-rw-r--r--src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h1
-rw-r--r--src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h4
-rw-r--r--src/components/policy/policy_external/src/cache_manager.cc25
-rw-r--r--src/components/policy/policy_external/src/policy_manager_impl.cc18
-rw-r--r--src/components/policy/policy_external/src/policy_table/types.cc18
-rw-r--r--src/components/policy/policy_external/src/sql_pt_ext_queries.cc15
-rw-r--r--src/components/policy/policy_external/src/sql_pt_ext_representation.cc34
-rw-r--r--src/components/policy/policy_external/src/sql_pt_queries.cc1
-rw-r--r--src/components/policy/policy_external/test/CMakeLists.txt2
-rw-r--r--src/components/policy/policy_external/test/cache_manager_test.cc12
-rw-r--r--src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h1
-rw-r--r--src/components/policy/policy_external/test/sql_pt_ext_representation_storage_test.cc2
-rw-r--r--src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc334
-rw-r--r--src/components/policy/policy_external/test/sql_pt_representation_test.cc442
-rw-r--r--src/components/policy/policy_regular/include/policy/cache_manager.h10
-rw-r--r--src/components/policy/policy_regular/include/policy/cache_manager_interface.h14
-rw-r--r--src/components/policy/policy_regular/include/policy/policy_manager_impl.h4
-rw-r--r--src/components/policy/policy_regular/include/policy/policy_table/types.h1
-rw-r--r--src/components/policy/policy_regular/include/policy/policy_types.h1
-rw-r--r--src/components/policy/policy_regular/include/policy/pt_representation.h8
-rw-r--r--src/components/policy/policy_regular/include/policy/sql_pt_queries.h1
-rw-r--r--src/components/policy/policy_regular/include/policy/sql_pt_representation.h3
-rw-r--r--src/components/policy/policy_regular/src/cache_manager.cc24
-rw-r--r--src/components/policy/policy_regular/src/policy_manager_impl.cc11
-rw-r--r--src/components/policy/policy_regular/src/policy_table/types.cc13
-rw-r--r--src/components/policy/policy_regular/src/sql_pt_queries.cc11
-rw-r--r--src/components/policy/policy_regular/src/sql_pt_representation.cc25
-rw-r--r--src/components/policy/policy_regular/test/CMakeLists.txt1
-rw-r--r--src/components/policy/policy_regular/test/cache_manager_test.cc12
-rw-r--r--src/components/policy/policy_regular/test/policy_manager_impl_test.cc14
-rw-r--r--src/components/policy/policy_regular/test/sql_pt_representation_test.cc498
-rw-r--r--src/components/protocol/src/bson_object_keys.cc6
-rw-r--r--src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h33
-rw-r--r--src/components/protocol_handler/src/handshake_handler.cc6
-rw-r--r--src/components/protocol_handler/src/incoming_data_handler.cc18
-rw-r--r--src/components/protocol_handler/src/multiframe_builder.cc20
-rw-r--r--src/components/protocol_handler/src/protocol_handler_impl.cc226
-rw-r--r--src/components/protocol_handler/src/protocol_packet.cc4
-rw-r--r--src/components/protocol_handler/test/protocol_handler_tm_test.cc549
-rw-r--r--src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h4
-rw-r--r--src/components/security_manager/src/crypto_manager_impl.cc23
-rw-r--r--src/components/security_manager/src/ssl_context_impl.cc11
-rw-r--r--src/components/security_manager/test/crypto_manager_impl_test.cc7
-rw-r--r--src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h4
-rw-r--r--src/components/transport_manager/include/transport_manager/cloud/websocket_client_connection.h1
-rw-r--r--src/components/transport_manager/include/transport_manager/websocket_server/websocket_device.h2
-rw-r--r--src/components/transport_manager/include/transport_manager/websocket_server/websocket_session.h2
-rw-r--r--src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc58
-rw-r--r--src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc2
-rw-r--r--src/components/transport_manager/src/cloud/websocket_client_connection.cc2
-rw-r--r--src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc6
-rw-r--r--src/components/transport_manager/src/transport_manager_impl.cc12
-rw-r--r--src/components/transport_manager/src/websocket_server/websocket_secure_session.cc8
-rw-r--r--src/components/transport_manager/src/websocket_server/websocket_session.cc19
-rw-r--r--src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h2
-rw-r--r--src/components/transport_manager/test/include/transport_manager/websocket_server/websocket_sample_client.h1
-rw-r--r--src/components/transport_manager/test/sample_websocket_server.cc9
-rw-r--r--src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc7
-rw-r--r--src/components/utils/test/policy.sql1
-rwxr-xr-xtools/InterfaceGenerator/generator/generators/SmartFactoryBase.py19
-rwxr-xr-x[-rw-r--r--]tools/infrastructure/api_compare.py62
-rw-r--r--tools/infrastructure/format_src.py37
-rw-r--r--tools/infrastructure/install_hooks.py8
-rw-r--r--tools/intergen/test/test_hmi_interface.xml6
m---------tools/rpc_spec0
199 files changed, 4209 insertions, 2225 deletions
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 301a22eafe..319edc5458 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,4 +1,4 @@
-[Things to note: Pull Requests **must** fix an issue. Discussion about the feature / bug takes place in the issue, discussion of the implementation takes place in the PR. Please also see the [Contributing Guide](https://github.com/smartdevicelink/sdl_core/blob/master/.github/CONTRIBUTING.md) for information on branch naming and the CLA, and the [SmartDeviceLink GitHub Best Practices](https://d83tozu1c8tt6.cloudfront.net/media/resources/SDL_GitHub_BestPractices.pdf) document for more information on how to enter a pull request. Once this PR is ready for review, please request one from @theresalech.
+[Things to note: Pull Requests **must** fix an issue. Discussion about the feature / bug takes place in the issue, discussion of the implementation takes place in the PR. Please also see the [Contributing Guide](https://github.com/smartdevicelink/sdl_core/blob/master/.github/CONTRIBUTING.md) for information on branch naming and the CLA, and the [SmartDeviceLink GitHub Best Practices](https://d83tozu1c8tt6.cloudfront.net/media/resources/SDL_GitHub_BestPractices.pdf) document for more information on how to enter a pull request. Once this PR is ready for review, please request one from @JackLivio.
Delete the above section when you've read it.]
diff --git a/src/3rd_party/CMakeLists.txt b/src/3rd_party/CMakeLists.txt
index 0fdc0ba013..26baeca3eb 100644
--- a/src/3rd_party/CMakeLists.txt
+++ b/src/3rd_party/CMakeLists.txt
@@ -221,13 +221,14 @@ else()
endif()
set(BOOST_ROOT ${3RD_PARTY_INSTALL_PREFIX})
-find_package(Boost 1.66.0 COMPONENTS system thread date_time filesystem regex)
-set(BOOST_LIB_SOURCE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/boost_src)
-set(BOOST_LIBS_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX}/lib)
-set(BOOST_INCLUDE_DIR ${3RD_PARTY_INSTALL_PREFIX}/include PARENT_SCOPE)
-SET_PROPERTY(GLOBAL PROPERTY GLOBAL_BOOST_LIBS ${BOOST_LIBS_DIRECTORY})
+set(Boost_NO_BOOST_CMAKE ON)
+find_package(Boost 1.72.0 COMPONENTS system thread date_time filesystem regex)
if (NOT ${Boost_FOUND})
- message(STATUS "Did not find boost. Downloading and installing boost 1.66")
+ set(BOOST_LIB_SOURCE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/boost_src)
+ set(BOOST_LIBS_DIRECTORY ${3RD_PARTY_INSTALL_PREFIX}/lib)
+ set(BOOST_INCLUDE_DIR ${3RD_PARTY_INSTALL_PREFIX}/include PARENT_SCOPE)
+ SET_PROPERTY(GLOBAL PROPERTY GLOBAL_BOOST_LIBS ${BOOST_LIBS_DIRECTORY})
+ message(STATUS "Did not find boost. Downloading and installing boost 1.72")
set(BOOST_INSTALL_COMMAND ./b2 install)
if (${3RD_PARTY_INSTALL_PREFIX} MATCHES "/usr/local")
set(BOOST_INSTALL_COMMAND sudo ./b2 install)
@@ -235,18 +236,22 @@ if (NOT ${Boost_FOUND})
include(ExternalProject)
ExternalProject_Add(
Boost
- URL https://mirror.bazel.build/dl.bintray.com/boostorg/release/1.68.0/source/boost_1_68_0.tar.gz
- URL_HASH SHA256=da3411ea45622579d419bfda66f45cd0f8c32a181d84adfa936f5688388995cf
+ URL https://dl.bintray.com/boostorg/release/1.72.0/source/boost_1_72_0.tar.gz
+ URL_HASH SHA256=c66e88d5786f2ca4dbebb14e06b566fb642a1a6947ad8cc9091f9f445134143f
DOWNLOAD_DIR ${BOOST_LIB_SOURCE_DIRECTORY}
SOURCE_DIR ${BOOST_LIB_SOURCE_DIRECTORY}
CONFIGURE_COMMAND ./bootstrap.sh --with-libraries=system,thread,date_time,filesystem,regex --prefix=${3RD_PARTY_INSTALL_PREFIX}
BUILD_COMMAND ./b2
- INSTALL_COMMAND ${BOOST_INSTALL_COMMAND} --with-system --with-thread --with-date_time --with-filesystem --with-regex --prefix=${3RD_PARTY_INSTALL_PREFIX} > boost_install.log
+ INSTALL_COMMAND ${BOOST_INSTALL_COMMAND} --clean --prefix=${3RD_PARTY_INSTALL_PREFIX} && ${BOOST_INSTALL_COMMAND} --with-system --with-thread --with-date_time --with-filesystem --with-regex --prefix=${3RD_PARTY_INSTALL_PREFIX} > boost_install.log
INSTALL_DIR ${3RD_PARTY_INSTALL_PREFIX}
BUILD_IN_SOURCE true
)
else()
-add_custom_target(Boost) # empty target, Boost is already installed
+ message (STATUS "Boost installed in " ${Boost_LIBRARY_DIRS} ", " ${Boost_INCLUDE_DIRS})
+ set(BOOST_LIBS_DIRECTORY ${Boost_LIBRARY_DIRS})
+ set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS} PARENT_SCOPE)
+ SET_PROPERTY(GLOBAL PROPERTY GLOBAL_BOOST_LIBS ${BOOST_LIBS_DIRECTORY})
+ add_custom_target(Boost) # empty target, Boost is already installed
endif()
add_custom_target(install-3rd_party
diff --git a/src/appMain/hmi_capabilities.json b/src/appMain/hmi_capabilities.json
index 4266f40cf3..8adb8da4b7 100755
--- a/src/appMain/hmi_capabilities.json
+++ b/src/appMain/hmi_capabilities.json
@@ -105,55 +105,67 @@
"rows": 1
},
{
- "name": "navigationText",
+ "name": "audioPassThruDisplayText1",
"characterSet": "UTF_8",
"width": 500,
"rows": 1
},
{
- "name": "audioPassThruDisplayText1",
+ "name": "audioPassThruDisplayText2",
"characterSet": "UTF_8",
"width": 500,
"rows": 1
},
{
- "name": "audioPassThruDisplayText2",
+ "name": "sliderHeader",
"characterSet": "UTF_8",
"width": 500,
"rows": 1
},
{
- "name": "sliderHeader",
+ "name": "sliderFooter",
"characterSet": "UTF_8",
"width": 500,
"rows": 1
},
{
- "name": "sliderFooter",
+ "name": "menuName",
"characterSet": "UTF_8",
"width": 500,
"rows": 1
},
{
- "name": "notificationText",
+ "name": "secondaryText",
"characterSet": "UTF_8",
"width": 500,
"rows": 1
},
{
- "name": "menuName",
+ "name": "tertiaryText",
"characterSet": "UTF_8",
"width": 500,
"rows": 1
},
{
- "name": "secondaryText",
+ "name": "menuCommandSecondaryText",
"characterSet": "UTF_8",
"width": 500,
"rows": 1
},
{
- "name": "tertiaryText",
+ "name": "menuCommandTertiaryText",
+ "characterSet": "UTF_8",
+ "width": 500,
+ "rows": 1
+ },
+ {
+ "name": "menuSubMenuSecondaryText",
+ "characterSet": "UTF_8",
+ "width": 500,
+ "rows": 1
+ },
+ {
+ "name": "menuSubMenuTertiaryText",
"characterSet": "UTF_8",
"width": 500,
"rows": 1
@@ -213,6 +225,20 @@
}
},
{
+ "name": "menuCommandSecondaryImage",
+ "imageResolution": {
+ "resolutionWidth": 35,
+ "resolutionHeight": 35
+ }
+ },
+ {
+ "name": "menuSubMenuSecondaryImage",
+ "imageResolution": {
+ "resolutionWidth": 35,
+ "resolutionHeight": 35
+ }
+ },
+ {
"name": "appIcon",
"imageResolution": {
"resolutionWidth": 35,
@@ -311,20 +337,106 @@
"dialNumberEnabled": true
},
"videoStreamingCapability": {
- "preferredResolution": {
+ "preferredResolution": {
+ "resolutionWidth": 800,
+ "resolutionHeight": 380
+ },
+ "maxBitrate": 20000,
+ "supportedFormats": [
+ {
+ "protocol": "RAW",
+ "codec": "H264"
+ },
+ {
+ "protocol": "RTP",
+ "codec": "H264"
+ },
+ {
+ "protocol": "RTSP",
+ "codec": "Theora"
+ },
+ {
+ "protocol": "RTMP",
+ "codec": "VP8"
+ },
+ {
+ "protocol": "WEBM",
+ "codec": "VP9"
+ }
+ ],
+ "hapticSpatialDataSupported": true,
+ "diagonalScreenSize": 8,
+ "pixelPerInch": 96,
+ "scale": 1,
+ "preferredFPS": 15,
+ "additionalVideoStreamingCapabilities": [
+ {
+ "preferredResolution":
+ {
"resolutionWidth": 800,
- "resolutionHeight": 350
+ "resolutionHeight": 380
+ },
+ "hapticSpatialDataSupported": true,
+ "scale": 1,
+ "diagonalScreenSize": 8
},
- "maxBitrate": 10000,
- "supportedFormats": [{
- "protocol": "RAW",
- "codec": "H264"
- }],
- "hapticSpatialDataSupported": false,
- "diagonalScreenSize": 8,
- "pixelPerInch": 117,
- "scale": 1,
- "preferredFPS": 15
+ {
+ "preferredResolution":
+ {
+ "resolutionWidth": 320,
+ "resolutionHeight": 200
+ },
+ "hapticSpatialDataSupported": false,
+ "diagonalScreenSize": 3
+ },
+ {
+ "preferredResolution":
+ {
+ "resolutionWidth": 480,
+ "resolutionHeight": 320
+ },
+ "hapticSpatialDataSupported": true,
+ "diagonalScreenSize": 5
+ },
+ {
+ "preferredResolution":
+ {
+ "resolutionWidth": 400,
+ "resolutionHeight": 380
+ },
+ "hapticSpatialDataSupported": true,
+ "diagonalScreenSize": 4
+ },
+ {
+ "preferredResolution":
+ {
+ "resolutionWidth": 800,
+ "resolutionHeight": 240
+ },
+ "hapticSpatialDataSupported": true,
+ "diagonalScreenSize": 4
+ },
+ {
+ "preferredResolution":
+ {
+ "resolutionWidth": 800,
+ "resolutionHeight": 380
+ },
+ "hapticSpatialDataSupported": true,
+ "scale": 1.5,
+ "diagonalScreenSize": 5
+ },
+ {
+ "preferredResolution":
+ {
+ "resolutionWidth": 800,
+ "resolutionHeight": 380
+ },
+ "hapticSpatialDataSupported": true,
+ "scale": 2,
+ "diagonalScreenSize": 4
+ }
+ ]
},
"driverDistractionCapability": {
"menuLength": 10,
diff --git a/src/appMain/sdl_preloaded_pt.json b/src/appMain/sdl_preloaded_pt.json
index dc6a615e82..50bbce6a97 100644
--- a/src/appMain/sdl_preloaded_pt.json
+++ b/src/appMain/sdl_preloaded_pt.json
@@ -189,6 +189,13 @@
"NONE"
]
},
+ "OnAppCapabilityUpdated": {
+ "hmi_levels": [
+ "BACKGROUND",
+ "FULL",
+ "LIMITED"
+ ]
+ },
"OnAppInterfaceUnregistered": {
"hmi_levels": [
"BACKGROUND",
@@ -625,6 +632,7 @@
"deviceStatus",
"engineOilLife",
"engineTorque",
+ "climateData",
"externalTemperature",
"turnSignal",
"fuelLevel",
@@ -652,6 +660,7 @@
"deviceStatus",
"engineOilLife",
"engineTorque",
+ "climateData",
"externalTemperature",
"turnSignal",
"fuelLevel",
@@ -679,6 +688,7 @@
"deviceStatus",
"engineOilLife",
"engineTorque",
+ "climateData",
"externalTemperature",
"turnSignal",
"fuelLevel",
@@ -705,6 +715,7 @@
"deviceStatus",
"engineOilLife",
"engineTorque",
+ "climateData",
"externalTemperature",
"turnSignal",
"fuelLevel",
@@ -1650,6 +1661,7 @@
"rpcs": {
"CreateWindow": {
"hmi_levels": [
+ "NONE",
"BACKGROUND",
"FULL",
"LIMITED"
@@ -1657,6 +1669,7 @@
},
"DeleteWindow": {
"hmi_levels": [
+ "NONE",
"BACKGROUND",
"FULL",
"LIMITED"
@@ -3480,12 +3493,71 @@
"since": "5.0"
},
{
+ "name": "climateData",
+ "params": [
+ {
+ "name": "externalTemperature",
+ "key": "OEM_REF_EXT_TEMP",
+ "params": [
+ {
+ "name": "unit",
+ "key": "OEM_REF_EXT_TEMP_UNIT",
+ "type": "TemperatureUnit",
+ "mandatory": true
+ },
+ {
+ "name": "value",
+ "key": "OEM_REF_EXT_TEMP_VALUE",
+ "type": "Float",
+ "mandatory": true
+ }
+ ],
+ "type": "Struct",
+ "mandatory": false
+ },
+ {
+ "name": "cabinTemperature",
+ "key": "OEM_REF_CABIN_TEMP",
+ "params": [
+ {
+ "name": "unit",
+ "key": "OEM_REF_CABIN_TEMP_VALUE",
+ "type": "TemperatureUnit",
+ "mandatory": true
+ },
+ {
+ "name": "value",
+ "key": "OEM_REF_CABIN_TEMP_VALUE",
+ "type": "Float",
+ "mandatory": true
+ }
+ ],
+ "type": "Struct",
+ "mandatory": false
+ },
+ {
+ "name": "atmosphericPressure",
+ "key": "OEM_REF_ATMOSPHERIC_PRESSURE",
+ "type": "Float",
+ "minvalue": 0,
+ "maxvalue": 2000,
+ "mandatory": false
+ }
+ ],
+ "key": "OEM_REF_CLIMATE_DATA",
+ "type": "Struct",
+ "mandatory": false,
+ "since": "7.1"
+ },
+ {
"name": "externalTemperature",
"key": "OEM_REF_EXT_TEMP",
"type": "Float",
"mandatory": false,
"minvalue": -40,
- "maxvalue": 100
+ "maxvalue": 100,
+ "deprecated": true,
+ "since": "7.1"
},
{
"name": "turnSignal",
diff --git a/src/appMain/smartDeviceLink.ini b/src/appMain/smartDeviceLink.ini
index 0b27e6263a..ed0e672552 100644
--- a/src/appMain/smartDeviceLink.ini
+++ b/src/appMain/smartDeviceLink.ini
@@ -185,6 +185,9 @@ ForceUnprotectedService = Non
; The PTU will be triggered in case expiration date of certificate
; then certain hours amount
UpdateBeforeHours = 24
+; Security level for openssl lib according to:
+; https://www.openssl.org/docs/man1.1.0/man3/SSL_CTX_get_security_level.html
+SecurityLevel = 1
[Policy]
EnablePolicy = true
diff --git a/src/components/application_manager/include/application_manager/application.h b/src/components/application_manager/include/application_manager/application.h
index 2eb4501bcc..bc966cd00c 100644
--- a/src/components/application_manager/include/application_manager/application.h
+++ b/src/components/application_manager/include/application_manager/application.h
@@ -374,8 +374,8 @@ class DynamicApplicationData {
/*
* @brief Returns true if sub menu with such name already exist
*/
- virtual bool IsSubMenuNameAlreadyExist(const std::string& name,
- const uint32_t parent_id) = 0;
+ DEPRECATED virtual bool IsSubMenuNameAlreadyExist(
+ const std::string& name, const uint32_t parent_id) = 0;
/*
* @brief Adds a interaction choice set to the application
@@ -529,6 +529,7 @@ class Application : public virtual InitialApplicationData,
* @brief The StreamingState enum defines current streaming state
*/
enum class StreamingState { kStopped, kStarted, kSuspended };
+
enum ApplicationRegisterState { kRegistered = 0, kWaitingForRegistration };
Application() : is_greyed_out_(false) {}
@@ -669,8 +670,10 @@ class Application : public virtual InitialApplicationData,
/**
* @brief Wakes up streaming process for application
* @param service_type Type of streaming service
+ * @param timer_len The amount of time in ms the timer will wait
*/
- virtual void WakeUpStreaming(protocol_handler::ServiceType service_type) = 0;
+ virtual void WakeUpStreaming(protocol_handler::ServiceType service_type,
+ uint32_t timer_len = 0) = 0;
virtual bool is_voice_communication_supported() const = 0;
virtual void set_voice_communication_supported(
diff --git a/src/components/application_manager/include/application_manager/application_impl.h b/src/components/application_manager/include/application_manager/application_impl.h
index 6d60699a4e..21e45b4515 100644
--- a/src/components/application_manager/include/application_manager/application_impl.h
+++ b/src/components/application_manager/include/application_manager/application_impl.h
@@ -142,7 +142,8 @@ class ApplicationImpl : public virtual Application,
void StopStreamingForce(protocol_handler::ServiceType service_type);
void StopStreaming(protocol_handler::ServiceType service_type);
void SuspendStreaming(protocol_handler::ServiceType service_type);
- void WakeUpStreaming(protocol_handler::ServiceType service_type);
+ void WakeUpStreaming(protocol_handler::ServiceType service_type,
+ uint32_t timer_len = 0);
virtual bool is_voice_communication_supported() const;
virtual void set_voice_communication_supported(bool option);
diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h
index bedf63b954..9191a06c6b 100644
--- a/src/components/application_manager/include/application_manager/application_manager_impl.h
+++ b/src/components/application_manager/include/application_manager/application_manager_impl.h
@@ -700,6 +700,9 @@ class ApplicationManagerImpl
void RemoveDevice(
const connection_handler::DeviceHandle& device_handle) OVERRIDE;
+ bool GetProtocolVehicleData(
+ connection_handler::ProtocolVehicleData& data) OVERRIDE;
+
/**
* @brief OnDeviceSwitchingStart is invoked on device transport switching
* start (e.g. from Bluetooth to USB) and creates waiting list of applications
@@ -870,6 +873,10 @@ class ApplicationManagerImpl
void OnAppStreaming(uint32_t app_id,
protocol_handler::ServiceType service_type,
+ bool state) OVERRIDE;
+
+ void OnAppStreaming(uint32_t app_id,
+ protocol_handler::ServiceType service_type,
const Application::StreamingState new_state) OVERRIDE;
mobile_api::HMILevel::eType GetDefaultHmiLevel(
@@ -1144,6 +1151,8 @@ class ApplicationManagerImpl
return is_stopping_;
}
+ bool WaitForHmiIsReady() OVERRIDE;
+
/**
* @brief ProcessReconnection handles reconnection flow for application on
* transport switch
@@ -1189,6 +1198,11 @@ class ApplicationManagerImpl
private:
/**
+ * @brief Sets is_stopping flag to true
+ */
+ void InitiateStopping();
+
+ /**
* @brief Adds application to registered applications list and marks it as
* registered
* @param application Application that should be added to registered
@@ -1615,8 +1629,8 @@ class ApplicationManagerImpl
ns_smart_device_link_rpc::V1::v4_protocol_v1_2_no_extra
mobile_v4_protocol_so_factory_;
- std::atomic_uint32_t mobile_correlation_id_;
- std::atomic_uint32_t correlation_id_;
+ std::atomic<uint32_t> mobile_correlation_id_;
+ std::atomic<uint32_t> correlation_id_;
const uint32_t max_correlation_id_;
std::unique_ptr<HMICapabilities> hmi_capabilities_;
@@ -1645,6 +1659,9 @@ class ApplicationManagerImpl
sync_primitives::Lock close_app_timer_pool_lock_;
sync_primitives::Lock end_stream_timer_pool_lock_;
+ mutable sync_primitives::Lock wait_for_hmi_lock_;
+ sync_primitives::ConditionalVariable wait_for_hmi_condvar_;
+
StateControllerImpl state_ctrl_;
std::unique_ptr<app_launch::AppLaunchData> app_launch_dto_;
std::unique_ptr<app_launch::AppLaunchCtrl> app_launch_ctrl_;
diff --git a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h
index 0bc98827c8..f646c66ca1 100644
--- a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h
+++ b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h
@@ -81,6 +81,10 @@ class HMICapabilitiesImpl : public HMICapabilities {
const std::string& ccpu_version() const OVERRIDE;
+ void set_hardware_version(const std::string& hardware_version) OVERRIDE;
+
+ const std::string& hardware_version() const OVERRIDE;
+
bool attenuated_supported() const OVERRIDE;
void set_attenuated_supported(const bool state) OVERRIDE;
@@ -476,6 +480,7 @@ class HMICapabilitiesImpl : public HMICapabilities {
bool is_rc_supported_;
bool is_driver_distraction_supported_;
std::string ccpu_version_;
+ std::string hardware_version_;
smart_objects::SmartObjectSPtr navigation_capability_;
smart_objects::SmartObjectSPtr phone_capability_;
smart_objects::SmartObjectSPtr video_streaming_capability_;
diff --git a/src/components/application_manager/include/application_manager/message_helper.h b/src/components/application_manager/include/application_manager/message_helper.h
index 7af9bacf27..9797442e34 100644
--- a/src/components/application_manager/include/application_manager/message_helper.h
+++ b/src/components/application_manager/include/application_manager/message_helper.h
@@ -75,6 +75,7 @@ struct ResetGlobalPropertiesResult {
bool menu_name;
bool menu_icon;
bool keyboard_properties;
+ bool user_location;
bool vr_has_been_reset;
ResetGlobalPropertiesResult()
@@ -84,6 +85,7 @@ struct ResetGlobalPropertiesResult {
, menu_name(false)
, menu_icon(false)
, keyboard_properties(false)
+ , user_location(false)
, vr_has_been_reset(false) {}
bool HasUIPropertiesReset() const {
@@ -93,6 +95,10 @@ struct ResetGlobalPropertiesResult {
bool HasTTSPropertiesReset() const {
return timeout_prompt || help_prompt;
}
+
+ bool HasRCPropertiesReset() const {
+ return user_location;
+ }
};
/**
@@ -1062,6 +1068,18 @@ class MessageHelper {
const ResetGlobalPropertiesResult& reset_result,
const ApplicationSharedPtr application);
+ /**
+ * @brief CreateRCResetGlobalPropertiesRequest Creates request
+ * to reset global properties for RC
+ * @param reset_result struct containing result of global properties reset
+ * procedure
+ * @param application application for which properties are to be reset
+ * @return filled smart object with relevant request data
+ */
+ static smart_objects::SmartObjectSPtr CreateRCResetGlobalPropertiesRequest(
+ const ResetGlobalPropertiesResult& reset_result,
+ const ApplicationSharedPtr application);
+
static smart_objects::SmartObject CreateAppServiceCapabilities(
std::vector<smart_objects::SmartObject>& all_services);
diff --git a/src/components/application_manager/include/application_manager/policies/policy_handler.h b/src/components/application_manager/include/application_manager/policies/policy_handler.h
index 61b228d4f8..0a815b4c5b 100644
--- a/src/components/application_manager/include/application_manager/policies/policy_handler.h
+++ b/src/components/application_manager/include/application_manager/policies/policy_handler.h
@@ -386,10 +386,14 @@ class PolicyHandler : public PolicyHandlerInterface,
const std::string& wers_country_code,
const std::string& language) OVERRIDE;
+ void OnHardwareVersionReceived(const std::string& hardware_version) OVERRIDE;
+
void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE;
std::string GetCCPUVersionFromPT() const OVERRIDE;
+ std::string GetHardwareVersionFromPT() const OVERRIDE;
+
/**
* @brief Sends GetVehicleData request in case when Vechicle info is ready.
*/
diff --git a/src/components/application_manager/include/application_manager/smart_object_keys.h b/src/components/application_manager/include/application_manager/smart_object_keys.h
index bb5e08f6e2..5572dfd55d 100644
--- a/src/components/application_manager/include/application_manager/smart_object_keys.h
+++ b/src/components/application_manager/include/application_manager/smart_object_keys.h
@@ -230,6 +230,8 @@ extern const char* policy_type;
extern const char* property;
extern const char* displays;
extern const char* seat_location;
+extern const char* app_capability;
+extern const char* app_capability_type;
// PutFile
extern const char* sync_file_name;
@@ -299,6 +301,7 @@ extern const char* fuel_level_state;
extern const char* instant_fuel_consumption;
extern const char* fuel_range;
extern const char* cloud_app_vehicle_id;
+extern const char* climate_data;
extern const char* external_temp;
extern const char* turn_signal;
extern const char* vin;
@@ -339,6 +342,7 @@ extern const char* video_streaming;
extern const char* remote_control;
extern const char* sdl_version;
extern const char* system_software_version;
+extern const char* system_hardware_version;
extern const char* priority;
extern const char* engine_oil_life;
extern const char* oem_custom_data_type;
@@ -484,6 +488,7 @@ extern const char* const haptic_spatial_data_supported;
extern const char* const diagonal_screen_size;
extern const char* const pixel_per_inch;
extern const char* const scale;
+extern const char* const additional_video_streaming_capabilities;
extern const char* const haptic_rect_data;
extern const char* const rect;
extern const char* const x;
@@ -589,6 +594,8 @@ extern const char* method_name;
extern const char* keyboard_layout;
extern const char* limited_character_list;
extern const char* auto_complete_list;
+extern const char* mask_input_characters;
+extern const char* custom_keys;
extern const char* file;
extern const char* file_name;
extern const char* retry;
@@ -626,6 +633,9 @@ extern const char* image_capabilities;
extern const char* display_type;
extern const char* display_name;
extern const char* text_fields;
+extern const char* keyboard_capabilities;
+extern const char* supported_keyboards;
+extern const char* num_configurable_keys;
extern const char* media_clock_formats;
extern const char* graphic_supported;
extern const char* image_fields;
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc
index 8d3a3d796e..c3b0a7d4a5 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/commands/mobile/get_interior_vehicle_data_request.cc
@@ -284,10 +284,8 @@ void GetInteriorVehicleDataRequest::on_event(
[message_params::kModuleData][data_mapping(module_type)];
interior_data_cache_.Add(module, module_data);
}
- } else {
- hmi_response[app_mngr::strings::msg_params].erase(
- message_params::kIsSubscribed);
}
+
std::string response_info;
GetInfo(hmi_response, response_info);
SetResourceState(ModuleType(), ResourceState::FREE);
@@ -295,7 +293,7 @@ void GetInteriorVehicleDataRequest::on_event(
SendResponse(result,
result_code,
response_info.c_str(),
- &hmi_response[app_mngr::strings::msg_params]);
+ result ? &hmi_response[app_mngr::strings::msg_params] : nullptr);
}
GetInteriorVehicleDataRequest::~GetInteriorVehicleDataRequest() {}
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc
index 20f9c27912..fdfa3ea03a 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/get_interior_vehicle_data_request_test.cc
@@ -734,6 +734,8 @@ TEST_F(GetInteriorVehicleDataRequestTest,
available_hd_chanels[1] = chanel2_index;
available_hd_chanels[2] = chanel3_index;
+ msg_params[message_params::kModuleData][message_params::kModuleId] =
+ kModuleId;
msg_params[message_params::kModuleData][message_params::kRadioControlData]
[message_params::kAvailableHdChannels] = available_hd_chanels;
@@ -792,6 +794,8 @@ TEST_F(GetInteriorVehicleDataRequestTest,
smart_objects::SmartObject(smart_objects::SmartType_Boolean);
climate_control_data = true;
+ msg_params[message_params::kModuleData][message_params::kModuleId] =
+ kModuleId;
msg_params[message_params::kModuleData][message_params::kClimateControlData]
[message_params::kClimateEnableAvailable] = climate_control_data;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt
index a03b34d742..67a178893c 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/CMakeLists.txt
@@ -28,7 +28,10 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
-include_directories(include)
+include_directories(
+ include
+ ${CMAKE_CURRENT_SOURCE_DIR}/include/sdl_rpc_plugin
+)
set (COMMANDS_SOURCE_DIR
${CMAKE_CURRENT_SOURCE_DIR}/src/commands
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h
new file mode 100644
index 0000000000..f4883cecaf
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_BC_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_BC_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
+
+#include "application_manager/commands/notification_to_hmi.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+class BCOnAppCapabilityUpdatedNotification
+ : public app_mngr::commands::NotificationToHMI {
+ public:
+ BCOnAppCapabilityUpdatedNotification(
+ const app_mngr::commands::MessageSharedPtr& message,
+ app_mngr::ApplicationManager& application_manager,
+ app_mngr::rpc_service::RPCService& rpc_service,
+ app_mngr::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handle);
+
+ ~BCOnAppCapabilityUpdatedNotification() OVERRIDE;
+
+ void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(BCOnAppCapabilityUpdatedNotification);
+};
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_HMI_BC_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h
index 2d3c40c3f3..5254d641de 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/get_system_info_response.h
@@ -45,6 +45,7 @@ struct SystemInfo {
std::string ccpu_version;
std::string wers_country_code;
std::string language;
+ std::string hardware_version;
};
/**
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h
index 17d4eb483f..d2bda320a3 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/navi_is_ready_request.h
@@ -72,6 +72,8 @@ class NaviIsReadyRequest : public app_mngr::commands::RequestToHMI,
**/
void on_event(const app_mngr::event_engine::Event& event) OVERRIDE;
+ void onTimeOut() OVERRIDE;
+
private:
DISALLOW_COPY_AND_ASSIGN(NaviIsReadyRequest);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h
index 39b5c3aee3..41b5846a46 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.h
@@ -87,6 +87,18 @@ class OnBCSystemCapabilityUpdatedNotificationFromHMI
ProcessSystemDisplayCapabilitiesResult ProcessSystemDisplayCapabilities(
const smart_objects::SmartObject& display_capabilities);
+ /**
+ * @brief ProcessVideoStreamingCapability processes provided video
+ * streaming capabilities according to its structure
+ * @param system_capability capabilities to process
+ * @return true if video streaming capabilities have been processed
+ * properly, otherwise returns false
+ */
+ bool ProcessVideoStreamingCapability(
+ const smart_objects::SmartObject& system_capability);
+
+ void RemoveAppIdFromNotification();
+
DISALLOW_COPY_AND_ASSIGN(OnBCSystemCapabilityUpdatedNotificationFromHMI);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h
index db4f265a9f..ed89bc73ec 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/hmi/update_device_list_request.h
@@ -46,8 +46,7 @@ namespace commands {
/**
* @brief UpdateDeviceListRequest command class
**/
-class UpdateDeviceListRequest : public app_mngr::commands::RequestToHMI,
- public app_mngr::event_engine::EventObserver {
+class UpdateDeviceListRequest : public app_mngr::commands::RequestToHMI {
public:
/**
* @brief UpdateDeviceListRequest class constructor
@@ -70,23 +69,7 @@ class UpdateDeviceListRequest : public app_mngr::commands::RequestToHMI,
**/
virtual void Run();
- /**
- * @brief Interface method that is called whenever new event received
- * Need to observe OnHMIReady event, to send UpdateDeviceListRequest
- * when HMI will be ready
- * @param event The received event
- */
- virtual void on_event(const app_mngr::event_engine::Event& event);
-
- /**
- * @brief Need to stop execution StopMethod if HMI did not started
- */
- virtual bool CleanUp();
-
private:
- sync_primitives::Lock wait_hmi_lock;
- sync_primitives::ConditionalVariable termination_condition_;
-
DISALLOW_COPY_AND_ASSIGN(UpdateDeviceListRequest);
};
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h
index 8cac0d686d..6ccd57947c 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/add_command_request.h
@@ -91,16 +91,6 @@ class AddCommandRequest : public app_mngr::commands::CommandRequestImpl {
private:
/*
- * @brief Check if command name doesn't exist in application
- * Please see SDLAQ-CRS-407 for more information
- *
- * @param app Mobile application
- *
- * @return TRUE on success, otherwise FALSE
- */
- bool CheckCommandName(app_mngr::ApplicationConstSharedPtr app);
-
- /*
* @brief Check if command VR synonyms doesn't exist in application commands
* Please see SDLAQ-CRS-407 for more information
*
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h
index a1bc866347..aba2ce3be5 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/create_interaction_choice_set_request.h
@@ -162,56 +162,6 @@ class CreateInteractionChoiceSetRequest
app_mngr::ApplicationConstSharedPtr app);
/*
- * @brief Predicate for using with CheckChoiceSet method to compare choice ID
- *param
- *
- * return TRUE if there is coincidence of choice ID, otherwise FALSE
- */
- struct CoincidencePredicateChoiceID {
- CoincidencePredicateChoiceID(const uint32_t newItem) : newItem_(newItem) {}
-
- bool operator()(smart_objects::SmartObject obj) {
- return obj[app_mngr::strings::choice_id].asUInt() == newItem_;
- }
-
- const uint32_t newItem_;
- };
-
- /*
- * @brief Predicate for using with CheckChoiceSet method to compare menu name
- *param
- *
- * return TRUE if there is coincidence of menu name, otherwise FALSE
- */
- struct CoincidencePredicateMenuName {
- CoincidencePredicateMenuName(const std::string& newItem)
- : newItem_(newItem) {}
-
- bool operator()(smart_objects::SmartObject obj) {
- return obj[app_mngr::strings::menu_name].asString() == newItem_;
- }
-
- const std::string& newItem_;
- };
-
- /*
- * @brief Predicate for using with CheckChoiceSet method to compare VR
- *commands param
- *
- * return TRUE if there is coincidence of VR commands, otherwise FALSE
- */
- struct CoincidencePredicateVRCommands {
- CoincidencePredicateVRCommands(const smart_objects::SmartObject& newItem)
- : newItem_(newItem) {}
-
- bool operator()(smart_objects::SmartObject obj) {
- return compareStr(obj, newItem_);
- }
-
- const smart_objects::SmartObject& newItem_;
- };
-
- /*
* @brief Checks if incoming choice set doesn't has similar VR synonyms.
*
* @param choice1 Choice to compare
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h
new file mode 100644
index 0000000000..64e16f57be
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
+#define SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
+
+#include "application_manager/commands/command_notification_from_mobile_impl.h"
+#include "utils/macro.h"
+
+namespace sdl_rpc_plugin {
+namespace commands {
+namespace mobile {
+
+namespace app_mngr = application_manager;
+class OnAppCapabilityUpdatedNotification
+ : public app_mngr::commands::CommandNotificationFromMobileImpl {
+ public:
+ /**
+ * @brief OnAppPermissionChangedNotification class constructor
+ * @param message Incoming SmartObject message
+ * @param application_manager Reference to the instance of the Application
+ *Manager
+ * @param rpc_service Reference to the instance of the RPCService
+ * @param hmi_capabilities Reference to the instance of the HMICapabilities
+ * @param policy_handle Reference to the instance of the PolicyHandler
+ **/
+ OnAppCapabilityUpdatedNotification(
+ const app_mngr::commands::MessageSharedPtr& message,
+ app_mngr::ApplicationManager& application_manager,
+ app_mngr::rpc_service::RPCService& rpc_service,
+ app_mngr::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handle);
+
+ /**
+ * @brief OnAppPermissionChangedNotification class destructor
+ **/
+ ~OnAppCapabilityUpdatedNotification() OVERRIDE;
+
+ /**
+ * @brief Execute command
+ **/
+ void Run() OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(OnAppCapabilityUpdatedNotification);
+};
+
+} // namespace mobile
+} // namespace commands
+} // namespace sdl_rpc_plugin
+
+#endif // SRC_COMPONENTS_APPLICATION_MANAGER_RPC_PLUGINS_SDL_RPC_PLUGIN_INCLUDE_SDL_RPC_PLUGIN_COMMANDS_MOBILE_ON_APP_CAPABILITY_UPDATED_NOTIFICATION_H_
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h
index 9d14b248b6..88182a0b8e 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/perform_interaction_request.h
@@ -162,16 +162,6 @@ class PerformInteractionRequest
void SendUIShowVRHelpRequest(app_mngr::ApplicationSharedPtr const app);
/*
- * @brief Checks if incoming choice set doesn't has similar menu names.
- *
- * @param app_id Application ID
- *
- * return Return TRUE if there are no similar menu names in choice set,
- * otherwise FALSE
- */
- bool CheckChoiceSetMenuNames(app_mngr::ApplicationSharedPtr const app);
-
- /*
* @brief Checks if incoming choice set doesn't has similar VR synonyms.
*
* @param app_id Application ID
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h
index fae8f5eeb7..ae52caf0f7 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/register_app_interface_request.h
@@ -261,12 +261,6 @@ class RegisterAppInterfaceRequest
const smart_objects::SmartObject& message);
/**
- * @brief WaitForHMIIsReady blocking function. Waits for HMI be ready for
- * requests processing
- */
- void WaitForHMIIsReady();
-
- /**
* @brief FillApplicationParams set app application attributes from the RAI
* request
* @param application applicaiton to fill params
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h
index 190cb07459..fbf3056e58 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/include/sdl_rpc_plugin/commands/mobile/set_global_properties_request.h
@@ -203,7 +203,30 @@ class SetGlobalPropertiesRequest
*/
bool IsWhiteSpaceExist();
- /*
+ /**
+ * @brief helps to determine layout of interest. Returns keyboard layout,
+ * mentioned in current request. If not, returns saved keyboard layout for
+ * current app. If such layout wasn't saved, returns default keyboard layout
+ * (QWERTY)
+ * @return KeyboardLayout enum value
+ */
+ hmi_apis::Common_KeyboardLayout::eType GetKeyboardLayout() const;
+
+ /**
+ * @brief Returns allowed number of configurable keys for certain layout
+ * @return allowed number of configurable keys, if provided, and zero
+ * otherwise
+ */
+ uint32_t GetAllowedNumberOfConfigurableKeys() const;
+
+ /**
+ * @brief Checks provided custom keys against capabilities.
+ * @return true if the specified keyboard layout supports the number of
+ * custom keys provided.
+ */
+ bool ValidateCustomKeys() const;
+
+ /**
* @brief Prepare result code and result for sending to mobile application
* @param result_code contains result code for sending to mobile application
* @param info contains info for sending to mobile applicaion
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc
new file mode 100644
index 0000000000..a5f2137136
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/bc_on_app_capability_updated_notification.cc
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h"
+
+namespace sdl_rpc_plugin {
+namespace app_mngr = application_manager;
+
+namespace commands {
+
+SDL_CREATE_LOG_VARIABLE("Commands")
+
+BCOnAppCapabilityUpdatedNotification::BCOnAppCapabilityUpdatedNotification(
+ const application_manager::commands::MessageSharedPtr& message,
+ application_manager::ApplicationManager& application_manager,
+ application_manager::rpc_service::RPCService& rpc_service,
+ application_manager::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handle)
+ : NotificationToHMI(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handle) {}
+
+BCOnAppCapabilityUpdatedNotification::~BCOnAppCapabilityUpdatedNotification() {}
+
+void BCOnAppCapabilityUpdatedNotification::Run() {
+ SDL_LOG_AUTO_TRACE();
+
+ SendNotification();
+}
+
+} // namespace commands
+} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc
index 20250af222..722bfc5097 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/button_get_capabilities_response.cc
@@ -60,11 +60,10 @@ void ButtonGetCapabilitiesResponse::Run() {
static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::Buttons_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != code) {
SDL_LOG_ERROR("Error is returned. Capabilities won't be updated.");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::Buttons_GetCapabilities);
return;
}
@@ -81,6 +80,9 @@ void ButtonGetCapabilitiesResponse::Run() {
[hmi_response::preset_bank_capabilities]);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::Buttons_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::buttons, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save Buttons.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc
index 8229e1978c..50fb41a551 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/get_system_info_response.cc
@@ -59,6 +59,8 @@ void GetSystemInfoResponse::Run() {
(*message_)[strings::params][hmi_response::code].asInt());
hmi_capabilities_.set_ccpu_version(policy_handler_.GetCCPUVersionFromPT());
+ hmi_capabilities_.set_hardware_version(
+ policy_handler_.GetHardwareVersionFromPT());
if (hmi_apis::Common_Result::SUCCESS != code) {
SDL_LOG_WARN("GetSystemError returns an error code " << code);
@@ -72,6 +74,11 @@ void GetSystemInfoResponse::Run() {
policy_handler_.OnGetSystemInfo(
info.ccpu_version, info.wers_country_code, info.language);
+ if (!info.hardware_version.empty()) {
+ policy_handler_.OnHardwareVersionReceived(info.hardware_version);
+ hmi_capabilities_.set_hardware_version(info.hardware_version);
+ }
+
hmi_capabilities_.OnSoftwareVersionReceived(info.ccpu_version);
}
@@ -89,6 +96,12 @@ const SystemInfo GetSystemInfoResponse::GetSystemInfo() const {
info.language = application_manager::EnumToString(
static_cast<hmi_apis::Common_Language::eType>(lang_code));
+ if ((*message_)[strings::msg_params].keyExists(
+ strings::system_hardware_version)) {
+ info.hardware_version =
+ (*message_)[strings::msg_params][strings::system_hardware_version]
+ .asString();
+ }
return info;
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc
index 4caa307be3..850f292972 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/navi_is_ready_request.cc
@@ -75,6 +75,8 @@ void NaviIsReadyRequest::on_event(const event_engine::Event& event) {
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_navi_cooperating(is_available);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::Navigation_IsReady);
break;
}
default: {
@@ -84,6 +86,11 @@ void NaviIsReadyRequest::on_event(const event_engine::Event& event) {
}
}
+void NaviIsReadyRequest::onTimeOut() {
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::Navigation_IsReady);
+}
+
} // namespace commands
} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc
index 7ba330caa8..56ff20ecc5 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/on_bc_system_capability_updated_notification_from_hmi.cc
@@ -34,6 +34,7 @@
#include "application_manager/display_capabilities_builder.h"
#include "application_manager/message_helper.h"
+#include "extensions/system_capability_app_extension.h"
#include "interfaces/HMI_API.h"
#include "interfaces/MOBILE_API.h"
@@ -84,11 +85,7 @@ OnBCSystemCapabilityUpdatedNotificationFromHMI::
SDL_LOG_DEBUG("Updating display capabilities for app " << app_id);
app->set_display_capabilities(display_capabilities);
- // Remove app_id from notification to mobile
- (*message_)[strings::params][strings::connection_key] =
- (*message_)[strings::msg_params][strings::app_id];
- (*message_)[strings::msg_params].erase(strings::app_id);
-
+ RemoveAppIdFromNotification();
auto& builder = app->display_capabilities_builder();
if (builder.IsWaitingForWindowCapabilities(display_capabilities)) {
SDL_LOG_DEBUG("Application is waiting for capabilities");
@@ -99,6 +96,54 @@ OnBCSystemCapabilityUpdatedNotificationFromHMI::
return ProcessSystemDisplayCapabilitiesResult::SUCCESS;
}
+void OnBCSystemCapabilityUpdatedNotificationFromHMI::
+ RemoveAppIdFromNotification() {
+ (*message_)[strings::params][strings::connection_key] =
+ (*message_)[strings::msg_params][strings::app_id];
+ (*message_)[strings::msg_params].erase(strings::app_id);
+}
+
+bool OnBCSystemCapabilityUpdatedNotificationFromHMI::
+ ProcessVideoStreamingCapability(
+ const smart_objects::SmartObject& system_capability) {
+ if (!system_capability.keyExists(strings::video_streaming_capability)) {
+ SDL_LOG_WARN(
+ "VideoStreamingCapability is absent in the notification. "
+ "Notification Will be ignored");
+ return false;
+ }
+ if (!(*message_)[strings::msg_params].keyExists(strings::app_id)) {
+ SDL_LOG_WARN(
+ "Notification doesn't contain an application id. Will "
+ "be ignored");
+ return false;
+ }
+
+ const auto app_id =
+ (*message_)[strings::msg_params][strings::app_id].asUInt();
+
+ auto app = application_manager_.application(app_id);
+ if (!app) {
+ SDL_LOG_WARN("Application with app_id: "
+ << app_id
+ << " isn't registered. Notification will be ignored");
+ return false;
+ }
+
+ auto& system_capability_extension =
+ SystemCapabilityAppExtension::ExtractExtension(*app);
+
+ if (!system_capability_extension.IsSubscribedTo(
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING)) {
+ SDL_LOG_WARN("The Application with app_id: "
+ << app_id
+ << " isn't subscribed to the VIDEO_STREAMING system "
+ "capability type. Notification will be ignored");
+ return false;
+ }
+ return true;
+}
+
void OnBCSystemCapabilityUpdatedNotificationFromHMI::Run() {
SDL_LOG_AUTO_TRACE();
@@ -109,7 +154,11 @@ void OnBCSystemCapabilityUpdatedNotificationFromHMI::Run() {
const auto& system_capability =
(*message_)[strings::msg_params][strings::system_capability];
- switch (system_capability[strings::system_capability_type].asInt()) {
+ const auto system_capability_type =
+ static_cast<mobile_apis::SystemCapabilityType::eType>(
+ system_capability[strings::system_capability_type].asInt());
+
+ switch (system_capability_type) {
case mobile_apis::SystemCapabilityType::DISPLAYS: {
if (system_capability.keyExists(strings::display_capabilities)) {
const auto result = ProcessSystemDisplayCapabilities(
@@ -135,6 +184,14 @@ void OnBCSystemCapabilityUpdatedNotificationFromHMI::Run() {
}
break;
}
+ case mobile_apis::SystemCapabilityType::VIDEO_STREAMING: {
+ if (!ProcessVideoStreamingCapability(system_capability)) {
+ return;
+ }
+ RemoveAppIdFromNotification();
+ break;
+ }
+ default: { SDL_LOG_ERROR("Unknown system capability type received"); }
}
SendNotificationToMobile(message_);
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc
index 10507a516f..bd5da04cb3 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_get_capabilities_response.cc
@@ -58,11 +58,10 @@ void RCGetCapabilitiesResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::RC_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::RC_GetCapabilities);
return;
}
@@ -88,6 +87,9 @@ void RCGetCapabilitiesResponse::Run() {
hmi_capabilities_.set_rc_supported(rc_capability_exists);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::RC_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::rc, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save RC.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc
index c9a9af87fb..3d31953474 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/rc_is_ready_request.cc
@@ -79,6 +79,8 @@ void RCIsReadyRequest::on_event(const event_engine::Event& event) {
if (!is_available) {
hmi_capabilities.set_rc_supported(false);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::RC_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_RC)) {
@@ -99,6 +101,8 @@ void RCIsReadyRequest::on_event(const event_engine::Event& event) {
void RCIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::RC_IsReady);
RequestInterfaceCapabilities(hmi_interface::rc);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc
index 167966e55b..10709bf94d 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_capabilities_response.cc
@@ -57,11 +57,10 @@ void TTSGetCapabilitiesResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::TTS_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetCapabilities);
return;
}
@@ -80,6 +79,9 @@ void TTSGetCapabilitiesResponse::Run() {
[hmi_response::prerecorded_speech_capabilities]);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::tts, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save TTS.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc
index 2b14bea681..8b708dda01 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_language_response.cc
@@ -61,11 +61,10 @@ void TTSGetLanguageResponse::Run() {
const Common_Result::eType result_code = static_cast<Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::TTS_GetLanguage);
-
if (Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetLanguage);
return;
}
@@ -79,6 +78,9 @@ void TTSGetLanguageResponse::Run() {
hmi_capabilities_.set_active_tts_language(language);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetLanguage);
+
std::vector<std::string> sections_to_update{hmi_response::language};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::tts, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc
index 6b074005b2..71ecd9d4da 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_get_supported_languages_response.cc
@@ -61,17 +61,19 @@ void TTSGetSupportedLanguagesResponse::Run() {
static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::TTS_GetSupportedLanguages);
-
if (hmi_apis::Common_Result::SUCCESS != code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetSupportedLanguages);
return;
}
hmi_capabilities_.set_tts_supported_languages(
(*message_)[strings::msg_params][hmi_response::languages]);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_GetSupportedLanguages);
+
std::vector<std::string> sections_to_update{hmi_response::languages};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::tts, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc
index 1f1f3e7eab..5ff7bc5a50 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/tts_is_ready_request.cc
@@ -73,6 +73,8 @@ void TTSIsReadyRequest::on_event(const event_engine::Event& event) {
application_manager_, message, HmiInterfaces::HMI_INTERFACE_TTS);
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_tts_cooperating(is_available);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_TTS)) {
UpdateRequiredInterfaceCapabilitiesRequests(hmi_interface::tts);
@@ -92,6 +94,8 @@ void TTSIsReadyRequest::on_event(const event_engine::Event& event) {
void TTSIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::TTS_IsReady);
RequestInterfaceCapabilities(hmi_interface::tts);
}
} // namespace commands
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc
index 31dda22709..45c5f59326 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_capabilities_response.cc
@@ -58,11 +58,10 @@ void UIGetCapabilitiesResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::UI_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetCapabilities);
return;
}
@@ -165,6 +164,9 @@ void UIGetCapabilitiesResponse::Run() {
msg_params[strings::pcm_stream_capabilities]);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::ui, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save UI.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc
index ffeec025be..9bae80f48e 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_language_response.cc
@@ -61,11 +61,10 @@ void UIGetLanguageResponse::Run() {
const Common_Result::eType result_code = static_cast<Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::UI_GetLanguage);
-
if (Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetLanguage);
return;
}
@@ -79,6 +78,9 @@ void UIGetLanguageResponse::Run() {
hmi_capabilities_.set_active_ui_language(language);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetLanguage);
+
std::vector<std::string> sections_to_update{hmi_response::language};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::ui, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc
index 20606294ae..e3d6a979ba 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_get_supported_languages_response.cc
@@ -61,17 +61,19 @@ void UIGetSupportedLanguagesResponse::Run() {
static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::UI_GetSupportedLanguages);
-
if (hmi_apis::Common_Result::SUCCESS != code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetSupportedLanguages);
return;
}
hmi_capabilities_.set_ui_supported_languages(
(*message_)[strings::msg_params][hmi_response::languages]);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_GetSupportedLanguages);
+
std::vector<std::string> sections_to_update{hmi_response::languages};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::ui, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc
index d020972ce6..f3da33c5b5 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_is_ready_request.cc
@@ -72,6 +72,8 @@ void UIIsReadyRequest::on_event(const event_engine::Event& event) {
application_manager_, message, HmiInterfaces::HMI_INTERFACE_UI);
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_ui_cooperating(is_available);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_UI)) {
UpdateRequiredInterfaceCapabilitiesRequests(hmi_interface::ui);
@@ -91,6 +93,8 @@ void UIIsReadyRequest::on_event(const event_engine::Event& event) {
void UIIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::UI_IsReady);
RequestInterfaceCapabilities(hmi_interface::ui);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc
index c8aa295645..4d055564de 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/update_device_list_request.cc
@@ -53,51 +53,27 @@ UpdateDeviceListRequest::UpdateDeviceListRequest(
application_manager,
rpc_service,
hmi_capabilities,
- policy_handle)
- , EventObserver(application_manager_.event_dispatcher()) {}
+ policy_handle) {}
UpdateDeviceListRequest::~UpdateDeviceListRequest() {}
void UpdateDeviceListRequest::Run() {
SDL_LOG_AUTO_TRACE();
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
// Fix problem with SDL and HMI HTML. This problem is not actual for HMI PASA.
// Flag conditional compilation for specific customer is used in order to
// exclude
// hit code to RTC
- if (true == application_manager_.get_settings().launch_hmi()) {
- if (!application_manager_.IsHMICooperating()) {
- SDL_LOG_INFO("Wait for HMI Cooperation");
- subscribe_on_event(hmi_apis::FunctionID::BasicCommunication_OnReady);
- termination_condition_.Wait(auto_lock);
- SDL_LOG_DEBUG("HMI Cooperation OK");
+ if (application_manager_.get_settings().launch_hmi()) {
+ SDL_LOG_INFO("Wait for HMI Cooperation");
+ if (!application_manager_.WaitForHmiIsReady()) {
+ SDL_LOG_ERROR("HMI is not ready");
+ return;
}
- }
-
- SendRequest();
-}
-void UpdateDeviceListRequest::on_event(const event_engine::Event& event) {
- SDL_LOG_AUTO_TRACE();
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- switch (event.id()) {
- case hmi_apis::FunctionID::BasicCommunication_OnReady: {
- SDL_LOG_INFO("received OnReady");
- unsubscribe_from_event(hmi_apis::FunctionID::BasicCommunication_OnReady);
- termination_condition_.Broadcast();
- break;
- };
- default: {
- SDL_LOG_ERROR("Unknown event " << event.id());
- break;
- };
+ SDL_LOG_DEBUG("HMI Cooperation is OK");
}
-}
-bool UpdateDeviceListRequest::CleanUp() {
- sync_primitives::AutoLock auto_lock(wait_hmi_lock);
- termination_condition_.Broadcast();
- return true;
+ SendRequest();
}
} // namespace commands
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc
index 315107d94a..60cb39f987 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_capabilities_response.cc
@@ -57,11 +57,10 @@ void VRGetCapabilitiesResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::VR_GetCapabilities);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetCapabilities);
return;
}
@@ -74,6 +73,9 @@ void VRGetCapabilitiesResponse::Run() {
hmi_capabilities_.set_vr_capabilities(msg_params[strings::vr_capabilities]);
}
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetCapabilities);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::vr, sections_to_update, message_->getSchema())) {
SDL_LOG_ERROR("Failed to save VR.GetCapabilities response to cache");
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc
index e8c881f6f8..3529d9fcde 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_language_response.cc
@@ -61,11 +61,10 @@ void VRGetLanguageResponse::Run() {
const Common_Result::eType result_code = static_cast<Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::VR_GetLanguage);
-
if (Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetLanguage);
return;
}
@@ -79,6 +78,9 @@ void VRGetLanguageResponse::Run() {
hmi_capabilities_.set_active_vr_language(language);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetLanguage);
+
std::vector<std::string> sections_to_update{hmi_response::language};
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::vr, sections_to_update, message_->getSchema())) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc
index 72278fcddd..7b234befbe 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_get_supported_languages_response.cc
@@ -62,20 +62,24 @@ void VRGetSupportedLanguagesResponse::Run() {
static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
+ if (hmi_apis::Common_Result::SUCCESS != code) {
+ SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_GetSupportedLanguages);
+ return;
+ }
+
+ HMICapabilities& hmi_capabilities = hmi_capabilities_;
+ hmi_capabilities.set_vr_supported_languages(
+ (*message_)[strings::msg_params][hmi_response::languages]);
+
hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
hmi_apis::FunctionID::VR_GetSupportedLanguages);
- if (hmi_apis::Common_Result::SUCCESS == code) {
- HMICapabilities& hmi_capabilities = hmi_capabilities_;
- hmi_capabilities.set_vr_supported_languages(
- (*message_)[strings::msg_params][hmi_response::languages]);
-
- std::vector<std::string> sections_to_update{hmi_response::languages};
- if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
- hmi_interface::vr, sections_to_update, message_->getSchema())) {
- SDL_LOG_ERROR(
- "Failed to save VR.GetSupportedLanguages response to cache");
- }
+ std::vector<std::string> sections_to_update{hmi_response::languages};
+ if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
+ hmi_interface::vr, sections_to_update, message_->getSchema())) {
+ SDL_LOG_ERROR("Failed to save VR.GetSupportedLanguages response to cache");
}
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc
index 303e7a6843..2efd227add 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_is_ready_request.cc
@@ -73,6 +73,8 @@ void VRIsReadyRequest::on_event(const event_engine::Event& event) {
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_vr_cooperating(is_available);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_VR)) {
UpdateRequiredInterfaceCapabilitiesRequests(hmi_interface::vr);
@@ -92,6 +94,8 @@ void VRIsReadyRequest::on_event(const event_engine::Event& event) {
void VRIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VR_IsReady);
RequestInterfaceCapabilities(hmi_interface::vr);
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc
index 6717f332f8..03b0ee20fc 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_command_request.cc
@@ -107,6 +107,20 @@ void AddCommandRequest::Run() {
}
}
+ if ((*message_)[strings::msg_params].keyExists(strings::secondary_image)) {
+ mobile_apis::Result::eType verification_result = MessageHelper::VerifyImage(
+ (*message_)[strings::msg_params][strings::secondary_image],
+ app,
+ application_manager_);
+
+ if (mobile_apis::Result::INVALID_DATA == verification_result) {
+ SDL_LOG_ERROR("MessageHelper::VerifyImage return "
+ << verification_result);
+ SendResponse(false, verification_result);
+ return;
+ }
+ }
+
if (!((*message_)[strings::msg_params].keyExists(strings::cmd_id))) {
SDL_LOG_ERROR("INVALID_DATA");
SendResponse(false, mobile_apis::Result::INVALID_DATA);
@@ -127,10 +141,6 @@ void AddCommandRequest::Run() {
bool data_exist = false;
if ((*message_)[strings::msg_params].keyExists(strings::menu_params)) {
- if (!CheckCommandName(app)) {
- SendResponse(false, mobile_apis::Result::DUPLICATE_NAME);
- return;
- }
if (((*message_)[strings::msg_params][strings::menu_params].keyExists(
hmi_request::parent_id)) &&
(0 != (*message_)[strings::msg_params][strings::menu_params]
@@ -191,6 +201,17 @@ void AddCommandRequest::Run() {
(*message_)[strings::msg_params][strings::cmd_icon];
}
+ if (((*message_)[strings::msg_params].keyExists(
+ strings::secondary_image)) &&
+ ((*message_)[strings::msg_params][strings::secondary_image].keyExists(
+ strings::value)) &&
+ (0 < (*message_)[strings::msg_params][strings::secondary_image]
+ [strings::value]
+ .length())) {
+ ui_msg_params[strings::secondary_image] =
+ (*message_)[strings::msg_params][strings::secondary_image];
+ }
+
send_ui_ = true;
}
@@ -220,47 +241,6 @@ void AddCommandRequest::Run() {
}
}
-bool AddCommandRequest::CheckCommandName(ApplicationConstSharedPtr app) {
- if (!app) {
- return false;
- }
-
- const DataAccessor<CommandsMap> accessor = app->commands_map();
- const CommandsMap& commands = accessor.GetData();
- CommandsMap::const_iterator i = commands.begin();
- uint32_t saved_parent_id = 0;
- uint32_t parent_id = 0;
- if ((*message_)[strings::msg_params][strings::menu_params].keyExists(
- hmi_request::parent_id)) {
- parent_id = (*message_)[strings::msg_params][strings::menu_params]
- [hmi_request::parent_id]
- .asUInt();
- }
-
- for (; commands.end() != i; ++i) {
- if (!(*i->second).keyExists(strings::menu_params)) {
- continue;
- }
-
- saved_parent_id = 0;
- if ((*i->second)[strings::menu_params].keyExists(hmi_request::parent_id)) {
- saved_parent_id =
- (*i->second)[strings::menu_params][hmi_request::parent_id].asUInt();
- }
- if (((*i->second)[strings::menu_params][strings::menu_name].asString() ==
- (*message_)[strings::msg_params][strings::menu_params]
- [strings::menu_name]
- .asString()) &&
- (saved_parent_id == parent_id)) {
- SDL_LOG_INFO(
- "AddCommandRequest::CheckCommandName received"
- " command name already exist in same level menu");
- return false;
- }
- }
- return true;
-}
-
bool AddCommandRequest::CheckCommandVRSynonym(ApplicationConstSharedPtr app) {
if (!app) {
return false;
@@ -565,6 +545,16 @@ bool AddCommandRequest::IsWhiteSpaceExist() {
return true;
}
}
+
+ if ((*message_)[strings::msg_params].keyExists(strings::secondary_image)) {
+ str = (*message_)[strings::msg_params][strings::secondary_image]
+ [strings::value]
+ .asCharArray();
+ if (!CheckSyntax(str)) {
+ SDL_LOG_ERROR("Invalid secondaryImage value syntax check failed");
+ return true;
+ }
+ }
return false;
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc
index e2a37f17bd..309f07e443 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/add_sub_menu_request.cc
@@ -86,6 +86,20 @@ void AddSubMenuRequest::Run() {
}
}
+ if (received_msg_params.keyExists(strings::secondary_image)) {
+ verification_result = MessageHelper::VerifyImage(
+ received_msg_params[strings::secondary_image],
+ app,
+ application_manager_);
+
+ if (mobile_apis::Result::INVALID_DATA == verification_result) {
+ SDL_LOG_ERROR("MessageHelper::VerifyImage return "
+ << verification_result);
+ SendResponse(false, verification_result);
+ return;
+ }
+ }
+
const int32_t menu_id = received_msg_params[strings::menu_id].asInt();
const auto sub_menu = app->FindSubMenu(menu_id);
@@ -114,12 +128,6 @@ void AddSubMenuRequest::Run() {
const std::string& menu_name =
received_msg_params[strings::menu_name].asString();
- if (app->IsSubMenuNameAlreadyExist(menu_name, parent_id)) {
- SDL_LOG_ERROR("Menu name " << menu_name << " is duplicated.");
- SendResponse(false, mobile_apis::Result::DUPLICATE_NAME);
- return;
- }
-
if (!CheckSubMenuName()) {
SDL_LOG_ERROR("Sub-menu name is not valid.");
SendResponse(false, mobile_apis::Result::INVALID_DATA);
@@ -148,11 +156,23 @@ void AddSubMenuRequest::Run() {
if (received_msg_params.keyExists(strings::menu_icon)) {
msg_params[strings::menu_icon] = received_msg_params[strings::menu_icon];
}
+ if (received_msg_params.keyExists(strings::secondary_image)) {
+ msg_params[strings::secondary_image] =
+ received_msg_params[strings::secondary_image];
+ }
msg_params[strings::menu_params][strings::menu_name] =
received_msg_params[strings::menu_name];
if (received_msg_params.keyExists(strings::parent_id)) {
msg_params[strings::menu_params][strings::parent_id] = parent_id;
}
+ if (received_msg_params.keyExists(strings::secondary_text)) {
+ msg_params[strings::menu_params][strings::secondary_text] =
+ received_msg_params[strings::secondary_text];
+ }
+ if (received_msg_params.keyExists(strings::tertiary_text)) {
+ msg_params[strings::menu_params][strings::tertiary_text] =
+ received_msg_params[strings::tertiary_text];
+ }
msg_params[strings::app_id] = app->app_id();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc
index c2172d5180..8728bb4403 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_maneuver_request.cc
@@ -144,6 +144,7 @@ void AlertManeuverRequest::Run() {
smart_objects::SmartObject msg_params =
smart_objects::SmartObject(smart_objects::SmartType_Map);
+ msg_params[strings::app_id] = app->app_id();
msg_params[hmi_request::tts_chunks] =
(*message_)[strings::msg_params][strings::tts_chunks];
msg_params[hmi_request::speak_type] =
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc
index 1cd4806f7e..64eae885a8 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/get_system_capability_request.cc
@@ -204,10 +204,12 @@ void GetSystemCapabilityRequest::Run() {
auto& ext = SystemCapabilityAppExtension::ExtractExtension(*app);
if ((*message_)[app_mngr::strings::msg_params][strings::subscribe]
.asBool() == true) {
- SDL_LOG_DEBUG("Subscribe to system capability: " << response_type);
+ SDL_LOG_DEBUG("Subscribe to system capability: "
+ << response_type << " for app_id: " << app->app_id());
ext.SubscribeTo(response_type);
} else {
- SDL_LOG_DEBUG("Unsubscribe from system capability: " << response_type);
+ SDL_LOG_DEBUG("Unsubscribe from system capability: "
+ << response_type << " for app_id: " << app->app_id());
ext.UnsubscribeFrom(response_type);
}
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc
new file mode 100644
index 0000000000..c04b10cbd4
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_app_capability_updated_notification.cc
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h"
+
+namespace sdl_rpc_plugin {
+
+namespace commands {
+namespace mobile {
+
+SDL_CREATE_LOG_VARIABLE("Commands")
+
+OnAppCapabilityUpdatedNotification::OnAppCapabilityUpdatedNotification(
+ const application_manager::commands::MessageSharedPtr& message,
+ app_mngr::ApplicationManager& application_manager,
+ app_mngr::rpc_service::RPCService& rpc_service,
+ app_mngr::HMICapabilities& hmi_capabilities,
+ policy::PolicyHandlerInterface& policy_handle)
+ : CommandNotificationFromMobileImpl(message,
+ application_manager,
+ rpc_service,
+ hmi_capabilities,
+ policy_handle) {}
+
+OnAppCapabilityUpdatedNotification::~OnAppCapabilityUpdatedNotification() {}
+
+void OnAppCapabilityUpdatedNotification::Run() {
+ SDL_LOG_AUTO_TRACE();
+ app_mngr::ApplicationSharedPtr app =
+ application_manager_.application(connection_key());
+
+ if (!app) {
+ SDL_LOG_ERROR("No application associated with session key");
+ return;
+ }
+
+ (*message_)[app_mngr::strings::msg_params][app_mngr::strings::app_id] =
+ app->app_id();
+
+ SendNotificationToHMI(
+ hmi_apis::FunctionID::BasicCommunication_OnAppCapabilityUpdated);
+}
+
+} // namespace mobile
+} // namespace commands
+} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc
index 850aa64b5f..1f15170ffe 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/on_system_capability_updated_notification.cc
@@ -81,15 +81,10 @@ void OnSystemCapabilityUpdatedNotification::Run() {
}
break;
}
- case mobile_apis::SystemCapabilityType::VIDEO_STREAMING:
- if (hmi_capabilities_.video_streaming_capability()) {
- msg_params[strings::system_capability]
- [strings::video_streaming_capability] =
- *hmi_capabilities_.video_streaming_capability();
- } else {
- return;
- }
- break;
+ case mobile_apis::SystemCapabilityType::VIDEO_STREAMING: {
+ SendNotification();
+ return;
+ }
case mobile_apis::SystemCapabilityType::APP_SERVICES: {
auto all_services =
application_manager_.GetAppServiceManager().GetAllServiceRecords();
@@ -200,48 +195,51 @@ void OnSystemCapabilityUpdatedNotification::Run() {
for (; applications.end() != app_it; ++app_it) {
const ApplicationSharedPtr app = *app_it;
- if (system_capability_type ==
- mobile_apis::SystemCapabilityType::REMOTE_CONTROL &&
- !app->is_remote_control_supported()) {
- SDL_LOG_WARN(
- "App with connection key: "
- << app->app_id()
- << " was subcribed to REMOTE_CONTROL system capabilities, but "
- "does not have RC permissions. Unsubscribing");
- auto& ext = SystemCapabilityAppExtension::ExtractExtension(*app);
- ext.UnsubscribeFrom(system_capability_type);
- continue;
- }
- if (mobile_apis::SystemCapabilityType::DISPLAYS == system_capability_type) {
- SDL_LOG_DEBUG("Using common display capabilities");
- auto capabilities = hmi_capabilities_.system_display_capabilities();
-
- auto& builder = app->display_capabilities_builder();
- if (app->is_resuming() && builder.IsWindowResumptionNeeded()) {
- SDL_LOG_DEBUG("Application "
- << app->app_id()
- << " is resuming. Providing cached capabilities");
- auto display_caps = builder.display_capabilities();
- capabilities = display_caps;
- } else if (app->display_capabilities()) {
- SDL_LOG_DEBUG("Application " << app->app_id()
- << " has specific display capabilities");
- const WindowID window_id =
- msg_params[strings::system_capability]
- [strings::display_capabilities][0]
- [strings::window_capabilities][0][strings::window_id]
- .asInt();
- capabilities = app->display_capabilities(window_id);
- }
+ switch (system_capability_type) {
+ case mobile_apis::SystemCapabilityType::REMOTE_CONTROL: {
+ if (!app->is_remote_control_supported()) {
+ SDL_LOG_WARN("App with connection key: "
+ << app->app_id()
+ << " was subcribed to REMOTE_CONTROL system "
+ "capabilities, but "
+ "does not have RC permissions. Unsubscribing");
+ auto& ext = SystemCapabilityAppExtension::ExtractExtension(*app);
+ ext.UnsubscribeFrom(system_capability_type);
+ }
+ } break;
+
+ case mobile_apis::SystemCapabilityType::DISPLAYS: {
+ SDL_LOG_DEBUG("Using common display capabilities");
+ auto capabilities = hmi_capabilities_.system_display_capabilities();
+ auto& builder = app->display_capabilities_builder();
+ if (app->is_resuming() && builder.IsWindowResumptionNeeded()) {
+ SDL_LOG_DEBUG("Application "
+ << app->app_id()
+ << " is resuming. Providing cached capabilities");
+ auto display_caps = builder.display_capabilities();
+ capabilities = display_caps;
+ } else if (app->display_capabilities()) {
+ SDL_LOG_DEBUG("Application " << app->app_id()
+ << " has specific display capabilities");
+ const WindowID window_id =
+ msg_params[strings::system_capability]
+ [strings::display_capabilities][0]
+ [strings::window_capabilities][0][strings::window_id]
+ .asInt();
+ capabilities = app->display_capabilities(window_id);
+ }
- if (!capabilities) {
- SDL_LOG_WARN("No available display capabilities for sending. Skipping");
- continue;
- }
+ if (!capabilities) {
+ SDL_LOG_WARN(
+ "No available display capabilities for sending. Skipping");
+ continue;
+ }
- msg_params[strings::system_capability][strings::display_capabilities] =
- *capabilities;
+ msg_params[strings::system_capability][strings::display_capabilities] =
+ *capabilities;
+ } break;
+ default: { SDL_LOG_ERROR("Unknown system capability type"); }
}
SDL_LOG_INFO("Sending OnSystemCapabilityUpdated " << capability_type_string
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc
index 5d3b203afe..bb990574bd 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc
@@ -195,8 +195,7 @@ void PerformInteractionRequest::Run() {
switch (interaction_mode_) {
case mobile_apis::InteractionMode::BOTH: {
SDL_LOG_DEBUG("Interaction Mode: BOTH");
- if (!CheckChoiceSetVRSynonyms(app) || !CheckChoiceSetMenuNames(app) ||
- !CheckVrHelpItemPositions(app) ||
+ if (!CheckChoiceSetVRSynonyms(app) || !CheckVrHelpItemPositions(app) ||
!CheckChoiceSetListVRCommands(app)) {
return;
}
@@ -204,8 +203,7 @@ void PerformInteractionRequest::Run() {
}
case mobile_apis::InteractionMode::MANUAL_ONLY: {
SDL_LOG_DEBUG("Interaction Mode: MANUAL_ONLY");
- if (!CheckChoiceSetVRSynonyms(app) || !CheckChoiceSetMenuNames(app) ||
- !CheckVrHelpItemPositions(app)) {
+ if (!CheckChoiceSetVRSynonyms(app) || !CheckVrHelpItemPositions(app)) {
return;
}
break;
@@ -683,60 +681,6 @@ void PerformInteractionRequest::SendVRPerformInteractionRequest(
hmi_apis::FunctionID::VR_PerformInteraction, &msg_params, true);
}
-bool PerformInteractionRequest::CheckChoiceSetMenuNames(
- application_manager::ApplicationSharedPtr const app) {
- SDL_LOG_AUTO_TRACE();
-
- smart_objects::SmartObject& choice_list =
- (*message_)[strings::msg_params][strings::interaction_choice_set_id_list];
-
- for (size_t i = 0; i < choice_list.length(); ++i) {
- // choice_set contains SmartObject msg_params
- smart_objects::SmartObject i_choice_set =
- app->FindChoiceSet(choice_list[i].asInt());
-
- for (size_t j = 0; j < choice_list.length(); ++j) {
- smart_objects::SmartObject j_choice_set =
- app->FindChoiceSet(choice_list[j].asInt());
-
- if (i == j) {
- // skip check the same element
- continue;
- }
-
- if ((smart_objects::SmartType_Null == i_choice_set.getType()) ||
- (smart_objects::SmartType_Null == j_choice_set.getType())) {
- SDL_LOG_ERROR("Invalid ID");
- SendResponse(false, mobile_apis::Result::INVALID_ID);
- return false;
- }
-
- size_t ii = 0;
- size_t jj = 0;
- for (; ii < i_choice_set[strings::choice_set].length(); ++ii) {
- for (; jj < j_choice_set[strings::choice_set].length(); ++jj) {
- const std::string& ii_menu_name =
- i_choice_set[strings::choice_set][ii][strings::menu_name]
- .asString();
- const std::string& jj_menu_name =
- j_choice_set[strings::choice_set][jj][strings::menu_name]
- .asString();
-
- if (ii_menu_name == jj_menu_name) {
- SDL_LOG_ERROR("Choice set has duplicated menu name");
- SendResponse(false,
- mobile_apis::Result::DUPLICATE_NAME,
- "Choice set has duplicated menu name");
- return false;
- }
- }
- }
- }
- }
-
- return true;
-}
-
bool PerformInteractionRequest::CheckChoiceSetVRSynonyms(
application_manager::ApplicationSharedPtr const app) {
SDL_LOG_AUTO_TRACE();
@@ -1166,27 +1110,15 @@ bool PerformInteractionRequest::SetChoiceIdToResponseMsgParams(
return true;
}
- switch (interaction_mode_) {
- case mobile_apis::InteractionMode::eType::MANUAL_ONLY:
- if (ui_choice_id_valid) {
- msg_param[strings::trigger_source] =
- mobile_apis::TriggerSource::TS_MENU;
- msg_param[strings::choice_id] = ui_choice_id_received_;
- }
- case mobile_apis::InteractionMode::eType::VR_ONLY:
- if (vr_choice_id_valid) {
- msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_VR;
- msg_param[strings::choice_id] = vr_choice_id_received_;
- }
- default:
- if (ui_choice_id_valid) {
- msg_param[strings::trigger_source] =
- mobile_apis::TriggerSource::TS_MENU;
- msg_param[strings::choice_id] = ui_choice_id_received_;
- } else if (vr_choice_id_valid) {
- msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_VR;
- msg_param[strings::choice_id] = vr_choice_id_received_;
- }
+ if (ui_choice_id_valid &&
+ interaction_mode_ != mobile_apis::InteractionMode::eType::VR_ONLY) {
+ msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_MENU;
+ msg_param[strings::choice_id] = ui_choice_id_received_;
+ } else if (vr_choice_id_valid &&
+ interaction_mode_ !=
+ mobile_apis::InteractionMode::eType::MANUAL_ONLY) {
+ msg_param[strings::trigger_source] = mobile_apis::TriggerSource::TS_VR;
+ msg_param[strings::choice_id] = vr_choice_id_received_;
}
return true;
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc
index 6ac830c378..920805be7c 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc
@@ -159,18 +159,6 @@ uint32_t RegisterAppInterfaceRequest::default_timeout() const {
return 0;
}
-void RegisterAppInterfaceRequest::WaitForHMIIsReady() {
- while (!application_manager_.IsStopping() &&
- !application_manager_.IsHMICooperating()) {
- SDL_LOG_DEBUG("Waiting for the HMI... conn_key="
- << connection_key() << ", correlation_id=" << correlation_id()
- << ", default_timeout=" << default_timeout()
- << ", thread=" << pthread_self());
- sleep(1);
- // TODO(DK): timer_->StartWait(1);
- }
-}
-
void RegisterAppInterfaceRequest::FillApplicationParams(
ApplicationSharedPtr application) {
SDL_LOG_AUTO_TRACE();
@@ -488,10 +476,8 @@ void RegisterAppInterfaceRequest::Run() {
SDL_LOG_AUTO_TRACE();
SDL_LOG_DEBUG("Connection key is " << connection_key());
- WaitForHMIIsReady();
-
- if (application_manager_.IsStopping()) {
- SDL_LOG_WARN("The ApplicationManager is stopping!");
+ if (!application_manager_.WaitForHmiIsReady()) {
+ SDL_LOG_WARN("Failed to wait for HMI readiness");
return;
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc
index 40302e51d5..f4e07d4b78 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/reset_global_properties_request.cc
@@ -89,6 +89,10 @@ void ResetGlobalPropertiesRequest::Run() {
StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_TTS);
}
+ if (reset_global_props_result.HasRCPropertiesReset()) {
+ StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_RC);
+ }
+
app->set_reset_global_properties_active(true);
if (reset_global_props_result.HasUIPropertiesReset()) {
@@ -110,6 +114,15 @@ void ResetGlobalPropertiesRequest::Run() {
SendHMIRequest(
hmi_apis::FunctionID::TTS_SetGlobalProperties, msg_params.get(), true);
}
+
+ if (reset_global_props_result.HasRCPropertiesReset()) {
+ smart_objects::SmartObjectSPtr msg_params =
+ MessageHelper::CreateRCResetGlobalPropertiesRequest(
+ reset_global_props_result, app);
+
+ SendHMIRequest(
+ hmi_apis::FunctionID::RC_SetGlobalProperties, msg_params.get(), true);
+ }
}
void ResetGlobalPropertiesRequest::on_event(const event_engine::Event& event) {
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc
index aa5e1077ca..2b0a36cb9d 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/send_haptic_data_request.cc
@@ -70,6 +70,7 @@ void SendHapticDataRequest::Run() {
}
if (app->is_navi() || app->mobile_projection_enabled()) {
+ msg_params[strings::app_id] = connection_key();
SendHMIRequest(hmi_apis::FunctionID::UI_SendHapticData, &msg_params, true);
} else {
SendResponse(false,
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc
index 396763ff98..bbce4d2bb3 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/set_global_properties_request.cc
@@ -151,6 +151,17 @@ void SetGlobalPropertiesRequest::Run() {
return;
}
+ if (!ValidateCustomKeys()) {
+ SDL_LOG_ERROR(
+ "Number of customizable keys exceeds the maximum number for this "
+ "layout");
+ SendResponse(
+ false,
+ mobile_apis::Result::INVALID_DATA,
+ "customKeys exceeds the number of customizable keys in this Layout");
+ return;
+ }
+
// if application waits for sending ttsGlobalProperties need to remove this
// application from tts_global_properties_app_list_
application_manager_.RemoveAppFromTTSGlobalPropertiesList(connection_key());
@@ -642,7 +653,53 @@ void SetGlobalPropertiesRequest::PrepareUIRequestMenuAndKeyboardData(
if (is_keyboard_props_present) {
out_params[hmi_request::keyboard_properties] =
msg_params[hmi_request::keyboard_properties];
- app->set_keyboard_props(msg_params[hmi_request::keyboard_properties]);
+ smart_objects::SmartObject cached_keyboard_props(
+ msg_params[hmi_request::keyboard_properties]);
+
+ if (cached_keyboard_props.keyExists(hmi_request::auto_complete_list)) {
+ auto auto_complete_list =
+ cached_keyboard_props[hmi_request::auto_complete_list].asArray();
+ if (auto_complete_list && auto_complete_list->empty()) {
+ cached_keyboard_props.erase(hmi_request::auto_complete_list);
+ }
+ }
+
+ auto saved_keyboard_props = app->keyboard_props();
+ if (!saved_keyboard_props) {
+ app->set_keyboard_props(cached_keyboard_props);
+ return;
+ }
+
+ if (!msg_params[hmi_request::keyboard_properties].keyExists(
+ hmi_request::keyboard_layout) &&
+ saved_keyboard_props->keyExists(hmi_request::keyboard_layout)) {
+ cached_keyboard_props[hmi_request::keyboard_layout] =
+ static_cast<hmi_apis::Common_KeyboardLayout::eType>(
+ (*saved_keyboard_props)[hmi_request::keyboard_layout].asInt());
+ }
+
+ if (!msg_params[hmi_request::keyboard_properties].keyExists(
+ hmi_response::language) &&
+ saved_keyboard_props->keyExists(hmi_response::language)) {
+ cached_keyboard_props[hmi_response::language] =
+ static_cast<hmi_apis::Common_Language::eType>(
+ (*saved_keyboard_props)[hmi_response::language].asInt());
+ }
+
+ if (!msg_params[hmi_request::keyboard_properties].keyExists(
+ hmi_request::auto_complete_list) &&
+ saved_keyboard_props->keyExists(hmi_request::auto_complete_list)) {
+ cached_keyboard_props[hmi_request::auto_complete_list] =
+ (*saved_keyboard_props)[hmi_request::auto_complete_list];
+ }
+
+ if (!msg_params[hmi_request::keyboard_properties].keyExists(
+ hmi_request::mask_input_characters) &&
+ saved_keyboard_props->keyExists(hmi_request::mask_input_characters)) {
+ cached_keyboard_props[hmi_request::mask_input_characters] =
+ (*saved_keyboard_props)[hmi_request::mask_input_characters];
+ }
+ app->set_keyboard_props(cached_keyboard_props);
}
}
@@ -820,9 +877,130 @@ bool SetGlobalPropertiesRequest::IsWhiteSpaceExist() {
}
}
}
+
+ if (msg_params[strings::keyboard_properties].keyExists(
+ hmi_request::custom_keys)) {
+ const smart_objects::SmartArray* custom_keys_array =
+ msg_params[strings::keyboard_properties][hmi_request::custom_keys]
+ .asArray();
+
+ for (auto keys : (*custom_keys_array)) {
+ if (!CheckSyntax(keys.asCharArray())) {
+ SDL_LOG_ERROR(
+ "Invalid keyboard_properties "
+ "custom_keys syntax check failed");
+ return true;
+ }
+ }
+ }
}
+
return false;
}
+hmi_apis::Common_KeyboardLayout::eType
+SetGlobalPropertiesRequest::GetKeyboardLayout() const {
+ SDL_LOG_AUTO_TRACE();
+
+ const smart_objects::SmartObject& msg_params =
+ (*message_)[strings::msg_params];
+ if (msg_params[strings::keyboard_properties].keyExists(
+ hmi_request::keyboard_layout)) {
+ return static_cast<hmi_apis::Common_KeyboardLayout::eType>(
+ msg_params[strings::keyboard_properties][hmi_request::keyboard_layout]
+ .asInt());
+ }
+
+ ApplicationSharedPtr app = application_manager_.application(connection_key());
+ auto saved_keyboard_props = app->keyboard_props();
+ if (saved_keyboard_props) {
+ if (saved_keyboard_props->keyExists(hmi_request::keyboard_layout)) {
+ return static_cast<hmi_apis::Common_KeyboardLayout::eType>(
+ (*saved_keyboard_props)[hmi_request::keyboard_layout].asInt());
+ }
+ }
+
+ return hmi_apis::Common_KeyboardLayout::QWERTY;
+}
+
+uint32_t SetGlobalPropertiesRequest::GetAllowedNumberOfConfigurableKeys()
+ const {
+ SDL_LOG_AUTO_TRACE();
+
+ ApplicationSharedPtr app = application_manager_.application(connection_key());
+ auto display_capabilities = app->display_capabilities();
+ if (!display_capabilities) {
+ SDL_LOG_WARN("Display capabilities are not available");
+ return 0;
+ }
+
+ auto* window_capabilities =
+ (*display_capabilities)[0][strings::window_capabilities].asArray();
+
+ if (!window_capabilities) {
+ SDL_LOG_WARN("Window capabilities are not available");
+ return 0;
+ }
+
+ if (!(*window_capabilities)[0].keyExists(
+ hmi_response::keyboard_capabilities)) {
+ SDL_LOG_WARN("Keyboard capabilities are not available");
+ return 0;
+ }
+
+ if (!(*window_capabilities)[0][hmi_response::keyboard_capabilities].keyExists(
+ hmi_response::supported_keyboards)) {
+ SDL_LOG_WARN("Data about supported keyboards is not available");
+ return 0;
+ }
+
+ auto supported_keyboards =
+ (*window_capabilities)[0][hmi_response::keyboard_capabilities]
+ [hmi_response::supported_keyboards]
+ .asArray();
+
+ const auto requested_layout = GetKeyboardLayout();
+ for (auto keyboard : (*supported_keyboards)) {
+ if (requested_layout ==
+ static_cast<hmi_apis::Common_KeyboardLayout::eType>(
+ keyboard[hmi_request::keyboard_layout].asInt())) {
+ return keyboard[hmi_response::num_configurable_keys].asUInt();
+ }
+ }
+
+ return 0;
+}
+
+bool SetGlobalPropertiesRequest::ValidateCustomKeys() const {
+ SDL_LOG_AUTO_TRACE();
+
+ const smart_objects::SmartObject& msg_params =
+ (*message_)[strings::msg_params];
+
+ if (!msg_params.keyExists(strings::keyboard_properties)) {
+ SDL_LOG_WARN("Keyboard properties are not available");
+ return true;
+ }
+
+ if (!msg_params[strings::keyboard_properties].keyExists(
+ hmi_request::custom_keys)) {
+ SDL_LOG_WARN("Customizable keys are not available");
+ return true;
+ }
+
+ auto custom_keys_array =
+ msg_params[strings::keyboard_properties][hmi_request::custom_keys]
+ .asArray();
+ if (custom_keys_array) {
+ uint32_t requested_key_count = custom_keys_array->size();
+ uint32_t allowed_key_count = GetAllowedNumberOfConfigurableKeys();
+
+ if (requested_key_count > allowed_key_count) {
+ return false;
+ }
+ }
+
+ return true;
+}
} // namespace commands
} // namespace sdl_rpc_plugin
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc
index 570a4ce12e..2727c89673 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/hmi_command_factory.cc
@@ -173,6 +173,7 @@
#include "sdl_rpc_plugin/commands/hmi/basic_communication_on_awake_sdl.h"
#include "sdl_rpc_plugin/commands/hmi/basic_communication_system_request.h"
#include "sdl_rpc_plugin/commands/hmi/basic_communication_system_response.h"
+#include "sdl_rpc_plugin/commands/hmi/bc_on_app_capability_updated_notification.h"
#include "sdl_rpc_plugin/commands/hmi/dial_number_request.h"
#include "sdl_rpc_plugin/commands/hmi/dial_number_response.h"
#include "sdl_rpc_plugin/commands/hmi/navi_alert_maneuver_request.h"
@@ -942,6 +943,10 @@ CommandCreator& HMICommandFactory::get_creator_factory(
case hmi_apis::FunctionID::UI_OnSubtleAlertPressed: {
return factory.GetCreator<commands::OnUISubtleAlertPressedNotification>();
}
+ case hmi_apis::FunctionID::BasicCommunication_OnAppCapabilityUpdated: {
+ return factory
+ .GetCreator<commands::BCOnAppCapabilityUpdatedNotification>();
+ }
default: { return factory.GetCreator<InvalidCommand>(); }
}
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc
index 9809a11a81..0a8c342448 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc
@@ -76,6 +76,7 @@
#include "sdl_rpc_plugin/commands/mobile/get_way_points_response.h"
#include "sdl_rpc_plugin/commands/mobile/list_files_request.h"
#include "sdl_rpc_plugin/commands/mobile/list_files_response.h"
+#include "sdl_rpc_plugin/commands/mobile/on_app_capability_updated_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_app_interface_unregistered_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_audio_pass_thru_notification.h"
#include "sdl_rpc_plugin/commands/mobile/on_button_event_notification.h"
@@ -496,6 +497,10 @@ CommandCreator& MobileCommandFactory::get_notification_from_mobile_creator(
return factory
.GetCreator<commands::OnWayPointChangeNotificationFromMobile>();
}
+ case mobile_apis::FunctionID::OnAppCapabilityUpdatedID: {
+ return factory
+ .GetCreator<commands::mobile::OnAppCapabilityUpdatedNotification>();
+ }
default: {}
}
return factory.GetCreator<InvalidCommand>();
@@ -548,10 +553,12 @@ bool MobileCommandFactory::IsAbleToProcess(
const int32_t function_id,
const application_manager::commands::Command::CommandSource message_source)
const {
+ SDL_LOG_AUTO_TRACE();
auto id = static_cast<mobile_apis::FunctionID::eType>(function_id);
return get_command_creator(id, mobile_apis::messageType::INVALID_ENUM)
.CanBeCreated() ||
- get_notification_creator(id).CanBeCreated();
+ get_notification_creator(id).CanBeCreated() ||
+ get_notification_from_mobile_creator(id).CanBeCreated();
}
CommandSharedPtr MobileCommandFactory::CreateCommand(
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc
index 4756c8b9a2..c5bc79f09d 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/sdl_rpc_plugin.cc
@@ -131,14 +131,20 @@ void SDLRPCPlugin::RevertResumption(application_manager::Application& app) {
pending_resumption_handler_->OnResumptionRevert();
if (application_manager_->IsAppSubscribedForWayPoints(app)) {
- application_manager_->UnsubscribeAppFromWayPoints(app.app_id());
- if (!application_manager_->IsAnyAppSubscribedForWayPoints()) {
+ const auto subscribed_apps =
+ application_manager_->GetAppsSubscribedForWayPoints();
+ const bool send_unsubscribe =
+ subscribed_apps.size() <= 1 &&
+ application_manager_->IsSubscribedToHMIWayPoints();
+ if (send_unsubscribe) {
SDL_LOG_DEBUG("Send UnsubscribeWayPoints");
auto request =
application_manager::MessageHelper::CreateUnsubscribeWayPointsRequest(
application_manager_->GetNextHMICorrelationID());
application_manager_->GetRPCService().ManageHMICommand(request);
}
+ application_manager_->UnsubscribeAppFromWayPoints(app.app_id(),
+ send_unsubscribe);
}
}
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc
new file mode 100644
index 0000000000..2d875a2680
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/bc_on_app_capability_updated_notification_test.cc
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "hmi/bc_on_app_capability_updated_notification.h"
+
+#include "application_manager/commands/commands_test.h"
+#include "gtest/gtest.h"
+#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace test {
+namespace components {
+namespace commands_test {
+namespace hmi_commands_test {
+namespace bc_on_app_capability_updated_notification_test {
+
+using sdl_rpc_plugin::commands::BCOnAppCapabilityUpdatedNotification;
+using ::testing::_;
+
+typedef std::shared_ptr<BCOnAppCapabilityUpdatedNotification>
+ BCOnAppCapabilityUpdatedNotificationPtr;
+
+namespace strings = application_manager::strings;
+namespace {
+const uint32_t kConnectionKey = 1u;
+} // namespace
+
+MATCHER_P(CheckAppCapability, app_capability, "") {
+ return app_capability == (*arg)[strings::msg_params][strings::app_capability];
+}
+
+class BCOnAppCapabilityUpdatedNotificationTest
+ : public CommandsTest<CommandsTestMocks::kIsNice> {
+ protected:
+ void SetUp() OVERRIDE {
+ message_ = CreateMessage();
+ (*message_)[strings::params][strings::connection_key] = kConnectionKey;
+ command_ = CreateCommand<BCOnAppCapabilityUpdatedNotification>(message_);
+ mock_app_ = CreateMockApp();
+ }
+
+ BCOnAppCapabilityUpdatedNotificationPtr command_;
+ MockAppPtr mock_app_;
+ MessageSharedPtr message_;
+};
+
+TEST_F(BCOnAppCapabilityUpdatedNotificationTest, Run_SendMessageToHMI_SUCCESS) {
+ smart_objects::SmartObject app_capability =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ app_capability[strings::app_capability_type] =
+ mobile_apis::AppCapabilityType::VIDEO_STREAMING;
+ app_capability[strings::video_streaming_capability] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ FillVideoStreamingCapability(
+ app_capability[strings::video_streaming_capability]);
+
+ (*message_)[strings::msg_params][strings::app_capability] = app_capability;
+
+ ASSERT_TRUE(command_->Init());
+
+ EXPECT_CALL(mock_rpc_service_,
+ SendMessageToHMI(CheckAppCapability(app_capability)));
+ command_->Run();
+}
+
+} // namespace bc_on_app_capability_updated_notification_test
+} // namespace hmi_commands_test
+} // namespace commands_test
+} // namespace components
+} // namespace test
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc
index 8cdce4fa74..3e01849807 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/get_system_info_response_test.cc
@@ -68,6 +68,7 @@ typedef NiceMock<
namespace {
const uint32_t kConnectionKey = 2u;
const std::string ccpu_version("4.1.3.B_EB355B");
+const std::string kHardwareVersion("1.1.1.1");
const std::string wers_country_code("WAEGB");
const std::string lang_code("EN-US");
} // namespace
@@ -82,14 +83,36 @@ class GetSystemInfoResponseTest
(*command_msg)[strings::msg_params]["ccpu_version"] = ccpu_version;
(*command_msg)[strings::msg_params]["wersCountryCode"] = wers_country_code;
(*command_msg)[strings::msg_params]["language"] = lang_code;
-
return command_msg;
}
+ void SetHardwareVersionFromPT() {
+ const std::string hardware_version_from_pt = "1.1.1.0";
+ ON_CALL(mock_policy_handler_, GetHardwareVersionFromPT())
+ .WillByDefault(Return(hardware_version_from_pt));
+ EXPECT_CALL(mock_hmi_capabilities_,
+ set_hardware_version(hardware_version_from_pt));
+ }
+
SmartObject capabilities_;
};
-TEST_F(GetSystemInfoResponseTest, GetSystemInfo_SUCCESS) {
+TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UNSUCCESS) {
+ MessageSharedPtr command_msg = CreateCommandMsg();
+ (*command_msg)[strings::params][hmi_response::code] =
+ hmi_apis::Common_Result::WRONG_LANGUAGE;
+ (*command_msg)[strings::msg_params][hmi_response::capabilities] =
+ (capabilities_);
+
+ ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg));
+
+ EXPECT_CALL(mock_hmi_capabilities_, UpdateCachedCapabilities());
+ EXPECT_CALL(mock_policy_handler_, SetPreloadedPtFlag(false));
+
+ command->Run();
+}
+
+TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UpdateCapabilities_Called) {
MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[strings::params][hmi_response::code] =
hmi_apis::Common_Result::SUCCESS;
@@ -98,28 +121,35 @@ TEST_F(GetSystemInfoResponseTest, GetSystemInfo_SUCCESS) {
ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg));
- EXPECT_CALL(mock_policy_handler_,
- OnGetSystemInfo(ccpu_version, wers_country_code, lang_code));
+ EXPECT_CALL(mock_hmi_capabilities_, OnSoftwareVersionReceived(ccpu_version));
+ ASSERT_TRUE(command->Init());
command->Run();
}
-TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UNSUCCESS) {
+TEST_F(GetSystemInfoResponseTest,
+ GetSystemInfo_SaveHardwareVersionToHMICapabilitiesIfPresentInResponse) {
MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[strings::params][hmi_response::code] =
- hmi_apis::Common_Result::WRONG_LANGUAGE;
+ hmi_apis::Common_Result::SUCCESS;
(*command_msg)[strings::msg_params][hmi_response::capabilities] =
(capabilities_);
+ (*command_msg)[strings::msg_params][strings::system_hardware_version] =
+ kHardwareVersion;
ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg));
- EXPECT_CALL(mock_hmi_capabilities_, UpdateCachedCapabilities());
- EXPECT_CALL(mock_policy_handler_, SetPreloadedPtFlag(false));
+ SetHardwareVersionFromPT();
+ EXPECT_CALL(mock_policy_handler_, OnHardwareVersionReceived(_));
+ EXPECT_CALL(mock_hmi_capabilities_, set_hardware_version(kHardwareVersion));
+ ASSERT_TRUE(command->Init());
command->Run();
}
-TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UpdateCapabilities_Called) {
+TEST_F(
+ GetSystemInfoResponseTest,
+ GetSystemInfo_DontSaveHardwareVersionToHMICapabilitiesIfAbsentInResponse) {
MessageSharedPtr command_msg = CreateCommandMsg();
(*command_msg)[strings::params][hmi_response::code] =
hmi_apis::Common_Result::SUCCESS;
@@ -128,7 +158,10 @@ TEST_F(GetSystemInfoResponseTest, GetSystemInfo_UpdateCapabilities_Called) {
ResponseFromHMIPtr command(CreateCommand<GetSystemInfoResponse>(command_msg));
- EXPECT_CALL(mock_hmi_capabilities_, OnSoftwareVersionReceived(ccpu_version));
+ SetHardwareVersionFromPT();
+ EXPECT_CALL(mock_policy_handler_, OnHardwareVersionReceived(_)).Times(0);
+ EXPECT_CALL(mock_hmi_capabilities_, set_hardware_version(kHardwareVersion))
+ .Times(0);
ASSERT_TRUE(command->Init());
command->Run();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc
index ae2a544cc9..1316952a92 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/on_bc_system_capability_updated_notification_from_hmi_test.cc
@@ -33,6 +33,8 @@
#include "hmi/on_bc_system_capability_updated_notification_from_hmi.h"
#include "application_manager/commands/commands_test.h"
+#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h"
+
#include "gtest/gtest.h"
namespace test {
@@ -47,8 +49,10 @@ using ::testing::Return;
typedef std::shared_ptr<OnBCSystemCapabilityUpdatedNotificationFromHMI>
OnBCSystemCapabilityUpdatedNotificationFromHMIPtr;
+typedef mobile_apis::SystemCapabilityType::eType SystemCapabilityType;
namespace strings = application_manager::strings;
+
namespace {
const uint32_t kAppId = 1u;
} // namespace
@@ -61,11 +65,30 @@ MATCHER(CheckMessageToMobile, "") {
(*arg)[strings::params][strings::function_id].asInt());
const bool app_id_exist =
(*arg)[strings::msg_params].keyExists(strings::app_id);
- bool is_connection_key_correct = true;
- if ((*arg)[strings::msg_params].keyExists(strings::connection_key)) {
- is_connection_key_correct =
- (*arg)[strings::params][strings::connection_key] == kAppId;
- }
+ const bool is_connection_key_correct = [](arg_type arg) {
+ if ((*arg)[strings::msg_params].keyExists(strings::connection_key)) {
+ return (*arg)[strings::params][strings::connection_key] == kAppId;
+ }
+ return false;
+ };
+
+ return is_function_id_matched && app_id_exist && is_connection_key_correct;
+}
+
+MATCHER(CheckMessageToMobileWithoutAppId, "") {
+ const auto function_id = mobile_apis::FunctionID::OnSystemCapabilityUpdatedID;
+
+ const bool is_function_id_matched =
+ function_id == static_cast<am::mobile_api::FunctionID::eType>(
+ (*arg)[strings::params][strings::function_id].asInt());
+ const bool app_id_exist =
+ (*arg)[strings::msg_params].keyExists(strings::app_id);
+ const bool is_connection_key_correct = [](arg_type arg) {
+ if ((*arg)[strings::msg_params].keyExists(strings::connection_key)) {
+ return (*arg)[strings::params][strings::connection_key] == kAppId;
+ }
+ return false;
+ };
return is_function_id_matched && !app_id_exist && is_connection_key_correct;
}
@@ -73,6 +96,27 @@ MATCHER_P(CheckDisplayCapabilitiesNotChanged, display_capability, "") {
return display_capability == arg;
}
+MATCHER_P2(CheckVideoStreamingCapability,
+ system_capability_type,
+ video_streaming_capability,
+ "") {
+ const mobile_apis::SystemCapabilityType::eType received_sys_cap_type =
+ static_cast<mobile_apis::SystemCapabilityType::eType>(
+ (*arg)[strings::msg_params][strings::system_capability]
+ [strings::system_capability_type]
+ .asInt());
+
+ const bool system_capability_type_matched =
+ received_sys_cap_type == system_capability_type;
+
+ const bool video_capability_matched =
+ video_streaming_capability ==
+ (*arg)[strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability];
+
+ return system_capability_type_matched && video_capability_matched;
+}
+
class OnBCSystemCapabilityUpdatedNotificationFromHMITest
: public CommandsTest<CommandsTestMocks::kIsNice> {
protected:
@@ -105,7 +149,7 @@ TEST_F(
EXPECT_CALL(
mock_rpc_service_,
ManageMobileCommand(
- CheckMessageToMobile(),
+ CheckMessageToMobileWithoutAppId(),
::application_manager::commands::Command::CommandSource::SOURCE_SDL))
.WillOnce(Return(true));
@@ -130,7 +174,7 @@ TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest,
TEST_F(
OnBCSystemCapabilityUpdatedNotificationFromHMITest,
- Run_AppRegisteredWithPresentedAppIdInMessage_SetDisplayCapabilitiesToApp_SendMessageToMobile) {
+ Run_AppRegisteredWithPresentedAppIdInMessage_SetDisplayCapabilitiesToAppAndAppIdIsErasedFromMessage_SendMessageToMobile) {
(*message_)[am::strings::msg_params][strings::system_capability]
[am::strings::system_capability_type] =
mobile_apis::SystemCapabilityType::DISPLAYS;
@@ -147,7 +191,7 @@ TEST_F(
EXPECT_CALL(
mock_rpc_service_,
ManageMobileCommand(
- CheckMessageToMobile(),
+ CheckMessageToMobileWithoutAppId(),
::application_manager::commands::Command::CommandSource::SOURCE_SDL))
.WillOnce(Return(true));
@@ -155,6 +199,149 @@ TEST_F(
command_->Run();
}
+TEST_F(
+ OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_SysCapTypeVideoStreaming_CapabilityIsAbsent_DoesntSetInHMICapabilities) {
+ smart_objects::SmartObject system_capability =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ system_capability[strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ ASSERT_TRUE(command_->Init());
+ EXPECT_CALL(mock_hmi_capabilities_, set_video_streaming_capability(_))
+ .Times(0);
+ command_->Run();
+}
+
+TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppIdIsAbsent_NotificationIgnored) {
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0);
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppNotRegistered_NotificationIgnored) {
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+ (*message_)[am::strings::msg_params][strings::app_id] = kAppId;
+
+ ApplicationSharedPtr app; // Empty application shared pointer
+
+ ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(app));
+ EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0);
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppNotSubsribed_NotificationIgnored) {
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+ (*message_)[am::strings::msg_params][strings::app_id] = kAppId;
+
+ sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin;
+
+ // By default system capability extension is not subsribed to the
+ // VIDEO_STREAMING
+ auto system_capability_app_extension =
+ std::make_shared<sdl_rpc_plugin::SystemCapabilityAppExtension>(
+ sdl_rpc_plugin, *mock_app_);
+
+ ON_CALL(*mock_app_,
+ QueryInterface(sdl_rpc_plugin::SystemCapabilityAppExtension::
+ SystemCapabilityAppExtensionUID))
+ .WillByDefault(Return(system_capability_app_extension));
+ ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_));
+
+ EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0);
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(
+ OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppIsSubsribed_VideoCapabilityIsAbsent_NotificationIgnored) {
+ const mobile_apis::SystemCapabilityType::eType system_capability_type =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] = system_capability_type;
+ (*message_)[am::strings::msg_params][strings::app_id] = kAppId;
+
+ sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin;
+ std::shared_ptr<sdl_rpc_plugin::SystemCapabilityAppExtension>
+ system_capability_app_extension(
+ std::make_shared<sdl_rpc_plugin::SystemCapabilityAppExtension>(
+ sdl_rpc_plugin, *mock_app_));
+ system_capability_app_extension->SubscribeTo(system_capability_type);
+
+ ON_CALL(*mock_app_,
+ QueryInterface(sdl_rpc_plugin::SystemCapabilityAppExtension::
+ SystemCapabilityAppExtensionUID))
+ .WillByDefault(Return(system_capability_app_extension));
+ ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_));
+
+ EXPECT_CALL(mock_rpc_service_, ManageMobileCommand(_, _)).Times(0);
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(
+ OnBCSystemCapabilityUpdatedNotificationFromHMITest,
+ Run_VideoStreamingCapability_AppIsSubsribed_VideoCapabilityExists_NotificationForwarded) {
+ const mobile_apis::SystemCapabilityType::eType system_capability_type =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] = system_capability_type;
+ (*message_)[am::strings::msg_params][strings::app_id] = kAppId;
+
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability] =
+ new smart_objects::SmartObject(
+ smart_objects::SmartType::SmartType_Map);
+
+ auto& video_streaming_capability =
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability];
+
+ FillVideoStreamingCapability(video_streaming_capability);
+
+ sdl_rpc_plugin::SDLRPCPlugin sdl_rpc_plugin;
+ std::shared_ptr<sdl_rpc_plugin::SystemCapabilityAppExtension>
+ system_capability_app_extension(
+ std::make_shared<sdl_rpc_plugin::SystemCapabilityAppExtension>(
+ sdl_rpc_plugin, *mock_app_));
+ system_capability_app_extension->SubscribeTo(system_capability_type);
+
+ ON_CALL(*mock_app_,
+ QueryInterface(sdl_rpc_plugin::SystemCapabilityAppExtension::
+ SystemCapabilityAppExtensionUID))
+ .WillByDefault(Return(system_capability_app_extension));
+ ON_CALL(app_mngr_, application(kAppId)).WillByDefault(Return(mock_app_));
+
+ EXPECT_CALL(mock_rpc_service_,
+ ManageMobileCommand(
+ CheckVideoStreamingCapability(system_capability_type,
+ video_streaming_capability),
+ _));
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
} // namespace on_bc_system_capability_updated_notification_from_hmi
} // namespace hmi_commands_test
} // namespace commands_test
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc
index 31c03a7ed5..9760462d05 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/hmi/update_device_list_request_test.cc
@@ -92,10 +92,6 @@ class UpdateDeviceListRequestTest
TEST_F(UpdateDeviceListRequestTest, RUN_LaunchHMIReturnsFalse) {
MessageSharedPtr command_msg = CreateCommandMsg();
- EXPECT_CALL(app_mngr_, event_dispatcher())
- .WillOnce(ReturnRef(mock_event_dispatcher_));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_));
-
UpdateDeviceListRequestPtr command(
CreateCommand<UpdateDeviceListRequest>(command_msg));
@@ -103,7 +99,7 @@ TEST_F(UpdateDeviceListRequestTest, RUN_LaunchHMIReturnsFalse) {
EXPECT_CALL(settings_, launch_hmi()).WillOnce(Return(false));
- EXPECT_CALL(app_mngr_, IsHMICooperating()).Times(0);
+ EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).Times(0);
EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(command_msg));
command->Run();
@@ -114,13 +110,9 @@ TEST_F(UpdateDeviceListRequestTest, RUN_LaunchHMIReturnsFalse) {
CommandImpl::protocol_version_);
}
-TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESSS) {
+TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESS) {
MessageSharedPtr command_msg = CreateCommandMsg();
- EXPECT_CALL(app_mngr_, event_dispatcher())
- .WillOnce(ReturnRef(mock_event_dispatcher_));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_));
-
UpdateDeviceListRequestPtr command(
CreateCommand<UpdateDeviceListRequest>(command_msg));
@@ -128,7 +120,7 @@ TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESSS) {
EXPECT_CALL(settings_, launch_hmi()).WillOnce(Return(true));
- EXPECT_CALL(app_mngr_, IsHMICooperating()).WillOnce(Return(true));
+ EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).WillOnce(Return(true));
EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(command_msg));
command->Run();
@@ -139,29 +131,20 @@ TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsTrue_SUCCESSS) {
CommandImpl::protocol_version_);
}
-TEST_F(UpdateDeviceListRequestTest, OnEvent_WrongEventId_UNSUCCESS) {
- Event event(Event::EventID::INVALID_ENUM);
-
- EXPECT_CALL(app_mngr_, event_dispatcher())
- .WillOnce(ReturnRef(mock_event_dispatcher_));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_));
-
- UpdateDeviceListRequestPtr command(CreateCommand<UpdateDeviceListRequest>());
+TEST_F(UpdateDeviceListRequestTest, RUN_HMICooperatingReturnsFalse_UNSUCCESS) {
+ MessageSharedPtr command_msg = CreateCommandMsg();
- command->on_event(event);
-}
+ UpdateDeviceListRequestPtr command(
+ CreateCommand<UpdateDeviceListRequest>(command_msg));
-TEST_F(UpdateDeviceListRequestTest, OnEvent_SUCCESS) {
- Event event(Event::EventID::BasicCommunication_OnReady);
+ EXPECT_CALL(app_mngr_, get_settings()).WillOnce(ReturnRef(settings_));
- EXPECT_CALL(app_mngr_, event_dispatcher())
- .WillOnce(ReturnRef(mock_event_dispatcher_));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_, _));
- EXPECT_CALL(mock_event_dispatcher_, remove_observer(_));
+ EXPECT_CALL(settings_, launch_hmi()).WillOnce(Return(true));
- UpdateDeviceListRequestPtr command(CreateCommand<UpdateDeviceListRequest>());
+ EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).WillOnce(Return(false));
+ EXPECT_CALL(mock_rpc_service_, SendMessageToHMI(_)).Times(0);
- command->on_event(event);
+ command->Run();
}
} // namespace update_device_list_request
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc
index aa199bd112..93ae813535 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/add_command_request_test.cc
@@ -373,26 +373,27 @@ TEST_F(AddCommandRequestTest, Run_CommandIDAlreadyExists_EXPECT_INVALID_ID) {
request_ptr->Run();
}
-TEST_F(AddCommandRequestTest,
- Run_CommandNameAlreadyExists_EXPECT_DUPLICATE_NAME) {
+TEST_F(AddCommandRequestTest, Run_CommandNameAlreadyExists_EXPECT_Forwarded) {
CreateBasicParamsUIRequest();
- SmartObject& msg_params = (*msg_)[strings::msg_params];
- msg_params[menu_params][hmi_request::parent_id] = kFirstParentId;
- SmartObject& image = msg_params[cmd_icon];
+ (*msg_)[msg_params][menu_name] = kMenuName;
+ SmartObject& image = (*msg_)[msg_params][cmd_icon];
EXPECT_CALL(mock_message_helper_, VerifyImage(image, _, _))
.WillOnce(Return(mobile_apis::Result::SUCCESS));
EXPECT_CALL(*mock_app_, FindCommand(kCmdId)).WillOnce(Return(smart_obj_));
+ EXPECT_CALL(*mock_app_, AddCommand(_, (*msg_)[msg_params]));
+
SmartObject first_command = SmartObject(SmartType_Map);
SmartObject second_command = SmartObject(SmartType_Map);
- const am::CommandsMap commands_map =
+ am::CommandsMap commands_map =
CreateCommandsMap(first_command, second_command);
EXPECT_CALL(*mock_app_, commands_map())
.WillRepeatedly(Return(DataAccessor<application_manager::CommandsMap>(
commands_map, lock_ptr_)));
- EXPECT_CALL(mock_rpc_service_,
- ManageMobileCommand(
- MobileResultCodeIs(mobile_apis::Result::DUPLICATE_NAME), _));
+ EXPECT_CALL(
+ mock_rpc_service_,
+ ManageHMICommand(HMIResultCodeIs(hmi_apis::FunctionID::UI_AddCommand), _))
+ .WillOnce(Return(true));
std::shared_ptr<AddCommandRequest> request_ptr =
CreateCommand<AddCommandRequest>(msg_);
request_ptr->Run();
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc
new file mode 100644
index 0000000000..41e734137b
--- /dev/null
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_app_capability_updated_notification_test.cc
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2020, Ford Motor Company
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the Ford Motor Company nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mobile/on_app_capability_updated_notification.h"
+
+#include "application_manager/commands/commands_test.h"
+#include "gtest/gtest.h"
+#include "sdl_rpc_plugin/extensions/system_capability_app_extension.h"
+#include "sdl_rpc_plugin/sdl_rpc_plugin.h"
+
+namespace test {
+namespace components {
+namespace commands_test {
+namespace mobile_commands_test {
+namespace on_app_capability_updated_notification_test {
+
+using sdl_rpc_plugin::commands::mobile::OnAppCapabilityUpdatedNotification;
+using ::testing::_;
+
+typedef std::shared_ptr<OnAppCapabilityUpdatedNotification>
+ OnAppCapabilityUpdatedNotificationPtr;
+
+namespace strings = application_manager::strings;
+namespace {
+const uint32_t kConnectionKey = 1u;
+const uint32_t kAppId = 2u;
+} // namespace
+
+MATCHER_P(CheckAppCapability, app_capability, "") {
+ return app_capability == (*arg)[strings::msg_params][strings::app_capability];
+}
+
+class OnAppCapabilityUpdatedNotificationTest
+ : public CommandsTest<CommandsTestMocks::kIsNice> {
+ protected:
+ void SetUp() OVERRIDE {
+ message_ = CreateMessage();
+ (*message_)[strings::params][strings::connection_key] = kConnectionKey;
+ command_ = CreateCommand<OnAppCapabilityUpdatedNotification>(message_);
+ mock_app_ = CreateMockApp();
+ }
+
+ OnAppCapabilityUpdatedNotificationPtr command_;
+ MockAppPtr mock_app_;
+ MessageSharedPtr message_;
+};
+
+TEST_F(OnAppCapabilityUpdatedNotificationTest, Run_ManageHMICommand_SUCCESS) {
+ smart_objects::SmartObject app_capability =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ app_capability[strings::app_capability_type] =
+ mobile_apis::AppCapabilityType::VIDEO_STREAMING;
+ app_capability[strings::video_streaming_capability] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ FillVideoStreamingCapability(
+ app_capability[strings::video_streaming_capability]);
+
+ (*message_)[strings::msg_params][strings::app_capability] = app_capability;
+
+ ASSERT_TRUE(command_->Init());
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, app_id()).WillByDefault(Return(kAppId));
+
+ EXPECT_CALL(mock_rpc_service_,
+ ManageHMICommand(CheckAppCapability(app_capability),
+ app_mngr::commands::Command::SOURCE_SDL_TO_HMI));
+ command_->Run();
+}
+
+} // namespace on_app_capability_updated_notification_test
+} // namespace mobile_commands_test
+} // namespace commands_test
+} // namespace components
+} // namespace test
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc
index 7e7b16aa89..32a13f402c 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/on_system_capability_updated_notification_test.cc
@@ -63,6 +63,12 @@ MATCHER_P(CheckDisplayCapabilities, display_capabilities, "") {
[strings::display_capabilities];
}
+MATCHER_P(CheckVideoStreamCapability, video_streaming_capability, "") {
+ return video_streaming_capability ==
+ (*arg)[strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability];
+}
+
class OnSystemCapabilityUpdatedNotificationTest
: public CommandsTest<CommandsTestMocks::kIsNice> {
protected:
@@ -233,6 +239,43 @@ TEST_F(
command_->Run();
}
+TEST_F(OnSystemCapabilityUpdatedNotificationTest,
+ Run_VideoSteamingCapability_AppIdIsAbsent_SendMessageToMobile) {
+ (*message_)[am::strings::msg_params][strings::system_capability]
+ [am::strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+
+ EXPECT_CALL(mock_rpc_service_, SendMessageToMobile(message_, false));
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
+TEST_F(OnSystemCapabilityUpdatedNotificationTest,
+ Run_VideoSteamingCapability_AppIdExistsInMessage_SendMessageToMobile) {
+ (*message_)[strings::msg_params][strings::system_capability]
+ [strings::system_capability_type] =
+ mobile_apis::SystemCapabilityType::VIDEO_STREAMING;
+ (*message_)[strings::msg_params][strings::app_id] = kAppId;
+ (*message_)[strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability] =
+ new smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ auto& video_streaming_capability =
+ (*message_)[strings::msg_params][strings::system_capability]
+ [strings::video_streaming_capability];
+
+ FillVideoStreamingCapability(video_streaming_capability);
+
+ EXPECT_CALL(
+ mock_rpc_service_,
+ SendMessageToMobile(
+ CheckVideoStreamCapability(video_streaming_capability), false));
+
+ ASSERT_TRUE(command_->Init());
+ command_->Run();
+}
+
} // namespace on_system_capability_updated_notification
} // namespace mobile_commands_test
} // namespace commands_test
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc
index fab648fc95..4572a6d907 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc
@@ -198,7 +198,7 @@ class RegisterAppInterfaceRequestTest
void InitGetters() {
ON_CALL(app_mngr_, GetCorrectMobileIDFromMessage(msg_))
.WillByDefault(Return(kAppId1));
- ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(true));
+ ON_CALL(app_mngr_, WaitForHmiIsReady()).WillByDefault(Return(true));
ON_CALL(app_mngr_, resume_controller())
.WillByDefault(ReturnRef(mock_resume_crt_));
ON_CALL(app_mngr_, connection_handler())
@@ -416,11 +416,7 @@ TEST_F(RegisterAppInterfaceRequestTest, DefaultTimeout_CheckIfZero_SUCCESS) {
TEST_F(RegisterAppInterfaceRequestTest, Run_MinimalData_SUCCESS) {
InitBasicMessage();
(*msg_)[am::strings::msg_params][am::strings::hash_id] = kAppId1;
- EXPECT_CALL(app_mngr_, IsStopping())
- .WillOnce(Return(false))
- .WillOnce(Return(true))
- .WillOnce(Return(false));
- ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(false));
+ EXPECT_CALL(app_mngr_, WaitForHmiIsReady()).WillOnce(Return(true));
EXPECT_CALL(app_mngr_, IsApplicationForbidden(_, _)).WillOnce(Return(false));
ON_CALL(mock_connection_handler_,
@@ -504,11 +500,7 @@ TEST_F(RegisterAppInterfaceRequestTest,
Run_HmiInterfacesStateAvailable_SUCCESS) {
InitBasicMessage();
- EXPECT_CALL(app_mngr_, IsStopping())
- .WillOnce(Return(false))
- .WillOnce(Return(true))
- .WillOnce(Return(false));
- ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(false));
+ ON_CALL(app_mngr_, WaitForHmiIsReady()).WillByDefault(Return(true));
EXPECT_CALL(app_mngr_, IsApplicationForbidden(_, _)).WillOnce(Return(false));
ON_CALL(mock_connection_handler_,
@@ -808,11 +800,8 @@ TEST_F(RegisterAppInterfaceRequestTest,
InitBasicMessage();
(*msg_)[am::strings::params][am::strings::connection_key] = kConnectionKey2;
- EXPECT_CALL(app_mngr_, IsStopping())
- .WillOnce(Return(false))
- .WillOnce(Return(true))
- .WillOnce(Return(false));
- ON_CALL(app_mngr_, IsHMICooperating()).WillByDefault(Return(false));
+
+ ON_CALL(app_mngr_, WaitForHmiIsReady()).WillByDefault(Return(true));
EXPECT_CALL(app_mngr_, IsApplicationForbidden(kConnectionKey2, kAppId1))
.WillOnce(Return(false));
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc
index 9b72d41f7e..4272005fba 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/set_global_properties_test.cc
@@ -397,6 +397,29 @@ class SetGlobalPropertiesRequestTest
ui_result, tts_result, rc_result, false);
}
+ void AddCustomizableKeys(MessageSharedPtr msg) {
+ SmartObject customizable_keys(smart_objects::SmartType_Array);
+ customizable_keys[0] = "%";
+ customizable_keys[1] = "@";
+ customizable_keys[2] = "&";
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties]
+ [am::hmi_request::custom_keys] = customizable_keys;
+ }
+
+ std::shared_ptr<SmartObject> GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::eType layout, int num_allowed_keys) {
+ auto display_capabilities =
+ std::make_shared<SmartObject>(smart_objects::SmartType_Map);
+ auto& supported_keyboards =
+ (*display_capabilities)[0][am::strings::window_capabilities][0]
+ [am::hmi_response::keyboard_capabilities]
+ [am::hmi_response::supported_keyboards];
+ supported_keyboards[0][am::hmi_request::keyboard_layout] = layout;
+ supported_keyboards[0][am::hmi_response::num_configurable_keys] =
+ num_allowed_keys;
+ return display_capabilities;
+ }
+
std::shared_ptr<sync_primitives::Lock> lock_ptr_;
MockAppPtr mock_app_;
std::shared_ptr<application_manager_test::MockHelpPromptManager>
@@ -1262,6 +1285,371 @@ TEST_F(SetGlobalPropertiesRequestTest,
command->Run();
}
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_InvalidCustomizableKeys_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ SmartObject customizable_keys(smart_objects::SmartType_Array);
+ customizable_keys[0] = "%";
+ customizable_keys[1] = "\\n";
+ customizable_keys[2] = " ";
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties]
+ [am::hmi_request::custom_keys] = customizable_keys;
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_DisallowedNumberOfCustomizableKeysAndLayoutFromRequest_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties]
+ [am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+
+ const int num_allowed_keys = 0;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTZ, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_DisallowedNumberOfCustomizableKeysAndSavedLayout_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillOnce(Return(&saved_keyboard_props));
+
+ const int num_allowed_keys = 0;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTZ, num_allowed_keys);
+
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_DisallowedNumberOfCustomizableKeysAndDefaultLayout_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+
+ const int num_allowed_keys = 0;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_AllowedNumberOfCustomizableKeysAndNotSupportedLayout_INVALID_DATA) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties]
+ [am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+
+ const int num_allowed_keys = 3;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ ExpectInvalidData();
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_AllowedNumberOfCustomizableKeys_LayoutFromRequestCached) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ keyboard_properties[am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTY;
+
+ const int num_allowed_keys = 3;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_AllowedNumberOfCustomizableKeysAndSavedLayout_SavedLayoutCachedAgain) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ const int num_allowed_keys = 3;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTZ, num_allowed_keys);
+
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto requested_keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ auto cached_keyboard_props(requested_keyboard_properties);
+ cached_keyboard_props[am::hmi_request::keyboard_layout] =
+ hmi_apis::Common_KeyboardLayout::QWERTZ;
+ EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_AllowedNumberOfCustomizableKeysAndDefaultLayout_KeyboardPropsCachedAsIs) {
+ MessageSharedPtr msg = CreateMsgParams();
+ AddCustomizableKeys(msg);
+
+ const int num_allowed_keys = 3;
+ auto display_capabilities = GetCapabilitiesForConfigurableKeyboard(
+ hmi_apis::Common_KeyboardLayout::QWERTY, num_allowed_keys);
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ ON_CALL(*mock_app_, display_capabilities())
+ .WillByDefault(Return(display_capabilities));
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto requested_keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ EXPECT_CALL(*mock_app_, set_keyboard_props(requested_keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_RequestContainsLanguageParam_KeyboardPropsCachedAsIs) {
+ MessageSharedPtr msg = CreateMsgParams();
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ keyboard_properties[am::hmi_response::language] =
+ hmi_apis::Common_Language::EN_GB;
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_NoLanguageInRequestButPresentInSaved_SavedLanguageCachedAgain) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_response::language] =
+ hmi_apis::Common_Language::EN_GB;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto cached_keyboard_props =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ cached_keyboard_props[am::hmi_response::language] =
+ hmi_apis::Common_Language::EN_GB;
+ EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props));
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_RequestContainsMaskInputCharactersParam_KeyboardPropsCachedAsIs) {
+ MessageSharedPtr msg = CreateMsgParams();
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ keyboard_properties[am::hmi_request::mask_input_characters] =
+ hmi_apis::Common_KeyboardInputMask::ENABLE_INPUT_KEY_MASK;
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_NoMaskInputCharactersInRequestButPresentInSaved_SavedParamCachedAgain) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::mask_input_characters] =
+ hmi_apis::Common_KeyboardInputMask::USER_CHOICE_INPUT_KEY_MASK;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto cached_keyboard_props =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ cached_keyboard_props[am::hmi_request::mask_input_characters] =
+ hmi_apis::Common_KeyboardInputMask::USER_CHOICE_INPUT_KEY_MASK;
+ EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props));
+
+ command->Run();
+}
+
+TEST_F(SetGlobalPropertiesRequestTest,
+ Run_NoAutocompleteListInRequestButPresentInSaved_SavedArrayCachedAgain) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+
+ SmartObject autocomplete_list(smart_objects::SmartType_Array);
+ autocomplete_list[0] = "first";
+ autocomplete_list[1] = "second";
+ saved_keyboard_props[am::hmi_request::auto_complete_list] = autocomplete_list;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto cached_keyboard_props =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ cached_keyboard_props[am::hmi_request::auto_complete_list] =
+ autocomplete_list;
+ EXPECT_CALL(*mock_app_, set_keyboard_props(cached_keyboard_props));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_NewAutocompleteListInRequestAndAlsoPresentInSaved_TransferAndSaveNewArray) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ SmartObject new_list(smart_objects::SmartType_Array);
+ new_list[0] = "first_new_value";
+ new_list[1] = "second_new_value";
+ keyboard_properties[am::hmi_request::auto_complete_list] = new_list;
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ SmartObject old_list(smart_objects::SmartType_Array);
+ old_list[0] = "old_value";
+ old_list[1] = "another_old_value";
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::auto_complete_list] = old_list;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ EXPECT_CALL(*mock_app_, set_keyboard_props(keyboard_properties));
+
+ command->Run();
+}
+
+TEST_F(
+ SetGlobalPropertiesRequestTest,
+ Run_EmptyAutocompleteListInRequestAndAlsoPresentInSaved_TransferButNotSaveEmptyArray) {
+ MessageSharedPtr msg = CreateMsgParams();
+
+ auto& keyboard_properties =
+ (*msg)[am::strings::msg_params][am::strings::keyboard_properties];
+ SmartObject new_list(smart_objects::SmartType_Array);
+ keyboard_properties[am::hmi_request::auto_complete_list] = new_list;
+
+ ON_CALL(app_mngr_, application(kConnectionKey))
+ .WillByDefault(Return(mock_app_));
+ SmartObject old_list(smart_objects::SmartType_Array);
+ old_list[0] = "old_value";
+ old_list[1] = "another_old_value";
+ auto saved_keyboard_props = SmartObject(smart_objects::SmartType_Map);
+ saved_keyboard_props[am::hmi_request::auto_complete_list] = old_list;
+ EXPECT_CALL(*mock_app_, keyboard_props())
+ .WillRepeatedly(Return(&saved_keyboard_props));
+
+ std::shared_ptr<SetGlobalPropertiesRequest> command(
+ CreateCommand<SetGlobalPropertiesRequest>(msg));
+
+ auto properties_without_empty_list(keyboard_properties);
+ properties_without_empty_list.erase(am::hmi_request::auto_complete_list);
+ EXPECT_CALL(*mock_app_, set_keyboard_props(properties_without_empty_list));
+
+ command->Run();
+}
+
TEST_F(SetGlobalPropertiesRequestTest, Run_NoData_Canceled) {
MessageSharedPtr msg = CreateMsgParams();
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc
index dbd1b48033..19c1113cc6 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_get_vehicle_type_response.cc
@@ -55,11 +55,10 @@ void VIGetVehicleTypeResponse::Run() {
const auto result_code = static_cast<hmi_apis::Common_Result::eType>(
(*message_)[strings::params][hmi_response::code].asInt());
- hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
- hmi_apis::FunctionID::VehicleInfo_GetVehicleType);
-
if (hmi_apis::Common_Result::SUCCESS != result_code) {
SDL_LOG_DEBUG("Request was not successful. Don't change HMI capabilities");
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VehicleInfo_GetVehicleType);
return;
}
@@ -67,6 +66,9 @@ void VIGetVehicleTypeResponse::Run() {
hmi_capabilities_.set_vehicle_type(
(*message_)[strings::msg_params][hmi_response::vehicle_type]);
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VehicleInfo_GetVehicleType);
+
if (!hmi_capabilities_.SaveCachedCapabilitiesToFile(
hmi_interface::vehicle_info,
sections_to_update,
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc
index 578f650e98..2c9ac78523 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/commands/hmi/vi_is_ready_request.cc
@@ -78,6 +78,8 @@ void VIIsReadyRequest::on_event(const event_engine::Event& event) {
HMICapabilities& hmi_capabilities = hmi_capabilities_;
hmi_capabilities.set_is_ivi_cooperating(is_available);
policy_handler_.OnVIIsReady();
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VehicleInfo_IsReady);
if (!app_mngr::commands::CheckAvailabilityHMIInterfaces(
application_manager_, HmiInterfaces::HMI_INTERFACE_VehicleInfo)) {
SDL_LOG_INFO(
@@ -99,6 +101,8 @@ void VIIsReadyRequest::on_event(const event_engine::Event& event) {
void VIIsReadyRequest::onTimeOut() {
// Note(dtrunov): According to new requirment APPLINK-27956
+ hmi_capabilities_.UpdateRequestsRequiredForCapabilities(
+ hmi_apis::FunctionID::VehicleInfo_IsReady);
RequestInterfaceCapabilities(hmi_interface ::vehicle_info);
}
diff --git a/src/components/application_manager/src/application_impl.cc b/src/components/application_manager/src/application_impl.cc
index 2e104f73e2..2952fd5481 100644
--- a/src/components/application_manager/src/application_impl.cc
+++ b/src/components/application_manager/src/application_impl.cc
@@ -613,9 +613,6 @@ void ApplicationImpl::StopStreaming(
void ApplicationImpl::StopNaviStreaming() {
SDL_LOG_AUTO_TRACE();
video_stream_suspend_timer_.Stop();
- application_manager_.OnAppStreaming(app_id(),
- protocol_handler::ServiceType::kMobileNav,
- StreamingState::kStopped);
MessageHelper::SendNaviStopStream(app_id(), application_manager_);
set_video_streaming_approved(false);
set_video_stream_retry_number(0);
@@ -624,9 +621,6 @@ void ApplicationImpl::StopNaviStreaming() {
void ApplicationImpl::StopAudioStreaming() {
SDL_LOG_AUTO_TRACE();
audio_stream_suspend_timer_.Stop();
- application_manager_.OnAppStreaming(app_id(),
- protocol_handler::ServiceType::kAudio,
- StreamingState::kStopped);
MessageHelper::SendAudioStopStream(app_id(), application_manager_);
set_audio_streaming_approved(false);
set_audio_stream_retry_number(0);
@@ -637,17 +631,14 @@ void ApplicationImpl::SuspendStreaming(
using namespace protocol_handler;
SDL_LOG_AUTO_TRACE();
- if (ServiceType::kMobileNav == service_type && !video_streaming_suspended_) {
+ if (ServiceType::kMobileNav == service_type) {
video_stream_suspend_timer_.Stop();
- application_manager_.OnAppStreaming(
- app_id(), service_type, StreamingState::kSuspended);
+ application_manager_.OnAppStreaming(app_id(), service_type, false);
sync_primitives::AutoLock lock(video_streaming_suspended_lock_);
video_streaming_suspended_ = true;
- } else if (ServiceType::kAudio == service_type &&
- !audio_streaming_suspended_) {
+ } else if (ServiceType::kAudio == service_type) {
audio_stream_suspend_timer_.Stop();
- application_manager_.OnAppStreaming(
- app_id(), service_type, StreamingState::kSuspended);
+ application_manager_.OnAppStreaming(app_id(), service_type, false);
sync_primitives::AutoLock lock(audio_streaming_suspended_lock_);
audio_streaming_suspended_ = true;
}
@@ -656,7 +647,7 @@ void ApplicationImpl::SuspendStreaming(
}
void ApplicationImpl::WakeUpStreaming(
- protocol_handler::ServiceType service_type) {
+ protocol_handler::ServiceType service_type, uint32_t timer_len) {
using namespace protocol_handler;
SDL_LOG_AUTO_TRACE();
@@ -668,29 +659,28 @@ void ApplicationImpl::WakeUpStreaming(
{ // reduce the range of video_streaming_suspended_lock_
sync_primitives::AutoLock auto_lock(video_streaming_suspended_lock_);
if (video_streaming_suspended_) {
- application_manager_.OnAppStreaming(
- app_id(), service_type, StreamingState::kStarted);
+ application_manager_.OnAppStreaming(app_id(), service_type, true);
application_manager_.ProcessOnDataStreamingNotification(
service_type, app_id(), true);
video_streaming_suspended_ = false;
}
}
-
- video_stream_suspend_timer_.Start(video_stream_suspend_timeout_,
- timer::kPeriodic);
+ video_stream_suspend_timer_.Start(
+ timer_len == 0 ? video_stream_suspend_timeout_ : timer_len,
+ timer::kPeriodic);
} else if (ServiceType::kAudio == service_type) {
{ // reduce the range of audio_streaming_suspended_lock_
sync_primitives::AutoLock auto_lock(audio_streaming_suspended_lock_);
if (audio_streaming_suspended_) {
- application_manager_.OnAppStreaming(
- app_id(), service_type, StreamingState::kStarted);
+ application_manager_.OnAppStreaming(app_id(), service_type, true);
application_manager_.ProcessOnDataStreamingNotification(
service_type, app_id(), true);
audio_streaming_suspended_ = false;
}
}
- audio_stream_suspend_timer_.Start(audio_stream_suspend_timeout_,
- timer::kPeriodic);
+ audio_stream_suspend_timer_.Start(
+ timer_len == 0 ? audio_stream_suspend_timeout_ : timer_len,
+ timer::kPeriodic);
}
}
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index 24f131cafe..475baae9ec 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -227,7 +227,7 @@ ApplicationManagerImpl::ApplicationManagerImpl(
ApplicationManagerImpl::~ApplicationManagerImpl() {
SDL_LOG_AUTO_TRACE();
- is_stopping_.store(true);
+ InitiateStopping();
SendOnSDLClose();
media_manager_ = NULL;
hmi_handler_ = NULL;
@@ -1597,6 +1597,58 @@ void ApplicationManagerImpl::OnDeviceListUpdated(
RefreshCloudAppInformation();
}
+bool ApplicationManagerImpl::WaitForHmiIsReady() {
+ sync_primitives::AutoLock lock(wait_for_hmi_lock_);
+ if (!IsStopping() && !IsHMICooperating()) {
+ SDL_LOG_DEBUG("Waiting for the HMI cooperation...");
+ wait_for_hmi_condvar_.Wait(lock);
+ }
+
+ if (IsStopping()) {
+ SDL_LOG_WARN("System is terminating...");
+ return false;
+ }
+
+ return IsHMICooperating();
+}
+
+bool ApplicationManagerImpl::GetProtocolVehicleData(
+ connection_handler::ProtocolVehicleData& data) {
+ SDL_LOG_AUTO_TRACE();
+ using namespace protocol_handler::strings;
+
+ if (!WaitForHmiIsReady()) {
+ SDL_LOG_ERROR("Failed to wait for HMI readiness");
+ return false;
+ }
+
+ const auto vehicle_type_ptr = hmi_capabilities_->vehicle_type();
+ if (vehicle_type_ptr) {
+ if (vehicle_type_ptr->keyExists(vehicle_make)) {
+ data.vehicle_make = vehicle_type_ptr->getElement(vehicle_make).asString();
+ }
+
+ if (vehicle_type_ptr->keyExists(vehicle_model)) {
+ data.vehicle_model =
+ vehicle_type_ptr->getElement(vehicle_model).asString();
+ }
+
+ if (vehicle_type_ptr->keyExists(vehicle_model_year)) {
+ data.vehicle_year =
+ vehicle_type_ptr->getElement(vehicle_model_year).asString();
+ }
+
+ if (vehicle_type_ptr->keyExists(vehicle_trim)) {
+ data.vehicle_trim = vehicle_type_ptr->getElement(vehicle_trim).asString();
+ }
+ }
+
+ data.vehicle_system_software_version = hmi_capabilities_->ccpu_version();
+ data.vehicle_system_hardware_version = hmi_capabilities_->hardware_version();
+
+ return true;
+}
+
void ApplicationManagerImpl::OnFindNewApplicationsRequest() {
connection_handler().ConnectToAllDevices();
SDL_LOG_DEBUG("Starting application list update timer");
@@ -2536,7 +2588,7 @@ bool ApplicationManagerImpl::Init(
bool ApplicationManagerImpl::Stop() {
SDL_LOG_AUTO_TRACE();
- is_stopping_.store(true);
+ InitiateStopping();
application_list_update_timer_.Stop();
try {
if (unregister_reason_ ==
@@ -2951,7 +3003,7 @@ void ApplicationManagerImpl::SetUnregisterAllApplicationsReason(
void ApplicationManagerImpl::HeadUnitReset(
mobile_api::AppInterfaceUnregisteredReason::eType reason) {
SDL_LOG_AUTO_TRACE();
- is_stopping_.store(true);
+ InitiateStopping();
switch (reason) {
case mobile_api::AppInterfaceUnregisteredReason::MASTER_RESET: {
SDL_LOG_TRACE("Performing MASTER_RESET");
@@ -3203,6 +3255,7 @@ void ApplicationManagerImpl::UnregisterApplication(
}
ApplicationSharedPtr app_to_remove;
connection_handler::DeviceHandle handle = 0;
+
{
sync_primitives::AutoLock lock(applications_list_lock_ptr_);
auto it_app = applications_.begin();
@@ -3215,64 +3268,65 @@ void ApplicationManagerImpl::UnregisterApplication(
++it_app;
}
}
- if (!app_to_remove) {
- SDL_LOG_ERROR("Cant find application with app_id = " << app_id);
-
- // Just to terminate RAI in case of connection is dropped (rare case)
- // App won't be unregistered since RAI has not been started yet
- SDL_LOG_DEBUG("Trying to terminate possible RAI request.");
- request_ctrl_.terminateAppRequests(app_id);
+ }
+ if (!app_to_remove) {
+ SDL_LOG_ERROR("Cant find application with app_id = " << app_id);
- return;
- }
+ // Just to terminate RAI in case of connection is dropped (rare case)
+ // App won't be unregistered since RAI has not been started yet
+ SDL_LOG_DEBUG("Trying to terminate possible RAI request.");
+ request_ctrl_.terminateAppRequests(app_id);
- if (is_resuming) {
- resume_controller().SaveApplication(app_to_remove);
- } else {
- resume_controller().RemoveApplicationFromSaved(app_to_remove);
- }
-
- if (IsAppSubscribedForWayPoints(app_id)) {
- UnsubscribeAppFromWayPoints(app_id, true);
- if (!IsAnyAppSubscribedForWayPoints()) {
- SDL_LOG_DEBUG("Send UnsubscribeWayPoints");
- auto request = MessageHelper::CreateUnsubscribeWayPointsRequest(
- GetNextHMICorrelationID());
- rpc_service_->ManageHMICommand(request);
- }
- }
+ return;
+ }
- (hmi_capabilities_->get_hmi_language_handler())
- .OnUnregisterApplication(app_id);
+ resume_controller().RemoveFromResumption(app_id);
- if (connection_handler().GetDeviceID(app_to_remove->mac_address(),
- &handle)) {
- AppV4DevicePredicate finder(handle);
- ApplicationSharedPtr app = FindApp(applications(), finder);
- if (!app) {
- SDL_LOG_DEBUG(
- "There is no more SDL4 apps with device handle: " << handle);
+ if (is_resuming) {
+ resume_controller().SaveApplication(app_to_remove);
+ } else {
+ resume_controller().RemoveApplicationFromSaved(app_to_remove);
+ }
- RemoveAppsWaitingForRegistration(handle);
- }
+ if (IsAppSubscribedForWayPoints(app_id)) {
+ UnsubscribeAppFromWayPoints(app_id, true);
+ if (!IsAnyAppSubscribedForWayPoints()) {
+ SDL_LOG_DEBUG("Send UnsubscribeWayPoints");
+ auto request = MessageHelper::CreateUnsubscribeWayPointsRequest(
+ GetNextHMICorrelationID());
+ rpc_service_->ManageHMICommand(request);
}
+ }
- MessageHelper::SendOnAppUnregNotificationToHMI(
- app_to_remove, is_unexpected_disconnect, *this);
- commands_holder_->Clear(app_to_remove);
+ (hmi_capabilities_->get_hmi_language_handler())
+ .OnUnregisterApplication(app_id);
- const auto enabled_local_apps = policy_handler_->GetEnabledLocalApps();
- if (helpers::in_range(enabled_local_apps, app_to_remove->policy_app_id())) {
+ if (connection_handler().GetDeviceID(app_to_remove->mac_address(), &handle)) {
+ AppV4DevicePredicate finder(handle);
+ ApplicationSharedPtr app = FindApp(applications(), finder);
+ if (!app) {
SDL_LOG_DEBUG(
- "Enabled local app has been unregistered. Re-create "
- "pending application");
- CreatePendingLocalApplication(app_to_remove->policy_app_id());
+ "There is no more SDL4 apps with device handle: " << handle);
+
+ RemoveAppsWaitingForRegistration(handle);
}
+ }
- RefreshCloudAppInformation();
- SendUpdateAppList();
+ MessageHelper::SendOnAppUnregNotificationToHMI(
+ app_to_remove, is_unexpected_disconnect, *this);
+ commands_holder_->Clear(app_to_remove);
+
+ const auto enabled_local_apps = policy_handler_->GetEnabledLocalApps();
+ if (helpers::in_range(enabled_local_apps, app_to_remove->policy_app_id())) {
+ SDL_LOG_DEBUG(
+ "Enabled local app has been unregistered. Re-create "
+ "pending application");
+ CreatePendingLocalApplication(app_to_remove->policy_app_id());
}
+ RefreshCloudAppInformation();
+ SendUpdateAppList();
+
if (EndAudioPassThru(app_id)) {
// May be better to put this code in MessageHelper?
StopAudioPassThru(app_id);
@@ -3555,6 +3609,27 @@ void ApplicationManagerImpl::ForbidStreaming(
}
void ApplicationManagerImpl::OnAppStreaming(
+ uint32_t app_id, protocol_handler::ServiceType service_type, bool state) {
+ SDL_LOG_AUTO_TRACE();
+
+ ApplicationSharedPtr app = application(app_id);
+ if (!app || (!app->is_navi() && !app->mobile_projection_enabled())) {
+ SDL_LOG_DEBUG(
+ " There is no navi or projection application with id: " << app_id);
+ return;
+ }
+ DCHECK_OR_RETURN_VOID(media_manager_);
+
+ if (state) {
+ state_ctrl_.OnVideoStreamingStarted(app);
+ media_manager_->StartStreaming(app_id, service_type);
+ } else {
+ media_manager_->StopStreaming(app_id, service_type);
+ state_ctrl_.OnVideoStreamingStopped(app);
+ }
+}
+
+void ApplicationManagerImpl::OnAppStreaming(
uint32_t app_id,
protocol_handler::ServiceType service_type,
const Application::StreamingState new_state) {
@@ -4104,7 +4179,17 @@ bool ApplicationManagerImpl::IsHMICooperating() const {
}
void ApplicationManagerImpl::SetHMICooperating(const bool hmi_cooperating) {
+ SDL_LOG_AUTO_TRACE();
+ sync_primitives::AutoLock lock(wait_for_hmi_lock_);
hmi_cooperating_ = hmi_cooperating;
+ wait_for_hmi_condvar_.Broadcast();
+}
+
+void ApplicationManagerImpl::InitiateStopping() {
+ SDL_LOG_AUTO_TRACE();
+ sync_primitives::AutoLock lock(wait_for_hmi_lock_);
+ is_stopping_.store(true);
+ wait_for_hmi_condvar_.Broadcast();
}
void ApplicationManagerImpl::OnApplicationListUpdateTimer() {
@@ -4238,6 +4323,10 @@ ResetGlobalPropertiesResult ApplicationManagerImpl::ResetGlobalProperties(
result.keyboard_properties = true;
break;
}
+ case mobile_apis::GlobalProperty::USER_LOCATION: {
+ result.user_location = true;
+ break;
+ }
default: {
SDL_LOG_TRACE("Unknown global property: " << global_property);
break;
@@ -4288,7 +4377,9 @@ ApplicationManagerImpl::CreateAllAppGlobalPropsIDList(
if (application->keyboard_props()) {
(*global_properties)[i++] = GlobalProperty::KEYBOARDPROPERTIES;
}
-
+ if (!application->get_user_location().empty()) {
+ (*global_properties)[i++] = GlobalProperty::USER_LOCATION;
+ }
return global_properties;
}
diff --git a/src/components/application_manager/src/application_state.cc b/src/components/application_manager/src/application_state.cc
index 1ec4abaed7..adaefd2e95 100644
--- a/src/components/application_manager/src/application_state.cc
+++ b/src/components/application_manager/src/application_state.cc
@@ -127,7 +127,7 @@ HmiStatePtr ApplicationState::GetState(const WindowID window_id,
SDL_LOG_DEBUG("Getting postponed state for window " << window_id);
return PostponedHmiState(window_id);
default:
- SDL_LOG_DEBUG("Getting current state for window " << window_id);
+ SDL_LOG_TRACE("Getting current state for window " << window_id);
return CurrentHmiState(window_id);
}
}
diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc
index 1390a3ae2c..f313e0c0a5 100644
--- a/src/components/application_manager/src/hmi_capabilities_impl.cc
+++ b/src/components/application_manager/src/hmi_capabilities_impl.cc
@@ -126,6 +126,13 @@ HMICapabilitiesImpl::HMICapabilitiesImpl(ApplicationManager& app_mngr)
is_ivi_cooperating_ = true;
is_rc_cooperating_ = true;
}
+ requests_required_for_capabilities_ = {
+ hmi_apis::FunctionID::VehicleInfo_IsReady,
+ hmi_apis::FunctionID::VR_IsReady,
+ hmi_apis::FunctionID::TTS_IsReady,
+ hmi_apis::FunctionID::UI_IsReady,
+ hmi_apis::FunctionID::RC_IsReady,
+ hmi_apis::FunctionID::Navigation_IsReady};
}
HMICapabilitiesImpl::~HMICapabilitiesImpl() {}
@@ -1860,6 +1867,15 @@ const std::string& HMICapabilitiesImpl::ccpu_version() const {
return ccpu_version_;
}
+void HMICapabilitiesImpl::set_hardware_version(
+ const std::string& hardware_version) {
+ hardware_version_ = hardware_version;
+}
+
+const std::string& HMICapabilitiesImpl::hardware_version() const {
+ return hardware_version_;
+}
+
void HMICapabilitiesImpl::convert_json_languages_to_obj(
const Json::Value& json_languages,
smart_objects::SmartObject& languages) const {
diff --git a/src/components/application_manager/src/message_helper/message_helper.cc b/src/components/application_manager/src/message_helper/message_helper.cc
index 9bf623d343..b25e07c8f3 100644
--- a/src/components/application_manager/src/message_helper/message_helper.cc
+++ b/src/components/application_manager/src/message_helper/message_helper.cc
@@ -53,6 +53,7 @@
#include "application_manager/message_helper.h"
#include "application_manager/policies/policy_handler_interface.h"
#include "application_manager/resumption/resume_ctrl.h"
+#include "application_manager/rpc_plugins/rc_rpc_plugin/include/rc_rpc_plugin/rc_module_constants.h"
#include "application_manager/rpc_service.h"
#include "connection_handler/connection_handler_impl.h"
#include "interfaces/MOBILE_API.h"
@@ -183,6 +184,8 @@ std::pair<std::string, mobile_apis::VehicleDataType::eType>
std::make_pair(
strings::cloud_app_vehicle_id,
mobile_apis::VehicleDataType::VEHICLEDATA_CLOUDAPPVEHICLEID),
+ std::make_pair(strings::climate_data,
+ mobile_apis::VehicleDataType::VEHICLEDATA_CLIMATEDATA),
std::make_pair(strings::external_temp,
mobile_apis::VehicleDataType::VEHICLEDATA_EXTERNTEMP),
std::make_pair(strings::turn_signal,
@@ -394,18 +397,23 @@ MessageHelper::CreateUIResetGlobalPropertiesRequest(
}
if (reset_result.keyboard_properties) {
- smart_objects::SmartObject key_board_properties =
+ smart_objects::SmartObject keyboard_properties =
smart_objects::SmartObject(smart_objects::SmartType_Map);
- key_board_properties[strings::language] =
+ keyboard_properties[strings::language] =
static_cast<int32_t>(hmi_apis::Common_Language::EN_US);
- key_board_properties[hmi_request::keyboard_layout] =
+ keyboard_properties[hmi_request::keyboard_layout] =
static_cast<int32_t>(hmi_apis::Common_KeyboardLayout::QWERTY);
- key_board_properties[hmi_request::auto_complete_list] =
+ keyboard_properties[hmi_request::auto_complete_list] =
smart_objects::SmartObject(smart_objects::SmartType_Array);
+ keyboard_properties[strings::auto_complete_text] = "";
+ keyboard_properties[hmi_request::mask_input_characters] =
+ static_cast<int32_t>(
+ hmi_apis::Common_KeyboardInputMask::DISABLE_INPUT_KEY_MASK);
- key_board_properties[strings::auto_complete_text] = "";
(*ui_reset_global_prop_request)[hmi_request::keyboard_properties] =
- key_board_properties;
+ keyboard_properties;
+ application->set_keyboard_props(
+ smart_objects::SmartObject(smart_objects::SmartType_Null));
}
(*ui_reset_global_prop_request)[strings::app_id] = application->app_id();
@@ -414,6 +422,39 @@ MessageHelper::CreateUIResetGlobalPropertiesRequest(
}
smart_objects::SmartObjectSPtr
+MessageHelper::CreateRCResetGlobalPropertiesRequest(
+ const ResetGlobalPropertiesResult& reset_result,
+ const ApplicationSharedPtr application) {
+ namespace rc = rc_rpc_plugin;
+
+ smart_objects::SmartObjectSPtr rc_reset_global_prop_request =
+ std::make_shared<smart_objects::SmartObject>(
+ smart_objects::SmartType_Map);
+
+ if (reset_result.user_location) {
+ smart_objects::SmartObject user_location =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+
+ user_location[rc::strings::kGrid] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ smart_objects::SmartObject& grid = user_location[rc::strings::kGrid];
+ grid[rc::strings::kRow] = 0;
+ grid[rc::strings::kCol] = 0;
+ grid[rc::strings::kLevel] = 0;
+ grid[rc::strings::kRowspan] = 1;
+ grid[rc::strings::kColspan] = 1;
+ grid[rc::strings::kLevelspan] = 1;
+
+ (*rc_reset_global_prop_request)[strings::user_location] = user_location;
+ application->set_user_location(user_location);
+ }
+
+ (*rc_reset_global_prop_request)[strings::app_id] = application->app_id();
+
+ return rc_reset_global_prop_request;
+}
+
+smart_objects::SmartObjectSPtr
MessageHelper::CreateDisplayCapabilityUpdateToMobile(
const smart_objects::SmartObject& display_capabilities, Application& app) {
SDL_LOG_AUTO_TRACE();
diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc
index 890dd5b57a..bacd478138 100644
--- a/src/components/application_manager/src/policies/policy_handler.cc
+++ b/src/components/application_manager/src/policies/policy_handler.cc
@@ -838,7 +838,7 @@ void PolicyHandler::OnSystemRequestReceived() const {
}
void PolicyHandler::TriggerPTUOnStartupIfRequired() {
-#ifdef PROPRIETARY_MODE
+#if defined(PROPRIETARY_MODE) || defined(EXTERNAL_PROPRIETARY_MODE)
const auto policy_manager = LoadPolicyManager();
POLICY_LIB_CHECK_VOID(policy_manager);
policy_manager->TriggerPTUOnStartupIfRequired();
@@ -1097,6 +1097,14 @@ void PolicyHandler::OnGetSystemInfo(const std::string& ccpu_version,
policy_manager->SetSystemInfo(ccpu_version, wers_country_code, language);
}
+void PolicyHandler::OnHardwareVersionReceived(
+ const std::string& hardware_version) {
+ SDL_LOG_AUTO_TRACE();
+ const auto policy_manager = LoadPolicyManager();
+ POLICY_LIB_CHECK_VOID(policy_manager);
+ policy_manager->SetHardwareVersion(hardware_version);
+}
+
std::string PolicyHandler::GetCCPUVersionFromPT() const {
SDL_LOG_AUTO_TRACE();
const auto policy_manager = LoadPolicyManager();
@@ -1104,6 +1112,13 @@ std::string PolicyHandler::GetCCPUVersionFromPT() const {
return policy_manager->GetCCPUVersionFromPT();
}
+std::string PolicyHandler::GetHardwareVersionFromPT() const {
+ SDL_LOG_AUTO_TRACE();
+ const auto policy_manager = LoadPolicyManager();
+ POLICY_LIB_CHECK_OR_RETURN(policy_manager, std::string());
+ return policy_manager->GetHardwareVersionFromPT();
+}
+
void PolicyHandler::OnVIIsReady() {
SDL_LOG_AUTO_TRACE();
const uint32_t correlation_id =
diff --git a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc
index 504db76a82..dffb1ea094 100644
--- a/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc
+++ b/src/components/application_manager/src/resumption/resumption_data_processor_impl.cc
@@ -29,6 +29,7 @@
#include "application_manager/application_manager.h"
#include "application_manager/commands/command_impl.h"
+#include "application_manager/commands/command_request_impl.h"
#include "application_manager/display_capabilities_builder.h"
#include "application_manager/event_engine/event_observer.h"
#include "application_manager/message_helper.h"
@@ -151,6 +152,8 @@ void ResumptionDataProcessorImpl::ProcessResumptionStatus(
if (IsResponseSuccessful(response)) {
status.successful_requests.push_back(found_request);
} else {
+ SDL_LOG_DEBUG("Resumption request failed");
+ MessageHelper::PrintSmartObject(response);
status.error_requests.push_back(found_request);
}
@@ -807,6 +810,21 @@ void ResumptionDataProcessorImpl::DeleteGlobalProperties(
(*msg)[strings::msg_params] = *msg_params;
ProcessMessageToHMI(msg, false);
}
+
+ if (result.HasRCPropertiesReset() &&
+ check_if_successful(hmi_apis::FunctionID::RC_SetGlobalProperties)) {
+ smart_objects::SmartObjectSPtr msg_params =
+ MessageHelper::CreateRCResetGlobalPropertiesRequest(result,
+ application);
+ auto msg = MessageHelper::CreateMessageForHMI(
+ hmi_apis::messageType::request,
+ application_manager_.GetNextHMICorrelationID());
+ (*msg)[strings::params][strings::function_id] =
+ hmi_apis::FunctionID::RC_SetGlobalProperties;
+
+ (*msg)[strings::msg_params] = *msg_params;
+ ProcessMessageToHMI(msg, false);
+ }
}
void ResumptionDataProcessorImpl::AddSubscriptions(
@@ -977,7 +995,12 @@ void ResumptionDataProcessorImpl::DeletePluginsSubscriptions(
}
bool IsResponseSuccessful(const smart_objects::SmartObject& response) {
- return !response[strings::params].keyExists(strings::error_msg);
+ auto result_code = static_cast<hmi_apis::Common_Result::eType>(
+ response[strings::params][application_manager::hmi_response::code]
+ .asInt());
+
+ return commands::CommandRequestImpl::IsHMIResultSuccess(result_code) ||
+ hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == result_code;
}
void ResumptionDataProcessorImpl::CheckVehicleDataResponse(
diff --git a/src/components/application_manager/src/rpc_service_impl.cc b/src/components/application_manager/src/rpc_service_impl.cc
index 34a0bed7af..f0cd720e30 100644
--- a/src/components/application_manager/src/rpc_service_impl.cc
+++ b/src/components/application_manager/src/rpc_service_impl.cc
@@ -390,7 +390,10 @@ bool RPCServiceImpl::ManageHMICommand(const commands::MessageSharedPtr message,
if (command->Init()) {
command->Run();
- if (kResponse == message_type) {
+ if (helpers::Compare<int32_t, helpers::EQ, helpers::ONE>(
+ message_type, kResponse, kErrorResponse) &&
+ message->getElement(strings::params)
+ .keyExists(strings::correlation_id)) {
const uint32_t correlation_id =
(*(message.get()))[strings::params][strings::correlation_id].asUInt();
const int32_t function_id =
diff --git a/src/components/application_manager/src/smart_object_keys.cc b/src/components/application_manager/src/smart_object_keys.cc
index a96c02f88f..a680653d6c 100644
--- a/src/components/application_manager/src/smart_object_keys.cc
+++ b/src/components/application_manager/src/smart_object_keys.cc
@@ -197,6 +197,8 @@ const char* policy_type = "policyType";
const char* property = "property";
const char* displays = "displays";
const char* seat_location = "seatLocation";
+const char* app_capability = "appCapability";
+const char* app_capability_type = "appCapabilityType";
// PutFile
const char* sync_file_name = "syncFileName";
@@ -266,6 +268,7 @@ const char* fuel_level_state = "fuelLevel_State";
const char* instant_fuel_consumption = "instantFuelConsumption";
const char* fuel_range = "fuelRange";
const char* cloud_app_vehicle_id = "cloudAppVehicleID";
+const char* climate_data = "climateData";
const char* external_temp = "externalTemperature";
const char* turn_signal = "turnSignal";
const char* vin = "vin";
@@ -306,6 +309,7 @@ const char* video_streaming = "videoStreaming";
const char* remote_control = "remoteControl";
const char* sdl_version = "sdlVersion";
const char* system_software_version = "systemSoftwareVersion";
+const char* system_hardware_version = "systemHardwareVersion";
const char* priority = "priority";
const char* engine_oil_life = "engineOilLife";
const char* oem_custom_data_type = "oemCustomDataType";
@@ -443,6 +447,8 @@ const char* const haptic_spatial_data_supported = "hapticSpatialDataSupported";
const char* const diagonal_screen_size = "diagonalScreenSize";
const char* const pixel_per_inch = "pixelPerInch";
const char* const scale = "scale";
+const char* const additional_video_streaming_capabilities =
+ "additionalVideoStreamingCapabilities";
const char* const haptic_rect_data = "hapticRectData";
const char* const rect = "rect";
const char* const x = "x";
@@ -546,6 +552,8 @@ const char* method_name = "methodName";
const char* keyboard_layout = "keyboardLayout";
const char* limited_character_list = "limitedCharacterList";
const char* auto_complete_list = "autoCompleteList";
+const char* mask_input_characters = "maskInputCharacters";
+const char* custom_keys = "customKeys";
const char* file = "file";
const char* file_name = "fileName";
const char* retry = "retry";
@@ -583,6 +591,9 @@ const char* image_capabilities = "imageCapabilities";
const char* display_type = "displayType";
const char* display_name = "displayName";
const char* text_fields = "textFields";
+const char* keyboard_capabilities = "keyboardCapabilities";
+const char* supported_keyboards = "supportedKeyboards";
+const char* num_configurable_keys = "numConfigurableKeys";
const char* media_clock_formats = "mediaClockFormats";
const char* graphic_supported = "graphicSupported";
const char* image_fields = "imageFields";
diff --git a/src/components/application_manager/test/application_impl_test.cc b/src/components/application_manager/test/application_impl_test.cc
index c3d02271cf..5f23e97391 100644
--- a/src/components/application_manager/test/application_impl_test.cc
+++ b/src/components/application_manager/test/application_impl_test.cc
@@ -840,6 +840,7 @@ TEST_F(ApplicationImplTest, StartStreaming_StreamingApproved) {
TEST_F(ApplicationImplTest, SuspendNaviStreaming) {
protocol_handler::ServiceType type =
protocol_handler::ServiceType::kMobileNav;
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(mock_application_manager_,
ProcessOnDataStreamingNotification(type, app_id, false));
app_impl->SuspendStreaming(type);
@@ -847,6 +848,7 @@ TEST_F(ApplicationImplTest, SuspendNaviStreaming) {
TEST_F(ApplicationImplTest, SuspendAudioStreaming) {
protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio;
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(mock_application_manager_,
ProcessOnDataStreamingNotification(type, app_id, false));
app_impl->SuspendStreaming(type);
@@ -855,16 +857,12 @@ TEST_F(ApplicationImplTest, SuspendAudioStreaming) {
// TODO {AKozoriz} : Fix tests with streaming (APPLINK-19289)
TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpAudioStreaming) {
protocol_handler::ServiceType type = protocol_handler::ServiceType::kAudio;
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kSuspended));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
SendOnDataStreaming(type, false, _));
app_impl->SuspendStreaming(type);
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kStarted));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
SendOnDataStreaming(type, true, _));
app_impl->WakeUpStreaming(type);
@@ -873,16 +871,12 @@ TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpAudioStreaming) {
TEST_F(ApplicationImplTest, DISABLED_Suspend_WakeUpNaviStreaming) {
protocol_handler::ServiceType type =
protocol_handler::ServiceType::kMobileNav;
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kSuspended));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
SendOnDataStreaming(type, false, _));
app_impl->SuspendStreaming(type);
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kStarted));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, true));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
SendOnDataStreaming(type, true, _));
app_impl->WakeUpStreaming(type);
@@ -894,9 +888,7 @@ TEST_F(ApplicationImplTest, StopStreaming_StreamingApproved) {
protocol_handler::ServiceType::kMobileNav;
app_impl->set_video_streaming_approved(true);
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kStopped));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(mock_application_manager_,
ProcessOnDataStreamingNotification(type, app_id, false));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
@@ -908,9 +900,7 @@ TEST_F(ApplicationImplTest, StopStreaming_StreamingApproved) {
// Stop audio streaming
app_impl->set_audio_streaming_approved(true);
type = protocol_handler::ServiceType::kAudio;
- EXPECT_CALL(
- mock_application_manager_,
- OnAppStreaming(app_id, type, Application::StreamingState::kStopped));
+ EXPECT_CALL(mock_application_manager_, OnAppStreaming(app_id, type, false));
EXPECT_CALL(mock_application_manager_,
ProcessOnDataStreamingNotification(type, app_id, false));
EXPECT_CALL(*MockMessageHelper::message_helper_mock(),
diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc
index 1377b0bc22..c83dd76978 100644
--- a/src/components/application_manager/test/hmi_capabilities_test.cc
+++ b/src/components/application_manager/test/hmi_capabilities_test.cc
@@ -130,6 +130,14 @@ const std::vector<hmi_apis::Common_LightName::eType> light_name_enum_values{
hmi_apis::Common_LightName::eType::EXTERIOR_RIGHT_LIGHTS,
hmi_apis::Common_LightName::eType::EXTERIOR_ALL_LIGHTS};
+const std::vector<hmi_apis::FunctionID::eType> is_ready_requests{
+ hmi_apis::FunctionID::RC_IsReady,
+ hmi_apis::FunctionID::VR_IsReady,
+ hmi_apis::FunctionID::UI_IsReady,
+ hmi_apis::FunctionID::TTS_IsReady,
+ hmi_apis::FunctionID::Navigation_IsReady,
+ hmi_apis::FunctionID::VehicleInfo_IsReady};
+
bool IsLightNameExists(const hmi_apis::Common_LightName::eType& light_name) {
auto it = std::find(
light_name_enum_values.begin(), light_name_enum_values.end(), light_name);
@@ -155,6 +163,13 @@ class HMICapabilitiesTest : public ::testing::Test {
.WillByDefault(ReturnRef(kHmiCapabilitiesCacheFile));
hmi_capabilities_ = std::make_shared<HMICapabilitiesImpl>(mock_app_mngr_);
+ IsReadyResponsesReceived();
+ }
+
+ void IsReadyResponsesReceived() {
+ for (const auto& request : is_ready_requests) {
+ hmi_capabilities_->UpdateRequestsRequiredForCapabilities(request);
+ }
}
void TearDown() OVERRIDE {
@@ -530,16 +545,16 @@ TEST_F(
800,
vs_capability_so[strings::preferred_resolution][strings::resolution_width]
.asInt());
- EXPECT_EQ(350,
+ EXPECT_EQ(380,
vs_capability_so[strings::preferred_resolution]
[strings::resolution_height]
.asInt());
EXPECT_TRUE(vs_capability_so.keyExists(strings::max_bitrate));
- EXPECT_EQ(10000, vs_capability_so[strings::max_bitrate].asInt());
+ EXPECT_EQ(20000, vs_capability_so[strings::max_bitrate].asInt());
EXPECT_TRUE(vs_capability_so.keyExists(strings::supported_formats));
const size_t supported_formats_len =
vs_capability_so[strings::supported_formats].length();
- EXPECT_EQ(1ull, supported_formats_len);
+ EXPECT_EQ(5u, supported_formats_len);
EXPECT_TRUE(vs_capability_so[strings::supported_formats][0].keyExists(
strings::protocol));
@@ -554,9 +569,21 @@ TEST_F(
EXPECT_TRUE(
vs_capability_so.keyExists(strings::haptic_spatial_data_supported));
- EXPECT_FALSE(
+ EXPECT_TRUE(
vs_capability_so[strings::haptic_spatial_data_supported].asBool());
+ EXPECT_TRUE(vs_capability_so.keyExists(strings::diagonal_screen_size));
+ EXPECT_EQ(8, vs_capability_so[strings::diagonal_screen_size].asInt());
+ EXPECT_TRUE(vs_capability_so.keyExists(strings::pixel_per_inch));
+ EXPECT_EQ(96, vs_capability_so[strings::pixel_per_inch].asInt());
+ EXPECT_TRUE(vs_capability_so.keyExists(strings::scale));
+ EXPECT_EQ(1, vs_capability_so[strings::scale].asInt());
EXPECT_TRUE(vs_capability_so.keyExists(strings::preferred_fps));
+ EXPECT_TRUE(vs_capability_so.keyExists(
+ strings::additional_video_streaming_capabilities));
+ const size_t additional_video_streaming_capabilities_len =
+ vs_capability_so[strings::additional_video_streaming_capabilities]
+ .length();
+ EXPECT_EQ(7u, additional_video_streaming_capabilities_len);
EXPECT_TRUE(hmi_capabilities_->video_streaming_supported());
}
diff --git a/src/components/application_manager/test/include/application_manager/commands/commands_test.h b/src/components/application_manager/test/include/application_manager/commands/commands_test.h
index fdaef2c716..18afa01a88 100644
--- a/src/components/application_manager/test/include/application_manager/commands/commands_test.h
+++ b/src/components/application_manager/test/include/application_manager/commands/commands_test.h
@@ -53,6 +53,7 @@ namespace components {
namespace commands_test {
namespace am = ::application_manager;
+namespace strings = am::strings;
using ::testing::_;
using ::testing::Mock;
@@ -179,6 +180,30 @@ class CommandsTest : public ::testing::Test {
InitHMIToMobileResultConverter();
}
+ void FillVideoStreamingCapability(
+ smart_objects::SmartObject& video_streaming_capability) {
+ video_streaming_capability[strings::preferred_resolution] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ video_streaming_capability[strings::preferred_resolution]
+ [strings::resolution_width] = 800;
+ video_streaming_capability[strings::preferred_resolution]
+ [strings::resolution_height] = 354;
+ video_streaming_capability[strings::max_bitrate] = 10000;
+ video_streaming_capability[strings::supported_formats] =
+ smart_objects::SmartObject(smart_objects::SmartType_Array);
+ video_streaming_capability[strings::supported_formats][0] =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
+ video_streaming_capability[strings::supported_formats][0]
+ [strings::protocol] =
+ hmi_apis::Common_VideoStreamingProtocol::RAW;
+ video_streaming_capability[strings::supported_formats][0][strings::codec] =
+ hmi_apis::Common_VideoStreamingCodec::H264;
+ video_streaming_capability[strings::haptic_spatial_data_supported] = true;
+ video_streaming_capability[strings::diagonal_screen_size] = 7.47;
+ video_streaming_capability[strings::pixel_per_inch] = 117.f;
+ video_streaming_capability[strings::scale] = 1.f;
+ }
+
void InitHMIToMobileResultConverter() {
namespace MobileResult = mobile_apis::Result;
namespace HMIResult = hmi_apis::Common_Result;
diff --git a/src/components/application_manager/test/include/application_manager/mock_application.h b/src/components/application_manager/test/include/application_manager/mock_application.h
index 9c28d321fa..2c9fe688b4 100644
--- a/src/components/application_manager/test/include/application_manager/mock_application.h
+++ b/src/components/application_manager/test/include/application_manager/mock_application.h
@@ -88,8 +88,9 @@ class MockApplication : public ::application_manager::Application {
void(protocol_handler::ServiceType service_type));
MOCK_METHOD1(SuspendStreaming,
void(protocol_handler::ServiceType service_type));
- MOCK_METHOD1(WakeUpStreaming,
- void(protocol_handler::ServiceType service_type));
+ MOCK_METHOD2(WakeUpStreaming,
+ void(protocol_handler::ServiceType service_type,
+ uint32_t timer_len));
MOCK_CONST_METHOD0(is_voice_communication_supported, bool());
MOCK_METHOD1(set_voice_communication_supported,
void(bool is_voice_communication_supported));
diff --git a/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h b/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h
index 2f9f40ad2a..e40197cc13 100644
--- a/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h
+++ b/src/components/application_manager/test/include/application_manager/mock_hmi_capabilities.h
@@ -212,6 +212,8 @@ class MockHMICapabilities : public ::application_manager::HMICapabilities {
MOCK_CONST_METHOD0(ccpu_version, const std::string&());
MOCK_METHOD1(set_ccpu_version, void(const std::string& ccpu_version));
+ MOCK_CONST_METHOD0(hardware_version, const std::string&());
+ MOCK_METHOD1(set_hardware_version, void(const std::string& hardware_version));
MOCK_METHOD1(OnSoftwareVersionReceived,
void(const std::string& ccpu_version));
MOCK_METHOD0(UpdateCachedCapabilities, void());
diff --git a/src/components/application_manager/test/include/application_manager/mock_message_helper.h b/src/components/application_manager/test/include/application_manager/mock_message_helper.h
index d7919a374b..89b2d125e5 100644
--- a/src/components/application_manager/test/include/application_manager/mock_message_helper.h
+++ b/src/components/application_manager/test/include/application_manager/mock_message_helper.h
@@ -182,6 +182,12 @@ class MockMessageHelper {
smart_objects::SmartObjectSPtr(
const ResetGlobalPropertiesResult& reset_result,
ApplicationSharedPtr application));
+
+ MOCK_METHOD2(CreateRCResetGlobalPropertiesRequest,
+ smart_objects::SmartObjectSPtr(
+ const ResetGlobalPropertiesResult& reset_result,
+ ApplicationSharedPtr application));
+
MOCK_METHOD2(CreateGlobalPropertiesRequestsToHMI,
smart_objects::SmartObjectList(ApplicationConstSharedPtr app,
ApplicationManager& app_mngr));
diff --git a/src/components/application_manager/test/mock_message_helper.cc b/src/components/application_manager/test/mock_message_helper.cc
index 91f953eaf5..554b99ff72 100644
--- a/src/components/application_manager/test/mock_message_helper.cc
+++ b/src/components/application_manager/test/mock_message_helper.cc
@@ -582,6 +582,14 @@ MessageHelper::CreateTTSResetGlobalPropertiesRequest(
->CreateTTSResetGlobalPropertiesRequest(reset_result, application);
}
+smart_objects::SmartObjectSPtr
+MessageHelper::CreateRCResetGlobalPropertiesRequest(
+ const ResetGlobalPropertiesResult& reset_result,
+ ApplicationSharedPtr application) {
+ return MockMessageHelper::message_helper_mock()
+ ->CreateRCResetGlobalPropertiesRequest(reset_result, application);
+}
+
smart_objects::SmartObjectList
MessageHelper::CreateGlobalPropertiesRequestsToHMI(
ApplicationConstSharedPtr app, ApplicationManager& app_mngr) {
diff --git a/src/components/application_manager/test/policy_handler_test.cc b/src/components/application_manager/test/policy_handler_test.cc
index b9a74f14ba..1d764526b9 100644
--- a/src/components/application_manager/test/policy_handler_test.cc
+++ b/src/components/application_manager/test/policy_handler_test.cc
@@ -1290,19 +1290,6 @@ TEST_F(PolicyHandlerTest, OnSystemInfoChanged) {
policy_handler_.OnSystemInfoChanged(language);
}
-TEST_F(PolicyHandlerTest, OnGetSystemInfo) {
- // Arrange
- ChangePolicyManagerToMock();
- // Check expectations
- const std::string ccpu_version("4.1.3.B_EB355B");
- const std::string wers_country_code("WAEGB");
- const std::string language("ru-ru");
- EXPECT_CALL(*mock_policy_manager_,
- SetSystemInfo(ccpu_version, wers_country_code, language));
- // Act
- policy_handler_.OnGetSystemInfo(ccpu_version, wers_country_code, language);
-}
-
TEST_F(PolicyHandlerTest, IsApplicationRevoked) {
// Arrange
EnablePolicy();
diff --git a/src/components/config_profile/include/config_profile/profile.h b/src/components/config_profile/include/config_profile/profile.h
index bbd0a5d243..dffa2d1571 100644
--- a/src/components/config_profile/include/config_profile/profile.h
+++ b/src/components/config_profile/include/config_profile/profile.h
@@ -552,6 +552,11 @@ class Profile : public protocol_handler::ProtocolHandlerSettings,
*/
size_t update_before_hours() const;
+ /**
+ * @brief Return security level that will be configured in the OpenSSL
+ */
+ uint32_t security_level() const;
+
#endif // ENABLE_SECURITY
/**
@@ -1073,6 +1078,7 @@ class Profile : public protocol_handler::ProtocolHandlerSettings,
std::string security_manager_protocol_name_;
std::vector<int> force_protected_service_;
std::vector<int> force_unprotected_service_;
+ uint32_t security_level_;
#endif
/*
diff --git a/src/components/config_profile/src/profile.cc b/src/components/config_profile/src/profile.cc
index d9204acf90..27829d478f 100644
--- a/src/components/config_profile/src/profile.cc
+++ b/src/components/config_profile/src/profile.cc
@@ -140,6 +140,7 @@ const char* kSecurityKeyPathKey = "KeyPath";
const char* kSecurityCipherListKey = "CipherList";
const char* kSecurityVerifyPeerKey = "VerifyPeer";
const char* kBeforeUpdateHours = "UpdateBeforeHours";
+const char* kSecurityLevel = "SecurityLevel";
#endif
const char* kAudioDataStoppedTimeoutKey = "AudioDataStoppedTimeout";
@@ -337,6 +338,7 @@ const char* kDefaultSecurityProtocol = "TLSv1.2";
const char* kDefaultSSLMode = "CLIENT";
const bool kDefaultVerifyPeer = false;
const uint32_t kDefaultBeforeUpdateHours = 24;
+const uint32_t kDefaultSecurityLevel = 1;
#endif // ENABLE_SECURITY
const uint32_t kDefaultHubProtocolIndex = 0;
@@ -1117,6 +1119,10 @@ const std::vector<int>& Profile::force_protected_service() const {
const std::vector<int>& Profile::force_unprotected_service() const {
return force_unprotected_service_;
}
+
+uint32_t Profile::security_level() const {
+ return security_level_;
+}
#endif // ENABLE_SECURITY
bool Profile::logs_enabled() const {
@@ -1308,6 +1314,11 @@ void Profile::UpdateValues() {
kSecuritySection,
kBeforeUpdateHours);
+ ReadUIntValue(&security_level_,
+ kDefaultSecurityLevel,
+ kSecuritySection,
+ kSecurityLevel);
+
#endif // ENABLE_SECURITY
// Logs enabled
diff --git a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h
index a7dfd29b31..25a89ea4b3 100644
--- a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h
+++ b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h
@@ -648,6 +648,8 @@ class ConnectionHandlerImpl
void CreateWebEngineDevice() OVERRIDE;
+ bool GetProtocolVehicleData(ProtocolVehicleData& data) OVERRIDE;
+
private:
/**
* \brief Disconnect application.
diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc
index a771f0a104..c2c70ccae8 100644
--- a/src/components/connection_handler/src/connection_handler_impl.cc
+++ b/src/components/connection_handler/src/connection_handler_impl.cc
@@ -547,11 +547,16 @@ void ConnectionHandlerImpl::OnSessionStartedCallback(
session_key,
service_type,
params);
- } else {
+ }
+#ifdef BUILD_TESTS
+ else {
+ // FIXME (VSemenyuk): This code is only used in unit tests, so should be
+ // removed. ConnectionHandler unit tests should be fixed.
if (protocol_handler_) {
protocol_handler_->NotifySessionStarted(context, rejected_params);
}
}
+#endif
}
void ConnectionHandlerImpl::NotifyServiceStartedResult(
@@ -589,17 +594,20 @@ void ConnectionHandlerImpl::NotifyServiceStartedResult(
if (!result) {
SDL_LOG_WARN("Service starting forbidden by connection_handler_observer");
+ context.is_start_session_failed_ = true;
+ }
+
+ if (protocol_handler_) {
+ protocol_handler_->NotifySessionStarted(context, rejected_params, reason);
+ }
+
+ if (context.is_start_session_failed_) {
if (protocol_handler::kRpc == context.service_type_) {
connection->RemoveSession(context.new_session_id_);
} else {
connection->RemoveService(context.initial_session_id_,
context.service_type_);
}
- context.new_session_id_ = 0;
- }
-
- if (protocol_handler_ != NULL) {
- protocol_handler_->NotifySessionStarted(context, rejected_params, reason);
}
}
@@ -919,6 +927,15 @@ void ConnectionHandlerImpl::CreateWebEngineDevice() {
transport_manager_.CreateWebEngineDevice();
}
+bool ConnectionHandlerImpl::GetProtocolVehicleData(ProtocolVehicleData& data) {
+ sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_);
+ if (connection_handler_observer_) {
+ return connection_handler_observer_->GetProtocolVehicleData(data);
+ }
+
+ return false;
+}
+
const std::string
ConnectionHandlerImpl::TransportTypeProfileStringFromConnHandle(
transport_manager::ConnectionUID connection_handle) const {
@@ -985,7 +1002,7 @@ uint32_t ConnectionHandlerImpl::KeyFromPair(
transport_manager::ConnectionUID connection_handle,
uint8_t session_id) const {
const uint32_t key = connection_handle | (session_id << 16);
- SDL_LOG_DEBUG("Key for ConnectionHandle:"
+ SDL_LOG_TRACE("Key for ConnectionHandle:"
<< static_cast<uint32_t>(connection_handle)
<< " Session:" << static_cast<uint32_t>(session_id) << " is: 0x"
<< std::hex << static_cast<uint32_t>(key));
@@ -1003,7 +1020,7 @@ void ConnectionHandlerImpl::PairFromKey(
uint8_t* session_id) const {
*connection_handle = key & 0xFF00FFFF;
*session_id = key >> 16;
- SDL_LOG_DEBUG("ConnectionHandle: "
+ SDL_LOG_TRACE("ConnectionHandle: "
<< static_cast<int32_t>(*connection_handle)
<< " Session: " << static_cast<int32_t>(*session_id)
<< " for key: " << static_cast<int32_t>(key));
@@ -1457,6 +1474,10 @@ void ConnectionHandlerImpl::ConnectToAllDevices() {
SDL_LOG_DEBUG("No need to connect to web engine device");
continue;
}
+ if ("CLOUD_WEBSOCKET" == i->second.connection_type()) {
+ SDL_LOG_DEBUG("No need to connect to cloud device");
+ continue;
+ }
ConnectToDevice(i->first);
}
}
diff --git a/src/components/connection_handler/test/connection_handler_impl_test.cc b/src/components/connection_handler/test/connection_handler_impl_test.cc
index 1e66454ce7..79b237253c 100644
--- a/src/components/connection_handler/test/connection_handler_impl_test.cc
+++ b/src/components/connection_handler/test/connection_handler_impl_test.cc
@@ -56,6 +56,7 @@ using namespace ::connection_handler;
using ::protocol_handler::ServiceType;
using namespace ::protocol_handler;
using ::testing::_;
+using ::testing::An;
using ::testing::ByRef;
using ::testing::DoAll;
using ::testing::InSequence;
@@ -127,7 +128,8 @@ class ConnectionHandlerTest : public ::testing::Test {
void AddTestSession() {
protocol_handler_test::MockProtocolHandler temp_protocol_handler;
connection_handler_->set_protocol_handler(&temp_protocol_handler);
- EXPECT_CALL(temp_protocol_handler, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(temp_protocol_handler,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&out_context_));
connection_handler_->OnSessionStartedCallback(
@@ -164,7 +166,8 @@ class ConnectionHandlerTest : public ::testing::Test {
SessionContext context;
protocol_handler_test::MockProtocolHandler temp_protocol_handler;
connection_handler_->set_protocol_handler(&temp_protocol_handler);
- EXPECT_CALL(temp_protocol_handler, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(temp_protocol_handler,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&context));
connection_handler_->OnSessionStartedCallback(uid_,
@@ -371,7 +374,8 @@ TEST_F(ConnectionHandlerTest, StartSession_NoConnection) {
protocol_handler::SessionContext context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&context));
connection_handler_->OnSessionStartedCallback(
@@ -1268,7 +1272,8 @@ TEST_F(ConnectionHandlerTest, StartService_withServices) {
SessionContext audio_context, video_context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&audio_context))
.WillOnce(SaveArg<0>(&video_context));
@@ -1309,7 +1314,8 @@ TEST_F(ConnectionHandlerTest, StartService_withServices_withParams) {
std::vector<std::string> empty;
BsonObject* dummy_param = reinterpret_cast<BsonObject*>(&dummy);
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, empty, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), empty, _))
.WillOnce(SaveArg<0>(&video_context));
connection_handler_->OnSessionStartedCallback(uid_,
@@ -1354,7 +1360,8 @@ TEST_F(ConnectionHandlerTest, ServiceStop) {
SessionContext audio_context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillRepeatedly(SaveArg<0>(&audio_context));
// Check ignoring hash_id on stop non-rpc service
@@ -1445,7 +1452,8 @@ TEST_F(ConnectionHandlerTest, SessionStarted_WithRpc) {
reason));
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&out_context_));
// Start new session with RPC service
@@ -1485,7 +1493,8 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_SUCCESS) {
// confirm that NotifySessionStarted() is called
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, empty, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), empty, _))
.WillOnce(SaveArg<0>(&out_context_));
connection_handler_->OnSessionStartedCallback(uid_,
@@ -1527,7 +1536,8 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_FAILURE) {
// confirm that NotifySessionStarted() is called
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, empty, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), empty, _))
.WillOnce(SaveArg<0>(&out_context_));
connection_handler_->OnSessionStartedCallback(uid_,
@@ -1536,7 +1546,7 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_FAILURE) {
PROTECTION_OFF,
dummy_params);
- EXPECT_EQ(0u, out_context_.new_session_id_);
+ EXPECT_TRUE(out_context_.is_start_session_failed_);
}
/*
@@ -1551,7 +1561,8 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_Multiple) {
protocol_handler_test::MockProtocolHandler temp_protocol_handler;
connection_handler_->set_protocol_handler(&temp_protocol_handler);
- EXPECT_CALL(temp_protocol_handler, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(temp_protocol_handler,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&context_first))
.WillOnce(SaveArg<0>(&context_second));
@@ -1622,7 +1633,8 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_Multiple) {
// verify that connection handler will not mix up the two results
SessionContext new_context_first, new_context_second;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, empty, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), empty, _))
.WillOnce(SaveArg<0>(&new_context_second))
.WillOnce(SaveArg<0>(&new_context_first));
@@ -1637,8 +1649,10 @@ TEST_F(ConnectionHandlerTest, ServiceStarted_Video_Multiple) {
PROTECTION_OFF,
dummy_params);
- EXPECT_NE(0u, new_context_first.new_session_id_); // result is positive
- EXPECT_EQ(0u, new_context_second.new_session_id_); // result is negative
+ EXPECT_FALSE(
+ new_context_first.is_start_session_failed_); // result is positive
+ EXPECT_TRUE(
+ new_context_second.is_start_session_failed_); // result is negative
}
TEST_F(ConnectionHandlerTest,
@@ -1654,7 +1668,8 @@ TEST_F(ConnectionHandlerTest,
SessionContext fail_context;
SessionContext positive_context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&fail_context))
.WillOnce(SaveArg<0>(&positive_context));
@@ -1697,7 +1712,8 @@ TEST_F(ConnectionHandlerTest,
SessionContext fail_context;
SessionContext positive_context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&fail_context))
.WillOnce(SaveArg<0>(&positive_context));
@@ -1742,7 +1758,8 @@ TEST_F(ConnectionHandlerTest,
SessionContext context_first, context_second;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&context_first))
.WillOnce(SaveArg<0>(&context_second));
@@ -1797,7 +1814,8 @@ TEST_F(ConnectionHandlerTest,
SessionContext rejected_context, positive_context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&rejected_context))
.WillOnce(SaveArg<0>(&positive_context));
@@ -1840,7 +1858,8 @@ TEST_F(ConnectionHandlerTest, SessionStarted_DelayProtect) {
SessionContext context_new, context_second, context_third;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&context_new))
.WillOnce(SaveArg<0>(&context_second))
.WillOnce(SaveArg<0>(&context_third));
@@ -1895,7 +1914,8 @@ TEST_F(ConnectionHandlerTest, SessionStarted_DelayProtectBulk) {
SessionContext new_context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&new_context));
connection_handler_->OnSessionStartedCallback(uid_,
out_context_.new_session_id_,
@@ -2001,7 +2021,8 @@ TEST_F(ConnectionHandlerTest, GetSSLContext_ByProtectedService) {
SessionContext new_context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&new_context));
// Open kAudio service
@@ -2038,7 +2059,8 @@ TEST_F(ConnectionHandlerTest, GetSSLContext_ByDealyProtectedRPC) {
SessionContext new_context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&new_context));
// Protect kRpc (Bulk will be protect also)
@@ -2078,7 +2100,8 @@ TEST_F(ConnectionHandlerTest, GetSSLContext_ByDealyProtectedBulk) {
SessionContext new_context;
connection_handler_->set_protocol_handler(&mock_protocol_handler_);
- EXPECT_CALL(mock_protocol_handler_, NotifySessionStarted(_, _, _))
+ EXPECT_CALL(mock_protocol_handler_,
+ NotifySessionStarted(An<SessionContext&>(), _, _))
.WillOnce(SaveArg<0>(&new_context));
// Protect Bulk (kRpc will be protected also)
diff --git a/src/components/hmi_message_handler/include/hmi_message_handler/websocket_session.h b/src/components/hmi_message_handler/include/hmi_message_handler/websocket_session.h
index 67a46aca56..693b72eb50 100644
--- a/src/components/hmi_message_handler/include/hmi_message_handler/websocket_session.h
+++ b/src/components/hmi_message_handler/include/hmi_message_handler/websocket_session.h
@@ -36,7 +36,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <boost/asio/bind_executor.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/placeholders.hpp>
-#include <boost/asio/strand.hpp>
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/make_shared.hpp>
@@ -87,7 +86,6 @@ class CMessageBrokerController;
class WebsocketSession : public std::enable_shared_from_this<WebsocketSession> {
boost::beast::websocket::stream<boost::asio::ip::tcp::socket> ws_;
- boost::asio::strand<boost::asio::io_context::executor_type> strand_;
boost::beast::multi_buffer buffer_;
boost::beast::multi_buffer send_buffer_;
CMessageBrokerController* controller_;
@@ -189,7 +187,6 @@ class WebsocketSession : public std::enable_shared_from_this<WebsocketSession> {
WebsocketSession& handler_;
sync_primitives::Lock queue_lock_;
sync_primitives::ConditionalVariable queue_new_items_;
- std::atomic_bool write_pending_;
std::atomic_bool shutdown_;
sync_primitives::Lock write_lock_;
diff --git a/src/components/hmi_message_handler/src/websocket_session.cc b/src/components/hmi_message_handler/src/websocket_session.cc
index a387b639a2..6e1c4b9bc4 100644
--- a/src/components/hmi_message_handler/src/websocket_session.cc
+++ b/src/components/hmi_message_handler/src/websocket_session.cc
@@ -41,7 +41,6 @@ SDL_CREATE_LOG_VARIABLE("HMIMessageHandler")
WebsocketSession::WebsocketSession(boost::asio::ip::tcp::socket socket,
CMessageBrokerController* controller)
: ws_(std::move(socket))
- , strand_(ws_.get_executor())
, controller_(controller)
, stop(false)
, m_receivingBuffer("")
@@ -57,10 +56,8 @@ WebsocketSession::WebsocketSession(boost::asio::ip::tcp::socket socket,
WebsocketSession::~WebsocketSession() {}
void WebsocketSession::Accept() {
- ws_.async_accept(boost::asio::bind_executor(
- strand_,
- std::bind(
- &WebsocketSession::Recv, shared_from_this(), std::placeholders::_1)));
+ ws_.async_accept(std::bind(
+ &WebsocketSession::Recv, shared_from_this(), std::placeholders::_1));
}
void WebsocketSession::Shutdown() {
@@ -90,11 +87,10 @@ void WebsocketSession::Recv(boost::system::error_code ec) {
}
ws_.async_read(buffer_,
- boost::asio::bind_executor(strand_,
- std::bind(&WebsocketSession::Read,
- shared_from_this(),
- std::placeholders::_1,
- std::placeholders::_2)));
+ std::bind(&WebsocketSession::Read,
+ shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2));
}
void WebsocketSession::Send(const std::string& message,
diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h
index 2bb202c62d..54f7ab9f05 100644
--- a/src/components/include/application_manager/application_manager.h
+++ b/src/components/include/application_manager/application_manager.h
@@ -623,6 +623,12 @@ class ApplicationManager {
virtual bool IsStopping() const = 0;
+ /**
+ * @brief Waits for HMI readiness and blocks thread if it's not ready yet
+ * @return true if HMI is ready and cooperating, otherwise returns false
+ */
+ virtual bool WaitForHmiIsReady() = 0;
+
virtual void RemoveAppFromTTSGlobalPropertiesList(const uint32_t app_id) = 0;
/**
@@ -855,10 +861,15 @@ class ApplicationManager {
* @brief Callback calls when application starts/stops data streaming
* @param app_id Streaming application id
* @param service_type Streaming service type
- * @param new_state Defines new streaming state
+ * @param state True if streaming started, false if streaming stopped.
*/
virtual void OnAppStreaming(uint32_t app_id,
protocol_handler::ServiceType service_type,
+ bool state) = 0;
+
+ DEPRECATED
+ virtual void OnAppStreaming(uint32_t app_id,
+ protocol_handler::ServiceType service_type,
const Application::StreamingState new_state) = 0;
/**
diff --git a/src/components/include/application_manager/hmi_capabilities.h b/src/components/include/application_manager/hmi_capabilities.h
index 56ac807d63..e7d7aa485b 100644
--- a/src/components/include/application_manager/hmi_capabilities.h
+++ b/src/components/include/application_manager/hmi_capabilities.h
@@ -97,11 +97,26 @@ class HMICapabilities {
/**
* @brief Returns software version of the target
- * @return TRUE if it supported, otherwise FALSE
+ * @return string representation of software version if supported, otherwise
+ * empty string
*/
virtual const std::string& ccpu_version() const = 0;
/**
+ * @brief Interface used to store information about hardware version of the
+ * target
+ * @param hardware_version Received system/hmi hardware version
+ */
+ virtual void set_hardware_version(const std::string& hardware_version) = 0;
+
+ /**
+ * @brief Returns hardware version of the target
+ * @return string representation of hardware version if supported, otherwise
+ * empty string
+ */
+ virtual const std::string& hardware_version() const = 0;
+
+ /**
* @brief Retrieves if mixing audio is supported by HMI
* (ie recording TTS command and playing audio)
* @return Current state of the mixing audio flag
diff --git a/src/components/include/application_manager/policies/policy_handler_interface.h b/src/components/include/application_manager/policies/policy_handler_interface.h
index d8aef7cc1a..7ada7884bf 100644
--- a/src/components/include/application_manager/policies/policy_handler_interface.h
+++ b/src/components/include/application_manager/policies/policy_handler_interface.h
@@ -332,12 +332,26 @@ class PolicyHandlerInterface : public VehicleDataItemProvider {
const std::string& language) = 0;
/**
+ * @brief Save hardware version from GetSystemInfo request to policy table, if
+ * present
+ * @param hardware_version Hardware version
+ */
+ virtual void OnHardwareVersionReceived(
+ const std::string& hardware_version) = 0;
+
+ /**
* @brief Get information about last ccpu_version from PT
* @return ccpu_version from PT
*/
virtual std::string GetCCPUVersionFromPT() const = 0;
/**
+ * @brief Get information about last hardware version from PT
+ * @return hardware version from PT
+ */
+ virtual std::string GetHardwareVersionFromPT() const = 0;
+
+ /**
* @brief Sends GetVehicleData request in case when Vechicle info is ready.
*/
virtual void OnVIIsReady() = 0;
diff --git a/src/components/include/connection_handler/connection_handler.h b/src/components/include/connection_handler/connection_handler.h
index cb83bec564..7cb1448a37 100644
--- a/src/components/include/connection_handler/connection_handler.h
+++ b/src/components/include/connection_handler/connection_handler.h
@@ -58,6 +58,18 @@ enum CloseSessionReason {
class ConnectionHandlerObserver;
+/**
+ * @brief Helper structure to collect all required vehicle data
+ */
+struct ProtocolVehicleData {
+ std::string vehicle_make;
+ std::string vehicle_model;
+ std::string vehicle_year;
+ std::string vehicle_trim;
+ std::string vehicle_system_software_version;
+ std::string vehicle_system_hardware_version;
+};
+
// The SessionConnectionMap keeps track of the primary and secondary transports
// associated with a session ID
typedef struct {
@@ -345,6 +357,14 @@ class ConnectionHandler {
const = 0;
/**
+ * @brief Collects all vehicle data required by a protocol layer
+ * @param data output structure to store received vehicle data
+ * @return true if data has been received successfully, otherwise returns
+ * false
+ */
+ virtual bool GetProtocolVehicleData(ProtocolVehicleData& data) = 0;
+
+ /**
* @brief Called when HMI cooperation is started,
* creates WebSocketDevice for WebEngine
*/
diff --git a/src/components/include/connection_handler/connection_handler_observer.h b/src/components/include/connection_handler/connection_handler_observer.h
index 7d6664a009..cfbbefefd4 100644
--- a/src/components/include/connection_handler/connection_handler_observer.h
+++ b/src/components/include/connection_handler/connection_handler_observer.h
@@ -177,6 +177,14 @@ class ConnectionHandlerObserver {
*/
virtual void OnWebEngineDeviceCreated() = 0;
+ /**
+ * @brief Collects all vehicle data required by a protocol layer
+ * @param data output structure to store received vehicle data
+ * @return true if data has been received successfully, otherwise returns
+ * false
+ */
+ virtual bool GetProtocolVehicleData(ProtocolVehicleData& data) = 0;
+
protected:
/**
* \brief Destructor
diff --git a/src/components/include/media_manager/media_manager.h b/src/components/include/media_manager/media_manager.h
index 0729adc7d8..2d2201a949 100644
--- a/src/components/include/media_manager/media_manager.h
+++ b/src/components/include/media_manager/media_manager.h
@@ -70,6 +70,14 @@ class MediaManager {
*/
virtual const MediaManagerSettings& settings() const = 0;
+ /**
+ * \brief Convert an amount of audio bytes to an estimated time in ms
+ * \param data_size number of bytes to be played
+ * \return milliseconds required to play <data_size> many bytes with
+ * the current pcm stream capabilities
+ */
+ virtual uint32_t DataSizeToMilliseconds(uint64_t data_size) const = 0;
+
virtual ~MediaManager() {}
};
diff --git a/src/components/include/policy/policy_external/policy/policy_manager.h b/src/components/include/policy/policy_external/policy/policy_manager.h
index 9d4ad5ea57..d9844c153b 100644
--- a/src/components/include/policy/policy_external/policy/policy_manager.h
+++ b/src/components/include/policy/policy_external/policy/policy_manager.h
@@ -433,12 +433,25 @@ class PolicyManager : public usage_statistics::StatisticsManager,
const std::string& language) = 0;
/**
+ * @brief Set hardware version from GetSystemInfo response to policy table, if
+ * present
+ * @param hardware_version Hardware version
+ */
+ virtual void SetHardwareVersion(const std::string& hardware_version) = 0;
+
+ /**
* @brief Get information about last ccpu_version from PT
* @return ccpu_version from PT
*/
virtual std::string GetCCPUVersionFromPT() const = 0;
/**
+ * @brief Get information about last hardware version from PT
+ * @return hardware version from PT
+ */
+ virtual std::string GetHardwareVersionFromPT() const = 0;
+
+ /**
* @brief Send OnPermissionsUpdated for choosen application
* @param device_id device identifier
* @param application_id Unique application id
@@ -858,6 +871,11 @@ class PolicyManager : public usage_statistics::StatisticsManager,
*/
virtual void ResetTimeout() = 0;
+ /**
+ * @brief Trigger a PTU once on startup if it is required
+ */
+ virtual void TriggerPTUOnStartupIfRequired() = 0;
+
protected:
/**
* @brief Checks is PT exceeded IgnitionCycles
diff --git a/src/components/include/policy/policy_regular/policy/policy_manager.h b/src/components/include/policy/policy_regular/policy/policy_manager.h
index c90006928a..b4043067ab 100644
--- a/src/components/include/policy/policy_regular/policy/policy_manager.h
+++ b/src/components/include/policy/policy_regular/policy/policy_manager.h
@@ -424,12 +424,25 @@ class PolicyManager : public usage_statistics::StatisticsManager,
const std::string& language) = 0;
/**
+ * @brief Set hardware version from GetSystemInfo response to policy table, if
+ * present
+ * @param hardware_version Hardware version
+ */
+ virtual void SetHardwareVersion(const std::string& hardware_version) = 0;
+
+ /**
* @brief Get information about last ccpu_version from PT
* @return ccpu_version from PT
*/
virtual std::string GetCCPUVersionFromPT() const = 0;
/**
+ * @brief Get information about last hardware version from PT
+ * @return hardware version from PT
+ */
+ virtual std::string GetHardwareVersionFromPT() const = 0;
+
+ /**
* @brief Send OnPermissionsUpdated for choosen application
* @param device_id device identifier
* @param application_id Unique application id
diff --git a/src/components/include/protocol/bson_object_keys.h b/src/components/include/protocol/bson_object_keys.h
index f81de4cc81..830c33b3eb 100644
--- a/src/components/include/protocol/bson_object_keys.h
+++ b/src/components/include/protocol/bson_object_keys.h
@@ -49,6 +49,12 @@ extern const char* tcp_ip_address;
extern const char* tcp_port;
extern const char* reason;
extern const char* auth_token;
+extern const char* vehicle_make;
+extern const char* vehicle_model;
+extern const char* vehicle_model_year;
+extern const char* vehicle_trim;
+extern const char* vehicle_system_software_version;
+extern const char* vehicle_system_hardware_version;
} // namespace strings
diff --git a/src/components/include/protocol_handler/protocol_handler.h b/src/components/include/protocol_handler/protocol_handler.h
index b9cc2e9700..011592da49 100644
--- a/src/components/include/protocol_handler/protocol_handler.h
+++ b/src/components/include/protocol_handler/protocol_handler.h
@@ -137,11 +137,27 @@ class ProtocolHandler {
* @param err_reason string with NACK reason. Only valid when
* generated_session_id is 0.
*/
+ DEPRECATED
virtual void NotifySessionStarted(
const SessionContext& context,
std::vector<std::string>& rejected_params,
const std::string err_reason = std::string()) = 0;
+ /**
+ * @brief Called by connection handler to notify the context of
+ * OnSessionStartedCallback().
+ * @param context reference to structure with started session data
+ * @param rejected_params list of parameters name that are rejected.
+ * Only valid when generated_session_id is 0. Note, even if
+ * generated_session_id is 0, the list may be empty.
+ * @param err_reason string with NACK reason. Only valid when
+ * generated_session_id is 0.
+ */
+ virtual void NotifySessionStarted(
+ SessionContext& context,
+ std::vector<std::string>& rejected_params,
+ const std::string err_reason = std::string()) = 0;
+
virtual bool IsRPCServiceSecure(const uint32_t connection_key) const = 0;
virtual void ProcessFailedPTU() = 0;
diff --git a/src/components/include/protocol_handler/session_observer.h b/src/components/include/protocol_handler/session_observer.h
index 593ce8408c..ca12f4b6ad 100644
--- a/src/components/include/protocol_handler/session_observer.h
+++ b/src/components/include/protocol_handler/session_observer.h
@@ -69,6 +69,7 @@ struct SessionContext {
uint32_t hash_id_;
bool is_protected_;
bool is_new_service_;
+ bool is_start_session_failed_;
/**
* @brief Constructor
@@ -81,7 +82,8 @@ struct SessionContext {
, service_type_(protocol_handler::kInvalidServiceType)
, hash_id_(0)
, is_protected_(false)
- , is_new_service_(false) {}
+ , is_new_service_(false)
+ , is_start_session_failed_(false) {}
/**
* @brief Constructor
@@ -111,7 +113,8 @@ struct SessionContext {
, service_type_(service_type)
, hash_id_(hash_id)
, is_protected_(is_protected)
- , is_new_service_(false) {}
+ , is_new_service_(false)
+ , is_start_session_failed_(false) {}
};
/**
diff --git a/src/components/include/security_manager/security_manager_settings.h b/src/components/include/security_manager/security_manager_settings.h
index 0bbe0f4f96..4e601c3e0e 100644
--- a/src/components/include/security_manager/security_manager_settings.h
+++ b/src/components/include/security_manager/security_manager_settings.h
@@ -60,6 +60,7 @@ class CryptoManagerSettings {
virtual size_t maximum_payload_size() const = 0;
virtual const std::vector<int>& force_protected_service() const = 0;
virtual const std::vector<int>& force_unprotected_service() const = 0;
+ virtual uint32_t security_level() const = 0;
};
} // namespace security_manager
diff --git a/src/components/include/test/application_manager/mock_application_manager.h b/src/components/include/test/application_manager/mock_application_manager.h
index 3b827b1a0d..fd7ddeac15 100644
--- a/src/components/include/test/application_manager/mock_application_manager.h
+++ b/src/components/include/test/application_manager/mock_application_manager.h
@@ -232,6 +232,7 @@ class MockApplicationManager : public application_manager::ApplicationManager {
MOCK_CONST_METHOD1(IsAppsQueriedFrom,
bool(const connection_handler::DeviceHandle handle));
MOCK_CONST_METHOD0(IsStopping, bool());
+ MOCK_METHOD0(WaitForHmiIsReady, bool());
MOCK_METHOD1(RemoveAppFromTTSGlobalPropertiesList,
void(const uint32_t app_id));
MOCK_METHOD2(ResetGlobalProperties,
@@ -314,11 +315,16 @@ class MockApplicationManager : public application_manager::ApplicationManager {
MOCK_METHOD1(OnAppUnauthorized, void(const uint32_t& app_id));
MOCK_METHOD1(ActivateApplication,
bool(application_manager::ApplicationSharedPtr app));
+ MOCK_METHOD3(OnAppStreaming,
+ void(uint32_t app_id,
+ protocol_handler::ServiceType service_type,
+ bool state));
+ DEPRECATED
MOCK_METHOD3(
OnAppStreaming,
void(uint32_t app_id,
protocol_handler::ServiceType service_type,
- application_manager::Application::StreamingState new_state));
+ const application_manager::Application::StreamingState new_state));
MOCK_CONST_METHOD6(CreateRegularState,
application_manager::HmiStatePtr(
application_manager::ApplicationSharedPtr app,
diff --git a/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h b/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h
index 7b6da68c51..af4019ce21 100644
--- a/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h
+++ b/src/components/include/test/application_manager/policies/mock_policy_handler_interface.h
@@ -186,7 +186,10 @@ class MockPolicyHandlerInterface : public policy::PolicyHandlerInterface {
void(const std::string& ccpu_version,
const std::string& wers_country_code,
const std::string& language));
+ MOCK_METHOD1(OnHardwareVersionReceived,
+ void(const std::string& hardware_version));
MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string());
+ MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string());
MOCK_METHOD0(OnVIIsReady, void());
MOCK_METHOD1(OnVehicleDataUpdated,
void(const smart_objects::SmartObject& message));
diff --git a/src/components/include/test/connection_handler/mock_connection_handler.h b/src/components/include/test/connection_handler/mock_connection_handler.h
index 78083b0abf..bdfcf55e34 100644
--- a/src/components/include/test/connection_handler/mock_connection_handler.h
+++ b/src/components/include/test/connection_handler/mock_connection_handler.h
@@ -139,6 +139,8 @@ class MockConnectionHandler : public connection_handler::ConnectionHandler {
OnSecondaryTransportEnded,
void(const transport_manager::ConnectionUID primary_connection_handle,
const transport_manager::ConnectionUID secondary_connection_handle));
+ MOCK_METHOD1(GetProtocolVehicleData,
+ bool(connection_handler::ProtocolVehicleData& data));
MOCK_METHOD0(CreateWebEngineDevice, void());
MOCK_CONST_METHOD0(GetWebEngineDeviceInfo, transport_manager::DeviceInfo&());
};
diff --git a/src/components/include/test/connection_handler/mock_connection_handler_observer.h b/src/components/include/test/connection_handler/mock_connection_handler_observer.h
index 61877daa23..90174017c3 100644
--- a/src/components/include/test/connection_handler/mock_connection_handler_observer.h
+++ b/src/components/include/test/connection_handler/mock_connection_handler_observer.h
@@ -83,6 +83,8 @@ class MockConnectionHandlerObserver
MOCK_METHOD2(SetPendingApplicationState,
void(const transport_manager::ConnectionUID connection_id,
const transport_manager::DeviceInfo& device_info));
+ MOCK_METHOD1(GetProtocolVehicleData,
+ bool(connection_handler::ProtocolVehicleData& data));
};
} // namespace connection_handler_test
diff --git a/src/components/include/test/media_manager/mock_media_manager.h b/src/components/include/test/media_manager/mock_media_manager.h
index 36e35352d6..364c495236 100644
--- a/src/components/include/test/media_manager/mock_media_manager.h
+++ b/src/components/include/test/media_manager/mock_media_manager.h
@@ -64,6 +64,7 @@ class MockMediaManager : public media_manager::MediaManager {
MOCK_METHOD2(FramesProcessed,
void(int32_t application_key, int32_t frame_number));
MOCK_CONST_METHOD0(settings, const media_manager::MediaManagerSettings&());
+ MOCK_CONST_METHOD1(DataSizeToMilliseconds, uint32_t(uint64_t data_size));
};
} // namespace media_manager_test
diff --git a/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h b/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h
index d93bdff7f7..a79918cc39 100644
--- a/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h
+++ b/src/components/include/test/policy/policy_external/policy/mock_cache_manager.h
@@ -207,7 +207,9 @@ class MockCacheManagerInterface : public ::policy::CacheManagerInterface {
bool(const std::string& ccpu_version,
const std::string& wers_country_code,
const std::string& language));
+ MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version));
MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string());
+ MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string());
MOCK_CONST_METHOD0(IsMetaInfoPresent, bool());
MOCK_METHOD1(SetSystemLanguage, bool(const std::string& language));
MOCK_METHOD1(Increment, void(usage_statistics::GlobalCounterId type));
diff --git a/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h b/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h
index 0123c6c912..22ab31307a 100644
--- a/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h
+++ b/src/components/include/test/policy/policy_external/policy/mock_policy_manager.h
@@ -173,6 +173,7 @@ class MockPolicyManager : public PolicyManager {
void(const std::string& ccpu_version,
const std::string& wers_country_code,
const std::string& language));
+ MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version));
MOCK_METHOD1(SetPreloadedPtFlag, void(const bool is_preloaded));
MOCK_METHOD2(SendNotificationOnPermissionsUpdated,
void(const std::string& device_id,
@@ -269,6 +270,7 @@ class MockPolicyManager : public PolicyManager {
MOCK_METHOD0(ExceededIgnitionCycles, bool());
MOCK_METHOD0(ExceededDays, bool());
MOCK_METHOD0(StartPTExchange, void());
+ MOCK_METHOD0(TriggerPTUOnStartupIfRequired, void());
MOCK_METHOD1(Increment, void(usage_statistics::GlobalCounterId type));
MOCK_METHOD2(Increment,
void(const std::string& app_id,
@@ -308,6 +310,7 @@ class MockPolicyManager : public PolicyManager {
MOCK_METHOD0(RetrySequenceFailed, void());
MOCK_METHOD0(ResetTimeout, void());
MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string());
+ MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string());
};
} // namespace policy_manager_test
} // namespace components
diff --git a/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h b/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h
index 19de301dc3..716f66f994 100644
--- a/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h
+++ b/src/components/include/test/policy/policy_regular/policy/mock_cache_manager.h
@@ -181,7 +181,9 @@ class MockCacheManagerInterface : public CacheManagerInterface {
bool(const std::string& ccpu_version,
const std::string& wers_country_code,
const std::string& language));
+ MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version));
MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string());
+ MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string());
MOCK_CONST_METHOD0(IsMetaInfoPresent, bool());
MOCK_METHOD1(SetSystemLanguage, bool(const std::string& language));
MOCK_METHOD1(Increment, void(usage_statistics::GlobalCounterId type));
diff --git a/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h b/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h
index 4cb6455db6..076f0423ef 100644
--- a/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h
+++ b/src/components/include/test/policy/policy_regular/policy/mock_policy_manager.h
@@ -172,6 +172,7 @@ class MockPolicyManager : public PolicyManager {
void(const std::string& ccpu_version,
const std::string& wers_country_code,
const std::string& language));
+ MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version));
MOCK_METHOD1(SetPreloadedPtFlag, void(const bool is_preloaded));
MOCK_METHOD2(SendNotificationOnPermissionsUpdated,
void(const std::string& device_id,
@@ -311,6 +312,7 @@ class MockPolicyManager : public PolicyManager {
RequestSubType::State(const std::string& policy_app_id));
MOCK_METHOD0(ResetTimeout, void());
MOCK_CONST_METHOD0(GetCCPUVersionFromPT, std::string());
+ MOCK_CONST_METHOD0(GetHardwareVersionFromPT, std::string());
};
} // namespace policy_manager_test
diff --git a/src/components/include/test/protocol_handler/mock_protocol_handler.h b/src/components/include/test/protocol_handler/mock_protocol_handler.h
index da71d9bc90..aa7c1293c3 100644
--- a/src/components/include/test/protocol_handler/mock_protocol_handler.h
+++ b/src/components/include/test/protocol_handler/mock_protocol_handler.h
@@ -65,6 +65,10 @@ class MockProtocolHandler : public ::protocol_handler::ProtocolHandler {
const ::protocol_handler::ProtocolHandlerSettings&());
MOCK_METHOD0(get_session_observer, protocol_handler::SessionObserver&());
MOCK_METHOD3(NotifySessionStarted,
+ void(::protocol_handler::SessionContext& context,
+ std::vector<std::string>& rejected_params,
+ const std::string err_reason));
+ MOCK_METHOD3(NotifySessionStarted,
void(const ::protocol_handler::SessionContext& context,
std::vector<std::string>& rejected_params,
const std::string err_reason));
diff --git a/src/components/include/test/security_manager/mock_security_manager_settings.h b/src/components/include/test/security_manager/mock_security_manager_settings.h
index b1c869cd1b..2c62973413 100644
--- a/src/components/include/test/security_manager/mock_security_manager_settings.h
+++ b/src/components/include/test/security_manager/mock_security_manager_settings.h
@@ -56,6 +56,7 @@ class MockCryptoManagerSettings
MOCK_CONST_METHOD0(maximum_payload_size, size_t());
MOCK_CONST_METHOD0(force_protected_service, const std::vector<int>&());
MOCK_CONST_METHOD0(force_unprotected_service, const std::vector<int>&());
+ MOCK_CONST_METHOD0(security_level, uint32_t());
};
} // namespace security_manager_test
diff --git a/src/components/include/utils/semantic_version.h b/src/components/include/utils/semantic_version.h
index 01b04495ad..54be460bab 100644
--- a/src/components/include/utils/semantic_version.h
+++ b/src/components/include/utils/semantic_version.h
@@ -43,12 +43,6 @@ struct SemanticVersion {
patch_version_ = patch;
}
- SemanticVersion(const SemanticVersion& other) {
- major_version_ = other.major_version_;
- minor_version_ = other.minor_version_;
- patch_version_ = other.patch_version_;
- }
-
SemanticVersion(const std::string& versionString)
: major_version_(0), minor_version_(0), patch_version_(0) {
int readElements = sscanf(versionString.c_str(),
diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml
index 3ac14e4d54..92806e7372 100644
--- a/src/components/interfaces/HMI_API.xml
+++ b/src/components/interfaces/HMI_API.xml
@@ -34,7 +34,7 @@
<interfaces name="SmartDeviceLink HMI API">
-<interface name="Common" version="2.1.0" date="2019-03-18">
+<interface name="Common" version="2.2.0" date="2021-04-14">
<enum name="Result">
<element name="SUCCESS" value="0"/>
@@ -634,6 +634,12 @@
<element name="phoneNumber">
<description> Optional phone number of intended location / establishment (if applicable) for SendLocation.</description>
</element>
+ <element name="timeToDestination">
+ <description>Optional time to destination field for ShowConstantTBT</description>
+ </element>
+ <element name="turnText">
+ <description>Turn text for turnList parameter of UpdateTurnList</description>
+ </element>
<element name="subtleAlertText1">
<description>The first line of the subtle alert text field; applies to `SubtleAlert` `alertText1`</description>
</element>
@@ -643,14 +649,17 @@
<element name="subtleAlertSoftButtonText">
<description>A text field in the soft button of a subtle alert; applies to `SubtleAlert` `softButtons`</description>
</element>
- <element name="timeToDestination"/>
- <!-- TO DO to be removed -->
- <element name="turnText"/>
- <element name="navigationText">
- <description>Navigation text for UpdateTurnList.</description>
+ <element name="menuCommandSecondaryText">
+ <description>Secondary text for AddCommand</description>
+ </element>
+ <element name="menuCommandTertiaryText">
+ <description>Tertiary text for AddCommand</description>
</element>
- <element name="notificationText">
- <description>Text of notification to be displayed on screen.</description>
+ <element name="menuSubMenuSecondaryText">
+ <description>Secondary text for AddSubMenu</description>
+ </element>
+ <element name="menuSubMenuTertiaryText">
+ <description>Tertiary text for AddSubMenu</description>
</element>
</enum>
@@ -742,6 +751,12 @@
<element name="subtleAlertIcon">
<description>The image of the subtle alert; applies to `SubtleAlert` `alertIcon`</description>
</element>
+ <element name="menuCommandSecondaryImage">
+ <description>The secondary image field for AddCommand</description>
+ </element>
+ <element name="menuSubMenuSecondaryImage">
+ <description>The secondary image field for AddSubMenu</description>
+ </element>
</enum>
<enum name="TextAlignment">
@@ -832,6 +847,11 @@
</element>
</enum>
+<enum name="AppCapabilityType">
+ <description>Enumerations of all available app capability types</description>
+ <element name="VIDEO_STREAMING"/>
+</enum>
+
<!--IVI part-->
<enum name="ElectronicParkBrakeStatus">
<element name="CLOSED">
@@ -1208,6 +1228,7 @@
<element name="VEHICLEDATA_FUELLEVEL_STATE" />
<element name="VEHICLEDATA_FUELCONSUMPTION" />
<element name="VEHICLEDATA_EXTERNTEMP" />
+ <element name="VEHICLEDATA_CLIMATEDATA"/>
<element name="VEHICLEDATA_VIN" />
<element name="VEHICLEDATA_GEARSTATUS" />
<element name="VEHICLEDATA_PRNDL" />
@@ -1327,6 +1348,7 @@
<element name="QWERTY" />
<element name="QWERTZ" />
<element name="AZERTY" />
+ <element name="NUMERIC"/>
</enum>
<enum name="KeyboardEvent">
@@ -1336,6 +1358,15 @@
<element name="ENTRY_VOICE" />
<element name="ENTRY_CANCELLED" />
<element name="ENTRY_ABORTED" />
+ <element name="INPUT_KEY_MASK_ENABLED"/>
+ <element name="INPUT_KEY_MASK_DISABLED"/>
+</enum>
+
+<enum name="KeyboardInputMask">
+ <description>Enumeration listing possible input character masking.</description>
+ <element name="ENABLE_INPUT_KEY_MASK" />
+ <element name="DISABLE_INPUT_KEY_MASK" />
+ <element name="USER_CHOICE_INPUT_KEY_MASK" />
</enum>
<enum name="KeypressMode">
@@ -2241,7 +2272,7 @@
</enum>
<struct name="Temperature">
- <param name="unit" type="TemperatureUnit" mandatory="true" >
+ <param name="unit" type="Common.TemperatureUnit" mandatory="true" >
<description>Temperature Unit</description>
</param>
<param name="value" type="Float" mandatory="true" >
@@ -2948,6 +2979,12 @@
<param name="menuName" type="String" maxlength="500" mandatory="true">
<description>The name of the sub menu/command.</description>
</param>
+ <param name="secondaryText" maxlength="500" type="String" mandatory="false">
+ <description>Optional secondary text to display</description>
+ </param>
+ <param name="tertiaryText" maxlength="500" type="String" mandatory="false">
+ <description>Optional tertiary text to display</description>
+ </param>
</struct>
<enum name="MenuLayout">
@@ -3184,11 +3221,20 @@
If empty, the auto-complete list will be removed from the screen.
</description>
</param>
+ <param name="maskInputCharacters" type="Common.KeyboardInputMask" mandatory="false">
+ <description>Allows an app to mask entered characters on HMI</description>
+ </param>
+ <param name="customKeys" type="String" maxlength="1" minsize="1" maxsize="10" array="true" mandatory="false">
+ <description>
+ Array of special characters to show in customizable keys.
+ If omitted, keyboard will show default special characters
+ </description>
+ </param>
</struct>
<struct name="Turn">
<param name="navigationText" type="Common.TextFieldStruct" mandatory="false">
- <description>Uses navigationText from TextFieldStruct.</description>
+ <description>Describes the `Turn` using `TextFieldName` `turnText`</description>
</param>
<param name="turnIcon" type="Common.Image" mandatory="false">
</param>
@@ -3662,6 +3708,20 @@
<param name="preferredFPS" type="Integer" minvalue="0" maxvalue="2147483647" mandatory="false">
<description>The preferred frame rate per second of the head unit. The mobile application / app library may take other factors into account that constrain the frame rate lower than this value, but it should not perform streaming at a higher frame rate than this value.</description>
</param>
+ <param name="additionalVideoStreamingCapabilities" type="VideoStreamingCapability" array="true" minsize="1" maxsize="100" mandatory="false">
+ </param>
+ </struct>
+
+ <struct name="AppCapability">
+ <param name="appCapabilityType" type="AppCapabilityType" mandatory="true">
+ <description>
+ Used as a descriptor of what data to expect in this struct.
+ The corresponding param to this enum should be included and the only other param included.
+ </description>
+ </param>
+ <param name="videoStreamingCapability" type="VideoStreamingCapability" mandatory="false">
+ <description>Describes supported capabilities for video streaming </description>
+ </param>
</struct>
<struct name="DynamicUpdateCapabilities">
@@ -3679,6 +3739,25 @@
<param name="maximumNumberOfWindows" type="Integer" mandatory="true" />
</struct>
+ <struct name="KeyboardLayoutCapability">
+ <description>
+ Describes the capabilities of a single keyboard layout.
+ </description>
+ <param name="keyboardLayout" type="KeyboardLayout" mandatory="true"/>
+ <param name="numConfigurableKeys" type="Integer" minvalue="0" maxvalue="10" mandatory="true">
+ <description>Number of keys available for special characters, App can customize as per their needs.</description>
+ </param>
+ </struct>
+
+ <struct name="KeyboardCapabilities">
+ <param name="maskInputCharactersSupported" type="Boolean" mandatory="false">
+ <description>Availability of capability to mask input characters using keyboard. True: Available, False: Not Available</description>
+ </param>
+ <param name="supportedKeyboards" type="KeyboardLayoutCapability" minsize="1" maxsize="1000" array="true" mandatory="false">
+ <description>Capabilities of supported keyboard layouts by HMI.</description>
+ </param>
+ </struct>
+
<struct name="WindowCapability">
<param name="windowID" type="Integer" mandatory="false">
<description>
@@ -3713,6 +3792,9 @@
<param name="dynamicUpdateCapabilities" type="DynamicUpdateCapabilities" mandatory="false">
<description>Contains the head unit's capabilities for dynamic updating features declaring if the module will send dynamic update RPCs.</description>
</param>
+ <param name="keyboardCapabilities" type="KeyboardCapabilities" mandatory="false">
+ <description>See KeyboardCapabilities</description>
+ </param>
</struct>
<struct name="DisplayCapability">
@@ -3756,7 +3838,7 @@
</param>
<param name="driverDistractionCapability" type="DriverDistractionCapability" mandatory="false">
<description>Describes capabilities when the driver is distracted</description>
- </param>
+ </param>
</struct>
<struct name="RemoteControlCapabilities">
@@ -4356,6 +4438,18 @@
</param>
</struct>
+ <struct name="ClimateData">
+ <param name="externalTemperature" type="Common.Temperature" mandatory="false">
+ <description>The external temperature in degrees celsius</description>
+ </param>
+ <param name="cabinTemperature" type="Common.Temperature" mandatory="false">
+ <description>Internal ambient cabin temperature in degrees celsius</description>
+ </param>
+ <param name="atmosphericPressure" type="Float" minvalue="0" maxvalue="2000" mandatory="false">
+ <description>Current atmospheric pressure in mBar</description>
+ </param>
+ </struct>
+
<struct name="GearStatus">
<param name="userSelectedGear" type="Common.PRNDL" mandatory="false">
<description>Gear position selected by the user i.e. Park, Drive, Reverse</description>
@@ -4472,27 +4566,27 @@
</function>
</interface>
-<interface name="BasicCommunication" version="2.1.0" date="2019-03-18">
-<function name="OnServiceUpdate" messagetype="notification">
- <description>
- Must be sent by SDL to HMI when there is an update on status of certain services.
- Services supported with current version: Video
- </description>
- <param name="serviceType" type="Common.ServiceType" mandatory="true">
- <description>Specifies the service which has been updated.</description>
- </param>
- <param name="serviceEvent" type="Common.ServiceEvent" mandatory="false">
- <description>Specifies service update event.</description>
- </param>
- <param name="reason" type="Common.ServiceStatusUpdateReason" mandatory="false">
- <description>
- The reason for a service event. Certain events may not have a reason, such as when a service is ACCEPTED (which is the normal expected behavior).
- </description>
- </param>
- <param name="appID" type="Integer" mandatory="false">
- <description>ID of the application which triggered the update.</description>
- </param>
-</function>
+<interface name="BasicCommunication" version="2.2.0" date="2021-04-14">
+ <function name="OnServiceUpdate" messagetype="notification">
+ <description>
+ Must be sent by SDL to HMI when there is an update on status of certain services.
+ Services supported with current version: Video
+ </description>
+ <param name="serviceType" type="Common.ServiceType" mandatory="true">
+ <description>Specifies the service which has been updated.</description>
+ </param>
+ <param name="serviceEvent" type="Common.ServiceEvent" mandatory="false">
+ <description>Specifies service update event.</description>
+ </param>
+ <param name="reason" type="Common.ServiceStatusUpdateReason" mandatory="false">
+ <description>
+ The reason for a service event. Certain events may not have a reason, such as when a service is ACCEPTED (which is the normal expected behavior).
+ </description>
+ </param>
+ <param name="appID" type="Integer" mandatory="false">
+ <description>ID of the application which triggered the update.</description>
+ </param>
+ </function>
<function name="GetSystemTime" messagetype="request">
<description>Request from SDL to HMI to obtain current UTC time.</description>
</function>
@@ -4862,6 +4956,9 @@
<param name="wersCountryCode" type="String" maxlength="500" mandatory="true">
<description>Country code from the Ford system WERS (i.e.WAEGB).</description>
</param>
+ <param name="systemHardwareVersion" type="String" maxlength="500" mandatory="false">
+ <description>The hardware version of the system</description>
+ </param>
</function>
<function name="OnSystemInfoChanged" messagetype="notification">
<description>Issued by system to SDL to notify that some system param has changed. Currently applied for Sync Language.</description>
@@ -4943,9 +5040,18 @@
<description>The new application properties</description>
</param>
</function>
+
+ <function name="OnAppCapabilityUpdated" messagetype="notification">
+ <description>A notification to inform HMI that a specific app capability has changed.</description>
+ <param name="appCapability" type="Common.AppCapability" mandatory="true">
+ <description>The app capability that has been updated</description>
+ </param>
+ <param name="appID" type="Integer" mandatory="true">
+ </param>
+ </function>
</interface>
-<interface name="VR" version="1.1.0" date="2017-04-27">
+<interface name="VR" version="1.2.0" date="2021-04-14">
<function name="IsReady" messagetype="request">
<description>Method is invoked at system startup. Response provides information about presence of VR module and its readiness to cooperate with SDL.</description>
</function>
@@ -5225,7 +5331,7 @@
</function>
</interface>
-<interface name="UI" version="1.4.0" date="2019-07-24">
+<interface name="UI" version="1.5.0" date="2021-04-14">
<function name="Alert" messagetype="request">
<description>Request from SDL to show an alert message on the display.</description>
<param name="alertStrings" type="Common.TextFieldStruct" mandatory="true" array="true" minsize="0" maxsize="3">
@@ -5482,6 +5588,9 @@
<description>Image to be displayed for representing the command. See Image.</description>
<description>If omitted, no (or the default if applicable) icon should be displayed.</description>
</param>
+ <param name="secondaryImage" type="Common.Image" mandatory="false">
+ <description>Optional secondary image struct for menu cell</description>
+ </param>
<param name="appID" type="Integer" mandatory="true">
<description>ID of application that concerns this RPC.</description>
</param>
@@ -5514,6 +5623,9 @@
<param name="menuIcon" type="Common.Image" mandatory="false">
<description>The image field for AddSubMenu</description>
</param>
+ <param name="secondaryImage" type="Common.Image" mandatory="false">
+ <description>Optional secondary image struct for menu cell</description>
+ </param>
<param name="appID" type="Integer" mandatory="true">
<description>ID of application that requested this RPC.</description>
</param>
@@ -5976,7 +6088,7 @@
</interface>
-<interface name="Navigation" version="1.5.0" date="2017-08-15">
+<interface name="Navigation" version="1.6.0" date="2021-04-14">
<function name="IsReady" messagetype="request">
<description>Method is invoked at system startup. Response must provide the information about presence of UI Navigation module and its readiness to cooperate with SDL.</description>
@@ -6200,7 +6312,7 @@
</interface>
-<interface name="VehicleInfo" version="2.1.0" date="2019-03-18">
+<interface name="VehicleInfo" version="2.2.0" date="2021-04-14">
<function name="IsReady" messagetype="request">
<description>Method is invoked at system startup. Response should provide information about presence of any of vehicle information modules (ECU, GPS, etc) and their readiness to cooperate with SDL.</description>
</function>
@@ -6314,6 +6426,9 @@
<param name="externalTemperature" type="Boolean" mandatory="false">
<description>The external temperature in degrees celsius</description>
</param>
+ <param name="climateData" type="Boolean" mandatory="false">
+ <description>See ClimateData</description>
+ </param>
<param name="turnSignal" type="Boolean" mandatory="false">
<description>See TurnSignal</description>
</param>
@@ -6425,6 +6540,9 @@
<param name="externalTemperature" type="Common.VehicleDataResult" mandatory="false">
<description>The external temperature in degrees celsius.</description>
</param>
+ <param name="climateData" type="Common.VehicleDataResult" mandatory="false">
+ <description>See ClimateData</description>
+ </param>
<param name="turnSignal" type="Common.VehicleDataResult" mandatory="false">
<description>See TurnSignal</description>
</param>
@@ -6539,6 +6657,9 @@
<param name="externalTemperature" type="Boolean" mandatory="false">
<description>The external temperature in degrees celsius.</description>
</param>
+ <param name="climateData" type="Boolean" mandatory="false">
+ <description>See ClimateData</description>
+ </param>
<param name="turnSignal" type="Boolean" mandatory="false">
<description>See TurnSignal</description>
</param>
@@ -6650,6 +6771,9 @@
<param name="externalTemperature" type="Common.VehicleDataResult" mandatory="false">
<description>The external temperature in degrees celsius</description>
</param>
+ <param name="climateData" type="Common.VehicleDataResult" mandatory="false">
+ <description>See ClimateData</description>
+ </param>
<param name="turnSignal" type="Common.VehicleDataResult" mandatory="false">
<description>See TurnSignal</description>
</param>
@@ -6762,6 +6886,9 @@
<param name="externalTemperature" type="Boolean" mandatory="false">
<description>The external temperature in degrees celsius</description>
</param>
+ <param name="climateData" type="Boolean" mandatory="false">
+ <description>See ClimateData</description>
+ </param>
<param name="turnSignal" type="Boolean" mandatory="false">
<description>See TurnSignal</description>
</param>
@@ -6876,6 +7003,9 @@
<param name="externalTemperature" type="Float" minvalue="-40" maxvalue="100" mandatory="false">
<description>The external temperature in degrees celsius</description>
</param>
+ <param name="climateData" type="Common.ClimateData" mandatory="false">
+ <description>See ClimateData</description>
+ </param>
<param name="turnSignal" type="Common.TurnSignal" mandatory="false">
<description>See TurnSignal</description>
</param>
@@ -6991,6 +7121,9 @@
<param name="externalTemperature" type="Float" minvalue="-40" maxvalue="100" mandatory="false">
<description>The external temperature in degrees celsius</description>
</param>
+ <param name="climateData" type="Common.ClimateData" mandatory="false">
+ <description>See ClimateData</description>
+ </param>
<param name="turnSignal" type="Common.TurnSignal" mandatory="false">
<description>See TurnSignal</description>
</param>
@@ -7080,7 +7213,7 @@
</interface>
<!-- Policies -->
-<interface name="SDL" version="1.2.0" date="2018-09-05">
+<interface name="SDL" version="1.3.0" date="2021-04-14">
<function name="ActivateApp" messagetype="request">
<param name="appID" type="Integer" mandatory="true">
</param>
@@ -7261,7 +7394,7 @@
</function>
</interface>
-<interface name="RC" version="2.0.0" date="2018-09-05">
+<interface name="RC" version="2.1.0" date="2021-04-14">
<function name="IsReady" messagetype="request">
<description>Method is invoked at system startup. Response should provide information about presence of any of remote controllable module and its readiness to cooperate with SDL.</description>
</function>
@@ -7384,7 +7517,7 @@
</interface>
-<interface name="AppService" version="1.0.0" date="2019-03-18">
+<interface name="AppService" version="1.1.0" date="2021-04-14">
<description>Interface used for interacting with app services as a producer or consumer</description>
<function name="PublishAppService" messagetype="request">
<description>
diff --git a/src/components/media_manager/include/media_manager/media_manager_impl.h b/src/components/media_manager/include/media_manager/media_manager_impl.h
index 8d60cd0e54..3e24212ed5 100644
--- a/src/components/media_manager/include/media_manager/media_manager_impl.h
+++ b/src/components/media_manager/include/media_manager/media_manager_impl.h
@@ -33,6 +33,7 @@
#ifndef SRC_COMPONENTS_MEDIA_MANAGER_INCLUDE_MEDIA_MANAGER_MEDIA_MANAGER_IMPL_H_
#define SRC_COMPONENTS_MEDIA_MANAGER_INCLUDE_MEDIA_MANAGER_MEDIA_MANAGER_IMPL_H_
+#include <chrono>
#include <map>
#include <string>
#include "interfaces/MOBILE_API.h"
@@ -79,6 +80,7 @@ class MediaManagerImpl : public MediaManager,
protocol_handler::ServiceType service_type);
virtual void StopStreaming(int32_t application_key,
protocol_handler::ServiceType service_type);
+
virtual void SetProtocolHandler(
protocol_handler::ProtocolHandler* protocol_handler);
virtual void OnMessageReceived(
@@ -89,6 +91,8 @@ class MediaManagerImpl : public MediaManager,
virtual const MediaManagerSettings& settings() const OVERRIDE;
+ virtual uint32_t DataSizeToMilliseconds(uint64_t data_size) const OVERRIDE;
+
#ifdef BUILD_TESTS
void set_mock_a2dp_player(MediaAdapter* media_adapter);
void set_mock_mic_listener(MediaListenerPtr media_listener);
@@ -114,6 +118,12 @@ class MediaManagerImpl : public MediaManager,
std::map<protocol_handler::ServiceType, MediaAdapterImplPtr> streamer_;
std::map<protocol_handler::ServiceType, MediaListenerPtr> streamer_listener_;
+ uint32_t bits_per_sample_;
+ uint32_t sampling_rate_;
+ uint64_t stream_data_size_;
+ std::chrono::time_point<std::chrono::system_clock>
+ socket_audio_stream_start_time_;
+
application_manager::ApplicationManager& application_manager_;
private:
diff --git a/src/components/media_manager/src/file_streamer_adapter.cc b/src/components/media_manager/src/file_streamer_adapter.cc
index 301b093829..f17d1f89ed 100644
--- a/src/components/media_manager/src/file_streamer_adapter.cc
+++ b/src/components/media_manager/src/file_streamer_adapter.cc
@@ -95,7 +95,7 @@ bool FileStreamerAdapter::FileStreamer::Send(
return false;
}
- SDL_LOG_INFO("Streamer::sent " << msg->data_size());
+ SDL_LOG_TRACE("Streamer::sent " << msg->data_size());
return true;
}
diff --git a/src/components/media_manager/src/media_manager_impl.cc b/src/components/media_manager/src/media_manager_impl.cc
index 6f0a67b0c9..4fc8b38d87 100644
--- a/src/components/media_manager/src/media_manager_impl.cc
+++ b/src/components/media_manager/src/media_manager_impl.cc
@@ -35,6 +35,8 @@
#include "application_manager/application_impl.h"
#include "application_manager/application_manager.h"
#include "application_manager/message_helper.h"
+#include "application_manager/smart_object_keys.h"
+#include "interfaces/MOBILE_API.h"
#include "media_manager/audio/from_mic_recorder_listener.h"
#include "media_manager/streamer_listener.h"
#include "protocol_handler/protocol_handler.h"
@@ -64,6 +66,9 @@ MediaManagerImpl::MediaManagerImpl(
, protocol_handler_(NULL)
, a2dp_player_(NULL)
, from_mic_recorder_(NULL)
+ , bits_per_sample_(16)
+ , sampling_rate_(16000)
+ , stream_data_size_(0ull)
, application_manager_(application_manager) {
Init();
}
@@ -160,6 +165,23 @@ void MediaManagerImpl::Init() {
streamer_[ServiceType::kAudio]->AddListener(
streamer_listener_[ServiceType::kAudio]);
}
+
+ if (application_manager_.hmi_capabilities().pcm_stream_capabilities()) {
+ const auto pcm_caps =
+ application_manager_.hmi_capabilities().pcm_stream_capabilities();
+
+ if (pcm_caps->keyExists(application_manager::strings::bits_per_sample)) {
+ bits_per_sample_ =
+ pcm_caps->getElement(application_manager::strings::bits_per_sample)
+ .asUInt();
+ }
+
+ if (pcm_caps->keyExists(application_manager::strings::sampling_rate)) {
+ sampling_rate_ =
+ pcm_caps->getElement(application_manager::strings::sampling_rate)
+ .asUInt();
+ }
+ }
}
void MediaManagerImpl::PlayA2DPSource(int32_t application_key) {
@@ -276,6 +298,8 @@ void MediaManagerImpl::StopStreaming(
int32_t application_key, protocol_handler::ServiceType service_type) {
SDL_LOG_AUTO_TRACE();
+ stream_data_size_ = 0ull;
+
if (streamer_[service_type]) {
streamer_[service_type]->StopActivity(application_key);
}
@@ -313,7 +337,24 @@ void MediaManagerImpl::OnMessageReceived(
ApplicationSharedPtr app = application_manager_.application(streaming_app_id);
if (app) {
- app->WakeUpStreaming(service_type);
+ if (ServiceType::kAudio == service_type) {
+ if (stream_data_size_ == 0) {
+ socket_audio_stream_start_time_ = std::chrono::system_clock::now();
+ }
+
+ stream_data_size_ += message->data_size();
+ uint32_t ms_for_all_data = DataSizeToMilliseconds(stream_data_size_);
+ uint32_t ms_since_stream_start =
+ std::chrono::duration_cast<std::chrono::milliseconds>(
+ std::chrono::system_clock::now() -
+ socket_audio_stream_start_time_)
+ .count();
+ uint32_t ms_stream_remaining = ms_for_all_data - ms_since_stream_start;
+
+ app->WakeUpStreaming(service_type, ms_stream_remaining);
+ } else {
+ app->WakeUpStreaming(service_type);
+ }
streamer_[service_type]->SendData(streaming_app_id, message);
}
}
@@ -326,36 +367,16 @@ void MediaManagerImpl::FramesProcessed(int32_t application_key,
if (protocol_handler_) {
protocol_handler_->SendFramesNumber(application_key, frame_number);
}
-
- application_manager::ApplicationSharedPtr app =
- application_manager_.application(application_key);
-
- if (app) {
- auto audio_stream = std::dynamic_pointer_cast<StreamerAdapter>(
- streamer_[protocol_handler::ServiceType::kAudio]);
- auto video_stream = std::dynamic_pointer_cast<StreamerAdapter>(
- streamer_[protocol_handler::ServiceType::kMobileNav]);
-
- if (audio_stream.use_count() != 0) {
- size_t audio_queue_size = audio_stream->GetMsgQueueSize();
- SDL_LOG_DEBUG("# Messages in audio queue = " << audio_queue_size);
- if (audio_queue_size > 0) {
- app->WakeUpStreaming(protocol_handler::ServiceType::kAudio);
- }
- }
-
- if (video_stream.use_count() != 0) {
- size_t video_queue_size = video_stream->GetMsgQueueSize();
- SDL_LOG_DEBUG("# Messages in video queue = " << video_queue_size);
- if (video_queue_size > 0) {
- app->WakeUpStreaming(protocol_handler::ServiceType::kMobileNav);
- }
- }
- }
}
const MediaManagerSettings& MediaManagerImpl::settings() const {
return settings_;
}
+uint32_t MediaManagerImpl::DataSizeToMilliseconds(uint64_t data_size) const {
+ constexpr uint16_t latency_compensation = 500;
+ return 1000 * data_size / (sampling_rate_ * bits_per_sample_ / 8) +
+ latency_compensation;
+}
+
} // namespace media_manager
diff --git a/src/components/media_manager/src/pipe_streamer_adapter.cc b/src/components/media_manager/src/pipe_streamer_adapter.cc
index 5e4c87c73d..b4e66be483 100644
--- a/src/components/media_manager/src/pipe_streamer_adapter.cc
+++ b/src/components/media_manager/src/pipe_streamer_adapter.cc
@@ -144,7 +144,7 @@ bool PipeStreamerAdapter::PipeStreamer::Send(
// Loop to send remaining data if there is any.
} while (data_remaining);
- SDL_LOG_INFO("Streamer::sent " << msg->data_size());
+ SDL_LOG_TRACE("Streamer::sent " << msg->data_size());
return true;
}
diff --git a/src/components/media_manager/src/socket_streamer_adapter.cc b/src/components/media_manager/src/socket_streamer_adapter.cc
index 2f10a29c7d..134ccb8038 100644
--- a/src/components/media_manager/src/socket_streamer_adapter.cc
+++ b/src/components/media_manager/src/socket_streamer_adapter.cc
@@ -149,7 +149,7 @@ bool SocketStreamerAdapter::SocketStreamer::Send(
SDL_LOG_WARN("Couldn't send all the data to socket " << send_socket_fd_);
}
- SDL_LOG_INFO("Streamer::sent " << msg->data_size());
+ SDL_LOG_TRACE("Streamer::sent " << msg->data_size());
return true;
}
diff --git a/src/components/media_manager/src/streamer_adapter.cc b/src/components/media_manager/src/streamer_adapter.cc
index 8dedd56ea5..ad61ac1f63 100644
--- a/src/components/media_manager/src/streamer_adapter.cc
+++ b/src/components/media_manager/src/streamer_adapter.cc
@@ -59,6 +59,7 @@ void StreamerAdapter::StartActivity(int32_t application_key) {
<< " has been already started");
return;
}
+ messages_.Reset();
DCHECK(thread_);
const size_t kStackSize = 16384;
@@ -86,7 +87,6 @@ void StreamerAdapter::StopActivity(int32_t application_key) {
DCHECK(streamer_);
streamer_->exitThreadMain();
- messages_.Reset();
for (std::set<MediaListenerPtr>::iterator it = media_listeners_.begin();
media_listeners_.end() != it;
@@ -150,7 +150,7 @@ void StreamerAdapter::Streamer::threadMain() {
static int32_t messages_for_session = 0;
++messages_for_session;
- SDL_LOG_DEBUG("Handling map streaming message. This is "
+ SDL_LOG_TRACE("Handling map streaming message. This is "
<< messages_for_session << " message for "
<< adapter_->current_application_);
std::set<MediaListenerPtr>::iterator it =
diff --git a/src/components/media_manager/test/media_manager_impl_test.cc b/src/components/media_manager/test/media_manager_impl_test.cc
index a64faabe91..ab0a9cf494 100644
--- a/src/components/media_manager/test/media_manager_impl_test.cc
+++ b/src/components/media_manager/test/media_manager_impl_test.cc
@@ -35,6 +35,7 @@
#include "application_manager/message.h"
#include "application_manager/mock_application.h"
#include "application_manager/mock_application_manager.h"
+#include "application_manager/mock_hmi_capabilities.h"
#include "application_manager/resumption/resume_ctrl.h"
#include "application_manager/state_controller.h"
#include "gmock/gmock.h"
@@ -109,6 +110,10 @@ class MediaManagerImplTest : public ::testing::Test {
.WillByDefault(ReturnRef(kDefaultValue));
ON_CALL(mock_media_manager_settings_, audio_server_type())
.WillByDefault(ReturnRef(kDefaultValue));
+ ON_CALL(mock_hmi_capabilities_, pcm_stream_capabilities())
+ .WillByDefault(Return(nullptr));
+ ON_CALL(app_mngr_, hmi_capabilities())
+ .WillByDefault(ReturnRef(mock_hmi_capabilities_));
mock_app_ = std::make_shared<MockApp>();
media_manager_impl_.reset(
new MediaManagerImpl(app_mngr_, mock_media_manager_settings_));
@@ -176,7 +181,7 @@ class MediaManagerImplTest : public ::testing::Test {
.WillOnce(Return(true));
EXPECT_CALL(app_mngr_, application(kConnectionKey))
.WillOnce(Return(mock_app_));
- EXPECT_CALL(*mock_app_, WakeUpStreaming(service_type));
+ EXPECT_CALL(*mock_app_, WakeUpStreaming(service_type, _));
MockMediaAdapterImplPtr mock_media_streamer =
std::make_shared<MockMediaAdapterImpl>();
media_manager_impl_->set_mock_streamer(service_type, mock_media_streamer);
@@ -206,6 +211,7 @@ class MediaManagerImplTest : public ::testing::Test {
const ::testing::NiceMock<MockMediaManagerSettings>
mock_media_manager_settings_;
std::shared_ptr<MediaManagerImpl> media_manager_impl_;
+ application_manager_test::MockHMICapabilities mock_hmi_capabilities_;
};
TEST_F(MediaManagerImplTest,
@@ -410,17 +416,11 @@ TEST_F(MediaManagerImplTest,
TEST_F(MediaManagerImplTest,
CheckFramesProcessed_WithCorrectFramesNumber_SUCCESS) {
- ON_CALL(mock_media_manager_settings_, video_server_type())
- .WillByDefault(ReturnRef(kDefaultValue));
- ON_CALL(mock_media_manager_settings_, audio_server_type())
- .WillByDefault(ReturnRef(kDefaultValue));
protocol_handler_test::MockProtocolHandler mock_protocol_handler;
media_manager_impl_->SetProtocolHandler(&mock_protocol_handler);
const int32_t frame_number = 10;
EXPECT_CALL(mock_protocol_handler,
SendFramesNumber(kApplicationKey, frame_number));
- EXPECT_CALL(app_mngr_, application(kConnectionKey))
- .WillOnce(Return(mock_app_));
media_manager_impl_->FramesProcessed(kApplicationKey, frame_number);
}
diff --git a/src/components/policy/policy_external/include/policy/cache_manager.h b/src/components/policy/policy_external/include/policy/cache_manager.h
index 12fe8f10cd..8384f56f77 100644
--- a/src/components/policy/policy_external/include/policy/cache_manager.h
+++ b/src/components/policy/policy_external/include/policy/cache_manager.h
@@ -597,13 +597,11 @@ class CacheManager : public CacheManagerInterface {
*/
void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE;
- /**
- * @brief Records information about head unit system to PT
- * @return bool Success of operation
- */
bool SetMetaInfo(const std::string& ccpu_version,
const std::string& wers_country_code,
- const std::string& language);
+ const std::string& language) OVERRIDE;
+
+ void SetHardwareVersion(const std::string& hardware_version) OVERRIDE;
/**
* @brief Get information about last ccpu_version from PT
@@ -611,6 +609,8 @@ class CacheManager : public CacheManagerInterface {
*/
std::string GetCCPUVersionFromPT() const;
+ std::string GetHardwareVersionFromPT() const OVERRIDE;
+
/**
* @brief Checks, if specific head unit is present in PT
* @return boot Suceess, if present, otherwise - false
diff --git a/src/components/policy/policy_external/include/policy/cache_manager_interface.h b/src/components/policy/policy_external/include/policy/cache_manager_interface.h
index 8ed46e0c72..f33dabd025 100644
--- a/src/components/policy/policy_external/include/policy/cache_manager_interface.h
+++ b/src/components/policy/policy_external/include/policy/cache_manager_interface.h
@@ -645,7 +645,7 @@ class CacheManagerInterface {
virtual void SetPreloadedPtFlag(const bool is_preloaded) = 0;
/**
- * @brief Records information about head unit system to PT
+ * @brief Records mandatory information about head unit system to PT
* @return bool Success of operation
*/
virtual bool SetMetaInfo(const std::string& ccpu_version,
@@ -653,12 +653,24 @@ class CacheManagerInterface {
const std::string& language) = 0;
/**
+ * @brief Records information about hardware version to PT
+ * @param hardware_version Hardware version
+ */
+ virtual void SetHardwareVersion(const std::string& hardware_version) = 0;
+
+ /**
* @brief Get information about last ccpu_version from PT
* @return ccpu_version from PT
*/
virtual std::string GetCCPUVersionFromPT() const = 0;
/**
+ * @brief Get information about last hardware version from PT
+ * @return hardware version from PT
+ */
+ virtual std::string GetHardwareVersionFromPT() const = 0;
+
+ /**
* @brief Checks, if specific head unit is present in PT
* @return boot Suceess, if present, otherwise - false
*/
diff --git a/src/components/policy/policy_external/include/policy/policy_manager_impl.h b/src/components/policy/policy_external/include/policy/policy_manager_impl.h
index 27ce30bb3d..813af17b3f 100644
--- a/src/components/policy/policy_external/include/policy/policy_manager_impl.h
+++ b/src/components/policy/policy_external/include/policy/policy_manager_impl.h
@@ -435,10 +435,14 @@ class PolicyManagerImpl : public PolicyManager {
const std::string& wers_country_code,
const std::string& language) OVERRIDE;
+ void SetHardwareVersion(const std::string& hardware_version) OVERRIDE;
+
void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE;
std::string GetCCPUVersionFromPT() const OVERRIDE;
+ std::string GetHardwareVersionFromPT() const OVERRIDE;
+
/**
* @brief Get number of notification by priority
* @param priority Specified priority
@@ -1053,6 +1057,11 @@ class PolicyManagerImpl : public PolicyManager {
void StartPTExchange() OVERRIDE;
/**
+ * @brief Trigger a PTU once on startup if it is required
+ */
+ void TriggerPTUOnStartupIfRequired() OVERRIDE;
+
+ /**
* @brief Checks is PT exceeded days
* @return true if exceeded
*/
diff --git a/src/components/policy/policy_external/include/policy/policy_table/types.h b/src/components/policy/policy_external/include/policy/policy_table/types.h
index 6b2f05d336..25439f835b 100644
--- a/src/components/policy/policy_external/include/policy/policy_table/types.h
+++ b/src/components/policy/policy_external/include/policy/policy_table/types.h
@@ -490,6 +490,7 @@ struct ModuleMeta : CompositeType {
Optional<String<0, 500> > ccpu_version;
Optional<String<0, 250> > language;
Optional<String<0, 250> > wers_country_code;
+ Optional<String<0, 500> > hardware_version;
Optional<Integer<uint32_t, 0, ODO_MAX> > pt_exchanged_at_odometer_x;
Optional<Integer<uint16_t, 0, 65535> > pt_exchanged_x_days_after_epoch;
Optional<Integer<uint16_t, 0, 65535> > ignition_cycles_since_last_exchange;
diff --git a/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml b/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml
index a5aa36f371..a3b91abbc5 100644
--- a/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml
+++ b/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml
@@ -25,6 +25,7 @@
<element name="gps" />
<element name="speed" />
<element name="engineTorque" />
+ <element name="climateData" />
<element name="externalTemperature" />
<element name="turnSignal" />
<element name="fuelLevel" />
@@ -222,6 +223,7 @@
<param name="ccpu_version" type="String" maxlength="250" mandatory="false"/>
<param name="language" type="String" maxlength="250" mandatory="false"/>
<param name="wers_country_code" type="String" maxlength="250" mandatory="false"/>
+ <param name="hardware_version" type="String" maxlength="500" mandatory="false"/>
<param name="pt_exchanged_at_odometer_x" type="Integer" minvalue="0" maxvalue="65535" mandatory="false"/>
<param name="pt_exchanged_x_days_after_epoch" type="Integer" minvalue="0" maxvalue="65535" mandatory="false"/>
<param name="ignition_cycles_since_last_exchange" type="Integer" minvalue="0" maxvalue="65535" mandatory="false"/>
diff --git a/src/components/policy/policy_external/include/policy/policy_types.h b/src/components/policy/policy_external/include/policy/policy_types.h
index 7e8abd5989..ff3a89d084 100644
--- a/src/components/policy/policy_external/include/policy/policy_types.h
+++ b/src/components/policy/policy_external/include/policy/policy_types.h
@@ -278,6 +278,7 @@ struct AppPermissions {
, appRevoked(false)
, appPermissionsConsentNeeded(false)
, appUnauthorized(false)
+ , isSDLAllowed(false)
, requestTypeChanged(false)
, requestSubTypeChanged(false) {}
diff --git a/src/components/policy/policy_external/include/policy/pt_ext_representation.h b/src/components/policy/policy_external/include/policy/pt_ext_representation.h
index f03947268a..867033bc20 100644
--- a/src/components/policy/policy_external/include/policy/pt_ext_representation.h
+++ b/src/components/policy/policy_external/include/policy/pt_ext_representation.h
@@ -198,7 +198,7 @@ class PTExtRepresentation : public virtual PTRepresentation {
const std::string& language) = 0;
/**
- * @brief Records information about head unit system to PT
+ * @brief Records mandatory information about head unit system to PT
* @return bool Success of operation
*/
virtual bool SetMetaInfo(const std::string& ccpu_version,
@@ -206,6 +206,12 @@ class PTExtRepresentation : public virtual PTRepresentation {
const std::string& language) = 0;
/**
+ * @brief Records information about hardware version to PT
+ * @param hardware_version Hardware version
+ */
+ virtual void SetHardwareVersion(const std::string& hardware_version) = 0;
+
+ /**
* @brief Checks, if specific head unit is present in PT
* @return boot Suceess, if present, otherwise - false
*/
diff --git a/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h b/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h
index b8f85ec7b1..abb18d51e4 100644
--- a/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h
+++ b/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h
@@ -65,6 +65,7 @@ extern const std::string kInsertExternalConsentStatusGroups;
extern const std::string kCountUnconsentedGroups;
extern const std::string kSelectModuleMeta;
extern const std::string kUpdateMetaParams;
+extern const std::string kUpdateMetaHardwareVersion;
extern const std::string kUpdateModuleMetaVinParam;
extern const std::string kSaveModuleMeta;
extern const std::string kSelectMetaParams;
diff --git a/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h b/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h
index 889ede9d20..de2d0c1536 100644
--- a/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h
+++ b/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h
@@ -94,7 +94,9 @@ class SQLPTExtRepresentation : public SQLPTRepresentation,
bool SetMetaInfo(const std::string& ccpu_version,
const std::string& wers_country_code,
- const std::string& language);
+ const std::string& language) OVERRIDE;
+
+ void SetHardwareVersion(const std::string& hardware_version) OVERRIDE;
bool IsMetaInfoPresent();
diff --git a/src/components/policy/policy_external/src/cache_manager.cc b/src/components/policy/policy_external/src/cache_manager.cc
index 783a622b2e..07f2df1991 100644
--- a/src/components/policy/policy_external/src/cache_manager.cc
+++ b/src/components/policy/policy_external/src/cache_manager.cc
@@ -2047,7 +2047,8 @@ void CacheManager::PersistData() {
*(*copy_pt.policy_table.module_meta).wers_country_code,
*(*copy_pt.policy_table.module_meta).language);
ex_backup_->SetVINValue(*(*copy_pt.policy_table.module_meta).vin);
-
+ ex_backup_->SetHardwareVersion(
+ *(*copy_pt.policy_table.module_meta).hardware_version);
// Save unpaired flag for devices
policy_table::DeviceData::const_iterator it_device =
copy_pt.policy_table.device_data->begin();
@@ -2300,13 +2301,35 @@ bool CacheManager::SetMetaInfo(const std::string& ccpu_version,
return true;
}
+void CacheManager::SetHardwareVersion(const std::string& hardware_version) {
+ SDL_LOG_AUTO_TRACE();
+ CACHE_MANAGER_CHECK_VOID();
+ sync_primitives::AutoLock auto_lock(cache_lock_);
+
+ *pt_->policy_table.module_meta->hardware_version = hardware_version;
+ Backup();
+}
+
std::string CacheManager::GetCCPUVersionFromPT() const {
SDL_LOG_AUTO_TRACE();
+ CACHE_MANAGER_CHECK(std::string(""));
+ sync_primitives::AutoLock auto_lock(cache_lock_);
+
rpc::Optional<policy_table::ModuleMeta>& module_meta =
pt_->policy_table.module_meta;
return *(module_meta->ccpu_version);
}
+std::string CacheManager::GetHardwareVersionFromPT() const {
+ SDL_LOG_AUTO_TRACE();
+ CACHE_MANAGER_CHECK(std::string(""));
+ sync_primitives::AutoLock auto_lock(cache_lock_);
+
+ rpc::Optional<policy_table::ModuleMeta>& module_meta =
+ pt_->policy_table.module_meta;
+ return *(module_meta->hardware_version);
+}
+
bool CacheManager::IsMetaInfoPresent() const {
CACHE_MANAGER_CHECK(false);
sync_primitives::AutoLock lock(cache_lock_);
diff --git a/src/components/policy/policy_external/src/policy_manager_impl.cc b/src/components/policy/policy_external/src/policy_manager_impl.cc
index 9bcea70803..d6aa007ac1 100644
--- a/src/components/policy/policy_external/src/policy_manager_impl.cc
+++ b/src/components/policy/policy_external/src/policy_manager_impl.cc
@@ -762,6 +762,13 @@ void PolicyManagerImpl::StartPTExchange() {
}
}
+void PolicyManagerImpl::TriggerPTUOnStartupIfRequired() {
+ SDL_LOG_AUTO_TRACE();
+ if (ignition_check) {
+ StartPTExchange();
+ }
+}
+
void PolicyManagerImpl::OnAppsSearchStarted() {
SDL_LOG_AUTO_TRACE();
update_status_manager_.OnAppsSearchStarted();
@@ -1617,11 +1624,22 @@ void PolicyManagerImpl::SetSystemInfo(const std::string& ccpu_version,
cache_->SetMetaInfo(ccpu_version, wers_country_code, language);
}
+void PolicyManagerImpl::SetHardwareVersion(
+ const std::string& hardware_version) {
+ SDL_LOG_AUTO_TRACE();
+ cache_->SetHardwareVersion(hardware_version);
+}
+
std::string PolicyManagerImpl::GetCCPUVersionFromPT() const {
SDL_LOG_AUTO_TRACE();
return cache_->GetCCPUVersionFromPT();
}
+std::string PolicyManagerImpl::GetHardwareVersionFromPT() const {
+ SDL_LOG_AUTO_TRACE();
+ return cache_->GetHardwareVersionFromPT();
+}
+
uint32_t PolicyManagerImpl::GetNotificationsNumber(const std::string& priority,
const bool is_subtle) const {
SDL_LOG_AUTO_TRACE();
diff --git a/src/components/policy/policy_external/src/policy_table/types.cc b/src/components/policy/policy_external/src/policy_table/types.cc
index cb7f2bdd9d..47c4202de0 100644
--- a/src/components/policy/policy_external/src/policy_table/types.cc
+++ b/src/components/policy/policy_external/src/policy_table/types.cc
@@ -1424,6 +1424,7 @@ ModuleMeta::ModuleMeta(const Json::Value* value__)
, ccpu_version(impl::ValueMember(value__, "ccpu_version"))
, language(impl::ValueMember(value__, "language"))
, wers_country_code(impl::ValueMember(value__, "wers_country_code"))
+ , hardware_version(impl::ValueMember(value__, "hardware_version"))
, pt_exchanged_at_odometer_x(
impl::ValueMember(value__, "pt_exchanged_at_odometer_x"))
, pt_exchanged_x_days_after_epoch(
@@ -1437,6 +1438,7 @@ Json::Value ModuleMeta::ToJsonValue() const {
impl::WriteJsonField("ccpu_version", ccpu_version, &result__);
impl::WriteJsonField("language", language, &result__);
impl::WriteJsonField("wers_country_code", wers_country_code, &result__);
+ impl::WriteJsonField("hardware_version", hardware_version, &result__);
impl::WriteJsonField(
"pt_exchanged_at_odometer_x", pt_exchanged_at_odometer_x, &result__);
impl::WriteJsonField("pt_exchanged_x_days_after_epoch",
@@ -1462,6 +1464,11 @@ bool ModuleMeta::is_valid() const {
if (!wers_country_code.is_valid()) {
return false;
}
+
+ if (!hardware_version.is_valid()) {
+ return false;
+ }
+
if (!pt_exchanged_at_odometer_x.is_valid()) {
return false;
}
@@ -1492,6 +1499,11 @@ bool ModuleMeta::struct_empty() const {
if (wers_country_code.is_initialized()) {
return false;
}
+
+ if (hardware_version.is_initialized()) {
+ return false;
+ }
+
if (pt_exchanged_at_odometer_x.is_initialized()) {
return false;
}
@@ -1506,6 +1518,7 @@ bool ModuleMeta::struct_empty() const {
if (vin.is_initialized()) {
return false;
}
+
return true;
}
@@ -1523,6 +1536,10 @@ void ModuleMeta::ReportErrors(rpc::ValidationReport* report__) const {
wers_country_code.ReportErrors(
&report__->ReportSubobject("wers_country_code"));
}
+ if (!hardware_version.is_valid()) {
+ hardware_version.ReportErrors(
+ &report__->ReportSubobject("hardware_version"));
+ }
if (!pt_exchanged_at_odometer_x.is_valid()) {
pt_exchanged_at_odometer_x.ReportErrors(
&report__->ReportSubobject("pt_exchanged_at_odometer_x"));
@@ -1551,6 +1568,7 @@ void ModuleMeta::SetPolicyTableType(PolicyTableType pt_type) {
ccpu_version.SetPolicyTableType(pt_type);
language.SetPolicyTableType(pt_type);
wers_country_code.SetPolicyTableType(pt_type);
+ hardware_version.SetPolicyTableType(pt_type);
pt_exchanged_at_odometer_x.SetPolicyTableType(pt_type);
pt_exchanged_x_days_after_epoch.SetPolicyTableType(pt_type);
ignition_cycles_since_last_exchange.SetPolicyTableType(pt_type);
diff --git a/src/components/policy/policy_external/src/sql_pt_ext_queries.cc b/src/components/policy/policy_external/src/sql_pt_ext_queries.cc
index ea323908c0..26d2124d07 100644
--- a/src/components/policy/policy_external/src/sql_pt_ext_queries.cc
+++ b/src/components/policy/policy_external/src/sql_pt_ext_queries.cc
@@ -170,18 +170,27 @@ const std::string kCountUnconsentedGroups =
" WHERE (`a`.`functional_group_id` = `f`.`id`"
" AND`f`.`user_consent_prompt` IS NULL))";
-const std::string kSelectModuleMeta = "SELECT* FROM `module_meta`";
+const std::string kSelectModuleMeta =
+ "SELECT `ccpu_version`, `language`, "
+ "`wers_country_code`, `hardware_version`, `pt_exchanged_at_odometer_x`, "
+ "`pt_exchanged_x_days_after_epoch`, "
+ "`ignition_cycles_since_last_exchange`, `vin` "
+ "FROM `module_meta`";
const std::string kUpdateMetaParams =
"UPDATE `module_meta` SET "
- "`ccpu_version` = ?, `wers_country_code` = ?, `language` = ? ";
+ "`ccpu_version` = ?, `wers_country_code` = ?, `language` = ?";
+
+const std::string kUpdateMetaHardwareVersion =
+ "UPDATE `module_meta` SET `hardware_version` = ? ";
const std::string kUpdateModuleMetaVinParam =
"UPDATE `module_meta` SET `vin` = ? ";
const std::string kSaveModuleMeta =
"UPDATE `module_meta` SET `ccpu_version` = ?, `language` = ?,"
- "`wers_country_code` = ?, `pt_exchanged_at_odometer_x` = ?,"
+ "`wers_country_code` = ?, `hardware_version` = ?, "
+ "`pt_exchanged_at_odometer_x` = ?,"
"`pt_exchanged_x_days_after_epoch` = ?,"
"`ignition_cycles_since_last_exchange` = ?, `vin` = ?";
diff --git a/src/components/policy/policy_external/src/sql_pt_ext_representation.cc b/src/components/policy/policy_external/src/sql_pt_ext_representation.cc
index 7147e0949d..fc35551808 100644
--- a/src/components/policy/policy_external/src/sql_pt_ext_representation.cc
+++ b/src/components/policy/policy_external/src/sql_pt_ext_representation.cc
@@ -600,6 +600,22 @@ bool SQLPTExtRepresentation::SetMetaInfo(const std::string& ccpu_version,
return true;
}
+void SQLPTExtRepresentation::SetHardwareVersion(
+ const std::string& hardware_version) {
+ SDL_LOG_AUTO_TRACE();
+ utils::dbms::SQLQuery query(db());
+ if (!query.Prepare(sql_pt_ext::kUpdateMetaHardwareVersion)) {
+ SDL_LOG_WARN("Incorrect statement for insert to module meta.");
+ return;
+ }
+
+ query.Bind(0, hardware_version);
+
+ if (!query.Exec()) {
+ SDL_LOG_WARN("Incorrect insert to module meta.");
+ }
+}
+
bool SQLPTExtRepresentation::IsMetaInfoPresent() {
SDL_LOG_AUTO_TRACE();
utils::dbms::SQLQuery query(db());
@@ -1320,10 +1336,11 @@ void SQLPTExtRepresentation::GatherModuleMeta(
*meta->ccpu_version = query.GetString(0);
*meta->language = query.GetString(1);
*meta->wers_country_code = query.GetString(2);
- *meta->pt_exchanged_at_odometer_x = query.GetInteger(3);
- *meta->pt_exchanged_x_days_after_epoch = query.GetInteger(4);
- *meta->ignition_cycles_since_last_exchange = query.GetInteger(5);
- *meta->vin = query.GetString(6);
+ *meta->hardware_version = query.GetString(3);
+ *meta->pt_exchanged_at_odometer_x = query.GetInteger(4);
+ *meta->pt_exchanged_x_days_after_epoch = query.GetInteger(5);
+ *meta->ignition_cycles_since_last_exchange = query.GetInteger(6);
+ *meta->vin = query.GetString(7);
}
}
@@ -1652,10 +1669,11 @@ bool SQLPTExtRepresentation::SaveModuleMeta(
query.Bind(0, *(meta.ccpu_version));
query.Bind(1, *(meta.language));
query.Bind(2, *(meta.wers_country_code));
- query.Bind(3, odometer);
- query.Bind(4, *(meta.pt_exchanged_x_days_after_epoch));
- query.Bind(5, *(meta.ignition_cycles_since_last_exchange));
- query.Bind(6, *(meta.vin));
+ query.Bind(3, *(meta.hardware_version));
+ query.Bind(4, odometer);
+ query.Bind(5, *(meta.pt_exchanged_x_days_after_epoch));
+ query.Bind(6, *(meta.ignition_cycles_since_last_exchange));
+ query.Bind(7, *(meta.vin));
if (!query.Exec()) {
SDL_LOG_WARN("Incorrect update for module_meta.");
diff --git a/src/components/policy/policy_external/src/sql_pt_queries.cc b/src/components/policy/policy_external/src/sql_pt_queries.cc
index 9e69d2cef8..519e51dde5 100644
--- a/src/components/policy/policy_external/src/sql_pt_queries.cc
+++ b/src/components/policy/policy_external/src/sql_pt_queries.cc
@@ -59,6 +59,7 @@ const std::string kCreateSchema =
" `ccpu_version` VARCHAR(45), "
" `language` VARCHAR(45), "
" `wers_country_code` VARCHAR(45), "
+ " `hardware_version` VARCHAR(45), "
" `pt_exchanged_at_odometer_x` INTEGER NOT NULL DEFAULT 0, "
" `pt_exchanged_x_days_after_epoch` INTEGER NOT NULL DEFAULT 0, "
" `ignition_cycles_since_last_exchange` INTEGER NOT NULL DEFAULT 0, "
diff --git a/src/components/policy/policy_external/test/CMakeLists.txt b/src/components/policy/policy_external/test/CMakeLists.txt
index 8f1b8b2539..7a28b2d3c2 100644
--- a/src/components/policy/policy_external/test/CMakeLists.txt
+++ b/src/components/policy/policy_external/test/CMakeLists.txt
@@ -52,6 +52,8 @@ file (GLOB POLICY_TEST_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/policy_manager_impl_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_ext_representation_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_representation_test.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_representation_storage_test.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_ext_representation_storage_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/update_status_manager_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/shared_library_test.cc)
diff --git a/src/components/policy/policy_external/test/cache_manager_test.cc b/src/components/policy/policy_external/test/cache_manager_test.cc
index 746d0c7221..9819811803 100644
--- a/src/components/policy/policy_external/test/cache_manager_test.cc
+++ b/src/components/policy/policy_external/test/cache_manager_test.cc
@@ -2169,6 +2169,18 @@ TEST_F(CacheManagerTest, RemoveAppConsentForGroup_GroupIsRemoved) {
EXPECT_FALSE(unconsented_groups_after_removal.empty());
}
+TEST_F(CacheManagerTest, GetHardwareVersion_ValueWasSetBefore_ReturnValue) {
+ std::string hardware_version = "1.1.1.1";
+ cache_manager_->SetHardwareVersion(hardware_version);
+ EXPECT_EQ(hardware_version, cache_manager_->GetHardwareVersionFromPT());
+}
+
+TEST_F(CacheManagerTest,
+ GetHardwareVersion_ValueNotSettedBefore_ReturnEmptyString) {
+ std::string empty_string = "";
+ EXPECT_EQ(empty_string, cache_manager_->GetHardwareVersionFromPT());
+}
+
} // namespace policy_test
} // namespace components
} // namespace test
diff --git a/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h b/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h
index b307270b10..f43fedcfab 100644
--- a/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h
+++ b/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h
@@ -105,6 +105,7 @@ class MockPTExtRepresentation : public MockPTRepresentation,
bool(const std::string& ccpu_version,
const std::string& wers_country_code,
const std::string& vin));
+ MOCK_METHOD1(SetHardwareVersion, void(const std::string& hardware_version));
MOCK_METHOD0(IsMetaInfoPresent, bool());
MOCK_METHOD1(SetSystemLanguage, bool(const std::string& language));
MOCK_METHOD0(GetKmFromSuccessfulExchange, int());
diff --git a/src/components/policy/policy_external/test/sql_pt_ext_representation_storage_test.cc b/src/components/policy/policy_external/test/sql_pt_ext_representation_storage_test.cc
index 1ceb5ea1ef..09df17beb2 100644
--- a/src/components/policy/policy_external/test/sql_pt_ext_representation_storage_test.cc
+++ b/src/components/policy/policy_external/test/sql_pt_ext_representation_storage_test.cc
@@ -38,8 +38,6 @@
#include "policy/mock_policy_settings.h"
#include "sqlite_wrapper/sql_query.h"
#include "utils/file_system.h"
-#include "utils/make_shared.h"
-#include "utils/shared_ptr.h"
using namespace ::policy;
diff --git a/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc
index 97613550f2..58f526d7d3 100644
--- a/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc
+++ b/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc
@@ -38,12 +38,14 @@
#include <utility>
#include <vector>
#include "gtest/gtest.h"
+#include "json/reader.h"
#include "policy/mock_policy_settings.h"
#include "policy/policy_table/types.h"
#include "rpc_base/rpc_base.h"
#include "sqlite_wrapper/sql_query.h"
#include "utils/file_system.h"
#include "utils/gen_hash.h"
+#include "utils/jsoncpp_reader_wrapper.h"
using namespace ::policy;
namespace policy_table = rpc::policy_table_interface_base;
@@ -57,6 +59,44 @@ namespace test {
namespace components {
namespace policy_test {
+namespace {
+const std::string kSdlPreloadedPtJson = "json/sdl_preloaded_pt.json";
+const std::string kHardwareVersion = "1.1.1.0";
+const std::string kSoftwareVersion = "4.1.3.B_EB355B";
+const std::string kWersCountryCode = "WAEGB";
+const std::string kLanguage = "EN-US";
+const std::string kFunctionalGroupWithParams = "Location-1";
+const std::string kUserConsentForGroupWithParams = "Location";
+const std::string kRpcForGroupWithParams = "GetVehicleData";
+} // namespace
+
+policy_table::Table LoadPreloadedPT(const std::string& filename) {
+ std::ifstream ifile(filename);
+ EXPECT_TRUE(ifile.good());
+ Json::CharReaderBuilder reader_builder;
+ Json::Value root(Json::objectValue);
+ Json::parseFromStream(reader_builder, ifile, &root, nullptr);
+ root["policy_table"]["module_config"].removeMember("preloaded_pt");
+ ifile.close();
+ policy_table::Table table(&root);
+ return table;
+}
+
+Json::Value GetDefaultSnapshotModuleMeta(policy_table::Table& policy_table) {
+ auto json_table = policy_table.ToJsonValue();
+
+ Json::Value default_module_meta = json_table["policy_table"]["module_meta"];
+ default_module_meta["ccpu_version"] = Json::Value("");
+ default_module_meta["hardware_version"] = Json::Value("");
+ default_module_meta["language"] = Json::Value("");
+ default_module_meta["wers_country_code"] = Json::Value("");
+ default_module_meta["pt_exchanged_at_odometer_x"] = Json::Value(0);
+ default_module_meta["pt_exchanged_x_days_after_epoch"] = Json::Value(0);
+ default_module_meta["ignition_cycles_since_last_exchange"] = Json::Value(0);
+ default_module_meta["vin"] = Json::Value("");
+ return default_module_meta;
+}
+
class SQLPTExtRepresentationTest : public ::testing::Test {
public:
// Collection of pairs of group alias and corresponding group name
@@ -264,163 +304,147 @@ SQLPTExtRepresentationTest::GetDataInternal(
}
TEST_F(SQLPTExtRepresentationTest,
- DISABLED_GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) {
- // TODO(AKutsan): APPLINK-31526 Test requires initial preloaded pt for
- // preloaded date reading
- // Arrange
- Json::Value table(Json::objectValue);
- table["policy_table"] = Json::Value(Json::objectValue);
+ GenerateSnapshot_DefaultContentOfModuleMeta_MetaInfoPresentInSnapshot) {
+ policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson);
- Json::Value& policy_table = table["policy_table"];
- policy_table["module_config"] = Json::Value(Json::objectValue);
- policy_table["functional_groupings"] = Json::Value(Json::objectValue);
- policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue);
- policy_table["app_policies"] = Json::Value(Json::objectValue);
-
- Json::Value& module_config = policy_table["module_config"];
- module_config["preloaded_date"] = Json::Value("");
- module_config["exchange_after_x_ignition_cycles"] = Json::Value(10);
- module_config["exchange_after_x_kilometers"] = Json::Value(100);
- module_config["exchange_after_x_days"] = Json::Value(5);
- module_config["timeout_after_x_seconds"] = Json::Value(500);
- module_config["seconds_between_retries"] = Json::Value(Json::arrayValue);
- module_config["seconds_between_retries"][0] = Json::Value(10);
- module_config["seconds_between_retries"][1] = Json::Value(20);
- module_config["seconds_between_retries"][2] = Json::Value(30);
- module_config["endpoints"] = Json::Value(Json::objectValue);
- module_config["endpoints"]["0x00"] = Json::Value(Json::objectValue);
- module_config["endpoints"]["0x00"]["default"] = Json::Value(Json::arrayValue);
- module_config["endpoints"]["0x00"]["default"][0] =
- Json::Value("http://ford.com/cloud/default");
- module_config["notifications_per_minute_by_priority"] =
- Json::Value(Json::objectValue);
- module_config["notifications_per_minute_by_priority"]["emergency"] =
- Json::Value(1);
- module_config["notifications_per_minute_by_priority"]["navigation"] =
- Json::Value(2);
- module_config["notifications_per_minute_by_priority"]["VOICECOMM"] =
- Json::Value(3);
- module_config["notifications_per_minute_by_priority"]["communication"] =
- Json::Value(4);
- module_config["notifications_per_minute_by_priority"]["normal"] =
- Json::Value(5);
- module_config["notifications_per_minute_by_priority"]["none"] =
- Json::Value(6);
- module_config["subtle_notifications_per_minute_by_priority"] =
- Json::Value(Json::objectValue);
- module_config["subtle_notifications_per_minute_by_priority"]["emergency"] =
- Json::Value(7);
- module_config["subtle_notifications_per_minute_by_priority"]["navigation"] =
- Json::Value(8);
- module_config["subtle_notifications_per_minute_by_priority"]["VOICECOMM"] =
- Json::Value(9);
- module_config["subtle_notifications_per_minute_by_priority"]
- ["communication"] = Json::Value(10);
- module_config["subtle_notifications_per_minute_by_priority"]["normal"] =
- Json::Value(11);
- module_config["subtle_notifications_per_minute_by_priority"]["none"] =
- Json::Value(12);
- module_config["vehicle_make"] = Json::Value("MakeT");
- module_config["vehicle_model"] = Json::Value("ModelT");
- module_config["vehicle_year"] = Json::Value("2014");
- module_config["certificate"] = Json::Value("my_cert");
+ ASSERT_TRUE(IsValid(update));
+ EXPECT_TRUE(reps_->Save(update));
- Json::Value& functional_groupings = policy_table["functional_groupings"];
- functional_groupings["default"] = Json::Value(Json::objectValue);
- Json::Value& default_group = functional_groupings["default"];
- default_group["rpcs"] = Json::Value(Json::objectValue);
- default_group["rpcs"]["Update"] = Json::Value(Json::objectValue);
- default_group["rpcs"]["Update"]["hmi_levels"] = Json::Value(Json::arrayValue);
- default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL");
- default_group["rpcs"]["Update"]["parameters"] = Json::Value(Json::arrayValue);
- default_group["rpcs"]["Update"]["parameters"][0] = Json::Value("speed");
-
- Json::Value& consumer_friendly_messages =
- policy_table["consumer_friendly_messages"];
- consumer_friendly_messages["version"] = Json::Value("1.2");
- consumer_friendly_messages["messages"] = Json::Value(Json::objectValue);
- consumer_friendly_messages["messages"]["MSG1"] =
- Json::Value(Json::objectValue);
- Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG1"];
- msg1["languages"] = Json::Value(Json::objectValue);
- msg1["languages"]["en-us"] = Json::Value(Json::objectValue);
- msg1["languages"]["en-us"]["tts"] = Json::Value("TTS message");
- msg1["languages"]["en-us"]["label"] = Json::Value("LABEL message");
- msg1["languages"]["en-us"]["line1"] = Json::Value("LINE1 message");
- msg1["languages"]["en-us"]["line2"] = Json::Value("LINE2 message");
- msg1["languages"]["en-us"]["textBody"] = Json::Value("TEXTBODY message");
-
- Json::Value& app_policies = policy_table["app_policies"];
- app_policies["default"] = Json::Value(Json::objectValue);
- app_policies["default"]["memory_kb"] = Json::Value(50);
- app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(100);
- app_policies["default"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["default"]["groups"][0] = Json::Value("default");
- app_policies["default"]["priority"] = Json::Value("EMERGENCY");
- app_policies["default"]["default_hmi"] = Json::Value("FULL");
- app_policies["default"]["keep_context"] = Json::Value(true);
- app_policies["default"]["steal_focus"] = Json::Value(true);
- app_policies["pre_DataConsent"] = Json::Value(Json::objectValue);
- app_policies["pre_DataConsent"]["memory_kb"] = Json::Value(50);
- app_policies["pre_DataConsent"]["heart_beat_timeout_ms"] = Json::Value(100);
- app_policies["pre_DataConsent"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["pre_DataConsent"]["groups"][0] = Json::Value("default");
- app_policies["pre_DataConsent"]["priority"] = Json::Value("EMERGENCY");
- app_policies["pre_DataConsent"]["default_hmi"] = Json::Value("FULL");
- app_policies["pre_DataConsent"]["keep_context"] = Json::Value(true);
- app_policies["pre_DataConsent"]["steal_focus"] = Json::Value(true);
- app_policies["1234"] = Json::Value(Json::objectValue);
- app_policies["1234"]["memory_kb"] = Json::Value(50);
- app_policies["1234"]["heart_beat_timeout_ms"] = Json::Value(100);
- app_policies["1234"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["1234"]["groups"][0] = Json::Value("default");
- app_policies["1234"]["priority"] = Json::Value("EMERGENCY");
- app_policies["1234"]["default_hmi"] = Json::Value("FULL");
- app_policies["1234"]["keep_context"] = Json::Value(true);
- app_policies["1234"]["steal_focus"] = Json::Value(true);
- app_policies["device"] = Json::Value(Json::objectValue);
- app_policies["device"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["device"]["groups"][0] = Json::Value("default");
- app_policies["device"]["priority"] = Json::Value("EMERGENCY");
- app_policies["device"]["default_hmi"] = Json::Value("FULL");
- app_policies["device"]["keep_context"] = Json::Value(true);
- app_policies["device"]["steal_focus"] = Json::Value(true);
-
- policy_table::Table update(&table);
- update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE);
+ std::shared_ptr<policy_table::Table> snapshot = reps_->GenerateSnapshot();
+
+ auto expected_module_meta = GetDefaultSnapshotModuleMeta(update);
+ auto& snapshot_module_meta = snapshot->policy_table.module_meta;
+ EXPECT_EQ(expected_module_meta.toStyledString(),
+ snapshot_module_meta.ToJsonValue().toStyledString());
+}
+
+TEST_F(
+ SQLPTExtRepresentationTest,
+ GenerateSnapshot_SetMandatoryMetaInfo_MandatoryMetaInfoIsPresentInSnapshot) {
+ policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson);
- // Assert
ASSERT_TRUE(IsValid(update));
ASSERT_TRUE(reps_->Save(update));
- // Act
+ EXPECT_TRUE(
+ reps_->SetMetaInfo(kSoftwareVersion, kWersCountryCode, kLanguage));
+
std::shared_ptr<policy_table::Table> snapshot = reps_->GenerateSnapshot();
- snapshot->SetPolicyTableType(rpc::policy_table_interface_base::PT_SNAPSHOT);
- policy_table["module_meta"] = Json::Value(Json::objectValue);
- policy_table["usage_and_error_counts"] = Json::Value(Json::objectValue);
- policy_table["device_data"] = Json::Value(Json::objectValue);
- policy_table["module_config"]["preloaded_pt"] = Json::Value(false);
+ auto expected_module_meta = GetDefaultSnapshotModuleMeta(update);
+ expected_module_meta["ccpu_version"] = Json::Value(kSoftwareVersion);
+ expected_module_meta["language"] = Json::Value(kLanguage);
+ expected_module_meta["wers_country_code"] = Json::Value(kWersCountryCode);
- Json::Value& module_meta = policy_table["module_meta"];
- module_meta["ccpu_version"] = Json::Value("");
- module_meta["language"] = Json::Value("");
- module_meta["wers_country_code"] = Json::Value("");
- module_meta["pt_exchanged_at_odometer_x"] = Json::Value(0);
- module_meta["pt_exchanged_x_days_after_epoch"] = Json::Value(0);
- module_meta["ignition_cycles_since_last_exchange"] = Json::Value(0);
- module_meta["vin"] = Json::Value("");
+ auto& snapshot_module_meta = snapshot->policy_table.module_meta;
+ EXPECT_EQ(expected_module_meta.toStyledString(),
+ snapshot_module_meta.ToJsonValue().toStyledString());
+}
- Json::Value& usage_and_error_counts = policy_table["usage_and_error_counts"];
- usage_and_error_counts["count_of_iap_buffer_full"] = Json::Value(0);
- usage_and_error_counts["count_sync_out_of_memory"] = Json::Value(0);
- usage_and_error_counts["count_of_sync_reboots"] = Json::Value(0);
+TEST_F(SQLPTExtRepresentationTest,
+ GenerateSnapshot_SetHardwareVersion_HardwareVersionIsPresentInSnapshot) {
+ policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson);
- policy_table::Table expected(&table);
+ ASSERT_TRUE(IsValid(update));
+ EXPECT_TRUE(reps_->Save(update));
- // Assert
- EXPECT_EQ(expected.ToJsonValue().toStyledString(),
- snapshot->ToJsonValue().toStyledString());
+ reps_->SetHardwareVersion(kHardwareVersion);
+ std::shared_ptr<policy_table::Table> snapshot = reps_->GenerateSnapshot();
+
+ auto expected_module_meta = GetDefaultSnapshotModuleMeta(update);
+ expected_module_meta["hardware_version"] = Json::Value(kHardwareVersion);
+
+ auto& snapshot_module_meta = snapshot->policy_table.module_meta;
+ EXPECT_EQ(expected_module_meta.toStyledString(),
+ snapshot_module_meta.ToJsonValue().toStyledString());
+}
+
+TEST_F(SQLPTExtRepresentationTest, Save_ParametersPresent_ParametersSaved) {
+ policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson);
+ ASSERT_TRUE(IsValid(update));
+
+ policy_table::FunctionalGroupings func_groups;
+ ASSERT_TRUE(reps_->GetFunctionalGroupings(func_groups));
+ EXPECT_TRUE(func_groups.empty());
+
+ EXPECT_TRUE(reps_->Save(update));
+ ASSERT_TRUE(reps_->GetFunctionalGroupings(func_groups));
+
+ policy_table::FunctionalGroupings::iterator func_groups_iter =
+ func_groups.find(kFunctionalGroupWithParams);
+ ASSERT_TRUE(func_groups.end() != func_groups_iter);
+ policy_table::Rpcs& rpcs = func_groups_iter->second;
+ EXPECT_EQ(kUserConsentForGroupWithParams,
+ static_cast<std::string>(*rpcs.user_consent_prompt));
+ policy_table::Rpc& rpc = rpcs.rpcs;
+ policy_table::Rpc::const_iterator rpc_iter = rpc.find(kRpcForGroupWithParams);
+ EXPECT_TRUE(rpc.end() != rpc_iter);
+ const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters);
+ EXPECT_TRUE(!parameters.empty());
+}
+
+TEST_F(SQLPTExtRepresentationTest, Save_NoParameters_NoParametersSaved) {
+ policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson);
+ ASSERT_TRUE(IsValid(update));
+
+ policy_table::FunctionalGroupings func_groups;
+ ASSERT_TRUE(reps_->GetFunctionalGroupings(func_groups));
+ EXPECT_TRUE(func_groups.empty());
+
+ EXPECT_TRUE(reps_->Save(update));
+ ASSERT_TRUE(reps_->GetFunctionalGroupings(func_groups));
+
+ const std::string func_group_without_params = "Notifications";
+ const std::string user_consent = "Notifications";
+ const std::string rpc_without_params = "Alert";
+
+ policy_table::FunctionalGroupings::iterator func_groups_iter =
+ func_groups.find(func_group_without_params);
+ ASSERT_TRUE(func_groups.end() != func_groups_iter);
+ policy_table::Rpcs& rpcs = func_groups_iter->second;
+ EXPECT_EQ(user_consent, static_cast<std::string>(*rpcs.user_consent_prompt));
+ policy_table::Rpc& rpc = rpcs.rpcs;
+ EXPECT_EQ(1u, rpc.size());
+ policy_table::Rpc::const_iterator rpc_iter = rpc.find(rpc_without_params);
+ EXPECT_TRUE(rpc.end() != rpc_iter);
+ // Check parameters
+ const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters);
+ EXPECT_FALSE(parameters.is_initialized());
+ EXPECT_TRUE(parameters.empty());
+}
+
+TEST_F(SQLPTExtRepresentationTest, Save_EmptyParameters_ParametersEmpty) {
+ policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson);
+ ASSERT_TRUE(IsValid(update));
+
+ policy_table::FunctionalGroupings func_groups;
+ EXPECT_TRUE(reps_->GetFunctionalGroupings(func_groups));
+ EXPECT_TRUE(func_groups.empty());
+
+ auto json_update = update.ToJsonValue();
+ json_update["policy_table"]["functional_groupings"]
+ [kFunctionalGroupWithParams]["rpcs"][kRpcForGroupWithParams]
+ ["parameters"] = Json::Value(Json::arrayValue);
+ policy_table::Table update_with_empty_param(&json_update);
+
+ EXPECT_TRUE(reps_->Save(update_with_empty_param));
+ EXPECT_TRUE(reps_->GetFunctionalGroupings(func_groups));
+
+ policy_table::FunctionalGroupings::iterator func_groups_iter =
+ func_groups.find(kFunctionalGroupWithParams);
+ ASSERT_TRUE(func_groups.end() != func_groups_iter);
+ policy_table::Rpcs& rpcs = func_groups_iter->second;
+ EXPECT_EQ(kUserConsentForGroupWithParams,
+ static_cast<std::string>(*rpcs.user_consent_prompt));
+ policy_table::Rpc& rpc = rpcs.rpcs;
+ policy_table::Rpc::const_iterator rpc_iter = rpc.find(kRpcForGroupWithParams);
+ EXPECT_TRUE(rpc.end() != rpc_iter);
+ // Check parameters
+ const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters);
+ // 'parameters' : [] - represented as initialized, but empty
+ // missing 'parameters' - represented as non-initialized and empty
+ EXPECT_TRUE(parameters.is_initialized());
+ EXPECT_TRUE(parameters.empty());
}
TEST_F(
@@ -1159,7 +1183,8 @@ TEST_F(
TEST_F(SQLPTExtRepresentationTest,
SetMetaInfo_SetMetaInfo_ExpectValuesSetInParams) {
// Arrange
- ASSERT_TRUE(reps_->SetMetaInfo("4.1.3.B_EB355B", "WAEGB", "ru-ru"));
+ ASSERT_TRUE(
+ reps_->SetMetaInfo(kSoftwareVersion, kWersCountryCode, kLanguage));
utils::dbms::SQLQuery query(reps_->db());
const std::string query_select_ccpu =
"SELECT `ccpu_version` FROM `module_meta`";
@@ -1171,13 +1196,13 @@ TEST_F(SQLPTExtRepresentationTest,
// Assert
query.Prepare(query_select_ccpu);
query.Next();
- EXPECT_EQ("4.1.3.B_EB355B", query.GetString(0));
+ EXPECT_EQ(kSoftwareVersion, query.GetString(0));
query.Prepare(query_select_wers_country_code);
query.Next();
- EXPECT_EQ("WAEGB", query.GetString(0));
+ EXPECT_EQ(kWersCountryCode, query.GetString(0));
query.Prepare(query_select_language);
query.Next();
- EXPECT_EQ("ru-ru", query.GetString(0));
+ EXPECT_EQ(kLanguage, query.GetString(0));
}
TEST_F(SQLPTExtRepresentationTest,
@@ -1203,6 +1228,17 @@ TEST_F(SQLPTExtRepresentationTest,
EXPECT_EQ("ru-ru", query.GetString(0));
}
+TEST_F(SQLPTExtRepresentationTest, SetHardwareVersion_ValueIsSetInModuleMeta) {
+ utils::dbms::SQLQuery query(reps_->db());
+ reps_->SetHardwareVersion(kHardwareVersion);
+ const std::string query_select_hardware_version =
+ "SELECT `hardware_version` FROM `module_meta`";
+
+ query.Prepare(query_select_hardware_version);
+ query.Next();
+ EXPECT_EQ(kHardwareVersion, query.GetString(0));
+}
+
TEST_F(
SQLPTExtRepresentationTest,
GetFunctionalGroupNames_SetGroupsManuallyThenGetGroupNames_ExpectAllGroupsReceived) {
diff --git a/src/components/policy/policy_external/test/sql_pt_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_representation_test.cc
index 224c663c52..1adf9ae7c6 100644
--- a/src/components/policy/policy_external/test/sql_pt_representation_test.cc
+++ b/src/components/policy/policy_external/test/sql_pt_representation_test.cc
@@ -188,150 +188,6 @@ class SQLPTRepresentationTest : public SQLPTRepresentation,
StringsCompare(groups, app_groups);
}
- void PolicyTableUpdatePrepare(Json::Value& table) {
- PolicyTableUpdatePrepareNoParameters(table);
-
- table["policy_table"]["functional_groupings"]["default"]["rpcs"]["Update"]
- ["parameters"] = Json::Value(Json::arrayValue);
- table["policy_table"]["functional_groupings"]["default"]["rpcs"]["Update"]
- ["parameters"][0] = Json::Value("speed");
- }
-
- void PolicyTableUpdatePrepareEmptyParameters(Json::Value& table) {
- PolicyTableUpdatePrepareNoParameters(table);
-
- // Parameters are empty
- table["policy_table"]["functional_groupings"]["default"]["rpcs"]["Update"]
- ["parameters"] = Json::Value(Json::arrayValue);
- }
-
- void PolicyTableUpdatePrepareNoParameters(Json::Value& table) {
- table["policy_table"] = Json::Value(Json::objectValue);
- Json::Value& policy_table = table["policy_table"];
- policy_table["module_config"] = Json::Value(Json::objectValue);
- policy_table["functional_groupings"] = Json::Value(Json::objectValue);
- policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue);
- policy_table["app_policies"] = Json::Value(Json::objectValue);
-
- Json::Value& module_config = policy_table["module_config"];
- module_config["preloaded_date"] = Json::Value("25-04-2015");
- module_config["exchange_after_x_ignition_cycles"] = Json::Value(10);
- module_config["exchange_after_x_kilometers"] = Json::Value(100);
- module_config["exchange_after_x_days"] = Json::Value(5);
- module_config["timeout_after_x_seconds"] = Json::Value(500);
- module_config["seconds_between_retries"] = Json::Value(Json::arrayValue);
- Json::Value& seconds_between_retries =
- module_config["seconds_between_retries"];
- seconds_between_retries[0] = Json::Value(10);
- seconds_between_retries[1] = Json::Value(20);
- seconds_between_retries[2] = Json::Value(30);
- module_config["endpoints"] = Json::Value(Json::objectValue);
- Json::Value& endpoins = module_config["endpoints"];
- endpoins["0x00"] = Json::Value(Json::objectValue);
- endpoins["0x00"]["default"] = Json::Value(Json::arrayValue);
- endpoins["0x00"]["default"][0] =
- Json::Value("http://ford.com/cloud/default");
- module_config["notifications_per_minute_by_priority"] =
- Json::Value(Json::objectValue);
- module_config["notifications_per_minute_by_priority"]["emergency"] =
- Json::Value(1);
- module_config["notifications_per_minute_by_priority"]["navigation"] =
- Json::Value(2);
- module_config["notifications_per_minute_by_priority"]["VOICECOMM"] =
- Json::Value(3);
- module_config["notifications_per_minute_by_priority"]["communication"] =
- Json::Value(4);
- module_config["notifications_per_minute_by_priority"]["normal"] =
- Json::Value(5);
- module_config["notifications_per_minute_by_priority"]["none"] =
- Json::Value(6);
- module_config["subtle_notifications_per_minute_by_priority"] =
- Json::Value(Json::objectValue);
- module_config["subtle_notifications_per_minute_by_priority"]["emergency"] =
- Json::Value(7);
- module_config["subtle_notifications_per_minute_by_priority"]["navigation"] =
- Json::Value(8);
- module_config["subtle_notifications_per_minute_by_priority"]["VOICECOMM"] =
- Json::Value(9);
- module_config["subtle_notifications_per_minute_by_priority"]
- ["communication"] = Json::Value(10);
- module_config["subtle_notifications_per_minute_by_priority"]["normal"] =
- Json::Value(11);
- module_config["subtle_notifications_per_minute_by_priority"]["none"] =
- Json::Value(12);
- module_config["vehicle_make"] = Json::Value("MakeT");
- module_config["vehicle_model"] = Json::Value("ModelT");
- module_config["vehicle_year"] = Json::Value("2014");
- module_config["certificate"] = Json::Value("my_cert");
-
- Json::Value& functional_groupings = policy_table["functional_groupings"];
- functional_groupings["default"] = Json::Value(Json::objectValue);
- Json::Value& default_group = functional_groupings["default"];
- default_group["rpcs"] = Json::Value(Json::objectValue);
- default_group["rpcs"]["Update"] = Json::Value(Json::objectValue);
- default_group["rpcs"]["Update"]["hmi_levels"] =
- Json::Value(Json::arrayValue);
- default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL");
- // No parameters
-
- Json::Value& consumer_friendly_messages =
- policy_table["consumer_friendly_messages"];
- consumer_friendly_messages["version"] = Json::Value("1.2");
- consumer_friendly_messages["messages"] = Json::Value(Json::objectValue);
- consumer_friendly_messages["messages"]["MSG1"] =
- Json::Value(Json::objectValue);
- Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG1"];
- msg1["languages"] = Json::Value(Json::objectValue);
- msg1["languages"]["en-us"] = Json::Value(Json::objectValue);
- msg1["languages"]["en-us"]["tts"] = Json::Value("TTS message");
- msg1["languages"]["en-us"]["label"] = Json::Value("LABEL message");
- msg1["languages"]["en-us"]["line1"] = Json::Value("LINE1 message");
- msg1["languages"]["en-us"]["line2"] = Json::Value("LINE2 message");
- msg1["languages"]["en-us"]["textBody"] = Json::Value("TEXTBODY message");
-
- Json::Value& app_policies = policy_table["app_policies"];
- app_policies["default"] = Json::Value(Json::objectValue);
- app_policies["default"]["priority"] = Json::Value("EMERGENCY");
- app_policies["default"]["memory_kb"] = Json::Value(50);
- app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(100);
- app_policies["default"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["default"]["groups"][0] = Json::Value("default");
- app_policies["default"]["priority"] = Json::Value("EMERGENCY");
- app_policies["default"]["is_revoked"] = Json::Value(true);
- app_policies["default"]["default_hmi"] = Json::Value("FULL");
- app_policies["default"]["keep_context"] = Json::Value(true);
- app_policies["default"]["steal_focus"] = Json::Value(true);
-
- app_policies["pre_DataConsent"] = Json::Value(Json::objectValue);
- app_policies["pre_DataConsent"]["memory_kb"] = Json::Value(40);
- app_policies["pre_DataConsent"]["heart_beat_timeout_ms"] = Json::Value(90);
- app_policies["pre_DataConsent"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["pre_DataConsent"]["groups"][0] = Json::Value("default");
- app_policies["pre_DataConsent"]["priority"] = Json::Value("EMERGENCY");
- app_policies["pre_DataConsent"]["default_hmi"] = Json::Value("FULL");
- app_policies["pre_DataConsent"]["is_revoked"] = Json::Value(false);
- app_policies["pre_DataConsent"]["keep_context"] = Json::Value(true);
- app_policies["pre_DataConsent"]["steal_focus"] = Json::Value(true);
- app_policies["1234"] = Json::Value(Json::objectValue);
- app_policies["1234"]["memory_kb"] = Json::Value(150);
- app_policies["1234"]["heart_beat_timeout_ms"] = Json::Value(200);
- app_policies["1234"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["1234"]["groups"][0] = Json::Value("default");
- app_policies["1234"]["priority"] = Json::Value("EMERGENCY");
- app_policies["1234"]["default_hmi"] = Json::Value("FULL");
- app_policies["1234"]["is_revoked"] = Json::Value(true);
- app_policies["1234"]["keep_context"] = Json::Value(false);
- app_policies["1234"]["steal_focus"] = Json::Value(false);
- app_policies["device"] = Json::Value(Json::objectValue);
- app_policies["device"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["device"]["groups"][0] = Json::Value("default");
- app_policies["device"]["priority"] = Json::Value("EMERGENCY");
- app_policies["device"]["is_revoked"] = Json::Value(true);
- app_policies["device"]["default_hmi"] = Json::Value("FULL");
- app_policies["device"]["keep_context"] = Json::Value(true);
- app_policies["device"]["steal_focus"] = Json::Value(true);
- }
-
::testing::AssertionResult IsValid(const policy_table::Table& table) {
if (table.is_valid()) {
return ::testing::AssertionSuccess();
@@ -1633,304 +1489,6 @@ TEST(SQLPTRepresentationTest3, RemoveDB_RemoveDB_ExpectFileDeleted) {
EXPECT_FALSE(file_system::FileExists(path));
}
-TEST_F(SQLPTRepresentationTest,
- DISABLED_GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) {
- // TODO(AKutsan):APPLINK-31526 Test requires initial preloaded pt for
- // preloaded date reading
- // Arrange
- Json::Value table(Json::objectValue);
- PolicyTableUpdatePrepare(table);
-
- policy_table::Table update(&table);
- update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE);
-
- // Assert
- ASSERT_TRUE(IsValid(update));
- ASSERT_TRUE(reps->Save(update));
-
- // Act
- std::shared_ptr<policy_table::Table> snapshot = reps->GenerateSnapshot();
- snapshot->SetPolicyTableType(rpc::policy_table_interface_base::PT_SNAPSHOT);
- // Remove fields which must be absent in snapshot
- table["policy_table"]["consumer_friendly_messages"].removeMember("messages");
- table["policy_table"]["app_policies"]["1234"].removeMember("default_hmi");
- table["policy_table"]["app_policies"]["1234"].removeMember("keep_context");
- table["policy_table"]["app_policies"]["1234"].removeMember("steal_focus");
- table["policy_table"]["app_policies"]["default"].removeMember("default_hmi");
- table["policy_table"]["app_policies"]["default"].removeMember("keep_context");
- table["policy_table"]["app_policies"]["default"].removeMember("steal_focus");
- table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember(
- "default_hmi");
- table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember(
- "keep_context");
- table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember(
- "steal_focus");
- table["policy_table"]["app_policies"]["device"].removeMember("default_hmi");
- table["policy_table"]["app_policies"]["device"].removeMember("keep_context");
- table["policy_table"]["app_policies"]["device"].removeMember("steal_focus");
- table["policy_table"]["app_policies"]["device"].removeMember("groups");
- table["policy_table"]["device_data"] = Json::Value(Json::objectValue);
- table["policy_table"]["module_meta"] = Json::Value(Json::objectValue);
- table["policy_table"]["module_config"]["preloaded_pt"] = Json::Value(false);
- policy_table::Table expected(&table);
- Json::StreamWriterBuilder writer_builder;
- // Checks
- Json::Value snapshot_json_value = snapshot->ToJsonValue();
- EXPECT_EQ(Json::writeString(writer_builder, expected.ToJsonValue()),
- Json::writeString(writer_builder, snapshot_json_value));
- std::cout << Json::writeString(writer_builder, snapshot_json_value)
- << std::endl;
- EXPECT_EQ(expected.ToJsonValue().toStyledString(),
- snapshot_json_value.toStyledString());
-}
-
-TEST_F(SQLPTRepresentationTest,
- DISABLED_Save_SetPolicyTableThenSave_ExpectSavedToPT) {
- // TODO(AKutsan): APPLINK-31526 Test requires initial preloaded pt for
- // preloaded date reading
- // Arrange
- Json::Value table(Json::objectValue);
- PolicyTableUpdatePrepare(table);
-
- policy_table::Table update(&table);
- update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE);
- // Checks PT before Save
- policy_table::FunctionalGroupings func_groups;
- ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups));
- // Check functional groupings section
- EXPECT_EQ(0u, func_groups.size());
-
- policy_table::ApplicationPoliciesSection policies;
- GatherApplicationPoliciesSection(&policies);
- // Check ApplicationPoliciesSection
- EXPECT_EQ(0u, policies.apps.size());
- EXPECT_EQ(0u, (policies.device.preconsented_groups)->size());
- EXPECT_EQ(0u, policies.device.groups.size());
- EXPECT_EQ(policy_table::Priority::P_EMERGENCY, policies.device.priority);
- EXPECT_EQ(policy_table::HmiLevel::HL_BACKGROUND, policies.device.default_hmi);
- EXPECT_FALSE(policies.device.keep_context);
- EXPECT_FALSE(policies.device.steal_focus);
-
- policy_table::ModuleConfig config;
- GatherModuleConfig(&config);
- // Check Module config section
- EXPECT_TRUE(*config.preloaded_pt);
- EXPECT_EQ(0, config.exchange_after_x_ignition_cycles);
- EXPECT_EQ(0, config.exchange_after_x_kilometers);
- EXPECT_EQ(0, config.exchange_after_x_days);
- EXPECT_EQ(0, config.timeout_after_x_seconds);
- EXPECT_EQ("", static_cast<std::string>(*config.vehicle_make));
- EXPECT_EQ("", static_cast<std::string>(*config.vehicle_model));
- EXPECT_EQ("", static_cast<std::string>(*config.vehicle_year));
- EXPECT_EQ("", static_cast<std::string>(*config.preloaded_date));
- EXPECT_EQ("", static_cast<std::string>(*config.certificate));
- EXPECT_EQ(0u, config.seconds_between_retries.size());
- EXPECT_EQ(0u, config.endpoints.size());
- EXPECT_EQ(0u, config.notifications_per_minute_by_priority.size());
- EXPECT_EQ(0u, (*config.subtle_notifications_per_minute_by_priority).size());
-
- policy_table::ConsumerFriendlyMessages messages;
- GatherConsumerFriendlyMessages(&messages);
- EXPECT_EQ("0", static_cast<std::string>(messages.version));
- policy_table::DeviceData devices;
- GatherDeviceData(&devices);
- EXPECT_EQ(0u, devices.size());
- policy_table::UsageAndErrorCounts counts;
- GatherUsageAndErrorCounts(&counts);
- EXPECT_EQ(0u, counts.app_level->size());
- ASSERT_TRUE(IsValid(update));
- // Act
- ASSERT_TRUE(reps->Save(update));
-
- // Check Functional Groupings
- ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups));
- // Checks
- EXPECT_EQ(1u, func_groups.size());
- policy_table::FunctionalGroupings::iterator func_groups_iter =
- func_groups.find("default");
- ASSERT_TRUE(func_groups.end() != func_groups_iter);
- policy_table::Rpcs& rpcs = func_groups_iter->second;
- EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt));
- policy_table::Rpc& rpc = rpcs.rpcs;
- EXPECT_EQ(1u, rpc.size());
- policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update");
- EXPECT_TRUE(rpc.end() != rpc_iter);
- const policy_table::HmiLevels& hmi_levels = rpc_iter->second.hmi_levels;
- EXPECT_EQ(1u, hmi_levels.size());
- EXPECT_TRUE(hmi_levels.end() != std::find(hmi_levels.begin(),
- hmi_levels.end(),
- policy_table::HmiLevel::HL_FULL));
-
- const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters);
- EXPECT_EQ(1u, parameters.size());
- EXPECT_TRUE(parameters.end() !=
- std::find(parameters.begin(), parameters.end(), "P_SPEED"));
- // Check Application Policies Section
- GatherApplicationPoliciesSection(&policies);
- const uint32_t apps_size = 3u;
-
- rpc::String<1ul, 255ul> str("default");
- policy_table::Strings groups;
- groups.push_back(str);
- CheckAppPoliciesSection(policies,
- apps_size,
- policy_table::Priority::P_EMERGENCY,
- "1234",
- 150u,
- 200u,
- groups);
- CheckAppPoliciesSection(policies,
- apps_size,
- policy_table::Priority::P_EMERGENCY,
- "default",
- 50u,
- 100u,
- groups);
- CheckAppPoliciesSection(policies,
- apps_size,
- policy_table::Priority::P_EMERGENCY,
- "pre_DataConsent",
- 40u,
- 90u,
- groups);
- CheckAppPoliciesSection(policies,
- apps_size,
- policy_table::Priority::P_EMERGENCY,
- "device",
- 0u,
- 0u,
- groups);
- EXPECT_EQ(0u, (policies.device.preconsented_groups)->size());
- EXPECT_EQ(0u, policies.device.groups.size());
- EXPECT_EQ(policy_table::HmiLevel::HL_BACKGROUND, policies.device.default_hmi);
- EXPECT_FALSE(policies.device.keep_context);
- EXPECT_FALSE(policies.device.steal_focus);
-
- CheckAppGroups("1234", groups);
- CheckAppGroups("default", groups);
- CheckAppGroups("pre_DataConsent", groups);
- CheckAppGroups("device", groups);
-
- GatherModuleConfig(&config);
- // Check Module Config section
- ASSERT_FALSE(*config.preloaded_pt);
- ASSERT_EQ("my_cert", static_cast<std::string>(*config.certificate));
- ASSERT_EQ("25-04-2015", static_cast<std::string>(*config.preloaded_date));
- ASSERT_EQ("2014", static_cast<std::string>(*config.vehicle_year));
- ASSERT_EQ("ModelT", static_cast<std::string>(*config.vehicle_model));
- ASSERT_EQ("MakeT", static_cast<std::string>(*config.vehicle_make));
- ASSERT_EQ(10, config.exchange_after_x_ignition_cycles);
- ASSERT_EQ(100, config.exchange_after_x_kilometers);
- ASSERT_EQ(5, config.exchange_after_x_days);
- ASSERT_EQ(500, config.timeout_after_x_seconds);
- ASSERT_EQ(3u, config.seconds_between_retries.size());
- ASSERT_EQ(10, config.seconds_between_retries[0]);
- ASSERT_EQ(20, config.seconds_between_retries[1]);
- ASSERT_EQ(30, config.seconds_between_retries[2]);
- ASSERT_EQ(6u, config.notifications_per_minute_by_priority.size());
- ASSERT_EQ(1, config.notifications_per_minute_by_priority["emergency"]);
- ASSERT_EQ(2, config.notifications_per_minute_by_priority["navigation"]);
- ASSERT_EQ(3, config.notifications_per_minute_by_priority["VOICECOMM"]);
- ASSERT_EQ(4, config.notifications_per_minute_by_priority["communication"]);
- ASSERT_EQ(5, config.notifications_per_minute_by_priority["normal"]);
- ASSERT_EQ(6, config.notifications_per_minute_by_priority["none"]);
- ASSERT_EQ(6u, (*config.subtle_notifications_per_minute_by_priority).size());
- ASSERT_EQ(7,
- (*config.subtle_notifications_per_minute_by_priority)["emergency"]);
- ASSERT_EQ(
- 8, (*config.subtle_notifications_per_minute_by_priority)["navigation"]);
- ASSERT_EQ(9,
- (*config.subtle_notifications_per_minute_by_priority)["VOICECOMM"]);
- ASSERT_EQ(
- 10,
- (*config.subtle_notifications_per_minute_by_priority)["communication"]);
- ASSERT_EQ(11,
- (*config.subtle_notifications_per_minute_by_priority)["normal"]);
- ASSERT_EQ(12, (*config.subtle_notifications_per_minute_by_priority)["none"]);
- EXPECT_EQ(1u, config.endpoints.size());
- policy_table::ServiceEndpoints& service_endpoints = config.endpoints;
- EXPECT_EQ("0x00", service_endpoints.begin()->first);
- policy_table::URLList& url_list = service_endpoints.begin()->second;
- EXPECT_EQ("default", url_list.begin()->first);
- policy_table::URL& url = url_list.begin()->second;
- EXPECT_EQ("http://ford.com/cloud/default", static_cast<std::string>(url[0]));
- GatherConsumerFriendlyMessages(&messages);
- EXPECT_EQ("1.2", static_cast<std::string>(messages.version));
-}
-
-TEST_F(SQLPTRepresentationTest,
- Save_SavePolicyTable_EmptyParameters_ParametersEMPTY) {
- // Arrange
- Json::Value table(Json::objectValue);
- PolicyTableUpdatePrepareEmptyParameters(table);
-
- policy_table::Table update(&table);
- update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE);
- // Checks PT before Save
- policy_table::FunctionalGroupings func_groups;
- ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups));
- // Check functional groupings section
- EXPECT_EQ(0u, func_groups.size());
-
- // Act
- ASSERT_TRUE(reps->Save(update));
-
- // Check Functional Groupings
- ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups));
- // Checks
- EXPECT_EQ(1u, func_groups.size());
- policy_table::FunctionalGroupings::iterator func_groups_iter =
- func_groups.find("default");
- ASSERT_TRUE(func_groups.end() != func_groups_iter);
- policy_table::Rpcs& rpcs = func_groups_iter->second;
- EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt));
- policy_table::Rpc& rpc = rpcs.rpcs;
- EXPECT_EQ(1u, rpc.size());
- policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update");
- EXPECT_TRUE(rpc.end() != rpc_iter);
- // Check parameters
- const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters);
- // 'parameters' : [] - represented as initialized, but empty
- // missing 'parameters' - represented as non-initialized and empty
- EXPECT_TRUE(parameters.is_initialized());
- EXPECT_TRUE(parameters.empty());
-}
-
-TEST_F(SQLPTRepresentationTest,
- Save_SavePolicyTable_NoParameters_NoParametersSaved) {
- // Arrange
- Json::Value table(Json::objectValue);
- PolicyTableUpdatePrepareNoParameters(table);
-
- policy_table::Table update(&table);
- update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE);
- // Checks PT before Save
- policy_table::FunctionalGroupings func_groups;
- ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups));
- // Check functional groupings section
- EXPECT_EQ(0u, func_groups.size());
-
- // Act
- ASSERT_TRUE(reps->Save(update));
-
- // Check Functional Groupings
- ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups));
- // Checks
- EXPECT_EQ(1u, func_groups.size());
- policy_table::FunctionalGroupings::iterator func_groups_iter =
- func_groups.find("default");
- ASSERT_TRUE(func_groups.end() != func_groups_iter);
- policy_table::Rpcs& rpcs = func_groups_iter->second;
- EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt));
- policy_table::Rpc& rpc = rpcs.rpcs;
- EXPECT_EQ(1u, rpc.size());
- policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update");
- EXPECT_TRUE(rpc.end() != rpc_iter);
- // Check parameters
- const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters);
- EXPECT_EQ(0u, parameters.size());
-}
-
} // namespace policy_test
} // namespace components
} // namespace test
diff --git a/src/components/policy/policy_regular/include/policy/cache_manager.h b/src/components/policy/policy_regular/include/policy/cache_manager.h
index 25b4a8bc18..473caef145 100644
--- a/src/components/policy/policy_regular/include/policy/cache_manager.h
+++ b/src/components/policy/policy_regular/include/policy/cache_manager.h
@@ -544,13 +544,11 @@ class CacheManager : public CacheManagerInterface {
*/
void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE;
- /**
- * @brief Records information about head unit system to PT
- * @return bool Success of operation
- */
bool SetMetaInfo(const std::string& ccpu_version,
const std::string& wers_country_code,
- const std::string& language);
+ const std::string& language) OVERRIDE;
+
+ void SetHardwareVersion(const std::string& hardware_version) OVERRIDE;
/**
* @brief Get information about last ccpu_version from PT
@@ -558,6 +556,8 @@ class CacheManager : public CacheManagerInterface {
*/
std::string GetCCPUVersionFromPT() const;
+ std::string GetHardwareVersionFromPT() const OVERRIDE;
+
/**
* @brief Checks, if specific head unit is present in PT
* @return boot Suceess, if present, otherwise - false
diff --git a/src/components/policy/policy_regular/include/policy/cache_manager_interface.h b/src/components/policy/policy_regular/include/policy/cache_manager_interface.h
index 14130c0316..5e536ef315 100644
--- a/src/components/policy/policy_regular/include/policy/cache_manager_interface.h
+++ b/src/components/policy/policy_regular/include/policy/cache_manager_interface.h
@@ -586,7 +586,7 @@ class CacheManagerInterface {
virtual void SetPreloadedPtFlag(const bool is_preloaded) = 0;
/**
- * @brief Records information about head unit system to PT
+ * @brief Records mandatory information about head unit system to PT
* @return bool Success of operation
*/
virtual bool SetMetaInfo(const std::string& ccpu_version,
@@ -594,12 +594,24 @@ class CacheManagerInterface {
const std::string& language) = 0;
/**
+ * @brief Records information about hardware version to PT
+ * @param hardware_version Hardware version
+ */
+ virtual void SetHardwareVersion(const std::string& hardware_version) = 0;
+
+ /**
* @brief Get information about last ccpu_version from PT
* @return ccpu_version from PT
*/
virtual std::string GetCCPUVersionFromPT() const = 0;
/**
+ * @brief Get information about last hardware version from PT
+ * @return string representation of hardware version from PT, empty if absent
+ */
+ virtual std::string GetHardwareVersionFromPT() const = 0;
+
+ /**
* @brief Checks, if specific head unit is present in PT
* @return boot Suceess, if present, otherwise - false
*/
diff --git a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h
index dff4802d82..32c546df62 100644
--- a/src/components/policy/policy_regular/include/policy/policy_manager_impl.h
+++ b/src/components/policy/policy_regular/include/policy/policy_manager_impl.h
@@ -451,10 +451,14 @@ class PolicyManagerImpl : public PolicyManager {
const std::string& wers_country_code,
const std::string& language) OVERRIDE;
+ void SetHardwareVersion(const std::string& hardware_version) OVERRIDE;
+
void SetPreloadedPtFlag(const bool is_preloaded) OVERRIDE;
std::string GetCCPUVersionFromPT() const OVERRIDE;
+ std::string GetHardwareVersionFromPT() const OVERRIDE;
+
/**
* @brief Get number of notification by priority
* @param priority Specified priority
diff --git a/src/components/policy/policy_regular/include/policy/policy_table/types.h b/src/components/policy/policy_regular/include/policy/policy_table/types.h
index 673f17e32b..7eeb41f064 100644
--- a/src/components/policy/policy_regular/include/policy/policy_table/types.h
+++ b/src/components/policy/policy_regular/include/policy/policy_table/types.h
@@ -430,6 +430,7 @@ struct ModuleMeta : CompositeType {
Optional<Integer<uint16_t, 0, 65535> > pt_exchanged_x_days_after_epoch;
Optional<Integer<uint16_t, 0, 65535> > ignition_cycles_since_last_exchange;
Optional<String<0, 500> > ccpu_version;
+ Optional<String<0, 500> > hardware_version;
public:
ModuleMeta();
diff --git a/src/components/policy/policy_regular/include/policy/policy_types.h b/src/components/policy/policy_regular/include/policy/policy_types.h
index 7f95d9132b..fe54da6b18 100644
--- a/src/components/policy/policy_regular/include/policy/policy_types.h
+++ b/src/components/policy/policy_regular/include/policy/policy_types.h
@@ -280,6 +280,7 @@ struct AppPermissions {
, appRevoked(false)
, appPermissionsConsentNeeded(false)
, appUnauthorized(false)
+ , isSDLAllowed(false)
, requestTypeChanged(false)
, requestSubTypeChanged(false) {}
diff --git a/src/components/policy/policy_regular/include/policy/pt_representation.h b/src/components/policy/policy_regular/include/policy/pt_representation.h
index 895b4ea6b5..9a57ed21ad 100644
--- a/src/components/policy/policy_regular/include/policy/pt_representation.h
+++ b/src/components/policy/policy_regular/include/policy/pt_representation.h
@@ -152,12 +152,18 @@ class PTRepresentation {
virtual EndpointUrls GetUpdateUrls(int service_type) = 0;
/**
- * @brief Records information about head unit system to PT
+ * @brief Records mandatory information about head unit system to PT
* @return bool Success of operation
*/
virtual bool SetMetaInfo(const std::string& ccpu_version) = 0;
/**
+ * @brief Records information about hardware version to PT
+ * @param hardware_version Hardware version
+ */
+ virtual void SetHardwareVersion(const std::string& hardware_version) = 0;
+
+ /**
* @brief Get allowed number of notifications
* depending on application priority.
* @param priority Priority of application
diff --git a/src/components/policy/policy_regular/include/policy/sql_pt_queries.h b/src/components/policy/policy_regular/include/policy/sql_pt_queries.h
index 5bf85a4bb5..fd7f879abf 100644
--- a/src/components/policy/policy_regular/include/policy/sql_pt_queries.h
+++ b/src/components/policy/policy_regular/include/policy/sql_pt_queries.h
@@ -145,6 +145,7 @@ extern const std::string kUpdateDBVersion;
extern const std::string kSaveModuleMeta;
extern const std::string kSelectModuleMeta;
extern const std::string kUpdateMetaParams;
+extern const std::string kUpdateMetaHardwareVersion;
extern const std::string kInsertVehicleDataItem;
extern const std::string kSelectVehicleDataItem;
extern const std::string kDeleteVehicleDataItems;
diff --git a/src/components/policy/policy_regular/include/policy/sql_pt_representation.h b/src/components/policy/policy_regular/include/policy/sql_pt_representation.h
index 512bfd6326..18147c43f0 100644
--- a/src/components/policy/policy_regular/include/policy/sql_pt_representation.h
+++ b/src/components/policy/policy_regular/include/policy/sql_pt_representation.h
@@ -90,7 +90,8 @@ class SQLPTRepresentation : public virtual PTRepresentation {
StringArray* nicknames = NULL,
StringArray* app_hmi_types = NULL);
bool GetFunctionalGroupings(policy_table::FunctionalGroupings& groups);
- bool SetMetaInfo(const std::string& ccpu_version);
+ bool SetMetaInfo(const std::string& ccpu_version) OVERRIDE;
+ void SetHardwareVersion(const std::string& hardware_version) OVERRIDE;
#ifdef BUILD_TESTS
uint32_t open_counter() {
return open_counter_;
diff --git a/src/components/policy/policy_regular/src/cache_manager.cc b/src/components/policy/policy_regular/src/cache_manager.cc
index d53ec4d18a..cf4164d133 100644
--- a/src/components/policy/policy_regular/src/cache_manager.cc
+++ b/src/components/policy/policy_regular/src/cache_manager.cc
@@ -1337,6 +1337,8 @@ void CacheManager::PersistData() {
}
backup_->SetMetaInfo(*(*copy_pt.policy_table.module_meta).ccpu_version);
+ backup_->SetHardwareVersion(
+ *(*copy_pt.policy_table.module_meta).hardware_version);
// In case of extended policy the meta info should be backuped as well.
backup_->WriteDb();
@@ -1490,13 +1492,35 @@ bool CacheManager::SetMetaInfo(const std::string& ccpu_version,
return true;
}
+void CacheManager::SetHardwareVersion(const std::string& hardware_version) {
+ SDL_LOG_AUTO_TRACE();
+ CACHE_MANAGER_CHECK_VOID();
+ sync_primitives::AutoLock auto_lock(cache_lock_);
+
+ *pt_->policy_table.module_meta->hardware_version = hardware_version;
+ Backup();
+}
+
std::string CacheManager::GetCCPUVersionFromPT() const {
SDL_LOG_AUTO_TRACE();
+ CACHE_MANAGER_CHECK(std::string(""));
+ sync_primitives::AutoLock auto_lock(cache_lock_);
+
rpc::Optional<policy_table::ModuleMeta>& module_meta =
pt_->policy_table.module_meta;
return *(module_meta->ccpu_version);
}
+std::string CacheManager::GetHardwareVersionFromPT() const {
+ SDL_LOG_AUTO_TRACE();
+ CACHE_MANAGER_CHECK(std::string(""));
+ sync_primitives::AutoLock auto_lock(cache_lock_);
+
+ rpc::Optional<policy_table::ModuleMeta>& module_meta =
+ pt_->policy_table.module_meta;
+ return *(module_meta->hardware_version);
+}
+
bool CacheManager::IsMetaInfoPresent() const {
CACHE_MANAGER_CHECK(false);
bool result = true;
diff --git a/src/components/policy/policy_regular/src/policy_manager_impl.cc b/src/components/policy/policy_regular/src/policy_manager_impl.cc
index 059375322a..b6101eb960 100644
--- a/src/components/policy/policy_regular/src/policy_manager_impl.cc
+++ b/src/components/policy/policy_regular/src/policy_manager_impl.cc
@@ -1217,11 +1217,22 @@ void PolicyManagerImpl::SetSystemInfo(const std::string& ccpu_version,
cache_->SetMetaInfo(ccpu_version, wers_country_code, language);
}
+void PolicyManagerImpl::SetHardwareVersion(
+ const std::string& hardware_version) {
+ SDL_LOG_AUTO_TRACE();
+ cache_->SetHardwareVersion(hardware_version);
+}
+
std::string PolicyManagerImpl::GetCCPUVersionFromPT() const {
SDL_LOG_AUTO_TRACE();
return cache_->GetCCPUVersionFromPT();
}
+std::string PolicyManagerImpl::GetHardwareVersionFromPT() const {
+ SDL_LOG_AUTO_TRACE();
+ return cache_->GetHardwareVersionFromPT();
+}
+
uint32_t PolicyManagerImpl::GetNotificationsNumber(const std::string& priority,
const bool is_subtle) const {
SDL_LOG_AUTO_TRACE();
diff --git a/src/components/policy/policy_regular/src/policy_table/types.cc b/src/components/policy/policy_regular/src/policy_table/types.cc
index d3473bb2a7..d2a70baafe 100644
--- a/src/components/policy/policy_regular/src/policy_table/types.cc
+++ b/src/components/policy/policy_regular/src/policy_table/types.cc
@@ -1297,7 +1297,8 @@ ModuleMeta::ModuleMeta(const Json::Value* value__)
impl::ValueMember(value__, "pt_exchanged_x_days_after_epoch"))
, ignition_cycles_since_last_exchange(
impl::ValueMember(value__, "ignition_cycles_since_last_exchange"))
- , ccpu_version(impl::ValueMember(value__, "ccpu_version")) {}
+ , ccpu_version(impl::ValueMember(value__, "ccpu_version"))
+ , hardware_version(impl::ValueMember(value__, "hardware_version")) {}
Json::Value ModuleMeta::ToJsonValue() const {
Json::Value result__(Json::objectValue);
@@ -1319,6 +1320,9 @@ bool ModuleMeta::is_valid() const {
if (!ccpu_version.is_valid()) {
return false;
}
+ if (!hardware_version.is_valid()) {
+ return false;
+ }
if (!pt_exchanged_at_odometer_x.is_valid()) {
return false;
}
@@ -1339,6 +1343,9 @@ bool ModuleMeta::struct_empty() const {
if (ccpu_version.is_initialized()) {
return false;
}
+ if (hardware_version.is_initialized()) {
+ return false;
+ }
if (pt_exchanged_at_odometer_x.is_initialized()) {
return false;
}
@@ -1359,6 +1366,10 @@ void ModuleMeta::ReportErrors(rpc::ValidationReport* report__) const {
if (!ccpu_version.is_valid()) {
ccpu_version.ReportErrors(&report__->ReportSubobject("ccpu_version"));
}
+ if (!hardware_version.is_valid()) {
+ hardware_version.ReportErrors(
+ &report__->ReportSubobject("hardware_version"));
+ }
if (!pt_exchanged_at_odometer_x.is_valid()) {
pt_exchanged_at_odometer_x.ReportErrors(
&report__->ReportSubobject("pt_exchanged_at_odometer_x"));
diff --git a/src/components/policy/policy_regular/src/sql_pt_queries.cc b/src/components/policy/policy_regular/src/sql_pt_queries.cc
index cf9167406f..ea0b7fe997 100644
--- a/src/components/policy/policy_regular/src/sql_pt_queries.cc
+++ b/src/components/policy/policy_regular/src/sql_pt_queries.cc
@@ -60,7 +60,8 @@ const std::string kCreateSchema =
" `pt_exchanged_x_days_after_epoch` INTEGER NOT NULL DEFAULT 0, "
" `ignition_cycles_since_last_exchange` INTEGER NOT NULL DEFAULT 0, "
" `flag_update_required` BOOL NOT NULL, "
- " `ccpu_version` VARCHAR(45) "
+ " `ccpu_version` VARCHAR(45), "
+ " `hardware_version` VARCHAR(45) "
"); "
"CREATE TABLE IF NOT EXISTS `module_config`( "
" `preloaded_pt` BOOL NOT NULL, "
@@ -1076,10 +1077,16 @@ const std::string kSaveModuleMeta =
"`pt_exchanged_x_days_after_epoch` = ?, "
"`ignition_cycles_since_last_exchange` = ? ";
-const std::string kSelectModuleMeta = "SELECT* FROM `module_meta`";
+const std::string kSelectModuleMeta =
+ "SELECT `ccpu_version`, `hardware_version`, `pt_exchanged_at_odometer_x`, "
+ "`pt_exchanged_x_days_after_epoch`, `ignition_cycles_since_last_exchange` "
+ "FROM `module_meta`";
const std::string kUpdateMetaParams =
"UPDATE `module_meta` SET "
"`ccpu_version` = ? ";
+
+const std::string kUpdateMetaHardwareVersion =
+ "UPDATE `module_meta` SET `hardware_version` = ? ";
} // namespace sql_pt
} // namespace policy
diff --git a/src/components/policy/policy_regular/src/sql_pt_representation.cc b/src/components/policy/policy_regular/src/sql_pt_representation.cc
index 7193a06bdb..57781ae16f 100644
--- a/src/components/policy/policy_regular/src/sql_pt_representation.cc
+++ b/src/components/policy/policy_regular/src/sql_pt_representation.cc
@@ -472,10 +472,11 @@ void SQLPTRepresentation::GatherModuleMeta(
SDL_LOG_INFO("Gather Module Meta Info");
utils::dbms::SQLQuery query(db());
if (query.Prepare(sql_pt::kSelectModuleMeta) && query.Next()) {
- *meta->pt_exchanged_at_odometer_x = query.GetInteger(0);
- *meta->pt_exchanged_x_days_after_epoch = query.GetInteger(1);
- *meta->ignition_cycles_since_last_exchange = query.GetInteger(2);
- *meta->ccpu_version = query.GetString(4);
+ *meta->ccpu_version = query.GetString(0);
+ *meta->hardware_version = query.GetString(1);
+ *meta->pt_exchanged_at_odometer_x = query.GetInteger(2);
+ *meta->pt_exchanged_x_days_after_epoch = query.GetInteger(3);
+ *meta->ignition_cycles_since_last_exchange = query.GetInteger(4);
}
}
@@ -716,6 +717,22 @@ bool SQLPTRepresentation::SetMetaInfo(const std::string& ccpu_version) {
return true;
}
+void SQLPTRepresentation::SetHardwareVersion(
+ const std::string& hardware_version) {
+ SDL_LOG_AUTO_TRACE();
+ utils::dbms::SQLQuery query(db());
+ if (!query.Prepare(sql_pt::kUpdateMetaHardwareVersion)) {
+ SDL_LOG_WARN("Incorrect statement for insert to module meta.");
+ return;
+ }
+
+ query.Bind(0, hardware_version);
+
+ if (!query.Exec()) {
+ SDL_LOG_WARN("Incorrect insert to module meta.");
+ }
+}
+
bool SQLPTRepresentation::GatherApplicationPoliciesSection(
policy_table::ApplicationPoliciesSection* policies) const {
SDL_LOG_INFO("Gather applications policies");
diff --git a/src/components/policy/policy_regular/test/CMakeLists.txt b/src/components/policy/policy_regular/test/CMakeLists.txt
index d2cd7be224..cdd6cc98da 100644
--- a/src/components/policy/policy_regular/test/CMakeLists.txt
+++ b/src/components/policy/policy_regular/test/CMakeLists.txt
@@ -49,6 +49,7 @@ file (GLOB POLICY_TEST_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/policy_manager_impl_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/access_remote_impl_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_representation_test.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/sql_pt_representation_storage_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/update_status_manager_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/vehicle_data_item_type_test.cc
${CMAKE_CURRENT_SOURCE_DIR}/shared_library_test.cc
diff --git a/src/components/policy/policy_regular/test/cache_manager_test.cc b/src/components/policy/policy_regular/test/cache_manager_test.cc
index 31166b8f43..00b632ac17 100644
--- a/src/components/policy/policy_regular/test/cache_manager_test.cc
+++ b/src/components/policy/policy_regular/test/cache_manager_test.cc
@@ -1235,6 +1235,18 @@ TEST_F(CacheManagerTest, IsApplicationRepresented_DeviceApp_ReturnTrue) {
EXPECT_TRUE(cache_manager_->IsApplicationRepresented(kDeviceId));
}
+TEST_F(CacheManagerTest, GetHardwareVersion_ValueWasSetBefore_ReturnValue) {
+ std::string hardware_version = "1.1.1.1";
+ cache_manager_->SetHardwareVersion(hardware_version);
+ EXPECT_EQ(hardware_version, cache_manager_->GetHardwareVersionFromPT());
+}
+
+TEST_F(CacheManagerTest,
+ GetHardwareVersion_ValueNotSettedBefore_ReturnEmptyString) {
+ std::string empty_string = "";
+ EXPECT_EQ(empty_string, cache_manager_->GetHardwareVersionFromPT());
+}
+
} // namespace policy_test
} // namespace components
} // namespace test
diff --git a/src/components/policy/policy_regular/test/policy_manager_impl_test.cc b/src/components/policy/policy_regular/test/policy_manager_impl_test.cc
index d5a66f4388..c456561328 100644
--- a/src/components/policy/policy_regular/test/policy_manager_impl_test.cc
+++ b/src/components/policy/policy_regular/test/policy_manager_impl_test.cc
@@ -599,20 +599,6 @@ TEST_F(PolicyManagerImplTest, GetHMITypes_ValidHmiTypes_ReturnTrue) {
EXPECT_TRUE(policy_manager_->GetHMITypes(kValidAppId, &app_types));
}
-TEST_F(PolicyManagerImplTest, SetMetaInfo_SetCCPUVersion_SUCCESS) {
- const std::string ccpu_version = "ccpu_version";
- const std::string wers_country_code = "wersCountryCode";
- const std::string language = "language";
-
- EXPECT_CALL(*mock_cache_manager_,
- SetMetaInfo(ccpu_version, wers_country_code, language));
- policy_manager_->SetSystemInfo(ccpu_version, wers_country_code, language);
-
- EXPECT_CALL(*mock_cache_manager_, GetCCPUVersionFromPT())
- .WillOnce(Return(ccpu_version));
- EXPECT_EQ(ccpu_version, policy_manager_->GetCCPUVersionFromPT());
-}
-
} // namespace policy_test
} // namespace components
} // namespace test
diff --git a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc
index f4efa811b6..fb64dfe7d0 100644
--- a/src/components/policy/policy_regular/test/sql_pt_representation_test.cc
+++ b/src/components/policy/policy_regular/test/sql_pt_representation_test.cc
@@ -72,6 +72,35 @@ namespace policy_test {
using policy_handler_test::MockPolicySettings;
+namespace {
+const std::string kSdlPreloadedPtJson = "json/sdl_preloaded_pt.json";
+const std::string kSoftwareVersion = "4.1.3.B_EB355B";
+const std::string kHardwareVersion = "1.1.1.0";
+} // namespace
+
+policy_table::Table LoadPreloadedPT(const std::string& filename) {
+ std::ifstream ifile(filename);
+ EXPECT_TRUE(ifile.good());
+ Json::CharReaderBuilder reader_builder;
+ Json::Value root(Json::objectValue);
+ Json::parseFromStream(reader_builder, ifile, &root, nullptr);
+ root["policy_table"]["module_config"].removeMember("preloaded_pt");
+ ifile.close();
+ policy_table::Table table(&root);
+ return table;
+}
+
+Json::Value GetDefaultSnapshotModuleMeta(policy_table::Table& policy_table) {
+ auto json_table = policy_table.ToJsonValue();
+
+ Json::Value default_module_meta = json_table["policy_table"]["module_meta"];
+ default_module_meta["pt_exchanged_at_odometer_x"] = Json::Value(0);
+ default_module_meta["pt_exchanged_x_days_after_epoch"] = Json::Value(0);
+ default_module_meta["ignition_cycles_since_last_exchange"] = Json::Value(0);
+
+ return default_module_meta;
+}
+
class SQLPTRepresentationTest : protected SQLPTRepresentation,
public ::testing::Test {
protected:
@@ -201,180 +230,6 @@ class SQLPTRepresentationTest : protected SQLPTRepresentation,
StringsCompare(groups, app_groups);
}
- void PolicyTableUpdatePrepare(Json::Value& table) {
- // Root
- table["policy_table"] = Json::Value(Json::objectValue);
-
- // 1st level
- Json::Value& policy_table = table["policy_table"];
- policy_table["module_config"] = Json::Value(Json::objectValue);
- policy_table["functional_groupings"] = Json::Value(Json::objectValue);
- policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue);
- policy_table["app_policies"] = Json::Value(Json::objectValue);
- policy_table["usage_and_error_counts"] = Json::Value(Json::objectValue);
- policy_table["device_data"] = Json::Value(Json::objectValue);
-
- // 'module_config' section start
- Json::Value& module_config = policy_table["module_config"];
- module_config["preloaded_pt"] = Json::Value(false);
- module_config["preloaded_date"] = Json::Value("");
- module_config["exchange_after_x_ignition_cycles"] = Json::Value(10);
- module_config["exchange_after_x_kilometers"] = Json::Value(100);
- module_config["exchange_after_x_days"] = Json::Value(5);
- module_config["timeout_after_x_seconds"] = Json::Value(500);
- module_config["seconds_between_retries"] = Json::Value(Json::arrayValue);
-
- Json::Value& seconds_between_retries =
- module_config["seconds_between_retries"];
- seconds_between_retries[0] = Json::Value(10);
- seconds_between_retries[1] = Json::Value(20);
- seconds_between_retries[2] = Json::Value(30);
- module_config["endpoints"] = Json::Value(Json::objectValue);
-
- Json::Value& endpoins = module_config["endpoints"];
- endpoins["0x00"] = Json::Value(Json::objectValue);
- endpoins["0x00"]["default"] = Json::Value(Json::arrayValue);
- endpoins["0x00"]["default"][0] =
- Json::Value("http://ford.com/cloud/default");
- module_config["notifications_per_minute_by_priority"] =
- Json::Value(Json::objectValue);
- module_config["notifications_per_minute_by_priority"]["emergency"] =
- Json::Value(1);
- module_config["notifications_per_minute_by_priority"]["navigation"] =
- Json::Value(2);
- module_config["notifications_per_minute_by_priority"]["VOICECOMM"] =
- Json::Value(3);
- module_config["notifications_per_minute_by_priority"]["communication"] =
- Json::Value(4);
- module_config["notifications_per_minute_by_priority"]["normal"] =
- Json::Value(5);
- module_config["notifications_per_minute_by_priority"]["none"] =
- Json::Value(6);
- module_config["subtle_notifications_per_minute_by_priority"] =
- Json::Value(Json::objectValue);
- module_config["subtle_notifications_per_minute_by_priority"]["emergency"] =
- Json::Value(7);
- module_config["subtle_notifications_per_minute_by_priority"]["navigation"] =
- Json::Value(8);
- module_config["subtle_notifications_per_minute_by_priority"]["VOICECOMM"] =
- Json::Value(9);
- module_config["subtle_notifications_per_minute_by_priority"]
- ["communication"] = Json::Value(10);
- module_config["subtle_notifications_per_minute_by_priority"]["normal"] =
- Json::Value(11);
- module_config["subtle_notifications_per_minute_by_priority"]["none"] =
- Json::Value(12);
- module_config["vehicle_make"] = Json::Value("");
- module_config["vehicle_model"] = Json::Value("");
- module_config["vehicle_year"] = Json::Value("");
- module_config["certificate"] = Json::Value("encrypted_certificate_content");
- // 'module_config' section end
-
- // 'functional_groupings' section start
- Json::Value& functional_groupings = policy_table["functional_groupings"];
- functional_groupings["default"] = Json::Value(Json::objectValue);
- Json::Value& default_group = functional_groupings["default"];
- default_group["rpcs"] = Json::Value(Json::objectValue);
- default_group["rpcs"]["Update"] = Json::Value(Json::objectValue);
- default_group["rpcs"]["Update"]["hmi_levels"] =
- Json::Value(Json::arrayValue);
- default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL");
- default_group["rpcs"]["Update"]["parameters"] =
- Json::Value(Json::arrayValue);
- default_group["rpcs"]["Update"]["parameters"][0] = Json::Value("speed");
-
- Json::Value& consumer_friendly_messages =
- policy_table["consumer_friendly_messages"];
- consumer_friendly_messages["version"] = Json::Value("some_msg_version");
- consumer_friendly_messages["messages"] = Json::Value(Json::objectValue);
- consumer_friendly_messages["messages"]["MSG_CODE"] =
- Json::Value(Json::objectValue);
- Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG_CODE"];
- msg1["languages"] = Json::Value(Json::objectValue);
- msg1["languages"]["en-us"] = Json::Value(Json::objectValue);
- // 'functional_groupings' section end
-
- // 'app_policies' section start
- Json::Value& app_policies = policy_table["app_policies"];
- app_policies["default"] = Json::Value(Json::objectValue);
- app_policies["default"]["priority"] = Json::Value("EMERGENCY");
- app_policies["default"]["memory_kb"] = Json::Value(50);
- app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(100);
- app_policies["default"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["default"]["groups"][0] = Json::Value("default");
- app_policies["default"]["priority"] = Json::Value("EMERGENCY");
- app_policies["default"]["is_revoked"] = Json::Value(true);
- app_policies["default"]["default_hmi"] = Json::Value("FULL");
- app_policies["default"]["keep_context"] = Json::Value(true);
- app_policies["default"]["steal_focus"] = Json::Value(true);
- app_policies["default"]["RequestType"] = Json::Value(Json::arrayValue);
-
- app_policies["pre_DataConsent"] = Json::Value(Json::objectValue);
- app_policies["pre_DataConsent"]["memory_kb"] = Json::Value(40);
- app_policies["pre_DataConsent"]["heart_beat_timeout_ms"] = Json::Value(90);
- app_policies["pre_DataConsent"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["pre_DataConsent"]["groups"][0] = Json::Value("default");
- app_policies["pre_DataConsent"]["priority"] = Json::Value("EMERGENCY");
- app_policies["pre_DataConsent"]["default_hmi"] = Json::Value("FULL");
- app_policies["pre_DataConsent"]["is_revoked"] = Json::Value(false);
- app_policies["pre_DataConsent"]["keep_context"] = Json::Value(true);
- app_policies["pre_DataConsent"]["steal_focus"] = Json::Value(true);
- app_policies["pre_DataConsent"]["RequestType"] =
- Json::Value(Json::arrayValue);
-
- app_policies["1234"] = Json::Value(Json::objectValue);
- app_policies["1234"]["memory_kb"] = Json::Value(150);
- app_policies["1234"]["heart_beat_timeout_ms"] = Json::Value(200);
- app_policies["1234"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["1234"]["groups"][0] = Json::Value("default");
- app_policies["1234"]["priority"] = Json::Value("EMERGENCY");
- app_policies["1234"]["default_hmi"] = Json::Value("FULL");
- app_policies["1234"]["is_revoked"] = Json::Value(true);
- app_policies["1234"]["keep_context"] = Json::Value(false);
- app_policies["1234"]["steal_focus"] = Json::Value(false);
- app_policies["1234"]["RequestType"] = Json::Value(Json::arrayValue);
- app_policies["1234"]["app_services"] = Json::Value(Json::objectValue);
- app_policies["1234"]["icon_url"] =
- Json::Value("http:://www.sdl.com/image.png");
- app_policies["1234"]["app_services"]["MEDIA"] =
- Json::Value(Json::objectValue);
- app_policies["1234"]["app_services"]["MEDIA"]["service_names"] =
- Json::Value(Json::arrayValue);
- app_policies["1234"]["app_services"]["MEDIA"]["service_names"][0] =
- Json::Value("SDL App");
- app_policies["1234"]["app_services"]["MEDIA"]["service_names"][1] =
- Json::Value("SDL Music");
- app_policies["1234"]["app_services"]["MEDIA"]["handled_rpcs"] =
- Json::Value(Json::arrayValue);
- app_policies["1234"]["app_services"]["MEDIA"]["handled_rpcs"][0] =
- Json::Value(Json::objectValue);
- app_policies["1234"]["app_services"]["MEDIA"]["handled_rpcs"][0]
- ["function_id"] = Json::Value(41);
-
- app_policies["device"] = Json::Value(Json::objectValue);
- app_policies["device"]["groups"] = Json::Value(Json::arrayValue);
- app_policies["device"]["groups"][0] = Json::Value("default");
- app_policies["device"]["priority"] = Json::Value("EMERGENCY");
- app_policies["device"]["is_revoked"] = Json::Value(true);
- app_policies["device"]["default_hmi"] = Json::Value("FULL");
- app_policies["device"]["keep_context"] = Json::Value(true);
- app_policies["device"]["steal_focus"] = Json::Value(true);
- // 'app_policies' section end
-
- Json::Value& usage_and_error_counts =
- policy_table["usage_and_error_counts"];
- usage_and_error_counts["app_level"] = Json::Value(Json::objectValue);
- usage_and_error_counts["app_level"]["some_app_id"] =
- Json::Value(Json::objectValue);
- usage_and_error_counts["app_level"]["some_app_id"]["count_of_tls_errors"] =
- Json::Value(5);
-
- Json::Value& device_data = policy_table["device_data"];
- device_data["device_id_hash_1"] = Json::Value(Json::objectValue);
- device_data["device_id_hash_2"] = Json::Value(Json::objectValue);
- device_data["device_id_hash_3"] = Json::Value(Json::objectValue);
- }
-
::testing::AssertionResult IsValid(const policy_table::Table& table) {
if (table.is_valid()) {
return ::testing::AssertionSuccess();
@@ -1812,252 +1667,77 @@ TEST_F(SQLPTRepresentationTest3, RemoveDB_RemoveDB_ExpectFileDeleted) {
EXPECT_FALSE(file_system::FileExists(path));
}
-// TODO {AKozoriz} : Snapshot must have module meta section, but test
-// generates snapshot without it.
TEST_F(SQLPTRepresentationTest,
- DISABLED_GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) {
- // Arrange
- Json::Value table(Json::objectValue);
- PolicyTableUpdatePrepare(table);
+ GenerateSnapshot_DefaultContentOfModuleMeta_MetaInfoPresentInSnapshot) {
+ policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson);
- policy_table::Table update(&table);
- update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE);
+ ASSERT_TRUE(IsValid(update));
+ EXPECT_TRUE(reps->Save(update));
- // Assert
- // ASSERT_TRUE(IsValid(update));
- ASSERT_TRUE(reps->Save(update));
+ std::shared_ptr<policy_table::Table> snapshot = reps->GenerateSnapshot();
+
+ auto expected_module_meta = GetDefaultSnapshotModuleMeta(update);
+ auto& snapshot_module_meta = snapshot->policy_table.module_meta;
+ EXPECT_EQ(expected_module_meta.toStyledString(),
+ snapshot_module_meta.ToJsonValue().toStyledString());
+}
+
+TEST_F(SQLPTRepresentationTest,
+ GenerateSnapshot_SetMetaInfo_NoSoftwareVersionInSnapshot) {
+ policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson);
+
+ ASSERT_TRUE(IsValid(update));
+ EXPECT_TRUE(reps->Save(update));
+ EXPECT_TRUE(reps->SetMetaInfo(kSoftwareVersion));
- // Act
std::shared_ptr<policy_table::Table> snapshot = reps->GenerateSnapshot();
- snapshot->SetPolicyTableType(rpc::policy_table_interface_base::PT_SNAPSHOT);
- // Remove fields which must be absent in snapshot
- table["policy_table"]["consumer_friendly_messages"].removeMember("messages");
- table["policy_table"]["app_policies"]["1234"].removeMember("default_hmi");
- table["policy_table"]["app_policies"]["1234"].removeMember("keep_context");
- table["policy_table"]["app_policies"]["1234"].removeMember("steal_focus");
- table["policy_table"]["app_policies"]["default"].removeMember("default_hmi");
- table["policy_table"]["app_policies"]["default"].removeMember("keep_context");
- table["policy_table"]["app_policies"]["default"].removeMember("steal_focus");
- table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember(
- "default_hmi");
- table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember(
- "keep_context");
- table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember(
- "steal_focus");
- table["policy_table"]["app_policies"]["device"].removeMember("default_hmi");
- table["policy_table"]["app_policies"]["device"].removeMember("keep_context");
- table["policy_table"]["app_policies"]["device"].removeMember("steal_focus");
- table["policy_table"]["app_policies"]["device"].removeMember("groups");
- table["policy_table"]["device_data"] = Json::Value(Json::objectValue);
- table["policy_table"]["module_meta"] = Json::Value(Json::objectValue);
- policy_table::Table expected(&table);
- Json::StreamWriterBuilder writer_builder;
- // Checks
- EXPECT_EQ(Json::writeString(writer_builder, expected.ToJsonValue()),
- Json::writeString(writer_builder, snapshot->ToJsonValue()));
- EXPECT_EQ(expected.ToJsonValue().toStyledString(),
- snapshot->ToJsonValue().toStyledString());
+
+ auto expected_module_meta = GetDefaultSnapshotModuleMeta(update);
+ auto& snapshot_module_meta = snapshot->policy_table.module_meta;
+ EXPECT_EQ(expected_module_meta.toStyledString(),
+ snapshot_module_meta.ToJsonValue().toStyledString());
}
-TEST_F(SQLPTRepresentationTest, Save_SetPolicyTableThenSave_ExpectSavedToPT) {
- // Arrange
- Json::Value table(Json::objectValue);
- PolicyTableUpdatePrepare(table);
+TEST_F(SQLPTRepresentationTest,
+ GenerateSnapshot_SetHardwareVersion_NoHardwareVersionInSnapshot) {
+ policy_table::Table update = LoadPreloadedPT(kSdlPreloadedPtJson);
- policy_table::Table update(&table);
- update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE);
- // Checks PT before Save
- policy_table::FunctionalGroupings func_groups;
- ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups));
- // Check functional groupings section
- EXPECT_EQ(0u, func_groups.size());
-
- policy_table::ApplicationPoliciesSection policies;
- GatherApplicationPoliciesSection(&policies);
- // Check ApplicationPoliciesSection
- EXPECT_EQ(0u, policies.apps.size());
- EXPECT_EQ(policy_table::Priority::P_EMERGENCY, policies.device.priority);
-
- policy_table::ModuleConfig config;
- GatherModuleConfig(&config);
- // Check Module config section
- EXPECT_TRUE(*config.preloaded_pt);
- EXPECT_EQ(0, config.exchange_after_x_ignition_cycles);
- EXPECT_EQ(0, config.exchange_after_x_kilometers);
- EXPECT_EQ(0, config.exchange_after_x_days);
- EXPECT_EQ(0, config.timeout_after_x_seconds);
- EXPECT_EQ("", static_cast<std::string>(*config.vehicle_make));
- EXPECT_EQ("", static_cast<std::string>(*config.vehicle_model));
- EXPECT_EQ("", static_cast<std::string>(*config.vehicle_year));
- EXPECT_EQ("", static_cast<std::string>(*config.preloaded_date));
- EXPECT_EQ("", static_cast<std::string>(*config.certificate));
- EXPECT_EQ(0u, config.seconds_between_retries.size());
- EXPECT_EQ(0u, config.endpoints.size());
- EXPECT_EQ(0u, config.notifications_per_minute_by_priority.size());
- EXPECT_EQ(0u, (*config.subtle_notifications_per_minute_by_priority).size());
-
- policy_table::ConsumerFriendlyMessages messages;
- GatherConsumerFriendlyMessages(&messages);
- EXPECT_EQ("0", static_cast<std::string>(messages.version));
-
- policy_table::DeviceData devices;
- GatherDeviceData(&devices);
- EXPECT_EQ(0u, devices.size());
-
- policy_table::UsageAndErrorCounts counts;
- GatherUsageAndErrorCounts(&counts);
- EXPECT_TRUE(0u == counts.app_level->size());
-
- // ASSERT_TRUE(IsValid(update));
- // Act
- ASSERT_TRUE(reps->Save(update));
+ ASSERT_TRUE(IsValid(update));
+ EXPECT_TRUE(reps->Save(update));
+ reps->SetHardwareVersion(kHardwareVersion);
- // Check Functional Groupings
- ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups));
- // Checks
- EXPECT_EQ(1u, func_groups.size());
- policy_table::FunctionalGroupings::iterator func_groups_iter =
- func_groups.find("default");
- ASSERT_TRUE(func_groups.end() != func_groups_iter);
- policy_table::Rpcs& rpcs = func_groups_iter->second;
- EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt));
- policy_table::Rpc& rpc = rpcs.rpcs;
- EXPECT_EQ(1u, rpc.size());
- policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update");
- EXPECT_TRUE(rpc.end() != rpc_iter);
- const policy_table::HmiLevels& hmi_levels = rpc_iter->second.hmi_levels;
- EXPECT_EQ(1u, hmi_levels.size());
- EXPECT_TRUE(hmi_levels.end() != std::find(hmi_levels.begin(),
- hmi_levels.end(),
- policy_table::HmiLevel::HL_FULL));
-
- const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters);
- EXPECT_EQ(1u, parameters.size());
- EXPECT_TRUE(parameters.end() !=
- std::find(parameters.begin(),
- parameters.end(),
- policy_table::EnumToJsonString(
- policy_table::Parameter::P_SPEED)));
- // Check Application Policies Section
- GatherApplicationPoliciesSection(&policies);
- const uint32_t apps_size = 3u;
-
- rpc::String<1ul, 255ul> str("default");
- policy_table::Strings groups;
- groups.push_back(str);
- CheckAppPoliciesSection(policies,
- apps_size,
- policy_table::Priority::P_EMERGENCY,
- "1234",
- 150u,
- 200u,
- groups);
- CheckAppPoliciesSection(policies,
- apps_size,
- policy_table::Priority::P_EMERGENCY,
- "default",
- 50u,
- 100u,
- groups);
- CheckAppPoliciesSection(policies,
- apps_size,
- policy_table::Priority::P_EMERGENCY,
- "pre_DataConsent",
- 40u,
- 90u,
- groups);
- CheckAppPoliciesSection(policies,
- apps_size,
- policy_table::Priority::P_EMERGENCY,
- "device",
- 0u,
- 0u,
- groups);
-
- CheckAppGroups("1234", groups);
- CheckAppGroups("default", groups);
- CheckAppGroups("pre_DataConsent", groups);
-
- GatherModuleConfig(&config);
- // Check Module Config section
- ASSERT_FALSE(*config.preloaded_pt);
- ASSERT_EQ("encrypted_certificate_content",
- static_cast<std::string>(*config.certificate));
- ASSERT_EQ("", static_cast<std::string>(*config.preloaded_date));
- ASSERT_EQ("", static_cast<std::string>(*config.vehicle_year));
- ASSERT_EQ("", static_cast<std::string>(*config.vehicle_model));
- ASSERT_EQ("", static_cast<std::string>(*config.vehicle_make));
- ASSERT_EQ(10, config.exchange_after_x_ignition_cycles);
- ASSERT_EQ(100, config.exchange_after_x_kilometers);
- ASSERT_EQ(5, config.exchange_after_x_days);
- ASSERT_EQ(500, config.timeout_after_x_seconds);
- ASSERT_EQ(3u, config.seconds_between_retries.size());
- ASSERT_EQ(10, config.seconds_between_retries[0]);
- ASSERT_EQ(20, config.seconds_between_retries[1]);
- ASSERT_EQ(30, config.seconds_between_retries[2]);
- ASSERT_EQ(6u, config.notifications_per_minute_by_priority.size());
- ASSERT_EQ(1, config.notifications_per_minute_by_priority["emergency"]);
- ASSERT_EQ(2, config.notifications_per_minute_by_priority["navigation"]);
- ASSERT_EQ(3, config.notifications_per_minute_by_priority["VOICECOMM"]);
- ASSERT_EQ(4, config.notifications_per_minute_by_priority["communication"]);
- ASSERT_EQ(5, config.notifications_per_minute_by_priority["normal"]);
- ASSERT_EQ(6, config.notifications_per_minute_by_priority["none"]);
- ASSERT_EQ(6u, (*config.subtle_notifications_per_minute_by_priority).size());
- ASSERT_EQ(7,
- (*config.subtle_notifications_per_minute_by_priority)["emergency"]);
- ASSERT_EQ(
- 8, (*config.subtle_notifications_per_minute_by_priority)["navigation"]);
- ASSERT_EQ(9,
- (*config.subtle_notifications_per_minute_by_priority)["VOICECOMM"]);
- ASSERT_EQ(
- 10,
- (*config.subtle_notifications_per_minute_by_priority)["communication"]);
- ASSERT_EQ(11,
- (*config.subtle_notifications_per_minute_by_priority)["normal"]);
- ASSERT_EQ(12, (*config.subtle_notifications_per_minute_by_priority)["none"]);
- EXPECT_EQ(1u, config.endpoints.size());
- policy_table::ServiceEndpoints& service_endpoints = config.endpoints;
- EXPECT_EQ("0x00", service_endpoints.begin()->first);
- policy_table::URLList& url_list = service_endpoints.begin()->second;
- EXPECT_EQ("default", url_list.begin()->first);
- policy_table::URL& url = url_list.begin()->second;
- EXPECT_EQ("http://ford.com/cloud/default", static_cast<std::string>(url[0]));
-
- GatherConsumerFriendlyMessages(&messages);
- EXPECT_EQ("some_msg_version", static_cast<std::string>(messages.version));
- EXPECT_TRUE(0u != messages.messages->size());
- EXPECT_TRUE(0u != (*messages.messages)["MSG_CODE"].languages.size());
-
- GatherUsageAndErrorCounts(&counts);
- EXPECT_FALSE(0u == counts.app_level->size());
- EXPECT_EQ(5u, (*counts.app_level)["some_app_id"].count_of_tls_errors);
-
- GatherDeviceData(&devices);
- EXPECT_EQ(3u, devices.size());
-
- const std::string kAppId = "1234";
- const std::string kServiceType = "MEDIA";
- policy_table::AppServiceParameters app_service_parameters;
- GatherAppServiceParameters(kAppId, &app_service_parameters);
- ASSERT_FALSE(app_service_parameters.find(kServiceType) ==
- app_service_parameters.end());
- auto service_names = *(app_service_parameters[kServiceType].service_names);
- EXPECT_TRUE(service_names.is_initialized());
- ASSERT_EQ(service_names.size(), 2u);
- EXPECT_EQ(static_cast<std::string>(service_names[0]), "SDL App");
- EXPECT_EQ(static_cast<std::string>(service_names[1]), "SDL Music");
-
- auto handled_rpcs = app_service_parameters[kServiceType].handled_rpcs;
-
- EXPECT_TRUE(handled_rpcs.is_initialized());
- EXPECT_EQ(handled_rpcs[0].function_id, 41);
-
- policy_table::ApplicationPolicies& apps = policies.apps;
- auto icon_url = *(apps[kAppId].icon_url);
-
- EXPECT_EQ(std::string(icon_url), "http:://www.sdl.com/image.png");
+ std::shared_ptr<policy_table::Table> snapshot = reps->GenerateSnapshot();
+
+ auto expected_module_meta = GetDefaultSnapshotModuleMeta(update);
+ auto& snapshot_module_meta = snapshot->policy_table.module_meta;
+ EXPECT_EQ(expected_module_meta.toStyledString(),
+ snapshot_module_meta.ToJsonValue().toStyledString());
}
+TEST_F(SQLPTRepresentationTest,
+ SetMetaInfo_SetSoftwareVersion_ValueIsSetInModuleMeta) {
+ EXPECT_TRUE(reps->SetMetaInfo(kSoftwareVersion));
+
+ utils::dbms::SQLQuery query(reps->db());
+ const std::string query_select_ccpu =
+ "SELECT `ccpu_version` FROM `module_meta`";
+
+ query.Prepare(query_select_ccpu);
+ query.Next();
+ EXPECT_EQ(kSoftwareVersion, query.GetString(0));
+}
+
+TEST_F(SQLPTRepresentationTest, SetHardwareVersion_ValueIsSetInModuleMeta) {
+ reps->SetHardwareVersion(kHardwareVersion);
+
+ utils::dbms::SQLQuery query(reps->db());
+ const std::string query_select_hardware_version =
+ "SELECT `hardware_version` FROM `module_meta`";
+
+ query.Prepare(query_select_hardware_version);
+ query.Next();
+ EXPECT_EQ(kHardwareVersion, query.GetString(0));
+}
} // namespace policy_test
} // namespace components
} // namespace test
diff --git a/src/components/protocol/src/bson_object_keys.cc b/src/components/protocol/src/bson_object_keys.cc
index acafd3dbd2..7e1656955f 100644
--- a/src/components/protocol/src/bson_object_keys.cc
+++ b/src/components/protocol/src/bson_object_keys.cc
@@ -19,6 +19,12 @@ const char* tcp_ip_address = "tcpIpAddress";
const char* tcp_port = "tcpPort";
const char* reason = "reason";
const char* auth_token = "authToken";
+const char* vehicle_make = "make";
+const char* vehicle_model = "model";
+const char* vehicle_model_year = "modelYear";
+const char* vehicle_trim = "trim";
+const char* vehicle_system_software_version = "systemSoftwareVersion";
+const char* vehicle_system_hardware_version = "systemHardwareVersion";
} // namespace strings
diff --git a/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h b/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h
index e54608bb9e..02c96fc3c7 100644
--- a/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h
+++ b/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h
@@ -375,12 +375,15 @@ class ProtocolHandlerImpl
* \param protocol_version Version of protocol used for communication
* \param service_type Type of session: RPC or BULK Data. RPC by default
* \param reason String stating the reason for the rejecting the start service
+ * \param full_version full protocol version (major.minor.patch) used by the
+ * mobile proxy
*/
void SendStartSessionNAck(ConnectionID connection_id,
uint8_t session_id,
uint8_t protocol_version,
uint8_t service_type,
- const std::string& reason);
+ const std::string& reason,
+ utils::SemanticVersion& full_version);
/**
* \brief Sends fail of starting session to mobile application
@@ -390,13 +393,16 @@ class ProtocolHandlerImpl
* \param service_type Type of session: RPC or BULK Data. RPC by default
* \param rejected_params List of rejected params to send in payload
* \param reason String stating the reason for the rejecting the start service
+ * \param full_version full protocol version (major.minor.patch) used by the
+ * mobile proxy
*/
void SendStartSessionNAck(ConnectionID connection_id,
uint8_t session_id,
uint8_t protocol_version,
uint8_t service_type,
std::vector<std::string>& rejectedParams,
- const std::string& reason);
+ const std::string& reason,
+ utils::SemanticVersion& full_version);
/**
* \brief Sends acknowledgement of end session/service to mobile application
@@ -456,10 +462,15 @@ class ProtocolHandlerImpl
* Only valid when generated_session_id is 0. Note, even if
* generated_session_id is 0, the list may be empty.
*/
+ DEPRECATED
void NotifySessionStarted(const SessionContext& context,
std::vector<std::string>& rejected_params,
const std::string err_reason) OVERRIDE;
+ void NotifySessionStarted(SessionContext& context,
+ std::vector<std::string>& rejected_params,
+ const std::string err_reason) OVERRIDE;
+
#ifdef BUILD_TESTS
const impl::FromMobileQueue& get_from_mobile_queue() const {
return raw_ford_messages_from_mobile_;
@@ -733,6 +744,24 @@ class ProtocolHandlerImpl
const uint8_t session_id,
const bool protection) const;
+ /**
+ * @brief Writes available protocol vehicle data into structured bson
+ * @param params bson params to write into
+ * @param data data to write
+ */
+ void WriteProtocolVehicleData(
+ BsonObject& params, const connection_handler::ProtocolVehicleData& data);
+
+ /**
+ * \brief Parces full protocol version from start service message headers bson
+ * \param full_version full protocol version (major.minor.patch) used by the
+ * mobile proxy
+ * \param packet Sart service message
+ * \return true if version successfully parsed, otherwise false
+ */
+ bool ParseFullVersion(utils::SemanticVersion& full_version,
+ const ProtocolFramePtr& packet) const;
+
const ProtocolHandlerSettings& settings_;
/**
diff --git a/src/components/protocol_handler/src/handshake_handler.cc b/src/components/protocol_handler/src/handshake_handler.cc
index 4d306fd330..78f324e0ae 100644
--- a/src/components/protocol_handler/src/handshake_handler.cc
+++ b/src/components/protocol_handler/src/handshake_handler.cc
@@ -232,7 +232,8 @@ void HandshakeHandler::ProcessSuccessfulHandshake(const uint32_t connection_key,
context_.service_type_,
(is_service_already_protected)
? "Service is already protected"
- : "Service cannot be protected");
+ : "Service cannot be protected",
+ full_version_);
}
}
@@ -284,7 +285,8 @@ void HandshakeHandler::ProcessFailedHandshake(BsonObject& params,
context_.new_session_id_,
protocol_version_,
context_.service_type_,
- reason_msg + (err_reason.empty() ? "" : ": " + err_reason));
+ reason_msg + (err_reason.empty() ? "" : ": " + err_reason),
+ full_version_);
}
}
diff --git a/src/components/protocol_handler/src/incoming_data_handler.cc b/src/components/protocol_handler/src/incoming_data_handler.cc
index 08997acaac..c7a3f095a8 100644
--- a/src/components/protocol_handler/src/incoming_data_handler.cc
+++ b/src/components/protocol_handler/src/incoming_data_handler.cc
@@ -63,8 +63,8 @@ ProtocolFramePtrList IncomingDataHandler::ProcessData(
out_result = RESULT_FAIL;
return ProtocolFramePtrList();
}
- SDL_LOG_INFO("Processing incoming data of size "
- << tm_message_size << " for connection " << connection_id);
+ SDL_LOG_TRACE("Processing incoming data of size "
+ << tm_message_size << " for connection " << connection_id);
ConnectionsDataMap::iterator it = connections_data_.find(connection_id);
if (connections_data_.end() == it) {
SDL_LOG_WARN("ProcessData requested for unknown connection");
@@ -73,16 +73,16 @@ ProtocolFramePtrList IncomingDataHandler::ProcessData(
}
std::vector<uint8_t>& connection_data = it->second;
connection_data.insert(connection_data.end(), data, data + tm_message_size);
- SDL_LOG_DEBUG("Total data size for connection " << connection_id << " is "
+ SDL_LOG_TRACE("Total data size for connection " << connection_id << " is "
<< connection_data.size());
ProtocolFramePtrList out_frames;
*malformed_occurrence = 0;
out_result = CreateFrame(
connection_data, out_frames, *malformed_occurrence, connection_id);
- SDL_LOG_DEBUG("New data size for connection " << connection_id << " is "
+ SDL_LOG_TRACE("New data size for connection " << connection_id << " is "
<< connection_data.size());
if (!out_frames.empty()) {
- SDL_LOG_INFO("Created and passed " << out_frames.size() << " packets");
+ SDL_LOG_TRACE("Created and passed " << out_frames.size() << " packets");
} else {
if (RESULT_DEFERRED == out_result) {
SDL_LOG_DEBUG(
@@ -156,7 +156,7 @@ RESULT_CODE IncomingDataHandler::CreateFrame(
<< std::hex << static_cast<const void*>(&*data_it));
continue;
}
- SDL_LOG_DEBUG("Payload size " << header_.dataSize);
+ SDL_LOG_TRACE("Payload size " << header_.dataSize);
const uint32_t packet_size = GetPacketSize(header_);
if (packet_size == 0) {
SDL_LOG_WARN("Null packet size");
@@ -167,14 +167,14 @@ RESULT_CODE IncomingDataHandler::CreateFrame(
continue;
}
if (data_size < packet_size) {
- SDL_LOG_DEBUG("Packet data is not available yet");
+ SDL_LOG_TRACE("Packet data is not available yet");
incoming_data.erase(incoming_data.begin(), data_it);
return RESULT_DEFERRED;
}
ProtocolFramePtr frame(new protocol_handler::ProtocolPacket(connection_id));
const RESULT_CODE deserialize_result =
frame->deserializePacket(&*data_it, packet_size);
- SDL_LOG_DEBUG("Deserialized frame " << frame);
+ SDL_LOG_TRACE("Deserialized frame " << frame);
if (deserialize_result != RESULT_OK) {
SDL_LOG_WARN("Packet deserialization failed");
incoming_data.erase(incoming_data.begin(), data_it);
@@ -183,7 +183,7 @@ RESULT_CODE IncomingDataHandler::CreateFrame(
out_frames.push_back(frame);
last_portion_of_data_was_malformed_ = false;
- SDL_LOG_DEBUG("Frame added. "
+ SDL_LOG_TRACE("Frame added. "
<< "Connection ID " << connection_id);
data_it += packet_size;
diff --git a/src/components/protocol_handler/src/multiframe_builder.cc b/src/components/protocol_handler/src/multiframe_builder.cc
index 0cffe724c7..875b5b5933 100644
--- a/src/components/protocol_handler/src/multiframe_builder.cc
+++ b/src/components/protocol_handler/src/multiframe_builder.cc
@@ -91,8 +91,8 @@ bool MultiFrameBuilder::RemoveConnection(const ConnectionID connection_id) {
ProtocolFramePtrList MultiFrameBuilder::PopMultiframes() {
SDL_LOG_AUTO_TRACE();
sync_primitives::AutoLock lock(multiframes_map_lock_);
- SDL_LOG_DEBUG("Current state is: " << multiframes_map_);
- SDL_LOG_DEBUG("Current multiframe map size is: " << multiframes_map_.size());
+ SDL_LOG_TRACE("Current state is: " << multiframes_map_);
+ SDL_LOG_TRACE("Current multiframe map size is: " << multiframes_map_.size());
ProtocolFramePtrList outpute_frame_list;
for (MultiFrameMap::iterator connection_it = multiframes_map_.begin();
connection_it != multiframes_map_.end();
@@ -115,7 +115,7 @@ ProtocolFramePtrList MultiFrameBuilder::PopMultiframes() {
if (frame && frame->frame_data() == FRAME_DATA_LAST_CONSECUTIVE &&
frame->payload_size() > 0u) {
- SDL_LOG_DEBUG("Ready frame: " << frame);
+ SDL_LOG_TRACE("Ready frame: " << frame);
outpute_frame_list.push_back(frame);
messageId_map.erase(messageId_it++);
continue;
@@ -136,7 +136,7 @@ ProtocolFramePtrList MultiFrameBuilder::PopMultiframes() {
} // iteration over messageId_map
} // iteration over session_map
} // iteration over multiframes_map_
- SDL_LOG_DEBUG("Result frames count: " << outpute_frame_list.size());
+ SDL_LOG_TRACE("Result frames count: " << outpute_frame_list.size());
return outpute_frame_list;
}
@@ -164,8 +164,8 @@ RESULT_CODE MultiFrameBuilder::AddFrame(const ProtocolFramePtr packet) {
RESULT_CODE MultiFrameBuilder::HandleFirstFrame(const ProtocolFramePtr packet) {
DCHECK_OR_RETURN(packet->frame_type() == FRAME_TYPE_FIRST, RESULT_FAIL);
sync_primitives::AutoLock lock(multiframes_map_lock_);
- SDL_LOG_DEBUG("Waiting : " << multiframes_map_);
- SDL_LOG_DEBUG("Handling FIRST frame: " << packet);
+ SDL_LOG_TRACE("Waiting : " << multiframes_map_);
+ SDL_LOG_TRACE("Handling FIRST frame: " << packet);
if (packet->payload_size() != 0u) {
SDL_LOG_ERROR("First frame shall have no data:" << packet);
return RESULT_FAIL;
@@ -193,7 +193,7 @@ RESULT_CODE MultiFrameBuilder::HandleFirstFrame(const ProtocolFramePtr packet) {
return RESULT_FAIL;
}
- SDL_LOG_DEBUG("Start waiting frames for connection_id: "
+ SDL_LOG_TRACE("Start waiting frames for connection_id: "
<< connection_id
<< ", session_id: " << static_cast<int>(session_id)
<< ", message_id: " << message_id);
@@ -240,7 +240,7 @@ RESULT_CODE MultiFrameBuilder::HandleConsecutiveFrame(
if (is_last_consecutive) {
// TODO(EZamakhov): implement count of frames and result size verification
- SDL_LOG_DEBUG("Last CONSECUTIVE frame");
+ SDL_LOG_TRACE("Last CONSECUTIVE frame");
} else {
uint8_t previous_frame_data = assembling_frame->frame_data();
if (previous_frame_data == std::numeric_limits<uint8_t>::max()) {
@@ -275,8 +275,8 @@ RESULT_CODE MultiFrameBuilder::HandleConsecutiveFrame(
SDL_LOG_ERROR("Failed to append frame for multiframe message.");
return RESULT_FAIL;
}
- SDL_LOG_INFO("Assembled frame with payload size: "
- << assembling_frame->payload_size());
+ SDL_LOG_TRACE("Assembled frame with payload size: "
+ << assembling_frame->payload_size());
frame_data.append_time = date_time::getCurrentTime();
return RESULT_OK;
}
diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc
index f3bb3d1e91..ae1721c6c0 100644
--- a/src/components/protocol_handler/src/protocol_handler_impl.cc
+++ b/src/components/protocol_handler/src/protocol_handler_impl.cc
@@ -54,10 +54,11 @@ SDL_CREATE_LOG_VARIABLE("ProtocolHandler")
const size_t kStackSize = 131072;
-const utils::SemanticVersion default_protocol_version(5, 3, 0);
+const utils::SemanticVersion default_protocol_version(5, 4, 0);
const utils::SemanticVersion min_multiple_transports_version(5, 1, 0);
const utils::SemanticVersion min_cloud_app_version(5, 2, 0);
const utils::SemanticVersion min_reason_param_version(5, 3, 0);
+const utils::SemanticVersion min_vehicle_data_version(5, 4, 0);
ProtocolHandlerImpl::ProtocolHandlerImpl(
const ProtocolHandlerSettings& settings,
@@ -226,6 +227,39 @@ void ProtocolHandlerImpl::SendStartSessionAck(
bson_object_deinitialize(&empty_param);
}
+void ProtocolHandlerImpl::WriteProtocolVehicleData(
+ BsonObject& params, const connection_handler::ProtocolVehicleData& data) {
+ auto write_string_to_bson = [&params](const std::string& param_name,
+ const std::string& param_value) {
+ if (param_value.empty()) {
+ return;
+ }
+
+ const uint16_t max_string_length = 500;
+ char value_buffer[max_string_length + 1]; // extra byte for NULL symbol
+ strncpy(value_buffer, param_value.c_str(), sizeof(value_buffer));
+ value_buffer[max_string_length] = 0;
+
+ if (bson_object_put_string(&params, param_name.c_str(), value_buffer)) {
+ SDL_LOG_DEBUG("Parameter "
+ << param_name << " has been written to bson with value: "
+ << bson_object_get_string(&params, param_name.c_str()));
+ } else {
+ SDL_LOG_DEBUG("Failed to write parameter " << param_name
+ << " into bson structure");
+ }
+ };
+
+ write_string_to_bson(strings::vehicle_make, data.vehicle_make);
+ write_string_to_bson(strings::vehicle_model, data.vehicle_model);
+ write_string_to_bson(strings::vehicle_model_year, data.vehicle_year);
+ write_string_to_bson(strings::vehicle_trim, data.vehicle_trim);
+ write_string_to_bson(strings::vehicle_system_software_version,
+ data.vehicle_system_software_version);
+ write_string_to_bson(strings::vehicle_system_hardware_version,
+ data.vehicle_system_hardware_version);
+}
+
void ProtocolHandlerImpl::SendStartSessionAck(
ConnectionID connection_id,
uint8_t session_id,
@@ -289,6 +323,13 @@ void ProtocolHandlerImpl::SendStartSessionAck(
<< static_cast<int32_t>(bson_object_get_int64(&params, strings::mtu)));
if (serviceTypeValue == kRpc) {
+ SDL_LOG_DEBUG("Collecting protocol vehicle data");
+ connection_handler::ProtocolVehicleData data;
+ if (full_version >= min_vehicle_data_version &&
+ connection_handler_.GetProtocolVehicleData(data)) {
+ WriteProtocolVehicleData(params, data);
+ }
+
// Hash ID is only used in RPC case
const bool hash_written = bson_object_put_int32(
&params, strings::hash_id, static_cast<int32_t>(hash_id));
@@ -440,18 +481,21 @@ void ProtocolHandlerImpl::SendStartSessionAck(
}
}
-void ProtocolHandlerImpl::SendStartSessionNAck(ConnectionID connection_id,
- uint8_t session_id,
- uint8_t protocol_version,
- uint8_t service_type,
- const std::string& reason) {
+void ProtocolHandlerImpl::SendStartSessionNAck(
+ ConnectionID connection_id,
+ uint8_t session_id,
+ uint8_t protocol_version,
+ uint8_t service_type,
+ const std::string& reason,
+ utils::SemanticVersion& full_version) {
std::vector<std::string> rejectedParams;
SendStartSessionNAck(connection_id,
session_id,
protocol_version,
service_type,
rejectedParams,
- reason);
+ reason,
+ full_version);
}
void ProtocolHandlerImpl::SendStartSessionNAck(
@@ -460,9 +504,18 @@ void ProtocolHandlerImpl::SendStartSessionNAck(
uint8_t protocol_version,
uint8_t service_type,
std::vector<std::string>& rejectedParams,
- const std::string& reason) {
+ const std::string& reason,
+ utils::SemanticVersion& full_version) {
SDL_LOG_AUTO_TRACE();
+ if (!full_version.isValid()) {
+ if (!session_observer_.ProtocolVersionUsed(
+ connection_id, session_id, full_version)) {
+ SDL_LOG_WARN("Connection: " << connection_id << " and/or session: "
+ << session_id << "no longer exist(s).");
+ }
+ }
+
ProtocolFramePtr ptr(
new protocol_handler::ProtocolPacket(connection_id,
protocol_version,
@@ -476,14 +529,6 @@ void ProtocolHandlerImpl::SendStartSessionNAck(
uint8_t maxProtocolVersion = SupportedSDLProtocolVersion();
- utils::SemanticVersion full_version;
- if (!session_observer_.ProtocolVersionUsed(
- connection_id, session_id, full_version)) {
- SDL_LOG_WARN("Connection: " << connection_id << " and/or session: "
- << session_id << "no longer exist(s).");
- return;
- }
-
if (protocol_version >= PROTOCOL_VERSION_5 &&
maxProtocolVersion >= PROTOCOL_VERSION_5) {
BsonObject payloadObj;
@@ -976,7 +1021,7 @@ void ProtocolHandlerImpl::OnTMMessageReceived(const RawMessagePtr tm_message) {
}
const uint32_t connection_key = tm_message->connection_key();
- SDL_LOG_DEBUG("Received data from TM with connection id "
+ SDL_LOG_TRACE("Received data from TM with connection id "
<< connection_key << " msg data_size "
<< tm_message->data_size());
@@ -985,7 +1030,7 @@ void ProtocolHandlerImpl::OnTMMessageReceived(const RawMessagePtr tm_message) {
const ProtocolFramePtrList protocol_frames =
incoming_data_handler_.ProcessData(
*tm_message, result, &malformed_occurs);
- SDL_LOG_DEBUG("Processed " << protocol_frames.size() << " frames");
+ SDL_LOG_TRACE("Processed " << protocol_frames.size() << " frames");
if (result != RESULT_OK) {
if (result == RESULT_MALFORMED_OCCURS) {
SDL_LOG_WARN("Malformed message occurs, connection id "
@@ -1377,7 +1422,7 @@ RESULT_CODE ProtocolHandlerImpl::SendMultiFrameMessage(
const ProtocolFramePtr firstPacket(
new protocol_handler::ProtocolPacket(connection_id,
protocol_version,
- needs_encryption,
+ false,
FRAME_TYPE_FIRST,
service_type,
FRAME_DATA_FIRST,
@@ -1419,7 +1464,7 @@ RESULT_CODE ProtocolHandlerImpl::SendMultiFrameMessage(
RESULT_CODE ProtocolHandlerImpl::HandleMessage(const ProtocolFramePtr packet) {
DCHECK_OR_RETURN(packet, RESULT_UNKNOWN);
- SDL_LOG_DEBUG("Handling message " << packet);
+ SDL_LOG_TRACE("Handling message " << packet);
switch (packet->frame_type()) {
case FRAME_TYPE_CONTROL:
SDL_LOG_TRACE("FRAME_TYPE_CONTROL");
@@ -1443,7 +1488,7 @@ RESULT_CODE ProtocolHandlerImpl::HandleSingleFrameMessage(
const ProtocolFramePtr packet) {
SDL_LOG_AUTO_TRACE();
- SDL_LOG_DEBUG(
+ SDL_LOG_TRACE(
"FRAME_TYPE_SINGLE message of size "
<< packet->data_size() << "; message "
<< utils::ConvertBinaryDataToString(packet->data(), packet->data_size()));
@@ -1737,8 +1782,17 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageStartSession(
reason += " Allowed only in unprotected mode";
}
- SendStartSessionNAck(
- connection_id, session_id, protocol_version, service_type, reason);
+ utils::SemanticVersion version;
+ if (packet->service_type() == kRpc && packet->data() != NULL) {
+ ParseFullVersion(version, packet);
+ }
+
+ SendStartSessionNAck(connection_id,
+ session_id,
+ protocol_version,
+ service_type,
+ reason,
+ version);
return RESULT_OK;
}
@@ -1814,8 +1868,34 @@ RESULT_CODE ProtocolHandlerImpl::HandleControlMessageRegisterSecondaryTransport(
return RESULT_OK;
}
+bool ProtocolHandlerImpl::ParseFullVersion(
+ utils::SemanticVersion& full_version,
+ const ProtocolFramePtr& packet) const {
+ SDL_LOG_AUTO_TRACE();
+
+ BsonObject request_params;
+ size_t request_params_size = bson_object_from_bytes_len(
+ &request_params, packet->data(), packet->total_data_bytes());
+ if (request_params_size > 0) {
+ char* version_param =
+ bson_object_get_string(&request_params, strings::protocol_version);
+ std::string version_string(version_param == NULL ? "" : version_param);
+ full_version = version_string;
+
+ // Constructed payloads added in Protocol v5
+ if (full_version.major_version_ < PROTOCOL_VERSION_5) {
+ return false;
+ }
+ bson_object_deinitialize(&request_params);
+ } else {
+ SDL_LOG_WARN("Failed to parse start service packet for version string");
+ }
+
+ return true;
+}
+
void ProtocolHandlerImpl::NotifySessionStarted(
- const SessionContext& context,
+ SessionContext& context,
std::vector<std::string>& rejected_params,
const std::string err_reason) {
SDL_LOG_AUTO_TRACE();
@@ -1835,8 +1915,23 @@ void ProtocolHandlerImpl::NotifySessionStarted(
const ServiceType service_type = ServiceTypeFromByte(packet->service_type());
const uint8_t protocol_version = packet->protocol_version();
+ utils::SemanticVersion full_version;
+
+ // Can't check protocol_version because the first packet is v1, but there
+ // could still be a payload, in which case we can get the real protocol
+ // version
+ if (packet->service_type() == kRpc && packet->data() != NULL) {
+ if (ParseFullVersion(full_version, packet)) {
+ const auto connection_key = session_observer_.KeyFromPair(
+ packet->connection_id(), context.new_session_id_);
+ connection_handler_.BindProtocolVersionWithSession(connection_key,
+ full_version);
+ } else {
+ rejected_params.push_back(std::string(strings::protocol_version));
+ }
+ }
- if (0 == context.new_session_id_) {
+ if (context.is_start_session_failed_ || !context.new_session_id_) {
SDL_LOG_WARN("Refused by session_observer to create service "
<< static_cast<int32_t>(service_type) << " type.");
const auto session_id = packet->session_id();
@@ -1851,7 +1946,8 @@ void ProtocolHandlerImpl::NotifySessionStarted(
protocol_version,
packet->service_type(),
rejected_params,
- err_reason);
+ err_reason,
+ full_version);
return;
}
@@ -1901,38 +1997,6 @@ void ProtocolHandlerImpl::NotifySessionStarted(
}
}
- std::shared_ptr<utils::SemanticVersion> fullVersion;
-
- // Can't check protocol_version because the first packet is v1, but there
- // could still be a payload, in which case we can get the real protocol
- // version
- if (packet->service_type() == kRpc && packet->data() != NULL) {
- BsonObject request_params;
- size_t request_params_size = bson_object_from_bytes_len(
- &request_params, packet->data(), packet->total_data_bytes());
- if (request_params_size > 0) {
- char* version_param =
- bson_object_get_string(&request_params, strings::protocol_version);
- std::string version_string(version_param == NULL ? "" : version_param);
- fullVersion = std::make_shared<utils::SemanticVersion>(version_string);
-
- const auto connection_key = session_observer_.KeyFromPair(
- packet->connection_id(), context.new_session_id_);
- connection_handler_.BindProtocolVersionWithSession(connection_key,
- *fullVersion);
- // Constructed payloads added in Protocol v5
- if (fullVersion->major_version_ < PROTOCOL_VERSION_5) {
- rejected_params.push_back(std::string(strings::protocol_version));
- }
- bson_object_deinitialize(&request_params);
- } else {
- SDL_LOG_WARN("Failed to parse start service packet for version string");
- fullVersion = std::make_shared<utils::SemanticVersion>();
- }
- } else {
- fullVersion = std::make_shared<utils::SemanticVersion>();
- }
-
#ifdef ENABLE_SECURITY
// for packet is encrypted and security plugin is enable
if (context.is_protected_ && security_manager_) {
@@ -1943,7 +2007,7 @@ void ProtocolHandlerImpl::NotifySessionStarted(
std::make_shared<HandshakeHandler>(
*this,
session_observer_,
- *fullVersion,
+ full_version,
context,
packet->protocol_version(),
start_session_ack_params,
@@ -1969,12 +2033,20 @@ void ProtocolHandlerImpl::NotifySessionStarted(
}
if (!rejected_params.empty()) {
+ service_status_update_handler_->OnServiceUpdate(
+ connection_key,
+ context.service_type_,
+ ServiceStatus::SERVICE_START_FAILED);
SendStartSessionNAck(context.connection_id_,
packet->session_id(),
protocol_version,
packet->service_type(),
rejected_params,
- "SSL Handshake failed due to rejected parameters");
+ "SSL Handshake failed due to rejected parameters",
+ full_version);
+ if (packet->service_type() != kRpc) {
+ context.is_start_session_failed_ = true;
+ }
} else if (ssl_context->IsInitCompleted()) {
// mark service as protected
session_observer_.SetProtectionFlag(connection_key, service_type);
@@ -1989,7 +2061,7 @@ void ProtocolHandlerImpl::NotifySessionStarted(
context.hash_id_,
packet->service_type(),
PROTECTION_ON,
- *fullVersion,
+ full_version,
*start_session_ack_params);
} else {
SDL_LOG_DEBUG("Adding Handshake handler to listeners: " << handler.get());
@@ -2003,12 +2075,20 @@ void ProtocolHandlerImpl::NotifySessionStarted(
if (!security_manager_->IsSystemTimeProviderReady()) {
security_manager_->RemoveListener(listener);
+ service_status_update_handler_->OnServiceUpdate(
+ connection_key,
+ context.service_type_,
+ ServiceStatus::SERVICE_START_FAILED);
SendStartSessionNAck(context.connection_id_,
packet->session_id(),
protocol_version,
packet->service_type(),
rejected_params,
- "System time provider is not ready");
+ "System time provider is not ready",
+ full_version);
+ if (packet->service_type() != kRpc) {
+ context.is_start_session_failed_ = true;
+ }
}
}
}
@@ -2029,7 +2109,7 @@ void ProtocolHandlerImpl::NotifySessionStarted(
context.hash_id_,
packet->service_type(),
PROTECTION_OFF,
- *fullVersion,
+ full_version,
*start_session_ack_params);
} else {
service_status_update_handler_->OnServiceUpdate(
@@ -2042,10 +2122,20 @@ void ProtocolHandlerImpl::NotifySessionStarted(
protocol_version,
packet->service_type(),
rejected_params,
- "Certain parameters in the StartService request were rejected");
+ "Certain parameters in the StartService request were rejected",
+ full_version);
+ context.is_start_session_failed_ = true;
}
}
+void ProtocolHandlerImpl::NotifySessionStarted(
+ const SessionContext& context,
+ std::vector<std::string>& rejected_params,
+ const std::string err_reason) {
+ SessionContext context_copy = context;
+ NotifySessionStarted(context_copy, rejected_params, err_reason);
+}
+
RESULT_CODE ProtocolHandlerImpl::HandleControlMessageHeartBeat(
const ProtocolPacket& packet) {
const ConnectionID connection_id = packet.connection_id();
@@ -2092,7 +2182,7 @@ void ProtocolHandlerImpl::PopValidAndExpiredMultiframes() {
const uint32_t connection_key = session_observer_.KeyFromPair(
frame->connection_id(), frame->session_id());
- SDL_LOG_DEBUG("Result frame" << frame << "for connection "
+ SDL_LOG_TRACE("Result frame" << frame << "for connection "
<< connection_key);
const RawMessagePtr rawMessage(new RawMessage(connection_key,
frame->protocol_version(),
@@ -2171,7 +2261,7 @@ void ProtocolHandlerImpl::Handle(const impl::RawFordMessageFromMobile message) {
}
} break;
}
- SDL_LOG_DEBUG("Message : " << message.get());
+ SDL_LOG_TRACE("Message : " << message.get());
const uint8_t c_id = message->connection_id();
const uint32_t m_id = message->session_id();
@@ -2183,7 +2273,7 @@ void ProtocolHandlerImpl::Handle(const impl::RawFordMessageFromMobile message) {
if (((0 != message->data()) && (0 != message->data_size())) ||
FRAME_TYPE_CONTROL == message->frame_type() ||
FRAME_TYPE_FIRST == message->frame_type()) {
- SDL_LOG_DEBUG("Packet: dataSize " << message->data_size());
+ SDL_LOG_TRACE("Packet: dataSize " << message->data_size());
HandleMessage(message);
PopValidAndExpiredMultiframes();
} else {
@@ -2358,7 +2448,7 @@ RESULT_CODE ProtocolHandlerImpl::DecryptFrame(ProtocolFramePtr packet) {
void ProtocolHandlerImpl::SendFramesNumber(uint32_t connection_key,
int32_t number_of_frames) {
- SDL_LOG_DEBUG("SendFramesNumber MobileNaviAck for session "
+ SDL_LOG_TRACE("SendFramesNumber MobileNaviAck for session "
<< connection_key);
transport_manager::ConnectionUID connection_id = 0;
diff --git a/src/components/protocol_handler/src/protocol_packet.cc b/src/components/protocol_handler/src/protocol_packet.cc
index db2f124c53..9c3dd03141 100644
--- a/src/components/protocol_handler/src/protocol_packet.cc
+++ b/src/components/protocol_handler/src/protocol_packet.cc
@@ -262,7 +262,7 @@ ProtocolPacket::ProtocolHeaderValidator::max_payload_size_by_service_type(
RESULT_CODE ProtocolPacket::ProtocolHeaderValidator::validate(
const ProtocolHeader& header) const {
- SDL_LOG_DEBUG("Validating header - " << header);
+ SDL_LOG_TRACE("Validating header - " << header);
// expected payload size will be calculated depending
// on used protocol version and service type
size_t payload_size = MAXIMUM_FRAME_DATA_V2_SIZE;
@@ -390,7 +390,7 @@ RESULT_CODE ProtocolPacket::ProtocolHeaderValidator::validate(
return RESULT_FAIL;
}
}
- SDL_LOG_DEBUG("Message header is completely correct.");
+ SDL_LOG_TRACE("Message header is completely correct.");
return RESULT_OK;
}
diff --git a/src/components/protocol_handler/test/protocol_handler_tm_test.cc b/src/components/protocol_handler/test/protocol_handler_tm_test.cc
index 86c39e3551..ae5b7fb1ae 100644
--- a/src/components/protocol_handler/test/protocol_handler_tm_test.cc
+++ b/src/components/protocol_handler/test/protocol_handler_tm_test.cc
@@ -287,7 +287,7 @@ class ProtocolHandlerImplTest : public ::testing::Test {
const bool callback_protection_flag = PROTECTION_OFF;
#endif // ENABLE_SECURITY
- const protocol_handler::SessionContext context =
+ protocol_handler::SessionContext context =
GetSessionContext(connection_id,
NEW_SESSION_ID,
session_id,
@@ -321,11 +321,15 @@ class ProtocolHandlerImplTest : public ::testing::Test {
// Return sessions start success
WillOnce(DoAll(
NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- context,
- ByRef(empty_rejected_param_),
- std::string())));
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
// Expect send Ack with PROTECTION_OFF (on no Security Manager)
@@ -570,6 +574,14 @@ TEST_F(ProtocolHandlerImplTest,
.Times(call_times)
.WillRepeatedly(ReturnRef(video_service_transports));
+ protocol_handler::SessionContext context =
+ GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ SESSION_START_REJECT,
+ service_type,
+ HASH_ID_WRONG,
+ PROTECTION_OFF);
+
// Expect ConnectionHandler check
EXPECT_CALL(
session_observer_mock,
@@ -581,19 +593,18 @@ TEST_F(ProtocolHandlerImplTest,
.Times(call_times)
.
// Return sessions start rejection
- WillRepeatedly(
- DoAll(NotifyTestAsyncWaiter(waiter),
- SaveArg<2>(&service_type),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- SESSION_START_REJECT,
- service_type,
- HASH_ID_WRONG,
- PROTECTION_OFF),
- ByRef(empty_rejected_param_),
- std::string())));
+ WillRepeatedly(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ SaveArg<2>(&service_type),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times += call_times;
// Expect send NAck
@@ -662,6 +673,14 @@ TEST_F(ProtocolHandlerImplTest, StartSession_Protected_SessionObserverReject) {
.Times(call_times)
.WillRepeatedly(ReturnRef(video_service_transports));
+ protocol_handler::SessionContext context =
+ GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ SESSION_START_REJECT,
+ service_type,
+ HASH_ID_WRONG,
+ callback_protection_flag);
+
// Expect ConnectionHandler check
EXPECT_CALL(
session_observer_mock,
@@ -676,16 +695,15 @@ TEST_F(ProtocolHandlerImplTest, StartSession_Protected_SessionObserverReject) {
WillRepeatedly(DoAll(
NotifyTestAsyncWaiter(waiter),
SaveArg<2>(&service_type),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- SESSION_START_REJECT,
- service_type,
- HASH_ID_WRONG,
- callback_protection_flag),
- ByRef(empty_rejected_param_),
- std::string())));
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times += call_times;
// Expect send NAck with encryption OFF
@@ -741,6 +759,13 @@ TEST_F(ProtocolHandlerImplTest,
EXPECT_CALL(protocol_handler_settings_mock, video_service_transports())
.WillOnce(ReturnRef(video_service_transports));
+ protocol_handler::SessionContext context = GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ session_id,
+ start_service,
+ HASH_ID_WRONG,
+ PROTECTION_OFF);
+
// Expect ConnectionHandler check
EXPECT_CALL(session_observer_mock,
OnSessionStartedCallback(connection_id,
@@ -750,18 +775,17 @@ TEST_F(ProtocolHandlerImplTest,
An<const BsonObject*>()))
.
// Return sessions start success
- WillOnce(
- DoAll(NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- session_id,
- start_service,
- HASH_ID_WRONG,
- PROTECTION_OFF),
- ByRef(empty_rejected_param_),
- std::string())));
+ WillOnce(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
SetProtocolVersion2();
@@ -916,6 +940,22 @@ TEST_F(ProtocolHandlerImplTest,
EXPECT_CALL(session_observer_mock,
ProtocolVersionUsed(_, _, An<utils::SemanticVersion&>()))
.WillOnce(Return(true));
+
+ protocol_handler::SessionContext rejected_context =
+ GetSessionContext(connection_id2,
+ session_id2,
+ SESSION_START_REJECT,
+ start_service,
+ HASH_ID_WRONG,
+ PROTECTION_OFF);
+
+ protocol_handler::SessionContext context =
+ GetSessionContext(connection_id1,
+ session_id1,
+ generated_session_id1,
+ start_service,
+ HASH_ID_WRONG,
+ PROTECTION_OFF);
EXPECT_CALL(session_observer_mock,
OnSessionStartedCallback(connection_id2,
session_id2,
@@ -924,26 +964,24 @@ TEST_F(ProtocolHandlerImplTest,
An<const BsonObject*>()))
.WillOnce(DoAll(
NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id2,
- session_id2,
- SESSION_START_REJECT,
- start_service,
- HASH_ID_WRONG,
- PROTECTION_OFF),
- ByRef(rejected_param_list),
- std::string()),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id1,
- session_id1,
- generated_session_id1,
- start_service,
- HASH_ID_WRONG,
- PROTECTION_OFF),
- ByRef(empty_rejected_param_),
- std::string())));
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(rejected_context),
+ ByRef(rejected_param_list),
+ std::string()),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
BsonObject bson_ack_params;
@@ -1208,6 +1246,12 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtocoloV1) {
EXPECT_CALL(protocol_handler_settings_mock, video_service_transports())
.WillOnce(ReturnRef(video_service_transports));
+ protocol_handler::SessionContext context = GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ session_id,
+ start_service,
+ HASH_ID_WRONG,
+ PROTECTION_OFF);
// Expect ConnectionHandler check
EXPECT_CALL(session_observer_mock,
OnSessionStartedCallback(connection_id,
@@ -1217,18 +1261,17 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtocoloV1) {
An<const BsonObject*>()))
.
// Return sessions start success
- WillOnce(
- DoAll(NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- session_id,
- start_service,
- HASH_ID_WRONG,
- PROTECTION_OFF),
- ByRef(empty_rejected_param_),
- std::string())));
+ WillOnce(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
SetProtocolVersion2();
@@ -1280,6 +1323,13 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionUnprotected) {
EXPECT_CALL(protocol_handler_settings_mock, video_service_transports())
.WillOnce(ReturnRef(video_service_transports));
+ protocol_handler::SessionContext context = GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ session_id,
+ start_service,
+ HASH_ID_WRONG,
+ PROTECTION_OFF);
+
// Expect ConnectionHandler check
EXPECT_CALL(session_observer_mock,
OnSessionStartedCallback(connection_id,
@@ -1289,18 +1339,17 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionUnprotected) {
An<const BsonObject*>()))
.
// Return sessions start success
- WillOnce(
- DoAll(NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- session_id,
- start_service,
- HASH_ID_WRONG,
- PROTECTION_OFF),
- ByRef(empty_rejected_param_),
- std::string())));
+ WillOnce(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
SetProtocolVersion2();
@@ -1334,6 +1383,7 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtected_Fail) {
start_service,
HASH_ID_WRONG,
PROTECTION_ON);
+
context.is_new_service_ = true;
// Expect verification of allowed transport
@@ -1360,13 +1410,17 @@ TEST_F(ProtocolHandlerImplTest, SecurityEnable_StartSessionProtected_Fail) {
An<const BsonObject*>()))
.
// Return sessions start success
- WillOnce(
- DoAll(NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- context,
- ByRef(empty_rejected_param_),
- std::string())));
+ WillOnce(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
SetProtocolVersion2();
@@ -1420,6 +1474,13 @@ TEST_F(ProtocolHandlerImplTest,
EXPECT_CALL(protocol_handler_settings_mock, video_service_transports())
.WillOnce(ReturnRef(video_service_transports));
+ protocol_handler::SessionContext context = GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ session_id,
+ start_service,
+ HASH_ID_WRONG,
+ PROTECTION_ON);
+
// Expect ConnectionHandler check
EXPECT_CALL(session_observer_mock,
OnSessionStartedCallback(connection_id,
@@ -1429,18 +1490,17 @@ TEST_F(ProtocolHandlerImplTest,
An<const BsonObject*>()))
.
// Return sessions start success
- WillOnce(
- DoAll(NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- session_id,
- start_service,
- HASH_ID_WRONG,
- PROTECTION_ON),
- ByRef(empty_rejected_param_),
- std::string())));
+ WillOnce(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
SetProtocolVersion2();
@@ -1520,13 +1580,17 @@ TEST_F(ProtocolHandlerImplTest,
An<const BsonObject*>()))
.
// Return sessions start success
- WillOnce(
- DoAll(NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- context,
- ByRef(empty_rejected_param_),
- std::string())));
+ WillOnce(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
std::vector<int> services;
@@ -1608,6 +1672,13 @@ TEST_F(ProtocolHandlerImplTest,
EXPECT_CALL(protocol_handler_settings_mock, video_service_transports())
.WillOnce(ReturnRef(video_service_transports));
+ protocol_handler::SessionContext context = GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ session_id,
+ start_service,
+ HASH_ID_WRONG,
+ PROTECTION_ON);
+
// Expect ConnectionHandler check
EXPECT_CALL(session_observer_mock,
OnSessionStartedCallback(connection_id,
@@ -1617,18 +1688,17 @@ TEST_F(ProtocolHandlerImplTest,
An<const BsonObject*>()))
.
// Return sessions start success
- WillOnce(
- DoAll(NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- session_id,
- start_service,
- HASH_ID_WRONG,
- PROTECTION_ON),
- ByRef(empty_rejected_param_),
- std::string())));
+ WillOnce(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
// call new SSLContext creation
@@ -1721,6 +1791,13 @@ TEST_F(
EXPECT_CALL(protocol_handler_settings_mock, video_service_transports())
.WillOnce(ReturnRef(video_service_transports));
+ protocol_handler::SessionContext context = GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ session_id,
+ start_service,
+ HASH_ID_WRONG,
+ PROTECTION_ON);
+
// Expect ConnectionHandler check
EXPECT_CALL(session_observer_mock,
OnSessionStartedCallback(connection_id,
@@ -1730,18 +1807,17 @@ TEST_F(
An<const BsonObject*>()))
.
// Return sessions start success
- WillOnce(
- DoAll(NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- session_id,
- start_service,
- HASH_ID_WRONG,
- PROTECTION_ON),
- ByRef(empty_rejected_param_),
- std::string())));
+ WillOnce(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
// call new SSLContext creation
@@ -1832,6 +1908,13 @@ TEST_F(ProtocolHandlerImplTest,
EXPECT_CALL(protocol_handler_settings_mock, video_service_transports())
.WillOnce(ReturnRef(video_service_transports));
+ protocol_handler::SessionContext context = GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ session_id,
+ start_service,
+ HASH_ID_WRONG,
+ PROTECTION_ON);
+
// Expect ConnectionHandler check
EXPECT_CALL(session_observer_mock,
OnSessionStartedCallback(connection_id,
@@ -1841,18 +1924,17 @@ TEST_F(ProtocolHandlerImplTest,
An<const BsonObject*>()))
.
// Return sessions start success
- WillOnce(
- DoAll(NotifyTestAsyncWaiter(waiter),
- InvokeMemberFuncWithArg3(protocol_handler_impl.get(),
- &ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- session_id,
- start_service,
- HASH_ID_WRONG,
- PROTECTION_ON),
- ByRef(empty_rejected_param_),
- std::string())));
+ WillOnce(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (ProtocolHandler::*)(SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ std::string())));
times++;
// call new SSLContext creation
@@ -4068,6 +4150,7 @@ TEST_F(ProtocolHandlerImplTest,
EXPECT_TRUE(waiter->WaitFor(times, kAsyncExpectationsTimeout));
}
+#ifdef ENABLE_SECURITY
TEST_F(ProtocolHandlerImplTest,
OnTMMessageSend_ReadyToCloseConnection_Disconnect) {
OnTMMessageSend();
@@ -4097,6 +4180,7 @@ TEST_F(ProtocolHandlerImplTest,
tm_listener->OnTMMessageSend(message);
}
+#endif
TEST_F(ProtocolHandlerImplTest, OnTMMessageSend_InvalidData_Cancelled) {
const uint8_t data_size = 8u;
@@ -5170,7 +5254,6 @@ TEST_F(ProtocolHandlerImplTest, SendServiceDataAck_AfterVersion5) {
TEST_F(ProtocolHandlerImplTest, StartSession_NACKReason_DisallowedBySettings) {
const ServiceType service_type = kMobileNav;
const utils::SemanticVersion min_reason_param_version(5, 3, 0);
-
#ifdef ENABLE_SECURITY
AddSecurityManager();
@@ -5207,6 +5290,7 @@ TEST_F(ProtocolHandlerImplTest, StartSession_NACKReason_DisallowedBySettings) {
bson_object_put_string(&bson_nack_params,
protocol_handler::strings::reason,
const_cast<char*>(reason.c_str()));
+
std::vector<uint8_t> nack_params =
CreateVectorFromBsonObject(&bson_nack_params);
bson_object_deinitialize(&bson_nack_params);
@@ -5267,6 +5351,14 @@ TEST_F(ProtocolHandlerImplTest, StartSession_NACKReason_SessionObserverReject) {
.Times(call_times)
.WillRepeatedly(ReturnRef(allowed_transports));
+ protocol_handler::SessionContext context =
+ GetSessionContext(connection_id,
+ NEW_SESSION_ID,
+ SESSION_START_REJECT,
+ service_type,
+ protocol_handler::HASH_ID_WRONG,
+ PROTECTION_OFF);
+
// Expect ConnectionHandler check
EXPECT_CALL(
session_observer_mock,
@@ -5278,20 +5370,19 @@ TEST_F(ProtocolHandlerImplTest, StartSession_NACKReason_SessionObserverReject) {
.Times(call_times)
.
// Return sessions start rejection
- WillRepeatedly(
- DoAll(NotifyTestAsyncWaiter(waiter),
- SaveArg<2>(&service_type),
- InvokeMemberFuncWithArg3(
- protocol_handler_impl.get(),
- &protocol_handler::ProtocolHandler::NotifySessionStarted,
- GetSessionContext(connection_id,
- NEW_SESSION_ID,
- SESSION_START_REJECT,
- service_type,
- protocol_handler::HASH_ID_WRONG,
- PROTECTION_OFF),
- ByRef(empty_rejected_param_),
- err_reason)));
+ WillRepeatedly(DoAll(
+ NotifyTestAsyncWaiter(waiter),
+ SaveArg<2>(&service_type),
+ InvokeMemberFuncWithArg3(
+ protocol_handler_impl.get(),
+ static_cast<void (protocol_handler::ProtocolHandler::*)(
+ protocol_handler::SessionContext&,
+ std::vector<std::string>&,
+ const std::string)>(
+ &protocol_handler::ProtocolHandler::NotifySessionStarted),
+ ByRef(context),
+ ByRef(empty_rejected_param_),
+ err_reason)));
times += call_times;
// Expect send NAck
@@ -5413,6 +5504,140 @@ TEST_F(ProtocolHandlerImplTest,
EXPECT_TRUE(waiter->WaitFor(times, kAsyncExpectationsTimeout));
}
+TEST_F(ProtocolHandlerImplTest,
+ StartSessionAck_ProtocolVehicleData_VehicleDataParamsForV5) {
+ auto waiter = TestAsyncWaiter::createInstance();
+
+ const size_t maximum_rpc_payload_size = 1500;
+ EXPECT_CALL(protocol_handler_settings_mock, maximum_rpc_payload_size())
+ .WillOnce(Return(maximum_rpc_payload_size));
+ InitProtocolHandlerImpl(0u, 0u);
+
+ EXPECT_CALL(protocol_handler_settings_mock, max_supported_protocol_version())
+ .WillOnce(Return(PROTOCOL_VERSION_5));
+
+ std::map<std::string, std::string> vehicle_mapping = {
+ {protocol_handler::strings::vehicle_make, "TestMake"},
+ {protocol_handler::strings::vehicle_model, "TestModel"},
+ {protocol_handler::strings::vehicle_model_year, "2021"},
+ {protocol_handler::strings::vehicle_trim, "TestTrim"},
+ {protocol_handler::strings::vehicle_system_hardware_version, "TestHW"},
+ {protocol_handler::strings::vehicle_system_software_version, "TestSW"}};
+
+ connection_handler::ProtocolVehicleData data{
+ vehicle_mapping[protocol_handler::strings::vehicle_make],
+ vehicle_mapping[protocol_handler::strings::vehicle_model],
+ vehicle_mapping[protocol_handler::strings::vehicle_model_year],
+ vehicle_mapping[protocol_handler::strings::vehicle_trim],
+ vehicle_mapping
+ [protocol_handler::strings::vehicle_system_software_version],
+ vehicle_mapping
+ [protocol_handler::strings::vehicle_system_hardware_version]};
+
+ EXPECT_CALL(connection_handler_mock, GetProtocolVehicleData(_))
+ .WillOnce(DoAll(SetArgReferee<0>(data), Return(true)));
+
+ const uint32_t hash_id = 123456;
+ char full_version_string[] = "5.4.0";
+
+ BsonObject expected_obj;
+ bson_object_initialize_default(&expected_obj);
+ // mtu
+ bson_object_put_int64(&expected_obj,
+ protocol_handler::strings::mtu,
+ static_cast<int64_t>(maximum_rpc_payload_size));
+ // hashId
+ bson_object_put_int32(&expected_obj,
+ protocol_handler::strings::hash_id,
+ static_cast<int32_t>(hash_id));
+ // protocolVersion
+ bson_object_put_string(&expected_obj,
+ protocol_handler::strings::protocol_version,
+ full_version_string);
+
+ // vehicle data
+ const uint16_t max_string_length = 500;
+ for (auto& data_pair : vehicle_mapping) {
+ char value_buffer[max_string_length + 1]; // extra byte for NULL symbol
+ strncpy(value_buffer, data_pair.second.c_str(), sizeof(value_buffer));
+ value_buffer[max_string_length] = 0;
+
+ bson_object_put_string(
+ &expected_obj, data_pair.first.c_str(), value_buffer);
+ }
+
+ // secondaryTransports
+ BsonArray secondary_transports;
+ bson_array_initialize(&secondary_transports, 0);
+ bson_object_put_array(&expected_obj,
+ protocol_handler::strings::secondary_transports,
+ &secondary_transports);
+
+ BsonArray audio_service_transports;
+ bson_array_initialize(&audio_service_transports, 1);
+ bson_array_add_int32(&audio_service_transports, 1);
+ bson_object_put_array(&expected_obj,
+ protocol_handler::strings::audio_service_transports,
+ &audio_service_transports);
+
+ BsonArray video_service_transports;
+ bson_array_initialize(&video_service_transports, 1);
+ bson_array_add_int32(&video_service_transports, 1);
+ bson_object_put_array(&expected_obj,
+ protocol_handler::strings::video_service_transports,
+ &video_service_transports);
+
+ std::vector<uint8_t> expected_param =
+ CreateVectorFromBsonObject(&expected_obj);
+
+ bson_object_deinitialize(&expected_obj);
+
+ EXPECT_CALL(transport_manager_mock,
+ SendMessageToDevice(ControlMessage(FRAME_DATA_START_SERVICE_ACK,
+ PROTECTION_OFF,
+ connection_id,
+ Eq(expected_param))))
+ .WillOnce(DoAll(NotifyTestAsyncWaiter(waiter), Return(E_SUCCESS)));
+
+ connection_handler::SessionTransports dummy_st = {0, 0};
+ EXPECT_CALL(connection_handler_mock,
+ SetSecondaryTransportID(_, kDisabledSecondary))
+ .WillOnce(Return(dummy_st));
+ EXPECT_CALL(protocol_handler_settings_mock, multiple_transports_enabled())
+ .WillRepeatedly(Return(false));
+ std::vector<std::string> empty_vec;
+ EXPECT_CALL(protocol_handler_settings_mock, audio_service_transports())
+ .WillRepeatedly(ReturnRef(empty_vec));
+ EXPECT_CALL(protocol_handler_settings_mock, video_service_transports())
+ .WillRepeatedly(ReturnRef(empty_vec));
+ EXPECT_CALL(session_observer_mock,
+ TransportTypeProfileStringFromConnHandle(connection_id))
+ .WillRepeatedly(Return("WEBSOCKET"));
+
+#ifdef ENABLE_SECURITY
+ AddSecurityManager();
+
+ EXPECT_CALL(session_observer_mock, KeyFromPair(connection_id, session_id))
+ .WillRepeatedly(Return(connection_key));
+
+ EXPECT_CALL(session_observer_mock, GetSSLContext(connection_key, kRpc))
+ .WillOnce(ReturnNull());
+#endif // ENABLE_SECURITY
+
+ const uint8_t input_protocol_version = 5;
+ utils::SemanticVersion full_version(5, 4, 0);
+
+ protocol_handler_impl->SendStartSessionAck(connection_id,
+ session_id,
+ input_protocol_version,
+ hash_id,
+ kRpc,
+ false /* protection */,
+ full_version);
+
+ EXPECT_TRUE(waiter->WaitFor(1, kAsyncExpectationsTimeout));
+}
+
} // namespace protocol_handler_test
} // namespace components
} // namespace test
diff --git a/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h b/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h
index f170ef90a7..d6658a79bc 100644
--- a/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h
+++ b/src/components/security_manager/include/security_manager/crypto_manager_settings_impl.h
@@ -83,6 +83,10 @@ class CryptoManagerSettingsImpl : public CryptoManagerSettings {
return profile_.force_unprotected_service();
}
+ uint32_t security_level() const OVERRIDE {
+ return profile_.security_level();
+ }
+
private:
const profile::Profile& profile_;
const std::string certificate_data_;
diff --git a/src/components/security_manager/src/crypto_manager_impl.cc b/src/components/security_manager/src/crypto_manager_impl.cc
index 7d3b7869f2..717991cf5c 100644
--- a/src/components/security_manager/src/crypto_manager_impl.cc
+++ b/src/components/security_manager/src/crypto_manager_impl.cc
@@ -171,6 +171,7 @@ bool CryptoManagerImpl::Init() {
#else
SDL_LOG_DEBUG("SSLv3 is used");
method = is_server ? SSLv3_server_method() : SSLv3_client_method();
+ SSL_CTX_set_max_proto_version(context_, SSL3_VERSION);
break;
#endif
case TLSv1:
@@ -179,6 +180,7 @@ bool CryptoManagerImpl::Init() {
method = is_server ? TLSv1_server_method() : TLSv1_client_method();
#else
method = is_server ? TLS_server_method() : TLS_client_method();
+ SSL_CTX_set_max_proto_version(context_, TLS1_VERSION);
#endif
break;
case TLSv1_1:
@@ -191,6 +193,7 @@ bool CryptoManagerImpl::Init() {
method = is_server ? TLSv1_1_server_method() : TLSv1_1_client_method();
#else
method = is_server ? TLS_server_method() : TLS_client_method();
+ SSL_CTX_set_max_proto_version(context_, TLS1_1_VERSION);
#endif
break;
case TLSv1_2:
@@ -203,6 +206,7 @@ bool CryptoManagerImpl::Init() {
method = is_server ? TLSv1_2_server_method() : TLSv1_2_client_method();
#else
method = is_server ? TLS_server_method() : TLS_client_method();
+ SSL_CTX_set_max_proto_version(context_, TLS1_2_VERSION);
#endif
break;
case DTLSv1:
@@ -211,6 +215,7 @@ bool CryptoManagerImpl::Init() {
method = is_server ? DTLSv1_server_method() : DTLSv1_client_method();
#else
method = is_server ? DTLS_server_method() : DTLS_client_method();
+ SSL_CTX_set_max_proto_version(context_, DTLS1_VERSION);
#endif
break;
default:
@@ -226,6 +231,7 @@ bool CryptoManagerImpl::Init() {
utils::ScopeGuard guard = utils::MakeGuard(free_ctx, &context_);
// Disable SSL2 as deprecated
+ // TLS 1.2 is the max supported TLS version for SDL
SSL_CTX_set_options(context_, SSL_OP_NO_SSLv2);
SaveCertificateData(get_settings().certificate_data());
@@ -234,14 +240,31 @@ bool CryptoManagerImpl::Init() {
SDL_LOG_WARN("Empty ciphers list");
} else {
SDL_LOG_DEBUG("Cipher list: " << get_settings().ciphers_list());
+ // If using openssl 1.1.1, this method may always return true
+ // https://github.com/openssl/openssl/issues/7196#issue-359287519
if (!SSL_CTX_set_cipher_list(context_,
get_settings().ciphers_list().c_str())) {
SDL_LOG_ERROR(
"Could not set cipher list: " << get_settings().ciphers_list());
return false;
}
+#if OPENSSL_VERSION_NUMBER > OPENSSL1_1_VERSION
+ auto sk = SSL_CTX_get_ciphers(context_);
+ const char* p;
+ for (int i = 0; i < sk_SSL_CIPHER_num(sk); i++) {
+ const SSL_CIPHER* c = sk_SSL_CIPHER_value(sk, i);
+ p = SSL_CIPHER_get_name(c);
+ if (p == NULL)
+ break;
+ SDL_LOG_DEBUG("Using Cipher: " << p);
+ }
+#endif
}
+#if OPENSSL_VERSION_NUMBER >= OPENSSL1_1_VERSION
+ SSL_CTX_set_security_level(context_, get_settings().security_level());
+#endif
+
if (get_settings().ca_cert_path().empty()) {
SDL_LOG_WARN("Setting up empty CA certificate location");
}
diff --git a/src/components/security_manager/src/ssl_context_impl.cc b/src/components/security_manager/src/ssl_context_impl.cc
index 3e1b7db0bb..1c8b009097 100644
--- a/src/components/security_manager/src/ssl_context_impl.cc
+++ b/src/components/security_manager/src/ssl_context_impl.cc
@@ -131,6 +131,8 @@ CryptoManagerImpl::SSLContextImpl::create_max_block_sizes() {
rc.insert(std::make_pair("AES128-SHA", seed_sha_max_block_size));
rc.insert(
std::make_pair("AES256-GCM-SHA384", aes128_gcm_sha256_max_block_size));
+ rc.insert(std::make_pair("ECDHE-RSA-AES256-GCM-SHA384",
+ aes128_gcm_sha256_max_block_size));
rc.insert(std::make_pair("AES256-SHA256", aes128_sha256_max_block_size));
rc.insert(std::make_pair("AES256-SHA", seed_sha_max_block_size));
rc.insert(std::make_pair("CAMELLIA128-SHA", seed_sha_max_block_size));
@@ -522,16 +524,15 @@ bool CryptoManagerImpl::SSLContextImpl::Decrypt(const uint8_t* const in_data,
size_t CryptoManagerImpl::SSLContextImpl::get_max_block_size(size_t mtu) const {
SDL_LOG_AUTO_TRACE();
+ const auto max_allowed_block_size =
+ mtu > SSL3_RT_MAX_PLAIN_LENGTH ? SSL3_RT_MAX_PLAIN_LENGTH : mtu;
if (!max_block_size_) {
// FIXME(EZamakhov): add correct logics for TLS1/1.2/SSL3
// For SSL3.0 set temporary value 90, old TLS1.2 value is 29
- assert(mtu > 90);
- return mtu - 90;
+ assert(max_allowed_block_size > 90);
+ return max_allowed_block_size - 90;
}
- const auto max_allowed_block_size =
- mtu > SSL3_RT_MAX_PLAIN_LENGTH ? SSL3_RT_MAX_PLAIN_LENGTH : mtu;
-
return max_block_size_(max_allowed_block_size);
}
diff --git a/src/components/security_manager/test/crypto_manager_impl_test.cc b/src/components/security_manager/test/crypto_manager_impl_test.cc
index d30fa5ef23..85e1ad3129 100644
--- a/src/components/security_manager/test/crypto_manager_impl_test.cc
+++ b/src/components/security_manager/test/crypto_manager_impl_test.cc
@@ -33,6 +33,7 @@
#ifdef __QNXNTO__
#include <openssl/ssl3.h>
#else
+#include <openssl/opensslv.h>
#include <openssl/ssl.h>
#endif //__QNXNTO__
#include <fstream>
@@ -43,6 +44,8 @@
#include "security_manager/crypto_manager_impl.h"
#include "security_manager/mock_security_manager_settings.h"
+#define OPENSSL1_1_VERSION 0x1010000fL
+
using ::testing::NiceMock;
using ::testing::Return;
using ::testing::ReturnRef;
@@ -158,6 +161,9 @@ TEST_F(CryptoManagerTest, WrongInit) {
EXPECT_FALSE(crypto_manager_->Init());
EXPECT_NE(std::string(), crypto_manager_->LastError());
+#if OPENSSL1_1_VERSION >= OPENSSL_VERSION_NUMBER
+ // Legacy test, openssl 1.1.1 changed the error behavior of
+ // SSL_CTX_set_cipher_list
EXPECT_CALL(*mock_security_manager_settings_,
security_manager_protocol_name())
.WillOnce(Return(security_manager::TLSv1_2));
@@ -167,6 +173,7 @@ TEST_F(CryptoManagerTest, WrongInit) {
.WillRepeatedly(ReturnRef(invalid_cipher));
EXPECT_FALSE(crypto_manager_->Init());
EXPECT_NE(std::string(), crypto_manager_->LastError());
+#endif
}
// #ifndef __QNXNTO__
diff --git a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h
index 768d9ebb54..9bfe05758f 100644
--- a/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h
+++ b/src/components/transport_manager/include/transport_manager/bluetooth/bluetooth_device_scanner.h
@@ -171,16 +171,16 @@ class BluetoothDeviceScanner : public DeviceScanner {
TransportAdapterController* controller_;
threads::Thread* thread_;
- bool shutdown_requested_;
+ std::atomic<bool> shutdown_requested_;
bool ready_;
bool device_scan_requested_;
sync_primitives::Lock device_scan_requested_lock_;
+ sync_primitives::Lock terminate_lock_;
sync_primitives::ConditionalVariable device_scan_requested_cv_;
std::vector<bdaddr_t> paired_devices_;
DeviceVector paired_devices_with_sdl_;
- DeviceVector found_devices_with_sdl_;
/**
* @brief UUID of SmartDeviceLink service.
diff --git a/src/components/transport_manager/include/transport_manager/cloud/websocket_client_connection.h b/src/components/transport_manager/include/transport_manager/cloud/websocket_client_connection.h
index 76c8ca73cd..0465effa94 100644
--- a/src/components/transport_manager/include/transport_manager/cloud/websocket_client_connection.h
+++ b/src/components/transport_manager/include/transport_manager/cloud/websocket_client_connection.h
@@ -183,7 +183,6 @@ class WebsocketClientConnection
WebsocketClientConnection& handler_;
sync_primitives::Lock queue_lock_;
sync_primitives::ConditionalVariable queue_new_items_;
- std::atomic_bool write_pending_;
std::atomic_bool shutdown_;
sync_primitives::Lock write_lock_;
diff --git a/src/components/transport_manager/include/transport_manager/websocket_server/websocket_device.h b/src/components/transport_manager/include/transport_manager/websocket_server/websocket_device.h
index 10c6e54424..84235eefa4 100644
--- a/src/components/transport_manager/include/transport_manager/websocket_server/websocket_device.h
+++ b/src/components/transport_manager/include/transport_manager/websocket_server/websocket_device.h
@@ -38,8 +38,10 @@
#ifndef SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_WEBSOCKET_SERVER_WEBSOCKET_DEVICE_H_
#define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_WEBSOCKET_SERVER_WEBSOCKET_DEVICE_H_
+#include <boost/asio/ip/tcp.hpp>
#include <boost/beast/websocket.hpp>
#include <string>
+
#include "transport_manager/transport_adapter/device.h"
namespace transport_manager {
diff --git a/src/components/transport_manager/include/transport_manager/websocket_server/websocket_session.h b/src/components/transport_manager/include/transport_manager/websocket_server/websocket_session.h
index f1be1a3b54..009d2fe07c 100644
--- a/src/components/transport_manager/include/transport_manager/websocket_server/websocket_session.h
+++ b/src/components/transport_manager/include/transport_manager/websocket_server/websocket_session.h
@@ -32,7 +32,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_WEBSOCKET_SERVER_WEBSOCKET_SESSION_H_
#include <boost/asio/bind_executor.hpp>
-#include <boost/asio/strand.hpp>
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <functional>
@@ -99,7 +98,6 @@ class WebSocketSession
protected:
tcp::socket socket_;
websocket::stream<ExecutorType> ws_;
- boost::asio::strand<boost::asio::io_context::executor_type> strand_;
boost::beast::flat_buffer buffer_;
DataReceiveCallback data_receive_;
DataSendDoneCallback data_send_done_;
diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc
index f152f1f78d..ce0c2900b7 100644
--- a/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc
+++ b/src/components/transport_manager/src/bluetooth/bluetooth_device_scanner.cc
@@ -95,10 +95,10 @@ int FindPairedDevs(std::vector<bdaddr_t>* result) {
delete[] buffer;
buffer = new char[1028];
}
- pclose(pipe);
+ int status = pclose(pipe);
SDL_LOG_TRACE("exit with 0");
delete[] buffer;
- return 0;
+ return status;
}
} // namespace
@@ -112,6 +112,7 @@ BluetoothDeviceScanner::BluetoothDeviceScanner(
, ready_(true)
, device_scan_requested_(false)
, device_scan_requested_lock_()
+ , terminate_lock_()
, device_scan_requested_cv_()
, auto_repeat_search_(auto_repeat_search)
, auto_repeat_pause_sec_(auto_repeat_pause_sec) {
@@ -148,6 +149,7 @@ BluetoothDeviceScanner::BluetoothDeviceScanner(
, ready_(true)
, device_scan_requested_(false)
, device_scan_requested_lock_()
+ , terminate_lock_()
, device_scan_requested_cv_()
, auto_repeat_search_(auto_repeat_search)
, auto_repeat_pause_sec_(auto_repeat_pause_sec) {
@@ -173,9 +175,6 @@ void BluetoothDeviceScanner::UpdateTotalDeviceList() {
devices.insert(devices.end(),
paired_devices_with_sdl_.begin(),
paired_devices_with_sdl_.end());
- devices.insert(devices.end(),
- found_devices_with_sdl_.begin(),
- found_devices_with_sdl_.end());
controller_->SearchDeviceDone(devices);
}
@@ -212,38 +211,9 @@ void BluetoothDeviceScanner::DoInquiry() {
paired_devices_, device_handle, &paired_devices_with_sdl_);
UpdateTotalDeviceList();
- SDL_LOG_INFO("Starting hci_inquiry on device " << device_id);
- const uint8_t inquiry_time = 8u; // Time unit is 1.28 seconds
- const size_t max_devices = 256u;
- inquiry_info* inquiry_info_list = new inquiry_info[max_devices];
-
- const int number_of_devices = hci_inquiry(device_id,
- inquiry_time,
- max_devices,
- 0,
- &inquiry_info_list,
- IREQ_CACHE_FLUSH);
-
- if (number_of_devices >= 0) {
- SDL_LOG_INFO("hci_inquiry: found " << number_of_devices << " devices");
- std::vector<bdaddr_t> found_devices(number_of_devices);
- for (int i = 0; i < number_of_devices; ++i) {
- found_devices[i] = inquiry_info_list[i].bdaddr;
- }
- found_devices_with_sdl_.clear();
- CheckSDLServiceOnDevices(
- found_devices, device_handle, &found_devices_with_sdl_);
- }
- UpdateTotalDeviceList();
controller_->FindNewApplicationsRequest();
close(device_handle);
- delete[] inquiry_info_list;
-
- if (number_of_devices < 0) {
- SDL_LOG_DEBUG("number_of_devices < 0");
- controller_->SearchDeviceFailed(SearchDeviceError());
- }
}
void BluetoothDeviceScanner::CheckSDLServiceOnDevices(
@@ -424,7 +394,10 @@ void BluetoothDeviceScanner::Thread() {
if (auto_repeat_search_) {
while (!shutdown_requested_) {
DoInquiry();
- device_scan_requested_ = false;
+ {
+ sync_primitives::AutoLock auto_lock(device_scan_requested_lock_);
+ device_scan_requested_ = false;
+ }
TimedWaitForDeviceScanRequest();
}
} else { // search only on demand
@@ -452,12 +425,22 @@ void BluetoothDeviceScanner::TimedWaitForDeviceScanRequest() {
return;
}
+ if (shutdown_requested_) {
+ SDL_LOG_INFO("Bluetooth scanner Condition: shutdown_requested_ == true");
+ return;
+ }
+
{
sync_primitives::AutoLock auto_lock(device_scan_requested_lock_);
while (!(device_scan_requested_ || shutdown_requested_)) {
+ if (!terminate_lock_.Try()) {
+ // Lock is taken by terminate thread, return
+ return;
+ }
const sync_primitives::ConditionalVariable::WaitStatus wait_status =
device_scan_requested_cv_.WaitFor(auto_lock,
auto_repeat_pause_sec_ * 1000);
+ terminate_lock_.Release();
if (wait_status == sync_primitives::ConditionalVariable::kTimeout) {
SDL_LOG_INFO("Bluetooth scanner timeout, performing scan");
device_scan_requested_ = true;
@@ -478,13 +461,16 @@ TransportAdapter::Error BluetoothDeviceScanner::Init() {
void BluetoothDeviceScanner::Terminate() {
SDL_LOG_AUTO_TRACE();
+ if (shutdown_requested_)
+ return;
shutdown_requested_ = true;
if (thread_) {
+ device_scan_requested_cv_.NotifyOne();
{
sync_primitives::AutoLock auto_lock(device_scan_requested_lock_);
device_scan_requested_ = false;
- device_scan_requested_cv_.NotifyOne();
}
+ sync_primitives::AutoLock auto_lock(terminate_lock_);
SDL_LOG_INFO("Waiting for bluetooth device scanner thread termination");
thread_->Stop(threads::Thread::kThreadStopDelegate);
SDL_LOG_INFO("Bluetooth device scanner thread stopped");
diff --git a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc
index abeb50e798..88a219f57e 100644
--- a/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc
+++ b/src/components/transport_manager/src/bluetooth/bluetooth_transport_adapter.cc
@@ -58,7 +58,7 @@ BluetoothTransportAdapter::BluetoothTransportAdapter(
resumption::LastStateWrapperPtr last_state_wrapper,
const TransportManagerSettings& settings)
: TransportAdapterImpl(
- new BluetoothDeviceScanner(this, true, 0, settings.bluetooth_uuid()),
+ new BluetoothDeviceScanner(this, true, 15, settings.bluetooth_uuid()),
new BluetoothConnectionFactory(this),
NULL,
last_state_wrapper,
diff --git a/src/components/transport_manager/src/cloud/websocket_client_connection.cc b/src/components/transport_manager/src/cloud/websocket_client_connection.cc
index b190e73cb6..a84723d2a1 100644
--- a/src/components/transport_manager/src/cloud/websocket_client_connection.cc
+++ b/src/components/transport_manager/src/cloud/websocket_client_connection.cc
@@ -240,7 +240,7 @@ void WebsocketClientConnection::OnRead(boost::system::error_code ec,
if (ec) {
std::string str_err = "ErrorMessage: " + ec.message();
SDL_LOG_ERROR(str_err);
- ws_.lowest_layer().close();
+ boost::beast::get_lowest_layer(ws_).close();
ioc_.stop();
Shutdown();
return;
diff --git a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc
index eb92599ae5..61562d88c0 100644
--- a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc
+++ b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc
@@ -237,13 +237,13 @@ void ThreadedSocketConnection::Transmit() {
poll_fds[1].fd = read_fd_;
poll_fds[1].events = POLLIN | POLLPRI;
- SDL_LOG_DEBUG("poll " << this);
+ SDL_LOG_TRACE("poll " << this);
if (-1 == poll(poll_fds, kPollFdsSize, -1)) {
SDL_LOG_ERROR_WITH_ERRNO("poll failed for connection " << this);
Abort();
return;
}
- SDL_LOG_DEBUG("poll is ok " << this << " revents0: " << std::hex
+ SDL_LOG_TRACE("poll is ok " << this << " revents0: " << std::hex
<< poll_fds[0].revents << " revents1:" << std::hex
<< poll_fds[1].revents);
// error check
@@ -307,7 +307,7 @@ bool ThreadedSocketConnection::Receive() {
bytes_read = recv(socket_, buffer, sizeof(buffer), MSG_DONTWAIT);
if (bytes_read > 0) {
- SDL_LOG_DEBUG("Received " << bytes_read << " bytes for connection "
+ SDL_LOG_TRACE("Received " << bytes_read << " bytes for connection "
<< this);
::protocol_handler::RawMessagePtr frame(
new protocol_handler::RawMessage(0, 0, buffer, bytes_read, false));
diff --git a/src/components/transport_manager/src/transport_manager_impl.cc b/src/components/transport_manager/src/transport_manager_impl.cc
index ee6398db44..bb6f3626e1 100644
--- a/src/components/transport_manager/src/transport_manager_impl.cc
+++ b/src/components/transport_manager/src/transport_manager_impl.cc
@@ -768,7 +768,7 @@ void TransportManagerImpl::PostMessage(
void TransportManagerImpl::PostEvent(const TransportAdapterEvent& event) {
SDL_LOG_AUTO_TRACE();
- SDL_LOG_DEBUG("TransportAdapterEvent: " << &event);
+ SDL_LOG_TRACE("TransportAdapterEvent: " << &event);
event_queue_.PostMessage(event);
}
@@ -823,12 +823,12 @@ void TransportManagerImpl::DeactivateDeviceConnections(
TransportManagerImpl::ConnectionInternal* TransportManagerImpl::GetConnection(
const ConnectionUID id) {
SDL_LOG_AUTO_TRACE();
- SDL_LOG_DEBUG("ConnectionUID: " << id);
+ SDL_LOG_TRACE("ConnectionUID: " << id);
for (std::vector<ConnectionInternal>::iterator it = connections_.begin();
it != connections_.end();
++it) {
if (it->id == id) {
- SDL_LOG_DEBUG("ConnectionInternal. It's address: " << &*it);
+ SDL_LOG_TRACE("ConnectionInternal. It's address: " << &*it);
return &*it;
}
}
@@ -838,13 +838,13 @@ TransportManagerImpl::ConnectionInternal* TransportManagerImpl::GetConnection(
TransportManagerImpl::ConnectionInternal* TransportManagerImpl::GetConnection(
const DeviceUID& device, const ApplicationHandle& application) {
SDL_LOG_AUTO_TRACE();
- SDL_LOG_DEBUG("DeviceUID: " << device
+ SDL_LOG_TRACE("DeviceUID: " << device
<< "ApplicationHandle: " << application);
for (std::vector<ConnectionInternal>::iterator it = connections_.begin();
it != connections_.end();
++it) {
if (it->device == device && it->application == application) {
- SDL_LOG_DEBUG("ConnectionInternal. It's address: " << &*it);
+ SDL_LOG_TRACE("ConnectionInternal. It's address: " << &*it);
return &*it;
}
}
@@ -1297,7 +1297,7 @@ void TransportManagerImpl::Handle(TransportAdapterEvent event) {
#endif // TELEMETRY_MONITOR
RaiseEvent(&TransportManagerListener::OnTMMessageReceived,
event.event_data);
- SDL_LOG_DEBUG("event_type = ON_RECEIVED_DONE");
+ SDL_LOG_TRACE("event_type = ON_RECEIVED_DONE");
break;
}
case EventTypeEnum::ON_RECEIVED_FAIL: {
diff --git a/src/components/transport_manager/src/websocket_server/websocket_secure_session.cc b/src/components/transport_manager/src/websocket_server/websocket_secure_session.cc
index a533bdcffc..699d2757fd 100644
--- a/src/components/transport_manager/src/websocket_server/websocket_secure_session.cc
+++ b/src/components/transport_manager/src/websocket_server/websocket_secure_session.cc
@@ -60,11 +60,9 @@ void WebSocketSecureSession<ExecutorType>::AsyncAccept() {
// Perform the SSL handshake
WebSocketSecureSession<ExecutorType>::ws_.next_layer().async_handshake(
ssl::stream_base::server,
- boost::asio::bind_executor(
- WebSocketSecureSession<ExecutorType>::strand_,
- std::bind(&WebSocketSecureSession::AsyncHandshake,
- this->shared_from_this(),
- std::placeholders::_1)));
+ std::bind(&WebSocketSecureSession::AsyncHandshake,
+ this->shared_from_this(),
+ std::placeholders::_1));
}
template <typename ExecutorType>
diff --git a/src/components/transport_manager/src/websocket_server/websocket_session.cc b/src/components/transport_manager/src/websocket_server/websocket_session.cc
index 8a05b9d9aa..1def04d700 100644
--- a/src/components/transport_manager/src/websocket_server/websocket_session.cc
+++ b/src/components/transport_manager/src/websocket_server/websocket_session.cc
@@ -48,7 +48,6 @@ WebSocketSession<tcp::socket&>::WebSocketSession(
OnIOErrorCallback on_error)
: socket_(std::move(socket))
, ws_(socket_)
- , strand_(ws_.get_executor())
, data_receive_(data_receive)
, data_send_done_(data_send_done)
, data_send_failed_(data_send_failed)
@@ -67,7 +66,6 @@ WebSocketSession<ssl::stream<tcp::socket&> >::WebSocketSession(
OnIOErrorCallback on_error)
: socket_(std::move(socket))
, ws_(socket_, ctx)
- , strand_(ws_.get_executor())
, data_receive_(data_receive)
, data_send_done_(data_send_done)
, data_send_failed_(data_send_failed)
@@ -83,11 +81,9 @@ WebSocketSession<ExecutorType>::~WebSocketSession() {}
template <typename ExecutorType>
void WebSocketSession<ExecutorType>::AsyncAccept() {
SDL_LOG_AUTO_TRACE();
- ws_.async_accept(
- boost::asio::bind_executor(strand_,
- std::bind(&WebSocketSession::AsyncRead,
- this->shared_from_this(),
- std::placeholders::_1)));
+ ws_.async_accept(std::bind(&WebSocketSession::AsyncRead,
+ this->shared_from_this(),
+ std::placeholders::_1));
}
template <typename ExecutorType>
@@ -100,11 +96,10 @@ void WebSocketSession<ExecutorType>::AsyncRead(boost::system::error_code ec) {
}
ws_.async_read(buffer_,
- boost::asio::bind_executor(strand_,
- std::bind(&WebSocketSession::Read,
- this->shared_from_this(),
- std::placeholders::_1,
- std::placeholders::_2)));
+ std::bind(&WebSocketSession::Read,
+ this->shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2));
}
template <typename ExecutorType>
diff --git a/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h b/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h
index e29f182059..d1bbde05a8 100644
--- a/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h
+++ b/src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h
@@ -38,7 +38,6 @@
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/placeholders.hpp>
#include <boost/asio/ssl/stream.hpp>
-#include <boost/asio/strand.hpp>
#include <boost/asio/thread_pool.hpp>
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
@@ -80,7 +79,6 @@ class WSSession : public std::enable_shared_from_this<WSSession> {
websocket::stream<tcp::socket> ws_;
beast::flat_buffer buffer_;
- boost::asio::strand<boost::asio::io_context::executor_type> strand_;
http::request<http::string_body> req_;
std::set<std::string> url_routes_;
};
diff --git a/src/components/transport_manager/test/include/transport_manager/websocket_server/websocket_sample_client.h b/src/components/transport_manager/test/include/transport_manager/websocket_server/websocket_sample_client.h
index 138502e02c..0a447a118d 100644
--- a/src/components/transport_manager/test/include/transport_manager/websocket_server/websocket_sample_client.h
+++ b/src/components/transport_manager/test/include/transport_manager/websocket_server/websocket_sample_client.h
@@ -39,7 +39,6 @@
#include <boost/asio/bind_executor.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ssl/stream.hpp>
-#include <boost/asio/strand.hpp>
#include <boost/asio/thread_pool.hpp>
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
diff --git a/src/components/transport_manager/test/sample_websocket_server.cc b/src/components/transport_manager/test/sample_websocket_server.cc
index 9b0e5b59d5..bd153adad4 100644
--- a/src/components/transport_manager/test/sample_websocket_server.cc
+++ b/src/components/transport_manager/test/sample_websocket_server.cc
@@ -42,8 +42,7 @@ void Fail(char const* tag, boost::system::error_code ec) {
namespace sample {
namespace websocket {
-WSSession::WSServer::WSServer(tcp::socket&& socket)
- : ws_(std::move(socket)), strand_(ws_.get_executor()) {}
+WSSession::WSServer::WSServer(tcp::socket&& socket) : ws_(std::move(socket)) {}
void WSSession::WSServer::AddURLRoute(const std::string& target) {
url_routes_.insert(ParseRouteFromTarget(target));
@@ -76,10 +75,8 @@ void WSSession::WSServer::OnWebsocketHandshake(
// Accept the websocket handshake
ws_.async_accept(
req_,
- boost::asio::bind_executor(strand_,
- std::bind(&WSServer::OnAccept,
- shared_from_this(),
- std::placeholders::_1)));
+ std::bind(
+ &WSServer::OnAccept, shared_from_this(), std::placeholders::_1));
}
}
diff --git a/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc b/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc
index 6c2ff12bfd..8cf3cb38f1 100644
--- a/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc
+++ b/src/components/transport_manager/test/websocket_sample_client/websocket_sample_client.cc
@@ -113,7 +113,8 @@ bool WSSampleClient<WS>::Connect(tcp::resolver::results_type& results) {
template <>
bool WSSampleClient<WSS>::Connect(tcp::resolver::results_type& results) {
boost::system::error_code ec;
- boost::asio::connect(ws_->lowest_layer(), results.begin(), results.end(), ec);
+ boost::asio::connect(
+ boost::beast::get_lowest_layer(*ws_), results.begin(), results.end(), ec);
if (ec) {
return false;
}
@@ -134,7 +135,7 @@ bool WSSampleClient<WS>::Handshake(const std::string& host,
template <>
void WSSampleClient<WS>::Stop() {
ioc_.stop();
- ws_->lowest_layer().close();
+ boost::beast::get_lowest_layer(*ws_).close();
io_pool_.stop();
io_pool_.join();
@@ -165,7 +166,7 @@ void WSSampleClient<WSS>::Stop() {
ioc_.stop();
ws_->next_layer().next_layer().shutdown(
boost::asio::ip::tcp::socket::shutdown_both);
- ws_->lowest_layer().close();
+ boost::beast::get_lowest_layer(*ws_).close();
io_pool_.stop();
io_pool_.join();
diff --git a/src/components/utils/test/policy.sql b/src/components/utils/test/policy.sql
index d588d695a6..ed627b5fdc 100644
--- a/src/components/utils/test/policy.sql
+++ b/src/components/utils/test/policy.sql
@@ -22,6 +22,7 @@ BEGIN TRANSACTION;
`ccpu_version` VARCHAR(45),
`language` VARCHAR(45),
`wers_country_code` VARCHAR(45),
+ `hardware_version` VARCHAR(45),
`pt_exchanged_at_odometer_x` INTEGER NOT NULL DEFAULT 0,
`pt_exchanged_x_days_after_epoch` INTEGER NOT NULL DEFAULT 0,
`ignition_cycles_since_last_exchange` INTEGER NOT NULL DEFAULT 0,
diff --git a/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py b/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py
index bec5912d54..736a95f7ac 100755
--- a/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py
+++ b/tools/InterfaceGenerator/generator/generators/SmartFactoryBase.py
@@ -564,6 +564,7 @@ class CodeGenerator(object):
struct_name=struct.name,
code=self._indent_code(
self._struct_impl_code_tempate.substitute(
+ struct_name=struct.name,
schema_loc_decl=self._gen_schema_loc_decls(
struct.members.values(), processed_enums),
schema_items_decl=self._gen_schema_items_decls(
@@ -1879,11 +1880,9 @@ class CodeGenerator(object):
_struct_schema_item_template = string.Template(
u'''std::shared_ptr<ISchemaItem> struct_schema_item_${name} = '''
u'''InitStructSchemaItem_${name}(struct_schema_items);\n'''
- u'''struct_schema_items.insert(std::make_pair('''
- u'''StructIdentifiers::${name}, struct_schema_item_${name}));\n'''
u'''structs_schemes_.insert(std::make_pair('''
u'''StructIdentifiers::${name}, CSmartSchema('''
- u'''struct_schema_item_${name})));''')
+ u'''struct_schema_item_${name})));\n''')
_function_schema_template = string.Template(
u'''functions_schemes_.insert(std::make_pair(ns_smart_device_link::'''
@@ -1896,17 +1895,21 @@ class CodeGenerator(object):
_struct_impl_template = string.Template(
u'''std::shared_ptr<ISchemaItem> $namespace::$class_name::'''
u'''InitStructSchemaItem_${struct_name}(\n'''
- u''' const TStructsSchemaItems &struct_schema_items) {\n'''
+ u''' TStructsSchemaItems &struct_schema_items) {\n'''
u'''$code'''
u'''}\n''')
_struct_impl_code_tempate = string.Template(
+ u'''Members '''
+ u'''schema_members;\n'''
+ u'''std::shared_ptr<ISchemaItem> struct_schema = CObjectSchemaItem::create(schema_members);\n'''
+ u'''struct_schema_items.insert(std::make_pair(StructIdentifiers::${struct_name}, CObjectSchemaItem::create(schema_members)));\n'''
+ u'''struct_schema_items[StructIdentifiers::${struct_name}] = struct_schema;\n\n'''
u'''${schema_loc_decl}'''
u'''${schema_items_decl}'''
- u'''Members '''
- u'''schema_members;\n\n'''
u'''${schema_item_fill}'''
- u'''return CObjectSchemaItem::create(schema_members);''')
+ u'''for(auto& member : schema_members) {struct_schema->AddMemberSchemaItem(member.first, member.second);}\n'''
+ u'''return struct_schema;''')
_impl_code_loc_decl_enum_template = string.Template(
u'''std::set<${type}::eType> ${var_name};''')
@@ -2113,7 +2116,7 @@ class CodeGenerator(object):
u'''static '''
u'''std::shared_ptr<ns_smart_device_link::ns_smart_objects::ISchemaItem> '''
u'''InitStructSchemaItem_${struct_name}(\n'''
- u''' const TStructsSchemaItems &struct_schema_items);''')
+ u''' TStructsSchemaItems &struct_schema_items);''')
_class_comment_template = string.Template(
u'''/**\n'''
diff --git a/tools/infrastructure/api_compare.py b/tools/infrastructure/api_compare.py
index 0129119673..ca1279ab61 100644..100755
--- a/tools/infrastructure/api_compare.py
+++ b/tools/infrastructure/api_compare.py
@@ -1,4 +1,5 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
import json
import sys
@@ -7,11 +8,6 @@ import argparse
import xml.etree.ElementTree as ElementTree
from collections import namedtuple
-reload(sys)
-# Enable Utf-8 support. Needed if script will be run under Windows
-sys.setdefaultencoding('utf-8')
-
-
class colors:
"""Class defining colorful output.
Works under UNIX ONLY as Windows does not support ANSI escape sequences
@@ -206,53 +202,53 @@ def print_parameters(common_params, hmi_params, mob_params):
"""Function which prints parameters in mobile, hmi api
and common parameters
"""
- print "Parameters to check: ", common_params, "\n"
+ print("Parameters to check: ", common_params, "\n")
for param in common_params:
mob_items = sorted(mob_params[param].items())
hmi_items = sorted(hmi_params[param].items())
- print colors.UNDERLINE + colors.BOLD + param + colors.ENDC, ":"
- print "In Mobile API :\t", dict(mob_items)
- print "In HMI API :\t", dict(hmi_items)
+ print(colors.UNDERLINE + colors.BOLD + param + colors.ENDC, ":")
+ print("In Mobile API :\t", dict(mob_items))
+ print("In HMI API :\t", dict(hmi_items))
def print_full_info(hmi_absent_params, hmi_params,
mob_absent_params, mob_params, rpc_name):
"""Function prints full detailed info about every rpc"""
- print "\n" + "---" * 60 + "\n"
+ print("\n" + "---" * 60 + "\n")
rpc_color = colors.BOLD + colors.HEADER
- print rpc_color + rpc_name + colors.ENDC
- print colors.BOLD + "\nMobile API: " + colors.ENDC
- print "Parameters quantity: ", len(mob_params)
- print "Parameters list: ", sorted(mob_params.keys())
- print colors.BOLD + "HMI API: " + colors.ENDC
- print "Parameters quantity: ", len(hmi_params)
- print "Parameters list: ", sorted(hmi_params.keys())
- print "\n"
+ print(rpc_color + rpc_name + colors.ENDC)
+ print(colors.BOLD + "\nMobile API: " + colors.ENDC)
+ print("Parameters quantity: ", len(mob_params))
+ print("Parameters list: ", sorted(mob_params.keys()))
+ print(colors.BOLD + "HMI API: " + colors.ENDC)
+ print("Parameters quantity: ", len(hmi_params))
+ print("Parameters list: ", sorted(hmi_params.keys()))
+ print("\n")
print("{}Parameters absent in Mobile APIs: {}{}".
format(colors.WARN, mob_absent_params, colors.ENDC))
print("{}Parameters absent in HMI APIs: {}{}".
format(colors.WARN, hmi_absent_params, colors.ENDC))
- print "\n"
+ print("\n")
def console_print(summary_result):
"""Function which prints summary result to console"""
for rpc_name in sorted(summary_result.keys()):
- print "\n" + "---" * 60
- print colors.HEADER + rpc_name + colors.ENDC
+ print("\n" + "---" * 60)
+ print(colors.HEADER + rpc_name + colors.ENDC)
for problematic_item in summary_result[rpc_name]:
item = summary_result[rpc_name][problematic_item]
if len(item) > 0:
- print colors.UNDERLINE + problematic_item + colors.ENDC
+ print(colors.UNDERLINE + problematic_item + colors.ENDC)
if type(item) is not dict:
print("{}{}{}".format(colors.WARN, item, colors.ENDC))
elif type(item) is dict:
for param in item.keys():
item_print = colors.UNDERLINE + param + colors.ENDC
- print "{} {}".format("Parameter name: ", item_print)
+ print("{} {}".format("Parameter name: ", item_print))
res_val = item[param]
for key in res_val:
- print key, ":", colors.FAIL, res_val[key], colors.ENDC
+ print(key, ":", colors.FAIL, res_val[key], colors.ENDC)
def print_summary_info(summary_result, args):
@@ -260,21 +256,21 @@ def print_summary_info(summary_result, args):
Output type depends on command line args
"""
summary_color = colors.UNDERLINE + colors.BOLD + colors.BLUE
- print "\n"
- print summary_color, "SUMMARY COMPARISON RESULT:\n", colors.ENDC
+ print("\n")
+ print(summary_color, "SUMMARY COMPARISON RESULT:\n", colors.ENDC)
if len(summary_result) == 0:
- print colors.BOLD + " === NO PROBLEMS FOUND ===" + colors.ENDC
+ print(colors.BOLD + " === NO PROBLEMS FOUND ===" + colors.ENDC)
return
if args.output == "console":
console_print(summary_result)
if args.output == "json":
json_summary_result = dict_to_json(summary_result)
- print json_summary_result
+ print(json_summary_result)
if args.output == "xml":
json_summary_result = dict_to_json(summary_result)
temp = json.loads(json_summary_result)
xml_summary_result = json_to_xml(temp)
- print xml_summary_result
+ print(xml_summary_result)
def handle_absent_params(area, absent_params, rpc_name, summary_result):
@@ -365,7 +361,7 @@ def all_compare_rule(mob_param_attributes, hmi_param_attributes):
"""Function used for all common arrtibutes comparison"""
mobile_result = {}
hmi_result = {}
- attr_names = mob_param_attributes.keys() + hmi_param_attributes.keys()
+ attr_names = [*mob_param_attributes] + [*hmi_param_attributes]
attr_names = set(attr_names)
for attr_name in attr_names:
mobile_attribute_value = None
@@ -393,8 +389,8 @@ global_compare_rules = [
mob_param_attributes["type"] == "String", string_compare_rule),
# Comparison rule when attribute "array" = "true"
(lambda mob_param_attributes, hmi_param_attributes:
- 'array' in mob_param_attributes.keys() +
- hmi_param_attributes.keys(), array_compare_rule),
+ 'array' in [*mob_param_attributes] +
+ [*hmi_param_attributes], array_compare_rule),
# Common comparison function for all attributes
(lambda mob_param_attributes, hmi_param_attributes:
True, all_compare_rule)
diff --git a/tools/infrastructure/format_src.py b/tools/infrastructure/format_src.py
deleted file mode 100644
index b7927b2708..0000000000
--- a/tools/infrastructure/format_src.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-"""
-Format all sources with clang-format. All *.cc and *h in the src dir
-are affected. Excluded from formatting sources in the "3rd_party" and
-in the "3rd_party-static" dirs. For the formatting used ".clang-format"
-in the project root.
-"""
-
-import os
-from utils import setup_working_dir, walk_dir, run_cmd
-import re
-
-
-INCLUDE_PATTERNS = ['^.*\.cc$', '^.*\.h$', '^.*\.cpp$', '^.*\.hpp$']
-EXCLUDE_PATTERNS = ['^.*3rd_party.*$']
-FORMAT_CMD = 'clang-format -i -style=file {}'
-
-
-def main():
- ''' Main logic '''
- setup_working_dir()
- print 'Current working dir is {}'.format(os.getcwd())
-
- def action(file_path):
- if re.match('|'.join(INCLUDE_PATTERNS), file_path, re.M | re.I):
- if not re.match('|'.join(EXCLUDE_PATTERNS),
- file_path,
- re.M | re.I):
- print 'Formatting file {}'.format(file_path)
- run_cmd(FORMAT_CMD.format(file_path))
- walk_dir('src', action)
-
-
-if __name__ == '__main__':
- main()
diff --git a/tools/infrastructure/install_hooks.py b/tools/infrastructure/install_hooks.py
index 6f93e02c41..1e1f63de43 100644
--- a/tools/infrastructure/install_hooks.py
+++ b/tools/infrastructure/install_hooks.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@@ -12,14 +12,14 @@ from utils import setup_working_dir
def uninstall_hooks(hooks_dir):
- print 'Deleting existing pre-commit hooks from {}'.format(hooks_dir)
+ print('Deleting existing pre-commit hooks from {}'.format(hooks_dir))
files = glob.glob(os.path.join(hooks_dir, 'pre-commit*'))
for item in files:
os.remove(item)
def install_hooks(src_dir, dst_dir):
- print 'Installing pre-commit hooks'
+ print('Installing pre-commit hooks')
src_files = glob.glob(os.path.join(src_dir, 'pre-commit*'))
for item in src_files:
shutil.copy(item, dst_dir)
@@ -28,7 +28,7 @@ def install_hooks(src_dir, dst_dir):
def main():
''' Main logic '''
setup_working_dir()
- print 'Current working dir is {}'.format(os.getcwd())
+ print('Current working dir is {}'.format(os.getcwd()))
hooks_src_dir = os.path.join(
os.getcwd(), 'tools', 'infrastructure', 'git-hooks')
hooks_dst_dir = os.path.join(os.getcwd(), '.git', 'hooks')
diff --git a/tools/intergen/test/test_hmi_interface.xml b/tools/intergen/test/test_hmi_interface.xml
index 7573d35ef9..c5978c543c 100644
--- a/tools/intergen/test/test_hmi_interface.xml
+++ b/tools/intergen/test/test_hmi_interface.xml
@@ -456,9 +456,6 @@
<element name="totalDistance">
<description> Total distance to destination for navigation</description>
</element>
- <element name="navigationText">
- <description>Navigation text for UpdateTurnList.</description>
- </element>
<element name="audioPassThruDisplayText1">
<description> First line of text for audio pass thru</description>
</element>
@@ -471,9 +468,6 @@
<element name="sliderFooter">
<description> Footer text for slider</description>
</element>
- <element name="notificationText">
- <description>Text of notification to be displayed on screen.</description>
- </element>
<element name="menuName">
<description> Primary text for Choice</description>
</element>
diff --git a/tools/rpc_spec b/tools/rpc_spec
-Subproject 390394de357d3f097aef33ead9d17ef0f4c3d34
+Subproject 72632f946941d63a57ee5e99896e3eae3627f7d