diff options
author | JackLivio <jack@livio.io> | 2018-06-11 13:24:10 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-11 13:24:10 -0400 |
commit | 91123c3cae83ad41e1f5f37d37e46e9f07264d1b (patch) | |
tree | 1d822e627fe9111d5f7a78d465ac43a5c5e88983 | |
parent | 51c427ee43c42bf72d65b5f964cdbdd00ae1de4d (diff) | |
parent | 0a2e9ba1df31486d68d38b355e40a98559155ebc (diff) | |
download | sdl_core-91123c3cae83ad41e1f5f37d37e46e9f07264d1b.tar.gz |
Merge pull request #2221 from JackLivio/fix/display_capabilities_segfault
Add checks to RAI display capabilities
9 files changed, 119 insertions, 63 deletions
diff --git a/src/appMain/hmi_capabilities.json b/src/appMain/hmi_capabilities.json index 8b61df1b31..4b53764158 100755 --- a/src/appMain/hmi_capabilities.json +++ b/src/appMain/hmi_capabilities.json @@ -178,7 +178,6 @@ ], "imageFields": [{ "name": "softButtonImage", - "imageTypeSupported": [], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -186,7 +185,6 @@ }, { "name": "choiceImage", - "imageTypeSupported": [], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -194,7 +192,6 @@ }, { "name": "choiceSecondaryImage", - "imageTypeSupported": [], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -202,7 +199,6 @@ }, { "name": "menuIcon", - "imageTypeSupported": [], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -210,7 +206,6 @@ }, { "name": "cmdIcon", - "imageTypeSupported": [], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -218,7 +213,6 @@ }, { "name": "appIcon", - "imageTypeSupported": [], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -226,7 +220,6 @@ }, { "name": "graphic", - "imageTypeSupported": [], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -234,7 +227,6 @@ }, { "name": "secondaryGraphic", - "imageTypeSupported": [], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 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 286ad87018..d338f7a046 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 @@ -1357,6 +1357,9 @@ class ApplicationManagerImpl app_launch::AppLaunchCtrl& app_launch_ctrl() OVERRIDE; + bool IsSOStructValid(const hmi_apis::StructIdentifiers::eType struct_id, + const smart_objects::SmartObject& display_capabilities); + private: /** * @brief PullLanguagesInfo allows to pull information about languages. diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 3ead8fe65e..78d6fdef0d 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -4463,6 +4463,23 @@ std::vector<std::string> ApplicationManagerImpl::ConvertRejectedParamList( return output; } +bool ApplicationManagerImpl::IsSOStructValid( + const hmi_apis::StructIdentifiers::eType struct_id, + const smart_objects::SmartObject& display_capabilities) { + smart_objects::SmartObject display_capabilities_so = display_capabilities; + if (hmi_so_factory().AttachSchema(struct_id, display_capabilities_so)) { + if (display_capabilities_so.isValid()) { + return true; + } else { + return false; + } + } else { + LOG4CXX_ERROR(logger_, "Could not find struct id: " << struct_id); + return false; + } + return true; +} + #ifdef BUILD_TESTS void ApplicationManagerImpl::AddMockApplication(ApplicationSharedPtr mock_app) { applications_list_lock_.Acquire(); diff --git a/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc index 179f2979a3..48c5a27026 100644 --- a/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc +++ b/src/components/application_manager/src/commands/mobile/register_app_interface_request.cc @@ -450,50 +450,62 @@ void FillUIRelatedFields(smart_objects::SmartObject& response_params, smart_objects::SmartObject& display_caps = response_params[hmi_response::display_capabilities]; - display_caps[hmi_response::display_type] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::display_type); - - display_caps[hmi_response::text_fields] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::text_fields); - - display_caps[hmi_response::image_fields] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::image_fields); - - display_caps[hmi_response::media_clock_formats] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::media_clock_formats); - - display_caps[hmi_response::templates_available] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::templates_available); - - display_caps[hmi_response::screen_params] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::screen_params); - - display_caps[hmi_response::num_custom_presets_available] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::num_custom_presets_available); - - display_caps[hmi_response::graphic_supported] = - (hmi_capabilities.display_capabilities() - ->getElement(hmi_response::image_capabilities) - .length() > 0); - - display_caps[hmi_response::templates_available] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::templates_available); - - display_caps[hmi_response::screen_params] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::screen_params); - - display_caps[hmi_response::num_custom_presets_available] = - hmi_capabilities.display_capabilities()->getElement( - hmi_response::num_custom_presets_available); + if (hmi_capabilities.display_capabilities()->keyExists( + hmi_response::display_type)) { + display_caps[hmi_response::display_type] = + hmi_capabilities.display_capabilities()->getElement( + hmi_response::display_type); + } + + if (hmi_capabilities.display_capabilities()->keyExists( + hmi_response::text_fields)) { + display_caps[hmi_response::text_fields] = + hmi_capabilities.display_capabilities()->getElement( + hmi_response::text_fields); + } + + if (hmi_capabilities.display_capabilities()->keyExists( + hmi_response::image_fields)) { + display_caps[hmi_response::image_fields] = + hmi_capabilities.display_capabilities()->getElement( + hmi_response::image_fields); + } + + if (hmi_capabilities.display_capabilities()->keyExists( + hmi_response::media_clock_formats)) { + display_caps[hmi_response::media_clock_formats] = + hmi_capabilities.display_capabilities()->getElement( + hmi_response::media_clock_formats); + } + + if (hmi_capabilities.display_capabilities()->keyExists( + hmi_response::templates_available)) { + display_caps[hmi_response::templates_available] = + hmi_capabilities.display_capabilities()->getElement( + hmi_response::templates_available); + } + + if (hmi_capabilities.display_capabilities()->keyExists( + hmi_response::screen_params)) { + display_caps[hmi_response::screen_params] = + hmi_capabilities.display_capabilities()->getElement( + hmi_response::screen_params); + } + + if (hmi_capabilities.display_capabilities()->keyExists( + hmi_response::num_custom_presets_available)) { + display_caps[hmi_response::num_custom_presets_available] = + hmi_capabilities.display_capabilities()->getElement( + hmi_response::num_custom_presets_available); + } + + if (hmi_capabilities.display_capabilities()->keyExists( + hmi_response::image_capabilities)) { + display_caps[hmi_response::graphic_supported] = + (hmi_capabilities.display_capabilities() + ->getElement(hmi_response::image_capabilities) + .length() > 0); + } } if (hmi_capabilities.audio_pass_thru_capabilities()) { diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index 278e4761db..f64b80a088 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -551,10 +551,15 @@ void HMICapabilitiesImpl::set_vr_supported_languages( void HMICapabilitiesImpl::set_display_capabilities( const smart_objects::SmartObject& display_capabilities) { - if (display_capabilities_) { - delete display_capabilities_; + if (app_mngr_.IsSOStructValid( + hmi_apis::StructIdentifiers::Common_DisplayCapabilities, + display_capabilities)) { + if (display_capabilities_) { + delete display_capabilities_; + } + display_capabilities_ = + new smart_objects::SmartObject(display_capabilities); } - display_capabilities_ = new smart_objects::SmartObject(display_capabilities); } void HMICapabilitiesImpl::set_hmi_zone_capabilities( diff --git a/src/components/application_manager/test/hmi_capabilities.json b/src/components/application_manager/test/hmi_capabilities.json index 0efcc688bc..1d97d0b3a3 100644 --- a/src/components/application_manager/test/hmi_capabilities.json +++ b/src/components/application_manager/test/hmi_capabilities.json @@ -215,7 +215,9 @@ "imageFields": [ { "name": "softButtonImage", - "imageTypeSupported": [], + "imageTypeSupported": [ + "GRAPHIC_PNG" + ], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -223,7 +225,9 @@ }, { "name": "choiceImage", - "imageTypeSupported": [], + "imageTypeSupported": [ + "GRAPHIC_PNG" + ], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -231,7 +235,9 @@ }, { "name": "choiceSecondaryImage", - "imageTypeSupported": [], + "imageTypeSupported": [ + "GRAPHIC_PNG" + ], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -239,7 +245,9 @@ }, { "name": "menuIcon", - "imageTypeSupported": [], + "imageTypeSupported": [ + "GRAPHIC_PNG" + ], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -247,7 +255,9 @@ }, { "name": "cmdIcon", - "imageTypeSupported": [], + "imageTypeSupported": [ + "GRAPHIC_PNG" + ], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -255,7 +265,9 @@ }, { "name": "appIcon", - "imageTypeSupported": [], + "imageTypeSupported": [ + "GRAPHIC_PNG" + ], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -263,7 +275,9 @@ }, { "name": "graphic", - "imageTypeSupported": [], + "imageTypeSupported": [ + "GRAPHIC_PNG" + ], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 @@ -271,7 +285,9 @@ }, { "name": "secondaryGraphic", - "imageTypeSupported": [], + "imageTypeSupported": [ + "GRAPHIC_PNG" + ], "imageResolution": { "resolutionWidth": 35, "resolutionHeight": 35 diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc index b8369528aa..9d582d2ba0 100644 --- a/src/components/application_manager/test/hmi_capabilities_test.cc +++ b/src/components/application_manager/test/hmi_capabilities_test.cc @@ -186,6 +186,8 @@ TEST_F(HMICapabilitiesTest, LoadCapabilitiesFromFile) { if (file_system::FileExists("./app_info_data")) { EXPECT_TRUE(::file_system::DeleteFile("./app_info_data")); } + EXPECT_CALL(app_mngr_, IsSOStructValid(_, _)).WillOnce(Return(true)); + EXPECT_TRUE(hmi_capabilities_test->LoadCapabilitiesFromFile()); // Check active languages @@ -562,6 +564,7 @@ TEST_F(HMICapabilitiesTest, TEST_F(HMICapabilitiesTest, VerifyImageType) { const int32_t image_type = 1; smart_objects::SmartObject sm_obj; + EXPECT_CALL(app_mngr_, IsSOStructValid(_, _)).WillOnce(Return(true)); sm_obj[hmi_response::image_capabilities][0] = image_type; hmi_capabilities_test->set_display_capabilities(sm_obj); diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h index c7a50199b1..20181c4551 100644 --- a/src/components/include/application_manager/application_manager.h +++ b/src/components/include/application_manager/application_manager.h @@ -730,6 +730,10 @@ class ApplicationManager { virtual void OnTimerSendTTSGlobalProperties() = 0; virtual void OnLowVoltage() = 0; virtual void OnWakeUp() = 0; + + virtual bool IsSOStructValid( + const hmi_apis::StructIdentifiers::eType struct_id, + const smart_objects::SmartObject& display_capabilities) = 0; }; } // namespace application_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 452a1e6c39..c3d66415aa 100644 --- a/src/components/include/test/application_manager/mock_application_manager.h +++ b/src/components/include/test/application_manager/mock_application_manager.h @@ -273,6 +273,10 @@ class MockApplicationManager : public application_manager::ApplicationManager { MOCK_METHOD0(event_dispatcher, application_manager::event_engine::EventDispatcher&()); + MOCK_METHOD2(IsSOStructValid, + bool(const hmi_apis::StructIdentifiers::eType struct_id, + const smart_objects::SmartObject& display_capabilities)); + DEPRECATED MOCK_CONST_METHOD1(IsAppSubscribedForWayPoints, bool(const uint32_t)); DEPRECATED MOCK_METHOD1(SubscribeAppForWayPoints, void(const uint32_t)); |