10b02be92SPatrick Venture #include "settings.hpp"
20b02be92SPatrick Venture
36a98fe7fSVernon Mauery #include <ipmid/utils.hpp>
418aa044eSDeepak Kodihalli #include <phosphor-logging/elog-errors.hpp>
518aa044eSDeepak Kodihalli #include <phosphor-logging/log.hpp>
64c008028SWilliam A. Kennington III #include <sdbusplus/message/types.hpp>
70b02be92SPatrick Venture #include <xyz/openbmc_project/Common/error.hpp>
818aa044eSDeepak Kodihalli
918aa044eSDeepak Kodihalli namespace settings
1018aa044eSDeepak Kodihalli {
1118aa044eSDeepak Kodihalli
1218aa044eSDeepak Kodihalli using namespace phosphor::logging;
13523e2d1bSWilly Tu using namespace sdbusplus::error::xyz::openbmc_project::common;
1418aa044eSDeepak Kodihalli
1518aa044eSDeepak Kodihalli constexpr auto mapperService = "xyz.openbmc_project.ObjectMapper";
1618aa044eSDeepak Kodihalli constexpr auto mapperPath = "/xyz/openbmc_project/object_mapper";
1718aa044eSDeepak Kodihalli constexpr auto mapperIntf = "xyz.openbmc_project.ObjectMapper";
1818aa044eSDeepak Kodihalli
Objects(sdbusplus::bus_t & bus,const std::vector<Interface> & filter)195d82f474SPatrick Williams Objects::Objects(sdbusplus::bus_t& bus, const std::vector<Interface>& filter) :
2018aa044eSDeepak Kodihalli bus(bus)
2118aa044eSDeepak Kodihalli {
22*c1c7eac4SGeorge Liu ipmi::ObjectTree objectTree;
233e3cc35bSGeorge Liu try
2418aa044eSDeepak Kodihalli {
25*c1c7eac4SGeorge Liu objectTree = ipmi::getSubTree(bus, filter);
263e3cc35bSGeorge Liu }
273e3cc35bSGeorge Liu catch (const std::exception& e)
283e3cc35bSGeorge Liu {
29*c1c7eac4SGeorge Liu log<level::ERR>("Failed to call the getSubTree method.",
303e3cc35bSGeorge Liu entry("ERROR=%s", e.what()));
3118aa044eSDeepak Kodihalli elog<InternalFailure>();
3218aa044eSDeepak Kodihalli }
3318aa044eSDeepak Kodihalli
34*c1c7eac4SGeorge Liu for (auto& iter : objectTree)
3518aa044eSDeepak Kodihalli {
3618aa044eSDeepak Kodihalli const auto& path = iter.first;
37e602709dSDeepak Kodihalli for (auto& interface : iter.second.begin()->second)
38e602709dSDeepak Kodihalli {
39e602709dSDeepak Kodihalli auto found = map.find(interface);
40e602709dSDeepak Kodihalli if (map.end() != found)
41e602709dSDeepak Kodihalli {
42e602709dSDeepak Kodihalli auto& paths = found->second;
43e602709dSDeepak Kodihalli paths.push_back(path);
44e602709dSDeepak Kodihalli }
45e602709dSDeepak Kodihalli else
46e602709dSDeepak Kodihalli {
47e602709dSDeepak Kodihalli map.emplace(std::move(interface), std::vector<Path>({path}));
48e602709dSDeepak Kodihalli }
49e602709dSDeepak Kodihalli }
5018aa044eSDeepak Kodihalli }
5118aa044eSDeepak Kodihalli }
5218aa044eSDeepak Kodihalli
service(const Path & path,const Interface & interface) const5318aa044eSDeepak Kodihalli Service Objects::service(const Path& path, const Interface& interface) const
5418aa044eSDeepak Kodihalli {
5518aa044eSDeepak Kodihalli using Interfaces = std::vector<Interface>;
56fbc6c9d7SPatrick Williams auto mapperCall = bus.new_method_call(mapperService, mapperPath, mapperIntf,
57fbc6c9d7SPatrick Williams "GetObject");
5818aa044eSDeepak Kodihalli mapperCall.append(path);
5918aa044eSDeepak Kodihalli mapperCall.append(Interfaces({interface}));
6018aa044eSDeepak Kodihalli
6118aa044eSDeepak Kodihalli std::map<Service, Interfaces> result;
623e3cc35bSGeorge Liu try
6318aa044eSDeepak Kodihalli {
643e3cc35bSGeorge Liu auto response = bus.call(mapperCall);
653e3cc35bSGeorge Liu response.read(result);
663e3cc35bSGeorge Liu return result.begin()->first;
673e3cc35bSGeorge Liu }
683e3cc35bSGeorge Liu catch (const std::exception& e)
693e3cc35bSGeorge Liu {
703e3cc35bSGeorge Liu log<level::ERR>("Invalid response from mapper",
713e3cc35bSGeorge Liu entry("ERROR=%s", e.what()));
7218aa044eSDeepak Kodihalli elog<InternalFailure>();
7318aa044eSDeepak Kodihalli }
7418aa044eSDeepak Kodihalli }
7518aa044eSDeepak Kodihalli
7618aa044eSDeepak Kodihalli } // namespace settings
77