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