diff options
10 files changed, 94 insertions, 14 deletions
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 e88c954c18..d17a32261c 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 @@ -1136,8 +1136,29 @@ class ApplicationManagerImpl */ protocol_handler::MajorProtocolVersion SupportedSDLVersion() const OVERRIDE; + /** + * @brief Applies functor for each plugin + * @param functor Functor that will be applied to each plugin + */ + void ForEachPlugin( + std::function<void(plugin_manager::RPCPlugin&)> functor) OVERRIDE; + private: /** + * @brief Adds application to registered applications list and marks it as + * registered + * @param application Application taht should be added to registered + * applications list. + */ + void AddAppToRegisteredAppList(ApplicationSharedPtr application); + + /** + * @brief Adds all extensions to applications + * @param application Application to which will be added extensions + */ + void AddExtensionsToApp(ApplicationSharedPtr application); + + /** * @brief Removes service status record for service that failed to start * @param app Application whose service status record should be removed * @param Service type which status record should be removed diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc index ca0edc90b1..f344dd15a7 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc @@ -175,6 +175,7 @@ const std::vector<std::string> RCHelpers::GetModuleTypesList() { RCAppExtensionPtr RCHelpers::GetRCExtension( application_manager::Application& app) { + LOG4CXX_AUTO_TRACE(logger_); auto extension_interface = app.QueryInterface(RCRPCPlugin::kRCPluginID); auto extension = std::static_pointer_cast<RCAppExtension>(extension_interface); diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc index 9005eb7fd0..a3c8d5afd8 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc @@ -107,7 +107,12 @@ void RCRPCPlugin::OnPolicyEvent( void RCRPCPlugin::OnApplicationEvent( application_manager::plugin_manager::ApplicationEvent event, application_manager::ApplicationSharedPtr application) { + LOG4CXX_AUTO_TRACE(logger_); if (!application->is_remote_control_supported()) { + LOG4CXX_DEBUG( + logger_, + "Remote control is not supported for application with app_id: " + << application->app_id()); return; } switch (event) { diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc index 97ff2b23da..049f9a3cf3 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc @@ -156,6 +156,7 @@ bool ResourceAllocationManagerImpl::IsUserLocationValid( ModuleUid& module, application_manager::ApplicationSharedPtr app) { LOG4CXX_AUTO_TRACE(logger_); const auto extension = RCHelpers::GetRCExtension(*app); + DCHECK_OR_RETURN(extension, false); const auto user_location = extension->GetUserLocation(); const auto module_service_area = rc_capabilities_manager_.GetModuleServiceArea(module); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc index 14a94fd1a2..f152742064 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc @@ -43,6 +43,7 @@ #include "application_manager/application_manager.h" #include "application_manager/helpers/application_helper.h" #include "application_manager/message_helper.h" +#include "application_manager/plugin_manager/plugin_keys.h" #include "application_manager/policies/policy_handler.h" #include "application_manager/policies/policy_handler_interface.h" #include "application_manager/resumption/resume_ctrl.h" @@ -875,6 +876,18 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile( // Default HMI level should be set before any permissions validation, since it // relies on HMI level. application_manager_.OnApplicationRegistered(application); + + if (application->is_remote_control_supported()) { + auto add_rc_extension = [application](plugin_manager::RPCPlugin& plugin) { + if (plugin.PluginName() == + application_manager::plugin_manager::plugin_names::rc_rpc_plugin) { + plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered, + application); + } + }; + application_manager_.ForEachPlugin(add_rc_extension); + } + SendOnAppRegisteredNotificationToHMI( application, resumption, need_restore_vr); (*notify_upd_manager)(); diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc index 40da7501c1..3017b6712f 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc @@ -98,6 +98,7 @@ void VehicleInfoPlugin::OnApplicationEvent( } void VehicleInfoPlugin::UnsubscribeFromRemovedVDItems() { + LOG4CXX_AUTO_TRACE(logger_); typedef std::vector<std::string> StringsVector; auto get_items_to_unsubscribe = [this]() -> StringsVector { diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index 8044e8b6cd..75b9b855dc 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -434,12 +434,6 @@ void ApplicationManagerImpl::OnApplicationRegistered(ApplicationSharedPtr app) { sync_primitives::AutoLock lock(applications_list_lock_ptr_); const mobile_apis::HMILevel::eType default_level = GetDefaultHmiLevel(app); state_ctrl_.OnApplicationRegistered(app, default_level); - - std::function<void(plugin_manager::RPCPlugin&)> on_app_registered = - [app](plugin_manager::RPCPlugin& plugin) { - plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered, app); - }; - plugin_manager_->ForEachPlugin(on_app_registered); } void ApplicationManagerImpl::OnApplicationSwitched(ApplicationSharedPtr app) { @@ -729,14 +723,8 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication( // Timer will be started after hmi level resumption. resume_controller().OnAppRegistrationStart(policy_app_id, device_mac); - // Add application to registered app list and set appropriate mark. - // Lock has to be released before adding app to policy DB to avoid possible - // deadlock with simultaneous PTU processing - applications_list_lock_ptr_->Acquire(); - application->MarkRegistered(); - applications_.insert(application); - apps_size_ = applications_.size(); - applications_list_lock_ptr_->Release(); + AddAppToRegisteredAppList(application); + AddExtensionsToApp(application); // Update cloud app information, in case any pending apps are unable to be // registered due to a mobile app taking precedence @@ -4176,6 +4164,42 @@ ApplicationManagerImpl::SupportedSDLVersion() const { get_settings().max_supported_protocol_version()); } +void ApplicationManagerImpl::AddAppToRegisteredAppList( + ApplicationSharedPtr application) { + LOG4CXX_AUTO_TRACE(logger_); + DCHECK_OR_RETURN_VOID(application); + sync_primitives::AutoLock lock(applications_list_lock_ptr_); + + // Add application to registered app list and set appropriate mark. + application->MarkRegistered(); + applications_.insert(application); + LOG4CXX_DEBUG( + logger_, + "App with app_id: " << application->app_id() + << " has been added to registered applications list"); + apps_size_ = static_cast<uint32_t>(applications_.size()); +} + +void ApplicationManagerImpl::AddExtensionsToApp( + ApplicationSharedPtr application) { + LOG4CXX_AUTO_TRACE(logger_); + DCHECK_OR_RETURN_VOID(application); + sync_primitives::AutoLock lock(applications_list_lock_ptr_); + + std::function<void(plugin_manager::RPCPlugin&)> on_app_registered = + [application](plugin_manager::RPCPlugin& plugin) { + plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered, + application); + }; + plugin_manager_->ForEachPlugin(on_app_registered); +} + +void ApplicationManagerImpl::ForEachPlugin( + std::function<void(plugin_manager::RPCPlugin&)> functor) { + LOG4CXX_AUTO_TRACE(logger_); + plugin_manager_->ForEachPlugin(functor); +} + event_engine::EventDispatcher& ApplicationManagerImpl::event_dispatcher() { return event_dispatcher_; } diff --git a/src/components/application_manager/test/application_manager_impl_test.cc b/src/components/application_manager/test/application_manager_impl_test.cc index 152d577cda..aa82c6b86b 100644 --- a/src/components/application_manager/test/application_manager_impl_test.cc +++ b/src/components/application_manager/test/application_manager_impl_test.cc @@ -90,6 +90,7 @@ using ::testing::SaveArg; using ::testing::SetArgPointee; using ::testing::SetArgReferee; +using application_manager::plugin_manager::MockRPCPluginManager; using test::components::application_manager_test::MockStateController; using test::components::policy_test::MockPolicyHandlerInterface; @@ -1607,6 +1608,9 @@ TEST_F(ApplicationManagerImplTest, smart_objects::SmartObjectSPtr request_for_registration_ptr = std::make_shared<smart_objects::SmartObject>(request_for_registration); + std::unique_ptr<plugin_manager::RPCPluginManager> rpc_plugin_manager( + new MockRPCPluginManager()); + app_manager_impl_->SetPluginManager(rpc_plugin_manager); ApplicationSharedPtr application = app_manager_impl_->RegisterApplication(request_for_registration_ptr); EXPECT_STREQ(kAppName.c_str(), application->name().c_str()); @@ -1774,6 +1778,9 @@ TEST_F(ApplicationManagerImplTest, smart_objects::SmartObjectSPtr request_for_registration_ptr = std::make_shared<smart_objects::SmartObject>(request_for_registration); + std::unique_ptr<plugin_manager::RPCPluginManager> rpc_plugin_manager( + new MockRPCPluginManager()); + app_manager_impl_->SetPluginManager(rpc_plugin_manager); ApplicationSharedPtr application = app_manager_impl_->RegisterApplication(request_for_registration_ptr); diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h index fa2e8941b8..23e6a44395 100644 --- a/src/components/include/application_manager/application_manager.h +++ b/src/components/include/application_manager/application_manager.h @@ -664,6 +664,9 @@ class ApplicationManager { virtual protocol_handler::MajorProtocolVersion SupportedSDLVersion() const = 0; + virtual void ForEachPlugin( + std::function<void(plugin_manager::RPCPlugin&)> functor) = 0; + /* * @brief Converts connection string transport type representation * to HMI Common_TransportType 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 e533228656..abb3d9a882 100644 --- a/src/components/include/test/application_manager/mock_application_manager.h +++ b/src/components/include/test/application_manager/mock_application_manager.h @@ -269,6 +269,10 @@ class MockApplicationManager : public application_manager::ApplicationManager { MOCK_CONST_METHOD0(SupportedSDLVersion, protocol_handler::MajorProtocolVersion()); MOCK_METHOD1( + ForEachPlugin, + void(std::function<void(application_manager::plugin_manager::RPCPlugin&)> + functor)); + MOCK_METHOD1( GetDeviceTransportType, hmi_apis::Common_TransportType::eType(const std::string& transport_type)); MOCK_METHOD1(AddAppToTTSGlobalPropertiesList, void(const uint32_t app_id)); |