Index: chromeos/dbus/dbus.h |
diff --git a/chromeos/dbus/dbus.h b/chromeos/dbus/dbus.h |
index 9ac1a1f5088f353259e4fa5e1c1a95521de6d91d..2bc44b9d0ce6a0bd3173954fa8f81188e433d56f 100644 |
--- a/chromeos/dbus/dbus.h |
+++ b/chromeos/dbus/dbus.h |
@@ -247,6 +247,32 @@ class MonitorConnection<void (A1, A2)> { |
}; |
+template <typename A1, typename A2, typename A3> |
+class MonitorConnection<void (A1, A2, A3)> { |
+ public: |
+ MonitorConnection(const Proxy& proxy, const char* name, |
+ void (*monitor)(void*, A1, A2, A3), void* object) |
+ : proxy_(proxy), name_(name), monitor_(monitor), object_(object) { |
+ } |
+ |
+ static void Run(::DBusGProxy*, A1 x, A2 y, A3 z, MonitorConnection* self) { |
+ self->monitor_(self->object_, x, y, z); |
+ } |
+ const Proxy& proxy() const { |
+ return proxy_; |
+ } |
+ const std::string& name() const { |
+ return name_; |
+ } |
+ |
+ private: |
+ Proxy proxy_; |
+ std::string name_; |
+ void (*monitor_)(void*, A1, A2, A3); |
+ void* object_; |
+ |
+}; |
+ |
template <typename A1> |
MonitorConnection<void (A1)>* Monitor(const Proxy& proxy, const char* name, |
void (*monitor)(void*, A1), |
@@ -281,6 +307,26 @@ MonitorConnection<void (A1, A2)>* Monitor(const Proxy& proxy, const char* name, |
return result; |
} |
+template <typename A1, typename A2, typename A3> |
+MonitorConnection<void (A1, A2, A3)>* Monitor(const Proxy& proxy, |
+ const char* name, |
+ void (*monitor)(void*, A1, A2, A3), |
+ void* object) { |
+ typedef MonitorConnection<void (A1, A2, A3)> ConnectionType; |
+ |
+ ConnectionType* result = new ConnectionType(proxy, name, monitor, object); |
+ |
+ ::dbus_g_proxy_add_signal(proxy.gproxy(), name, |
+ glib::type_to_gtypeid<A1>(), |
+ glib::type_to_gtypeid<A2>(), |
+ glib::type_to_gtypeid<A3>(), |
+ G_TYPE_INVALID); |
+ ::dbus_g_proxy_connect_signal(proxy.gproxy(), name, |
+ G_CALLBACK(&ConnectionType::Run), |
+ result, NULL); |
+ return result; |
+} |
+ |
template <typename F> |
void Disconnect(MonitorConnection<F>* connection) { |
typedef MonitorConnection<F> ConnectionType; |