blob: bf08aa5e0c254badd1103966a7b20d745ab048a6 [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 /**
75 * @brief Shrinks a PEL section
76 *
77 * If this is even possible for a section depends on which section
78 * it is. If a section cannot be shrunk, it doesn't need to implement
79 * shrink so it will just return false, meaning no shrinking was done.
80 *
81 * If a section can be shrunk, this function will be overridden in that
82 * class.
83 *
84 * @param[in] newSize - The new size, in bytes, to shrink to
85 *
86 * @return bool - true if successful, false else
87 */
88 virtual bool shrink(size_t newSize)
89 {
90 return false;
91 }
92
Matt Spinler85f61a62020-06-03 16:28:55 -050093 /**
94 * @brief Returns any debug data stored in the object
95 *
96 * @return std::vector<std::string>& - The debug data
97 */
98 const std::vector<std::string>& getDebugData() const
99 {
100 return _debugData;
101 }
102
Matt Spinlerd3335df2019-07-10 11:04:21 -0500103 protected:
104 /**
105 * @brief Returns the flattened size of the section header
106 */
107 static constexpr size_t flattenedSize()
108 {
109 return SectionHeader::flattenedSize();
110 }
111
112 /**
Matt Spinler85f61a62020-06-03 16:28:55 -0500113 * @brief Adds debug data to the object that may be displayed
114 * in a UserData section in the PEL.
115 *
116 * @param[in] data - The new entry to add to the vector of data.
117 */
118 void addDebugData(const std::string& data)
119 {
120 _debugData.push_back(data);
121 }
122
123 /**
Matt Spinlerd3335df2019-07-10 11:04:21 -0500124 * @brief Used to validate the section.
125 *
126 * Implemented by derived classes.
127 */
128 virtual void validate() = 0;
129
130 /**
131 * @brief The section header structure.
132 *
133 * Filled in by derived classes.
134 */
135 SectionHeader _header;
136
137 /**
138 * @brief The section valid flag.
139 *
140 * This is determined by the derived class.
141 */
142 bool _valid = false;
Matt Spinler85f61a62020-06-03 16:28:55 -0500143
144 /**
145 * @brief Messages that derived classes can add during construction
146 * of a PEL when something happens that would be useful to
147 * store in the PEL. This may get added into a UserData section
148 * in the PEL.
149 */
150 std::vector<std::string> _debugData;
Matt Spinlerd3335df2019-07-10 11:04:21 -0500151};
152} // namespace pels
153} // namespace openpower