| #pragma once | 
 |  | 
 | #include "fru_identity.hpp" | 
 | #include "mru.hpp" | 
 | #include "pce_identity.hpp" | 
 | #include "pel_types.hpp" | 
 | #include "stream.hpp" | 
 |  | 
 | namespace openpower | 
 | { | 
 | namespace pels | 
 | { | 
 | namespace src | 
 | { | 
 |  | 
 | /** | 
 |  * @class Callout | 
 |  * | 
 |  * Represents a single FRU callout in the SRC's FRU callout | 
 |  * subsection. | 
 |  * | 
 |  * The 'Callouts' class holds a list of these objects. | 
 |  * | 
 |  * The callout priority and location code are in this structure. | 
 |  * | 
 |  * There can also be up to one each of three types of substructures | 
 |  * in a single callout: | 
 |  *  * FRU Identity  (must be first if present) | 
 |  *  * Power Controlling Enclosure (PCE) | 
 |  *  * Manufacturing Replaceable Unit (MRU) | 
 |  * | 
 |  * These substructures have their own objects managed by unique_ptrs | 
 |  * which will only be allocated if those substructures exist. | 
 |  */ | 
 | class Callout | 
 | { | 
 |   public: | 
 |     /** | 
 |      * @brief Which callout substructures are included. | 
 |      */ | 
 |     enum calloutFlags | 
 |     { | 
 |         calloutType = 0b0010'0000, | 
 |         fruIdentIncluded = 0b0000'1000, | 
 |         mruIncluded = 0b0000'0100 | 
 |  | 
 |         // Leaving out the various PCE identity ones since | 
 |         // we don't use them. | 
 |     }; | 
 |  | 
 |     Callout() = delete; | 
 |     ~Callout() = default; | 
 |     Callout(const Callout&) = delete; | 
 |     Callout& operator=(const Callout&) = delete; | 
 |     Callout(Callout&&) = delete; | 
 |     Callout& operator=(Callout&&) = delete; | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * Fills in this class's data fields from the stream. | 
 |      * | 
 |      * @param[in] pel - the PEL data stream | 
 |      */ | 
 |     explicit Callout(Stream& pel); | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * Creates the objects with a FRUIdentity substructure that calls | 
 |      * out a normal hardware FRU. | 
 |      * | 
 |      * @param[in] priority - The priority of the callout | 
 |      * @param[in] locationCode - The location code of the callout | 
 |      * @param[in] partNumber - The part number of the callout | 
 |      * @param[in] ccin - The CCIN of the callout | 
 |      * @param[in] serialNumber - The serial number of the callout | 
 |      */ | 
 |     Callout(CalloutPriority priority, const std::string& locationCode, | 
 |             const std::string& partNumber, const std::string& ccin, | 
 |             const std::string& serialNumber); | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * Creates the objects with a FRUIdentity substructure that calls | 
 |      * out a normal hardware FRU, and takes a list of MRUs that will | 
 |      * be added to the callout. | 
 |      * | 
 |      * @param[in] priority - The priority of the callout | 
 |      * @param[in] locationCode - The location code of the callout | 
 |      * @param[in] partNumber - The part number of the callout | 
 |      * @param[in] ccin - The CCIN of the callout | 
 |      * @param[in] serialNumber - The serial number of the callout | 
 |      * @param[in] mrus - The MRUs, if any, to add to the callout | 
 |      */ | 
 |     Callout(CalloutPriority priority, const std::string& locationCode, | 
 |             const std::string& partNumber, const std::string& ccin, | 
 |             const std::string& serialNumber, | 
 |             const std::vector<MRU::MRUCallout>& mrus); | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * Creates the objects with a FRUIdentity substructure that calls | 
 |      * out a maintenance procedure. | 
 |      * | 
 |      * @param[in] priority - The priority of the callout | 
 |      * @param[in] procedure - The maintenance procedure name | 
 |      * @param[in] type - If the procedure is the raw name or the registry name | 
 |      */ | 
 |     Callout(CalloutPriority priority, const std::string& procedure, | 
 |             CalloutValueType type); | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * Creates the objects with a FRUIdentity substructure that calls | 
 |      * out a maintenance procedure. | 
 |      * | 
 |      * @param[in] priority - The priority of the callout | 
 |      * @param[in] procedureFromRegistry - The maintenance procedure name | 
 |      *                                    as defined in the message registry. | 
 |      */ | 
 |     Callout(CalloutPriority priority, | 
 |             const std::string& procedureFromRegistry) : | 
 |         Callout(priority, procedureFromRegistry, CalloutValueType::registryName) | 
 |     {} | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * Creates the objects with a FRUIdentity substructure that calls | 
 |      * out a symbolic FRU. | 
 |      * | 
 |      * @param[in] priority - The priority of the callout | 
 |      * @param[in] symbolicFRU - The symbolic FRU name | 
 |      * @param[in] type - If the FRU is the raw name or the registry name | 
 |      * @param[in] locationCode - The location code of the callout | 
 |      * @param[in] trustedLocationCode - If the location is trusted | 
 |      */ | 
 |     Callout(CalloutPriority priority, const std::string& symbolicFRU, | 
 |             CalloutValueType type, const std::string& locationCode, | 
 |             bool trustedLocationCode); | 
 |  | 
 |     /** | 
 |      * @brief Constructor | 
 |      * | 
 |      * Creates the objects with a FRUIdentity substructure that calls | 
 |      * out a symbolic FRU. | 
 |      * | 
 |      * @param[in] priority - The priority of the callout | 
 |      * @param[in] symbolicFRUFromRegistry - The symbolic FRU name as | 
 |      *                                      defined in the message registry. | 
 |      * @param[in] locationCode - The location code of the callout | 
 |      * @param[in] trustedLocationCode - If the location is trusted | 
 |      */ | 
 |     Callout(CalloutPriority priority, | 
 |             const std::string& symbolicFRUFromRegistry, | 
 |             const std::string& locationCode, bool trustedLocationCode) : | 
 |         Callout(priority, symbolicFRUFromRegistry, | 
 |                 CalloutValueType::registryName, locationCode, | 
 |                 trustedLocationCode) | 
 |     {} | 
 |  | 
 |     /** | 
 |      * @brief Returns the size of this object when flattened into a PEL | 
 |      * | 
 |      * @return size_t - The size of the section | 
 |      */ | 
 |     size_t flattenedSize() const; | 
 |  | 
 |     /** | 
 |      * @brief Flatten the object into the stream | 
 |      * | 
 |      * @param[in] stream - The stream to write to | 
 |      */ | 
 |     void flatten(Stream& pel) const; | 
 |  | 
 |     /** | 
 |      * @brief Returns the flags field of a callout | 
 |      * | 
 |      * @return uint8_t - The flags | 
 |      */ | 
 |     uint8_t flags() const | 
 |     { | 
 |         return _flags; | 
 |     } | 
 |  | 
 |     /** | 
 |      * @brief Returns the priority field of a callout | 
 |      * | 
 |      * @return uint8_t - The priority | 
 |      */ | 
 |     uint8_t priority() const | 
 |     { | 
 |         return _priority; | 
 |     } | 
 |  | 
 |     /** | 
 |      * @brief Returns the location code of the callout | 
 |      * | 
 |      * @return std::string - The location code | 
 |      */ | 
 |     std::string locationCode() const | 
 |     { | 
 |         std::string lc; | 
 |         if (!_locationCode.empty()) | 
 |         { | 
 |             // NULL terminated | 
 |             lc = static_cast<const char*>(_locationCode.data()); | 
 |         } | 
 |         return lc; | 
 |     } | 
 |  | 
 |     /** | 
 |      * @brief Returns the location code size | 
 |      * | 
 |      * @return size_t - The size, including the terminating null. | 
 |      */ | 
 |     size_t locationCodeSize() const | 
 |     { | 
 |         return _locationCodeSize; | 
 |     } | 
 |  | 
 |     /** | 
 |      * @brief Returns the FRU identity substructure | 
 |      * | 
 |      * @return const std::unique_ptr<FRUIdentity>& | 
 |      */ | 
 |     const std::unique_ptr<FRUIdentity>& fruIdentity() const | 
 |     { | 
 |         return _fruIdentity; | 
 |     } | 
 |  | 
 |     /** | 
 |      * @brief Returns the PCE identity substructure | 
 |      * | 
 |      * @return const std::unique_ptr<PCEIdentity>& | 
 |      */ | 
 |     const std::unique_ptr<PCEIdentity>& pceIdentity() const | 
 |     { | 
 |         return _pceIdentity; | 
 |     } | 
 |  | 
 |     /** | 
 |      * @brief Returns the MRU identity substructure | 
 |      * | 
 |      * @return const std::unique_ptr<MRU>& | 
 |      */ | 
 |     const std::unique_ptr<MRU>& mru() const | 
 |     { | 
 |         return _mru; | 
 |     } | 
 |  | 
 |   private: | 
 |     /** | 
 |      * @brief Sets the location code field | 
 |      * | 
 |      * @param[in] locationCode - The location code string | 
 |      */ | 
 |     void setLocationCode(const std::string& locationCode); | 
 |  | 
 |     /** | 
 |      * @brief The size of this structure in the PEL | 
 |      */ | 
 |     uint8_t _size; | 
 |  | 
 |     /** | 
 |      * @brief The flags byte of this structure | 
 |      */ | 
 |     uint8_t _flags; | 
 |  | 
 |     /** | 
 |      * @brief The replacement priority | 
 |      */ | 
 |     uint8_t _priority; | 
 |  | 
 |     /** | 
 |      * @brief The length of the location code field. | 
 |      * | 
 |      * Includes the NULL termination, and must be a | 
 |      * multiple of 4 (padded with zeros) | 
 |      */ | 
 |     uint8_t _locationCodeSize = 0; | 
 |  | 
 |     /** | 
 |      * @brief NULL terminated location code | 
 |      * | 
 |      * Includes the NULL termination, and must be a | 
 |      * multiple of 4 (padded with zeros) | 
 |      */ | 
 |     std::vector<char> _locationCode; | 
 |  | 
 |     /** | 
 |      * @brief FRU (Field Replaceable Unit) Identity substructure | 
 |      */ | 
 |     std::unique_ptr<FRUIdentity> _fruIdentity; | 
 |  | 
 |     /** | 
 |      * @brief PCE (Power Controlling Enclosure) Identity substructure | 
 |      */ | 
 |     std::unique_ptr<PCEIdentity> _pceIdentity; | 
 |  | 
 |     /** | 
 |      * @brief MRU (Manufacturing Replaceable Unit) substructure | 
 |      */ | 
 |     std::unique_ptr<MRU> _mru; | 
 | }; | 
 |  | 
 | } // namespace src | 
 | } // namespace pels | 
 | } // namespace openpower |