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 public: 71 FruParser() = delete; 72 explicit FruParser(const std::string& dirPath, 73 const std::filesystem::path& fruMasterJsonPath); 74 virtual ~FruParser() = default; 75 FruParser(const FruParser&) = default; 76 FruParser& operator=(const FruParser&) = default; 77 FruParser(FruParser&&) = default; 78 FruParser& operator=(FruParser&&) = default; 79 80 /** @brief Provides the service, root D-Bus path and the interfaces that is 81 * needed to build FRU record data table 82 * 83 * @return service and inventory interfaces needed to build the FRU records 84 */ 85 const DBusLookupInfo& inventoryLookup() const 86 { 87 return lookupInfo.value(); 88 } 89 90 /** @brief Get the information need to create PLDM FRU records for a 91 * inventory item type. The parameter to this API is the inventory item 92 * type, for example xyz.openbmc_project.Inventory.Item.Cpu for CPU's 93 * 94 * @param[in] intf - name of the item interface 95 * 96 * @return return the info create the PLDM FRU records from inventory D-Bus 97 * objects 98 */ 99 const FruRecordInfos& 100 getRecordInfo(const pldm::responder::dbus::Interface& intf) const 101 { 102 return recordMap.at(intf); 103 } 104 105 pldm::responder::dbus::EntityType 106 getEntityType(const pldm::responder::dbus::Interface& intf) const 107 { 108 return intfToEntityType.at(intf); 109 } 110 111 private: 112 /** @brief Parse the FRU Configuration JSON file in the directory path 113 * except the FRU_Master.json and build the FRU record information 114 * 115 * @param[in] dirPath - directory path where all the FRU configuration JSON 116 * files exist 117 */ 118 void setupFruRecordMap(const std::string& dirPath); 119 120 /** @brief Set the default service root D-Bus path and the item interfaces. 121 * 122 * @param[in] fruMasterJsonPath - json file path that contains the FRU 123 * D-Bus lookup map 124 */ 125 void setupDefaultDBusLookup(const std::filesystem::path& fruMasterJsonPath); 126 127 /** @brief Build the default FRU record information 128 */ 129 void setupDefaultFruRecordMap(); 130 131 std::optional<DBusLookupInfo> lookupInfo; 132 FruRecordMap recordMap; 133 std::map<pldm::responder::dbus::Interface, 134 pldm::responder::dbus::EntityType> 135 intfToEntityType; 136 }; 137 138 } // namespace fru_parser 139 140 } // namespace responder 141 142 } // namespace pldm 143