summaryrefslogtreecommitdiff
path: root/src/components/application_manager/src/rpc_handler_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/application_manager/src/rpc_handler_impl.cc')
-rw-r--r--src/components/application_manager/src/rpc_handler_impl.cc123
1 files changed, 96 insertions, 27 deletions
diff --git a/src/components/application_manager/src/rpc_handler_impl.cc b/src/components/application_manager/src/rpc_handler_impl.cc
index 3fceaf573c..44a5af6f41 100644
--- a/src/components/application_manager/src/rpc_handler_impl.cc
+++ b/src/components/application_manager/src/rpc_handler_impl.cc
@@ -31,7 +31,6 @@
*/
#include "application_manager/rpc_handler_impl.h"
-
#include "application_manager/app_service_manager.h"
#include "application_manager/plugin_manager/plugin_keys.h"
@@ -43,12 +42,14 @@ namespace formatters = ns_smart_device_link::ns_json_handler::formatters;
namespace jhs = ns_smart_device_link::ns_json_handler::strings;
namespace plugin_names = application_manager::plugin_manager::plugin_names;
-RPCHandlerImpl::RPCHandlerImpl(ApplicationManager& app_manager)
+RPCHandlerImpl::RPCHandlerImpl(ApplicationManager& app_manager,
+ hmi_apis::HMI_API& hmi_so_factory,
+ mobile_apis::MOBILE_API& mobile_so_factory)
: app_manager_(app_manager)
, messages_from_mobile_("AM FromMobile", this)
, messages_from_hmi_("AM FromHMI", this)
- , hmi_so_factory_(hmi_apis::HMI_API())
- , mobile_so_factory_(mobile_apis::MOBILE_API())
+ , hmi_so_factory_(hmi_so_factory)
+ , mobile_so_factory_(mobile_so_factory)
#ifdef TELEMETRY_MONITOR
, metric_observer_(NULL)
#endif // TELEMETRY_MONITOR
@@ -107,8 +108,12 @@ void RPCHandlerImpl::ProcessMessageFromMobile(
allow_unknown_parameters = true;
}
- if (!ConvertMessageToSO(
- *message, *so_from_mobile, allow_unknown_parameters, !rpc_passing)) {
+ std::string warning_info;
+ if (!ConvertMessageToSO(*message,
+ *so_from_mobile,
+ warning_info,
+ allow_unknown_parameters,
+ !rpc_passing)) {
LOG4CXX_ERROR(logger_, "Cannot create smart object from message");
return;
}
@@ -130,7 +135,7 @@ void RPCHandlerImpl::ProcessMessageFromMobile(
commands::Command::SOURCE_MOBILE,
message_type)) {
// Since PassThrough failed, refiltering the message
- if (!ConvertMessageToSO(*message, *so_from_mobile)) {
+ if (!ConvertMessageToSO(*message, *so_from_mobile, warning_info)) {
LOG4CXX_ERROR(logger_, "Cannot create smart object from message");
return;
}
@@ -142,7 +147,7 @@ void RPCHandlerImpl::ProcessMessageFromMobile(
#endif // TELEMETRY_MONITOR
if (!app_manager_.GetRPCService().ManageMobileCommand(
- so_from_mobile, commands::Command::SOURCE_MOBILE)) {
+ so_from_mobile, commands::Command::SOURCE_MOBILE, warning_info)) {
LOG4CXX_ERROR(logger_, "Received command didn't run successfully");
}
#ifdef TELEMETRY_MONITOR
@@ -159,27 +164,25 @@ void RPCHandlerImpl::ProcessMessageFromHMI(
smart_objects::SmartObjectSPtr smart_object =
std::make_shared<smart_objects::SmartObject>();
bool allow_unknown_parameters = false;
- if (!smart_object) {
- LOG4CXX_ERROR(logger_, "Null pointer");
- return;
- }
smart_objects::SmartObject converted_result;
formatters::FormatterJsonRpc::FromString<hmi_apis::FunctionID::eType,
hmi_apis::messageType::eType>(
message->json_message(), converted_result);
+ const auto function_id = static_cast<int32_t>(
+ converted_result[jhs::S_PARAMS][jhs::S_FUNCTION_ID].asInt());
if (app_manager_.GetRPCService().IsAppServiceRPC(
- converted_result[jhs::S_PARAMS][jhs::S_FUNCTION_ID].asInt(),
- commands::Command::SOURCE_HMI)) {
+ function_id, commands::Command::SOURCE_HMI)) {
LOG4CXX_DEBUG(
logger_,
- "Allowing unknown parameters for request function "
- << converted_result[jhs::S_PARAMS][jhs::S_FUNCTION_ID].asInt());
+ "Allowing unknown parameters for request function " << function_id);
allow_unknown_parameters = true;
}
- if (!ConvertMessageToSO(*message, *smart_object, allow_unknown_parameters)) {
+ std::string warning_info;
+ if (!ConvertMessageToSO(
+ *message, *smart_object, warning_info, allow_unknown_parameters)) {
if (application_manager::MessageType::kResponse ==
(*smart_object)[strings::params][strings::message_type].asInt()) {
(*smart_object).erase(strings::msg_params);
@@ -193,11 +196,18 @@ void RPCHandlerImpl::ProcessMessageFromHMI(
}
}
+ if (!warning_info.empty()) {
+ LOG4CXX_WARN(logger_,
+ "Warning while parsing HMI message: " << warning_info);
+ }
+
LOG4CXX_DEBUG(logger_, "Converted message, trying to create hmi command");
- if (!app_manager_.GetRPCService().ManageHMICommand(smart_object)) {
+ if (!app_manager_.GetRPCService().ManageHMICommand(
+ smart_object, commands::Command::SOURCE_HMI, warning_info)) {
LOG4CXX_ERROR(logger_, "Received command didn't run successfully");
}
}
+
void RPCHandlerImpl::Handle(const impl::MessageFromMobile message) {
LOG4CXX_AUTO_TRACE(logger_);
@@ -209,6 +219,10 @@ void RPCHandlerImpl::Handle(const impl::MessageFromMobile message) {
LOG4CXX_INFO(logger_, "Application manager is stopping");
return;
}
+ if (app_manager_.IsLowVoltage()) {
+ LOG4CXX_ERROR(logger_, "Low Voltage is active.");
+ return;
+ }
ProcessMessageFromMobile(message);
}
@@ -220,6 +234,11 @@ void RPCHandlerImpl::Handle(const impl::MessageFromHmi message) {
LOG4CXX_ERROR(logger_, "Null-pointer message received.");
return;
}
+ if (app_manager_.IsLowVoltage()) {
+ LOG4CXX_ERROR(logger_, "Low Voltage is active.");
+ return;
+ }
+
ProcessMessageFromHMI(message);
}
@@ -227,6 +246,11 @@ void RPCHandlerImpl::OnMessageReceived(
const protocol_handler::RawMessagePtr message) {
LOG4CXX_AUTO_TRACE(logger_);
+ if (app_manager_.IsLowVoltage()) {
+ LOG4CXX_ERROR(logger_, "Low Voltage is active.");
+ return;
+ }
+
if (!message) {
LOG4CXX_ERROR(logger_, "Null-pointer message received.");
NOTREACHED();
@@ -295,6 +319,7 @@ void RPCHandlerImpl::GetMessageVersion(
if (sync_msg_version.keyExists(strings::patch_version)) {
patch = sync_msg_version[strings::patch_version].asUInt();
}
+
utils::SemanticVersion temp_version(major, minor, patch);
if (temp_version.isValid()) {
message_version = (temp_version >= utils::rpc_version_5)
@@ -307,6 +332,7 @@ void RPCHandlerImpl::GetMessageVersion(
bool RPCHandlerImpl::ConvertMessageToSO(
const Message& message,
ns_smart_device_link::ns_smart_objects::SmartObject& output,
+ std::string& out_warning_info,
const bool allow_unknown_parameters,
const bool validate_params) {
LOG4CXX_AUTO_TRACE(logger_);
@@ -369,6 +395,9 @@ bool RPCHandlerImpl::ConvertMessageToSO(
"Convertion result for sdl object is true function_id "
<< output[jhs::S_PARAMS][jhs::S_FUNCTION_ID].asInt());
+ // Populate any warning info generated during the validation process
+ out_warning_info = rpc::PrettyFormat(report);
+
output[strings::params][strings::connection_key] =
message.connection_key();
output[strings::params][strings::protocol_version] =
@@ -406,7 +435,7 @@ bool RPCHandlerImpl::ConvertMessageToSO(
"Convertion result: "
<< result << " function id "
<< output[jhs::S_PARAMS][jhs::S_FUNCTION_ID].asInt());
- if (!hmi_so_factory().attachSchema(output, false)) {
+ if (!hmi_so_factory().attachSchema(output, true)) {
LOG4CXX_WARN(logger_, "Failed to attach schema to object.");
return false;
}
@@ -415,17 +444,14 @@ bool RPCHandlerImpl::ConvertMessageToSO(
utils::SemanticVersion empty_version;
if (validate_params &&
- output.validate(&report, empty_version, allow_unknown_parameters) !=
- smart_objects::errors::OK) {
+ smart_objects::errors::OK !=
+ output.validate(
+ &report, empty_version, allow_unknown_parameters)) {
LOG4CXX_ERROR(
logger_,
"Incorrect parameter from HMI - " << rpc::PrettyFormat(report));
- output.erase(strings::msg_params);
- output[strings::params][hmi_response::code] =
- hmi_apis::Common_Result::INVALID_DATA;
- output[strings::msg_params][strings::info] = rpc::PrettyFormat(report);
- return false;
+ return HandleWrongMessageType(output, report);
}
break;
}
@@ -472,17 +498,59 @@ bool RPCHandlerImpl::ConvertMessageToSO(
<< message.protocol_version() << ".");
return false;
}
+ output[strings::params][strings::protection] = message.is_message_encrypted();
LOG4CXX_DEBUG(logger_, "Successfully parsed message into smart object");
return true;
}
+bool RPCHandlerImpl::HandleWrongMessageType(
+ smart_objects::SmartObject& output, rpc::ValidationReport report) const {
+ LOG4CXX_AUTO_TRACE(logger_);
+ switch (output[strings::params][strings::message_type].asInt()) {
+ case application_manager::MessageType::kNotification: {
+ LOG4CXX_ERROR(logger_, "Ignore wrong HMI notification");
+ return false;
+ }
+ case application_manager::MessageType::kRequest: {
+ LOG4CXX_ERROR(logger_, "Received invalid data on HMI request");
+ output.erase(strings::msg_params);
+ output[strings::params].erase(hmi_response::message);
+ output[strings::params][hmi_response::code] =
+ hmi_apis::Common_Result::INVALID_DATA;
+ output[strings::params][strings::message_type] =
+ MessageType::kErrorResponse;
+ output[strings::params][strings::error_msg] = rpc::PrettyFormat(report);
+ return true;
+ }
+ case application_manager::MessageType::kResponse: {
+ LOG4CXX_ERROR(logger_, "Received invalid data on HMI response");
+ break;
+ }
+ case application_manager::MessageType::kUnknownType: {
+ LOG4CXX_ERROR(logger_, "Received unknown type data on HMI");
+ break;
+ }
+ default: {
+ LOG4CXX_ERROR(logger_, "Received error response on HMI");
+ break;
+ }
+ }
+ output.erase(strings::msg_params);
+ output[strings::params].erase(hmi_response::message);
+ output[strings::params][hmi_response::code] =
+ hmi_apis::Common_Result::GENERIC_ERROR;
+ output[strings::msg_params][strings::info] =
+ std::string("Invalid message received from vehicle");
+ return true;
+}
+
bool RPCHandlerImpl::ValidateRpcSO(smart_objects::SmartObject& message,
utils::SemanticVersion& msg_version,
rpc::ValidationReport& report_out,
bool allow_unknown_parameters) {
if (!mobile_so_factory().attachSchema(
- message, !allow_unknown_parameters, msg_version) ||
+ message, !allow_unknown_parameters, msg_version, &report_out) ||
message.validate(&report_out, msg_version, allow_unknown_parameters) !=
smart_objects::errors::OK) {
LOG4CXX_WARN(logger_, "Failed to parse string to smart object");
@@ -513,6 +581,7 @@ std::shared_ptr<Message> RPCHandlerImpl::ConvertRawMsgToMessage(
} else {
LOG4CXX_ERROR(logger_, "Received invalid message");
}
+
return outgoing_message;
}