summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels/user_data.hpp
blob: 35948494f52def35c546c796ad851cd012bdaad7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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
OpenPOWER on IntegriCloud