summaryrefslogtreecommitdiffstats
path: root/settings.cpp
diff options
context:
space:
mode:
authorDeepak Kodihalli <dkodihal@in.ibm.com>2017-07-21 07:07:09 -0500
committerDeepak Kodihalli <dkodihal@in.ibm.com>2017-07-31 22:48:26 -0500
commit18aa044eace292d2d58406e06e3ca4a98fbfaaea (patch)
treec0b58725a4ef134e2d99910955fa2e9090526867 /settings.cpp
parent6c8d51baee01211c671567881dec27c327ae2c86 (diff)
downloadphosphor-host-ipmid-18aa044eace292d2d58406e06e3ca4a98fbfaaea.tar.gz
phosphor-host-ipmid-18aa044eace292d2d58406e06e3ca4a98fbfaaea.zip
Add API to retrieve settings
Add API to retrieve and cache settings objects of interest. Change-Id: I8afd58b5b3e9a691e4d3fa6bfba2ba5c92cd2568 Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
Diffstat (limited to 'settings.cpp')
-rw-r--r--settings.cpp82
1 files changed, 82 insertions, 0 deletions
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 <phosphor-logging/elog-errors.hpp>
+#include <phosphor-logging/log.hpp>
+#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<Interface>& 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<level::ERR>("Error in mapper GetSubTree");
+ elog<InternalFailure>();
+ }
+
+ using Interfaces = std::vector<Interface>;
+ using MapperResponse = std::map<Path, std::map<Service, Interfaces>>;
+ MapperResponse result;
+ response.read(result);
+ if (result.empty())
+ {
+ log<level::ERR>("Invalid response from mapper");
+ elog<InternalFailure>();
+ }
+
+ 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<Interface>;
+ 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<level::ERR>("Error in mapper GetObject");
+ elog<InternalFailure>();
+ }
+
+ std::map<Service, Interfaces> result;
+ response.read(result);
+ if (result.empty())
+ {
+ log<level::ERR>("Invalid response from mapper");
+ elog<InternalFailure>();
+ }
+
+ return result.begin()->first;
+}
+
+} // namespace settings
OpenPOWER on IntegriCloud