|  | #pragma once | 
|  |  | 
|  | #include "parser_interface.hpp" | 
|  | #include "types.hpp" | 
|  |  | 
|  | namespace vpd | 
|  | { | 
|  |  | 
|  | /** | 
|  | * @brief Concrete class to implement Keyword VPD parsing | 
|  | * | 
|  | * The class inherits ParserInterface class and overrides the parser | 
|  | * functionality to implement parsing logic for Keyword VPD format. | 
|  | */ | 
|  | class KeywordVpdParser : public ParserInterface | 
|  | { | 
|  | public: | 
|  | KeywordVpdParser() = delete; | 
|  | KeywordVpdParser(const KeywordVpdParser&) = delete; | 
|  | KeywordVpdParser(KeywordVpdParser&&) = delete; | 
|  | ~KeywordVpdParser() = default; | 
|  |  | 
|  | /** | 
|  | * @brief Constructor | 
|  | * | 
|  | * @param kwVpdVector - move it to object's m_keywordVpdVector | 
|  | */ | 
|  | KeywordVpdParser(const types::BinaryVector& kwVpdVector) : | 
|  | m_keywordVpdVector(kwVpdVector), | 
|  | m_vpdIterator(m_keywordVpdVector.begin()) | 
|  | {} | 
|  |  | 
|  | /** | 
|  | * @brief A wrapper function to parse the keyword VPD binary data. | 
|  | * | 
|  | * It validates certain tags and checksum data, calls helper function | 
|  | * to parse and emplace the data as keyword-value pairs in KeywordVpdMap. | 
|  | * | 
|  | * @throw DataException - VPD is not valid | 
|  | * @return map of keyword:value | 
|  | */ | 
|  | types::VPDMapVariant parse(); | 
|  |  | 
|  | private: | 
|  | /** | 
|  | * @brief Parse the VPD data and emplace them as pair into the Map. | 
|  | * | 
|  | * @throw DataException - VPD data size is 0, check VPD | 
|  | * @return map of keyword:value | 
|  | */ | 
|  | types::KeywordVpdMap populateVpdMap(); | 
|  |  | 
|  | /** | 
|  | * @brief Validate checksum. | 
|  | * | 
|  | * Finding the 2's complement of sum of all the | 
|  | * keywords,values and large resource identifier string. | 
|  | * | 
|  | * @param[in] i_checkSumStart - VPD iterator pointing at checksum start | 
|  | * value | 
|  | * @param[in] i_checkSumEnd - VPD iterator pointing at checksum end value | 
|  | * @throw DataException - checksum invalid, check VPD | 
|  | */ | 
|  | void validateChecksum(types::BinaryVector::const_iterator i_checkSumStart, | 
|  | types::BinaryVector::const_iterator i_checkSumEnd); | 
|  |  | 
|  | /** | 
|  | * @brief It reads 2 bytes from current VPD pointer | 
|  | * | 
|  | * @return 2 bytes of VPD data | 
|  | */ | 
|  | inline size_t getKwDataSize() | 
|  | { | 
|  | return (*(m_vpdIterator + 1) << 8 | *m_vpdIterator); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Check for given number of bytes validity | 
|  | * | 
|  | * Check if number of elements from (begining of the vector) to (iterator + | 
|  | * numberOfBytes) is lesser than or equal to the total no.of elements in | 
|  | * the vector. This check is performed before advancement of the iterator. | 
|  | * | 
|  | * @param[in] numberOfBytes - no.of positions the iterator is going to be | 
|  | * iterated | 
|  | * | 
|  | * @throw DataException - Truncated VPD data, check VPD. | 
|  | */ | 
|  | void checkNextBytesValidity(uint8_t numberOfBytes); | 
|  |  | 
|  | /*Vector of keyword VPD data*/ | 
|  | const types::BinaryVector& m_keywordVpdVector; | 
|  |  | 
|  | /*Iterator to VPD data*/ | 
|  | types::BinaryVector::const_iterator m_vpdIterator; | 
|  | }; | 
|  | } // namespace vpd |