diff options
author | Alexander <akutsan@luxoft.com> | 2018-09-09 21:51:54 +0300 |
---|---|---|
committer | Andriy Byzhynar <abyzhynar@luxoft.com> | 2018-09-17 17:05:35 +0300 |
commit | 85cddfd136de8d5bdc78456f02f35980389d0a8c (patch) | |
tree | a8172f26c239cd26503c72b6e76dbad7f3a68339 | |
parent | 3a42a251f3c62094fc2a71756d16febefa0dcbe9 (diff) | |
download | sdl_core-85cddfd136de8d5bdc78456f02f35980389d0a8c.tar.gz |
Analyse response on vehicle data subscriptions and revert if it is
partiay failed
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 |