#pragma once #include "parser_factory.hpp" #include "parser_interface.hpp" #include "types.hpp" #include <string.h> #include <nlohmann/json.hpp> #include <iostream> namespace vpd { /** * @brief Class to implement a wrapper around concrete parser class. * The class based on VPD file passed, selects the required parser and exposes * API to parse the VPD and return the parsed data in required format to the * caller. */ class Parser { public: /** * @brief Constructor * * @param[in] vpdFilePath - Path to the VPD file. * @param[in] parsedJson - Parsed JSON. */ Parser(const std::string& vpdFilePath, nlohmann::json parsedJson); /** * @brief API to implement a generic parsing logic. * * This API is called to select parser based on the vpd data extracted from * the VPD file path passed to the constructor of the class. * It further parses the data based on the parser selected and returned * parsed map to the caller. */ types::VPDMapVariant parse(); /** * @brief API to get parser instance based on VPD type. * * This API detects the VPD type based on the file path passed to the * constructor of the class and returns the respective parser instance. * * @return Parser instance. */ std::shared_ptr<vpd::ParserInterface> getVpdParserInstance(); /** * @brief Update keyword value. * * This API is used to update keyword value on the EEPROM path and its * redundant path(s) if any taken from system config JSON. And also updates * keyword value on DBus. * * To update IPZ type VPD, input parameter for writing should be in the form * of (Record, Keyword, Value). Eg: ("VINI", "SN", {0x01, 0x02, 0x03}). * * To update Keyword type VPD, input parameter for writing should be in the * form of (Keyword, Value). Eg: ("PE", {0x01, 0x02, 0x03}). * * @param[in] i_paramsToWriteData - Input details. * * @return On success returns number of bytes written, on failure returns * -1. */ int updateVpdKeyword(const types::WriteVpdParams& i_paramsToWriteData); /** * @brief Update keyword value on hardware. * * This API is used to update keyword value on the hardware path. * * To update IPZ type VPD, input parameter for writing should be in the form * of (Record, Keyword, Value). Eg: ("VINI", "SN", {0x01, 0x02, 0x03}). * * To update Keyword type VPD, input parameter for writing should be in the * form of (Keyword, Value). Eg: ("PE", {0x01, 0x02, 0x03}). * * @param[in] i_paramsToWriteData - Input details. * * @return On success returns number of bytes written, on failure returns * -1. */ int updateVpdKeywordOnHardware( const types::WriteVpdParams& i_paramsToWriteData); private: /** * @brief Update keyword value on redundant path. * * This API is used to update keyword value on the given redundant path(s). * * To update IPZ type VPD, input parameter for writing should be in the form * of (Record, Keyword, Value). Eg: ("VINI", "SN", {0x01, 0x02, 0x03}). * * To update Keyword type VPD, input parameter for writing should be in the * form of (Keyword, Value). Eg: ("PE", {0x01, 0x02, 0x03}). * * @param[in] i_fruPath - Redundant EEPROM path. * @param[in] i_paramsToWriteData - Input details. * * @return On success returns number of bytes written, on failure returns * -1. */ int updateVpdKeywordOnRedundantPath( const std::string& i_fruPath, const types::WriteVpdParams& i_paramsToWriteData); // holds offfset to VPD if applicable. size_t m_vpdStartOffset = 0; // Path to the VPD file const std::string& m_vpdFilePath; // Path to configuration file, can be empty. nlohmann::json m_parsedJson; // Vector to hold VPD. types::BinaryVector m_vpdVector; }; // parser } // namespace vpd