| #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 |