1 *fa5e4d32SSunny Srivastava #pragma once 2 *fa5e4d32SSunny Srivastava 3 *fa5e4d32SSunny Srivastava #include "parser_interface.hpp" 4 *fa5e4d32SSunny Srivastava #include "types.hpp" 5 *fa5e4d32SSunny Srivastava 6 *fa5e4d32SSunny Srivastava namespace vpd 7 *fa5e4d32SSunny Srivastava { 8 *fa5e4d32SSunny Srivastava 9 *fa5e4d32SSunny Srivastava /** 10 *fa5e4d32SSunny Srivastava * @brief Concrete class to implement Keyword VPD parsing 11 *fa5e4d32SSunny Srivastava * 12 *fa5e4d32SSunny Srivastava * The class inherits ParserInterface class and overrides the parser 13 *fa5e4d32SSunny Srivastava * functionality to implement parsing logic for Keyword VPD format. 14 *fa5e4d32SSunny Srivastava */ 15 *fa5e4d32SSunny Srivastava class KeywordVpdParser : public ParserInterface 16 *fa5e4d32SSunny Srivastava { 17 *fa5e4d32SSunny Srivastava public: 18 *fa5e4d32SSunny Srivastava KeywordVpdParser() = delete; 19 *fa5e4d32SSunny Srivastava KeywordVpdParser(const KeywordVpdParser&) = delete; 20 *fa5e4d32SSunny Srivastava KeywordVpdParser(KeywordVpdParser&&) = delete; 21 *fa5e4d32SSunny Srivastava ~KeywordVpdParser() = default; 22 *fa5e4d32SSunny Srivastava 23 *fa5e4d32SSunny Srivastava /** 24 *fa5e4d32SSunny Srivastava * @brief Constructor 25 *fa5e4d32SSunny Srivastava * 26 *fa5e4d32SSunny Srivastava * @param kwVpdVector - move it to object's m_keywordVpdVector 27 *fa5e4d32SSunny Srivastava */ KeywordVpdParser(const types::BinaryVector & kwVpdVector)28 *fa5e4d32SSunny Srivastava KeywordVpdParser(const types::BinaryVector& kwVpdVector) : 29 *fa5e4d32SSunny Srivastava m_keywordVpdVector(kwVpdVector), 30 *fa5e4d32SSunny Srivastava m_vpdIterator(m_keywordVpdVector.begin()) 31 *fa5e4d32SSunny Srivastava {} 32 *fa5e4d32SSunny Srivastava 33 *fa5e4d32SSunny Srivastava /** 34 *fa5e4d32SSunny Srivastava * @brief A wrapper function to parse the keyword VPD binary data. 35 *fa5e4d32SSunny Srivastava * 36 *fa5e4d32SSunny Srivastava * It validates certain tags and checksum data, calls helper function 37 *fa5e4d32SSunny Srivastava * to parse and emplace the data as keyword-value pairs in KeywordVpdMap. 38 *fa5e4d32SSunny Srivastava * 39 *fa5e4d32SSunny Srivastava * @throw DataException - VPD is not valid 40 *fa5e4d32SSunny Srivastava * @return map of keyword:value 41 *fa5e4d32SSunny Srivastava */ 42 *fa5e4d32SSunny Srivastava types::VPDMapVariant parse(); 43 *fa5e4d32SSunny Srivastava 44 *fa5e4d32SSunny Srivastava private: 45 *fa5e4d32SSunny Srivastava /** 46 *fa5e4d32SSunny Srivastava * @brief Parse the VPD data and emplace them as pair into the Map. 47 *fa5e4d32SSunny Srivastava * 48 *fa5e4d32SSunny Srivastava * @throw DataException - VPD data size is 0, check VPD 49 *fa5e4d32SSunny Srivastava * @return map of keyword:value 50 *fa5e4d32SSunny Srivastava */ 51 *fa5e4d32SSunny Srivastava types::KeywordVpdMap populateVpdMap(); 52 *fa5e4d32SSunny Srivastava 53 *fa5e4d32SSunny Srivastava /** 54 *fa5e4d32SSunny Srivastava * @brief Validate checksum. 55 *fa5e4d32SSunny Srivastava * 56 *fa5e4d32SSunny Srivastava * Finding the 2's complement of sum of all the 57 *fa5e4d32SSunny Srivastava * keywords,values and large resource identifier string. 58 *fa5e4d32SSunny Srivastava * 59 *fa5e4d32SSunny Srivastava * @param[in] i_checkSumStart - VPD iterator pointing at checksum start 60 *fa5e4d32SSunny Srivastava * value 61 *fa5e4d32SSunny Srivastava * @param[in] i_checkSumEnd - VPD iterator pointing at checksum end value 62 *fa5e4d32SSunny Srivastava * @throw DataException - checksum invalid, check VPD 63 *fa5e4d32SSunny Srivastava */ 64 *fa5e4d32SSunny Srivastava void validateChecksum(types::BinaryVector::const_iterator i_checkSumStart, 65 *fa5e4d32SSunny Srivastava types::BinaryVector::const_iterator i_checkSumEnd); 66 *fa5e4d32SSunny Srivastava 67 *fa5e4d32SSunny Srivastava /** 68 *fa5e4d32SSunny Srivastava * @brief It reads 2 bytes from current VPD pointer 69 *fa5e4d32SSunny Srivastava * 70 *fa5e4d32SSunny Srivastava * @return 2 bytes of VPD data 71 *fa5e4d32SSunny Srivastava */ getKwDataSize()72 *fa5e4d32SSunny Srivastava inline size_t getKwDataSize() 73 *fa5e4d32SSunny Srivastava { 74 *fa5e4d32SSunny Srivastava return (*(m_vpdIterator + 1) << 8 | *m_vpdIterator); 75 *fa5e4d32SSunny Srivastava } 76 *fa5e4d32SSunny Srivastava 77 *fa5e4d32SSunny Srivastava /** 78 *fa5e4d32SSunny Srivastava * @brief Check for given number of bytes validity 79 *fa5e4d32SSunny Srivastava * 80 *fa5e4d32SSunny Srivastava * Check if number of elements from (begining of the vector) to (iterator + 81 *fa5e4d32SSunny Srivastava * numberOfBytes) is lesser than or equal to the total no.of elements in 82 *fa5e4d32SSunny Srivastava * the vector. This check is performed before advancement of the iterator. 83 *fa5e4d32SSunny Srivastava * 84 *fa5e4d32SSunny Srivastava * @param[in] numberOfBytes - no.of positions the iterator is going to be 85 *fa5e4d32SSunny Srivastava * iterated 86 *fa5e4d32SSunny Srivastava * 87 *fa5e4d32SSunny Srivastava * @throw DataException - Truncated VPD data, check VPD. 88 *fa5e4d32SSunny Srivastava */ 89 *fa5e4d32SSunny Srivastava void checkNextBytesValidity(uint8_t numberOfBytes); 90 *fa5e4d32SSunny Srivastava 91 *fa5e4d32SSunny Srivastava /*Vector of keyword VPD data*/ 92 *fa5e4d32SSunny Srivastava const types::BinaryVector& m_keywordVpdVector; 93 *fa5e4d32SSunny Srivastava 94 *fa5e4d32SSunny Srivastava /*Iterator to VPD data*/ 95 *fa5e4d32SSunny Srivastava types::BinaryVector::const_iterator m_vpdIterator; 96 *fa5e4d32SSunny Srivastava }; 97 *fa5e4d32SSunny Srivastava } // namespace vpd 98