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