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