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