blob: 3acb888df66e60529e46718f79b02ff1acc24eec [file] [log] [blame]
Patrick Venture0b02be92018-08-31 11:55:55 -07001#include "settings.hpp"
2
Vernon Mauery6a98fe72019-03-11 15:57:48 -07003#include <ipmid/utils.hpp>
Deepak Kodihalli18aa0442017-07-21 07:07:09 -05004#include <phosphor-logging/elog-errors.hpp>
George Liu81eb6b32024-07-19 09:11:42 +08005#include <phosphor-logging/lg2.hpp>
William A. Kennington III4c008022018-10-12 17:18:14 -07006#include <sdbusplus/message/types.hpp>
Patrick Venture0b02be92018-08-31 11:55:55 -07007#include <xyz/openbmc_project/Common/error.hpp>
Deepak Kodihalli18aa0442017-07-21 07:07:09 -05008
9namespace settings
10{
11
12using namespace phosphor::logging;
Willy Tu523e2d12023-09-05 11:36:48 -070013using namespace sdbusplus::error::xyz::openbmc_project::common;
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050014
15constexpr auto mapperService = "xyz.openbmc_project.ObjectMapper";
16constexpr auto mapperPath = "/xyz/openbmc_project/object_mapper";
17constexpr auto mapperIntf = "xyz.openbmc_project.ObjectMapper";
18
Patrick Williams5d82f472022-07-22 19:26:53 -050019Objects::Objects(sdbusplus::bus_t& bus, const std::vector<Interface>& filter) :
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050020 bus(bus)
21{
George Liuc1c7eac2024-02-04 17:24:19 +080022 ipmi::ObjectTree objectTree;
George Liu3e3cc352023-07-26 15:59:31 +080023 try
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050024 {
George Liuc1c7eac2024-02-04 17:24:19 +080025 objectTree = ipmi::getSubTree(bus, filter);
George Liu3e3cc352023-07-26 15:59:31 +080026 }
27 catch (const std::exception& e)
28 {
George Liu81eb6b32024-07-19 09:11:42 +080029 lg2::error("Failed to call the getSubTree method: {ERROR}", "ERROR", e);
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050030 elog<InternalFailure>();
31 }
32
George Liuc1c7eac2024-02-04 17:24:19 +080033 for (auto& iter : objectTree)
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050034 {
35 const auto& path = iter.first;
Deepak Kodihallie6027092017-08-27 08:13:37 -050036 for (auto& interface : iter.second.begin()->second)
37 {
38 auto found = map.find(interface);
39 if (map.end() != found)
40 {
41 auto& paths = found->second;
42 paths.push_back(path);
43 }
44 else
45 {
46 map.emplace(std::move(interface), std::vector<Path>({path}));
47 }
48 }
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050049 }
50}
51
52Service Objects::service(const Path& path, const Interface& interface) const
53{
54 using Interfaces = std::vector<Interface>;
Patrick Williamsfbc6c9d2023-05-10 07:50:16 -050055 auto mapperCall = bus.new_method_call(mapperService, mapperPath, mapperIntf,
56 "GetObject");
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050057 mapperCall.append(path);
58 mapperCall.append(Interfaces({interface}));
59
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050060 std::map<Service, Interfaces> result;
George Liu3e3cc352023-07-26 15:59:31 +080061 try
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050062 {
George Liu3e3cc352023-07-26 15:59:31 +080063 auto response = bus.call(mapperCall);
64 response.read(result);
65 return result.begin()->first;
66 }
67 catch (const std::exception& e)
68 {
George Liu81eb6b32024-07-19 09:11:42 +080069 lg2::error("Invalid response from mapper: {ERROR}", "ERROR", e);
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050070 elog<InternalFailure>();
71 }
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050072}
73
Deepak Kodihalli18aa0442017-07-21 07:07:09 -050074} // namespace settings