diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-10-20 13:55:08 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-10-20 13:55:08 +0000 |
| commit | dc42da2e630955262e7b1b0318c0528834a53969 (patch) | |
| tree | 9fd1d1b1c85068dbe81f50ad34decab58edfa529 /src/QXmppSrvInfo.cpp | |
| parent | f8c729d64378b062f721fe5fbf903f2d41a4f971 (diff) | |
| download | qxmpp-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.cpp | 31 |
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); } |
