diff options
Diffstat (limited to 'src/components/formatters/include/formatters/CSmartFactory.h')
-rw-r--r-- | src/components/formatters/include/formatters/CSmartFactory.h | 752 |
1 files changed, 367 insertions, 385 deletions
diff --git a/src/components/formatters/include/formatters/CSmartFactory.h b/src/components/formatters/include/formatters/CSmartFactory.h index 55f9a30385..223d22fbbe 100644 --- a/src/components/formatters/include/formatters/CSmartFactory.h +++ b/src/components/formatters/include/formatters/CSmartFactory.h @@ -40,389 +40,371 @@ #include <map> #include <string> -namespace NsSmartDeviceLink -{ - namespace NsJSONHandler - { - /** - * @brief String constants used by SmartFactory. - */ - namespace strings - { - /** - * @brief String constant for MSG_PARAMS. - */ - extern const std::string S_MSG_PARAMS; - - /** - * @brief String constant for PARAMS. - */ - extern const std::string S_PARAMS; - - /** - * @brief String constant for FUNCTION_ID. - */ - extern const std::string S_FUNCTION_ID; - - /** - * @brief String constant for MESSAGE_TYPE. - */ - extern const std::string S_MESSAGE_TYPE; - - /** - * @brief String constant for PROTOCOL_VERSION. - */ - extern const std::string S_PROTOCOL_VERSION; - - /** - * @brief String constant for PROTOCOL_TYPE. - */ - extern const std::string S_PROTOCOL_TYPE; - - /** - * @brief String constant for CORRELATION_ID. - */ - extern const std::string S_CORRELATION_ID; - - /** - * @brief String constant for "code" param name. - */ - extern const std::string kCode; - - /** - * @brief String constant for "message" param name. - */ - extern const std::string kMessage; - } - - /** - * @brief Smart Schema key. - * - * @tparam FunctionIdEnum Type of function ID enum. - * @tparam MessageTypeEnum Type of messageType enum. - */ - template <class FunctionIdEnum, class MessageTypeEnum> - struct SmartSchemaKey - { - /** - * @brief Value of function ID for the key. - */ - FunctionIdEnum functionId; - - /** - * @brief Value of messageType for the key. - */ - MessageTypeEnum messageType; - - /** - * @brief Constructor. - * - * @param functionIdParam Value of function ID. - * @param messageTypeParam Value of message type. - */ - SmartSchemaKey(FunctionIdEnum functionIdParam, MessageTypeEnum messageTypeParam); - }; - - /** - * @brief Smart Factory. - * - * This class is used as base class for generated factories. - * Clients should use methods of this class to access all - * SmartSchema validation features. - * - * @tparam FunctionIdEnum Type of function ID enum. - * @tparam MessageTypeEnum Type of messageType enum. - * @tparam StructIdEnum Type of StructId enum. - */ - template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> - class CSmartFactory - { - public: - - /** - * @brief Constructor. - */ - CSmartFactory(void); - - /** - * @brief Attach schema to the function SmartObject. - * - * @param object SmartObject to attach schema for. - * - * @param RemoveFakeParameters contains true if need - * to remove fake parameters from smart object otherwise contains false. - * - * @return True if operation was successful or false otherwise. - */ - bool attachSchema(NsSmartDeviceLink::NsSmartObjects::SmartObject& object, - const bool RemoveFakeParameters); - - /** - * @brief Attach schema to the struct SmartObject. - * - * @param struct_id Identifier of the struct. - * @param object SmartObject to attach schema for. - * - * @return True if operation was successful of false otherwise. - */ - bool AttachSchema(const StructIdEnum struct_id, - NsSmartDeviceLink::NsSmartObjects::SmartObject &object); - - - /** - * @brief Create new SmartObject with attached function SmartSchema. - * - * @param function_id FunctionID of the function. - * @param message_type messageType of the function. - * - * @return If function succeeded it returns new SmartObject with - * map type and attached SmartSchema. Client can use such - * object to store specific function and perform validation. - * Otherwise (if SmartSchema was not attached to the - * SmartObject) function returns empty SmartObject with - * null type. - */ - NsSmartDeviceLink::NsSmartObjects::SmartObject CreateSmartObject( - const FunctionIdEnum function_id, - const MessageTypeEnum message_type); - - /** - * @brief Create new SmartObject with attached struct SmartSchema. - * - * @param struct_id Identifier of the struct. - * - * @return If function succeeded it returns new SmartObject with - * map type and attached SmartSchema. Client can use such - * object to store specific struct and perform validation. - * Otherwise (if SmartSchema was not attached to the - * SmartObject) function returns empty SmartObject with - * null type. - */ - NsSmartDeviceLink::NsSmartObjects::SmartObject CreateSmartObject( - const StructIdEnum struct_id); - - /** - * @brief Get SmartSchema for specific function. - * - * @param function_id FunctionID of the function. - * @param message_type messageType of the function. - * @param[out] result This value will be copy of the desired - * function SmartSchema if it found (this - * function returns true) or unmodified if - * SmartSchema is not found (this function - * returns false). - * - * @return True if function schema for specified input parameters - * is found or false otherwise. - */ - bool GetSchema( - const FunctionIdEnum function_id, - const MessageTypeEnum message_type, - NsSmartDeviceLink::NsSmartObjects::CSmartSchema &result); - - /** - * @brief Get SmartSchema for specific struct. - * - * @param struct_id Identifier of the struct. - * - * @param[out] result This value will be copy of the desired - * struct SmartSchema if it found (this - * function returns true) or unmodified if - * SmartSchema is not found (this function - * returns false). - * - * @return True if struct schema for specified input parameter is - * found or false otherwise. - */ - bool GetSchema( - const StructIdEnum struct_id, - NsSmartDeviceLink::NsSmartObjects::CSmartSchema &result); - - protected: - - /** - * @brief Defines map of SmartSchemaKeys to the SmartSchemes. - * - * This container type should be used to store SmartSchemes of - * functions. - */ - typedef std::map<SmartSchemaKey<FunctionIdEnum, MessageTypeEnum>, - NsSmartDeviceLink::NsSmartObjects::CSmartSchema> - FuncionsSchemesMap; - - /** - * @brief Defines map of StructIdEnum to the SmartSchemes. - * - * This container type should be used to store SmartSchemes of - * structs. - */ - typedef std::map<StructIdEnum, - NsSmartDeviceLink::NsSmartObjects::CSmartSchema> - StructsSchemesMap; - - /** - * @brief Map of all function schemes for this factory. - */ - FuncionsSchemesMap functions_schemes_; - - /** - * @brief Map of all struct shemes for this factory. - */ - StructsSchemesMap structs_schemes_; - }; - - template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> - CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>::CSmartFactory(void) - : functions_schemes_(), - structs_schemes_() - { - } - - template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> - bool CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>:: - attachSchema(NsSmartDeviceLink::NsSmartObjects::SmartObject &object, - const bool RemoveFakeParameters) - { - if(false == object.keyExists(strings::S_PARAMS)) return false; - if(false == object[strings::S_PARAMS].keyExists(strings::S_MESSAGE_TYPE)) return false; - if(false == object[strings::S_PARAMS].keyExists(strings::S_FUNCTION_ID)) return false; - - MessageTypeEnum msgtype((MessageTypeEnum)object[strings::S_PARAMS][strings::S_MESSAGE_TYPE].asInt()); - FunctionIdEnum fid((FunctionIdEnum)object[strings::S_PARAMS][strings::S_FUNCTION_ID].asInt()); - - SmartSchemaKey<FunctionIdEnum, MessageTypeEnum> key(fid, msgtype); - - typename FuncionsSchemesMap::iterator schemaIterator = functions_schemes_.find(key); - - if(schemaIterator == functions_schemes_.end()) - { - // Schema was not found - return false; - } - - object.setSchema(schemaIterator->second); - schemaIterator->second.applySchema(object, RemoveFakeParameters); - - return true; - } - - template <class FunctionIdEnum, - class MessageTypeEnum, - class StructIdEnum> - bool CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>:: - AttachSchema( - const StructIdEnum struct_id, - NsSmartDeviceLink::NsSmartObjects::SmartObject &object) { - typename StructsSchemesMap::iterator structs_iterator = - structs_schemes_.find(struct_id); - - if (structs_iterator == structs_schemes_.end()) { - return false; - } - - object.setSchema(structs_iterator->second); - structs_iterator->second.applySchema(object, false); - - return true; - } - - template <class FunctionIdEnum, - class MessageTypeEnum, - class StructIdEnum> - NsSmartDeviceLink::NsSmartObjects::SmartObject - CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>:: - CreateSmartObject( - const FunctionIdEnum function_id, - const MessageTypeEnum message_type) { - SmartSchemaKey<FunctionIdEnum, MessageTypeEnum> key( - function_id, message_type); - - typename FuncionsSchemesMap::iterator schema_iterator = - functions_schemes_.find(key); - - if(schema_iterator != functions_schemes_.end()) { - NsSmartDeviceLink::NsSmartObjects::SmartObject function_object( - NsSmartDeviceLink::NsSmartObjects::SmartType_Map); - function_object.setSchema(schema_iterator->second); - schema_iterator->second.applySchema(function_object, false); - return function_object; - } - - return NsSmartDeviceLink::NsSmartObjects::SmartObject(); - } - - template <class FunctionIdEnum, - class MessageTypeEnum, - class StructIdEnum> - NsSmartDeviceLink::NsSmartObjects::SmartObject - CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>:: - CreateSmartObject(const StructIdEnum struct_id) { - NsSmartDeviceLink::NsSmartObjects::SmartObject struct_object( - NsSmartDeviceLink::NsSmartObjects::SmartType_Map); - if (AttachSchema(struct_id, struct_object)) { - return struct_object; - } - - return NsSmartDeviceLink::NsSmartObjects::SmartObject(); - } - - template <class FunctionIdEnum, - class MessageTypeEnum, - class StructIdEnum> - bool CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>:: - GetSchema(const FunctionIdEnum function_id, - const MessageTypeEnum message_type, - NsSmartDeviceLink::NsSmartObjects::CSmartSchema &result) { - SmartSchemaKey<FunctionIdEnum, MessageTypeEnum> key(function_id, - message_type); - - typename FuncionsSchemesMap::iterator schema_iterator = - functions_schemes_.find(key); - - if(schema_iterator != functions_schemes_.end()) { - result = schema_iterator->second; - return true; - } - - return false; - } - - template <class FunctionIdEnum, - class MessageTypeEnum, - class StructIdEnum> - bool CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>:: - GetSchema(const StructIdEnum struct_id, - NsSmartDeviceLink::NsSmartObjects::CSmartSchema &result) { - typename StructsSchemesMap::iterator structs_iterator = - structs_schemes_.find(struct_id); - - if(structs_iterator != structs_schemes_.end()) { - result = structs_iterator->second; - return true; - } - - return false; - } - - template <class FunctionIdEnum, class MessageTypeEnum> - SmartSchemaKey<FunctionIdEnum, MessageTypeEnum>::SmartSchemaKey(FunctionIdEnum functionIdParam, MessageTypeEnum messageTypeParam) - : functionId(functionIdParam) - , messageType(messageTypeParam) - { - - } - - template <class FunctionIdEnum, class MessageTypeEnum> - bool operator<(const SmartSchemaKey< FunctionIdEnum, MessageTypeEnum >& l, const SmartSchemaKey< FunctionIdEnum, MessageTypeEnum >& r) - { - if (l.functionId < r.functionId) return true; - if (l.functionId > r.functionId) return false; - - if (l.messageType < r.messageType) return true; - if (l.messageType > r.messageType) return false; - - return false; - } - } +namespace NsSmartDeviceLink { +namespace NsJSONHandler { +/** + * @brief String constants used by SmartFactory. + */ +namespace strings { +/** + * @brief String constant for MSG_PARAMS. + */ +extern const std::string S_MSG_PARAMS; + +/** + * @brief String constant for PARAMS. + */ +extern const std::string S_PARAMS; + +/** + * @brief String constant for FUNCTION_ID. + */ +extern const std::string S_FUNCTION_ID; + +/** + * @brief String constant for MESSAGE_TYPE. + */ +extern const std::string S_MESSAGE_TYPE; + +/** + * @brief String constant for PROTOCOL_VERSION. + */ +extern const std::string S_PROTOCOL_VERSION; + +/** + * @brief String constant for PROTOCOL_TYPE. + */ +extern const std::string S_PROTOCOL_TYPE; + +/** + * @brief String constant for CORRELATION_ID. + */ +extern const std::string S_CORRELATION_ID; + +/** + * @brief String constant for "code" param name. + */ +extern const std::string kCode; + +/** + * @brief String constant for "message" param name. + */ +extern const std::string kMessage; +} + +/** + * @brief Smart Schema key. + * + * @tparam FunctionIdEnum Type of function ID enum. + * @tparam MessageTypeEnum Type of messageType enum. + */ +template <class FunctionIdEnum, class MessageTypeEnum> +struct SmartSchemaKey { + /** + * @brief Value of function ID for the key. + */ + FunctionIdEnum functionId; + + /** + * @brief Value of messageType for the key. + */ + MessageTypeEnum messageType; + + /** + * @brief Constructor. + * + * @param functionIdParam Value of function ID. + * @param messageTypeParam Value of message type. + */ + SmartSchemaKey(FunctionIdEnum functionIdParam, + MessageTypeEnum messageTypeParam); +}; + +/** + * @brief Smart Factory. + * + * This class is used as base class for generated factories. + * Clients should use methods of this class to access all + * SmartSchema validation features. + * + * @tparam FunctionIdEnum Type of function ID enum. + * @tparam MessageTypeEnum Type of messageType enum. + * @tparam StructIdEnum Type of StructId enum. + */ +template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> +class CSmartFactory { + public: + /** + * @brief Constructor. + */ + CSmartFactory(void); + + /** + * @brief Attach schema to the function SmartObject. + * + * @param object SmartObject to attach schema for. + * + * @param RemoveFakeParameters contains true if need + * to remove fake parameters from smart object otherwise contains false. + * + * @return True if operation was successful or false otherwise. + */ + bool attachSchema(NsSmartDeviceLink::NsSmartObjects::SmartObject& object, + const bool RemoveFakeParameters); + + /** + * @brief Attach schema to the struct SmartObject. + * + * @param struct_id Identifier of the struct. + * @param object SmartObject to attach schema for. + * + * @return True if operation was successful of false otherwise. + */ + bool AttachSchema(const StructIdEnum struct_id, + NsSmartDeviceLink::NsSmartObjects::SmartObject& object); + + /** + * @brief Create new SmartObject with attached function SmartSchema. + * + * @param function_id FunctionID of the function. + * @param message_type messageType of the function. + * + * @return If function succeeded it returns new SmartObject with + * map type and attached SmartSchema. Client can use such + * object to store specific function and perform validation. + * Otherwise (if SmartSchema was not attached to the + * SmartObject) function returns empty SmartObject with + * null type. + */ + NsSmartDeviceLink::NsSmartObjects::SmartObject CreateSmartObject( + const FunctionIdEnum function_id, const MessageTypeEnum message_type); + + /** + * @brief Create new SmartObject with attached struct SmartSchema. + * + * @param struct_id Identifier of the struct. + * + * @return If function succeeded it returns new SmartObject with + * map type and attached SmartSchema. Client can use such + * object to store specific struct and perform validation. + * Otherwise (if SmartSchema was not attached to the + * SmartObject) function returns empty SmartObject with + * null type. + */ + NsSmartDeviceLink::NsSmartObjects::SmartObject CreateSmartObject( + const StructIdEnum struct_id); + + /** + * @brief Get SmartSchema for specific function. + * + * @param function_id FunctionID of the function. + * @param message_type messageType of the function. + * @param[out] result This value will be copy of the desired + * function SmartSchema if it found (this + * function returns true) or unmodified if + * SmartSchema is not found (this function + * returns false). + * + * @return True if function schema for specified input parameters + * is found or false otherwise. + */ + bool GetSchema(const FunctionIdEnum function_id, + const MessageTypeEnum message_type, + NsSmartDeviceLink::NsSmartObjects::CSmartSchema& result); + + /** + * @brief Get SmartSchema for specific struct. + * + * @param struct_id Identifier of the struct. + * + * @param[out] result This value will be copy of the desired + * struct SmartSchema if it found (this + * function returns true) or unmodified if + * SmartSchema is not found (this function + * returns false). + * + * @return True if struct schema for specified input parameter is + * found or false otherwise. + */ + bool GetSchema(const StructIdEnum struct_id, + NsSmartDeviceLink::NsSmartObjects::CSmartSchema& result); + + protected: + /** + * @brief Defines map of SmartSchemaKeys to the SmartSchemes. + * + * This container type should be used to store SmartSchemes of + * functions. + */ + typedef std::map<SmartSchemaKey<FunctionIdEnum, MessageTypeEnum>, + NsSmartDeviceLink::NsSmartObjects::CSmartSchema> + FuncionsSchemesMap; + + /** + * @brief Defines map of StructIdEnum to the SmartSchemes. + * + * This container type should be used to store SmartSchemes of + * structs. + */ + typedef std::map<StructIdEnum, + NsSmartDeviceLink::NsSmartObjects::CSmartSchema> + StructsSchemesMap; + + /** + * @brief Map of all function schemes for this factory. + */ + FuncionsSchemesMap functions_schemes_; + + /** + * @brief Map of all struct shemes for this factory. + */ + StructsSchemesMap structs_schemes_; +}; + +template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> +CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>::CSmartFactory( + void) + : functions_schemes_(), structs_schemes_() {} + +template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> +bool CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>::attachSchema( + NsSmartDeviceLink::NsSmartObjects::SmartObject& object, + const bool RemoveFakeParameters) { + if (false == object.keyExists(strings::S_PARAMS)) + return false; + if (false == object[strings::S_PARAMS].keyExists(strings::S_MESSAGE_TYPE)) + return false; + if (false == object[strings::S_PARAMS].keyExists(strings::S_FUNCTION_ID)) + return false; + + MessageTypeEnum msgtype( + (MessageTypeEnum) + object[strings::S_PARAMS][strings::S_MESSAGE_TYPE].asInt()); + FunctionIdEnum fid( + (FunctionIdEnum) + object[strings::S_PARAMS][strings::S_FUNCTION_ID].asInt()); + + SmartSchemaKey<FunctionIdEnum, MessageTypeEnum> key(fid, msgtype); + + typename FuncionsSchemesMap::iterator schemaIterator = + functions_schemes_.find(key); + + if (schemaIterator == functions_schemes_.end()) { + // Schema was not found + return false; + } + + object.setSchema(schemaIterator->second); + schemaIterator->second.applySchema(object, RemoveFakeParameters); + + return true; +} + +template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> +bool CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>::AttachSchema( + const StructIdEnum struct_id, + NsSmartDeviceLink::NsSmartObjects::SmartObject& object) { + typename StructsSchemesMap::iterator structs_iterator = + structs_schemes_.find(struct_id); + + if (structs_iterator == structs_schemes_.end()) { + return false; + } + + object.setSchema(structs_iterator->second); + structs_iterator->second.applySchema(object, false); + + return true; +} + +template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> +NsSmartDeviceLink::NsSmartObjects::SmartObject +CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>::CreateSmartObject( + const FunctionIdEnum function_id, const MessageTypeEnum message_type) { + SmartSchemaKey<FunctionIdEnum, MessageTypeEnum> key(function_id, + message_type); + + typename FuncionsSchemesMap::iterator schema_iterator = + functions_schemes_.find(key); + + if (schema_iterator != functions_schemes_.end()) { + NsSmartDeviceLink::NsSmartObjects::SmartObject function_object( + NsSmartDeviceLink::NsSmartObjects::SmartType_Map); + function_object.setSchema(schema_iterator->second); + schema_iterator->second.applySchema(function_object, false); + return function_object; + } + + return NsSmartDeviceLink::NsSmartObjects::SmartObject(); +} + +template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> +NsSmartDeviceLink::NsSmartObjects::SmartObject +CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>::CreateSmartObject( + const StructIdEnum struct_id) { + NsSmartDeviceLink::NsSmartObjects::SmartObject struct_object( + NsSmartDeviceLink::NsSmartObjects::SmartType_Map); + if (AttachSchema(struct_id, struct_object)) { + return struct_object; + } + + return NsSmartDeviceLink::NsSmartObjects::SmartObject(); +} + +template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> +bool CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>::GetSchema( + const FunctionIdEnum function_id, + const MessageTypeEnum message_type, + NsSmartDeviceLink::NsSmartObjects::CSmartSchema& result) { + SmartSchemaKey<FunctionIdEnum, MessageTypeEnum> key(function_id, + message_type); + + typename FuncionsSchemesMap::iterator schema_iterator = + functions_schemes_.find(key); + + if (schema_iterator != functions_schemes_.end()) { + result = schema_iterator->second; + return true; + } + + return false; +} + +template <class FunctionIdEnum, class MessageTypeEnum, class StructIdEnum> +bool CSmartFactory<FunctionIdEnum, MessageTypeEnum, StructIdEnum>::GetSchema( + const StructIdEnum struct_id, + NsSmartDeviceLink::NsSmartObjects::CSmartSchema& result) { + typename StructsSchemesMap::iterator structs_iterator = + structs_schemes_.find(struct_id); + + if (structs_iterator != structs_schemes_.end()) { + result = structs_iterator->second; + return true; + } + + return false; +} + +template <class FunctionIdEnum, class MessageTypeEnum> +SmartSchemaKey<FunctionIdEnum, MessageTypeEnum>::SmartSchemaKey( + FunctionIdEnum functionIdParam, MessageTypeEnum messageTypeParam) + : functionId(functionIdParam), messageType(messageTypeParam) {} + +template <class FunctionIdEnum, class MessageTypeEnum> +bool operator<(const SmartSchemaKey<FunctionIdEnum, MessageTypeEnum>& l, + const SmartSchemaKey<FunctionIdEnum, MessageTypeEnum>& r) { + if (l.functionId < r.functionId) + return true; + if (l.functionId > r.functionId) + return false; + + if (l.messageType < r.messageType) + return true; + if (l.messageType > r.messageType) + return false; + + return false; +} +} } -#endif //__CSMARTFACTORY_HPP__ +#endif //__CSMARTFACTORY_HPP__ |