diff options
Diffstat (limited to 'src/components')
8 files changed, 352 insertions, 22 deletions
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 67c849c8fc..5d04207200 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 @@ -321,6 +321,19 @@ extern const char* service_published; extern const char* service_active; extern const char* app_service_id; extern const char* service_data; +extern const char* media_service_data; +extern const char* weather_service_data; +extern const char* location; +extern const char* current_forecast; +extern const char* minute_forecast; +extern const char* hourly_forecast; +extern const char* multiday_forecast; +extern const char* weather_icon; +extern const char* navigation_service_data; +extern const char* origin; +extern const char* destination; +extern const char* instructions; +extern const char* location_details; extern const char* request_service_active; extern const char* app_services; extern const char* update_reason; diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/as_get_app_service_data_request_from_hmi.h b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/as_get_app_service_data_request_from_hmi.h index 7b175fc0d4..531d1816e9 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/as_get_app_service_data_request_from_hmi.h +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/as_get_app_service_data_request_from_hmi.h @@ -88,6 +88,12 @@ class ASGetAppServiceDataRequestFromHMI void on_event(const app_mngr::event_engine::MobileEvent& event) OVERRIDE; private: + void GetWeatherImagePaths(smart_objects::SmartObject& data, + application_manager::ApplicationSharedPtr app); + void GetNavigationImagePaths(smart_objects::SmartObject& data, + application_manager::ApplicationSharedPtr app); + bool ValidateResponse(smart_objects::SmartObject& message_params); + DISALLOW_COPY_AND_ASSIGN(ASGetAppServiceDataRequestFromHMI); }; diff --git a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/on_as_app_service_data_notification.h b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/on_as_app_service_data_notification.h index 30af13038a..cff7c8e5b8 100644 --- a/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/on_as_app_service_data_notification.h +++ b/src/components/application_manager/rpc_plugins/app_service_rpc_plugin/include/app_service_rpc_plugin/commands/hmi/on_as_app_service_data_notification.h @@ -70,6 +70,12 @@ class OnASAppServiceDataNotification virtual void Run(); private: + void GetWeatherImagePaths(smart_objects::SmartObject& data, + application_manager::ApplicationSharedPtr app); + void GetNavigationImagePaths(smart_objects::SmartObject& data, + application_manager::ApplicationSharedPtr app); + bool ValidateParams(smart_objects::SmartObject& message_params); + DISALLOW_COPY_AND_ASSIGN(OnASAppServiceDataNotification); }; 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 diff --git a/src/components/application_manager/src/commands/command_notification_from_mobile_impl.cc b/src/components/application_manager/src/commands/command_notification_from_mobile_impl.cc index f9b084323a..26b43856f7 100644 --- a/src/components/application_manager/src/commands/command_notification_from_mobile_impl.cc +++ b/src/components/application_manager/src/commands/command_notification_from_mobile_impl.cc @@ -90,7 +90,7 @@ void CommandNotificationFromMobileImpl::SendNotificationToHMI( const hmi_apis::FunctionID::eType& hmi_function_id) { (*message_)[strings::params][strings::protocol_type] = hmi_protocol_type_; (*message_)[strings::params][strings::function_id] = hmi_function_id; - rpc_service_.SendMessageToHMI(message_); + rpc_service_.ManageHMICommand(message_, SOURCE_SDL_TO_HMI); } void CommandNotificationFromMobileImpl::SendNotificationToConsumers( diff --git a/src/components/application_manager/src/commands/notification_from_hmi.cc b/src/components/application_manager/src/commands/notification_from_hmi.cc index b6bb8d4e3c..5e1314bad3 100644 --- a/src/components/application_manager/src/commands/notification_from_hmi.cc +++ b/src/components/application_manager/src/commands/notification_from_hmi.cc @@ -84,7 +84,7 @@ void NotificationFromHMI::SendNotificationToMobile( void NotificationFromHMI::SendNotificationToHMI(MessageSharedPtr& message) { (*message)[strings::params][strings::protocol_type] = hmi_protocol_type_; - rpc_service_.SendMessageToHMI(message); + rpc_service_.ManageHMICommand(message, SOURCE_SDL_TO_HMI); } void NotificationFromHMI::CreateHMIRequest( diff --git a/src/components/application_manager/src/smart_object_keys.cc b/src/components/application_manager/src/smart_object_keys.cc index a1dedd1d64..48e293a782 100644 --- a/src/components/application_manager/src/smart_object_keys.cc +++ b/src/components/application_manager/src/smart_object_keys.cc @@ -288,6 +288,19 @@ const char* service_published = "servicePublished"; const char* service_active = "serviceActive"; const char* app_service_id = "appServiceId"; const char* service_data = "serviceData"; +const char* media_service_data = "mediaServiceData"; +const char* weather_service_data = "weatherServiceData"; +const char* location = "location"; +const char* current_forecast = "currentForecast"; +const char* minute_forecast = "minuteForecast"; +const char* hourly_forecast = "hourlyForecast"; +const char* multiday_forecast = "multidayForecast"; +const char* weather_icon = "weatherIcon"; +const char* navigation_service_data = "navigationServiceData"; +const char* origin = "origin"; +const char* destination = "destination"; +const char* instructions = "instructions"; +const char* location_details = "locationDetails"; const char* request_service_active = "requestServiceActive"; const char* app_services = "appServices"; const char* update_reason = "updateReason"; |