summaryrefslogtreecommitdiff
path: root/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_app_extension.cc
diff options
context:
space:
mode:
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.cc129
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(