diff options
Diffstat (limited to 'src/components/smart_objects/src')
10 files changed, 160 insertions, 88 deletions
diff --git a/src/components/smart_objects/src/always_false_schema_item.cc b/src/components/smart_objects/src/always_false_schema_item.cc index 1893ed24d1..9975085b79 100644 --- a/src/components/smart_objects/src/always_false_schema_item.cc +++ b/src/components/smart_objects/src/always_false_schema_item.cc @@ -37,19 +37,17 @@ namespace NsSmartObjects { CAlwaysFalseSchemaItem::CAlwaysFalseSchemaItem() {} -utils::SharedPtr<CAlwaysFalseSchemaItem> CAlwaysFalseSchemaItem::create() { - return new CAlwaysFalseSchemaItem(); -} - -Errors::eType CAlwaysFalseSchemaItem::validate(const SmartObject& object) { - rpc::ValidationReport report("RPC"); - return validate(object, &report); +std::shared_ptr<CAlwaysFalseSchemaItem> CAlwaysFalseSchemaItem::create() { + return std::shared_ptr<CAlwaysFalseSchemaItem>(new CAlwaysFalseSchemaItem()); } Errors::eType CAlwaysFalseSchemaItem::validate( - const SmartObject& object, rpc::ValidationReport* report__) { + const SmartObject& Object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { report__->set_validation_info("Generic error"); return Errors::ERROR; } + } // namespace NsSmartObjects } // namespace NsSmartDeviceLink diff --git a/src/components/smart_objects/src/always_true_schema_item.cc b/src/components/smart_objects/src/always_true_schema_item.cc index 1e7115316d..93c20c9bce 100644 --- a/src/components/smart_objects/src/always_true_schema_item.cc +++ b/src/components/smart_objects/src/always_true_schema_item.cc @@ -35,16 +35,14 @@ namespace NsSmartObjects { CAlwaysTrueSchemaItem::CAlwaysTrueSchemaItem() {} -utils::SharedPtr<CAlwaysTrueSchemaItem> CAlwaysTrueSchemaItem::create() { - return new CAlwaysTrueSchemaItem(); +std::shared_ptr<CAlwaysTrueSchemaItem> CAlwaysTrueSchemaItem::create() { + return std::shared_ptr<CAlwaysTrueSchemaItem>(new CAlwaysTrueSchemaItem()); } -Errors::eType CAlwaysTrueSchemaItem::validate(const SmartObject& object) { - return Errors::OK; -} - -Errors::eType CAlwaysTrueSchemaItem::validate(const SmartObject& object, - rpc::ValidationReport* report__) { +Errors::eType CAlwaysTrueSchemaItem::validate( + const SmartObject& Object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { return Errors::OK; } diff --git a/src/components/smart_objects/src/array_schema_item.cc b/src/components/smart_objects/src/array_schema_item.cc index dca0a815e0..56a52da761 100644 --- a/src/components/smart_objects/src/array_schema_item.cc +++ b/src/components/smart_objects/src/array_schema_item.cc @@ -34,20 +34,18 @@ namespace NsSmartDeviceLink { namespace NsSmartObjects { -utils::SharedPtr<CArraySchemaItem> CArraySchemaItem::create( +std::shared_ptr<CArraySchemaItem> CArraySchemaItem::create( const ISchemaItemPtr ElementSchemaItem, const TSchemaItemParameter<size_t>& MinSize, const TSchemaItemParameter<size_t>& MaxSize) { - return new CArraySchemaItem(ElementSchemaItem, MinSize, MaxSize); + return std::shared_ptr<CArraySchemaItem>( + new CArraySchemaItem(ElementSchemaItem, MinSize, MaxSize)); } -Errors::eType CArraySchemaItem::validate(const SmartObject& Object) { - rpc::ValidationReport report("RPC"); - return validate(Object, &report); -} - -Errors::eType CArraySchemaItem::validate(const SmartObject& Object, - rpc::ValidationReport* report__) { +Errors::eType CArraySchemaItem::validate( + const SmartObject& Object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { if (SmartType_Array != Object.getType()) { std::string validation_info = "Incorrect type, expected: " + SmartObject::typeToString(SmartType_Array) + @@ -79,8 +77,10 @@ Errors::eType CArraySchemaItem::validate(const SmartObject& Object, for (size_t i = 0u; i < array_len; ++i) { std::stringstream strVal; strVal << i; - const Errors::eType result = mElementSchemaItem->validate( - Object.getElement(i), &report__->ReportSubobject(strVal.str())); + const Errors::eType result = + mElementSchemaItem->validate(Object.getElement(i), + &report__->ReportSubobject(strVal.str()), + MessageVersion); if (Errors::OK != result) { return result; } @@ -88,11 +88,14 @@ Errors::eType CArraySchemaItem::validate(const SmartObject& Object, return Errors::OK; } -void CArraySchemaItem::applySchema(SmartObject& Object, - const bool RemoveFakeParameters) { +void CArraySchemaItem::applySchema( + SmartObject& Object, + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion) { if (SmartType_Array == Object.getType()) { for (size_t i = 0U; i < Object.length(); ++i) { - mElementSchemaItem->applySchema(Object[i], RemoveFakeParameters); + mElementSchemaItem->applySchema( + Object[i], RemoveFakeParameters, MessageVersion); } } } diff --git a/src/components/smart_objects/src/bool_schema_item.cc b/src/components/smart_objects/src/bool_schema_item.cc index c1da95528a..dcf1e13918 100644 --- a/src/components/smart_objects/src/bool_schema_item.cc +++ b/src/components/smart_objects/src/bool_schema_item.cc @@ -35,9 +35,9 @@ namespace NsSmartDeviceLink { namespace NsSmartObjects { -utils::SharedPtr<CBoolSchemaItem> CBoolSchemaItem::create( +std::shared_ptr<CBoolSchemaItem> CBoolSchemaItem::create( const TSchemaItemParameter<bool>& DefaultValue) { - return new CBoolSchemaItem(DefaultValue); + return std::shared_ptr<CBoolSchemaItem>(new CBoolSchemaItem(DefaultValue)); } CBoolSchemaItem::CBoolSchemaItem(const TSchemaItemParameter<bool>& DefaultValue) diff --git a/src/components/smart_objects/src/number_schema_item.cc b/src/components/smart_objects/src/number_schema_item.cc index 78be9fe85d..9789434523 100644 --- a/src/components/smart_objects/src/number_schema_item.cc +++ b/src/components/smart_objects/src/number_schema_item.cc @@ -41,7 +41,7 @@ SmartType TNumberSchemaItem<int32_t>::getSmartType() const { template <> SmartType TNumberSchemaItem<uint32_t>::getSmartType() const { - return SmartType_Integer; + return SmartType_UInteger; } template <> diff --git a/src/components/smart_objects/src/object_schema_item.cc b/src/components/smart_objects/src/object_schema_item.cc index 2bed3d9a26..cfe6f58efa 100644 --- a/src/components/smart_objects/src/object_schema_item.cc +++ b/src/components/smart_objects/src/object_schema_item.cc @@ -47,22 +47,67 @@ namespace NsSmartObjects { CObjectSchemaItem::SMember::SMember() : mSchemaItem(CAlwaysFalseSchemaItem::create()), mIsMandatory(true) {} -CObjectSchemaItem::SMember::SMember(const ISchemaItemPtr SchemaItem, - const bool IsMandatory) - : mSchemaItem(SchemaItem), mIsMandatory(IsMandatory) {} +CObjectSchemaItem::SMember::SMember( + const ISchemaItemPtr SchemaItem, + const bool IsMandatory, + const std::string& Since, + const std::string& Until, + const bool IsDeprecated, + const bool IsRemoved, + const std::vector<CObjectSchemaItem::SMember>& history_vector) + : mSchemaItem(SchemaItem), mIsMandatory(IsMandatory) { + if (Since.size() > 0) { + utils::SemanticVersion since_struct(Since); + if (since_struct.isValid()) { + mSince = since_struct; + } + } + if (Until.size() > 0) { + utils::SemanticVersion until_struct(Until); + if (until_struct.isValid()) { + mUntil = until_struct; + } + } + mIsDeprecated = IsDeprecated; + mIsRemoved = IsRemoved; + mHistoryVector = history_vector; +} -utils::SharedPtr<CObjectSchemaItem> CObjectSchemaItem::create( - const Members& members) { - return new CObjectSchemaItem(members); +bool CObjectSchemaItem::SMember::CheckHistoryFieldVersion( + const utils::SemanticVersion& MessageVersion) const { + if (MessageVersion.isValid()) { + if (mSince != boost::none) { + if (MessageVersion < mSince.get()) { + return false; // Msg version predates `since` field + } else { + if (mUntil != boost::none && (MessageVersion >= mUntil.get())) { + return false; // Msg version newer than `until` field + } else { + return true; // Mobile msg version falls within specified version + // range + } + } + } + + if (mUntil != boost::none && (MessageVersion >= mUntil.get())) { + return false; // Msg version newer than `until` field + } else { + return true; // Mobile msg version falls within specified version range + } + } + + return true; // Not enough version information. Default true. } -Errors::eType CObjectSchemaItem::validate(const SmartObject& object) { - rpc::ValidationReport report("RPC"); - return validate(object, &report); +std::shared_ptr<CObjectSchemaItem> CObjectSchemaItem::create( + const Members& members) { + return std::shared_ptr<CObjectSchemaItem>(new CObjectSchemaItem(members)); } -Errors::eType CObjectSchemaItem::validate(const SmartObject& object, - rpc::ValidationReport* report__) { +Errors::eType CObjectSchemaItem::validate( + const SmartObject& object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { if (SmartType_Map != object.getType()) { std::string validation_info = "Incorrect type, expected: " + SmartObject::typeToString(SmartType_Map) + @@ -78,10 +123,12 @@ Errors::eType CObjectSchemaItem::validate(const SmartObject& object, ++it) { const std::string& key = it->first; const SMember& member = it->second; + const SMember& correct_member = GetCorrectMember(member, MessageVersion); std::set<std::string>::const_iterator key_it = object_keys.find(key); if (object_keys.end() == key_it) { - if (member.mIsMandatory) { + if (correct_member.mIsMandatory == true && + correct_member.mIsRemoved == false) { std::string validation_info = "Missing mandatory parameter: " + key; report__->set_validation_info(validation_info); return Errors::MISSING_MANDATORY_PARAMETER; @@ -89,8 +136,11 @@ Errors::eType CObjectSchemaItem::validate(const SmartObject& object, continue; } const SmartObject& field = object.getElement(key); - const Errors::eType result = - member.mSchemaItem->validate(field, &report__->ReportSubobject(key)); + + Errors::eType result = Errors::OK; + // Check if MessageVersion matches schema version + result = correct_member.mSchemaItem->validate( + field, &report__->ReportSubobject(key), MessageVersion); if (Errors::OK != result) { return result; } @@ -99,14 +149,16 @@ Errors::eType CObjectSchemaItem::validate(const SmartObject& object, return Errors::OK; } -void CObjectSchemaItem::applySchema(SmartObject& Object, - const bool RemoveFakeParameters) { +void CObjectSchemaItem::applySchema( + SmartObject& Object, + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion) { if (SmartType_Map != Object.getType()) { return; } if (RemoveFakeParameters) { - RemoveFakeParams(Object); + RemoveFakeParams(Object, MessageVersion); } SmartObject default_value; @@ -117,10 +169,12 @@ void CObjectSchemaItem::applySchema(SmartObject& Object, if (!Object.keyExists(key)) { if (member.mSchemaItem->setDefaultValue(default_value)) { Object[key] = default_value; - member.mSchemaItem->applySchema(Object[key], RemoveFakeParameters); + member.mSchemaItem->applySchema( + Object[key], RemoveFakeParameters, MessageVersion); } } else { - member.mSchemaItem->applySchema(Object[key], RemoveFakeParameters); + member.mSchemaItem->applySchema( + Object[key], RemoveFakeParameters, MessageVersion); } } } @@ -173,21 +227,48 @@ size_t CObjectSchemaItem::GetMemberSize() { CObjectSchemaItem::CObjectSchemaItem(const Members& members) : mMembers(members) {} -void CObjectSchemaItem::RemoveFakeParams(SmartObject& Object) { +void CObjectSchemaItem::RemoveFakeParams( + SmartObject& Object, const utils::SemanticVersion& MessageVersion) { for (SmartMap::const_iterator it = Object.map_begin(); it != Object.map_end();) { const std::string& key = it->first; - if (mMembers.end() == mMembers.find(key) + std::map<std::string, SMember>::const_iterator members_it = + mMembers.find(key); + if (mMembers.end() == members_it // FIXME(EZamakhov): Remove illegal usage of filed in AM && key.compare(connection_key) != 0 && key.compare(binary_data) != 0 && key.compare(app_id) != 0) { ++it; Object.erase(key); + + } else if (mMembers.end() != members_it && + GetCorrectMember(members_it->second, MessageVersion) + .mIsRemoved) { + ++it; + Object.erase(key); } else { - it++; + ++it; + } + } +} + +const CObjectSchemaItem::SMember& CObjectSchemaItem::GetCorrectMember( + const SMember& member, const utils::SemanticVersion& messageVersion) { + // Check if member is the correct version + if (member.CheckHistoryFieldVersion(messageVersion)) { + return member; + } + // Check for history tag items + if (!member.mHistoryVector.empty()) { + for (uint i = 0; i < member.mHistoryVector.size(); i++) { + if (member.mHistoryVector[i].CheckHistoryFieldVersion(messageVersion)) { + return member.mHistoryVector[i]; + } } } + // Return member as default + return member; } } // namespace NsSmartObjects diff --git a/src/components/smart_objects/src/schema_item.cc b/src/components/smart_objects/src/schema_item.cc index 22735d40d5..a47fe4d1fb 100644 --- a/src/components/smart_objects/src/schema_item.cc +++ b/src/components/smart_objects/src/schema_item.cc @@ -35,12 +35,10 @@ namespace NsSmartDeviceLink { namespace NsSmartObjects { -Errors::eType ISchemaItem::validate(const SmartObject& Object) { - return Errors::ERROR; -} - -Errors::eType ISchemaItem::validate(const SmartObject& object, - rpc::ValidationReport* report__) { +Errors::eType ISchemaItem::validate( + const SmartObject& object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { return Errors::ERROR; } @@ -53,7 +51,8 @@ bool ISchemaItem::hasDefaultValue(SmartObject& Object) { } void ISchemaItem::applySchema(SmartObject& Object, - const bool RemoveFakeParameters) {} + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion) {} void ISchemaItem::unapplySchema(SmartObject& Object) {} diff --git a/src/components/smart_objects/src/smart_object.cc b/src/components/smart_objects/src/smart_object.cc index a0925eef05..cf6f290971 100644 --- a/src/components/smart_objects/src/smart_object.cc +++ b/src/components/smart_objects/src/smart_object.cc @@ -873,13 +873,10 @@ bool SmartObject::isValid() const { return (Errors::OK == m_schema.validate(*this, &report)); } -Errors::eType SmartObject::validate() { - rpc::ValidationReport report("RPC"); - return validate(&report); -} - -Errors::eType SmartObject::validate(rpc::ValidationReport* report__) { - return m_schema.validate(*this, report__); +Errors::eType SmartObject::validate( + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { + return m_schema.validate(*this, report__, MessageVersion); } void SmartObject::setSchema(const CSmartSchema& schema) { diff --git a/src/components/smart_objects/src/smart_schema.cc b/src/components/smart_objects/src/smart_schema.cc index 7509ea80f1..62f2101f03 100644 --- a/src/components/smart_objects/src/smart_schema.cc +++ b/src/components/smart_objects/src/smart_schema.cc @@ -40,14 +40,11 @@ CSmartSchema::CSmartSchema() : mSchemaItem(CAlwaysTrueSchemaItem::create()) {} CSmartSchema::CSmartSchema(const ISchemaItemPtr SchemaItem) : mSchemaItem(SchemaItem) {} -Errors::eType CSmartSchema::validate(const SmartObject& Object) const { - rpc::ValidationReport report("RPC"); - return validate(Object, &report); -} - -Errors::eType CSmartSchema::validate(const SmartObject& object, - rpc::ValidationReport* report__) const { - return mSchemaItem->validate(object, report__); +Errors::eType CSmartSchema::validate( + const SmartObject& object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) const { + return mSchemaItem->validate(object, report__, MessageVersion); } void CSmartSchema::setSchemaItem(const ISchemaItemPtr schemaItem) { @@ -55,8 +52,9 @@ void CSmartSchema::setSchemaItem(const ISchemaItemPtr schemaItem) { } void CSmartSchema::applySchema(SmartObject& Object, - const bool RemoveFakeParameters) { - mSchemaItem->applySchema(Object, RemoveFakeParameters); + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion) { + mSchemaItem->applySchema(Object, RemoveFakeParameters, MessageVersion); } void CSmartSchema::unapplySchema(SmartObject& Object) { diff --git a/src/components/smart_objects/src/string_schema_item.cc b/src/components/smart_objects/src/string_schema_item.cc index 1e4c8372f0..936db7dbc9 100644 --- a/src/components/smart_objects/src/string_schema_item.cc +++ b/src/components/smart_objects/src/string_schema_item.cc @@ -38,20 +38,18 @@ namespace NsSmartObjects { namespace custom_str = utils::custom_string; -utils::SharedPtr<CStringSchemaItem> CStringSchemaItem::create( +std::shared_ptr<CStringSchemaItem> CStringSchemaItem::create( const TSchemaItemParameter<size_t>& MinLength, const TSchemaItemParameter<size_t>& MaxLength, const TSchemaItemParameter<std::string>& DefaultValue) { - return new CStringSchemaItem(MinLength, MaxLength, DefaultValue); + return std::shared_ptr<CStringSchemaItem>( + new CStringSchemaItem(MinLength, MaxLength, DefaultValue)); } -Errors::eType CStringSchemaItem::validate(const SmartObject& Object) { - rpc::ValidationReport report("RPC"); - return validate(Object, &report); -} - -Errors::eType CStringSchemaItem::validate(const SmartObject& Object, - rpc::ValidationReport* report__) { +Errors::eType CStringSchemaItem::validate( + const SmartObject& Object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { if (SmartType_String != Object.getType()) { std::string validation_info = "Incorrect type, expected: " + SmartObject::typeToString(SmartType_String) + |