blob: 08f164cfe54c11949a472e89f7410ed1ecfdbbd1 [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.
Matt Spinlerb832aa52023-03-21 15:32:34 -050054 *
55 * @param[in] creatorID - The creator ID for the PEL
56 *
Aatir Manzurad0e0472019-10-07 13:18:37 -050057 * @return std::optional<std::string> - If a section comes with a JSON
Harisuddin Mohamed Isaa214ed32020-02-28 15:58:23 +080058 * representation, this would return the string for it.
Aatir Manzurad0e0472019-10-07 13:18:37 -050059 */
Matt Spinlerb832aa52023-03-21 15:32:34 -050060 virtual std::optional<std::string> getJSON(uint8_t /* creatorID*/) const
Aatir Manzurad0e0472019-10-07 13:18:37 -050061 {
62 return std::nullopt;
63 }
64
Harisuddin Mohamed Isaa214ed32020-02-28 15:58:23 +080065 /**
66 * @brief Get section in JSON. Derived classes to override when required to.
67 * @param[in] registry - Registry object reference
Harisuddin Mohamed Isac8d6cc62020-08-19 22:47:19 +080068 * @param[in] plugins - Vector of strings of plugins found in filesystem
69 * @param[in] creatorID - Creator Subsystem ID from Private Header
Harisuddin Mohamed Isaa214ed32020-02-28 15:58:23 +080070 * @return std::optional<std::string> - If a section comes with a JSON
71 * representation, this would return the string for it.
72 */
73 virtual std::optional<std::string>
Patrick Williamsd26fa3e2021-04-21 15:22:23 -050074 getJSON(message::Registry& /*registry*/,
75 const std::vector<std::string>& /*plugins*/,
76 uint8_t /*creatorID*/) const
Harisuddin Mohamed Isaa214ed32020-02-28 15:58:23 +080077 {
78 return std::nullopt;
79 }
80
Matt Spinlercbf3c4d2020-03-24 15:34:52 -050081 /**
Harisuddin Mohamed Isaf67bafd2020-07-06 17:51:21 +080082 * @brief Get section in JSON. Derived classes to override when required to.
83 * @param[in] creatorID - Creator Subsystem ID from Private Header
Harisuddin Mohamed Isa3fdcd4e2020-08-26 11:56:42 +080084 * @param[in] plugins - Vector of strings of plugins found in filesystem
Harisuddin Mohamed Isaf67bafd2020-07-06 17:51:21 +080085 * @return std::optional<std::string> - If a section comes with a JSON
86 * representation, this would return the string for it.
87 */
Harisuddin Mohamed Isa3fdcd4e2020-08-26 11:56:42 +080088 virtual std::optional<std::string>
Patrick Williamsd26fa3e2021-04-21 15:22:23 -050089 getJSON(uint8_t /*creatorID*/,
90 const std::vector<std::string>& /*plugins*/) const
Harisuddin Mohamed Isaf67bafd2020-07-06 17:51:21 +080091 {
92 return std::nullopt;
93 }
94
95 /**
Matt Spinlercbf3c4d2020-03-24 15:34:52 -050096 * @brief Shrinks a PEL section
97 *
98 * If this is even possible for a section depends on which section
99 * it is. If a section cannot be shrunk, it doesn't need to implement
100 * shrink so it will just return false, meaning no shrinking was done.
101 *
102 * If a section can be shrunk, this function will be overridden in that
103 * class.
104 *
105 * @param[in] newSize - The new size, in bytes, to shrink to
106 *
107 * @return bool - true if successful, false else
108 */
Patrick Williamsd26fa3e2021-04-21 15:22:23 -0500109 virtual bool shrink(size_t /*newSize*/)
Matt Spinlercbf3c4d2020-03-24 15:34:52 -0500110 {
111 return false;
112 }
113
Matt Spinler85f61a62020-06-03 16:28:55 -0500114 /**
115 * @brief Returns any debug data stored in the object
116 *
117 * @return std::vector<std::string>& - The debug data
118 */
119 const std::vector<std::string>& getDebugData() const
120 {
121 return _debugData;
122 }
123
Matt Spinlerd3335df2019-07-10 11:04:21 -0500124 protected:
125 /**
126 * @brief Returns the flattened size of the section header
127 */
128 static constexpr size_t flattenedSize()
129 {
130 return SectionHeader::flattenedSize();
131 }
132
133 /**
Matt Spinler85f61a62020-06-03 16:28:55 -0500134 * @brief Adds debug data to the object that may be displayed
135 * in a UserData section in the PEL.
136 *
137 * @param[in] data - The new entry to add to the vector of data.
138 */
139 void addDebugData(const std::string& data)
140 {
141 _debugData.push_back(data);
142 }
143
144 /**
Matt Spinlerd3335df2019-07-10 11:04:21 -0500145 * @brief Used to validate the section.
146 *
147 * Implemented by derived classes.
148 */
149 virtual void validate() = 0;
150
151 /**
152 * @brief The section header structure.
153 *
154 * Filled in by derived classes.
155 */
156 SectionHeader _header;
157
158 /**
159 * @brief The section valid flag.
160 *
161 * This is determined by the derived class.
162 */
163 bool _valid = false;
Matt Spinler85f61a62020-06-03 16:28:55 -0500164
165 /**
166 * @brief Messages that derived classes can add during construction
167 * of a PEL when something happens that would be useful to
168 * store in the PEL. This may get added into a UserData section
169 * in the PEL.
170 */
171 std::vector<std::string> _debugData;
Matt Spinlerd3335df2019-07-10 11:04:21 -0500172};
173} // namespace pels
174} // namespace openpower