blob: 15ddcff539528f31e60b626041b6352684fe491a [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
Harisuddin Mohamed Isac8d6cc62020-08-19 22:47:19 +080065 * @param[in] plugins - Vector of strings of plugins found in filesystem
66 * @param[in] creatorID - Creator Subsystem ID from Private Header
Harisuddin Mohamed Isaa214ed32020-02-28 15:58:23 +080067 * @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>
Harisuddin Mohamed Isac8d6cc62020-08-19 22:47:19 +080071 getJSON(message::Registry& registry,
72 const std::vector<std::string>& plugins,
73 uint8_t creatorID) const
Harisuddin Mohamed Isaa214ed32020-02-28 15:58:23 +080074 {
75 return std::nullopt;
76 }
77
Matt Spinlercbf3c4d2020-03-24 15:34:52 -050078 /**
Harisuddin Mohamed Isaf67bafd2020-07-06 17:51:21 +080079 * @brief Get section in JSON. Derived classes to override when required to.
80 * @param[in] creatorID - Creator Subsystem ID from Private Header
Harisuddin Mohamed Isa3fdcd4e2020-08-26 11:56:42 +080081 * @param[in] plugins - Vector of strings of plugins found in filesystem
Harisuddin Mohamed Isaf67bafd2020-07-06 17:51:21 +080082 * @return std::optional<std::string> - If a section comes with a JSON
83 * representation, this would return the string for it.
84 */
Harisuddin Mohamed Isa3fdcd4e2020-08-26 11:56:42 +080085 virtual std::optional<std::string>
86 getJSON(uint8_t creatorID,
87 const std::vector<std::string>& plugins) const
Harisuddin Mohamed Isaf67bafd2020-07-06 17:51:21 +080088 {
89 return std::nullopt;
90 }
91
92 /**
Matt Spinlercbf3c4d2020-03-24 15:34:52 -050093 * @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
Matt Spinler85f61a62020-06-03 16:28:55 -0500111 /**
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
Matt Spinlerd3335df2019-07-10 11:04:21 -0500121 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 /**
Matt Spinler85f61a62020-06-03 16:28:55 -0500131 * @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 /**
Matt Spinlerd3335df2019-07-10 11:04:21 -0500142 * @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;
Matt Spinler85f61a62020-06-03 16:28:55 -0500161
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;
Matt Spinlerd3335df2019-07-10 11:04:21 -0500169};
170} // namespace pels
171} // namespace openpower