#include "platform_config.hpp" namespace pldm { namespace responder { namespace platform_config { /** @brief callback function invoked when interfaces get added from * Entity manager * * @param[in] msg - Data associated with subscribed signal */ void Handler::systemCompatibleCallback(sdbusplus::message_t& msg) { sdbusplus::message::object_path path; pldm::utils::InterfaceMap interfaceMap; msg.read(path, interfaceMap); if (!interfaceMap.contains(compatibleInterface)) { return; } // Get the "Name" property value of the // "xyz.openbmc_project.Inventory.Decorator.Compatible" interface const auto& properties = interfaceMap.at(compatibleInterface); if (!properties.contains(namesProperty)) { return; } auto names = std::get(properties.at(namesProperty)); std::string systemType; if (!names.empty()) { // get only the first system type systemType = names.front(); } if (!systemType.empty()) { systemCompatibleMatchCallBack.reset(); } } /** @brief Method to get the system type information * * @return - the system type information */ std::optional Handler::getPlatformName() { if (!systemType.empty()) { return fs::path{systemType}; } namespace fs = std::filesystem; static constexpr auto orgFreeDesktopInterface = "org.freedesktop.DBus.Properties"; static constexpr auto getMethod = "Get"; static constexpr auto searchpath = "/xyz/openbmc_project/"; int depth = 0; std::vector systemCompatible = {compatibleInterface}; pldm::utils::GetSubTreeResponse response = pldm::utils::DBusHandler().getSubtree(searchpath, depth, systemCompatible); auto& bus = pldm::utils::DBusHandler::getBus(); std::variant> value; for (const auto& [objectPath, serviceMap] : response) { try { auto method = bus.new_method_call( serviceMap[0].first.c_str(), objectPath.c_str(), orgFreeDesktopInterface, getMethod); method.append(systemCompatible[0].c_str(), namesProperty); auto reply = bus.call(method); reply.read(value); auto systemList = std::get>(value); if (!systemList.empty()) { systemType = systemList.at(0); return fs::path{systemType}; } } catch (const std::exception& e) { error( "Error getting Names property at '{PATH}' on '{INTERFACE}': {ERROR}", "PATH", objectPath, "INTERFACE", systemCompatible[0], "ERROR", e); } } return std::nullopt; } } // namespace platform_config } // namespace responder } // namespace pldm