blob: ae30a34c87faff4fae9d28c7eb824fff7163fd75 [file] [log] [blame]
#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