1 #pragma once
2 
3 #include "registry.hpp"
4 #include "section_header.hpp"
5 
6 #include <optional>
7 
8 namespace openpower
9 {
10 namespace pels
11 {
12 /**
13  * @class Section
14  *
15  * The base class for a PEL section.  It contains the SectionHeader
16  * as all sections start with it.
17  *
18  */
19 class Section
20 {
21   public:
22     Section() = default;
23     virtual ~Section() = default;
24     Section(const Section&) = default;
25     Section& operator=(const Section&) = default;
26     Section(Section&&) = default;
27     Section& operator=(Section&&) = default;
28 
29     /**
30      * @brief Returns a reference to the SectionHeader
31      */
32     const SectionHeader& header() const
33     {
34         return _header;
35     }
36 
37     /**
38      * @brief Says if the section is valid.
39      */
40     bool valid() const
41     {
42         return _valid;
43     }
44 
45     /**
46      * @brief Flatten the section into the stream
47      *
48      * @param[in] stream - The stream to write to
49      */
50     virtual void flatten(Stream& stream) const = 0;
51 
52     /**
53      * @brief Get section in JSON. Derived classes to override when required to.
54      * @return std::optional<std::string> - If a section comes with a JSON
55      * representation, this would return the string for it.
56      */
57     virtual std::optional<std::string> getJSON() const
58     {
59         return std::nullopt;
60     }
61 
62     /**
63      * @brief Get section in JSON. Derived classes to override when required to.
64      * @param[in] registry - Registry object reference
65      * @param[in] plugins - Vector of strings of plugins found in filesystem
66      * @param[in] creatorID - Creator Subsystem ID from Private Header
67      * @return std::optional<std::string> - If a section comes with a JSON
68      * representation, this would return the string for it.
69      */
70     virtual std::optional<std::string>
71         getJSON(message::Registry& registry,
72                 const std::vector<std::string>& plugins,
73                 uint8_t creatorID) const
74     {
75         return std::nullopt;
76     }
77 
78     /**
79      * @brief Get section in JSON. Derived classes to override when required to.
80      * @param[in] creatorID - Creator Subsystem ID from Private Header
81      * @param[in] plugins - Vector of strings of plugins found in filesystem
82      * @return std::optional<std::string> - If a section comes with a JSON
83      * representation, this would return the string for it.
84      */
85     virtual std::optional<std::string>
86         getJSON(uint8_t creatorID,
87                 const std::vector<std::string>& plugins) const
88     {
89         return std::nullopt;
90     }
91 
92     /**
93      * @brief Shrinks a PEL section
94      *
95      * If this is even possible for a section depends on which section
96      * it is.  If a section cannot be shrunk, it doesn't need to implement
97      * shrink so it will just return false, meaning no shrinking was done.
98      *
99      * If a section can be shrunk, this function will be overridden in that
100      * class.
101      *
102      * @param[in] newSize - The new size, in bytes, to shrink to
103      *
104      * @return bool - true if successful, false else
105      */
106     virtual bool shrink(size_t newSize)
107     {
108         return false;
109     }
110 
111     /**
112      * @brief Returns any debug data stored in the object
113      *
114      * @return std::vector<std::string>& - The debug data
115      */
116     const std::vector<std::string>& getDebugData() const
117     {
118         return _debugData;
119     }
120 
121   protected:
122     /**
123      * @brief Returns the flattened size of the section header
124      */
125     static constexpr size_t flattenedSize()
126     {
127         return SectionHeader::flattenedSize();
128     }
129 
130     /**
131      * @brief Adds debug data to the object that may be displayed
132      *        in a UserData section in the PEL.
133      *
134      * @param[in] data - The new entry to add to the vector of data.
135      */
136     void addDebugData(const std::string& data)
137     {
138         _debugData.push_back(data);
139     }
140 
141     /**
142      * @brief Used to validate the section.
143      *
144      * Implemented by derived classes.
145      */
146     virtual void validate() = 0;
147 
148     /**
149      * @brief The section header structure.
150      *
151      * Filled in by derived classes.
152      */
153     SectionHeader _header;
154 
155     /**
156      * @brief The section valid flag.
157      *
158      * This is determined by the derived class.
159      */
160     bool _valid = false;
161 
162     /**
163      * @brief Messages that derived classes can add during construction
164      *        of a PEL when something happens that would be useful to
165      *        store in the PEL.  This may get added into a UserData section
166      *        in the PEL.
167      */
168     std::vector<std::string> _debugData;
169 };
170 } // namespace pels
171 } // namespace openpower
172