From ab57fa1a1bbc3f903e8af53ab7cde84c25fcd8eb Mon Sep 17 00:00:00 2001 From: "Yaroslav Mamykin (GitHub)" Date: Thu, 10 Oct 2019 15:13:41 +0300 Subject: fixup! Fix versioning appliance for vehicle data --- .../src/custom_vehicle_data_manager_impl.cc | 8 ++-- .../application_manager/src/rpc_handler_impl.cc | 34 ++++++++--------- .../application_manager/src/rpc_service_impl.cc | 44 ++++++++++++++++++---- .../include/smart_objects/object_schema_item.h | 13 ++++++- .../smart_objects/src/object_schema_item.cc | 27 +++++++++++-- 5 files changed, 92 insertions(+), 34 deletions(-) diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/custom_vehicle_data_manager_impl.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/custom_vehicle_data_manager_impl.cc index df401b8a44..490ff7696f 100644 --- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/custom_vehicle_data_manager_impl.cc +++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/custom_vehicle_data_manager_impl.cc @@ -290,7 +290,7 @@ void CustomVehicleDataManagerImpl::UpdateVehicleDataItems() { bool(*item.deprecated), bool(*item.removed), history, - true); // Mark member as custom as soon as custom data is treated + SMember::Type::CUSTOM); // Mark member as custom as soon as custom data is treated // in different way } case SMemberType::SMEMBER_VDR_MOBILE: { @@ -308,8 +308,8 @@ void CustomVehicleDataManagerImpl::UpdateVehicleDataItems() { bool(*item.deprecated), bool(*item.removed), history, - true); // Mark member as custom as soon as custom data is treated - // in different way + SMember::Type::CUSTOM); // Mark member as custom as soon as custom data is treated + // in different way } case SMemberType::SMEMBER_MOBILE: { TSchemaItemParameter tschema_item(item); @@ -323,7 +323,7 @@ void CustomVehicleDataManagerImpl::UpdateVehicleDataItems() { bool(*item.deprecated), bool(*item.removed), history, - true); // Mark member as custom as soon as custom data is treated + SMember::Type::CUSTOM); // Mark member as custom as soon as custom data is treated // in different way } case SMemberType::SMEMBER_BOOL_HMI: { diff --git a/src/components/application_manager/src/rpc_handler_impl.cc b/src/components/application_manager/src/rpc_handler_impl.cc index 9a1d815bb2..819236a485 100644 --- a/src/components/application_manager/src/rpc_handler_impl.cc +++ b/src/components/application_manager/src/rpc_handler_impl.cc @@ -425,23 +425,23 @@ bool RPCHandlerImpl::ConvertMessageToSO( return false; } - rpc::ValidationReport report("RPC"); - - utils::SemanticVersion empty_version; - if (validate_params && - 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; - } + // rpc::ValidationReport report("RPC"); + + // utils::SemanticVersion empty_version; + // if (validate_params && + // 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; + // } break; } case protocol_handler::MajorProtocolVersion::PROTOCOL_VERSION_1: { diff --git a/src/components/application_manager/src/rpc_service_impl.cc b/src/components/application_manager/src/rpc_service_impl.cc index 90ab105a2e..bffb63ea72 100644 --- a/src/components/application_manager/src/rpc_service_impl.cc +++ b/src/components/application_manager/src/rpc_service_impl.cc @@ -508,11 +508,6 @@ void RPCServiceImpl::SendMessageToMobile( app->usage_report().RecordRejectionsSyncOutOfMemory(); } - mobile_so_factory().attachSchema(*message, false); - LOG4CXX_DEBUG( - logger_, - "Attached schema to message, result if valid: " << message->isValid()); - // Messages to mobile are not yet prioritized so use default priority value std::shared_ptr message_to_send( new Message(protocol_handler::MessagePriority::kDefault)); @@ -539,13 +534,43 @@ void RPCServiceImpl::SendMessageToMobile( (*message)[jhs::S_PARAMS][jhs::S_MESSAGE_TYPE].asInt())) { allow_unknown_parameters = false; } + + + LOG4CXX_ERROR(logger_, "ALLOW UNKNOWN PARAMS = " << allow_unknown_parameters); + mobile_so_factory().attachSchema(*message, !allow_unknown_parameters, app->msg_version()); + rpc::ValidationReport report("RPC"); + auto validation_result = message->validate(&report, app->msg_version(), allow_unknown_parameters); + LOG4CXX_DEBUG( + logger_, + "Attached schema to message, result if valid: " << validation_result << "\nError report: " << rpc::PrettyFormat(report)); + + const auto api_function_id = static_cast( + (*message)[strings::params][strings::function_id].asUInt()); + + if (api_function_id == mobile_apis::FunctionID::GetVehicleDataID) { + if (validation_result != smart_objects::errors::eType::OK) { + if (mobile_apis::Result::SUCCESS == (*message)[strings::msg_params][strings::result_code].asUInt()) { + smart_objects::SmartObjectSPtr response = + MessageHelper::CreateNegativeResponse( + (*message)[strings::params][strings::connection_key].asUInt(), + api_function_id, + (*message)[strings::params][strings::correlation_id].asUInt(), + static_cast( + mobile_apis::Result::GENERIC_ERROR)); + + SendMessageToMobile(response); + return; + } + } + } + if (!ConvertSOtoMessage( (*message), (*message_to_send), allow_unknown_parameters)) { LOG4CXX_WARN(logger_, "Can't send msg to Mobile: failed to create string"); return; } - const auto api_function_id = static_cast( - (*message)[strings::params][strings::function_id].asUInt()); + + MessageHelper::PrintSmartObject(*message); smart_objects::SmartObject& msg_to_mobile = *message; // If correlation_id is not present, it is from-HMI message which should be @@ -556,6 +581,11 @@ void RPCServiceImpl::SendMessageToMobile( msg_to_mobile[strings::params][strings::connection_key].asUInt(), msg_to_mobile[strings::params][strings::function_id].asInt()); } else if (app) { + + if (validation_result != smart_objects::errors::eType::OK) { + return; + } + RPCParams params; const smart_objects::SmartObject& s_map = (*message)[strings::msg_params]; diff --git a/src/components/smart_objects/include/smart_objects/object_schema_item.h b/src/components/smart_objects/include/smart_objects/object_schema_item.h index cdd5368b76..7156a6dbc0 100644 --- a/src/components/smart_objects/include/smart_objects/object_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/object_schema_item.h @@ -50,6 +50,12 @@ namespace ns_smart_objects { * @brief Object member. **/ struct SMember { + + enum class Type { + CUSTOM = 0, + API = 1 + }; + /** * @brief Default constructor. **/ @@ -68,7 +74,8 @@ struct SMember { const bool IsDeprecated = false, const bool IsRemoved = false, const std::vector& history_vector = {}, - const bool IsCustom = false); + const Type type = Type::API); + /** * @brief Checks the version a parameter was removed (until) * If the mobile's msg version is greater than or @@ -76,6 +83,8 @@ struct SMember { bool CheckHistoryFieldVersion( const utils::SemanticVersion& MessageVersion) const; + std::string to_string() const; + private: bool CheckCustomVehicleData( const utils::SemanticVersion& MessageVersion) const; @@ -97,7 +106,7 @@ struct SMember { bool mIsRemoved; mutable bool mIsValid; std::vector mHistoryVector; - bool mIsCustom; + Type mType; }; typedef std::map Members; diff --git a/src/components/smart_objects/src/object_schema_item.cc b/src/components/smart_objects/src/object_schema_item.cc index 02ba989ea0..14d602e2c1 100644 --- a/src/components/smart_objects/src/object_schema_item.cc +++ b/src/components/smart_objects/src/object_schema_item.cc @@ -32,6 +32,7 @@ #include "smart_objects/object_schema_item.h" #include +#include #include "generated_msg_version.h" #include "smart_objects/always_false_schema_item.h" @@ -55,7 +56,7 @@ SMember::SMember() , mIsDeprecated(false) , mIsRemoved(false) , mIsValid(true) - , mIsCustom(false) {} + , mType(SMember::Type::API) {} SMember::SMember(const ISchemaItemPtr SchemaItem, const bool IsMandatory, @@ -64,11 +65,11 @@ SMember::SMember(const ISchemaItemPtr SchemaItem, const bool IsDeprecated, const bool IsRemoved, const std::vector& history_vector, - const bool IsCustom) + const Type type) : mSchemaItem(SchemaItem) , mIsMandatory(IsMandatory) , mIsValid(true) - , mIsCustom(IsCustom) { + , mType(type) { if (Since.size() > 0) { utils::SemanticVersion since_struct(Since); if (since_struct.isValid()) { @@ -89,9 +90,11 @@ SMember::SMember(const ISchemaItemPtr SchemaItem, bool SMember::CheckHistoryFieldVersion( const utils::SemanticVersion& MessageVersion) const { if (MessageVersion.isValid()) { - if (mIsCustom) { + if (mType == Type::CUSTOM) { + LOG4CXX_ERROR(vehicle_log, "CHECKING CUSTOM DATA: "); return CheckCustomVehicleData(MessageVersion); } else { + LOG4CXX_ERROR(vehicle_log, "CHECKING API DATA: "); return CheckAPIVehicleData(MessageVersion); } } @@ -129,6 +132,20 @@ bool SMember::CheckAPIVehicleData( return true; } +std::string SMember::to_string() const { + std::ostringstream out; + + out << "Mandatory: " << mIsMandatory << "\n"; + out << "Deprecated: " << mIsDeprecated << "\n"; + out << "Removed: " << mIsRemoved << "\n"; + out << "Valid: " << mIsValid << "\n"; + out << "Type: " << (mType == Type::API ? "API" : "CUSTOM") << "\n"; + out << "Since: " << (mSince != boost::none ? mSince.get().toString() : "NONE") << "\n"; + out << "Until: " << (mUntil != boost::none ? mUntil.get().toString() : "NONE") << "\n"; + + return out.str(); +} + std::shared_ptr CObjectSchemaItem::create( const Members& members) { return std::shared_ptr(new CObjectSchemaItem(members)); @@ -156,6 +173,8 @@ errors::eType CObjectSchemaItem::validate( const SMember& member = it->second; const SMember& correct_member = GetCorrectMember(member, MessageVersion); + LOG4CXX_ERROR(vehicle_log, "" << key << " INFO: " << correct_member.to_string()); + std::set::const_iterator key_it = object_keys.find(key); if (object_keys.end() == key_it) { if (correct_member.mIsMandatory == true && -- cgit v1.2.1