Subscribe to dbus signals from systemd 22/30722/2
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Mon, 24 Nov 2014 03:08:32 +0000 (04:08 +0100)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Mon, 24 Nov 2014 17:10:52 +0000 (18:10 +0100)
Set bus matching filters for JobNew and JobRemove signals from systemd.
Subscribe to signals from systemd over dbus
Add dbus filter for all incoming messages (stub - empty body).

Change-Id: I516bf562d50a4e7a3933e0a1d5905bffb73dbc68

tests/common/dbus_access.cpp
tests/common/dbus_access.h

index a172ef8fda389f98e90b880d52942711fedea76e..b81de1fa8a5fdaab2c3528f373cbd7552a85b5d5 100644 (file)
@@ -27,6 +27,7 @@
 #include <tests_common.h>
 
 #include <cstring>
+#include <sstream>
 #include <unistd.h>
 
 #include "dbus_access.h"
@@ -52,6 +53,26 @@ void DBusAccess::connect() {
     dbus_connection_set_exit_on_disconnect(m_conn, FALSE);
 }
 
+void DBusAccess::addBusMatch(const char *member) {
+    std::ostringstream rule;
+    rule << "type='signal',"
+         << "sender='" << m_dbus_systemd_destination << "',"
+         << "interface='" << m_dbus_systemd_manager_interface << "',"
+         << "member='" << member << "',"
+         << "path='" << m_dbus_systemd_path << "'";
+
+    dbus_bus_add_match(m_conn, rule.str().c_str(), &m_err);
+    RUNNER_ASSERT_MSG(dbus_error_is_set(&m_err) != 1,
+        "Error in dbus_bus_add_match: " << m_err.message);
+}
+
+void DBusAccess::subscribeSignals() {
+    newMethodCall("Subscribe");
+    sendMsgWithReply();
+    getMsgReply();
+    finalizeMsgReply();
+}
+
 void DBusAccess::requestName() {
     dbus_bus_request_name(m_conn, m_dbus_client_name.c_str(),
         DBUS_NAME_FLAG_REPLACE_EXISTING , &m_err);
@@ -123,6 +144,14 @@ void DBusAccess::finalizeMsgReply() {
 
 void DBusAccess::connectToDBus() {
     connect();
+    addBusMatch("JobRemoved");
+    addBusMatch("JobNew");
+    dbus_connection_flush(m_conn);
+    dbus_connection_add_filter(m_conn,
+                               messageHandler,
+                               reinterpret_cast<void*>(this),
+                               [](void*)->void {});
+    subscribeSignals();
     requestName();
 }
 
@@ -141,7 +170,15 @@ void DBusAccess::sendResetFailedToService() {
     appendToMsg(m_service_name.c_str());
     sendMsgWithReply();
     getMsgReply();
-    ignoreMsgReply();
+    finalizeMsgReply();
+}
+
+DBusHandlerResult DBusAccess::messageHandler(DBusConnection *conn, DBusMessage *msg, void *t) {
+    (void) conn;
+    (void) msg;
+    (void) t;
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
 void DBusAccess::startService() {
index 9668b37c892bf7495f78d1eefd80c8549fea2eb1..cb9fdf3aafbda13a61c28d6c75a20cad23b25c67 100644 (file)
@@ -43,6 +43,8 @@ public:
     virtual ~DBusAccess();
 private:
     void connect();
+    void addBusMatch(const char *member);
+    void subscribeSignals();
     void requestName();
     void newMethodCall(const char *method);
     void appendToMsg(const char *argument);
@@ -55,6 +57,8 @@ private:
     void sendToService(const char *method);
     void sendResetFailedToService();
 
+    static DBusHandlerResult messageHandler(DBusConnection *conn, DBusMessage *msg, void *t);
+
     DBusConnection *m_conn;
     DBusMessage *m_msg;
     DBusError m_err;