blob: 0d079f2f27bc31da098297bd1d51451d4d4727af [file] [log] [blame]
Matt Spinlerd3335df2019-07-10 11:04:21 -05001#pragma once
Aatir Manzurad0e0472019-10-07 13:18:37 -05002
Harisuddin Mohamed Isaa214ed32020-02-28 15:58:23 +08003#include "registry.hpp"
Matt Spinlerd3335df2019-07-10 11:04:21 -05004#include "section_header.hpp"
5
Aatir Manzurad0e0472019-10-07 13:18:37 -05006#include <optional>
7
Matt Spinlerd3335df2019-07-10 11:04:21 -05008namespace openpower
9{
10namespace pels
11{
Matt Spinlerd3335df2019-07-10 11:04:21 -050012/**
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 */
19class 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 */
Matt Spinler06885452019-11-06 10:35:42 -060032 const SectionHeader& header() const
Matt Spinlerd3335df2019-07-10 11:04:21 -050033 {
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
Matt Spinlercf5a8d02019-09-05 12:58:53 -050045 /**
46 * @brief Flatten the section into the stream
47 *
48 * @param[in] stream - The stream to write to
49 */
Matt Spinler06885452019-11-06 10:35:42 -060050 virtual void flatten(Stream& stream) const = 0;
Matt Spinlercf5a8d02019-09-05 12:58:53 -050051
Aatir Manzurad0e0472019-10-07 13:18:37 -050052 /**
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
Harisuddin Mohamed Isaa214ed32020-02-28 15:58:23 +080055 * representation, this would return the string for it.
Aatir Manzurad0e0472019-10-07 13:18:37 -050056 */
57 virtual std::optional<std::string> getJSON() const
58 {
59 return std::nullopt;
60 }
61
Harisuddin Mohamed Isaa214ed32020-02-28 15:58:23 +080062 /**
63 * @brief Get section in JSON. Derived classes to override when required to.
64 * @param[in] registry - Registry object reference
65 * @return std::optional<std::string> - If a section comes with a JSON
66 * representation, this would return the string for it.
67 */
68 virtual std::optional<std::string>
69 getJSON(message::Registry& registry) const
70 {
71 return std::nullopt;
72 }
73
Matt Spinlercbf3c4d2020-03-24 15:34:52 -050074 /**
Harisuddin Mohamed Isaf67bafd2020-07-06 17:51:21 +080075 * @brief Get section in JSON. Derived classes to override when required to.
76 * @param[in] creatorID - Creator Subsystem ID from Private Header
77 * @return std::optional<std::string> - If a section comes with a JSON
78 * representation, this would return the string for it.
79 */
80 virtual std::optional<std::string> getJSON(uint8_t creatorID) const
81 {
82 return std::nullopt;
83 }
84
85 /**
Matt Spinlercbf3c4d2020-03-24 15:34:52 -050086 * @brief Shrinks a PEL section
87 *
88 * If this is even possible for a section depends on which section
89 * it is. If a section cannot be shrunk, it doesn't need to implement
90 * shrink so it will just return false, meaning no shrinking was done.
91 *
92 * If a section can be shrunk, this function will be overridden in that
93 * class.
94 *
95 * @param[in] newSize - The new size, in bytes, to shrink to
96 *
97 * @return bool - true if successful, false else
98 */
99 virtual bool shrink(size_t newSize)
100 {
101 return false;
102 }
103
Matt Spinler85f61a62020-06-03 16:28:55 -0500104 /**
105 * @brief Returns any debug data stored in the object
106 *
107 * @return std::vector<std::string>& - The debug data
108 */
109 const std::vector<std::string>& getDebugData() const
110 {
111 return _debugData;
112 }
113
Matt Spinlerd3335df2019-07-10 11:04:21 -0500114 protected:
115 /**
116 * @brief Returns the flattened size of the section header
117 */
118 static constexpr size_t flattenedSize()
119 {
120 return SectionHeader::flattenedSize();
121 }
122
123 /**
Matt Spinler85f61a62020-06-03 16:28:55 -0500124 * @brief Adds debug data to the object that may be displayed
125 * in a UserData section in the PEL.
126 *
127 * @param[in] data - The new entry to add to the vector of data.
128 */
129 void addDebugData(const std::string& data)
130 {
131 _debugData.push_back(data);
132 }
133
134 /**
Matt Spinlerd3335df2019-07-10 11:04:21 -0500135 * @brief Used to validate the section.
136 *
137 * Implemented by derived classes.
138 */
139 virtual void validate() = 0;
140
141 /**
142 * @brief The section header structure.
143 *
144 * Filled in by derived classes.
145 */
146 SectionHeader _header;
147
148 /**
149 * @brief The section valid flag.
150 *
151 * This is determined by the derived class.
152 */
153 bool _valid = false;
Matt Spinler85f61a62020-06-03 16:28:55 -0500154
155 /**
156 * @brief Messages that derived classes can add during construction
157 * of a PEL when something happens that would be useful to
158 * store in the PEL. This may get added into a UserData section
159 * in the PEL.
160 */
161 std::vector<std::string> _debugData;
Matt Spinlerd3335df2019-07-10 11:04:21 -0500162};
163} // namespace pels
164} // namespace openpower