diff options
Diffstat (limited to 'src/components/application_manager/src/commands/hmi/on_driver_distraction_notification.cc')
-rw-r--r-- | src/components/application_manager/src/commands/hmi/on_driver_distraction_notification.cc | 70 |
1 files changed, 56 insertions, 14 deletions
diff --git a/src/components/application_manager/src/commands/hmi/on_driver_distraction_notification.cc b/src/components/application_manager/src/commands/hmi/on_driver_distraction_notification.cc index 4c322c456f..a895d353ce 100644 --- a/src/components/application_manager/src/commands/hmi/on_driver_distraction_notification.cc +++ b/src/components/application_manager/src/commands/hmi/on_driver_distraction_notification.cc @@ -34,8 +34,10 @@ #include "application_manager/commands/hmi/on_driver_distraction_notification.h" #include "application_manager/application_impl.h" +#include "application_manager/message_helper.h" #include "interfaces/MOBILE_API.h" #include "interfaces/HMI_API.h" +#include "utils/make_shared.h" namespace application_manager { @@ -43,6 +45,53 @@ namespace commands { namespace hmi { +namespace { +struct OnDriverDistractionProcessor { + OnDriverDistractionProcessor( + OnDriverDistractionNotification& command, + smart_objects::SmartObjectSPtr on_driver_distraction_so, + ApplicationManager& application_manager) + : command_(command) + , on_driver_distraction_so_(on_driver_distraction_so) + , application_manager_(application_manager) + , stringified_function_id_(MessageHelper::StringifiedFunctionID( + mobile_api::FunctionID::OnDriverDistractionID)) {} + + void operator()(ApplicationSharedPtr application) { + if (application) { + (*on_driver_distraction_so_)[strings::params][strings::connection_key] = + application->app_id(); + const RPCParams params; + policy::CheckPermissionResult result; + application_manager_.GetPolicyHandler().CheckPermissions( + application, stringified_function_id_, params, result); + if (result.hmi_level_permitted != policy::kRpcAllowed) { + MobileMessageQueue messages; + application->SwapMobileMessageQueue(messages); + messages.erase( + std::remove_if( + messages.begin(), + messages.end(), + [this](smart_objects::SmartObjectSPtr message) { + return (*message)[strings::params][strings::function_id] + .asString() == stringified_function_id_; + }), + messages.end()); + application->PushMobileMessage(on_driver_distraction_so_); + return; + } + command_.SendNotificationToMobile(on_driver_distraction_so_); + } + } + + private: + OnDriverDistractionNotification& command_; + smart_objects::SmartObjectSPtr on_driver_distraction_so_; + ApplicationManager& application_manager_; + std::string stringified_function_id_; +}; +} + OnDriverDistractionNotification::OnDriverDistractionNotification( const MessageSharedPtr& message, ApplicationManager& application_manager) : NotificationFromHMI(message, application_manager) {} @@ -51,38 +100,31 @@ OnDriverDistractionNotification::~OnDriverDistractionNotification() {} void OnDriverDistractionNotification::Run() { LOG4CXX_AUTO_TRACE(logger_); - const hmi_apis::Common_DriverDistractionState::eType state = static_cast<hmi_apis::Common_DriverDistractionState::eType>( (*message_)[strings::msg_params][hmi_notification::state].asInt()); - application_manager_.set_driver_distraction(state); + application_manager_.set_driver_distraction_state(state); smart_objects::SmartObjectSPtr on_driver_distraction = - new smart_objects::SmartObject(); + utils::MakeShared<smart_objects::SmartObject>(); if (!on_driver_distraction) { LOG4CXX_ERROR(logger_, "NULL pointer"); return; } - (*on_driver_distraction)[strings::params][strings::function_id] = mobile_api::FunctionID::OnDriverDistractionID; - + (*on_driver_distraction)[strings::params][strings::message_type] = + static_cast<int32_t>(application_manager::MessageType::kNotification); (*on_driver_distraction)[strings::msg_params][mobile_notification::state] = state; const ApplicationSet applications = application_manager_.applications().GetData(); - ApplicationSetConstIt it = applications.begin(); - for (; applications.end() != it; ++it) { - const ApplicationSharedPtr app = *it; - if (app) { - (*on_driver_distraction)[strings::params][strings::connection_key] = - app->app_id(); - SendNotificationToMobile(on_driver_distraction); - } - } + OnDriverDistractionProcessor processor( + *this, on_driver_distraction, application_manager_); + std::for_each(applications.begin(), applications.end(), processor); } } // namespace hmi |