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 * 55 * @param[in] creatorID - The creator ID for the PEL 56 * 57 * @return std::optional<std::string> - If a section comes with a JSON 58 * representation, this would return the string for it. 59 */ 60 virtual std::optional<std::string> getJSON(uint8_t /* creatorID*/) const 61 { 62 return std::nullopt; 63 } 64 65 /** 66 * @brief Get section in JSON. Derived classes to override when required to. 67 * @param[in] registry - Registry object reference 68 * @param[in] plugins - Vector of strings of plugins found in filesystem 69 * @param[in] creatorID - Creator Subsystem ID from Private Header 70 * @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> 74 getJSON(message::Registry& /*registry*/, 75 const std::vector<std::string>& /*plugins*/, 76 uint8_t /*creatorID*/) const 77 { 78 return std::nullopt; 79 } 80 81 /** 82 * @brief Get section in JSON. Derived classes to override when required to. 83 * @param[in] creatorID - Creator Subsystem ID from Private Header 84 * @param[in] plugins - Vector of strings of plugins found in filesystem 85 * @return std::optional<std::string> - If a section comes with a JSON 86 * representation, this would return the string for it. 87 */ 88 virtual std::optional<std::string> 89 getJSON(uint8_t /*creatorID*/, 90 const std::vector<std::string>& /*plugins*/) const 91 { 92 return std::nullopt; 93 } 94 95 /** 96 * @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 */ 109 virtual bool shrink(size_t /*newSize*/) 110 { 111 return false; 112 } 113 114 /** 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 124 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 /** 134 * @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 /** 145 * @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; 164 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; 172 }; 173 } // namespace pels 174 } // namespace openpower 175