summaryrefslogtreecommitdiff
path: root/src/components/application_manager/src/commands/command_request_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/application_manager/src/commands/command_request_impl.cc')
-rw-r--r--src/components/application_manager/src/commands/command_request_impl.cc906
1 files changed, 74 insertions, 832 deletions
diff --git a/src/components/application_manager/src/commands/command_request_impl.cc b/src/components/application_manager/src/commands/command_request_impl.cc
index 08bf25de54..2929144883 100644
--- a/src/components/application_manager/src/commands/command_request_impl.cc
+++ b/src/components/application_manager/src/commands/command_request_impl.cc
@@ -30,171 +30,18 @@
POSSIBILITY OF SUCH DAMAGE.
*/
-#include <algorithm>
-#include <numeric>
-#include <string>
-#include "utils/macro.h"
-
#include "application_manager/commands/command_request_impl.h"
-#include "application_manager/app_service_manager.h"
-#include "application_manager/application_manager.h"
+#include "application_manager/application_impl.h"
#include "application_manager/message_helper.h"
#include "application_manager/rpc_service.h"
-#include "smart_objects/smart_object.h"
-
#include "smart_objects/enum_schema_item.h"
+#include "smart_objects/smart_object.h"
namespace application_manager {
-
namespace commands {
-SDL_CREATE_LOG_VARIABLE("Commands");
-
-std::string MergeInfos(const ResponseInfo& first_info,
- const std::string& first_str,
- const ResponseInfo& second_info,
- const std::string& second_str) {
- if ((first_info.interface_state == HmiInterfaces::STATE_NOT_AVAILABLE) &&
- (second_info.interface_state != HmiInterfaces::STATE_NOT_AVAILABLE) &&
- !second_str.empty()) {
- return second_str;
- }
-
- if ((second_info.interface_state == HmiInterfaces::STATE_NOT_AVAILABLE) &&
- (first_info.interface_state != HmiInterfaces::STATE_NOT_AVAILABLE) &&
- !first_str.empty()) {
- return first_str;
- }
-
- return MergeInfos(first_str, second_str);
-}
-
-std::string MergeInfos(const std::string& first, const std::string& second) {
- return first + ((!first.empty() && !second.empty()) ? ", " : "") + second;
-}
-
-std::string MergeInfos(const std::string& first,
- const std::string& second,
- const std::string& third) {
- std::string result = MergeInfos(first, second);
- return MergeInfos(result, third);
-}
-
-const std::string CreateInfoForUnsupportedResult(
- HmiInterfaces::InterfaceID interface) {
- switch (interface) {
- case (HmiInterfaces::InterfaceID::HMI_INTERFACE_VR): {
- return "VR is not supported by system";
- }
- case (HmiInterfaces::InterfaceID::HMI_INTERFACE_TTS): {
- return "TTS is not supported by system";
- }
- case (HmiInterfaces::InterfaceID::HMI_INTERFACE_UI): {
- return "UI is not supported by system";
- }
- case (HmiInterfaces::InterfaceID::HMI_INTERFACE_Navigation): {
- return "Navigation is not supported by system";
- }
- case (HmiInterfaces::InterfaceID::HMI_INTERFACE_VehicleInfo): {
- return "VehicleInfo is not supported by system";
- }
- case (HmiInterfaces::InterfaceID::HMI_INTERFACE_RC): {
- return "RC is not supported by system";
- }
- default:
- SDL_LOG_WARN(
- "Could not create info because"
- " interface isn't valid. Interface is:"
- << static_cast<int32_t>(interface));
- return "";
- }
-}
-
-bool CommandRequestImpl::CheckResult(const ResponseInfo& first,
- const ResponseInfo& second) const {
- if (first.is_ok && second.is_unsupported_resource) {
- return true;
- }
- if (first.is_ok && second.is_not_used) {
- return true;
- }
- if (first.is_ok && second.is_ok) {
- return true;
- }
- return false;
-}
-
-bool IsResultCodeWarning(const ResponseInfo& first,
- const ResponseInfo& second) {
- const bool first_is_ok_second_is_warn =
- (first.is_ok || first.is_not_used) &&
- hmi_apis::Common_Result::WARNINGS == second.result_code;
-
- const bool both_warnings =
- hmi_apis::Common_Result::WARNINGS == first.result_code &&
- hmi_apis::Common_Result::WARNINGS == second.result_code;
-
- return first_is_ok_second_is_warn || both_warnings;
-}
-
-struct DisallowedParamsInserter {
- DisallowedParamsInserter(smart_objects::SmartObject& response,
- mobile_apis::VehicleDataResultCode::eType code)
- : response_(response), code_(code) {}
-
- bool operator()(const std::string& param) {
- smart_objects::SmartObjectSPtr disallowed_param =
- std::make_shared<smart_objects::SmartObject>(
- smart_objects::SmartType_Map);
-
- auto rpc_spec_vehicle_data = MessageHelper::vehicle_data();
- auto vehicle_data = rpc_spec_vehicle_data.find(param);
- auto vehicle_data_type =
- vehicle_data == rpc_spec_vehicle_data.end()
- ? mobile_apis::VehicleDataType::VEHICLEDATA_OEM_CUSTOM_DATA
- : vehicle_data->second;
-
- (*disallowed_param)[strings::data_type] = vehicle_data_type;
- (*disallowed_param)[strings::result_code] = code_;
- response_[strings::msg_params][param.c_str()] = *disallowed_param;
- return true;
- }
-
- private:
- smart_objects::SmartObject& response_;
- mobile_apis::VehicleDataResultCode::eType code_;
-};
-
-ResponseInfo::ResponseInfo()
- : result_code(hmi_apis::Common_Result::INVALID_ENUM)
- , interface(HmiInterfaces::HMI_INTERFACE_INVALID_ENUM)
- , interface_state(HmiInterfaces::STATE_NOT_RESPONSE)
- , is_ok(false)
- , is_unsupported_resource(false)
- , is_not_used(false) {}
-
-ResponseInfo::ResponseInfo(const hmi_apis::Common_Result::eType result,
- const HmiInterfaces::InterfaceID hmi_interface,
- ApplicationManager& application_manager)
- : result_code(result)
- , interface(hmi_interface)
- , interface_state(HmiInterfaces::STATE_NOT_RESPONSE)
- , is_ok(false)
- , is_unsupported_resource(false)
- , is_not_used(false) {
- using namespace helpers;
-
- interface_state =
- application_manager.hmi_interfaces().GetInterfaceState(hmi_interface);
-
- is_ok = CommandRequestImpl::IsHMIResultSuccess(result_code);
-
- is_not_used = hmi_apis::Common_Result::INVALID_ENUM == result_code;
-
- is_unsupported_resource =
- hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == result_code;
-}
+SDL_CREATE_LOG_VARIABLE("Commands")
CommandRequestImpl::CommandRequestImpl(
const MessageSharedPtr& message,
@@ -208,269 +55,25 @@ CommandRequestImpl::CommandRequestImpl(
hmi_capabilities,
policy_handler)
, EventObserver(application_manager.event_dispatcher())
- , current_state_(kAwaitingHMIResponse)
- , hash_update_mode_(kSkipHashUpdate)
- , is_success_result_(false) {}
+ , current_state_(RequestState::kAwaitingResponse) {}
CommandRequestImpl::~CommandRequestImpl() {
- UpdateHash();
-}
-
-bool CommandRequestImpl::Init() {
- return true;
-}
-
-bool CommandRequestImpl::CheckPermissions() {
- return CheckAllowedParameters(Command::CommandSource::SOURCE_MOBILE);
-}
-
-bool CommandRequestImpl::CleanUp() {
- return true;
+ CleanUp();
}
void CommandRequestImpl::Run() {}
-void CommandRequestImpl::onTimeOut() {
- SDL_LOG_AUTO_TRACE();
-
- unsubscribe_from_all_hmi_events();
- unsubscribe_from_all_mobile_events();
- {
- // FIXME (dchmerev@luxoft.com): atomic_xchg fits better
- sync_primitives::AutoLock auto_lock(state_lock_);
- if (kCompleted == current_state_) {
- SDL_LOG_DEBUG("current_state_ = kCompleted");
- // don't send timeout if request completed
- return;
- }
-
- current_state_ = kTimedOut;
- }
-
- smart_objects::SmartObjectSPtr response =
- MessageHelper::CreateNegativeResponse(connection_key(),
- function_id(),
- correlation_id(),
- mobile_api::Result::GENERIC_ERROR);
- AddTimeOutComponentInfoToMessage(*response);
- rpc_service_.ManageMobileCommand(response, SOURCE_SDL);
-}
-
-void CommandRequestImpl::on_event(const event_engine::Event& event) {}
-
-void CommandRequestImpl::on_event(const event_engine::MobileEvent& event) {}
-
-void CommandRequestImpl::SendResponse(
- const bool success,
- const mobile_apis::Result::eType& result_code,
- const char* info,
- const smart_objects::SmartObject* response_params,
- const std::vector<uint8_t> binary_data) {
- SDL_LOG_AUTO_TRACE();
- {
- sync_primitives::AutoLock auto_lock(state_lock_);
- if (kTimedOut == current_state_) {
- // don't send response if request timeout expired
- return;
- }
-
- current_state_ = kCompleted;
- }
-
- smart_objects::SmartObjectSPtr result =
- std::make_shared<smart_objects::SmartObject>();
-
- smart_objects::SmartObject& response = *result;
-
- response[strings::params][strings::message_type] = MessageType::kResponse;
- response[strings::params][strings::correlation_id] = correlation_id();
- response[strings::params][strings::protocol_type] =
- CommandImpl::mobile_protocol_type_;
- response[strings::params][strings::protocol_version] =
- CommandImpl::protocol_version_;
- response[strings::params][strings::connection_key] = connection_key();
- response[strings::params][strings::function_id] = function_id();
- if (!binary_data.empty()) {
- response[strings::params][strings::binary_data] = binary_data;
- }
- if (response_params) {
- response[strings::msg_params] = *response_params;
- }
-
- if (info && *info != '\0') {
- response[strings::msg_params][strings::info] = std::string(info);
- }
-
- // Add disallowed parameters and info from request back to response with
- // appropriate reasons (VehicleData result codes)
- if (result_code != mobile_apis::Result::APPLICATION_NOT_REGISTERED &&
- result_code != mobile_apis::Result::INVALID_DATA) {
- const mobile_apis::FunctionID::eType& id =
- static_cast<mobile_apis::FunctionID::eType>(function_id());
- if ((id == mobile_apis::FunctionID::SubscribeVehicleDataID) ||
- (id == mobile_apis::FunctionID::UnsubscribeVehicleDataID)) {
- AddDisallowedParameters(response);
- AddDisallowedParametersToInfo(response);
- } else if (id == mobile_apis::FunctionID::GetVehicleDataID) {
- AddDisallowedParametersToInfo(response);
- }
- }
-
- response[strings::msg_params][strings::success] = success;
- if ((result_code == mobile_apis::Result::SUCCESS ||
- result_code == mobile_apis::Result::WARNINGS) &&
- !warning_info().empty()) {
- response[strings::msg_params][strings::info] =
- (info && *info != '\0') ? std::string(info) + "\n" + warning_info()
- : warning_info();
- response[strings::msg_params][strings::result_code] =
- mobile_apis::Result::WARNINGS;
- } else {
- response[strings::msg_params][strings::result_code] = result_code;
- }
-
- is_success_result_ = success;
-
- rpc_service_.ManageMobileCommand(result, SOURCE_SDL);
-}
-
-smart_objects::SmartObject CreateUnsupportedResourceResponse(
- const hmi_apis::FunctionID::eType function_id,
- const uint32_t hmi_correlation_id,
- HmiInterfaces::InterfaceID interface) {
- smart_objects::SmartObject response(smart_objects::SmartType_Map);
- smart_objects::SmartObject& params = response[strings::params];
- params[strings::message_type] = MessageType::kResponse;
- params[strings::correlation_id] = hmi_correlation_id;
- params[strings::protocol_type] = CommandImpl::hmi_protocol_type_;
- params[strings::protocol_version] = CommandImpl::protocol_version_;
- params[strings::function_id] = function_id;
- params[hmi_response::code] = hmi_apis::Common_Result::UNSUPPORTED_RESOURCE;
- smart_objects::SmartObject& msg_params = response[strings::msg_params];
- msg_params[strings::info] = CreateInfoForUnsupportedResult(interface);
- return response;
-}
-
-bool CommandRequestImpl::ProcessHMIInterfacesAvailability(
- const uint32_t hmi_correlation_id,
- const hmi_apis::FunctionID::eType& function_id) {
- SDL_LOG_AUTO_TRACE();
- HmiInterfaces& hmi_interfaces = application_manager_.hmi_interfaces();
- HmiInterfaces::InterfaceID interface =
- hmi_interfaces.GetInterfaceFromFunction(function_id);
- DCHECK(interface != HmiInterfaces::HMI_INTERFACE_INVALID_ENUM);
- const HmiInterfaces::InterfaceState state =
- hmi_interfaces.GetInterfaceState(interface);
- if (HmiInterfaces::STATE_NOT_AVAILABLE == state) {
- event_engine::Event event(function_id);
- event.set_smart_object(CreateUnsupportedResourceResponse(
- function_id, hmi_correlation_id, interface));
- event.raise(application_manager_.event_dispatcher());
- return false;
- }
- return true;
-}
-
-void CommandRequestImpl::UpdateHash() {
- SDL_LOG_AUTO_TRACE();
- if (hash_update_mode_ == kSkipHashUpdate) {
- SDL_LOG_DEBUG("Hash update is disabled for " << function_id());
- return;
- }
-
- if (HmiInterfaces::InterfaceState::STATE_NOT_RESPONSE ==
- application_manager_.hmi_interfaces().GetInterfaceState(
- HmiInterfaces::InterfaceID::HMI_INTERFACE_UI)) {
- SDL_LOG_ERROR("UI interface has not responded. Hash won't be updated.");
- return;
- }
-
- if (!is_success_result_) {
- SDL_LOG_WARN("Command is not succeeded. Hash won't be updated.");
- return;
- }
-
- ApplicationSharedPtr application =
- application_manager_.application(connection_key());
- if (!application) {
- SDL_LOG_ERROR("Application with connection key "
- << connection_key()
- << " not found. Not able to update hash.");
- return;
- }
-
- SDL_LOG_DEBUG(
- "Updating hash for application with connection key "
- << connection_key() << " while processing function id "
- << MessageHelper::StringifiedFunctionID(
- static_cast<mobile_api::FunctionID::eType>(function_id())));
-
- application->UpdateHash();
-}
-
-void CommandRequestImpl::SendProviderRequest(
- const mobile_apis::FunctionID::eType& mobile_function_id,
- const hmi_apis::FunctionID::eType& hmi_function_id,
- const smart_objects::SmartObject* msg,
- bool use_events) {
+bool CommandRequestImpl::CheckAllowedParameters(
+ const Command::CommandSource source) {
SDL_LOG_AUTO_TRACE();
- bool hmi_destination = false;
- ApplicationSharedPtr app;
- // Default error code and error message
- std::string error_msg = "No app service provider available";
- mobile_apis::Result::eType error_code =
- mobile_apis::Result::DATA_NOT_AVAILABLE;
-
- if ((*msg)[strings::msg_params].keyExists(strings::service_type)) {
- std::string service_type =
- (*msg)[strings::msg_params][strings::service_type].asString();
- application_manager_.GetAppServiceManager().GetProviderByType(
- service_type, true, app, hmi_destination);
- error_msg = "No app service provider with serviceType: " + service_type +
- " is available";
- error_code = mobile_apis::Result::DATA_NOT_AVAILABLE;
- } else if ((*msg)[strings::msg_params].keyExists(strings::service_id)) {
- std::string service_id =
- (*msg)[strings::msg_params][strings::service_id].asString();
- application_manager_.GetAppServiceManager().GetProviderByID(
- service_id, true, app, hmi_destination);
- error_msg = "No app service provider with serviceId: " + service_id +
- " is available";
- error_code = mobile_apis::Result::INVALID_ID;
- }
-
- if (hmi_destination) {
- SDL_LOG_DEBUG("Sending Request to HMI Provider");
- application_manager_.IncreaseForwardedRequestTimeout(connection_key(),
- correlation_id());
- SendHMIRequest(hmi_function_id, &(*msg)[strings::msg_params], use_events);
- return;
- }
- if (!app) {
- SDL_LOG_DEBUG("Invalid App Provider pointer");
- SendResponse(false, error_code, error_msg.c_str());
- return;
- }
-
- if (connection_key() == app->app_id()) {
- SendResponse(false,
- mobile_apis::Result::IGNORED,
- "Consumer app is same as producer app");
- return;
+ // RegisterAppInterface should always be allowed
+ if (mobile_apis::FunctionID::RegisterAppInterfaceID ==
+ static_cast<mobile_apis::FunctionID::eType>(function_id())) {
+ return true;
}
- smart_objects::SmartObjectSPtr new_msg =
- std::make_shared<smart_objects::SmartObject>();
- smart_objects::SmartObject& request = *new_msg;
-
- request[strings::params] = (*msg)[strings::params];
- request[strings::msg_params] = (*msg)[strings::msg_params];
- request[strings::params][strings::connection_key] = app->app_id();
-
- application_manager_.IncreaseForwardedRequestTimeout(connection_key(),
- correlation_id());
- SendMobileRequest(mobile_function_id, new_msg, use_events);
+ return CommandImpl::CheckAllowedParameters(source);
}
void CommandRequestImpl::SendMobileRequest(
@@ -495,389 +98,91 @@ void CommandRequestImpl::SendMobileRequest(
}
}
-uint32_t CommandRequestImpl::SendHMIRequest(
- const hmi_apis::FunctionID::eType& function_id,
- const smart_objects::SmartObject* msg_params,
- bool use_events) {
- smart_objects::SmartObjectSPtr result =
- std::make_shared<smart_objects::SmartObject>();
-
- const uint32_t hmi_correlation_id =
- application_manager_.GetNextHMICorrelationID();
-
- smart_objects::SmartObject& request = *result;
- request[strings::params][strings::message_type] = MessageType::kRequest;
- request[strings::params][strings::function_id] = function_id;
- request[strings::params][strings::correlation_id] = hmi_correlation_id;
- request[strings::params][strings::protocol_version] =
- CommandImpl::protocol_version_;
- request[strings::params][strings::protocol_type] =
- CommandImpl::hmi_protocol_type_;
-
- if (msg_params) {
- request[strings::msg_params] = *msg_params;
- }
-
- if (use_events) {
- SDL_LOG_DEBUG("SendHMIRequest subscribe_on_event " << function_id << " "
- << hmi_correlation_id);
- subscribe_on_event(function_id, hmi_correlation_id);
- }
- if (ProcessHMIInterfacesAvailability(hmi_correlation_id, function_id)) {
- if (!rpc_service_.ManageHMICommand(result, SOURCE_SDL_TO_HMI)) {
- SDL_LOG_ERROR("Unable to send request");
- SendResponse(false, mobile_apis::Result::OUT_OF_MEMORY);
- }
- } else {
- SDL_LOG_DEBUG("Interface is not available");
- }
- return hmi_correlation_id;
-}
-
-void CommandRequestImpl::CreateHMINotification(
- const hmi_apis::FunctionID::eType& function_id,
- const ns_smart::SmartObject& msg_params) const {
- smart_objects::SmartObjectSPtr result =
- std::make_shared<smart_objects::SmartObject>();
- if (!result) {
- SDL_LOG_ERROR("Memory allocation failed.");
- return;
- }
- smart_objects::SmartObject& notify = *result;
-
- notify[strings::params][strings::message_type] =
- static_cast<int32_t>(application_manager::MessageType::kNotification);
- notify[strings::params][strings::protocol_version] =
- CommandImpl::protocol_version_;
- notify[strings::params][strings::protocol_type] =
- CommandImpl::hmi_protocol_type_;
- notify[strings::params][strings::function_id] = function_id;
- notify[strings::msg_params] = msg_params;
-
- if (!rpc_service_.ManageHMICommand(result, SOURCE_SDL_TO_HMI)) {
- SDL_LOG_ERROR("Unable to send HMI notification");
- }
-}
-
-mobile_apis::Result::eType CommandRequestImpl::GetMobileResultCode(
- const hmi_apis::Common_Result::eType& hmi_code) const {
- mobile_apis::Result::eType mobile_result = mobile_apis::Result::GENERIC_ERROR;
- switch (hmi_code) {
- case hmi_apis::Common_Result::SUCCESS: {
- mobile_result = mobile_apis::Result::SUCCESS;
- break;
- }
- case hmi_apis::Common_Result::UNSUPPORTED_REQUEST: {
- mobile_result = mobile_apis::Result::UNSUPPORTED_REQUEST;
- break;
- }
- case hmi_apis::Common_Result::UNSUPPORTED_RESOURCE: {
- mobile_result = mobile_apis::Result::UNSUPPORTED_RESOURCE;
- break;
- }
- case hmi_apis::Common_Result::DISALLOWED: {
- mobile_result = mobile_apis::Result::DISALLOWED;
- break;
- }
- case hmi_apis::Common_Result::REJECTED: {
- mobile_result = mobile_apis::Result::REJECTED;
- break;
- }
- case hmi_apis::Common_Result::ABORTED: {
- mobile_result = mobile_apis::Result::ABORTED;
- break;
- }
- case hmi_apis::Common_Result::IGNORED: {
- mobile_result = mobile_apis::Result::IGNORED;
- break;
- }
- case hmi_apis::Common_Result::RETRY: {
- mobile_result = mobile_apis::Result::RETRY;
- break;
- }
- case hmi_apis::Common_Result::IN_USE: {
- mobile_result = mobile_apis::Result::IN_USE;
- break;
- }
- case hmi_apis::Common_Result::DATA_NOT_AVAILABLE: {
- mobile_result = mobile_apis::Result::VEHICLE_DATA_NOT_AVAILABLE;
- break;
- }
- case hmi_apis::Common_Result::TIMED_OUT: {
- mobile_result = mobile_apis::Result::TIMED_OUT;
- break;
- }
- case hmi_apis::Common_Result::INVALID_DATA: {
- mobile_result = mobile_apis::Result::INVALID_DATA;
- break;
- }
- case hmi_apis::Common_Result::CHAR_LIMIT_EXCEEDED: {
- mobile_result = mobile_apis::Result::CHAR_LIMIT_EXCEEDED;
- break;
- }
- case hmi_apis::Common_Result::INVALID_ID: {
- mobile_result = mobile_apis::Result::INVALID_ID;
- break;
- }
- case hmi_apis::Common_Result::DUPLICATE_NAME: {
- mobile_result = mobile_apis::Result::DUPLICATE_NAME;
- break;
- }
- case hmi_apis::Common_Result::APPLICATION_NOT_REGISTERED: {
- mobile_result = mobile_apis::Result::APPLICATION_NOT_REGISTERED;
- break;
- }
- case hmi_apis::Common_Result::WRONG_LANGUAGE: {
- mobile_result = mobile_apis::Result::WRONG_LANGUAGE;
- break;
- }
- case hmi_apis::Common_Result::OUT_OF_MEMORY: {
- mobile_result = mobile_apis::Result::OUT_OF_MEMORY;
- break;
- }
- case hmi_apis::Common_Result::TOO_MANY_PENDING_REQUESTS: {
- mobile_result = mobile_apis::Result::TOO_MANY_PENDING_REQUESTS;
- break;
- }
- case hmi_apis::Common_Result::NO_APPS_REGISTERED: {
- mobile_result = mobile_apis::Result::APPLICATION_NOT_REGISTERED;
- break;
- }
- case hmi_apis::Common_Result::NO_DEVICES_CONNECTED: {
- mobile_result = mobile_apis::Result::APPLICATION_NOT_REGISTERED;
- break;
- }
- case hmi_apis::Common_Result::WARNINGS: {
- mobile_result = mobile_apis::Result::WARNINGS;
- break;
- }
- case hmi_apis::Common_Result::GENERIC_ERROR: {
- mobile_result = mobile_apis::Result::GENERIC_ERROR;
- break;
- }
- case hmi_apis::Common_Result::USER_DISALLOWED: {
- mobile_result = mobile_apis::Result::USER_DISALLOWED;
- break;
- }
- case hmi_apis::Common_Result::SAVED: {
- mobile_result = mobile_apis::Result::SAVED;
- break;
- }
- case hmi_apis::Common_Result::READ_ONLY: {
- mobile_result = mobile_apis::Result::READ_ONLY;
- break;
- }
- default: {
- SDL_LOG_ERROR("Unknown HMI result code " << hmi_code);
- break;
- }
- }
+void CommandRequestImpl::OnTimeOut() {}
- return mobile_result;
-}
+void CommandRequestImpl::on_event(const event_engine::Event&) {}
+void CommandRequestImpl::on_event(const event_engine::MobileEvent&) {}
-bool CommandRequestImpl::CheckAllowedParameters(
- const Command::CommandSource source) {
+void CommandRequestImpl::HandleTimeOut() {
SDL_LOG_AUTO_TRACE();
-
- // RegisterAppInterface should always be allowed
- if (mobile_apis::FunctionID::RegisterAppInterfaceID ==
- static_cast<mobile_apis::FunctionID::eType>(function_id())) {
- return true;
+ {
+ sync_primitives::AutoLock auto_lock(state_lock_);
+ if (RequestState::kProcessEvent == current_state()) {
+ SDL_LOG_DEBUG("Current request state is: "
+ << current_state() << ". Timeout request ignored");
+ return;
+ }
+ set_current_state(RequestState::kTimedOut);
}
- return CommandImpl::CheckAllowedParameters(source);
+ OnTimeOut();
}
-bool CommandRequestImpl::CheckHMICapabilities(
- const mobile_apis::ButtonName::eType button) const {
+bool CommandRequestImpl::StartOnEventHandling() {
SDL_LOG_AUTO_TRACE();
- using namespace smart_objects;
- using namespace mobile_apis;
-
- if (!hmi_capabilities_.is_ui_cooperating()) {
- SDL_LOG_ERROR("UI is not supported by HMI");
- return false;
- }
-
- auto button_capabilities = hmi_capabilities_.button_capabilities();
- if (!button_capabilities) {
- SDL_LOG_ERROR("Invalid button capabilities object");
- return false;
- }
-
- for (size_t i = 0; i < button_capabilities->length(); ++i) {
- const SmartObject& capabilities = (*button_capabilities)[i];
- const ButtonName::eType current_button = static_cast<ButtonName::eType>(
- capabilities.getElement(hmi_response::button_name).asInt());
- if (current_button == button) {
- SDL_LOG_DEBUG("Button capabilities for " << button << " was found");
- return true;
+ {
+ sync_primitives::AutoLock auto_lock(state_lock_);
+ if (RequestState::kTimedOut == current_state()) {
+ SDL_LOG_DEBUG("current_state_ = kTimedOut");
+ return false;
}
+ set_current_state(RequestState::kProcessEvent);
}
- SDL_LOG_DEBUG("Button capabilities for " << button << " was not found");
- return false;
-}
-
-void CommandRequestImpl::AddDisallowedParameterToInfoString(
- std::string& info, const std::string& param) const {
- // prepare disallowed params enumeration for response info string
- if (info.empty()) {
- info = "\'" + param + "\'";
- } else {
- info = info + "," + " " + "\'" + param + "\'";
- }
+ return true;
}
-void CommandRequestImpl::AddDisallowedParametersToInfo(
- smart_objects::SmartObject& response) const {
- std::string info;
-
- RPCParams::const_iterator it =
- removed_parameters_permissions_.disallowed_params.begin();
- for (; it != removed_parameters_permissions_.disallowed_params.end(); ++it) {
- AddDisallowedParameterToInfoString(info, (*it));
- }
-
- it = removed_parameters_permissions_.undefined_params.begin();
- for (; it != removed_parameters_permissions_.undefined_params.end(); ++it) {
- AddDisallowedParameterToInfoString(info, (*it));
- }
-
- if (!info.empty()) {
- info += " disallowed by policies.";
+void CommandRequestImpl::FinalizeOnEventHandling() {
+ const auto conn_key = connection_key();
+ const auto corr_id = correlation_id();
- if (!response[strings::msg_params][strings::info].asString().empty()) {
- // If we already have info add info about disallowed params to it
- response[strings::msg_params][strings::info] =
- response[strings::msg_params][strings::info].asString() + " " + info;
- } else {
- response[strings::msg_params][strings::info] = info;
- }
+ if (application_manager_.IsStillWaitingForResponse(conn_key, corr_id)) {
+ SDL_LOG_DEBUG("Request (" << conn_key << ", " << corr_id
+ << ") is still waiting for repsonse");
+ set_current_state(RequestState::kAwaitingResponse);
}
}
-void CommandRequestImpl::AddDisallowedParameters(
- smart_objects::SmartObject& response) {
- DisallowedParamsInserter disallowed_inserter(
- response, mobile_apis::VehicleDataResultCode::VDRC_USER_DISALLOWED);
- std::for_each(removed_parameters_permissions_.disallowed_params.begin(),
- removed_parameters_permissions_.disallowed_params.end(),
- disallowed_inserter);
-
- DisallowedParamsInserter undefined_inserter(
- response, mobile_apis::VehicleDataResultCode::VDRC_DISALLOWED);
- std::for_each(removed_parameters_permissions_.undefined_params.begin(),
- removed_parameters_permissions_.undefined_params.end(),
- undefined_inserter);
-}
-
-bool CommandRequestImpl::HasDisallowedParams() const {
- return ((!removed_parameters_permissions_.disallowed_params.empty()) ||
- (!removed_parameters_permissions_.undefined_params.empty()));
-}
-
-bool CommandRequestImpl::IsMobileResultSuccess(
- const mobile_apis::Result::eType result_code) {
+void CommandRequestImpl::HandleOnEvent(const event_engine::Event& event) {
SDL_LOG_AUTO_TRACE();
- using namespace helpers;
- return Compare<mobile_apis::Result::eType, EQ, ONE>(
- result_code,
- mobile_apis::Result::SUCCESS,
- mobile_apis::Result::WARNINGS,
- mobile_apis::Result::WRONG_LANGUAGE,
- mobile_apis::Result::RETRY,
- mobile_apis::Result::SAVED,
- mobile_apis::Result::TRUNCATED_DATA);
-}
-bool CommandRequestImpl::IsHMIResultSuccess(
- const hmi_apis::Common_Result::eType result_code) {
- SDL_LOG_AUTO_TRACE();
- using namespace helpers;
- return Compare<hmi_apis::Common_Result::eType, EQ, ONE>(
- result_code,
- hmi_apis::Common_Result::SUCCESS,
- hmi_apis::Common_Result::WARNINGS,
- hmi_apis::Common_Result::WRONG_LANGUAGE,
- hmi_apis::Common_Result::RETRY,
- hmi_apis::Common_Result::SAVED,
- hmi_apis::Common_Result::TRUNCATED_DATA);
+ if (StartOnEventHandling()) {
+ on_event(event);
+ FinalizeOnEventHandling();
+ }
}
-bool CommandRequestImpl::PrepareResultForMobileResponse(
- hmi_apis::Common_Result::eType result_code,
- HmiInterfaces::InterfaceID interface) const {
+void CommandRequestImpl::HandleOnEvent(const event_engine::MobileEvent& event) {
SDL_LOG_AUTO_TRACE();
- if (IsHMIResultSuccess(result_code)) {
- return true;
- }
- const HmiInterfaces::InterfaceState state =
- application_manager_.hmi_interfaces().GetInterfaceState(interface);
- if ((hmi_apis::Common_Result::UNSUPPORTED_RESOURCE == result_code) &&
- (HmiInterfaces::STATE_NOT_AVAILABLE != state)) {
- return true;
+ if (StartOnEventHandling()) {
+ on_event(event);
+ FinalizeOnEventHandling();
}
- return false;
}
-bool CommandRequestImpl::PrepareResultForMobileResponse(
- ResponseInfo& out_first, ResponseInfo& out_second) const {
+bool CommandRequestImpl::IncrementReferenceCount() const {
SDL_LOG_AUTO_TRACE();
- bool result =
- CheckResult(out_first, out_second) || CheckResult(out_second, out_first);
- return result;
-}
-
-void CommandRequestImpl::GetInfo(
- const smart_objects::SmartObject& response_from_hmi,
- std::string& out_info) {
- if (response_from_hmi[strings::msg_params].keyExists(strings::info)) {
- if (!response_from_hmi[strings::msg_params][strings::info].empty()) {
- out_info =
- response_from_hmi[strings::msg_params][strings::info].asString();
- }
- }
+ const auto conn_key = connection_key();
+ const auto corr_id = correlation_id();
+ return application_manager_.RetainRequestInstance(conn_key, corr_id);
}
-mobile_apis::Result::eType CommandRequestImpl::PrepareResultCodeForResponse(
- const ResponseInfo& first, const ResponseInfo& second) {
+bool CommandRequestImpl::DecrementReferenceCount() const {
SDL_LOG_AUTO_TRACE();
- if (IsResultCodeUnsupported(first, second) ||
- IsResultCodeUnsupported(second, first)) {
- return mobile_apis::Result::UNSUPPORTED_RESOURCE;
- }
- if (IsResultCodeWarning(first, second) ||
- IsResultCodeWarning(second, first)) {
- return mobile_apis::Result::WARNINGS;
- }
- // If response contains erroneous result code SDL need return erroneus
- // result code.
- hmi_apis::Common_Result::eType first_result =
- hmi_apis::Common_Result::INVALID_ENUM;
- hmi_apis::Common_Result::eType second_result =
- hmi_apis::Common_Result::INVALID_ENUM;
- if (!first.is_unsupported_resource) {
- first_result = first.result_code;
- }
- if (!second.is_unsupported_resource) {
- second_result = second.result_code;
- }
- mobile_apis::Result::eType result_code =
- MessageHelper::HMIToMobileResult(std::max(first_result, second_result));
- return result_code;
+ const auto conn_key = connection_key();
+ const auto corr_id = correlation_id();
+ return application_manager_.RemoveRetainedRequest(conn_key, corr_id);
}
-const CommandParametersPermissions& CommandRequestImpl::parameters_permissions()
- const {
- return parameters_permissions_;
+void CommandRequestImpl::OnUpdateTimeOut() {
+ SDL_LOG_AUTO_TRACE();
+ set_current_state(RequestState::kAwaitingResponse);
}
void CommandRequestImpl::StartAwaitForInterface(
- const HmiInterfaces::InterfaceID interface_id) {
+ const HmiInterfaces::InterfaceID& interface_id) {
sync_primitives::AutoLock lock(awaiting_response_interfaces_lock_);
awaiting_response_interfaces_.insert(interface_id);
}
@@ -885,94 +190,31 @@ void CommandRequestImpl::StartAwaitForInterface(
bool CommandRequestImpl::IsInterfaceAwaited(
const HmiInterfaces::InterfaceID& interface_id) const {
sync_primitives::AutoLock lock(awaiting_response_interfaces_lock_);
- std::set<HmiInterfaces::InterfaceID>::const_iterator it =
- awaiting_response_interfaces_.find(interface_id);
- return (it != awaiting_response_interfaces_.end());
+
+ return helpers::in_range(awaiting_response_interfaces_, interface_id);
}
void CommandRequestImpl::EndAwaitForInterface(
const HmiInterfaces::InterfaceID& interface_id) {
sync_primitives::AutoLock lock(awaiting_response_interfaces_lock_);
- std::set<HmiInterfaces::InterfaceID>::const_iterator it =
- awaiting_response_interfaces_.find(interface_id);
- if (it != awaiting_response_interfaces_.end()) {
- awaiting_response_interfaces_.erase(it);
- } else {
- SDL_LOG_WARN(
- "EndAwaitForInterface called on interface \
- which was not put into await state: "
- << interface_id);
- }
+ awaiting_response_interfaces_.erase(interface_id);
}
-bool CommandRequestImpl::IsResultCodeUnsupported(
- const ResponseInfo& first, const ResponseInfo& second) const {
- const bool first_ok_second_unsupported =
- (first.is_ok || first.is_not_used) && second.is_unsupported_resource;
- const bool both_unsupported =
- first.is_unsupported_resource && second.is_unsupported_resource;
- return first_ok_second_unsupported || both_unsupported;
+bool CommandRequestImpl::IsPendingResponseExist() const {
+ sync_primitives::AutoLock lock(awaiting_response_interfaces_lock_);
+ return !awaiting_response_interfaces_.empty();
}
-std::string GetComponentNameFromInterface(
- const HmiInterfaces::InterfaceID& interface) {
- switch (interface) {
- case HmiInterfaces::HMI_INTERFACE_Buttons:
- return hmi_interface::buttons;
- case HmiInterfaces::HMI_INTERFACE_BasicCommunication:
- return hmi_interface::basic_communication;
- case HmiInterfaces::HMI_INTERFACE_VR:
- return hmi_interface::vr;
- case HmiInterfaces::HMI_INTERFACE_TTS:
- return hmi_interface::tts;
- case HmiInterfaces::HMI_INTERFACE_UI:
- return hmi_interface::ui;
- case HmiInterfaces::HMI_INTERFACE_Navigation:
- return hmi_interface::navigation;
- case HmiInterfaces::HMI_INTERFACE_VehicleInfo:
- return hmi_interface::vehicle_info;
- case HmiInterfaces::HMI_INTERFACE_SDL:
- return hmi_interface::sdl;
- case HmiInterfaces::HMI_INTERFACE_RC:
- return hmi_interface::rc;
- case HmiInterfaces::HMI_INTERFACE_AppService:
- return hmi_interface::app_service;
- default:
- return "Unknown type";
- }
+CommandRequestImpl::RequestState CommandRequestImpl::current_state() const {
+ sync_primitives::AutoLock auto_lock(state_lock_);
+ return current_state_;
}
-const std::string InfoInterfaceSeparator(
- const std::string& sum, const HmiInterfaces::InterfaceID container_value) {
- return sum.empty()
- ? GetComponentNameFromInterface(container_value)
- : sum + ", " + GetComponentNameFromInterface(container_value);
-}
-
-void CommandRequestImpl::AddTimeOutComponentInfoToMessage(
- smart_objects::SmartObject& response) const {
- using ns_smart_device_link::ns_smart_objects::SmartObject;
- SDL_LOG_AUTO_TRACE();
- sync_primitives::AutoLock lock(awaiting_response_interfaces_lock_);
- if (awaiting_response_interfaces_.empty()) {
- SDL_LOG_ERROR("No interfaces awaiting, info param is empty");
- return;
- }
-
- const std::string not_responding_interfaces_string =
- std::accumulate(awaiting_response_interfaces_.begin(),
- awaiting_response_interfaces_.end(),
- std::string(""),
- InfoInterfaceSeparator);
- SDL_LOG_DEBUG(
- "Not responding interfaces string: " << not_responding_interfaces_string);
- if (!not_responding_interfaces_string.empty()) {
- const std::string component_info =
- not_responding_interfaces_string + " component does not respond";
- response[strings::msg_params][strings::info] = component_info;
- }
+void CommandRequestImpl::set_current_state(
+ const CommandRequestImpl::RequestState state) {
+ sync_primitives::AutoLock auto_lock(state_lock_);
+ current_state_ = state;
}
} // namespace commands
-
} // namespace application_manager