summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander <akutsan@luxoft.com>2018-09-09 21:51:54 +0300
committerAndriy Byzhynar <abyzhynar@luxoft.com>2018-09-17 17:05:35 +0300
commit85cddfd136de8d5bdc78456f02f35980389d0a8c (patch)
treea8172f26c239cd26503c72b6e76dbad7f3a68339
parent3a42a251f3c62094fc2a71756d16febefa0dcbe9 (diff)
downloadsdl_core-85cddfd136de8d5bdc78456f02f35980389d0a8c.tar.gz
Analyse response on vehicle data subscriptions and revert if it is
partiay failed
-rw-r--r--src/components/application_manager/include/application_manager/resumption/resumption_data_processor.h5
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_app_extension.h2
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_plugin.h4
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_app_extension.cc8
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc36
-rw-r--r--src/components/application_manager/src/resumption/resumption_data_processor.cc80
6 files changed, 98 insertions, 37 deletions
diff --git a/src/components/application_manager/include/application_manager/resumption/resumption_data_processor.h b/src/components/application_manager/include/application_manager/resumption/resumption_data_processor.h
index 0e9a5cb242..4337123f9e 100644
--- a/src/components/application_manager/include/application_manager/resumption/resumption_data_processor.h
+++ b/src/components/application_manager/include/application_manager/resumption/resumption_data_processor.h
@@ -61,6 +61,8 @@ struct ApplicationResumptionStatus {
std::vector<ResumptionRequest> list_of_sent_requests;
std::vector<ResumptionRequest> error_requests;
std::vector<ResumptionRequest> successful_requests;
+ std::vector<std::string> unsuccesfull_vehicle_data_subscriptions_;
+ std::vector<std::string> succesfull_vehicle_data_subscriptions_;
};
/**
@@ -291,6 +293,9 @@ class ResumptionDataProcessor : public app_mngr::event_engine::EventObserver {
*/
bool IsRequestSuccessful(const smart_objects::SmartObject& response) const;
+ void CheckVehicleDataResponse(const smart_objects::SmartObject& request,
+ const smart_objects::SmartObject& response,
+ ApplicationResumptionStatus& status);
/**
* @brief A map of the IDs and Application Resumption Status for these ID
**/
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_app_extension.h b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_app_extension.h
index b2f63e57a2..30e4f3ab4f 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_app_extension.h
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/include/vehicle_info_plugin/vehicle_info_app_extension.h
@@ -93,7 +93,7 @@ class VehicleInfoAppExtension : public app_mngr::AppExtension {
* @brief Subscriptions get list of subscriptions for application extension
* @return list of subscriptions for application extension
*/
- VehicleInfoSubscriptions Subscriptions();
+ const VehicleInfoSubscriptions& Subscriptions();
/**
* @brief SaveResumptionData saves vehicle info data
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 c4181114d2..1b094a50d8 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
@@ -78,11 +78,11 @@ class VehicleInfoPlugin : public plugins::RPCPlugin {
* @param subscriptions Subscriptions to be returned
**/
void RevertResumption(app_mngr::Application& app,
- VehicleInfoAppExtension& ext);
+ std::set<std::string> list_of_subscriptions);
smart_objects::SmartObjectSPtr CreateSubscriptionRequest(
const uint32_t app_id,
- VehicleInfoAppExtension& ext,
+ std::set<std::string> list_of_subscriptions,
const SubscribeStatus subscribe_status);
private:
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 251b48890e..43b459a248 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
@@ -80,7 +80,7 @@ bool VehicleInfoAppExtension::isSubscribedToVehicleInfo(
return subscribed_data_.find(vehicle_data) != subscribed_data_.end();
}
-VehicleInfoSubscriptions VehicleInfoAppExtension::Subscriptions() {
+const VehicleInfoSubscriptions& VehicleInfoAppExtension::Subscriptions() {
return subscribed_data_;
}
@@ -126,12 +126,8 @@ void VehicleInfoAppExtension::ProcessResumption(
void VehicleInfoAppExtension::RevertResumption(
const smart_objects::SmartObject& subscriptions) {
- if (!subscriptions.keyExists(strings::application_vehicle_info)) {
- LOG4CXX_DEBUG(logger_, "application_vehicle_info section is not exists");
- return;
- }
- plugin_.RevertResumption(app_, *this);
unsubscribeFromVehicleInfo();
+ plugin_.RevertResumption(app_, subscriptions.enumerate());
}
VehicleInfoAppExtension& VehicleInfoAppExtension::ExtractVIExtension(
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 922861a24d..58a11c1263 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
@@ -86,8 +86,17 @@ void VehicleInfoPlugin::ProcessResumptionSubscription(
VehicleInfoAppExtension& ext,
resumption::Subscriber subscriber) {
LOG4CXX_AUTO_TRACE(logger_);
+
+ std::set<std::string> subscriptions;
+ for (auto& ivi : application_manager::MessageHelper::vehicle_data()) {
+ const auto it = ext.Subscriptions().find(ivi.second);
+ if (ext.Subscriptions().end() != it) {
+ subscriptions.insert(ivi.first);
+ }
+ }
+
smart_objects::SmartObjectSPtr request =
- CreateSubscriptionRequest(app.app_id(), ext, SUBSCRIBE);
+ CreateSubscriptionRequest(app.app_id(), subscriptions, SUBSCRIBE);
resumption::ResumptionRequest resumption_request;
resumption_request.request_ids.correlation_id =
@@ -101,28 +110,29 @@ void VehicleInfoPlugin::ProcessResumptionSubscription(
application_manager_->GetRPCService().ManageHMICommand(request);
}
-void VehicleInfoPlugin::RevertResumption(application_manager::Application& app,
- VehicleInfoAppExtension& ext) {
+void VehicleInfoPlugin::RevertResumption(
+ application_manager::Application& app,
+ std::set<std::string> list_of_subscriptions) {
LOG4CXX_AUTO_TRACE(logger_);
- smart_objects::SmartObjectSPtr request =
- CreateSubscriptionRequest(app.app_id(), ext, UNSUBSCRIBE);
+
+ if (list_of_subscriptions.empty()) {
+ LOG4CXX_DEBUG(logger_, "No data to unsubscribe");
+ return;
+ }
+ smart_objects::SmartObjectSPtr request = CreateSubscriptionRequest(
+ app.app_id(), list_of_subscriptions, UNSUBSCRIBE);
application_manager_->GetRPCService().ManageHMICommand(request);
}
smart_objects::SmartObjectSPtr VehicleInfoPlugin::CreateSubscriptionRequest(
const uint32_t app_id,
- VehicleInfoAppExtension& ext,
+ std::set<std::string> list_of_subscriptions,
const SubscribeStatus subscribe_status) {
LOG4CXX_AUTO_TRACE(logger_);
smart_objects::SmartObject msg_params =
smart_objects::SmartObject(smart_objects::SmartType_Map);
- const auto& subscriptions = ext.Subscriptions();
- for (auto& ivi_data : application_manager::MessageHelper::vehicle_data()) {
- mobile_apis::VehicleDataType::eType type_id = ivi_data.second;
- if (subscriptions.end() != subscriptions.find(type_id)) {
- std::string key_name = ivi_data.first;
- msg_params[key_name] = true;
- }
+ for (auto& ivi_data : list_of_subscriptions) {
+ msg_params[ivi_data] = true;
}
const auto function_id =
(subscribe_status == SUBSCRIBE)
diff --git a/src/components/application_manager/src/resumption/resumption_data_processor.cc b/src/components/application_manager/src/resumption/resumption_data_processor.cc
index 521df27951..96f3412251 100644
--- a/src/components/application_manager/src/resumption/resumption_data_processor.cc
+++ b/src/components/application_manager/src/resumption/resumption_data_processor.cc
@@ -111,8 +111,6 @@ void ResumptionDataProcessor::on_event(const event_engine::Event& event) {
const uint32_t app_id = app_id_ptr->second;
- LOG4CXX_DEBUG(logger_, "app_id is: " << app_id);
-
LOG4CXX_DEBUG(logger_,
"Found function id: " << app_id_ptr->first.function_id
<< " correlation id: "
@@ -146,21 +144,33 @@ void ResumptionDataProcessor::on_event(const event_engine::Event& event) {
} else {
status.error_requests.push_back(*request_ptr);
}
+
+ if (hmi_apis::FunctionID::VehicleInfo_SubscribeVehicleData ==
+ request_ids.function_id) {
+ CheckVehicleDataResponse(request_ptr->message, response, status);
+ }
+
list_of_sent_requests.erase(request_ptr);
if (!list_of_sent_requests.empty()) {
- LOG4CXX_DEBUG(logger_, "is not the last response for this application");
+ LOG4CXX_DEBUG(logger_,
+ "Resumption app "
+ << app_id << " not finished . Amount of requests left : "
+ << list_of_sent_requests.size());
return;
}
auto it = register_callbacks_.find(app_id);
DCHECK_OR_RETURN_VOID(it != register_callbacks_.end());
auto callback = it->second;
- if (status.error_requests.empty()) {
+ const bool successful_resumption =
+ status.error_requests.empty() &&
+ status.unsuccesfull_vehicle_data_subscriptions_.empty();
+ if (successful_resumption) {
LOG4CXX_DEBUG(logger_, "Resumption for app " << app_id << " successful");
callback(mobile_apis::Result::SUCCESS, "Data resumption succesful");
}
- if (!status.error_requests.empty()) {
+ if (!successful_resumption) {
LOG4CXX_ERROR(logger_, "Resumption for app " << app_id << "failed");
RevertRestoredData(application_manager_.application(app_id));
callback(mobile_apis::Result::RESUME_FAILED, "Data resumption failed");
@@ -185,7 +195,7 @@ void ResumptionDataProcessor::WaitForResponse(
const int32_t app_id, const ResumptionRequest& request) {
LOG4CXX_AUTO_TRACE(logger_);
LOG4CXX_DEBUG(logger_,
- "app " << app_id << "Subscribe on "
+ "App " << app_id << " subscribe on "
<< request.request_ids.function_id << " "
<< request.request_ids.correlation_id);
subscribe_on_event(request.request_ids.function_id,
@@ -674,16 +684,15 @@ void ResumptionDataProcessor::DeleteButtonsSubscriptions(
void ResumptionDataProcessor::DeletePluginsSubscriptions(
application_manager::ApplicationSharedPtr application) {
LOG4CXX_AUTO_TRACE(logger_);
- smart_objects::SmartObject extension_subscriptions;
- const ApplicationResumptionStatus& status =
- resumption_status_[application->app_id()];
- for (auto& request : status.successful_requests) {
- if (hmi_apis::FunctionID::VehicleInfo_SubscribeVehicleData ==
- request.request_ids.function_id) {
- extension_subscriptions[strings::application_vehicle_info] =
- request.message;
- }
+ auto it = resumption_status_.find(application->app_id());
+ DCHECK_OR_RETURN_VOID(it != resumption_status_.end());
+
+ const ApplicationResumptionStatus& status = it->second;
+ smart_objects::SmartObject extension_subscriptions;
+ for (auto ivi : status.succesfull_vehicle_data_subscriptions_) {
+ LOG4CXX_DEBUG(logger_, "ivi " << ivi << " should be deleted");
+ extension_subscriptions[ivi] = true;
}
for (auto& extension : application->Extensions()) {
@@ -701,4 +710,45 @@ bool ResumptionDataProcessor::IsRequestSuccessful(
result_code == hmi_apis::Common_Result::WARNINGS;
}
+void ResumptionDataProcessor::CheckVehicleDataResponse(
+ const smart_objects::SmartObject& request,
+ const smart_objects::SmartObject& response,
+ ApplicationResumptionStatus& status) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ if (!IsRequestSuccessful(response)) {
+ LOG4CXX_TRACE(logger_, "Vehicle data request not succesfull");
+ const auto keys = request[strings::msg_params].enumerate();
+ for (const auto key : keys) {
+ status.unsuccesfull_vehicle_data_subscriptions_.push_back(key);
+ }
+ return;
+ }
+
+ const auto& msg_params = response[strings::msg_params];
+ const auto keys = msg_params.enumerate();
+ if (keys.empty()) {
+ LOG4CXX_TRACE(logger_, "Successful subscription to all requested data");
+ const auto keys = request[strings::msg_params].enumerate();
+ for (const auto key : keys) {
+ status.succesfull_vehicle_data_subscriptions_.push_back(key);
+ }
+ return;
+ }
+ LOG4CXX_DEBUG(logger_, "keys size " << keys.size());
+ for (auto& ivi : keys) {
+ const auto& vd_response = msg_params[ivi];
+ const auto vd_result_code = vd_response[strings::result_code].asInt();
+ const auto kSuccess = hmi_apis::Common_VehicleDataResultCode::VDRC_SUCCESS;
+ if (kSuccess != vd_result_code) {
+ LOG4CXX_DEBUG(logger_,
+ "ivi " << ivi << " was not successfuly subscribed");
+
+ status.unsuccesfull_vehicle_data_subscriptions_.push_back(ivi);
+ } else {
+ status.succesfull_vehicle_data_subscriptions_.push_back(ivi);
+ LOG4CXX_DEBUG(logger_, "ivi " << ivi << " was successfuly subscribed");
+ }
+ }
+}
+
} // namespce resumption