From 18aa044eace292d2d58406e06e3ca4a98fbfaaea Mon Sep 17 00:00:00 2001 From: Deepak Kodihalli Date: Fri, 21 Jul 2017 07:07:09 -0500 Subject: Add API to retrieve settings Add API to retrieve and cache settings objects of interest. Change-Id: I8afd58b5b3e9a691e4d3fa6bfba2ba5c92cd2568 Signed-off-by: Deepak Kodihalli --- settings.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 settings.cpp (limited to 'settings.cpp') diff --git a/settings.cpp b/settings.cpp new file mode 100644 index 0000000..cb86d99 --- /dev/null +++ b/settings.cpp @@ -0,0 +1,82 @@ +#include +#include +#include "xyz/openbmc_project/Common/error.hpp" +#include "settings.hpp" + +namespace settings +{ + +using namespace phosphor::logging; +using namespace sdbusplus::xyz::openbmc_project::Common::Error; + +constexpr auto mapperService = "xyz.openbmc_project.ObjectMapper"; +constexpr auto mapperPath = "/xyz/openbmc_project/object_mapper"; +constexpr auto mapperIntf = "xyz.openbmc_project.ObjectMapper"; + +Objects::Objects(sdbusplus::bus::bus& bus, + const std::vector& filter): + bus(bus) +{ + auto depth = 0; + + auto mapperCall = bus.new_method_call(mapperService, + mapperPath, + mapperIntf, + "GetSubTree"); + mapperCall.append(root); + mapperCall.append(depth); + mapperCall.append(filter); + auto response = bus.call(mapperCall); + if (response.is_method_error()) + { + log("Error in mapper GetSubTree"); + elog(); + } + + using Interfaces = std::vector; + using MapperResponse = std::map>; + MapperResponse result; + response.read(result); + if (result.empty()) + { + log("Invalid response from mapper"); + elog(); + } + + for (auto& iter : result) + { + const auto& path = iter.first; + auto& interface = iter.second.begin()->second[0]; + map.emplace(std::move(interface), path); + } +} + +Service Objects::service(const Path& path, const Interface& interface) const +{ + using Interfaces = std::vector; + auto mapperCall = bus.new_method_call(mapperService, + mapperPath, + mapperIntf, + "GetObject"); + mapperCall.append(path); + mapperCall.append(Interfaces({interface})); + + auto response = bus.call(mapperCall); + if (response.is_method_error()) + { + log("Error in mapper GetObject"); + elog(); + } + + std::map result; + response.read(result); + if (result.empty()) + { + log("Invalid response from mapper"); + elog(); + } + + return result.begin()->first; +} + +} // namespace settings -- cgit v1.2.1