1 #pragma once 2 3 #include <filesystem> 4 #include <map> 5 #include <optional> 6 #include <set> 7 #include <string> 8 #include <tuple> 9 #include <vector> 10 11 namespace pldm 12 { 13 14 namespace responder 15 { 16 17 namespace dbus 18 { 19 20 using Service = std::string; 21 using RootPath = std::string; 22 using Interface = std::string; 23 using Interfaces = std::set<Interface>; 24 using Property = std::string; 25 using PropertyType = std::string; 26 using EntityType = uint16_t; 27 28 } // namespace dbus 29 30 namespace fru 31 { 32 33 using RecordType = uint8_t; 34 using EncodingType = uint8_t; 35 using FieldType = uint8_t; 36 37 } // namespace fru 38 39 namespace fru_parser 40 { 41 42 namespace fs = std::filesystem; 43 44 // DBusLookupInfo contains info to lookup in the D-Bus inventory, D-Bus 45 // inventory service bus name, root path of the inventory D-Bus objects and list 46 // of xyz.openbmc_project.Inventory.Item.* interface names. 47 using DBusLookupInfo = 48 std::tuple<pldm::responder::dbus::Service, pldm::responder::dbus::RootPath, 49 pldm::responder::dbus::Interfaces>; 50 using FieldInfo = std::tuple< 51 pldm::responder::dbus::Interface, pldm::responder::dbus::Property, 52 pldm::responder::dbus::PropertyType, pldm::responder::fru::FieldType>; 53 54 using FruRecordInfo = 55 std::tuple<pldm::responder::fru::RecordType, 56 pldm::responder::fru::EncodingType, std::vector<FieldInfo>>; 57 using FruRecordInfos = std::vector<FruRecordInfo>; 58 59 using ItemIntfName = std::string; 60 using FruRecordMap = std::map<ItemIntfName, FruRecordInfos>; 61 62 /** @class FruParser 63 * 64 * @brief Parses the PLDM FRU configuration files to populate the data 65 * structure, containing the information needed to map the D-Bus 66 * inventory information into PLDM FRU Record. 67 */ 68 class FruParser 69 { 70 71 public: 72 FruParser() = delete; 73 explicit FruParser(const std::string& dirPath, 74 const std::filesystem::path& fruMasterJsonPath); 75 virtual ~FruParser() = default; 76 FruParser(const FruParser&) = default; 77 FruParser& operator=(const FruParser&) = default; 78 FruParser(FruParser&&) = default; 79 FruParser& operator=(FruParser&&) = default; 80 81 /** @brief Provides the service, root D-Bus path and the interfaces that is 82 * needed to build FRU record data table 83 * 84 * @return service and inventory interfaces needed to build the FRU records 85 */ 86 const DBusLookupInfo& inventoryLookup() const 87 { 88 return lookupInfo.value(); 89 } 90 91 /** @brief Get the information need to create PLDM FRU records for a 92 * inventory item type. The parameter to this API is the inventory item 93 * type, for example xyz.openbmc_project.Inventory.Item.Cpu for CPU's 94 * 95 * @param[in] intf - name of the item interface 96 * 97 * @return return the info create the PLDM FRU records from inventory D-Bus 98 * objects 99 */ 100 const FruRecordInfos& 101 getRecordInfo(const pldm::responder::dbus::Interface& intf) const 102 { 103 return recordMap.at(intf); 104 } 105 106 pldm::responder::dbus::EntityType 107 getEntityType(const pldm::responder::dbus::Interface& intf) const 108 { 109 return intfToEntityType.at(intf); 110 } 111 112 private: 113 /** @brief Parse the FRU Configuration JSON file in the directory path 114 * except the FRU_Master.json and build the FRU record information 115 * 116 * @param[in] dirPath - directory path where all the FRU configuration JSON 117 * files exist 118 */ 119 void setupFruRecordMap(const std::string& dirPath); 120 121 /** @brief Set the default service root D-Bus path and the item interfaces. 122 * 123 * @param[in] fruMasterJsonPath - json file path that contains the FRU 124 * D-Bus lookup map 125 */ 126 void setupDefaultDBusLookup(const std::filesystem::path& fruMasterJsonPath); 127 128 /** @brief Build the default FRU record informations 129 */ 130 void setupDefaultFruRecordMap(); 131 132 std::optional<DBusLookupInfo> lookupInfo; 133 FruRecordMap recordMap; 134 std::map<pldm::responder::dbus::Interface, 135 pldm::responder::dbus::EntityType> 136 intfToEntityType; 137 }; 138 139 } // namespace fru_parser 140 141 } // namespace responder 142 143 } // namespace pldm 144