diff options
Diffstat (limited to 'extensions/openpower-pels/user_data.hpp')
-rw-r--r-- | extensions/openpower-pels/user_data.hpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/extensions/openpower-pels/user_data.hpp b/extensions/openpower-pels/user_data.hpp new file mode 100644 index 0000000..3594849 --- /dev/null +++ b/extensions/openpower-pels/user_data.hpp @@ -0,0 +1,113 @@ +#pragma once + +#include "section.hpp" +#include "stream.hpp" + +namespace openpower +{ +namespace pels +{ + +/** + * @class UserData + * + * This represents the User Data section in a PEL. It is free form data + * that the creator knows the contents of. The component ID, version, + * and sub-type fields in the section header are used to identify the + * format. + * + * The Section base class handles the section header structure that every + * PEL section has at offset zero. + */ +class UserData : public Section +{ + public: + UserData() = delete; + ~UserData() = default; + UserData(const UserData&) = default; + UserData& operator=(const UserData&) = default; + UserData(UserData&&) = default; + UserData& operator=(UserData&&) = default; + + /** + * @brief Constructor + * + * Fills in this class's data fields from the stream. + * + * @param[in] pel - the PEL data stream + */ + explicit UserData(Stream& pel); + + /** + * @brief Constructor + * + * Create a valid UserData object with the passed in data. + * + * The component ID, subtype, and version are used to identify + * the data to know which parser to call. + * + * @param[in] componentID - Component ID of the creator + * @param[in] subType - The type of user data + * @param[in] version - The version of the data + */ + UserData(uint16_t componentID, uint8_t subType, uint8_t version, + const std::vector<uint8_t>& data); + + /** + * @brief Flatten the section into the stream + * + * @param[in] stream - The stream to write to + */ + void flatten(Stream& stream) const override; + + /** + * @brief Returns the size of this section when flattened into a PEL + * + * @return size_t - the size of the section + */ + size_t flattenedSize() + { + return Section::flattenedSize() + _data.size(); + } + + /** + * @brief Returns the raw section data + * + * @return std::vector<uint8_t>& + */ + const std::vector<uint8_t>& data() const + { + return _data; + } + + /** + * @brief Get the section contents in JSON + * + * @return The JSON as a string if a parser was found, + * otherwise std::nullopt. + */ + std::optional<std::string> getJSON() const override; + + private: + /** + * @brief Fills in the object from the stream data + * + * @param[in] stream - The stream to read from + */ + void unflatten(Stream& stream); + + /** + * @brief Validates the section contents + * + * Updates _valid (in Section) with the results. + */ + void validate() override; + + /** + * @brief The section data + */ + std::vector<uint8_t> _data; +}; + +} // namespace pels +} // namespace openpower |