diff options
| author | Niels Ole Salscheider <niels_ole@salscheider-online.de> | 2017-09-03 22:00:29 +0200 |
|---|---|---|
| committer | Niels Ole Salscheider <niels_ole@salscheider-online.de> | 2017-09-04 19:44:01 +0200 |
| commit | 2a5ccd3bd191b75b9fa148a8fa7f3d3ddc225add (patch) | |
| tree | d8cd64a20fbe77a78be7c9533787044157190442 /src/base | |
| parent | 3241e63f07c5fa493788897ddfb87a201205f621 (diff) | |
| download | qxmpp-2a5ccd3bd191b75b9fa148a8fa7f3d3ddc225add.tar.gz | |
Drop support for Qt 4
Diffstat (limited to 'src/base')
| -rw-r--r-- | src/base/QXmppSasl.cpp | 18 | ||||
| -rw-r--r-- | src/base/qdnslookup.cpp | 989 | ||||
| -rw-r--r-- | src/base/qdnslookup.h | 240 | ||||
| -rw-r--r-- | src/base/qdnslookup_p.h | 216 | ||||
| -rw-r--r-- | src/base/qdnslookup_stub.cpp | 54 | ||||
| -rw-r--r-- | src/base/qdnslookup_symbian.cpp | 98 | ||||
| -rw-r--r-- | src/base/qdnslookup_unix.cpp | 323 | ||||
| -rw-r--r-- | src/base/qdnslookup_win.cpp | 150 |
8 files changed, 1 insertions, 2087 deletions
diff --git a/src/base/QXmppSasl.cpp b/src/base/QXmppSasl.cpp index cb44007f..cf3347e2 100644 --- a/src/base/QXmppSasl.cpp +++ b/src/base/QXmppSasl.cpp @@ -27,11 +27,7 @@ #include <QCryptographicHash> #include <QDomElement> #include <QStringList> -#if QT_VERSION >= 0x050000 #include <QUrlQuery> -#else -#include <QUrl> -#endif #include "QXmppSasl_p.h" #include "QXmppUtils.h" @@ -437,23 +433,14 @@ bool QXmppSaslClientFacebook::respond(const QByteArray &challenge, QByteArray &r return true; } else if (m_step == 1) { // parse request -#if QT_VERSION >= 0x050000 QUrlQuery requestUrl(challenge); -#else - QUrl requestUrl; - requestUrl.setEncodedQuery(challenge); -#endif if (!requestUrl.hasQueryItem("method") || !requestUrl.hasQueryItem("nonce")) { warning("QXmppSaslClientFacebook : Invalid challenge, nonce or method missing"); return false; } // build response -#if QT_VERSION >= 0x050000 QUrlQuery responseUrl; -#else - QUrl responseUrl; -#endif responseUrl.addQueryItem("access_token", password()); responseUrl.addQueryItem("api_key", username()); responseUrl.addQueryItem("call_id", 0); @@ -461,11 +448,8 @@ bool QXmppSaslClientFacebook::respond(const QByteArray &challenge, QByteArray &r responseUrl.addQueryItem("nonce", requestUrl.queryItemValue("nonce")); responseUrl.addQueryItem("v", "1.0"); -#if QT_VERSION >= 0x050000 response = responseUrl.query().toUtf8(); -#else - response = responseUrl.encodedQuery(); -#endif + m_step++; return true; } else { diff --git a/src/base/qdnslookup.cpp b/src/base/qdnslookup.cpp deleted file mode 100644 index 7b1e7c8f..00000000 --- a/src/base/qdnslookup.cpp +++ /dev/null @@ -1,989 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org> -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qdnslookup.h" -#include "qdnslookup_p.h" - -#include <QCoreApplication> -#include <QDateTime> -#include <QMetaType> -#include <QThreadStorage> -#include <QUrl> - -QT_BEGIN_NAMESPACE - -Q_GLOBAL_STATIC(QDnsLookupThreadPool, theDnsLookupThreadPool); -Q_GLOBAL_STATIC(QThreadStorage<bool *>, theDnsLookupSeedStorage); - -static bool qt_qdnsmailexchangerecord_less_than(const QDnsMailExchangeRecord &r1, const QDnsMailExchangeRecord &r2) -{ - // Lower numbers are more preferred than higher ones. - return r1.preference() < r2.preference(); -} - -/*! - Sorts a list of QDnsMailExchangeRecord objects according to RFC 5321. -*/ - -static void qt_qdnsmailexchangerecord_sort(QList<QDnsMailExchangeRecord> &records) -{ - // If we have no more than one result, we are done. - if (records.size() <= 1) - return; - - // Order the records by preference. - qSort(records.begin(), records.end(), qt_qdnsmailexchangerecord_less_than); - - int i = 0; - while (i < records.size()) { - - // Determine the slice of records with the current preference. - QList<QDnsMailExchangeRecord> slice; - const quint16 slicePreference = records[i].preference(); - for (int j = i; j < records.size(); ++j) { - if (records[j].preference() != slicePreference) - break; - slice << records[j]; - } - - // Randomize the slice of records. - while (!slice.isEmpty()) { - const unsigned int pos = qrand() % slice.size(); - records[i++] = slice.takeAt(pos); - } - } -} - -static bool qt_qdnsservicerecord_less_than(const QDnsServiceRecord &r1, const QDnsServiceRecord &r2) -{ - // Order by priority, or if the priorities are equal, - // put zero weight records first. - return r1.priority() < r2.priority() - || (r1.priority() == r2.priority() - && r1.weight() == 0 && r2.weight() > 0); -} - -/*! - Sorts a list of QDnsServiceRecord objects according to RFC 2782. -*/ - -static void qt_qdnsservicerecord_sort(QList<QDnsServiceRecord> &records) -{ - // If we have no more than one result, we are done. - if (records.size() <= 1) - return; - - // Order the records by priority, and for records with an equal - // priority, put records with a zero weight first. - qSort(records.begin(), records.end(), qt_qdnsservicerecord_less_than); - - int i = 0; - while (i < records.size()) { - - // Determine the slice of records with the current priority. - QList<QDnsServiceRecord> slice; - const quint16 slicePriority = records[i].priority(); - unsigned int sliceWeight = 0; - for (int j = i; j < records.size(); ++j) { - if (records[j].priority() != slicePriority) - break; - sliceWeight += records[j].weight(); - slice << records[j]; - } -#ifdef QDNSLOOKUP_DEBUG - qDebug("qt_qdnsservicerecord_sort() : priority %i (size: %i, total weight: %i)", - slicePriority, slice.size(), sliceWeight); -#endif - - // Order the slice of records. - while (!slice.isEmpty()) { - const unsigned int weightThreshold = qrand() % (sliceWeight + 1); - unsigned int summedWeight = 0; - for (int j = 0; j < slice.size(); ++j) { - summedWeight += slice[j].weight(); - if (summedWeight >= weightThreshold) { -#ifdef QDNSLOOKUP_DEBUG - qDebug("qt_qdnsservicerecord_sort() : adding %s %i (weight: %i)", - qPrintable(slice[j].target()), slice[j].port(), - slice[j].weight()); -#endif - // Adjust the slice weight and take the current record. - sliceWeight -= slice[j].weight(); - records[i++] = slice.takeAt(j); - break; - } - } - } - } -} - -/*! - \class QDnsLookup - \brief The QDnsLookup class represents a DNS lookup. - - \inmodule QtNetwork - \ingroup network - - QDnsLookup uses the mechanisms provided by the operating system to perform - DNS lookups. To perform a lookup you need to specify a \l name and \l type - then invoke the \l{QDnsLookup::lookup()}{lookup()} slot. The - \l{QDnsLookup::finished()}{finished()} signal will be emitted upon - completion. - - For example, you can determine which servers an XMPP chat client should - connect to for a given domain with: - - \snippet doc/src/snippets/code/src_network_kernel_qdnslookup.cpp 0 - - Once the request finishes you can handle the results with: - - \snippet doc/src/snippets/code/src_network_kernel_qdnslookup.cpp 1 - - \note If you simply want to find the IP address(es) associated with a host - name, or the host name associated with an IP address you should use - QHostInfo instead. -*/ - -/*! - \enum QDnsLookup::Error - - Indicates all possible error conditions found during the - processing of the DNS lookup. - - \value NoError no error condition. - - \value ResolverError there was an error initializing the system's - DNS resolver. - - \value OperationCancelledError the lookup was aborted using the abort() - method. - - \value InvalidRequestError the requested DNS lookup was invalid. - - \value InvalidReplyError the reply returned by the server was invalid. - - \value ServerFailureError the server encountered an internal failure - while processing the request (SERVFAIL). - - \value ServerRefusedError the server refused to process the request for - security or policy reasons (REFUSED). - - \value NotFoundError the requested domain name does not exist - (NXDOMAIN). -*/ - -/*! - \enum QDnsLookup::Type - - Indicates the type of DNS lookup that was performed. - - \value A IPv4 address records. - - \value AAAA IPv6 address records. - - \value ANY any records. - - \value CNAME canonical name records. - - \value MX mail exchange records. - - \value NS name server records. - - \value PTR pointer records. - - \value SRV service records. - - \value TXT text records. -*/ - -/*! - \fn void QDnsLookup::finished() - - This signal is emitted when the reply has finished processing. -*/ - -/*! - \fn void QDnsLookup::nameChanged(const QString &name) - - This signal is emitted when the lookup \l name changes. - \a name is the new lookup name. -*/ - -/*! - \fn void QDnsLookup::typeChanged(Type type) - - This signal is emitted when the lookup \l type changes. - \a type is the new lookup type. -*/ - -/*! - Constructs a QDnsLookup object and sets \a parent as the parent object. - - The \l type property will default to QDnsLookup::A. -*/ - -QDnsLookup::QDnsLookup(QObject *parent) - : QObject(parent) - , d_ptr(new QDnsLookupPrivate(this)) -{ - qRegisterMetaType<QDnsLookupReply>(); -} -/*! - Constructs a QDnsLookup object for the given \a type and \a name and sets - \a parent as the parent object. -*/ - -QDnsLookup::QDnsLookup(Type type, const QString &name, QObject *parent) - : QObject(parent) - , d_ptr(new QDnsLookupPrivate(this)) -{ - Q_D(QDnsLookup); - qRegisterMetaType<QDnsLookupReply>(); - d->name = name; - d->type = type; -} - -/*! - Destroys the QDnsLookup object. - - It is safe to delete a QDnsLookup object even if it is not finished, you - will simply never receive its results. -*/ - -QDnsLookup::~QDnsLookup() -{ -} - -/*! - \property QDnsLookup::error - \brief the type of error that occurred if the DNS lookup failed, or NoError. -*/ - -QDnsLookup::Error QDnsLookup::error() const -{ - return d_func()->reply.error; -} - -/*! - \property QDnsLookup::errorString - \brief a human-readable description of the error if the DNS lookup failed. -*/ - -QString QDnsLookup::errorString() const -{ - return d_func()->reply.errorString; -} - -/*! - \property QDnsLookup::finished - \brief whether the reply has finished or was aborted. -*/ - -bool QDnsLookup::isFinished() const -{ - return d_func()->isFinished; -} - -/*! - \property QDnsLookup::name - \brief the name to lookup. - - \note The name will be encoded using IDNA, which means it's unsuitable for - querying SRV records compatible with the DNS-SD specification. -*/ - -QString QDnsLookup::name() const -{ - return d_func()->name; -} - -void QDnsLookup::setName(const QString &name) -{ - Q_D(QDnsLookup); - if (name != d->name) { - d->name = name; - emit nameChanged(name); - } -} - -/*! - \property QDnsLookup::type - \brief the type of DNS lookup. -*/ - -QDnsLookup::Type QDnsLookup::type() const -{ - return d_func()->type; -} - -void QDnsLookup::setType(Type type) -{ - Q_D(QDnsLookup); - if (type != d->type) { - d->type = type; - emit typeChanged(type); - } -} - -/*! - Returns the list of canonical name records associated with this lookup. -*/ - -QList<QDnsDomainNameRecord> QDnsLookup::canonicalNameRecords() const -{ - return d_func()->reply.canonicalNameRecords; -} - -/*! - Returns the list of host address records associated with this lookup. -*/ - -QList<QDnsHostAddressRecord> QDnsLookup::hostAddressRecords() const -{ - return d_func()->reply.hostAddressRecords; -} - -/*! - Returns the list of mail exchange records associated with this lookup. - - The records are sorted according to - \l{http://www.rfc-editor.org/rfc/rfc5321.txt}{RFC 5321}, so if you use them - to connect to servers, you should try them in the order they are listed. -*/ - -QList<QDnsMailExchangeRecord> QDnsLookup::mailExchangeRecords() const -{ - return d_func()->reply.mailExchangeRecords; -} - -/*! - Returns the list of name server records associated with this lookup. -*/ - -QList<QDnsDomainNameRecord> QDnsLookup::nameServerRecords() const -{ - return d_func()->reply.nameServerRecords; -} - -/*! - Returns the list of pointer records associated with this lookup. -*/ - -QList<QDnsDomainNameRecord> QDnsLookup::pointerRecords() const -{ - return d_func()->reply.pointerRecords; -} - -/*! - Returns the list of service records associated with this lookup. - - The records are sorted according to - \l{http://www.rfc-editor.org/rfc/rfc2782.txt}{RFC 2782}, so if you use them - to connect to servers, you should try them in the order they are listed. -*/ - -QList<QDnsServiceRecord> QDnsLookup::serviceRecords() const -{ - return d_func()->reply.serviceRecords; -} - -/*! - Returns the list of text records associated with this lookup. -*/ - -QList<QDnsTextRecord> QDnsLookup::textRecords() const -{ - return d_func()->reply.textRecords; -} - -/*! - Aborts the DNS lookup operation. - - If the lookup is already finished, does nothing. -*/ - -void QDnsLookup::abort() -{ - Q_D(QDnsLookup); - if (d->runnable) { - d->runnable = 0; - d->reply = QDnsLookupReply(); - d->reply.error = QDnsLookup::OperationCancelledError; - d->reply.errorString = tr("Operation cancelled"); - d->isFinished = true; - emit finished(); - } -} - -/*! - Performs the DNS lookup. - - The \l{QDnsLookup::finished()}{finished()} signal is emitted upon completion. -*/ - -void QDnsLookup::lookup() -{ - Q_D(QDnsLookup); - d->isFinished = false; - d->reply = QDnsLookupReply(); - d->runnable = new QDnsLookupRunnable(d->type, QUrl::toAce(d->name)); - connect(d->runnable, SIGNAL(finished(QDnsLookupReply)), - this, SLOT(_q_lookupFinished(QDnsLookupReply)), - Qt::BlockingQueuedConnection); - theDnsLookupThreadPool()->start(d->runnable); -} - -/*! - \class QDnsDomainNameRecord - \brief The QDnsDomainNameRecord class stores information about a domain - name record. - - \inmodule QtNetwork - \ingroup network - - When performing a name server lookup, zero or more records will be returned. - Each record is represented by a QDnsDomainNameRecord instance. - - \sa QDnsLookup -*/ - -/*! - Constructs an empty domain name record object. -*/ - -QDnsDomainNameRecord::QDnsDomainNameRecord() - : d(new QDnsDomainNameRecordPrivate) -{ -} - -/*! - Constructs a copy of \a other. -*/ - -QDnsDomainNameRecord::QDnsDomainNameRecord(const QDnsDomainNameRecord &other) - : d(other.d) -{ -} - -/*! - Destroys a domain name record. -*/ - -QDnsDomainNameRecord::~QDnsDomainNameRecord() -{ -} - -/*! - Returns the name for this record. -*/ - -QString QDnsDomainNameRecord::name() const -{ - return d->name; -} - -/*! - Returns the duration in seconds for which this record is valid. -*/ - -quint32 QDnsDomainNameRecord::timeToLive() const -{ - return d->timeToLive; -} - -/*! - Returns the value for this domain name record. -*/ - -QString QDnsDomainNameRecord::value() const -{ - return d->value; -} - -/*! - Assigns the data of the \a other object to this record object, - and returns a reference to it. -*/ - -QDnsDomainNameRecord &QDnsDomainNameRecord::operator=(const QDnsDomainNameRecord &other) -{ - d = other.d; - return *this; -} - -/*! - \class QDnsHostAddressRecord - \brief The QDnsHostAddressRecord class stores information about a host - address record. - - \inmodule QtNetwork - \ingroup network - - When performing an address lookup, zero or more records will be - returned. Each record is represented by a QDnsHostAddressRecord instance. - - \sa QDnsLookup -*/ - -/*! - Constructs an empty host address record object. -*/ - -QDnsHostAddressRecord::QDnsHostAddressRecord() - : d(new QDnsHostAddressRecordPrivate) -{ -} - -/*! - Constructs a copy of \a other. -*/ - -QDnsHostAddressRecord::QDnsHostAddressRecord(const QDnsHostAddressRecord &other) - : d(other.d) -{ -} - -/*! - Destroys a host address record. -*/ - -QDnsHostAddressRecord::~QDnsHostAddressRecord() -{ -} - -/*! - Returns the name for this record. -*/ - -QString QDnsHostAddressRecord::name() const -{ - return d->name; -} - -/*! - Returns the duration in seconds for which this record is valid. -*/ - -quint32 QDnsHostAddressRecord::timeToLive() const -{ - return d->timeToLive; -} - -/*! - Returns the value for this host address record. -*/ - -QHostAddress QDnsHostAddressRecord::value() const -{ - return d->value; -} - -/*! - Assigns the data of the \a other object to this record object, - and returns a reference to it. -*/ - -QDnsHostAddressRecord &QDnsHostAddressRecord::operator=(const QDnsHostAddressRecord &other) -{ - d = other.d; - return *this; -} - -/*! - \class QDnsMailExchangeRecord - \brief The QDnsMailExchangeRecord class stores information about a DNS MX record. - - \inmodule QtNetwork - \ingroup network - - When performing a lookup on a service, zero or more records will be - returned. Each record is represented by a QDnsMailExchangeRecord instance. - - The meaning of the fields is defined in - \l{http://www.rfc-editor.org/rfc/rfc1035.txt}{RFC 1035}. - - \sa QDnsLookup -*/ - -/*! - Constructs an empty mail exchange record object. -*/ - -QDnsMailExchangeRecord::QDnsMailExchangeRecord() - : d(new QDnsMailExchangeRecordPrivate) -{ -} - -/*! - Constructs a copy of \a other. -*/ - -QDnsMailExchangeRecord::QDnsMailExchangeRecord(const QDnsMailExchangeRecord &other) - : d(other.d) -{ -} - -/*! - Destroys a mail exchange record. -*/ - -QDnsMailExchangeRecord::~QDnsMailExchangeRecord() -{ -} - -/*! - Returns the domain name of the mail exchange for this record. -*/ - -QString QDnsMailExchangeRecord::exchange() const -{ - return d->exchange; -} - -/*! - Returns the name for this record. -*/ - -QString QDnsMailExchangeRecord::name() const -{ - return d->name; -} - -/*! - Returns the preference for this record. -*/ - -quint16 QDnsMailExchangeRecord::preference() const -{ - return d->preference; -} - -/*! - Returns the duration in seconds for which this record is valid. -*/ - -quint32 QDnsMailExchangeRecord::timeToLive() const -{ - return d->timeToLive; -} - -/*! - Assigns the data of the \a other object to this record object, - and returns a reference to it. -*/ - -QDnsMailExchangeRecord &QDnsMailExchangeRecord::operator=(const QDnsMailExchangeRecord &other) -{ - d = other.d; - return *this; -} - -/*! - \class QDnsServiceRecord - \brief The QDnsServiceRecord class stores information about a DNS SRV record. - - \inmodule QtNetwork - \ingroup network - - When performing a lookup on a service, zero or more records will be - returned. Each record is represented by a QDnsServiceRecord instance. - - The meaning of the fields is defined in - \l{http://www.rfc-editor.org/rfc/rfc2782.txt}{RFC 2782}. - - \sa QDnsLookup -*/ - -/*! - Constructs an empty service record object. -*/ - -QDnsServiceRecord::QDnsServiceRecord() - : d(new QDnsServiceRecordPrivate) -{ -} - -/*! - Constructs a copy of \a other. -*/ - -QDnsServiceRecord::QDnsServiceRecord(const QDnsServiceRecord &other) - : d(other.d) -{ -} - -/*! - Destroys a service record. -*/ - -QDnsServiceRecord::~QDnsServiceRecord() -{ -} - -/*! - Returns the name for this record. -*/ - -QString QDnsServiceRecord::name() const -{ - return d->name; -} - -/*! - Returns the port on the target host for this service record. -*/ - -quint16 QDnsServiceRecord::port() const -{ - return d->port; -} - -/*! - Returns the priority for this service record. - - A client must attempt to contact the target host with the lowest-numbered - priority. -*/ - -quint16 QDnsServiceRecord::priority() const -{ - return d->priority; -} - -/*! - Returns the domain name of the target host for this service record. -*/ - -QString QDnsServiceRecord::target() const -{ - return d->target; -} - -/*! - Returns the duration in seconds for which this record is valid. -*/ - -quint32 QDnsServiceRecord::timeToLive() const -{ - return d->timeToLive; -} - -/*! - Returns the weight for this service record. - - The weight field specifies a relative weight for entries with the same - priority. Entries with higher weights should be selected with a higher - probability. -*/ - -quint16 QDnsServiceRecord::weight() const -{ - return d->weight; -} - -/*! - Assigns the data of the \a other object to this record object, - and returns a reference to it. -*/ - -QDnsServiceRecord &QDnsServiceRecord::operator=(const QDnsServiceRecord &other) -{ - d = other.d; - return *this; -} - -/*! - \class QDnsTextRecord - \brief The QDnsTextRecord class stores information about a DNS TXT record. - - \inmodule QtNetwork - \ingroup network - - When performing a text lookup, zero or more records will be - returned. Each record is represented by a QDnsTextRecord instance. - - The meaning of the fields is defined in - \l{http://www.rfc-editor.org/rfc/rfc1035.txt}{RFC 1035}. - - \sa QDnsLookup -*/ - -/*! - Constructs an empty text record object. -*/ - -QDnsTextRecord::QDnsTextRecord() - : d(new QDnsTextRecordPrivate) -{ -} - -/*! - Constructs a copy of \a other. -*/ - -QDnsTextRecord::QDnsTextRecord(const QDnsTextRecord &other) - : d(other.d) -{ -} - -/*! - Destroys a text record. -*/ - -QDnsTextRecord::~QDnsTextRecord() -{ -} - -/*! - Returns the name for this text record. -*/ - -QString QDnsTextRecord::name() const -{ - return d->name; -} - -/*! - Returns the duration in seconds for which this record is valid. -*/ - -quint32 QDnsTextRecord::timeToLive() const -{ - return d->timeToLive; -} - -/*! - Returns the values for this text record. -*/ - -QList<QByteArray> QDnsTextRecord::values() const -{ - return d->values; -} - -/*! - Assigns the data of the \a other object to this record object, - and returns a reference to it. -*/ - -QDnsTextRecord &QDnsTextRecord::operator=(const QDnsTextRecord &other) -{ - d = other.d; - return *this; -} - -void QDnsLookupPrivate::_q_lookupFinished(const QDnsLookupReply &_reply) -{ - Q_Q(QDnsLookup); - if (runnable == q->sender()) { -#ifdef QDNSLOOKUP_DEBUG - qDebug("DNS reply for %s: %i (%s)", qPrintable(name), _reply.error, qPrintable(_reply.errorString)); -#endif - reply = _reply; - runnable = 0; - isFinished = true; - emit q->finished(); - } -} - -void QDnsLookupRunnable::run() -{ - QDnsLookupReply reply; - - // Validate input. - if (requestName.isEmpty()) { - reply.error = QDnsLookup::InvalidRequestError; - reply.errorString = tr("Invalid domain name"); - emit finished(reply); - return; - } - - // Perform request. - query(requestType, requestName, &reply); - - // Sort results. - if (!theDnsLookupSeedStorage()->hasLocalData()) { - qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()) ^ reinterpret_cast<quintptr>(this)); - theDnsLookupSeedStorage()->setLocalData(new bool(true)); - } - qt_qdnsmailexchangerecord_sort(reply.mailExchangeRecords); - qt_qdnsservicerecord_sort(reply.serviceRecords); - - emit finished(reply); -} - -QDnsLookupThreadPool::QDnsLookupThreadPool() - : signalsConnected(false) -{ - // Run up to 5 lookups in parallel. - setMaxThreadCount(5); -} - -void QDnsLookupThreadPool::start(QRunnable *runnable) -{ - // Ensure threads complete at application destruction. - if (!signalsConnected) { - QMutexLocker signalsLocker(&signalsMutex); - if (!signalsConnected) { - QCoreApplication *app = QCoreApplication::instance(); - if (!app) { - qWarning("QDnsLookup requires a QCoreApplication"); - delete runnable; - return; - } - - moveToThread(app->thread()); - connect(app, SIGNAL(destroyed()), - SLOT(_q_applicationDestroyed()), Qt::DirectConnection); - signalsConnected = true; - } - } - - QThreadPool::start(runnable); -} - -void QDnsLookupThreadPool::_q_applicationDestroyed() -{ - waitForDone(); - signalsConnected = false; -} - -QT_END_NAMESPACE diff --git a/src/base/qdnslookup.h b/src/base/qdnslookup.h deleted file mode 100644 index bd5f6602..00000000 --- a/src/base/qdnslookup.h +++ /dev/null @@ -1,240 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org> -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QDNSLOOKUP_H -#define QDNSLOOKUP_H - -#include <QList> -#include <QObject> -#include <QSharedData> -#include <QSharedPointer> -#include <QString> - -#include "QXmppGlobal.h" - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Network) - -class QHostAddress; -class QDnsLookupPrivate; -class QDnsDomainNameRecordPrivate; -class QDnsHostAddressRecordPrivate; -class QDnsMailExchangeRecordPrivate; -class QDnsServiceRecordPrivate; -class QDnsTextRecordPrivate; - -class QXMPP_EXPORT QDnsDomainNameRecord -{ -public: - QDnsDomainNameRecord(); - QDnsDomainNameRecord(const QDnsDomainNameRecord &other); - ~QDnsDomainNameRecord(); - - QString name() const; - quint32 timeToLive() const; - QString value() const; - - QDnsDomainNameRecord &operator=(const QDnsDomainNameRecord &other); - -private: - QSharedDataPointer<QDnsDomainNameRecordPrivate> d; - friend class QDnsLookupRunnable; -}; - -class QXMPP_EXPORT QDnsHostAddressRecord -{ -public: - QDnsHostAddressRecord(); - QDnsHostAddressRecord(const QDnsHostAddressRecord &other); - ~QDnsHostAddressRecord(); - - QString name() const; - quint32 timeToLive() const; - QHostAddress value() const; - - QDnsHostAddressRecord &operator=(const QDnsHostAddressRecord &other); - -private: - QSharedDataPointer<QDnsHostAddressRecordPrivate> d; - friend class QDnsLookupRunnable; -}; - -class QXMPP_EXPORT QDnsMailExchangeRecord -{ -public: - QDnsMailExchangeRecord(); - QDnsMailExchangeRecord(const QDnsMailExchangeRecord &other); - ~QDnsMailExchangeRecord(); - - QString exchange() const; - QString name() const; - quint16 preference() const; - quint32 timeToLive() const; - - QDnsMailExchangeRecord &operator=(const QDnsMailExchangeRecord &other); - -private: - QSharedDataPointer<QDnsMailExchangeRecordPrivate> d; - friend class QDnsLookupRunnable; -}; - -class QXMPP_EXPORT QDnsServiceRecord -{ -public: - QDnsServiceRecord(); - QDnsServiceRecord(const QDnsServiceRecord &other); - ~QDnsServiceRecord(); - - QString name() const; - quint16 port() const; - quint16 priority() const; - QString target() const; - quint32 timeToLive() const; - quint16 weight() const; - - QDnsServiceRecord &operator=(const QDnsServiceRecord &other); - -private: - QSharedDataPointer<QDnsServiceRecordPrivate> d; - friend class QDnsLookupRunnable; -}; - -class QXMPP_EXPORT QDnsTextRecord -{ -public: - QDnsTextRecord(); - QDnsTextRecord(const QDnsTextRecord &other); - ~QDnsTextRecord(); - - QString name() const; - quint32 timeToLive() const; - QList<QByteArray> values() const; - - QDnsTextRecord &operator=(const QDnsTextRecord &other); - -private: - QSharedDataPointer<QDnsTextRecordPrivate> d; - friend class QDnsLookupRunnable; -}; - -class QXMPP_EXPORT QDnsLookup : public QObject -{ - Q_OBJECT - Q_ENUMS(Error Type) - Q_PROPERTY(Error error READ error NOTIFY finished) - Q_PROPERTY(QString errorString READ errorString NOTIFY finished) - Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) - Q_PROPERTY(Type type READ type WRITE setType NOTIFY typeChanged) - -public: - enum Error - { - NoError = 0, - ResolverError, - OperationCancelledError, - InvalidRequestError, - InvalidReplyError, - ServerFailureError, - ServerRefusedError, - NotFoundError - }; - - enum Type - { - A = 1, - AAAA = 28, - ANY = 255, - CNAME = 5, - MX = 15, - NS = 2, - PTR = 12, - SRV = 33, - TXT = 16 - }; - - QDnsLookup(QObject *parent = 0); - QDnsLookup(Type type, const QString &name, QObject *parent = 0); - ~QDnsLookup(); - - Error error() const; - QString errorString() const; - bool isFinished() const; - - QString name() const; - void setName(const QString &name); - - Type type() const; - void setType(QDnsLookup::Type); - - QList<QDnsDomainNameRecord> canonicalNameRecords() const; - QList<QDnsHostAddressRecord> hostAddressRecords() const; - QList<QDnsMailExchangeRecord> mailExchangeRecords() const; - QList<QDnsDomainNameRecord> nameServerRecords() const; - QList<QDnsDomainNameRecord> pointerRecords() const; - QList<QDnsServiceRecord> serviceRecords() const; - QList<QDnsTextRecord> textRecords() const; - - -public Q_SLOTS: - void abort(); - void lookup(); - -Q_SIGNALS: - void finished(); - void nameChanged(const QString &name); - void typeChanged(Type type); - -private: - QDnsLookupPrivate *d_ptr; - Q_DECLARE_PRIVATE(QDnsLookup) - Q_PRIVATE_SLOT(d_func(), void _q_lookupFinished(const QDnsLookupReply &reply)) -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#include "qdnslookup_p.h" - -#endif // QDNSLOOKUP_H diff --git a/src/base/qdnslookup_p.h b/src/base/qdnslookup_p.h deleted file mode 100644 index 4797f345..00000000 --- a/src/base/qdnslookup_p.h +++ /dev/null @@ -1,216 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org> -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QDNSLOOKUP_P_H -#define QDNSLOOKUP_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of the QDnsLookup class. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// - -#include <QHostAddress> -#include <QMetaType> -#include <QMutex> -#include <QRunnable> -#include <QSharedPointer> -#include <QThreadPool> - -#include "qdnslookup.h" - -QT_BEGIN_NAMESPACE - -//#define QDNSLOOKUP_DEBUG - -class QDnsLookupRunnable; - -class QDnsLookupReply -{ -public: - QDnsLookupReply() - : error(QDnsLookup::NoError) - { } - - QDnsLookup::Error error; - QString errorString; - - QList<QDnsDomainNameRecord> canonicalNameRecords; - QList<QDnsHostAddressRecord> hostAddressRecords; - QList<QDnsMailExchangeRecord> mailExchangeRecords; - QList<QDnsDomainNameRecord> nameServerRecords; - QList<QDnsDomainNameRecord> pointerRecords; - QList<QDnsServiceRecord> serviceRecords; - QList<QDnsTextRecord> textRecords; -}; - -class QDnsLookupPrivate -{ -public: - QDnsLookupPrivate(QDnsLookup *qq) - : isFinished(false) - , type(QDnsLookup::A) - , runnable(0) - , q_ptr(qq) - { } - - void _q_lookupFinished(const QDnsLookupReply &reply); - - bool isFinished; - QString name; - QDnsLookup::Type type; - QDnsLookupReply reply; - QDnsLookupRunnable *runnable; - QDnsLookup *q_ptr; - - Q_DECLARE_PUBLIC(QDnsLookup) -}; - -class QDnsLookupRunnable : public QObject, public QRunnable -{ - Q_OBJECT - -public: - QDnsLookupRunnable(QDnsLookup::Type type, const QByteArray &name) - : requestType(type) - , requestName(name) - { } - void run(); - -signals: - void finished(const QDnsLookupReply &reply); - -private: - static void query(const int requestType, const QByteArray &requestName, QDnsLookupReply *reply); - QDnsLookup::Type requestType; - QByteArray requestName; -}; - -class QDnsLookupThreadPool : public QThreadPool -{ - Q_OBJECT - -public: - QDnsLookupThreadPool(); - void start(QRunnable *runnable); - -private slots: - void _q_applicationDestroyed(); - -private: - QMutex signalsMutex; - bool signalsConnected; -}; - -class QDnsRecordPrivate : public QSharedData -{ -public: - QDnsRecordPrivate() - : timeToLive(0) - { } - - QString name; - quint32 timeToLive; -}; - -class QDnsDomainNameRecordPrivate : public QDnsRecordPrivate -{ -public: - QDnsDomainNameRecordPrivate() - { } - - QString value; -}; - -class QDnsHostAddressRecordPrivate : public QDnsRecordPrivate -{ -public: - QDnsHostAddressRecordPrivate() - { } - - QHostAddress value; -}; - -class QDnsMailExchangeRecordPrivate : public QDnsRecordPrivate -{ -public: - QDnsMailExchangeRecordPrivate() - : preference(0) - { } - - QString exchange; - quint16 preference; -}; - -class QDnsServiceRecordPrivate : public QDnsRecordPrivate -{ -public: - QDnsServiceRecordPrivate() - : port(0), - priority(0), - weight(0) - { } - - QString target; - quint16 port; - quint16 priority; - quint16 weight; -}; - -class QDnsTextRecordPrivate : public QDnsRecordPrivate -{ -public: - QDnsTextRecordPrivate() - { } - - QList<QByteArray> values; -}; - -QT_END_NAMESPACE - -Q_DECLARE_METATYPE(QDnsLookupReply) - -#endif // QDNSLOOKUP_P_H diff --git a/src/base/qdnslookup_stub.cpp b/src/base/qdnslookup_stub.cpp deleted file mode 100644 index df9ed349..00000000 --- a/src/base/qdnslookup_stub.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org> -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qdnslookup_p.h" - -QT_BEGIN_NAMESPACE - -void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, QDnsLookupReply *reply) -{ - Q_UNUSED(requestType); - Q_UNUSED(requestName); - reply->error = QDnsLookup::ResolverError; - reply->errorString = QLatin1String("QDnsLookup is not implemented for this platform"); -} - -QT_END_NAMESPACE diff --git a/src/base/qdnslookup_symbian.cpp b/src/base/qdnslookup_symbian.cpp deleted file mode 100644 index bed5278e..00000000 --- a/src/base/qdnslookup_symbian.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org> -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qdnslookup_p.h" - -#include <QUrl> -#include <QMutex> -#include <QLibrary> - -#include <dns_qry.h> - -QT_BEGIN_NAMESPACE - -void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, QDnsLookupReply *reply) -{ - RHostResolver dnsResolver; - RSocketServ dnsSocket; - - // Initialise resolver. - TInt err = dnsSocket.Connect(); - err = dnsResolver.Open(dnsSocket, KAfInet, KProtocolInetUdp); - if (err != KErrNone) { - reply->error = QDnsLookup::ResolverError; - reply->errorString = QLatin1String("RHostResolver::Open failed"); - return; - } - - // Perform DNS query. - TDnsQueryBuf dnsQuery; - TDnsRespSRVBuf dnsResponse; - dnsQuery().SetClass(KDnsRRClassIN); - TPtrC8 queryPtr(reinterpret_cast<const TUint8*>(requestName.constData()), requestName.size()); - dnsQuery().SetData(queryPtr); - dnsQuery().SetType(requestType); - err = dnsResolver.Query(dnsQuery, dnsResponse); - if (err != KErrNone) { - reply->error = QDnsLookup::NotFoundError; - reply->errorString = QLatin1String("RHostResolver::Query failed"); - return; - } - - // Extract results. - while (err == KErrNone) { - const QByteArray aceName((const char*)dnsResponse().Target().Ptr(), - dnsResponse().Target().Length()); - - QDnsServiceRecord record; - record.d->name = QUrl::fromAce(requestName); - record.d->target = QUrl::fromAce(aceName); - record.d->port = dnsResponse().Port(); - record.d->priority = dnsResponse().Priority(); - record.d->timeToLive = dnsResponse().RRTtl(); - record.d->weight = dnsResponse().Weight(); - reply->serviceRecords.append(record); - - err = dnsResolver.QueryGetNext(dnsResponse); - } -} - -QT_END_NAMESPACE diff --git a/src/base/qdnslookup_unix.cpp b/src/base/qdnslookup_unix.cpp deleted file mode 100644 index f4d1c64c..00000000 --- a/src/base/qdnslookup_unix.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org> -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qdnslookup_p.h" - -#include <QLibrary> -#include <QMutex> -#include <QScopedPointer> -#include <QUrl> - -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <arpa/nameser_compat.h> -#include <resolv.h> - -QT_BEGIN_NAMESPACE - -static QMutex local_res_mutex; -typedef int (*dn_expand_proto)(const unsigned char *, const unsigned char *, const unsigned char *, char *, int); -static dn_expand_proto local_dn_expand = 0; -typedef void (*res_nclose_proto)(res_state); -static res_nclose_proto local_res_nclose = 0; -typedef int (*res_ninit_proto)(res_state); -static res_ninit_proto local_res_ninit = 0; -typedef int (*res_nquery_proto)(res_state, const char *, int, int, unsigned char *, int); -static res_nquery_proto local_res_nquery = 0; - -// Custom deleter to close resolver state. - -struct QDnsLookupStateDeleter -{ - static inline void cleanup(struct __res_state *pointer) - { - local_res_nclose(pointer); - } -}; - -static void resolveLibrary() -{ - QLibrary lib(QLatin1String("resolv")); - if (!lib.load()) - return; - - local_dn_expand = dn_expand_proto(lib.resolve("__dn_expand")); - if (!local_dn_expand) - local_dn_expand = dn_expand_proto(lib.resolve("dn_expand")); - - local_res_nclose = res_nclose_proto(lib.resolve("__res_nclose")); - if (!local_res_nclose) - local_res_nclose = res_nclose_proto(lib.resolve("res_9_nclose")); - if (!local_res_nclose) - local_res_nclose = res_nclose_proto(lib.resolve("res_nclose")); - - local_res_ninit = res_ninit_proto(lib.resolve("__res_ninit")); - if (!local_res_ninit) - local_res_ninit = res_ninit_proto(lib.resolve("res_9_ninit")); - if (!local_res_ninit) - local_res_ninit = res_ninit_proto(lib.resolve("res_ninit")); - - local_res_nquery = res_nquery_proto(lib.resolve("__res_nquery")); - if (!local_res_nquery) - local_res_nquery = res_nquery_proto(lib.resolve("res_9_nquery")); - if (!local_res_nquery) - local_res_nquery = res_nquery_proto(lib.resolve("res_nquery")); -} - -void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, QDnsLookupReply *reply) -{ - // Load dn_expand, res_ninit and res_nquery on demand. - static volatile bool triedResolve = false; - if (!triedResolve) { - QMutexLocker locker(&local_res_mutex); - if (!triedResolve) { - resolveLibrary(); - triedResolve = true; - } - } - - // If dn_expand, res_ninit or res_nquery is missing, fail. - if (!local_dn_expand || !local_res_nclose || !local_res_ninit || !local_res_nquery) { - reply->error = QDnsLookup::ResolverError; - reply->errorString = tr("Resolver functions not found"); - return; - } - - // Initialize state. - struct __res_state state; - memset(&state, 0, sizeof(state)); - if (local_res_ninit(&state) < 0) { - reply->error = QDnsLookup::ResolverError; - reply->errorString = tr("Resolver initialization failed"); - return; - } -#ifdef QDNSLOOKUP_DEBUG - state.options |= RES_DEBUG; -#endif - QScopedPointer<struct __res_state, QDnsLookupStateDeleter> state_ptr(&state); - - // Perform DNS query. - unsigned char response[PACKETSZ]; - memset(response, 0, sizeof(response)); - const int responseLength = local_res_nquery(&state, requestName, C_IN, requestType, response, sizeof(response)); - - // Check the response header. - HEADER *header = (HEADER*)response; - const int answerCount = ntohs(header->ancount); - switch (header->rcode) { - case NOERROR: - break; - case FORMERR: - reply->error = QDnsLookup::InvalidRequestError; - reply->errorString = tr("Server could not process query"); - return; - case SERVFAIL: - reply->error = QDnsLookup::ServerFailureError; - reply->errorString = tr("Server failure"); - return; - case NXDOMAIN: - reply->error = QDnsLookup::NotFoundError; - reply->errorString = tr("Non existent domain"); - return; - case REFUSED: - reply->error = QDnsLookup::ServerRefusedError; - reply->errorString = tr("Server refused to answer"); - return; - default: - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid reply received"); - return; - } - - // Check the reply is valid. - if (responseLength < int(sizeof(HEADER))) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid reply received"); - return; - } - - // Skip the query host, type (2 bytes) and class (2 bytes). - char host[PACKETSZ], answer[PACKETSZ]; - unsigned char *p = response + sizeof(HEADER); - int status = local_dn_expand(response, response + responseLength, p, host, sizeof(host)); - if (status < 0) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Could not expand domain name"); - return; - } - p += status + 4; - - // Extract results. - int answerIndex = 0; - while ((p < response + responseLength) && (answerIndex < answerCount)) { - status = local_dn_expand(response, response + responseLength, p, host, sizeof(host)); - if (status < 0) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Could not expand domain name"); - return; - } - const QString name = QUrl::fromAce(host); - - p += status; - const quint16 type = (p[0] << 8) | p[1]; - p += 2; // RR type - p += 2; // RR class - const quint32 ttl = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; - p += 4; - const quint16 size = (p[0] << 8) | p[1]; - p += 2; - - if (type == QDnsLookup::A) { - if (size != 4) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid IPv4 address record"); - return; - } - const quint32 addr = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; - QDnsHostAddressRecord record; - record.d->name = name; - record.d->timeToLive = ttl; - record.d->value = QHostAddress(addr); - reply->hostAddressRecords.append(record); - } else if (type == QDnsLookup::AAAA) { - if (size != 16) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid IPv6 address record"); - return; - } - QDnsHostAddressRecord record; - record.d->name = name; - record.d->timeToLive = ttl; - record.d->value = QHostAddress(p); - reply->hostAddressRecords.append(record); - } else if (type == QDnsLookup::CNAME) { - status = local_dn_expand(response, response + responseLength, p, answer, sizeof(answer)); - if (status < 0) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid canonical name record"); - return; - } - QDnsDomainNameRecord record; - record.d->name = name; - record.d->timeToLive = ttl; - record.d->value = QUrl::fromAce(answer); - reply->canonicalNameRecords.append(record); - } else if (type == QDnsLookup::NS) { - status = local_dn_expand(response, response + responseLength, p, answer, sizeof(answer)); - if (status < 0) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid name server record"); - return; - } - QDnsDomainNameRecord record; - record.d->name = name; - record.d->timeToLive = ttl; - record.d->value = QUrl::fromAce(answer); - reply->nameServerRecords.append(record); - } else if (type == QDnsLookup::PTR) { - status = local_dn_expand(response, response + responseLength, p, answer, sizeof(answer)); - if (status < 0) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid pointer record"); - return; - } - QDnsDomainNameRecord record; - record.d->name = name; - record.d->timeToLive = ttl; - record.d->value = QUrl::fromAce(answer); - reply->pointerRecords.append(record); - } else if (type == QDnsLookup::MX) { - const quint16 preference = (p[0] << 8) | p[1]; - status = local_dn_expand(response, response + responseLength, p + 2, answer, sizeof(answer)); - if (status < 0) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid mail exchange record"); - return; - } - QDnsMailExchangeRecord record; - record.d->exchange = QUrl::fromAce(answer); - record.d->name = name; - record.d->preference = preference; - record.d->timeToLive = ttl; - reply->mailExchangeRecords.append(record); - } else if (type == QDnsLookup::SRV) { - const quint16 priority = (p[0] << 8) | p[1]; - const quint16 weight = (p[2] << 8) | p[3]; - const quint16 port = (p[4] << 8) | p[5]; - status = local_dn_expand(response, response + responseLength, p + 6, answer, sizeof(answer)); - if (status < 0) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid service record"); - return; - } - QDnsServiceRecord record; - record.d->name = name; - record.d->target = QUrl::fromAce(answer); - record.d->port = port; - record.d->priority = priority; - record.d->timeToLive = ttl; - record.d->weight = weight; - reply->serviceRecords.append(record); - } else if (type == QDnsLookup::TXT) { - unsigned char *txt = p; - QDnsTextRecord record; - record.d->name = name; - record.d->timeToLive = ttl; - while (txt < p + size) { - const unsigned char length = *txt; - txt++; - if (txt + length > p + size) { - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid text record"); - return; - } - record.d->values << QByteArray((char*)txt, length); - txt += length; - } - reply->textRecords.append(record); - } - p += size; - answerIndex++; - } -} - -QT_END_NAMESPACE diff --git a/src/base/qdnslookup_win.cpp b/src/base/qdnslookup_win.cpp deleted file mode 100644 index d89ec623..00000000 --- a/src/base/qdnslookup_win.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Jeremy Lainé <jeremy.laine@m4x.org> -** Contact: http://www.qt-project.org/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <winsock2.h> -#include "qdnslookup_p.h" - -#include <QUrl> -#include <QMutex> -#include <QLibrary> - -#include <windows.h> -#include <windns.h> - -QT_BEGIN_NAMESPACE - -void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, QDnsLookupReply *reply) -{ - // Perform DNS query. - PDNS_RECORD dns_records = 0; - const DNS_STATUS status = DnsQuery_UTF8(requestName, requestType, DNS_QUERY_STANDARD, NULL, &dns_records, NULL); - switch (status) { - case ERROR_SUCCESS: - break; - case DNS_ERROR_RCODE_FORMAT_ERROR: - reply->error = QDnsLookup::InvalidRequestError; - reply->errorString = tr("Server could not process query"); - return; - case DNS_ERROR_RCODE_SERVER_FAILURE: - reply->error = QDnsLookup::ServerFailureError; - reply->errorString = tr("Server failure"); - return; - case DNS_ERROR_RCODE_NAME_ERROR: - reply->error = QDnsLookup::NotFoundError; - reply->errorString = tr("Non existent domain"); - return; - case DNS_ERROR_RCODE_REFUSED: - reply->error = QDnsLookup::ServerRefusedError; - reply->errorString = tr("Server refused to answer"); - return; - default: - reply->error = QDnsLookup::InvalidReplyError; - reply->errorString = tr("Invalid reply received"); - return; - } - - // Extract results. - for (PDNS_RECORD ptr = dns_records; ptr != NULL; ptr = ptr->pNext) { - const QString name = QUrl::fromAce((char*)ptr->pName); - if (ptr->wType == QDnsLookup::A) { - QDnsHostAddressRecord record; - record.d->name = name; - record.d->timeToLive = ptr->dwTtl; - record.d->value = QHostAddress(ntohl(ptr->Data.A.IpAddress)); - reply->hostAddressRecords.append(record); - } else if (ptr->wType == QDnsLookup::AAAA) { - Q_IPV6ADDR addr; - memcpy(&addr, &ptr->Data.AAAA.Ip6Address, sizeof(Q_IPV6ADDR)); - - QDnsHostAddressRecord record; - record.d->name = name; - record.d->timeToLive = ptr->dwTtl; - record.d->value = QHostAddress(addr); - reply->hostAddressRecords.append(record); - } else if (ptr->wType == QDnsLookup::CNAME) { - QDnsDomainNameRecord record; - record.d->name = name; - record.d->timeToLive = ptr->dwTtl; - record.d->value = QUrl::fromAce((char*)ptr->Data.Cname.pNameHost); - reply->canonicalNameRecords.append(record); - } else if (ptr->wType == QDnsLookup::MX) { - QDnsMailExchangeRecord record; - record.d->name = name; - record.d->exchange = QUrl::fromAce((char*)ptr->Data.Mx.pNameExchange); - record.d->preference = ptr->Data.Mx.wPreference; - record.d->timeToLive = ptr->dwTtl; - reply->mailExchangeRecords.append(record); - } else if (ptr->wType == QDnsLookup::NS) { - QDnsDomainNameRecord record; - record.d->name = name; - record.d->timeToLive = ptr->dwTtl; - record.d->value = QUrl::fromAce((char*)ptr->Data.Ns.pNameHost); - reply->nameServerRecords.append(record); - } else if (ptr->wType == QDnsLookup::PTR) { - QDnsDomainNameRecord record; - record.d->name = name; - record.d->timeToLive = ptr->dwTtl; - record.d->value = QUrl::fromAce((char*)ptr->Data.Ptr.pNameHost); - reply->pointerRecords.append(record); - } else if (ptr->wType == QDnsLookup::SRV) { - QDnsServiceRecord record; - record.d->name = name; - record.d->target = QUrl::fromAce((char*)ptr->Data.Srv.pNameTarget); - record.d->port = ptr->Data.Srv.wPort; - record.d->priority = ptr->Data.Srv.wPriority; - record.d->timeToLive = ptr->dwTtl; - record.d->weight = ptr->Data.Srv.wWeight; - reply->serviceRecords.append(record); - } else if (ptr->wType == QDnsLookup::TXT) { - QDnsTextRecord record; - record.d->name = name; - record.d->timeToLive = ptr->dwTtl; - for (unsigned int i = 0; i < ptr->Data.Txt.dwStringCount; ++i) { - record.d->values << QByteArray((char*)ptr->Data.Txt.pStringArray[i]); - } - reply->textRecords.append(record); - } - } - - DnsRecordListFree(dns_records, DnsFreeRecordList); -} - -QT_END_NAMESPACE |
