diff options
3 files changed, 61 insertions, 1 deletions
diff --git a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h index ecc6b2c265..c9a34a75d6 100644 --- a/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h +++ b/src/components/application_manager/include/application_manager/plugin_manager/rpc_plugin.h @@ -56,7 +56,8 @@ enum PolicyEvent { kApplicationPolicyUpdated = 0, kApplicationsDisabled }; enum ApplicationEvent { kApplicationExit = 0, kApplicationRegistered, - kApplicationUnregistered + kApplicationUnregistered, + kDeleteApplicationData }; class RPCPlugin { diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h index 2e4978a40e..16b644cfb3 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h @@ -66,6 +66,8 @@ class VehicleInfoPlugin : public plugins::RPCPlugin { VehicleInfoAppExtension& ext); private: + void DeleteSubscriptions(app_mngr::ApplicationSharedPtr app); + std::unique_ptr<app_mngr::CommandFactory> command_factory_; app_mngr::ApplicationManager* application_manager_; static const VehicleData vehicle_data_; 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 815a7e435b..09d9ce999f 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 @@ -158,6 +158,63 @@ void VehicleInfoPlugin::ProcessResumptionSubscription( (*request)[strings::msg_params] = msg_params; application_manager_->GetRPCService().ManageHMICommand(request); } + +auto FindAppSubscribedToIVI(mobile_apis::VehicleDataType::eType ivi_data, + application_manager::ApplicationManager& app_mngr) { + auto& applications = app_mngr.applications(); + + for (auto& app : applications) { + auto& ext = VehicleInfoAppExtension::ExtractVIExtension(app); + if (ext.isSubscribedToVehicleInfo(ivi_data)) { + return app; + } + } + return application_manager::ApplicationSharedPtr; +} + +auto GetUnsubscribeIVIRequest( + int32_t ivi_id, application_manager::ApplicationManager& app_mngr) { + using namespace smart_objects; + + auto find_ivi_name = [ivi_id]() { + for (auto item : VehicleInfoPlugin::vehicle_data_) { + if (ivi_id == item.second) { + return item.first; + } + } + return std::string(); + }; + std::string key_name = find_ivi_name(); + DCHECK_OR_RETURN_VOID(!key_name.empty()); + smart_objects::SmartObject msg_params = + smart_objects::SmartObject(smart_objects::SmartType_Map); + msg_params[key_name] = true; + + SmartObjectSPtr message = CreateMessageForHMI( + hmi_apis::messageType::request, app_mngr.GetNextHMICorrelationID()); + DCHECK(message); + + SmartObject& object = *message; + object[strings::params][strings::function_id] = + hmi_apis::FunctionID::VehicleInfo_UnsubscribeVehicleData; + + object[strings::msg_params] = msg_params; + return message; +} + +void VehicleInfoPlugin::DeleteSubscriptions( + application_manager::ApplicationSharedPtr app) { + auto& ext = VehicleInfoAppExtension::ExtractVIExtension(app); + auto subscriptions = ext.Subscriptions(); + for (auto& ivi : subscriptions) { + ext.unsubscribeFromVehicleInfo(ivi); + still_subscribed_app = FindAppSubscribedToIVI(ivi, application_manager_); + if (!still_subscribed_app) { + auto message = GetUnsubscribeIVIRequest(ivi, application_manager_); + app_mngr.GetRPCService().ManageHMICommand(message); + } + } +} } extern "C" application_manager::plugin_manager::RPCPlugin* Create() { |