diff options
Diffstat (limited to 'src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_app_extension.cc')
-rw-r--r-- | src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_app_extension.cc | 129 |
1 files changed, 108 insertions, 21 deletions
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_app_extension.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_app_extension.cc index 149299d3bb..dd6d797e39 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_app_extension.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_app_extension.cc @@ -33,9 +33,10 @@ #include "vehicle_info_plugin/vehicle_info_app_extension.h" #include "vehicle_info_plugin/vehicle_info_plugin.h" -CREATE_LOGGERPTR_GLOBAL(logger_, "VehicleInfoPlugin") +SDL_CREATE_LOG_VARIABLE("VehicleInfoPlugin") namespace vehicle_info_plugin { +namespace strings = application_manager::strings; unsigned VehicleInfoAppExtension::VehicleInfoAppExtensionUID = 146; @@ -43,24 +44,28 @@ VehicleInfoAppExtension::VehicleInfoAppExtension( VehicleInfoPlugin& plugin, application_manager::Application& app) : app_mngr::AppExtension( VehicleInfoAppExtension::VehicleInfoAppExtensionUID) + , subscribed_data_lock_(std::make_shared<sync_primitives::Lock>()) + , pending_subscriptions_lock_(std::make_shared<sync_primitives::Lock>()) , plugin_(plugin) , app_(app) { - LOG4CXX_AUTO_TRACE(logger_); + SDL_LOG_AUTO_TRACE(); } VehicleInfoAppExtension::~VehicleInfoAppExtension() { - LOG4CXX_AUTO_TRACE(logger_); + SDL_LOG_AUTO_TRACE(); } bool VehicleInfoAppExtension::subscribeToVehicleInfo( const std::string& vehicle_data) { - LOG4CXX_DEBUG(logger_, vehicle_data); + SDL_LOG_DEBUG(vehicle_data); + sync_primitives::AutoLock lock(*subscribed_data_lock_); return subscribed_data_.insert(vehicle_data).second; } bool VehicleInfoAppExtension::unsubscribeFromVehicleInfo( const std::string& vehicle_data) { - LOG4CXX_DEBUG(logger_, vehicle_data); + SDL_LOG_DEBUG(vehicle_data); + sync_primitives::AutoLock lock(*subscribed_data_lock_); auto it = subscribed_data_.find(vehicle_data); if (it != subscribed_data_.end()) { subscribed_data_.erase(it); @@ -70,44 +75,126 @@ bool VehicleInfoAppExtension::unsubscribeFromVehicleInfo( } void VehicleInfoAppExtension::unsubscribeFromVehicleInfo() { - LOG4CXX_AUTO_TRACE(logger_); + SDL_LOG_AUTO_TRACE(); + sync_primitives::AutoLock lock(*subscribed_data_lock_); subscribed_data_.clear(); } bool VehicleInfoAppExtension::isSubscribedToVehicleInfo( const std::string& vehicle_data) const { - LOG4CXX_DEBUG(logger_, vehicle_data); + SDL_LOG_DEBUG(vehicle_data); + sync_primitives::AutoLock lock(*subscribed_data_lock_); return subscribed_data_.find(vehicle_data) != subscribed_data_.end(); } -VehicleInfoSubscriptions VehicleInfoAppExtension::Subscriptions() { - return subscribed_data_; +bool VehicleInfoAppExtension::isPendingSubscriptionToVehicleInfo( + const std::string& vehicle_data) const { + SDL_LOG_DEBUG(vehicle_data); + sync_primitives::AutoLock lock(*pending_subscriptions_lock_); + return pending_subscriptions_.find(vehicle_data) != + pending_subscriptions_.end(); +} + +const DataAccessor<VehicleInfoSubscriptions> +VehicleInfoAppExtension::Subscriptions() { + DataAccessor<VehicleInfoSubscriptions> data_accessor(subscribed_data_, + subscribed_data_lock_); + return data_accessor; +} + +bool VehicleInfoAppExtension::AddPendingSubscription( + const std::string& vehicle_data) { + sync_primitives::AutoLock lock(*pending_subscriptions_lock_); + return pending_subscriptions_.insert(vehicle_data).second; +} + +bool VehicleInfoAppExtension::RemovePendingSubscription( + const std::string& vehicle_data) { + SDL_LOG_DEBUG(vehicle_data); + sync_primitives::AutoLock lock(*pending_subscriptions_lock_); + auto it = pending_subscriptions_.find(vehicle_data); + if (it != pending_subscriptions_.end()) { + pending_subscriptions_.erase(it); + return true; + } + return false; +} + +void VehicleInfoAppExtension::RemovePendingSubscriptions() { + sync_primitives::AutoLock lock(*pending_subscriptions_lock_); + pending_subscriptions_.clear(); +} + +const DataAccessor<VehicleInfoSubscriptions> +VehicleInfoAppExtension::PendingSubscriptions() { + return DataAccessor<VehicleInfoSubscriptions>(pending_subscriptions_, + pending_subscriptions_lock_); } void VehicleInfoAppExtension::SaveResumptionData( smart_objects::SmartObject& resumption_data) { - const char* application_vehicle_info = "vehicleInfo"; - resumption_data[application_vehicle_info] = + resumption_data[strings::application_vehicle_info] = smart_objects::SmartObject(smart_objects::SmartType_Array); int i = 0; + sync_primitives::AutoLock lock(*subscribed_data_lock_); for (const auto& subscription : subscribed_data_) { - resumption_data[application_vehicle_info][i++] = subscription; + resumption_data[strings::application_vehicle_info][i++] = subscription; } } void VehicleInfoAppExtension::ProcessResumption( + const smart_objects::SmartObject& saved_app) { + SDL_LOG_AUTO_TRACE(); + + if (!saved_app.keyExists(strings::application_subscriptions)) { + SDL_LOG_DEBUG("application_subscriptions section is not exists"); + return; + } + + const smart_objects::SmartObject& resumption_data = + saved_app[strings::application_subscriptions]; + + if (!resumption_data.keyExists(strings::application_vehicle_info)) { + SDL_LOG_DEBUG("application_vehicle_info section is not exists"); + return; + } + + const auto subscriptions_ivi = + resumption_data[strings::application_vehicle_info].asArray(); + for (const auto& ivi : *subscriptions_ivi) { + AddPendingSubscription(ivi.asString()); + } + if (!subscriptions_ivi->empty()) { + plugin_.ProcessResumptionSubscription(app_, *this); + } +} + +void VehicleInfoAppExtension::RevertResumption( const smart_objects::SmartObject& resumption_data) { - const char* application_vehicle_info = "vehicleInfo"; - if (resumption_data.keyExists(application_vehicle_info)) { - const auto* subscriptions_ivi = - resumption_data[application_vehicle_info].asArray(); - if (subscriptions_ivi) { - for (const auto& ivi : (*subscriptions_ivi)) { - subscribeToVehicleInfo(ivi.asString()); - } + SDL_LOG_AUTO_TRACE(); + + unsubscribeFromVehicleInfo(); + + if (!resumption_data.keyExists( + application_manager::hmi_interface::vehicle_info)) { + SDL_LOG_DEBUG("No resumption vahicle data subscription to revert"); + return; + } + const auto& resumption_vd_data = + resumption_data[application_manager::hmi_interface::vehicle_info]; + + std::set<std::string> ivi_subscriptions_to_revert; + const auto ivi_subscriptions_keys = resumption_vd_data.enumerate(); + for (const auto& key : ivi_subscriptions_keys) { + // Only boolean keys in subscriptions list are true vehicle data + // subscriptions + if (smart_objects::SmartType::SmartType_Boolean == + resumption_vd_data.getElement(key).getType()) { + ivi_subscriptions_to_revert.insert(key); } - plugin_.ProcessResumptionSubscription(app_, *this); } + + plugin_.RevertResumption(app_, ivi_subscriptions_to_revert); } VehicleInfoAppExtension& VehicleInfoAppExtension::ExtractVIExtension( |