diff options
13 files changed, 181 insertions, 24 deletions
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 708f92b9fb..411813cc83 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -2268,17 +2268,12 @@ bool ApplicationManagerImpl::ConvertSOtoMessage( } if (message.getElement(jhs::S_PARAMS).keyExists(strings::binary_data)) { - application_manager::BinaryData* binaryData = - new application_manager::BinaryData( - message.getElement(jhs::S_PARAMS) - .getElement(strings::binary_data) - .asBinary()); - - if (NULL == binaryData) { - LOG4CXX_ERROR(logger_, "Null pointer"); - return false; - } - output.set_binary_data(binaryData); + application_manager::BinaryData binaryData( + message.getElement(jhs::S_PARAMS) + .getElement(strings::binary_data) + .asBinary()); + + output.set_binary_data(&binaryData); } LOG4CXX_DEBUG(logger_, "Successfully parsed smart object into message"); diff --git a/src/components/application_manager/src/commands/mobile/send_haptic_data_request.cc b/src/components/application_manager/src/commands/mobile/send_haptic_data_request.cc index cabfef15f6..569eba6c02 100644 --- a/src/components/application_manager/src/commands/mobile/send_haptic_data_request.cc +++ b/src/components/application_manager/src/commands/mobile/send_haptic_data_request.cc @@ -49,7 +49,22 @@ void SendHapticDataRequest::Run() { LOG4CXX_AUTO_TRACE(logger_); smart_objects::SmartObject& msg_params = (*message_)[strings::msg_params]; - SendHMIRequest(hmi_apis::FunctionID::UI_SendHapticData, &msg_params, true); + + ApplicationSharedPtr app = application_manager_.application(connection_key()); + + if (!app) { + LOG4CXX_ERROR(logger_, "Application is not registered"); + SendResponse(false, mobile_apis::Result::APPLICATION_NOT_REGISTERED); + return; + } + + if (app->is_navi() || app->mobile_projection_enabled()) { + SendHMIRequest(hmi_apis::FunctionID::UI_SendHapticData, &msg_params, true); + } else { + SendResponse(false, + mobile_apis::Result::DISALLOWED, + "Application is not of type Navigation or Mobile Projection"); + } } void SendHapticDataRequest::on_event(const event_engine::Event& event) { diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index 1c6e439ee8..28049f8e35 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -1076,6 +1076,9 @@ bool HMICapabilitiesImpl::load_capabilities_from_file() { Formatters::CFormatterJsonBase::jsonValueToObj( navigation_capability, navigation_capability_so); set_navigation_capability(navigation_capability_so); + if (!navigation_capability_so.empty()) { + set_navigation_supported(true); + } } if (check_existing_json_member(system_capabilities, "phoneCapability")) { @@ -1085,6 +1088,9 @@ bool HMICapabilitiesImpl::load_capabilities_from_file() { Formatters::CFormatterJsonBase::jsonValueToObj(phone_capability, phone_capability_so); set_phone_capability(phone_capability_so); + if (!phone_capability_so.empty()) { + set_phone_call_supported(true); + } } if (check_existing_json_member(system_capabilities, "videoStreamingCapability")) { @@ -1132,6 +1138,9 @@ bool HMICapabilitiesImpl::load_capabilities_from_file() { vs_capability_so["supportedFormats"] = converted_array; } set_video_streaming_capability(vs_capability_so); + if (!vs_capability_so.empty()) { + set_video_streaming_supported(true); + } } if (check_existing_json_member(system_capabilities, "remoteControlCapability")) { diff --git a/src/components/application_manager/src/mobile_message_handler.cc b/src/components/application_manager/src/mobile_message_handler.cc index f7beea670e..a3b5aa7dbd 100644 --- a/src/components/application_manager/src/mobile_message_handler.cc +++ b/src/components/application_manager/src/mobile_message_handler.cc @@ -196,8 +196,8 @@ MobileMessageHandler::HandleIncomingMessageProtocolV2( outgoing_message->set_payload_size(message->payload_size()); if (!payload.data.empty()) { - outgoing_message->set_binary_data( - new application_manager::BinaryData(payload.data)); + BinaryData binary_payload_data(payload.data); + outgoing_message->set_binary_data(&binary_payload_data); } return outgoing_message.release(); } diff --git a/src/components/application_manager/test/CMakeLists.txt b/src/components/application_manager/test/CMakeLists.txt index 089f8fd25e..0580998e84 100644 --- a/src/components/application_manager/test/CMakeLists.txt +++ b/src/components/application_manager/test/CMakeLists.txt @@ -143,6 +143,8 @@ set(ResumptionData_SOURCES ) file(COPY hmi_capabilities.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY hmi_capabilities_sc1.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY hmi_capabilities_sc2.json DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(COPY smartDeviceLink_test.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/resumption) diff --git a/src/components/application_manager/test/commands/mobile/send_haptic_data_test.cc b/src/components/application_manager/test/commands/mobile/send_haptic_data_test.cc index 49483209b6..2a3b5d922a 100644 --- a/src/components/application_manager/test/commands/mobile/send_haptic_data_test.cc +++ b/src/components/application_manager/test/commands/mobile/send_haptic_data_test.cc @@ -95,6 +95,11 @@ class SendHapticDataResponseTest }; TEST_F(SendHapticDataRequestTest, Run_SUCCESS) { + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(mock_app_)); + + EXPECT_CALL(*mock_app_, is_navi()).WillOnce(Return(true)); + EXPECT_CALL(app_mngr_, ManageHMICommand( HMIResultCodeIs(hmi_apis::FunctionID::UI_SendHapticData))) @@ -106,6 +111,22 @@ TEST_F(SendHapticDataRequestTest, Run_SUCCESS) { command->Run(); } +TEST_F(SendHapticDataRequestTest, Run_DISALLOWED) { + EXPECT_CALL(app_mngr_, application(kConnectionKey)) + .WillOnce(Return(mock_app_)); + + EXPECT_CALL(*mock_app_, is_navi()).WillOnce(Return(false)); + + EXPECT_CALL(*mock_app_, mobile_projection_enabled()).WillOnce(Return(false)); + + EXPECT_CALL(app_mngr_, ManageMobileCommand(_, _)).WillOnce(Return(true)); + + SendHapticDataRequestPtr command(CreateCommand<SendHapticDataRequest>(msg_)); + + command->Init(); + command->Run(); +} + TEST_F(SendHapticDataRequestTest, OnEvent_SUCCESS) { EXPECT_CALL( app_mngr_, diff --git a/src/components/application_manager/test/commands/mobile/show_test.cc b/src/components/application_manager/test/commands/mobile/show_test.cc index 458d55ac20..d1e3c14181 100644 --- a/src/components/application_manager/test/commands/mobile/show_test.cc +++ b/src/components/application_manager/test/commands/mobile/show_test.cc @@ -746,8 +746,8 @@ TEST_F(ShowRequestTest, Run_MainField1_MetadataTagWithNoFieldData) { event.set_smart_object(*ev_msg); EXPECT_CALL(mock_message_helper_, - HMIToMobileResult(hmi_apis::Common_Result::SUCCESS)) - .WillOnce(Return(mobile_apis::Result::SUCCESS)); + HMIToMobileResult(hmi_apis::Common_Result::SUCCESS)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); MessageSharedPtr ui_command_result; EXPECT_CALL( @@ -764,7 +764,7 @@ TEST_F(ShowRequestTest, Run_MainField1_MetadataTagWithNoFieldData) { (*ui_command_result)[am::strings::msg_params][am::strings::result_code] .asInt(), static_cast<int32_t>(mobile_apis::Result::WARNINGS)); - + Mock::VerifyAndClearExpectations(&mock_message_helper_); } diff --git a/src/components/application_manager/test/hmi_capabilities_sc1.json b/src/components/application_manager/test/hmi_capabilities_sc1.json new file mode 100644 index 0000000000..3731f8eb78 --- /dev/null +++ b/src/components/application_manager/test/hmi_capabilities_sc1.json @@ -0,0 +1,9 @@ +{ + "UI": { + "systemCapabilities": { + "phoneCapability": { + "dialNumberEnabled": true + } + } + } +} diff --git a/src/components/application_manager/test/hmi_capabilities_sc2.json b/src/components/application_manager/test/hmi_capabilities_sc2.json new file mode 100644 index 0000000000..a8578f04f5 --- /dev/null +++ b/src/components/application_manager/test/hmi_capabilities_sc2.json @@ -0,0 +1,14 @@ +{ + "UI": { + "systemCapabilities": { + "navigationCapability": { + "sendLocationEnabled": true, + "getWayPointsEnabled": false + }, + "phoneCapability": { + }, + "videoStreamingCapability": { + } + } + } +} diff --git a/src/components/application_manager/test/hmi_capabilities_test.cc b/src/components/application_manager/test/hmi_capabilities_test.cc index 5c3830d5a5..2eb6956353 100644 --- a/src/components/application_manager/test/hmi_capabilities_test.cc +++ b/src/components/application_manager/test/hmi_capabilities_test.cc @@ -375,12 +375,17 @@ TEST_F(HMICapabilitiesTest, LoadCapabilitiesFromFile) { EXPECT_TRUE(navigation_capability_so["sendLocationEnabled"].asBool()); EXPECT_TRUE(navigation_capability_so["getWayPointsEnabled"].asBool()); + // since we have navigation capabilities, the feature should be supported + EXPECT_TRUE(hmi_capabilities_test->navigation_supported()); + const smart_objects::SmartObject phone_capability_so = *(hmi_capabilities_test->phone_capability()); EXPECT_TRUE(phone_capability_so.keyExists("dialNumberEnabled")); EXPECT_TRUE(phone_capability_so["dialNumberEnabled"].asBool()); + EXPECT_TRUE(hmi_capabilities_test->phone_call_supported()); + const smart_objects::SmartObject vs_capability_so = *(hmi_capabilities_test->video_streaming_capability()); @@ -428,6 +433,8 @@ TEST_F(HMICapabilitiesTest, LoadCapabilitiesFromFile) { EXPECT_TRUE( vs_capability_so[strings::haptic_spatial_data_supported].asBool()); + EXPECT_TRUE(hmi_capabilities_test->video_streaming_supported()); + // Check remote control capabilites const smart_objects::SmartObject rc_capability_so = *(hmi_capabilities_test->rc_capability()); @@ -469,6 +476,87 @@ TEST_F(HMICapabilitiesTest, LoadCapabilitiesFromFile) { rc_capability_so["buttonCapabilities"][0]["upDownAvailable"].asBool()); } +TEST_F(HMICapabilitiesTest, + LoadCapabilitiesFromFileAndVerifyUnsupportedSystemCapabilities) { + MockApplicationManager mock_app_mngr; + event_engine_test::MockEventDispatcher mock_dispatcher; + MockApplicationManagerSettings mock_application_manager_settings; + + const std::string hmi_capabilities_file = "hmi_capabilities_sc1.json"; + + EXPECT_CALL(mock_app_mngr, event_dispatcher()) + .WillOnce(ReturnRef(mock_dispatcher)); + EXPECT_CALL(mock_app_mngr, get_settings()) + .WillRepeatedly(ReturnRef(mock_application_manager_settings)); + EXPECT_CALL(mock_application_manager_settings, hmi_capabilities_file_name()) + .WillOnce(ReturnRef(hmi_capabilities_file)); + EXPECT_CALL(mock_dispatcher, add_observer(_, _, _)).Times(1); + EXPECT_CALL(mock_dispatcher, remove_observer(_)).Times(1); + EXPECT_CALL(mock_application_manager_settings, launch_hmi()) + .WillOnce(Return(false)); + + if (file_system::FileExists("./app_info_data")) { + EXPECT_TRUE(::file_system::DeleteFile("./app_info_data")); + } + + utils::SharedPtr<HMICapabilitiesForTesting> hmi_capabilities = + utils::MakeShared<HMICapabilitiesForTesting>(mock_app_mngr); + hmi_capabilities->Init(&last_state_); + + // Check system capabilities; only phone capability is available + EXPECT_FALSE(hmi_capabilities->navigation_supported()); + EXPECT_TRUE(hmi_capabilities->phone_call_supported()); + EXPECT_FALSE(hmi_capabilities->video_streaming_supported()); + + // verify phone capability + const smart_objects::SmartObject phone_capability_so = + *(hmi_capabilities->phone_capability()); + EXPECT_TRUE(phone_capability_so.keyExists("dialNumberEnabled")); + EXPECT_TRUE(phone_capability_so["dialNumberEnabled"].asBool()); +} + +TEST_F(HMICapabilitiesTest, + LoadCapabilitiesFromFileAndVerifyEmptySystemCapabilities) { + MockApplicationManager mock_app_mngr; + event_engine_test::MockEventDispatcher mock_dispatcher; + MockApplicationManagerSettings mock_application_manager_settings; + + const std::string hmi_capabilities_file = "hmi_capabilities_sc2.json"; + + EXPECT_CALL(mock_app_mngr, event_dispatcher()) + .WillOnce(ReturnRef(mock_dispatcher)); + EXPECT_CALL(mock_app_mngr, get_settings()) + .WillRepeatedly(ReturnRef(mock_application_manager_settings)); + EXPECT_CALL(mock_application_manager_settings, hmi_capabilities_file_name()) + .WillOnce(ReturnRef(hmi_capabilities_file)); + EXPECT_CALL(mock_dispatcher, add_observer(_, _, _)).Times(1); + EXPECT_CALL(mock_dispatcher, remove_observer(_)).Times(1); + EXPECT_CALL(mock_application_manager_settings, launch_hmi()) + .WillOnce(Return(false)); + + if (file_system::FileExists("./app_info_data")) { + EXPECT_TRUE(::file_system::DeleteFile("./app_info_data")); + } + + utils::SharedPtr<HMICapabilitiesForTesting> hmi_capabilities = + utils::MakeShared<HMICapabilitiesForTesting>(mock_app_mngr); + hmi_capabilities->Init(&last_state_); + + // Check system capabilities; only navigation capability is valid, the other + // two are empty + EXPECT_TRUE(hmi_capabilities->navigation_supported()); + EXPECT_FALSE(hmi_capabilities->phone_call_supported()); + EXPECT_FALSE(hmi_capabilities->video_streaming_supported()); + + // verify navigation capabilities + smart_objects::SmartObject navigation_capability_so = + *(hmi_capabilities->navigation_capability()); + EXPECT_TRUE(navigation_capability_so.keyExists("sendLocationEnabled")); + EXPECT_TRUE(navigation_capability_so.keyExists("getWayPointsEnabled")); + EXPECT_TRUE(navigation_capability_so["sendLocationEnabled"].asBool()); + EXPECT_FALSE(navigation_capability_so["getWayPointsEnabled"].asBool()); +} + TEST_F(HMICapabilitiesTest, VerifyImageType) { const int32_t image_type = 1; smart_objects::SmartObject sm_obj; diff --git a/src/components/protocol_handler/include/protocol_handler/protocol_packet.h b/src/components/protocol_handler/include/protocol_handler/protocol_packet.h index 31b4c12ea6..1c427533e6 100644 --- a/src/components/protocol_handler/include/protocol_handler/protocol_packet.h +++ b/src/components/protocol_handler/include/protocol_handler/protocol_packet.h @@ -79,13 +79,16 @@ class ProtocolPacket { uint8_t majorVersion; uint8_t minorVersion; uint8_t patchVersion; - static inline uint8_t cmp(const ProtocolVersion& version1, + static inline int16_t cmp(const ProtocolVersion& version1, const ProtocolVersion& version2) { - uint8_t diff = version1.majorVersion - version2.majorVersion; + int16_t diff = + static_cast<int16_t>(version1.majorVersion - version2.majorVersion); if (diff == 0) { - diff = version1.minorVersion - version2.minorVersion; + diff = + static_cast<int16_t>(version1.minorVersion - version2.minorVersion); if (diff == 0) { - diff = version1.minorVersion - version2.minorVersion; + diff = static_cast<int16_t>(version1.patchVersion - + version2.patchVersion); } } return diff; diff --git a/src/components/protocol_handler/src/protocol_handler_impl.cc b/src/components/protocol_handler/src/protocol_handler_impl.cc index ec4663764a..7f30017856 100644 --- a/src/components/protocol_handler/src/protocol_handler_impl.cc +++ b/src/components/protocol_handler/src/protocol_handler_impl.cc @@ -294,7 +294,7 @@ void ProtocolHandlerImpl::SendStartSessionAck( ? &defaultProtocolVersion : ProtocolPacket::ProtocolVersion::min(full_version, defaultProtocolVersion); - char protocolVersionString[255]; + char protocolVersionString[256]; strncpy(protocolVersionString, (*minVersion).to_string().c_str(), 255); bson_object_put_string( ¶ms, strings::protocol_version, protocolVersionString); @@ -1214,7 +1214,8 @@ class StartSessionHandler : public security_manager::SecurityManagerListener { , hash_id_(hash_id) , service_type_(service_type) , force_protected_service_(force_protected_service) - , full_version_() {} + , full_version_() + , payload_(NULL) {} StartSessionHandler(uint32_t connection_key, ProtocolHandlerImpl* protocol_handler, SessionObserver& session_observer, diff --git a/src/components/protocol_handler/src/protocol_packet.cc b/src/components/protocol_handler/src/protocol_packet.cc index 39871d5bae..ae52849de6 100644 --- a/src/components/protocol_handler/src/protocol_packet.cc +++ b/src/components/protocol_handler/src/protocol_packet.cc @@ -84,7 +84,7 @@ ProtocolPacket::ProtocolVersion::ProtocolVersion(std::string versionString) } std::string ProtocolPacket::ProtocolVersion::to_string() { - char versionString[255]; + char versionString[256]; snprintf(versionString, 255, "%u.%u.%u", |