void qt_qhostinfo_clear_cache() { QHostInfoLookupManager* manager = theHostInfoLookupManager(); if (manager) { manager->clear(); } }
/*! Looks up the IP address(es) associated with host name \a name, and returns an ID for the lookup. When the result of the lookup is ready, the slot or signal \a member in \a receiver is called with a QHostInfo argument. The QHostInfo object can then be inspected to get the results of the lookup. The lookup is performed by a single function call, for example: \snippet doc/src/snippets/code/src_network_kernel_qhostinfo.cpp 2 The implementation of the slot prints basic information about the addresses returned by the lookup, or reports an error if it failed: \snippet doc/src/snippets/code/src_network_kernel_qhostinfo.cpp 3 If you pass a literal IP address to \a name instead of a host name, QHostInfo will search for the domain name for the IP (i.e., QHostInfo will perform a \e reverse lookup). On success, the resulting QHostInfo will contain both the resolved domain name and IP addresses for the host name. Example: \snippet doc/src/snippets/code/src_network_kernel_qhostinfo.cpp 4 \note There is no guarantee on the order the signals will be emitted if you start multiple requests with lookupHost(). \sa abortHostLookup(), addresses(), error(), fromName() */ int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member) { #if defined QHOSTINFO_DEBUG qDebug("QHostInfo::lookupHost(\"%s\", %p, %s)", name.toLatin1().constData(), receiver, member ? member + 1 : 0); #endif if (!QAbstractEventDispatcher::instance(QThread::currentThread())) { qWarning("QHostInfo::lookupHost() called with no event dispatcher"); return -1; } qRegisterMetaType<QHostInfo>("QHostInfo"); int id = theIdCounter.fetchAndAddRelaxed(1); // generate unique ID if (name.isEmpty()) { if (!receiver) return -1; QHostInfo hostInfo(id); hostInfo.setError(QHostInfo::HostNotFound); hostInfo.setErrorString(QCoreApplication::translate("QHostInfo", "No host name given")); QScopedPointer<QHostInfoResult> result(new QHostInfoResult); QObject::connect(result.data(), SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); result.data()->emitResultsReady(hostInfo); return id; } QHostInfoLookupManager *manager = theHostInfoLookupManager(); if (manager) { // the application is still alive if (manager->cache.isEnabled()) { // check cache first bool valid = false; QHostInfo info = manager->cache.get(name, &valid); if (valid) { if (!receiver) return -1; info.setLookupId(id); QHostInfoResult result; QObject::connect(&result, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); result.emitResultsReady(info); return id; } } // cache is not enabled or it was not in the cache, do normal lookup QHostInfoRunnable* runnable = new QHostInfoRunnable(name, id); if (receiver) QObject::connect(&runnable->resultEmitter, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); manager->scheduleLookup(runnable); } return id; }
// the QHostInfoLookupManager will at some point call this via a QThreadPool void QHostInfoRunnable::run() { QHostInfoLookupManager *manager = theHostInfoLookupManager(); // check aborted if (manager->wasAborted(id)) { manager->lookupFinished(this); return; } // check cache // FIXME // if not in cache: OS lookup QHostInfo hostInfo = QHostInfoAgent::fromName(toBeLookedUp); // save to cache // FIXME // check aborted again if (manager->wasAborted(id)) { manager->lookupFinished(this); return; } // signal emission hostInfo.setLookupId(id); resultEmitter.emitResultsReady(hostInfo); manager->lookupFinished(this); // thread goes back to QThreadPool }
// the QHostInfoLookupManager will at some point call this via a QThreadPool void QHostInfoRunnable::run() { QHostInfoLookupManager *manager = theHostInfoLookupManager(); // check aborted if (manager->wasAborted(id)) { manager->lookupFinished(this); return; } QHostInfo hostInfo; // QHostInfo::lookupHost already checks the cache. However we need to check // it here too because it might have been cache saved by another QHostInfoRunnable // in the meanwhile while this QHostInfoRunnable was scheduled but not running if (manager->cache.isEnabled()) { // check the cache first bool valid = false; hostInfo = manager->cache.get(toBeLookedUp, &valid); if (!valid) { // not in cache, we need to do the lookup and store the result in the cache hostInfo = QHostInfoAgent::fromName(toBeLookedUp); manager->cache.put(toBeLookedUp, hostInfo); } } else { // cache is not enabled, just do the lookup and continue hostInfo = QHostInfoAgent::fromName(toBeLookedUp); } // check aborted again if (manager->wasAborted(id)) { manager->lookupFinished(this); return; } // signal emission hostInfo.setLookupId(id); resultEmitter.emitResultsReady(hostInfo); // now also iterate through the postponed ones { QMutexLocker locker(&manager->mutex); QMutableListIterator<QHostInfoRunnable*> iterator(manager->postponedLookups); while (iterator.hasNext()) { QHostInfoRunnable* postponed = iterator.next(); if (toBeLookedUp == postponed->toBeLookedUp) { // we can now emit iterator.remove(); hostInfo.setLookupId(postponed->id); postponed->resultEmitter.emitResultsReady(hostInfo); delete postponed; } } } manager->lookupFinished(this); // thread goes back to QThreadPool }
/*! Looks up the IP address(es) associated with host name \a name, and returns an ID for the lookup. When the result of the lookup is ready, the slot or signal \a member in \a receiver is called with a QHostInfo argument. The QHostInfo object can then be inspected to get the results of the lookup. The lookup is performed by a single function call, for example: \snippet doc/src/snippets/code/src_network_kernel_qhostinfo.cpp 2 The implementation of the slot prints basic information about the addresses returned by the lookup, or reports an error if it failed: \snippet doc/src/snippets/code/src_network_kernel_qhostinfo.cpp 3 If you pass a literal IP address to \a name instead of a host name, QHostInfo will search for the domain name for the IP (i.e., QHostInfo will perform a \e reverse lookup). On success, the resulting QHostInfo will contain both the resolved domain name and IP addresses for the host name. Example: \snippet doc/src/snippets/code/src_network_kernel_qhostinfo.cpp 4 \note There is no guarantee on the order the signals will be emitted if you start multiple requests with lookupHost(). \sa abortHostLookup(), addresses(), error(), fromName() */ int QHostInfo::lookupHost(const QString &name, QObject *receiver, const char *member) { #if defined QHOSTINFO_DEBUG qDebug("QHostInfo::lookupHost(\"%s\", %p, %s)", name.toLatin1().constData(), receiver, member ? member + 1 : 0); #endif if (!QAbstractEventDispatcher::instance(QThread::currentThread())) { qWarning("QHostInfo::lookupHost() called with no event dispatcher"); return -1; } qRegisterMetaType<QHostInfo>("QHostInfo"); int id = theIdCounter.fetchAndAddRelaxed(1); // generate unique ID if (name.isEmpty()) { QHostInfo hostInfo(id); hostInfo.setError(QHostInfo::HostNotFound); hostInfo.setErrorString(QCoreApplication::translate("QHostInfo", "No host name given")); QScopedPointer<QHostInfoResult> result(new QHostInfoResult); QObject::connect(result.data(), SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); result.data()->emitResultsReady(hostInfo); return id; } #ifndef Q_OS_SYMBIAN QHostInfoLookupManager *manager = theHostInfoLookupManager(); if (manager) { // the application is still alive if (manager->cache.isEnabled()) { // check cache first bool valid = false; QHostInfo info = manager->cache.get(name, &valid); if (valid) { info.setLookupId(id); QHostInfoResult result; QObject::connect(&result, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); result.emitResultsReady(info); return id; } } // cache is not enabled or it was not in the cache, do normal lookup QHostInfoRunnable* runnable = new QHostInfoRunnable(name, id); QObject::connect(&runnable->resultEmitter, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); manager->scheduleLookup(runnable); } #else QSymbianHostInfoLookupManager *manager = theHostInfoLookupManager(); if (manager) { // the application is still alive if (manager->cache.isEnabled()) { // check cache first bool valid = false; QHostInfo info = manager->cache.get(name, &valid); if (valid) { info.setLookupId(id); QHostInfoResult result; QObject::connect(&result, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); result.emitResultsReady(info); return id; } } // cache is not enabled or it was not in the cache, do normal lookup #ifndef QT_NO_BEARERMANAGEMENT QSharedPointer<QNetworkSession> networkSession; QVariant v(receiver->property("_q_networksession")); if (v.isValid()) networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(v); #endif QSymbianHostResolver *symbianResolver = 0; QT_TRAP_THROWING(symbianResolver = new QSymbianHostResolver(name, id, networkSession)); QObject::connect(&symbianResolver->resultEmitter, SIGNAL(resultsReady(QHostInfo)), receiver, member, Qt::QueuedConnection); manager->scheduleLookup(symbianResolver); } #endif return id; }