blob: 7dbf44d7ef7d4a7f8022372aada2a8c472669e83 [file] [log] [blame]
Brad Bishopfac1b102017-05-15 22:29:20 -04001#pragma once
2
3#include <sdbusplus/bus.hpp>
4#include <sdbusplus/message.hpp>
5#include <sdbusplus/bus/match.hpp>
6
7namespace phosphor
8{
9namespace dbus
10{
11namespace monitoring
12{
13
14/** @class SDBusPlus
15 * @brief DBus access delegate implementation for sdbusplus.
16 */
17class SDBusPlus
18{
19 private:
20 static auto& getBus()
21 {
22 static auto bus = sdbusplus::bus::new_default();
23 return bus;
24 }
25
26 static auto& getWatches()
27 {
28 static std::vector<sdbusplus::bus::match::match> watches;
29 return watches;
30 }
31
32 public:
33 /** @brief Invoke a method. */
34 template <typename ...Args>
35 static auto callMethod(
36 const std::string& busName,
37 const std::string& path,
38 const std::string& interface,
39 const std::string& method,
40 Args&& ... args)
41 {
42 auto reqMsg = getBus().new_method_call(
43 busName.c_str(),
44 path.c_str(),
45 interface.c_str(),
46 method.c_str());
47 reqMsg.append(std::forward<Args>(args)...);
48 return getBus().call(reqMsg);
49 }
50
51 /** @brief Invoke a method and read the response. */
52 template <typename Ret, typename ...Args>
53 static auto callMethodAndRead(
54 const std::string& busName,
55 const std::string& path,
56 const std::string& interface,
57 const std::string& method,
58 Args&& ... args)
59 {
60 Ret resp;
61 sdbusplus::message::message respMsg =
62 callMethod<Args...>(
63 busName,
64 path,
65 interface,
66 method,
67 std::forward<Args>(args)...);
68 respMsg.read(resp);
69 return resp;
70 }
71
72 /** @brief Register a DBus signal callback. */
73 static auto addMatch(
74 const std::string& match,
75 const sdbusplus::bus::match::match::callback_t& callback)
76 {
77 getWatches().emplace_back(
78 getBus(),
79 match,
80 callback);
81 }
82};
83
84} // namespace monitoring
85} // namespace dbus
86} // namespace phosphor