diff options
author | jacobkeeler <jacob.keeler@livioradio.com> | 2019-05-30 15:24:53 -0400 |
---|---|---|
committer | jacobkeeler <jacob.keeler@livioradio.com> | 2019-05-30 15:25:02 -0400 |
commit | 2171f329724e8a279748672f35f0af413d7360af (patch) | |
tree | 0776285a6b6ebc19c7cf87b657bf9b30429d06e5 /src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src | |
parent | afc34d149d3b2eebab2df93e4b6783ad7716658f (diff) | |
parent | 2be6a9121610ef71235b7e251fd43cc7305aa310 (diff) | |
download | sdl_core-2171f329724e8a279748672f35f0af413d7360af.tar.gz |
Merge remote-tracking branch 'origin/master' into develop
# Conflicts:
# src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_command_factory.cc
# src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/mobile_command_factory.cc
# src/components/transport_manager/src/cloud/cloud_websocket_transport_adapter.cc
# src/components/transport_manager/test/include/transport_manager/cloud/sample_websocket_server.h
# src/components/transport_manager/test/sample_websocket_server.cc
# src/components/transport_manager/test/transport_adapter_test.cc
# src/components/transport_manager/test/websocket_connection_test.cc
Diffstat (limited to 'src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src')
3 files changed, 321 insertions, 23 deletions
diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_mobile_command_factory.cc b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_mobile_command_factory.cc index 7a62f7a4c7..76be96cf8f 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_mobile_command_factory.cc +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/app_service_mobile_command_factory.cc @@ -111,9 +111,15 @@ app_mngr::CommandCreator& AppServiceMobileCommandFactory::buildCommandCreator( switch (function_id) { case mobile_apis::FunctionID::PublishAppServiceID: - return mobile_apis::messageType::request == message_type - ? factory.GetCreator<commands::PublishAppServiceRequest>() - : factory.GetCreator<commands::PublishAppServiceResponse>(); + if (app_mngr::commands::Command::CommandSource::SOURCE_MOBILE == source && + mobile_apis::messageType::response != message_type) { + return factory.GetCreator<commands::PublishAppServiceRequest>(); + } else if (app_mngr::commands::Command::CommandSource::SOURCE_SDL == + source && + mobile_apis::messageType::request != message_type) { + return factory.GetCreator<commands::PublishAppServiceResponse>(); + } + break; case mobile_apis::FunctionID::OnAppServiceDataID: return app_mngr::commands::Command::CommandSource::SOURCE_MOBILE == source ? factory.GetCreator< diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/as_get_app_service_data_request_from_hmi.cc b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/as_get_app_service_data_request_from_hmi.cc index a339ffb9a6..2da8834b96 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/as_get_app_service_data_request_from_hmi.cc +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/as_get_app_service_data_request_from_hmi.cc @@ -31,6 +31,7 @@ */ #include "app_service_rpc_plugin/commands/hmi/as_get_app_service_data_request_from_hmi.h" +#include "application_manager/app_service_manager.h" #include "application_manager/application_impl.h" #include "application_manager/rpc_service.h" #include "interfaces/MOBILE_API.h" @@ -70,30 +71,180 @@ void ASGetAppServiceDataRequestFromHMI::Run() { true); } +void ASGetAppServiceDataRequestFromHMI::GetWeatherImagePaths( + smart_objects::SmartObject& data, ApplicationSharedPtr app) { + if (data[strings::location].keyExists(strings::location_image)) { + MessageHelper::VerifyImage(data[strings::location][strings::location_image], + app, + application_manager_); + } + + if (data.keyExists(strings::current_forecast) && + data[strings::current_forecast].keyExists(strings::weather_icon)) { + MessageHelper::VerifyImage( + data[strings::current_forecast][strings::weather_icon], + app, + application_manager_); + } + + if (data.keyExists(strings::minute_forecast)) { + smart_objects::SmartObject& minute_forecast = + data[strings::minute_forecast]; + for (size_t i = 0; i < minute_forecast.length(); i++) { + if (minute_forecast[i].keyExists(strings::weather_icon)) { + MessageHelper::VerifyImage(minute_forecast[i][strings::weather_icon], + app, + application_manager_); + } + } + } + + if (data.keyExists(strings::hourly_forecast)) { + smart_objects::SmartObject& hourly_forecast = + data[strings::hourly_forecast]; + for (size_t i = 0; i < hourly_forecast.length(); i++) { + if (hourly_forecast[i].keyExists(strings::weather_icon)) { + MessageHelper::VerifyImage(hourly_forecast[i][strings::weather_icon], + app, + application_manager_); + } + } + } + + if (data.keyExists(strings::multiday_forecast)) { + smart_objects::SmartObject& multiday_forecast = + data[strings::multiday_forecast]; + for (size_t i = 0; i < multiday_forecast.length(); i++) { + if (multiday_forecast[i].keyExists(strings::weather_icon)) { + MessageHelper::VerifyImage(multiday_forecast[i][strings::weather_icon], + app, + application_manager_); + } + } + } +} + +void ASGetAppServiceDataRequestFromHMI::GetNavigationImagePaths( + smart_objects::SmartObject& data, ApplicationSharedPtr app) { + if (data.keyExists(strings::origin) && + data[strings::origin].keyExists(strings::location_image)) { + MessageHelper::VerifyImage(data[strings::origin][strings::location_image], + app, + application_manager_); + } + + if (data.keyExists(strings::destination) && + data[strings::destination].keyExists(strings::location_image)) { + MessageHelper::VerifyImage( + data[strings::destination][strings::location_image], + app, + application_manager_); + } + + if (data.keyExists(strings::instructions)) { + smart_objects::SmartObject& instructions = data[strings::instructions]; + for (size_t i = 0; i < instructions.length(); i++) { + if (instructions[i].keyExists(strings::image)) { + MessageHelper::VerifyImage( + instructions[i][strings::image], app, application_manager_); + } + + if (instructions[i].keyExists(strings::location_details) && + instructions[i][strings::location_details].keyExists( + strings::location_image)) { + MessageHelper::VerifyImage( + instructions[i][strings::location_details][strings::location_image], + app, + application_manager_); + } + } + } +} + +bool ASGetAppServiceDataRequestFromHMI::ValidateResponse( + smart_objects::SmartObject& message_params) { + if (!message_params.keyExists(strings::service_data)) { + LOG4CXX_DEBUG( + logger_, + "GASD response received without any service data, passing through"); + return true; + } + smart_objects::SmartObject& service_data = + message_params[strings::service_data]; + std::string service_type = service_data[strings::service_type].asString(); + mobile_apis::AppServiceType::eType service_type_value; + const std::string& service_id = service_data[strings::service_id].asString(); + auto service = + application_manager_.GetAppServiceManager().FindServiceByID(service_id); + if (!service) { + LOG4CXX_ERROR(logger_, + "GASD response received with an unpublished service ID"); + SendErrorResponse( + correlation_id(), + hmi_apis::FunctionID::AppService_GetAppServiceData, + hmi_apis::Common_Result::GENERIC_ERROR, + "The provider responded with incorrect data", + application_manager::commands::Command::SOURCE_SDL_TO_HMI); + return false; + } + + using namespace ns_smart_device_link::ns_smart_objects; + if (service && service->mobile_service && + EnumConversionHelper<mobile_apis::AppServiceType::eType>::StringToEnum( + service_type, &service_type_value)) { + auto app = application_manager_.application(service->connection_key); + if (!app) { + LOG4CXX_ERROR(logger_, + "Failed to find service provider for GASD response"); + SendErrorResponse( + correlation_id(), + hmi_apis::FunctionID::AppService_GetAppServiceData, + hmi_apis::Common_Result::GENERIC_ERROR, + "The provider responded with incorrect data", + application_manager::commands::Command::SOURCE_SDL_TO_HMI); + return false; + } + + if (service_type_value == mobile_apis::AppServiceType::WEATHER && + service_data.keyExists(strings::weather_service_data)) { + GetWeatherImagePaths(service_data[strings::weather_service_data], app); + } + + if (service_type_value == mobile_apis::AppServiceType::NAVIGATION && + service_data.keyExists(strings::navigation_service_data)) { + GetNavigationImagePaths(service_data[strings::navigation_service_data], + app); + } + } + return true; +} + void ASGetAppServiceDataRequestFromHMI::on_event( const event_engine::Event& event) { - const smart_objects::SmartObject& event_message = event.smart_object(); + smart_objects::SmartObject event_message(event.smart_object()); - auto msg_params = event_message[strings::msg_params]; + auto& msg_params = event_message[strings::msg_params]; hmi_apis::Common_Result::eType result = static_cast<hmi_apis::Common_Result::eType>( event_message[strings::params][hmi_response::code].asInt()); bool success = IsHMIResultSuccess(result, HmiInterfaces::HMI_INTERFACE_AppService); - SendResponse(success, - correlation_id(), - hmi_apis::FunctionID::AppService_GetAppServiceData, - result, - &msg_params, - application_manager::commands::Command::SOURCE_SDL_TO_HMI); + if (ValidateResponse(msg_params)) { + SendResponse(success, + correlation_id(), + hmi_apis::FunctionID::AppService_GetAppServiceData, + result, + &msg_params, + application_manager::commands::Command::SOURCE_SDL_TO_HMI); + } } void ASGetAppServiceDataRequestFromHMI::on_event( const event_engine::MobileEvent& event) { - const smart_objects::SmartObject& event_message = event.smart_object(); + smart_objects::SmartObject event_message(event.smart_object()); - auto msg_params = event_message[strings::msg_params]; + auto& msg_params = event_message[strings::msg_params]; mobile_apis::Result::eType mobile_result = static_cast<mobile_apis::Result::eType>( @@ -102,19 +253,18 @@ void ASGetAppServiceDataRequestFromHMI::on_event( MessageHelper::MobileToHMIResult(mobile_result); bool success = IsMobileResultSuccess(mobile_result); - SendResponse(success, - correlation_id(), - hmi_apis::FunctionID::AppService_GetAppServiceData, - result, - &msg_params, - application_manager::commands::Command::SOURCE_SDL_TO_HMI); + if (ValidateResponse(msg_params)) { + SendResponse(success, + correlation_id(), + hmi_apis::FunctionID::AppService_GetAppServiceData, + result, + &msg_params, + application_manager::commands::Command::SOURCE_SDL_TO_HMI); + } } void ASGetAppServiceDataRequestFromHMI::onTimeOut() { LOG4CXX_AUTO_TRACE(logger_); - smart_objects::SmartObject response_params; - response_params[strings::info] = - "The provider did not respond to the request"; SendErrorResponse(correlation_id(), hmi_apis::FunctionID::AppService_GetAppServiceData, hmi_apis::Common_Result::GENERIC_ERROR, diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/on_as_app_service_data_notification.cc b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/on_as_app_service_data_notification.cc index 80dd88c15f..e90de23837 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/on_as_app_service_data_notification.cc +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/src/commands/hmi/on_as_app_service_data_notification.cc @@ -31,6 +31,11 @@ */ #include "app_service_rpc_plugin/commands/hmi/on_as_app_service_data_notification.h" +#include "application_manager/app_service_manager.h" +#include "application_manager/application_impl.h" +#include "application_manager/message_helper.h" +#include "interfaces/MOBILE_API.h" +#include "smart_objects/enum_schema_item.h" namespace app_service_rpc_plugin { using namespace application_manager; @@ -50,10 +55,147 @@ OnASAppServiceDataNotification::OnASAppServiceDataNotification( OnASAppServiceDataNotification::~OnASAppServiceDataNotification() {} +void OnASAppServiceDataNotification::GetWeatherImagePaths( + smart_objects::SmartObject& data, ApplicationSharedPtr app) { + if (data[strings::location].keyExists(strings::location_image)) { + MessageHelper::VerifyImage(data[strings::location][strings::location_image], + app, + application_manager_); + } + + if (data.keyExists(strings::current_forecast) && + data[strings::current_forecast].keyExists(strings::weather_icon)) { + MessageHelper::VerifyImage( + data[strings::current_forecast][strings::weather_icon], + app, + application_manager_); + } + + if (data.keyExists(strings::minute_forecast)) { + smart_objects::SmartObject& minute_forecast = + data[strings::minute_forecast]; + for (size_t i = 0; i < minute_forecast.length(); i++) { + if (minute_forecast[i].keyExists(strings::weather_icon)) { + MessageHelper::VerifyImage(minute_forecast[i][strings::weather_icon], + app, + application_manager_); + } + } + } + + if (data.keyExists(strings::hourly_forecast)) { + smart_objects::SmartObject& hourly_forecast = + data[strings::hourly_forecast]; + for (size_t i = 0; i < hourly_forecast.length(); i++) { + if (hourly_forecast[i].keyExists(strings::weather_icon)) { + MessageHelper::VerifyImage(hourly_forecast[i][strings::weather_icon], + app, + application_manager_); + } + } + } + + if (data.keyExists(strings::multiday_forecast)) { + smart_objects::SmartObject& multiday_forecast = + data[strings::multiday_forecast]; + for (size_t i = 0; i < multiday_forecast.length(); i++) { + if (multiday_forecast[i].keyExists(strings::weather_icon)) { + MessageHelper::VerifyImage(multiday_forecast[i][strings::weather_icon], + app, + application_manager_); + } + } + } +} + +void OnASAppServiceDataNotification::GetNavigationImagePaths( + smart_objects::SmartObject& data, ApplicationSharedPtr app) { + if (data.keyExists(strings::origin) && + data[strings::origin].keyExists(strings::location_image)) { + MessageHelper::VerifyImage(data[strings::origin][strings::location_image], + app, + application_manager_); + } + + if (data.keyExists(strings::destination) && + data[strings::destination].keyExists(strings::location_image)) { + MessageHelper::VerifyImage( + data[strings::destination][strings::location_image], + app, + application_manager_); + } + + if (data.keyExists(strings::instructions)) { + smart_objects::SmartObject& instructions = data[strings::instructions]; + for (size_t i = 0; i < instructions.length(); i++) { + if (instructions[i].keyExists(strings::image)) { + MessageHelper::VerifyImage( + instructions[i][strings::image], app, application_manager_); + } + + if (instructions[i].keyExists(strings::location_details) && + instructions[i][strings::location_details].keyExists( + strings::location_image)) { + MessageHelper::VerifyImage( + instructions[i][strings::location_details][strings::location_image], + app, + application_manager_); + } + } + } +} + +bool OnASAppServiceDataNotification::ValidateParams( + smart_objects::SmartObject& message_params) { + if (!message_params.keyExists(strings::service_data)) { + LOG4CXX_DEBUG(logger_, + "OASD notification received without any service data"); + return false; + } + smart_objects::SmartObject& service_data = + message_params[strings::service_data]; + std::string service_type = service_data[strings::service_type].asString(); + mobile_apis::AppServiceType::eType service_type_value; + const std::string& service_id = service_data[strings::service_id].asString(); + auto service = + application_manager_.GetAppServiceManager().FindServiceByID(service_id); + if (!service) { + LOG4CXX_ERROR(logger_, + "OASD notification received with an unpublished service ID"); + return false; + } + + using namespace ns_smart_device_link::ns_smart_objects; + if (service && service->mobile_service && + EnumConversionHelper<mobile_apis::AppServiceType::eType>::StringToEnum( + service_type, &service_type_value)) { + auto app = application_manager_.application(service->connection_key); + if (!app) { + LOG4CXX_ERROR(logger_, + "Failed to find service provider for OASD message"); + return false; + } + + if (service_type_value == mobile_apis::AppServiceType::WEATHER && + service_data.keyExists(strings::weather_service_data)) { + GetWeatherImagePaths(service_data[strings::weather_service_data], app); + } + + if (service_type_value == mobile_apis::AppServiceType::NAVIGATION && + service_data.keyExists(strings::navigation_service_data)) { + GetNavigationImagePaths(service_data[strings::navigation_service_data], + app); + } + } + return true; +} + void OnASAppServiceDataNotification::Run() { LOG4CXX_AUTO_TRACE(logger_); LOG4CXX_DEBUG(logger_, "Sending AS data to HMI"); - SendNotification(); + if (ValidateParams((*message_)[strings::msg_params])) { + SendNotification(); + } } } // namespace commands |