1*18aa044eSDeepak Kodihalli #include <phosphor-logging/elog-errors.hpp>
2*18aa044eSDeepak Kodihalli #include <phosphor-logging/log.hpp>
3*18aa044eSDeepak Kodihalli #include "xyz/openbmc_project/Common/error.hpp"
4*18aa044eSDeepak Kodihalli #include "settings.hpp"
5*18aa044eSDeepak Kodihalli 
6*18aa044eSDeepak Kodihalli namespace settings
7*18aa044eSDeepak Kodihalli {
8*18aa044eSDeepak Kodihalli 
9*18aa044eSDeepak Kodihalli using namespace phosphor::logging;
10*18aa044eSDeepak Kodihalli using namespace sdbusplus::xyz::openbmc_project::Common::Error;
11*18aa044eSDeepak Kodihalli 
12*18aa044eSDeepak Kodihalli constexpr auto mapperService = "xyz.openbmc_project.ObjectMapper";
13*18aa044eSDeepak Kodihalli constexpr auto mapperPath = "/xyz/openbmc_project/object_mapper";
14*18aa044eSDeepak Kodihalli constexpr auto mapperIntf = "xyz.openbmc_project.ObjectMapper";
15*18aa044eSDeepak Kodihalli 
16*18aa044eSDeepak Kodihalli Objects::Objects(sdbusplus::bus::bus& bus,
17*18aa044eSDeepak Kodihalli                  const std::vector<Interface>& filter):
18*18aa044eSDeepak Kodihalli     bus(bus)
19*18aa044eSDeepak Kodihalli {
20*18aa044eSDeepak Kodihalli     auto depth = 0;
21*18aa044eSDeepak Kodihalli 
22*18aa044eSDeepak Kodihalli     auto mapperCall = bus.new_method_call(mapperService,
23*18aa044eSDeepak Kodihalli                                           mapperPath,
24*18aa044eSDeepak Kodihalli                                           mapperIntf,
25*18aa044eSDeepak Kodihalli                                           "GetSubTree");
26*18aa044eSDeepak Kodihalli     mapperCall.append(root);
27*18aa044eSDeepak Kodihalli     mapperCall.append(depth);
28*18aa044eSDeepak Kodihalli     mapperCall.append(filter);
29*18aa044eSDeepak Kodihalli     auto response = bus.call(mapperCall);
30*18aa044eSDeepak Kodihalli     if (response.is_method_error())
31*18aa044eSDeepak Kodihalli     {
32*18aa044eSDeepak Kodihalli         log<level::ERR>("Error in mapper GetSubTree");
33*18aa044eSDeepak Kodihalli         elog<InternalFailure>();
34*18aa044eSDeepak Kodihalli     }
35*18aa044eSDeepak Kodihalli 
36*18aa044eSDeepak Kodihalli     using Interfaces = std::vector<Interface>;
37*18aa044eSDeepak Kodihalli     using MapperResponse = std::map<Path, std::map<Service, Interfaces>>;
38*18aa044eSDeepak Kodihalli     MapperResponse result;
39*18aa044eSDeepak Kodihalli     response.read(result);
40*18aa044eSDeepak Kodihalli     if (result.empty())
41*18aa044eSDeepak Kodihalli     {
42*18aa044eSDeepak Kodihalli         log<level::ERR>("Invalid response from mapper");
43*18aa044eSDeepak Kodihalli         elog<InternalFailure>();
44*18aa044eSDeepak Kodihalli     }
45*18aa044eSDeepak Kodihalli 
46*18aa044eSDeepak Kodihalli     for (auto& iter : result)
47*18aa044eSDeepak Kodihalli     {
48*18aa044eSDeepak Kodihalli         const auto& path = iter.first;
49*18aa044eSDeepak Kodihalli         auto& interface = iter.second.begin()->second[0];
50*18aa044eSDeepak Kodihalli         map.emplace(std::move(interface), path);
51*18aa044eSDeepak Kodihalli     }
52*18aa044eSDeepak Kodihalli }
53*18aa044eSDeepak Kodihalli 
54*18aa044eSDeepak Kodihalli Service Objects::service(const Path& path, const Interface& interface) const
55*18aa044eSDeepak Kodihalli {
56*18aa044eSDeepak Kodihalli     using Interfaces = std::vector<Interface>;
57*18aa044eSDeepak Kodihalli     auto mapperCall = bus.new_method_call(mapperService,
58*18aa044eSDeepak Kodihalli                                           mapperPath,
59*18aa044eSDeepak Kodihalli                                           mapperIntf,
60*18aa044eSDeepak Kodihalli                                           "GetObject");
61*18aa044eSDeepak Kodihalli     mapperCall.append(path);
62*18aa044eSDeepak Kodihalli     mapperCall.append(Interfaces({interface}));
63*18aa044eSDeepak Kodihalli 
64*18aa044eSDeepak Kodihalli     auto response = bus.call(mapperCall);
65*18aa044eSDeepak Kodihalli     if (response.is_method_error())
66*18aa044eSDeepak Kodihalli     {
67*18aa044eSDeepak Kodihalli         log<level::ERR>("Error in mapper GetObject");
68*18aa044eSDeepak Kodihalli         elog<InternalFailure>();
69*18aa044eSDeepak Kodihalli     }
70*18aa044eSDeepak Kodihalli 
71*18aa044eSDeepak Kodihalli     std::map<Service, Interfaces> result;
72*18aa044eSDeepak Kodihalli     response.read(result);
73*18aa044eSDeepak Kodihalli     if (result.empty())
74*18aa044eSDeepak Kodihalli     {
75*18aa044eSDeepak Kodihalli         log<level::ERR>("Invalid response from mapper");
76*18aa044eSDeepak Kodihalli         elog<InternalFailure>();
77*18aa044eSDeepak Kodihalli     }
78*18aa044eSDeepak Kodihalli 
79*18aa044eSDeepak Kodihalli     return result.begin()->first;
80*18aa044eSDeepak Kodihalli }
81*18aa044eSDeepak Kodihalli 
82*18aa044eSDeepak Kodihalli } // namespace settings
83