1 #pragma once
2 #include "common/utils.hpp"
3 #include "pldmd/handler.hpp"
4 
5 namespace pldm
6 {
7 namespace responder
8 {
9 
10 namespace platform_config
11 {
12 using namespace pldm::utils;
13 
14 static constexpr auto compatibleInterface =
15     "xyz.openbmc_project.Inventory.Decorator.Compatible";
16 static constexpr auto namesProperty = "Names";
17 
18 using SystemTypeCallback = std::function<void(const std::string&, bool)>;
19 
20 class Handler : public CmdHandler
21 {
22   public:
Handler(const fs::path sysDirPath={})23     Handler(const fs::path sysDirPath = {}) : sysDirPath(sysDirPath)
24     {
25         systemCompatibleMatchCallBack =
26             std::make_unique<sdbusplus::bus::match_t>(
27                 pldm::utils::DBusHandler::getBus(),
28                 sdbusplus::bus::match::rules::interfacesAdded() +
29                     sdbusplus::bus::match::rules::sender(
30                         "xyz.openbmc_project.EntityManager"),
31                 std::bind(&Handler::systemCompatibleCallback, this,
32                           std::placeholders::_1));
33         sysTypeCallback = nullptr;
34     }
35 
36     /** @brief Interface to get the system type information using Dbus query
37      *
38      *  @return - the system type information
39      */
40     virtual std::optional<std::filesystem::path> getPlatformName();
41 
42     /** @brief D-Bus Interface added signal match for Entity Manager */
43     void systemCompatibleCallback(sdbusplus::message_t& msg);
44 
45     /** @brief Registers the callback from other objects */
46     void registerSystemTypeCallback(SystemTypeCallback callback);
47 
48   private:
49     /** @brief Interface to get the first available directory
50      *         from the received list
51      *
52      *  @param[in] dirPath  - Directory path to search system specific directory
53      *  @param[in] dirNames - System names retrieved from remote application
54      *  @return - The system type information
55      */
56     std::optional<std::string>
57         getSysSpecificJsonDir(const fs::path& dirPath,
58                               const std::vector<std::string>& dirNames);
59 
60     /** @brief system type/model */
61     std::string systemType;
62 
63     /** @brief D-Bus Interface added signal match for Entity Manager */
64     std::unique_ptr<sdbusplus::bus::match_t> systemCompatibleMatchCallBack;
65 
66     /** @brief Registered Callback */
67     SystemTypeCallback sysTypeCallback;
68 
69     /** @brief system specific json file directory path */
70     fs::path sysDirPath;
71 };
72 
73 } // namespace platform_config
74 
75 } // namespace responder
76 
77 } // namespace pldm
78