1 #pragma once 2 3 #include "section.hpp" 4 #include "stream.hpp" 5 6 namespace openpower 7 { 8 namespace pels 9 { 10 11 /** 12 * @class UserData 13 * 14 * This represents the User Data section in a PEL. It is free form data 15 * that the creator knows the contents of. The component ID, version, 16 * and sub-type fields in the section header are used to identify the 17 * format. 18 * 19 * The Section base class handles the section header structure that every 20 * PEL section has at offset zero. 21 */ 22 class UserData : public Section 23 { 24 public: 25 UserData() = delete; 26 ~UserData() = default; 27 UserData(const UserData&) = default; 28 UserData& operator=(const UserData&) = default; 29 UserData(UserData&&) = default; 30 UserData& operator=(UserData&&) = default; 31 32 /** 33 * @brief Constructor 34 * 35 * Fills in this class's data fields from the stream. 36 * 37 * @param[in] pel - the PEL data stream 38 */ 39 explicit UserData(Stream& pel); 40 41 /** 42 * @brief Constructor 43 * 44 * Create a valid UserData object with the passed in data. 45 * 46 * The component ID, subtype, and version are used to identify 47 * the data to know which parser to call. 48 * 49 * @param[in] componentID - Component ID of the creator 50 * @param[in] subType - The type of user data 51 * @param[in] version - The version of the data 52 */ 53 UserData(uint16_t componentID, uint8_t subType, uint8_t version, 54 const std::vector<uint8_t>& data); 55 56 /** 57 * @brief Flatten the section into the stream 58 * 59 * @param[in] stream - The stream to write to 60 */ 61 void flatten(Stream& stream) const override; 62 63 /** 64 * @brief Returns the size of this section when flattened into a PEL 65 * 66 * @return size_t - the size of the section 67 */ 68 size_t flattenedSize() 69 { 70 return Section::flattenedSize() + _data.size(); 71 } 72 73 /** 74 * @brief Returns the raw section data 75 * 76 * @return std::vector<uint8_t>& 77 */ 78 const std::vector<uint8_t>& data() const 79 { 80 return _data; 81 } 82 83 /** 84 * @brief Get the section contents in JSON 85 * 86 * @return The JSON as a string if a parser was found, 87 * otherwise std::nullopt. 88 */ 89 std::optional<std::string> getJSON() const override; 90 91 private: 92 /** 93 * @brief Fills in the object from the stream data 94 * 95 * @param[in] stream - The stream to read from 96 */ 97 void unflatten(Stream& stream); 98 99 /** 100 * @brief Validates the section contents 101 * 102 * Updates _valid (in Section) with the results. 103 */ 104 void validate() override; 105 106 /** 107 * @brief The section data 108 */ 109 std::vector<uint8_t> _data; 110 }; 111 112 } // namespace pels 113 } // namespace openpower 114