1d3335dfaSMatt Spinler #pragma once
2ad0e0476SAatir Manzur 
3a214ed30SHarisuddin Mohamed Isa #include "registry.hpp"
4d3335dfaSMatt Spinler #include "section_header.hpp"
5d3335dfaSMatt Spinler 
6ad0e0476SAatir Manzur #include <optional>
7ad0e0476SAatir Manzur 
8d3335dfaSMatt Spinler namespace openpower
9d3335dfaSMatt Spinler {
10d3335dfaSMatt Spinler namespace pels
11d3335dfaSMatt Spinler {
12d3335dfaSMatt Spinler /**
13d3335dfaSMatt Spinler  * @class Section
14d3335dfaSMatt Spinler  *
15d3335dfaSMatt Spinler  * The base class for a PEL section.  It contains the SectionHeader
16d3335dfaSMatt Spinler  * as all sections start with it.
17d3335dfaSMatt Spinler  *
18d3335dfaSMatt Spinler  */
19d3335dfaSMatt Spinler class Section
20d3335dfaSMatt Spinler {
21d3335dfaSMatt Spinler   public:
22d3335dfaSMatt Spinler     Section() = default;
23d3335dfaSMatt Spinler     virtual ~Section() = default;
24d3335dfaSMatt Spinler     Section(const Section&) = default;
25d3335dfaSMatt Spinler     Section& operator=(const Section&) = default;
26d3335dfaSMatt Spinler     Section(Section&&) = default;
27d3335dfaSMatt Spinler     Section& operator=(Section&&) = default;
28d3335dfaSMatt Spinler 
29d3335dfaSMatt Spinler     /**
30d3335dfaSMatt Spinler      * @brief Returns a reference to the SectionHeader
31d3335dfaSMatt Spinler      */
320688545bSMatt Spinler     const SectionHeader& header() const
33d3335dfaSMatt Spinler     {
34d3335dfaSMatt Spinler         return _header;
35d3335dfaSMatt Spinler     }
36d3335dfaSMatt Spinler 
37d3335dfaSMatt Spinler     /**
38d3335dfaSMatt Spinler      * @brief Says if the section is valid.
39d3335dfaSMatt Spinler      */
40d3335dfaSMatt Spinler     bool valid() const
41d3335dfaSMatt Spinler     {
42d3335dfaSMatt Spinler         return _valid;
43d3335dfaSMatt Spinler     }
44d3335dfaSMatt Spinler 
45cf5a8d0fSMatt Spinler     /**
46cf5a8d0fSMatt Spinler      * @brief Flatten the section into the stream
47cf5a8d0fSMatt Spinler      *
48cf5a8d0fSMatt Spinler      * @param[in] stream - The stream to write to
49cf5a8d0fSMatt Spinler      */
500688545bSMatt Spinler     virtual void flatten(Stream& stream) const = 0;
51cf5a8d0fSMatt Spinler 
52ad0e0476SAatir Manzur     /**
53ad0e0476SAatir Manzur      * @brief Get section in JSON. Derived classes to override when required to.
54ad0e0476SAatir Manzur      * @return std::optional<std::string> - If a section comes with a JSON
55a214ed30SHarisuddin Mohamed Isa      * representation, this would return the string for it.
56ad0e0476SAatir Manzur      */
57ad0e0476SAatir Manzur     virtual std::optional<std::string> getJSON() const
58ad0e0476SAatir Manzur     {
59ad0e0476SAatir Manzur         return std::nullopt;
60ad0e0476SAatir Manzur     }
61ad0e0476SAatir Manzur 
62a214ed30SHarisuddin Mohamed Isa     /**
63a214ed30SHarisuddin Mohamed Isa      * @brief Get section in JSON. Derived classes to override when required to.
64a214ed30SHarisuddin Mohamed Isa      * @param[in] registry - Registry object reference
65a214ed30SHarisuddin Mohamed Isa      * @return std::optional<std::string> - If a section comes with a JSON
66a214ed30SHarisuddin Mohamed Isa      * representation, this would return the string for it.
67a214ed30SHarisuddin Mohamed Isa      */
68a214ed30SHarisuddin Mohamed Isa     virtual std::optional<std::string>
69a214ed30SHarisuddin Mohamed Isa         getJSON(message::Registry& registry) const
70a214ed30SHarisuddin Mohamed Isa     {
71a214ed30SHarisuddin Mohamed Isa         return std::nullopt;
72a214ed30SHarisuddin Mohamed Isa     }
73a214ed30SHarisuddin Mohamed Isa 
74cbf3c4d4SMatt Spinler     /**
75*f67bafd0SHarisuddin Mohamed Isa      * @brief Get section in JSON. Derived classes to override when required to.
76*f67bafd0SHarisuddin Mohamed Isa      * @param[in] creatorID - Creator Subsystem ID from Private Header
77*f67bafd0SHarisuddin Mohamed Isa      * @return std::optional<std::string> - If a section comes with a JSON
78*f67bafd0SHarisuddin Mohamed Isa      * representation, this would return the string for it.
79*f67bafd0SHarisuddin Mohamed Isa      */
80*f67bafd0SHarisuddin Mohamed Isa     virtual std::optional<std::string> getJSON(uint8_t creatorID) const
81*f67bafd0SHarisuddin Mohamed Isa     {
82*f67bafd0SHarisuddin Mohamed Isa         return std::nullopt;
83*f67bafd0SHarisuddin Mohamed Isa     }
84*f67bafd0SHarisuddin Mohamed Isa 
85*f67bafd0SHarisuddin Mohamed Isa     /**
86cbf3c4d4SMatt Spinler      * @brief Shrinks a PEL section
87cbf3c4d4SMatt Spinler      *
88cbf3c4d4SMatt Spinler      * If this is even possible for a section depends on which section
89cbf3c4d4SMatt Spinler      * it is.  If a section cannot be shrunk, it doesn't need to implement
90cbf3c4d4SMatt Spinler      * shrink so it will just return false, meaning no shrinking was done.
91cbf3c4d4SMatt Spinler      *
92cbf3c4d4SMatt Spinler      * If a section can be shrunk, this function will be overridden in that
93cbf3c4d4SMatt Spinler      * class.
94cbf3c4d4SMatt Spinler      *
95cbf3c4d4SMatt Spinler      * @param[in] newSize - The new size, in bytes, to shrink to
96cbf3c4d4SMatt Spinler      *
97cbf3c4d4SMatt Spinler      * @return bool - true if successful, false else
98cbf3c4d4SMatt Spinler      */
99cbf3c4d4SMatt Spinler     virtual bool shrink(size_t newSize)
100cbf3c4d4SMatt Spinler     {
101cbf3c4d4SMatt Spinler         return false;
102cbf3c4d4SMatt Spinler     }
103cbf3c4d4SMatt Spinler 
10485f61a63SMatt Spinler     /**
10585f61a63SMatt Spinler      * @brief Returns any debug data stored in the object
10685f61a63SMatt Spinler      *
10785f61a63SMatt Spinler      * @return std::vector<std::string>& - The debug data
10885f61a63SMatt Spinler      */
10985f61a63SMatt Spinler     const std::vector<std::string>& getDebugData() const
11085f61a63SMatt Spinler     {
11185f61a63SMatt Spinler         return _debugData;
11285f61a63SMatt Spinler     }
11385f61a63SMatt Spinler 
114d3335dfaSMatt Spinler   protected:
115d3335dfaSMatt Spinler     /**
116d3335dfaSMatt Spinler      * @brief Returns the flattened size of the section header
117d3335dfaSMatt Spinler      */
118d3335dfaSMatt Spinler     static constexpr size_t flattenedSize()
119d3335dfaSMatt Spinler     {
120d3335dfaSMatt Spinler         return SectionHeader::flattenedSize();
121d3335dfaSMatt Spinler     }
122d3335dfaSMatt Spinler 
123d3335dfaSMatt Spinler     /**
12485f61a63SMatt Spinler      * @brief Adds debug data to the object that may be displayed
12585f61a63SMatt Spinler      *        in a UserData section in the PEL.
12685f61a63SMatt Spinler      *
12785f61a63SMatt Spinler      * @param[in] data - The new entry to add to the vector of data.
12885f61a63SMatt Spinler      */
12985f61a63SMatt Spinler     void addDebugData(const std::string& data)
13085f61a63SMatt Spinler     {
13185f61a63SMatt Spinler         _debugData.push_back(data);
13285f61a63SMatt Spinler     }
13385f61a63SMatt Spinler 
13485f61a63SMatt Spinler     /**
135d3335dfaSMatt Spinler      * @brief Used to validate the section.
136d3335dfaSMatt Spinler      *
137d3335dfaSMatt Spinler      * Implemented by derived classes.
138d3335dfaSMatt Spinler      */
139d3335dfaSMatt Spinler     virtual void validate() = 0;
140d3335dfaSMatt Spinler 
141d3335dfaSMatt Spinler     /**
142d3335dfaSMatt Spinler      * @brief The section header structure.
143d3335dfaSMatt Spinler      *
144d3335dfaSMatt Spinler      * Filled in by derived classes.
145d3335dfaSMatt Spinler      */
146d3335dfaSMatt Spinler     SectionHeader _header;
147d3335dfaSMatt Spinler 
148d3335dfaSMatt Spinler     /**
149d3335dfaSMatt Spinler      * @brief The section valid flag.
150d3335dfaSMatt Spinler      *
151d3335dfaSMatt Spinler      * This is determined by the derived class.
152d3335dfaSMatt Spinler      */
153d3335dfaSMatt Spinler     bool _valid = false;
15485f61a63SMatt Spinler 
15585f61a63SMatt Spinler     /**
15685f61a63SMatt Spinler      * @brief Messages that derived classes can add during construction
15785f61a63SMatt Spinler      *        of a PEL when something happens that would be useful to
15885f61a63SMatt Spinler      *        store in the PEL.  This may get added into a UserData section
15985f61a63SMatt Spinler      *        in the PEL.
16085f61a63SMatt Spinler      */
16185f61a63SMatt Spinler     std::vector<std::string> _debugData;
162d3335dfaSMatt Spinler };
163d3335dfaSMatt Spinler } // namespace pels
164d3335dfaSMatt Spinler } // namespace openpower
165