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