summaryrefslogtreecommitdiffstats
path: root/tqdbusintegrator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tqdbusintegrator.cpp')
-rw-r--r--tqdbusintegrator.cpp51
1 files changed, 41 insertions, 10 deletions
diff --git a/tqdbusintegrator.cpp b/tqdbusintegrator.cpp
index 81cb8df..ef3b76f 100644
--- a/tqdbusintegrator.cpp
+++ b/tqdbusintegrator.cpp
@@ -282,6 +282,11 @@ TQT_DBusConnectionPrivate::TQT_DBusConnectionPrivate(TQObject *parent)
dispatcher = new TQTimer(this);
TQObject::connect(dispatcher, TQT_SIGNAL(timeout()), this, TQT_SLOT(dispatch()));
+
+ m_resultEmissionQueueTimer = new TQTimer(this);
+ TQObject::connect(m_resultEmissionQueueTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(transmitResultEmissionQueue()));
+ m_messageEmissionQueueTimer = new TQTimer(this);
+ TQObject::connect(m_messageEmissionQueueTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(transmitMessageEmissionQueue()));
}
TQT_DBusConnectionPrivate::~TQT_DBusConnectionPrivate()
@@ -469,11 +474,15 @@ void TQT_DBusConnectionPrivate::dispatch()
}
inDispatch = false;
+}
- for (TQT_DBusConnectionPrivate::PendingMessagesForEmit::iterator pmfe = pendingMessages.begin(); pmfe != pendingMessages.end(); ++pmfe) {
+void TQT_DBusConnectionPrivate::transmitMessageEmissionQueue()
+{
+ TQT_DBusConnectionPrivate::PendingMessagesForEmit::iterator pmfe;
+ pmfe = pendingMessages.begin();
+ while (pmfe != pendingMessages.end()) {
TQT_DBusMessage msg = *pmfe;
- pendingMessages.remove(pmfe);
- pmfe = pendingMessages.begin();
+ pmfe = pendingMessages.remove(pmfe);
dbusSignal(msg);
}
}
@@ -501,6 +510,7 @@ bool TQT_DBusConnectionPrivate::handleSignal(DBusMessage *message)
// which could result in arbitrary methods being called while still inside dbus_connection_dispatch.
// Instead, I enqueue the messages here for TQt3 event loop transmission after dbus_connection_dispatch is finished.
pendingMessages.append(msg);
+ if (!m_messageEmissionQueueTimer->isActive()) m_messageEmissionQueueTimer->start(0, TRUE);
return true;
}
@@ -590,13 +600,12 @@ static void qDBusResultReceived(DBusPendingCall *pending, void *user_data)
{
TQT_DBusMessage reply = TQT_DBusMessage::fromDBusMessage(dbusReply);
- TQObject::connect(d, TQT_SIGNAL(dbusPendingCallReply(const TQT_DBusMessage&)),
- it.data()->receiver, it.data()->method.data());
-
- d->emitPendingCallReply(reply);
-
- TQObject::disconnect(d, TQT_SIGNAL(dbusPendingCallReply(const TQT_DBusMessage&)),
- it.data()->receiver, it.data()->method.data());
+ TQT_DBusResultInfo dbusResult;
+ dbusResult.message = reply;
+ dbusResult.receiver = it.data()->receiver;
+ dbusResult.method = it.data()->method.data();
+ d->m_resultEmissionQueue.append(dbusResult);
+ d->newMethodInResultEmissionQueue();
}
dbus_message_unref(dbusReply);
@@ -643,4 +652,26 @@ void TQT_DBusConnectionPrivate::flush()
dbus_connection_flush(connection);
}
+void TQT_DBusConnectionPrivate::newMethodInResultEmissionQueue()
+{
+ if (!m_resultEmissionQueueTimer->isActive()) m_resultEmissionQueueTimer->start(0, TRUE);
+}
+
+void TQT_DBusConnectionPrivate::transmitResultEmissionQueue()
+{
+ if (!m_resultEmissionQueue.isEmpty()) {
+ TQT_DBusResultInfoList::Iterator it;
+ it = m_resultEmissionQueue.begin();
+ while (it != m_resultEmissionQueue.end()) {
+ TQT_DBusResultInfo dbusResult = (*it);
+ m_resultEmissionQueue.remove(it);
+ it = m_resultEmissionQueue.begin();
+
+ TQObject::connect(this, TQT_SIGNAL(dbusPendingCallReply(const TQT_DBusMessage&)), dbusResult.receiver, dbusResult.method.data());
+ emitPendingCallReply(dbusResult.message);
+ TQObject::disconnect(this, TQT_SIGNAL(dbusPendingCallReply(const TQT_DBusMessage&)), dbusResult.receiver, dbusResult.method.data());
+ }
+ }
+}
+
#include "tqdbusconnection_p.moc"