aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppSrvInfo.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-10-20 13:55:08 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-10-20 13:55:08 +0000
commitdc42da2e630955262e7b1b0318c0528834a53969 (patch)
tree9fd1d1b1c85068dbe81f50ad34decab58edfa529 /src/QXmppSrvInfo.cpp
parentf8c729d64378b062f721fe5fbf903f2d41a4f971 (diff)
downloadqxmpp-dc42da2e630955262e7b1b0318c0528834a53969.tar.gz
use asynchronous DNS SRV lookups to avoid freezing clients during lookup
Diffstat (limited to 'src/QXmppSrvInfo.cpp')
-rw-r--r--src/QXmppSrvInfo.cpp31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/QXmppSrvInfo.cpp b/src/QXmppSrvInfo.cpp
index 4a0a95ea..7c2b06d8 100644
--- a/src/QXmppSrvInfo.cpp
+++ b/src/QXmppSrvInfo.cpp
@@ -22,9 +22,12 @@
*/
#include "QXmppSrvInfo.h"
+#include "QXmppSrvInfo_p.h"
+#include <QCoreApplication>
#include <QLibrary>
#include <QMetaObject>
+#include <QMetaType>
#if defined(Q_OS_WIN)
#include <windows.h>
@@ -41,6 +44,8 @@
#include <resolv.h>
#endif
+Q_GLOBAL_STATIC(QXmppSrvInfoLookupManager, theSrvInfoLookupManager)
+
#if defined(Q_OS_WIN)
typedef DNS_STATUS (*dns_query_utf8_proto)(PCSTR,WORD,DWORD,PIP4_ARRAY,PDNS_RECORD*,PVOID*);
static dns_query_utf8_proto local_dns_query_utf8 = 0;
@@ -535,7 +540,29 @@ QXmppSrvInfo QXmppSrvInfo::fromName(const QString &dname)
void QXmppSrvInfo::lookupService(const QString &name, QObject *receiver, const char *member)
{
- QXmppSrvInfo result = QXmppSrvInfo::fromName(name);
- QMetaObject::invokeMethod(receiver, member, Qt::QueuedConnection, Q_ARG(QXmppSrvInfo, result));
+ qRegisterMetaType<QXmppSrvInfo>("QXmppSrvInfo");
+
+ QXmppSrvInfoLookupManager *manager = theSrvInfoLookupManager();
+ if (manager)
+ {
+ // the application is still alive
+ QXmppSrvInfoLookupRunnable *runnable = new QXmppSrvInfoLookupRunnable(name);
+ QObject::connect(runnable, SIGNAL(foundInfo(QXmppSrvInfo)), receiver, member);
+ manager->start(runnable);
+ }
+}
+
+QXmppSrvInfoLookupManager::QXmppSrvInfoLookupManager()
+{
+ moveToThread(QCoreApplication::instance()->thread());
+ connect(QCoreApplication::instance(), SIGNAL(destroyed()),
+ SLOT(waitForThreadPoolDone()), Qt::DirectConnection);
+ setMaxThreadCount(5); // do 5 SRV lookups in parallel
+}
+
+void QXmppSrvInfoLookupRunnable::run()
+{
+ const QXmppSrvInfo result = QXmppSrvInfo::fromName(lookupName);
+ emit foundInfo(result);
}