Add support for dbus parameter

Added support for parameter type dbus sensor and utility functions
to read dbus sensor value.

Signed-off-by: Vijay Khemka <vijaykhemka@fb.com>
Change-Id: I04db0016f312edea095442a693500c3b4e571d6c
diff --git a/dbusUtils.hpp b/dbusUtils.hpp
new file mode 100644
index 0000000..a12a21d
--- /dev/null
+++ b/dbusUtils.hpp
@@ -0,0 +1,84 @@
+#include <phosphor-logging/elog-errors.hpp>
+#include <phosphor-logging/log.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+const char* propIntf = "org.freedesktop.DBus.Properties";
+const char* mapperBusName = "xyz.openbmc_project.ObjectMapper";
+const char* mapperPath = "/xyz/openbmc_project/object_mapper";
+const char* mapperIntf = "xyz.openbmc_project.ObjectMapper";
+
+const char* methodGetObject = "GetObject";
+const char* methodGet = "Get";
+
+using namespace phosphor::logging;
+using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+
+using Value = std::variant<int64_t, double, std::string, bool>;
+
+std::string getService(sdbusplus::bus::bus& bus, const std::string& path,
+                       const char* intf)
+{
+    /* Get mapper object for sensor path */
+    auto mapper = bus.new_method_call(mapperBusName, mapperPath, mapperIntf,
+                                      methodGetObject);
+
+    mapper.append(path.c_str());
+    mapper.append(std::vector<std::string>({intf}));
+
+    std::unordered_map<std::string, std::vector<std::string>> resp;
+
+    try
+    {
+        auto msg = bus.call(mapper);
+
+        msg.read(resp);
+        if (msg.is_method_error())
+        {
+            log<level::ERR>("Error in mapper call");
+            elog<InternalFailure>();
+        }
+    }
+    catch (const sdbusplus::exception::SdBusError& ex)
+    {
+        log<level::ERR>("ObjectMapper call failure",
+                        entry("WHAT=%s", ex.what()));
+        throw;
+    }
+
+    if (resp.begin() == resp.end())
+    {
+        throw std::runtime_error("Unable to find Object: " + path);
+    }
+
+    return resp.begin()->first;
+}
+
+template <typename T>
+
+T getDbusProperty(sdbusplus::bus::bus& bus, const std::string& service,
+                  const std::string& path, const std::string& intf,
+                  const std::string& property)
+{
+
+    Value value;
+
+    auto method =
+        bus.new_method_call(service.c_str(), path.c_str(), propIntf, methodGet);
+
+    method.append(intf, property);
+
+    auto msg = bus.call(method);
+
+    if (msg.is_method_error())
+    {
+        log<level::ERR>("Failed to get property",
+                        entry("PROPERTY=%s", property.c_str()),
+                        entry("PATH=%s", path.c_str()),
+                        entry("INTERFACE=%s", intf.c_str()));
+        elog<InternalFailure>();
+    }
+
+    msg.read(value);
+
+    return std::get<T>(value);
+}