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