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