appendToMsg("fail");
sendMsgWithReply();
getMsgReply();
- handleObjectPathMsgReply();
- usleep(50000);
+ m_runningJobs.insert(handleObjectPathMsgReply());
}
void DBusAccess::sendResetFailedToService() {
DBusHandlerResult DBusAccess::messageHandler(DBusConnection *conn, DBusMessage *msg, void *t) {
(void) conn;
- (void) msg;
- (void) t;
+ DBusAccess* self = reinterpret_cast<DBusAccess*>(t);
+
+ if (self->isSignal(msg, "JobRemoved"))
+ self->signalJobRemovedHandler(msg);
+ else if (self->isSignal(msg, "JobNew"))
+ self->signalJobNewHandler(msg);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
+bool DBusAccess::isSignal(DBusMessage *msg, const char *signal) {
+ return dbus_message_is_signal(msg, m_dbus_systemd_manager_interface.c_str(), signal);
+}
+
+void DBusAccess::signalJobRemovedHandler(DBusMessage *msg) {
+ DBusMessageIter iter;
+ RUNNER_ASSERT_MSG(dbus_message_iter_init(msg, &iter) != 0,
+ "Message has no arguments");
+
+ if (DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&iter)) {
+ RUNNER_FAIL_MSG("uint32 type expected");
+ }
+ uint32_t id;
+ dbus_message_iter_get_basic(&iter, &id);
+
+ dbus_message_iter_next (&iter);
+ if (DBUS_TYPE_OBJECT_PATH != dbus_message_iter_get_arg_type(&iter)) {
+ RUNNER_FAIL_MSG("Object path type expected");
+ }
+ char *path;
+ dbus_message_iter_get_basic(&iter, &path);
+
+ dbus_message_iter_next (&iter);
+ if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&iter)) {
+ RUNNER_FAIL_MSG("String type expected");
+ }
+ char *unit;
+ dbus_message_iter_get_basic(&iter, &unit);
+
+ dbus_message_iter_next (&iter);
+ if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&iter)) {
+ RUNNER_FAIL_MSG("String type expected");
+ }
+ char *result;
+ dbus_message_iter_get_basic(&iter, &result);
+
+ if(m_service_name == unit) {
+ RUNNER_ASSERT_MSG(strcmp(result, "done") == 0 || strcmp(result, "canceled") == 0,
+ "RemoveJob signal delivered bad news. Job wasn't completed successfully: "
+ << "expected job results = {done, canceled}, "
+ << "received job result = " << result << ", "
+ << "for job with id = " << id << ", "
+ << "and path = " << path);
+ m_runningJobs.erase(path);
+ }
+}
+
+void DBusAccess::signalJobNewHandler(DBusMessage *msg) {
+ DBusMessageIter iter;
+ RUNNER_ASSERT_MSG(dbus_message_iter_init(msg, &iter) != 0,
+ "Message has no arguments");
+
+ if (DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&iter)) {
+ RUNNER_FAIL_MSG("uint32 type expected");
+ }
+ uint32_t id;
+ dbus_message_iter_get_basic(&iter, &id);
+
+ dbus_message_iter_next (&iter);
+ if (DBUS_TYPE_OBJECT_PATH != dbus_message_iter_get_arg_type(&iter)) {
+ RUNNER_FAIL_MSG("Object path type expected");
+ }
+ char *path;
+ dbus_message_iter_get_basic(&iter, &path);
+
+ dbus_message_iter_next (&iter);
+ if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&iter)) {
+ RUNNER_FAIL_MSG("String type expected");
+ }
+ char *unit;
+ dbus_message_iter_get_basic(&iter, &unit);
+
+ if(m_service_name == unit)
+ m_runningJobs.insert(path);
+}
+
+void DBusAccess::waitForRunningJobsFinish() {
+ while (!m_runningJobs.empty())
+ dbus_connection_read_write_dispatch(m_conn, -1);
+}
+
void DBusAccess::startService() {
sendToService("StartUnit");
+ waitForRunningJobsFinish();
sendResetFailedToService();
}
void DBusAccess::stopService() {
sendToService("StopUnit");
+ waitForRunningJobsFinish();
sendResetFailedToService();
}
void DBusAccess::restartService() {
sendToService("RestartUnit");
+ waitForRunningJobsFinish();
sendResetFailedToService();
}