#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