| #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() override = 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::headerSize() + _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 | 
 |      * @param[in] creatorID - Creator Subsystem ID from Private Header | 
 |      * @param[in] plugins - Vector of strings of plugins found in filesystem | 
 |      * @return The JSON as a string if a parser was found, | 
 |      *         otherwise std::nullopt. | 
 |      */ | 
 |     std::optional<std::string> getJSON( | 
 |         uint8_t creatorID, | 
 |         const std::vector<std::string>& plugins) const override; | 
 |  | 
 |     /** | 
 |      * @brief Shrink the section | 
 |      * | 
 |      * The new size must be between the current size and the minimum | 
 |      * size, which is 12 bytes.  If it isn't a 4 byte aligned value | 
 |      * the code will do the aligning before the resize takes place. | 
 |      * | 
 |      * @param[in] newSize - The new size in bytes | 
 |      * | 
 |      * @return bool - true if successful, false else. | 
 |      */ | 
 |     bool shrink(size_t newSize) 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(); | 
 |  | 
 |     /** | 
 |      * @brief The section data | 
 |      */ | 
 |     std::vector<uint8_t> _data; | 
 | }; | 
 |  | 
 | } // namespace pels | 
 | } // namespace openpower |