#include <tests_common.h>
#include <cstring>
+#include <sstream>
#include <unistd.h>
#include "dbus_access.h"
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);
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();
}
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() {
virtual ~DBusAccess();
private:
void connect();
+ void addBusMatch(const char *member);
+ void subscribeSignals();
void requestName();
void newMethodCall(const char *method);
void appendToMsg(const char *argument);
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;