1*7452a867SVijay Khemka #include <phosphor-logging/elog-errors.hpp> 2*7452a867SVijay Khemka #include <phosphor-logging/log.hpp> 3*7452a867SVijay Khemka #include <xyz/openbmc_project/Common/error.hpp> 4*7452a867SVijay Khemka 5*7452a867SVijay Khemka const char* propIntf = "org.freedesktop.DBus.Properties"; 6*7452a867SVijay Khemka const char* mapperBusName = "xyz.openbmc_project.ObjectMapper"; 7*7452a867SVijay Khemka const char* mapperPath = "/xyz/openbmc_project/object_mapper"; 8*7452a867SVijay Khemka const char* mapperIntf = "xyz.openbmc_project.ObjectMapper"; 9*7452a867SVijay Khemka 10*7452a867SVijay Khemka const char* methodGetObject = "GetObject"; 11*7452a867SVijay Khemka const char* methodGet = "Get"; 12*7452a867SVijay Khemka 13*7452a867SVijay Khemka using namespace phosphor::logging; 14*7452a867SVijay Khemka using namespace sdbusplus::xyz::openbmc_project::Common::Error; 15*7452a867SVijay Khemka 16*7452a867SVijay Khemka using Value = std::variant<int64_t, double, std::string, bool>; 17*7452a867SVijay Khemka 18*7452a867SVijay Khemka std::string getService(sdbusplus::bus::bus& bus, const std::string& path, 19*7452a867SVijay Khemka const char* intf) 20*7452a867SVijay Khemka { 21*7452a867SVijay Khemka /* Get mapper object for sensor path */ 22*7452a867SVijay Khemka auto mapper = bus.new_method_call(mapperBusName, mapperPath, mapperIntf, 23*7452a867SVijay Khemka methodGetObject); 24*7452a867SVijay Khemka 25*7452a867SVijay Khemka mapper.append(path.c_str()); 26*7452a867SVijay Khemka mapper.append(std::vector<std::string>({intf})); 27*7452a867SVijay Khemka 28*7452a867SVijay Khemka std::unordered_map<std::string, std::vector<std::string>> resp; 29*7452a867SVijay Khemka 30*7452a867SVijay Khemka try 31*7452a867SVijay Khemka { 32*7452a867SVijay Khemka auto msg = bus.call(mapper); 33*7452a867SVijay Khemka 34*7452a867SVijay Khemka msg.read(resp); 35*7452a867SVijay Khemka if (msg.is_method_error()) 36*7452a867SVijay Khemka { 37*7452a867SVijay Khemka log<level::ERR>("Error in mapper call"); 38*7452a867SVijay Khemka elog<InternalFailure>(); 39*7452a867SVijay Khemka } 40*7452a867SVijay Khemka } 41*7452a867SVijay Khemka catch (const sdbusplus::exception::SdBusError& ex) 42*7452a867SVijay Khemka { 43*7452a867SVijay Khemka log<level::ERR>("ObjectMapper call failure", 44*7452a867SVijay Khemka entry("WHAT=%s", ex.what())); 45*7452a867SVijay Khemka throw; 46*7452a867SVijay Khemka } 47*7452a867SVijay Khemka 48*7452a867SVijay Khemka if (resp.begin() == resp.end()) 49*7452a867SVijay Khemka { 50*7452a867SVijay Khemka throw std::runtime_error("Unable to find Object: " + path); 51*7452a867SVijay Khemka } 52*7452a867SVijay Khemka 53*7452a867SVijay Khemka return resp.begin()->first; 54*7452a867SVijay Khemka } 55*7452a867SVijay Khemka 56*7452a867SVijay Khemka template <typename T> 57*7452a867SVijay Khemka 58*7452a867SVijay Khemka T getDbusProperty(sdbusplus::bus::bus& bus, const std::string& service, 59*7452a867SVijay Khemka const std::string& path, const std::string& intf, 60*7452a867SVijay Khemka const std::string& property) 61*7452a867SVijay Khemka { 62*7452a867SVijay Khemka 63*7452a867SVijay Khemka Value value; 64*7452a867SVijay Khemka 65*7452a867SVijay Khemka auto method = 66*7452a867SVijay Khemka bus.new_method_call(service.c_str(), path.c_str(), propIntf, methodGet); 67*7452a867SVijay Khemka 68*7452a867SVijay Khemka method.append(intf, property); 69*7452a867SVijay Khemka 70*7452a867SVijay Khemka auto msg = bus.call(method); 71*7452a867SVijay Khemka 72*7452a867SVijay Khemka if (msg.is_method_error()) 73*7452a867SVijay Khemka { 74*7452a867SVijay Khemka log<level::ERR>("Failed to get property", 75*7452a867SVijay Khemka entry("PROPERTY=%s", property.c_str()), 76*7452a867SVijay Khemka entry("PATH=%s", path.c_str()), 77*7452a867SVijay Khemka entry("INTERFACE=%s", intf.c_str())); 78*7452a867SVijay Khemka elog<InternalFailure>(); 79*7452a867SVijay Khemka } 80*7452a867SVijay Khemka 81*7452a867SVijay Khemka msg.read(value); 82*7452a867SVijay Khemka 83*7452a867SVijay Khemka return std::get<T>(value); 84*7452a867SVijay Khemka } 85