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