From dc42da2e630955262e7b1b0318c0528834a53969 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Wed, 20 Oct 2010 13:55:08 +0000 Subject: use asynchronous DNS SRV lookups to avoid freezing clients during lookup --- src/QXmppSrvInfo.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src/QXmppSrvInfo.cpp') 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 #include #include +#include #if defined(Q_OS_WIN) #include @@ -41,6 +44,8 @@ #include #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"); + + 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); } -- cgit v1.2.3