diff options
Diffstat (limited to 'src/components/smart_objects/include')
12 files changed, 266 insertions, 164 deletions
diff --git a/src/components/smart_objects/include/smart_objects/always_false_schema_item.h b/src/components/smart_objects/include/smart_objects/always_false_schema_item.h index cdddcfed55..a6cd1cb4ed 100644 --- a/src/components/smart_objects/include/smart_objects/always_false_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/always_false_schema_item.h @@ -33,7 +33,6 @@ #ifndef SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_ALWAYS_FALSE_SCHEMA_ITEM_H_ #define SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_ALWAYS_FALSE_SCHEMA_ITEM_H_ -#include "utils/shared_ptr.h" #include "smart_objects/schema_item.h" namespace NsSmartDeviceLink { @@ -47,22 +46,19 @@ class CAlwaysFalseSchemaItem : public ISchemaItem { * @brief Create a new schema item. * @return Shared pointer to a new schema item. **/ - static utils::SharedPtr<CAlwaysFalseSchemaItem> create(); - /** - * @deprecated - * @brief Validate smart object. - * @param Object Object to validate. - * @return Errors::ERROR - **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + static std::shared_ptr<CAlwaysFalseSchemaItem> create(); + /** * @brief Validate smart object. * @param Object Object to validate. * @param report__ object for reporting errors during validation - * @return Errors::ERROR + * @param MessageVersion to check mobile RPC version against RPC Spec History + * @return NsSmartObjects::Errors::eType **/ Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__) OVERRIDE; + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; private: CAlwaysFalseSchemaItem(); diff --git a/src/components/smart_objects/include/smart_objects/always_true_schema_item.h b/src/components/smart_objects/include/smart_objects/always_true_schema_item.h index e078ae3240..5651cffc9e 100644 --- a/src/components/smart_objects/include/smart_objects/always_true_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/always_true_schema_item.h @@ -33,7 +33,6 @@ #ifndef SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_ALWAYS_TRUE_SCHEMA_ITEM_H_ #define SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_ALWAYS_TRUE_SCHEMA_ITEM_H_ -#include "utils/shared_ptr.h" #include "smart_objects/schema_item.h" namespace NsSmartDeviceLink { @@ -47,22 +46,19 @@ class CAlwaysTrueSchemaItem : public ISchemaItem { * @brief Create a new schema item. * @return Shared pointer to a new schema item. **/ - static utils::SharedPtr<CAlwaysTrueSchemaItem> create(); - /** - * @deprecated - * @brief Validate smart object. - * @param Object Object to validate. - * @return NsSmartObjects::Errors::eType - **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + static std::shared_ptr<CAlwaysTrueSchemaItem> create(); + /** * @brief Validate smart object. * @param Object Object to validate. * @param report__ object for reporting errors during validation + * @param MessageVersion to check mobile RPC version against RPC Spec History * @return NsSmartObjects::Errors::eType **/ Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__) OVERRIDE; + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; private: CAlwaysTrueSchemaItem(); diff --git a/src/components/smart_objects/include/smart_objects/array_schema_item.h b/src/components/smart_objects/include/smart_objects/array_schema_item.h index 937979f2fa..d92283ba76 100644 --- a/src/components/smart_objects/include/smart_objects/array_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/array_schema_item.h @@ -34,11 +34,12 @@ #include <stddef.h> -#include "utils/shared_ptr.h" #include "smart_objects/schema_item.h" #include "smart_objects/always_true_schema_item.h" #include "smart_objects/schema_item_parameter.h" +#include "utils/semantic_version.h" + namespace NsSmartDeviceLink { namespace NsSmartObjects { /** @@ -55,7 +56,7 @@ class CArraySchemaItem : public ISchemaItem { * * @return Shared pointer to a new schema item. **/ - static utils::SharedPtr<CArraySchemaItem> create( + static std::shared_ptr<CArraySchemaItem> create( const ISchemaItemPtr ElementSchemaItem = CAlwaysTrueSchemaItem::create(), const TSchemaItemParameter<size_t>& MinSize = TSchemaItemParameter<size_t>(), @@ -63,27 +64,16 @@ class CArraySchemaItem : public ISchemaItem { TSchemaItemParameter<size_t>()); /** - * @deprecated - * - * @brief Validate smart object. - * - * @param Object Object to validate. - * - * @return NsSmartObjects::Errors::eType - **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; - - /** * @brief Validate smart object. - * * @param Object Object to validate. * @param report__ object for reporting errors during validation - * message if an error occurs - * + * @param MessageVersion to check mobile RPC version against RPC Spec History * @return NsSmartObjects::Errors::eType **/ Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__) OVERRIDE; + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; /** * @brief Apply schema. @@ -94,7 +84,9 @@ class CArraySchemaItem : public ISchemaItem { * from smart object otherwise contains false. **/ void applySchema(SmartObject& Object, - const bool RemoveFakeParameters) OVERRIDE; + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; /** * @brief Unapply schema. diff --git a/src/components/smart_objects/include/smart_objects/bool_schema_item.h b/src/components/smart_objects/include/smart_objects/bool_schema_item.h index eca5a0e063..14bca2f487 100644 --- a/src/components/smart_objects/include/smart_objects/bool_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/bool_schema_item.h @@ -33,8 +33,6 @@ #ifndef SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_BOOL_SCHEMA_ITEM_H_ #define SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_BOOL_SCHEMA_ITEM_H_ -#include "utils/shared_ptr.h" - #include "smart_objects/default_shema_item.h" namespace NsSmartDeviceLink { @@ -49,7 +47,7 @@ class CBoolSchemaItem : public CDefaultSchemaItem<bool> { * @param DefaultValue Default value of a parameter. * @return Shared pointer to a new schema item. **/ - static utils::SharedPtr<CBoolSchemaItem> create( + static std::shared_ptr<CBoolSchemaItem> create( const TSchemaItemParameter<bool>& DefaultValue = TSchemaItemParameter<bool>()); diff --git a/src/components/smart_objects/include/smart_objects/default_shema_item.h b/src/components/smart_objects/include/smart_objects/default_shema_item.h index 56952dbac1..2b0802ee7e 100644 --- a/src/components/smart_objects/include/smart_objects/default_shema_item.h +++ b/src/components/smart_objects/include/smart_objects/default_shema_item.h @@ -33,7 +33,6 @@ #define SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_DEFAULT_SHEMA_ITEM_H_ #include "utils/macro.h" -#include "utils/shared_ptr.h" #include "smart_objects/schema_item.h" #include "smart_objects/schema_item_parameter.h" @@ -50,20 +49,16 @@ class CDefaultSchemaItem : public ISchemaItem { public: typedef TSchemaItemParameter<Type> ParameterType; /** - * @deprecated - * @brief Validate smart object. - * @param Object Object to validate. - * @return Errors::ERROR - **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; - /** * @brief Validate smart object. * @param Object Object to validate. * @param report__ object for reporting errors during validation - * @return Errors::ERROR + * @param MessageVersion to check mobile RPC version against RPC Spec History + * @return NsSmartObjects::Errors::eType **/ Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__) OVERRIDE; + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; /** * @brief Set default value to an object. @@ -107,14 +102,10 @@ CDefaultSchemaItem<Type>::CDefaultSchemaItem(const ParameterType& DefaultValue) : mDefaultValue(DefaultValue) {} template <typename Type> -Errors::eType CDefaultSchemaItem<Type>::validate(const SmartObject& Object) { - rpc::ValidationReport report("RPC"); - return validate(Object, &report); -} - -template <typename Type> Errors::eType CDefaultSchemaItem<Type>::validate( - const SmartObject& Object, rpc::ValidationReport* report__) { + const SmartObject& Object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { if (getSmartType() != Object.getType()) { std::string validation_info = "Incorrect type, expected: " + SmartObject::typeToString(getSmartType()) + diff --git a/src/components/smart_objects/include/smart_objects/enum_schema_item.h b/src/components/smart_objects/include/smart_objects/enum_schema_item.h index 524d966188..52301656e1 100644 --- a/src/components/smart_objects/include/smart_objects/enum_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/enum_schema_item.h @@ -39,12 +39,37 @@ #include <set> #include <string> -#include "utils/shared_ptr.h" #include "smart_objects/default_shema_item.h" +#include "utils/semantic_version.h" +#include <boost/optional.hpp> + namespace NsSmartDeviceLink { namespace NsSmartObjects { +struct ElementSignature { + boost::optional<utils::SemanticVersion> mSince; + boost::optional<utils::SemanticVersion> mUntil; + bool mRemoved; + + ElementSignature(std::string since = "", + std::string until = "", + bool removed = false) { + utils::SemanticVersion since_struct(since); + utils::SemanticVersion until_struct(until); + + if (since_struct.isValid()) { + mSince = since_struct; + } + + if (until_struct.isValid()) { + mUntil = until_struct; + } + + mRemoved = removed; + } +}; + template <typename EnumType> class EnumConversionHelper; /** @@ -60,25 +85,44 @@ class TEnumSchemaItem : public CDefaultSchemaItem<EnumType> { * @param DefaultValue Default value. * @return Shared pointer to a new schema item. **/ - static utils::SharedPtr<TEnumSchemaItem> create( + static std::shared_ptr<TEnumSchemaItem> create( const std::set<EnumType>& AllowedElements, const TSchemaItemParameter<EnumType>& DefaultValue = TSchemaItemParameter<EnumType>()); + /** - * @deprecated - * @brief Validate smart object. - * @param Object Object to validate. - * @return NsSmartObjects::Errors::eType + * @brief Create a new schema item. + * @param AllowedElements Set of allowed enumeration elements. + * @param DefaultValue Default value. + * @return Shared pointer to a new schema item. **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + static std::shared_ptr<TEnumSchemaItem> createWithSignatures( + const std::set<EnumType>& AllowedElements, + const std::map<EnumType, std::vector<ElementSignature> >& + ElementSignatures, + const TSchemaItemParameter<EnumType>& DefaultValue = + TSchemaItemParameter<EnumType>()); + /** * @brief Validate smart object. * @param Object Object to validate. * @param report__ object for reporting errors during validation + * @param MessageVersion to check mobile RPC version against RPC Spec History * @return NsSmartObjects::Errors::eType **/ Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__) OVERRIDE; + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; + /** + * @brief Return the correct history signature based on message version. + * @param signatures Vector reference of enums history items. + * @param MessageVersion RPC Version of mobile app. + **/ + const ElementSignature getSignature( + const std::vector<ElementSignature>& signatures, + const utils::SemanticVersion& MessageVersion); + /** * @brief Apply schema. * This implementation checks if enumeration is represented as string @@ -89,7 +133,9 @@ class TEnumSchemaItem : public CDefaultSchemaItem<EnumType> { * from smart object otherwise contains false. **/ void applySchema(SmartObject& Object, - const bool RemoveFakeParameters) OVERRIDE; + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; /** * @brief Unapply schema. * @param Object Object to unapply schema. @@ -104,12 +150,18 @@ class TEnumSchemaItem : public CDefaultSchemaItem<EnumType> { **/ TEnumSchemaItem(const std::set<EnumType>& AllowedElements, const TSchemaItemParameter<EnumType>& DefaultValue); + + TEnumSchemaItem(const std::set<EnumType>& AllowedElements, + const TSchemaItemParameter<EnumType>& DefaultValue, + const std::map<EnumType, std::vector<ElementSignature> >& + ElementSignatures); SmartType getSmartType() const OVERRIDE; EnumType getDefaultValue() const OVERRIDE; /** * @brief Set of allowed enumeration elements. **/ const std::set<EnumType> mAllowedElements; + std::map<EnumType, std::vector<ElementSignature> > mElementSignatures; /** * @brief Default value. **/ @@ -208,21 +260,54 @@ class EnumConversionHelper { }; template <typename EnumType> -utils::SharedPtr<TEnumSchemaItem<EnumType> > TEnumSchemaItem<EnumType>::create( +std::shared_ptr<TEnumSchemaItem<EnumType> > TEnumSchemaItem<EnumType>::create( const std::set<EnumType>& AllowedElements, const TSchemaItemParameter<EnumType>& DefaultValue) { - return new TEnumSchemaItem<EnumType>(AllowedElements, DefaultValue); + return std::shared_ptr<TEnumSchemaItem<EnumType> >( + new TEnumSchemaItem<EnumType>(AllowedElements, DefaultValue)); } template <typename EnumType> -Errors::eType TEnumSchemaItem<EnumType>::validate(const SmartObject& Object) { - rpc::ValidationReport report("RPC"); - return validate(Object, &report); +std::shared_ptr<TEnumSchemaItem<EnumType> > +TEnumSchemaItem<EnumType>::createWithSignatures( + const std::set<EnumType>& AllowedElements, + const std::map<EnumType, std::vector<ElementSignature> >& ElementSignatures, + const TSchemaItemParameter<EnumType>& DefaultValue) { + return std::shared_ptr<TEnumSchemaItem<EnumType> >( + new TEnumSchemaItem<EnumType>( + AllowedElements, DefaultValue, ElementSignatures)); +} + +template <typename EnumType> +const ElementSignature TEnumSchemaItem<EnumType>::getSignature( + const std::vector<ElementSignature>& signatures, + const utils::SemanticVersion& MessageVersion) { + for (uint i = 0; i < signatures.size(); i++) { + ElementSignature signature = signatures[i]; + // Check if signature matches message version + if (signature.mSince != boost::none && + MessageVersion < signature.mSince.get()) { + // Msg version predates 'since' field, check next entry + continue; + } + if (signature.mUntil != boost::none && + (MessageVersion >= signature.mUntil.get())) { + continue; // Msg version newer than `until` field, check next entry + } + // Found correct signature + return signature; + } + + // Could not match msg version to element siganture + ElementSignature ret; + return ret; } template <typename EnumType> Errors::eType TEnumSchemaItem<EnumType>::validate( - const SmartObject& Object, rpc::ValidationReport* report__) { + const SmartObject& Object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { if (SmartType_Integer != Object.getType()) { std::string validation_info; if (SmartType_String == Object.getType()) { @@ -236,20 +321,53 @@ Errors::eType TEnumSchemaItem<EnumType>::validate( report__->set_validation_info(validation_info); return Errors::INVALID_VALUE; } - if (mAllowedElements.find(static_cast<EnumType>(Object.asInt())) == - mAllowedElements.end()) { + + auto elements_it = + mAllowedElements.find(static_cast<EnumType>(Object.asInt())); + + if (elements_it == mAllowedElements.end()) { std::stringstream stream; stream << "Invalid enum value: " << Object.asInt(); std::string validation_info = stream.str(); report__->set_validation_info(validation_info); return Errors::OUT_OF_RANGE; } + + // Element exists in schema. Check if version is also valid. + if (MessageVersion.isValid()) { + EnumType value = *elements_it; + auto signatures_it = mElementSignatures.find(value); + if (signatures_it != mElementSignatures.end()) { + if (!signatures_it->second.empty()) { + ElementSignature signature = + getSignature(signatures_it->second, MessageVersion); + if (signature.mRemoved) { + // Element was removed for this version + std::string validation_info = "Enum value : " + Object.asString() + + " removed for SyncMsgVersion " + + MessageVersion.toString(); + report__->set_validation_info(validation_info); + return Errors::INVALID_VALUE; + } else if (signature.mSince == boost::none && + signature.mUntil == boost::none) { + // Element does not exist for this version + std::string validation_info = "Enum value : " + Object.asString() + + " does not exist for SyncMsgVersion " + + MessageVersion.toString(); + report__->set_validation_info(validation_info); + return Errors::INVALID_VALUE; + } + } + } + } return Errors::OK; } template <typename EnumType> -void TEnumSchemaItem<EnumType>::applySchema(SmartObject& Object, - const bool RemoveFakeParameters) { +void TEnumSchemaItem<EnumType>::applySchema( + SmartObject& Object, + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion) { if (SmartType_String == Object.getType()) { EnumType enum_val = static_cast<EnumType>(-1); if (ConversionHelper::StringToEnum(Object.asString(), &enum_val)) { @@ -285,6 +403,15 @@ TEnumSchemaItem<EnumType>::TEnumSchemaItem( : CDefaultSchemaItem<EnumType>(DefaultValue) , mAllowedElements(AllowedElements) {} +template <typename EnumType> +TEnumSchemaItem<EnumType>::TEnumSchemaItem( + const std::set<EnumType>& AllowedElements, + const TSchemaItemParameter<EnumType>& DefaultValue, + const std::map<EnumType, std::vector<ElementSignature> >& ElementSignatures) + : CDefaultSchemaItem<EnumType>(DefaultValue) + , mAllowedElements(AllowedElements) + , mElementSignatures(ElementSignatures) {} + } // namespace NsSmartObjects } // namespace NsSmartDeviceLink #endif // SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_ENUM_SCHEMA_ITEM_H_ diff --git a/src/components/smart_objects/include/smart_objects/number_schema_item.h b/src/components/smart_objects/include/smart_objects/number_schema_item.h index 34c5e3a8a6..dff3617246 100644 --- a/src/components/smart_objects/include/smart_objects/number_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/number_schema_item.h @@ -35,7 +35,7 @@ #include <typeinfo> #include <limits> -#include "utils/shared_ptr.h" + #include "smart_objects/default_shema_item.h" #include "smart_objects/schema_item_parameter.h" #include "utils/convert_utils.h" @@ -57,7 +57,7 @@ class TNumberSchemaItem : public CDefaultSchemaItem<NumberType> { * @param DefaultValue Default value. * @return Shared pointer to a new schema item. **/ - static utils::SharedPtr<TNumberSchemaItem> create( + static std::shared_ptr<TNumberSchemaItem> create( const TSchemaItemParameter<NumberType>& MinValue = TSchemaItemParameter<NumberType>(), const TSchemaItemParameter<NumberType>& MaxValue = @@ -66,20 +66,16 @@ class TNumberSchemaItem : public CDefaultSchemaItem<NumberType> { TSchemaItemParameter<NumberType>()); /** - * @deprecated - * @brief Validate smart object. - * @param Object Object to validate. - * @return Errors::ERROR - **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; - /** * @brief Validate smart object. * @param Object Object to validate. * @param report__ object for reporting errors during validation - * @return Errors::ERROR + * @param MessageVersion to check mobile RPC version against RPC Spec History + * @return NsSmartObjects::Errors::eType **/ Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__) OVERRIDE; + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; private: /** @@ -112,11 +108,12 @@ class TNumberSchemaItem : public CDefaultSchemaItem<NumberType> { }; template <typename NumberType> -utils::SharedPtr<TNumberSchemaItem<NumberType> > TNumberSchemaItem< +std::shared_ptr<TNumberSchemaItem<NumberType> > TNumberSchemaItem< NumberType>::create(const TSchemaItemParameter<NumberType>& MinValue, const TSchemaItemParameter<NumberType>& MaxValue, const TSchemaItemParameter<NumberType>& DefaultValue) { - return new TNumberSchemaItem<NumberType>(MinValue, MaxValue, DefaultValue); + return std::shared_ptr<TNumberSchemaItem<NumberType> >( + new TNumberSchemaItem<NumberType>(MinValue, MaxValue, DefaultValue)); } template <typename NumberType> @@ -138,14 +135,9 @@ bool TNumberSchemaItem<NumberType>::isValidNumberType(SmartType type) { template <typename NumberType> Errors::eType TNumberSchemaItem<NumberType>::validate( - const SmartObject& Object) { - rpc::ValidationReport report("RPC"); - return validate(Object, &report); -} - -template <typename NumberType> -Errors::eType TNumberSchemaItem<NumberType>::validate( - const SmartObject& Object, rpc::ValidationReport* report__) { + const SmartObject& Object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion) { if (!isValidNumberType(Object.getType())) { SmartType expectedType = (typeid(double) == typeid(Object.getType())) ? SmartType_Double 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 8922caba45..ddb34ea518 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 @@ -37,7 +37,8 @@ #include <set> #include "utils/macro.h" -#include "utils/shared_ptr.h" +#include "utils/semantic_version.h" +#include <boost/optional.hpp> #include "smart_objects/schema_item.h" #include "smart_objects/schema_item_parameter.h" @@ -63,7 +64,21 @@ class CObjectSchemaItem : public ISchemaItem { * @param IsMandatory true if member is mandatory, false * otherwise. Defaults to true. **/ - SMember(const ISchemaItemPtr SchemaItem, const bool IsMandatory = true); + + SMember(const ISchemaItemPtr SchemaItem, + const bool IsMandatory = true, + const std::string& Since = "", + const std::string& Until = "", + const bool IsDeprecated = false, + const bool IsRemoved = false, + const std::vector<CObjectSchemaItem::SMember>& history_vector = {}); + /** + * @brief Checks the version a parameter was removed (until) + * If the mobile's msg version is greater than or + **/ + bool CheckHistoryFieldVersion( + const utils::SemanticVersion& MessageVersion) const; + /** * @brief Member schema item. **/ @@ -72,6 +87,11 @@ class CObjectSchemaItem : public ISchemaItem { * @brief true if member is mandatory, false otherwise. **/ bool mIsMandatory; + boost::optional<utils::SemanticVersion> mSince; + boost::optional<utils::SemanticVersion> mUntil; + bool mIsDeprecated; + bool mIsRemoved; + std::vector<CObjectSchemaItem::SMember> mHistoryVector; }; typedef std::map<std::string, SMember> Members; /** @@ -82,22 +102,19 @@ class CObjectSchemaItem : public ISchemaItem { * * @return Shared pointer to a new schema item. **/ - static utils::SharedPtr<CObjectSchemaItem> create(const Members& Members); - /** - * @deprecated - * @brief Validate smart object. - * @param Object Object to validate. - * @return NsSmartObjects::Errors::eType - **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + static std::shared_ptr<CObjectSchemaItem> create(const Members& Members); + /** * @brief Validate smart object. * @param Object Object to validate. * @param report__ object for reporting errors during validation + * @param MessageVersion to check mobile RPC version against RPC Spec History * @return NsSmartObjects::Errors::eType **/ Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__) OVERRIDE; + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; /** * @brief Apply schema. * @param Object Object to apply schema. @@ -105,7 +122,9 @@ class CObjectSchemaItem : public ISchemaItem { * from smart object otherwise contains false. **/ void applySchema(SmartObject& Object, - const bool RemoveFakeParameters) OVERRIDE; + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; /** * @brief Unapply schema. * @param Object Object to unapply schema. @@ -137,7 +156,16 @@ class CObjectSchemaItem : public ISchemaItem { * @brief Removes fake parameters from object. * @param Object Object to remove fake parameters. **/ - void RemoveFakeParams(SmartObject& Object); + void RemoveFakeParams(SmartObject& Object, + const utils::SemanticVersion& MessageVersion); + + /** + * @brief Returns the correct schema item based on message version. + * @param member Schema member + * @param MmessageVersion Semantic Version of mobile message. + **/ + const CObjectSchemaItem::SMember& GetCorrectMember( + const SMember& member, const utils::SemanticVersion& messageVersion); /** * @brief Map of member name to SMember structure describing the object diff --git a/src/components/smart_objects/include/smart_objects/schema_item.h b/src/components/smart_objects/include/smart_objects/schema_item.h index 446c7fa65f..5626b0cf23 100644 --- a/src/components/smart_objects/include/smart_objects/schema_item.h +++ b/src/components/smart_objects/include/smart_objects/schema_item.h @@ -33,11 +33,16 @@ #define SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_SCHEMA_ITEM_H_ #include <stdlib.h> -#include "utils/shared_ptr.h" + #include "rpc_base/validation_report.h" #include "smart_objects/errors.h" +#include <memory> +#include <vector> +#include "utils/macro.h" +#include "utils/semantic_version.h" + namespace NsSmartDeviceLink { namespace NsSmartObjects { class SmartObject; @@ -48,27 +53,18 @@ class SmartObject; class ISchemaItem { public: /** - * @deprecated - * - * @brief Validate smart object. - * - * @param Object Object to validate. - * - * @return NsSmartObjects::Errors::eType - **/ - DEPRECATED virtual Errors::eType validate(const SmartObject& Object); - - /** * @brief Validate smart object. * * @param Object Object to validate. * @param report__ object for reporting errors during validation * message if an error occurs - * + * @param MessageVersion to check mobile RPC version against RPC Spec Histor * @return NsSmartObjects::Errors::eType **/ - virtual Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__); + virtual Errors::eType validate( + const SmartObject& Object, + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = utils::SemanticVersion()); /** * @brief Set default value to an object. @@ -97,7 +93,8 @@ class ISchemaItem { **/ virtual void applySchema( NsSmartDeviceLink::NsSmartObjects::SmartObject& Object, - const bool RemoveFakeParameters); + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion = utils::SemanticVersion()); /** * @brief Unapply schema. @@ -126,7 +123,7 @@ class ISchemaItem { virtual ~ISchemaItem() {} }; -typedef utils::SharedPtr<ISchemaItem> ISchemaItemPtr; +typedef std::shared_ptr<ISchemaItem> ISchemaItemPtr; } // namespace NsSmartObjects } // namespace NsSmartDeviceLink #endif // SRC_COMPONENTS_SMART_OBJECTS_INCLUDE_SMART_OBJECTS_SCHEMA_ITEM_H_ diff --git a/src/components/smart_objects/include/smart_objects/smart_object.h b/src/components/smart_objects/include/smart_objects/smart_object.h index cc2bc7e22c..022dc6cb13 100644 --- a/src/components/smart_objects/include/smart_objects/smart_object.h +++ b/src/components/smart_objects/include/smart_objects/smart_object.h @@ -35,6 +35,7 @@ #include <set> #include <string> +#include <sstream> #include <vector> #include <map> @@ -126,7 +127,7 @@ typedef std::map<std::string, SmartObject> SmartMap; **/ typedef std::vector<uint8_t> SmartBinary; -typedef utils::SharedPtr<SmartObject> SmartObjectSPtr; +typedef std::shared_ptr<SmartObject> SmartObjectSPtr; /** * @brief List of SmartObjects @@ -671,20 +672,15 @@ class SmartObject FINAL { bool isValid() const; /** - * @deprecated - * @brief Validates object according to attached schema. - * - * @return Result of validation. - */ - DEPRECATED Errors::eType validate(); - - /** * @brief Validates object according to attached schema. * * @param report__ object for reporting errors during validation + * @param messageVersion of the mobile app to check against RPC Spec Schema * @return Result of validation. */ - Errors::eType validate(rpc::ValidationReport* report__); + Errors::eType validate( + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = utils::SemanticVersion()); /** * @brief Sets new schema diff --git a/src/components/smart_objects/include/smart_objects/smart_schema.h b/src/components/smart_objects/include/smart_objects/smart_schema.h index ada5646043..80a85e1778 100644 --- a/src/components/smart_objects/include/smart_objects/smart_schema.h +++ b/src/components/smart_objects/include/smart_objects/smart_schema.h @@ -61,26 +61,17 @@ class CSmartSchema FINAL { explicit CSmartSchema(const ISchemaItemPtr SchemaItem); /** - * @deprecated - * - * @brief Validate smart object. - * - * @param Object Object to validate. - * - * @return NsSmartObjects::Errors::eType - **/ - DEPRECATED Errors::eType validate(const SmartObject& Object) const; - - /** * @brief Validate smart object. * * @param Object Object to validate. * @param report__ object for reporting errors during validation - * + * @param MessageVersion to check mobile RPC version against RPC Spec History * @return NsSmartObjects::Errors::eType **/ Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__) const; + rpc::ValidationReport* report__, + const utils::SemanticVersion& messageVersion = + utils::SemanticVersion()) const; /** * @brief Set new root schema item. @@ -97,7 +88,10 @@ class CSmartSchema FINAL { * @param RemoveFakeParameters contains true if need to remove fake parameters * from smart object otherwise contains false. **/ - void applySchema(SmartObject& Object, const bool RemoveFakeParameters); + void applySchema( + SmartObject& Object, + const bool RemoveFakeParameters, + const utils::SemanticVersion& MessageVersion = utils::SemanticVersion()); /** * @brief The reverse SmartObject conversion using schema. diff --git a/src/components/smart_objects/include/smart_objects/string_schema_item.h b/src/components/smart_objects/include/smart_objects/string_schema_item.h index 6c98dcc3b3..709cf7d568 100644 --- a/src/components/smart_objects/include/smart_objects/string_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/string_schema_item.h @@ -36,8 +36,6 @@ #include <stddef.h> #include <string> -#include "utils/shared_ptr.h" - #include "smart_objects/default_shema_item.h" #include "smart_objects/schema_item_parameter.h" @@ -54,28 +52,25 @@ class CStringSchemaItem : public CDefaultSchemaItem<std::string> { * @param DefaultValue Default value. * @return Shared pointer to a new schema item. **/ - static utils::SharedPtr<CStringSchemaItem> create( + static std::shared_ptr<CStringSchemaItem> create( const TSchemaItemParameter<size_t>& MinLength = TSchemaItemParameter<size_t>(), const TSchemaItemParameter<size_t>& MaxLength = TSchemaItemParameter<size_t>(), const TSchemaItemParameter<std::string>& DefaultValue = TSchemaItemParameter<std::string>()); - /** - * @deprecated - * @brief Validate smart object. - * @param Object Object to validate. - * @return NsSmartObjects::Errors::eType - **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + /** * @brief Validate smart object. * @param Object Object to validate. * @param report__ object for reporting errors during validation + * @param MessageVersion to check mobile RPC version against RPC Spec History * @return NsSmartObjects::Errors::eType **/ Errors::eType validate(const SmartObject& Object, - rpc::ValidationReport* report__) OVERRIDE; + rpc::ValidationReport* report__, + const utils::SemanticVersion& MessageVersion = + utils::SemanticVersion()) OVERRIDE; private: /** |