diff options
author | Liang Qi <liang.qi@qt.io> | 2016-05-12 07:31:50 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-05-12 08:33:08 +0200 |
commit | 990969655c5fb4d03682e96df9b12101f5ee9815 (patch) | |
tree | b8fb5c50285105c8bc5a938fb50f93ff9f24889d /src/network | |
parent | a213011a53f12f101d08a04afc8fdacd2d54a232 (diff) | |
parent | e64b2234e829cc47872225debcf80d6c06db18f0 (diff) |
Merge remote-tracking branch 'origin/5.7' into dev
Conflicts:
config_help.txt
configure
src/corelib/io/qprocess_wince.cpp
src/plugins/platforms/windows/qwindowstheme.cpp
src/plugins/platforms/xcb/qxcbbackingstore.cpp
tests/auto/corelib/tools/qtimezone/BLACKLIST
tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
Change-Id: I26644d1cb3b78412c8ff285e2a55bea1bd641c01
Diffstat (limited to 'src/network')
51 files changed, 364 insertions, 357 deletions
diff --git a/src/network/access/qftp.cpp b/src/network/access/qftp.cpp index 59f18015a5..23ec390ae5 100644 --- a/src/network/access/qftp.cpp +++ b/src/network/access/qftp.cpp @@ -542,7 +542,7 @@ static void _q_parseUnixDir(const QStringList &tokens, const QString &userName, // Resolve permissions int permissions = 0; - QString p = tokens.at(2); + const QString &p = tokens.at(2); permissions |= (p[0] == QLatin1Char('r') ? QUrlInfo::ReadOwner : 0); permissions |= (p[1] == QLatin1Char('w') ? QUrlInfo::WriteOwner : 0); permissions |= (p[2] == QLatin1Char('x') ? QUrlInfo::ExeOwner : 0); @@ -947,7 +947,7 @@ void QFtpPI::readyRead() const int lowerLimit[3] = {1,0,0}; const int upperLimit[3] = {5,5,9}; for (int i=0; i<3; i++) { - replyCode[i] = line[i].digitValue(); + replyCode[i] = line.at(i).digitValue(); if (replyCode[i]<lowerLimit[i] || replyCode[i]>upperLimit[i]) { // protocol error return; @@ -1072,7 +1072,7 @@ bool QFtpPI::processReply() #endif // this error should be reported } else { - QStringList lst = addrPortPattern.capturedTexts(); + const QStringList lst = addrPortPattern.capturedTexts(); QString host = lst[1] + QLatin1Char('.') + lst[2] + QLatin1Char('.') + lst[3] + QLatin1Char('.') + lst[4]; quint16 port = (lst[5].toUInt() << 8) + lst[6].toUInt(); waitForDtpToConnect = true; @@ -1098,7 +1098,7 @@ bool QFtpPI::processReply() } else if (replyCodeInt == 230) { if (currentCmd.startsWith(QLatin1String("USER ")) && pendingCommands.count()>0 && - pendingCommands.first().startsWith(QLatin1String("PASS "))) { + pendingCommands.constFirst().startsWith(QLatin1String("PASS "))) { // no need to send the PASS -- we are already logged in pendingCommands.pop_front(); } @@ -1177,7 +1177,7 @@ bool QFtpPI::startNextCmd() emit finished(replyText); return false; } - currentCmd = pendingCommands.first(); + currentCmd = pendingCommands.constFirst(); // PORT and PASV are edited in-place, depending on whether we // should try the extended transfer connection commands EPRT and @@ -2241,7 +2241,7 @@ void QFtpPrivate::_q_startNextCommand() Q_Q(QFtp); if (pending.isEmpty()) return; - QFtpCommand *c = pending.first(); + QFtpCommand *c = pending.constFirst(); error = QFtp::NoError; errorString = QT_TRANSLATE_NOOP(QFtp, QLatin1String("Unknown error")); @@ -2253,7 +2253,7 @@ void QFtpPrivate::_q_startNextCommand() // Proxy support, replace the Login argument in place, then fall // through. if (c->command == QFtp::Login && !proxyHost.isEmpty()) { - QString loginString = c->rawCmds.first().trimmed(); + QString loginString = c->rawCmds.constFirst().trimmed(); loginString += QLatin1Char('@') + host; if (port && port != 21) loginString += QLatin1Char(':') + QString::number(port); @@ -2264,8 +2264,8 @@ void QFtpPrivate::_q_startNextCommand() if (c->command == QFtp::SetTransferMode) { _q_piFinished(QLatin1String("Transfer mode set")); } else if (c->command == QFtp::SetProxy) { - proxyHost = c->rawCmds[0]; - proxyPort = c->rawCmds[1].toUInt(); + proxyHost = c->rawCmds.at(0); + proxyPort = c->rawCmds.at(1).toUInt(); c->rawCmds.clear(); _q_piFinished(QLatin1String("Proxy set to ") + proxyHost + QLatin1Char(':') + QString::number(proxyPort)); } else if (c->command == QFtp::ConnectToHost) { @@ -2274,11 +2274,11 @@ void QFtpPrivate::_q_startNextCommand() pi.setProperty("_q_networksession", q->property("_q_networksession")); #endif if (!proxyHost.isEmpty()) { - host = c->rawCmds[0]; - port = c->rawCmds[1].toUInt(); + host = c->rawCmds.at(0); + port = c->rawCmds.at(1).toUInt(); pi.connectToHost(proxyHost, proxyPort); } else { - pi.connectToHost(c->rawCmds[0], c->rawCmds[1].toUInt()); + pi.connectToHost(c->rawCmds.at(0), c->rawCmds.at(1).toUInt()); } } else { if (c->command == QFtp::Put) { @@ -2313,7 +2313,7 @@ void QFtpPrivate::_q_piFinished(const QString&) { if (pending.isEmpty()) return; - QFtpCommand *c = pending.first(); + QFtpCommand *c = pending.constFirst(); if (c->command == QFtp::Close) { // The order of in which the slots are called is arbitrary, so @@ -2348,7 +2348,7 @@ void QFtpPrivate::_q_piError(int errorCode, const QString &text) return; } - QFtpCommand *c = pending.first(); + QFtpCommand *c = pending.constFirst(); // non-fatal errors if (c->command == QFtp::Get && pi.currentCommand().startsWith(QLatin1String("SIZE "))) { diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index 69687b5ab8..79f418f675 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -520,8 +520,8 @@ QUrl QHttpNetworkConnectionPrivate::parseRedirectResponse(QAbstractSocket *socke return QUrl(); QUrl rUrl; - QList<QPair<QByteArray, QByteArray> > fields = reply->header(); - foreach (const QNetworkReply::RawHeaderPair &header, fields) { + const QList<QPair<QByteArray, QByteArray> > fields = reply->header(); + for (const QNetworkReply::RawHeaderPair &header : fields) { if (header.first.toLower() == "location") { rUrl = QUrl::fromEncoded(header.second); break; @@ -691,7 +691,7 @@ bool QHttpNetworkConnectionPrivate::dequeueRequest(QAbstractSocket *socket) return false; } -QHttpNetworkRequest QHttpNetworkConnectionPrivate::predictNextRequest() +QHttpNetworkRequest QHttpNetworkConnectionPrivate::predictNextRequest() const { if (!highPriorityQueue.isEmpty()) return highPriorityQueue.last().first; @@ -1148,7 +1148,8 @@ void QHttpNetworkConnectionPrivate::_q_hostLookupFinished(const QHostInfo &info) if (networkLayerState == IPv4 || networkLayerState == IPv6 || networkLayerState == IPv4or6) return; - foreach (const QHostAddress &address, info.addresses()) { + const auto addresses = info.addresses(); + for (const QHostAddress &address : addresses) { const QAbstractSocket::NetworkLayerProtocol protocol = address.protocol(); if (protocol == QAbstractSocket::IPv4Protocol) { if (!foundAddress) { diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index 3937ef0e87..e05bc1df74 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -213,7 +213,7 @@ public: void requeueRequest(const HttpMessagePair &pair); // e.g. after pipeline broke bool dequeueRequest(QAbstractSocket *socket); void prepareRequest(HttpMessagePair &request); - QHttpNetworkRequest predictNextRequest(); + QHttpNetworkRequest predictNextRequest() const; void fillPipeline(QAbstractSocket *socket); bool fillPipeline(QList<HttpMessagePair> &queue, QHttpNetworkConnectionChannel &channel); diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp index 793a3b3452..153a33f782 100644 --- a/src/network/access/qnetworkaccessftpbackend.cpp +++ b/src/network/access/qnetworkaccessftpbackend.cpp @@ -121,7 +121,8 @@ void QNetworkAccessFtpBackend::open() { #ifndef QT_NO_NETWORKPROXY QNetworkProxy proxy; - foreach (const QNetworkProxy &p, proxyList()) { + const auto proxies = proxyList(); + for (const QNetworkProxy &p : proxies) { // use the first FTP proxy // or no proxy at all if (p.type() == QNetworkProxy::FtpCachingProxy diff --git a/src/network/access/qnetworkcookiejar.cpp b/src/network/access/qnetworkcookiejar.cpp index 398895e92f..283dd3509e 100644 --- a/src/network/access/qnetworkcookiejar.cpp +++ b/src/network/access/qnetworkcookiejar.cpp @@ -188,7 +188,7 @@ bool QNetworkCookieJar::setCookiesFromUrl(const QList<QNetworkCookie> &cookieLis const QUrl &url) { bool added = false; - foreach (QNetworkCookie cookie, cookieList) { + for (QNetworkCookie cookie : cookieList) { cookie.normalize(url); if (validateCookie(cookie, url) && insertCookie(cookie)) added = true; diff --git a/src/network/access/qnetworkdiskcache.cpp b/src/network/access/qnetworkdiskcache.cpp index 68c962636e..ce3b773c64 100644 --- a/src/network/access/qnetworkdiskcache.cpp +++ b/src/network/access/qnetworkdiskcache.cpp @@ -189,7 +189,8 @@ QIODevice *QNetworkDiskCache::prepare(const QNetworkCacheMetaData &metaData) return 0; } - foreach (const QNetworkCacheMetaData::RawHeader &header, metaData.rawHeaders()) { + const auto headers = metaData.rawHeaders(); + for (const auto &header : headers) { if (header.first.toLower() == "content-length") { const qint64 size = header.second.toLongLong(); if (size > (maximumCacheSize() * 3)/4) @@ -639,7 +640,8 @@ bool QCacheItem::canCompress() const { bool sizeOk = false; bool typeOk = false; - foreach (const QNetworkCacheMetaData::RawHeader &header, metaData.rawHeaders()) { + const auto headers = metaData.rawHeaders(); + for (const auto &header : headers) { if (header.first.toLower() == "content-length") { qint64 size = header.second.toLongLong(); if (size > MAX_COMPRESSION_SIZE) diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp index 6b77ab303f..e27391f760 100644 --- a/src/network/access/qnetworkreplyhttpimpl.cpp +++ b/src/network/access/qnetworkreplyhttpimpl.cpp @@ -641,7 +641,8 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq QNetworkProxy transparentProxy, cacheProxy; // FIXME the proxy stuff should be done in the HTTP thread - foreach (const QNetworkProxy &p, managerPrivate->queryProxy(QNetworkProxyQuery(newHttpRequest.url()))) { + const auto proxies = managerPrivate->queryProxy(QNetworkProxyQuery(newHttpRequest.url())); + for (const QNetworkProxy &p : proxies) { // use the first proxy that works // for non-encrypted connections, any transparent or HTTP proxy // for encrypted, only transparent proxies @@ -744,7 +745,7 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq } } - foreach (const QByteArray &header, headers) + for (const QByteArray &header : qAsConst(headers)) httpRequest.setHeaderField(header, newHttpRequest.rawHeader(header)); if (newHttpRequest.attribute(QNetworkRequest::HttpPipeliningAllowedAttribute).toBool()) @@ -1505,8 +1506,8 @@ QNetworkCacheMetaData QNetworkReplyHttpImplPrivate::fetchCacheMetaData(const QNe cacheHeaders.setAllRawHeaders(metaData.rawHeaders()); QNetworkHeadersPrivate::RawHeadersList::ConstIterator it; - QList<QByteArray> newHeaders = q->rawHeaderList(); - foreach (QByteArray header, newHeaders) { + const QList<QByteArray> newHeaders = q->rawHeaderList(); + for (QByteArray header : newHeaders) { QByteArray originalHeader = header; header = header.toLower(); bool hop_by_hop = @@ -1949,7 +1950,7 @@ void QNetworkReplyHttpImplPrivate::_q_networkSessionConnected() void QNetworkReplyHttpImplPrivate::_q_networkSessionStateChanged(QNetworkSession::State sessionState) { if (sessionState == QNetworkSession::Disconnected - && (state != Idle || state != Reconnecting)) { + && state != Idle && state != Reconnecting) { error(QNetworkReplyImpl::NetworkSessionFailedError, QCoreApplication::translate("QNetworkReply", "Network session error.")); finished(); diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp index 4203169cae..d69d5983cb 100644 --- a/src/network/access/qnetworkreplyimpl.cpp +++ b/src/network/access/qnetworkreplyimpl.cpp @@ -325,7 +325,7 @@ void QNetworkReplyImplPrivate::_q_networkSessionConnected() void QNetworkReplyImplPrivate::_q_networkSessionStateChanged(QNetworkSession::State sessionState) { if (sessionState == QNetworkSession::Disconnected - && (state != Idle || state != Reconnecting)) { + && state != Idle && state != Reconnecting) { error(QNetworkReplyImpl::NetworkSessionFailedError, QCoreApplication::translate("QNetworkReply", "Network session error.")); finished(); @@ -1110,21 +1110,17 @@ bool QNetworkReplyImplPrivate::migrateBackend() return true; // Backend does not support resuming download. - if (!backend->canResume()) + if (backend && !backend->canResume()) return false; state = QNetworkReplyPrivate::Reconnecting; - if (backend) { - delete backend; - backend = 0; - } - cookedHeaders.clear(); rawHeaders.clear(); preMigrationDownloaded = bytesDownloaded; + delete backend; backend = manager->d_func()->findBackend(operation, request); if (backend) { diff --git a/src/network/access/qnetworkreplynsurlconnectionimpl.mm b/src/network/access/qnetworkreplynsurlconnectionimpl.mm index 903e168a66..58a3ba1448 100644 --- a/src/network/access/qnetworkreplynsurlconnectionimpl.mm +++ b/src/network/access/qnetworkreplynsurlconnectionimpl.mm @@ -365,7 +365,8 @@ QNetworkReplyNSURLConnectionImpl::QNetworkReplyNSURLConnectionImpl(QObject *pare cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; // copy headers - foreach (const QByteArray &header, request.rawHeaderList()) { + const auto headers = request.rawHeaderList(); + for (const QByteArray &header : headers) { QByteArray headerValue = request.rawHeader(header); [nsRequest addValue:QString::fromUtf8(headerValue).toNSString() forHTTPHeaderField:QString::fromUtf8(header).toNSString()]; diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp index 2ee85fd049..63332d4fd1 100644 --- a/src/network/access/qnetworkrequest.cpp +++ b/src/network/access/qnetworkrequest.cpp @@ -779,7 +779,7 @@ static QByteArray headerValue(QNetworkRequest::KnownHeaders header, const QVaria QByteArray result; bool first = true; - foreach (const QNetworkCookie &cookie, cookies) { + for (const QNetworkCookie &cookie : qAsConst(cookies)) { if (!first) result += "; "; first = false; @@ -795,7 +795,7 @@ static QByteArray headerValue(QNetworkRequest::KnownHeaders header, const QVaria QByteArray result; bool first = true; - foreach (const QNetworkCookie &cookie, cookies) { + for (const QNetworkCookie &cookie : qAsConst(cookies)) { if (!first) result += ", "; first = false; @@ -857,8 +857,8 @@ static QVariant parseHttpDate(const QByteArray &raw) static QVariant parseCookieHeader(const QByteArray &raw) { QList<QNetworkCookie> result; - QList<QByteArray> cookieList = raw.split(';'); - foreach (const QByteArray &cookie, cookieList) { + const QList<QByteArray> cookieList = raw.split(';'); + for (const QByteArray &cookie : cookieList) { QList<QNetworkCookie> parsed = QNetworkCookie::parseCookies(cookie.trimmed()); if (parsed.count() != 1) return QVariant(); // invalid Cookie: header diff --git a/src/network/access/qspdyprotocolhandler.cpp b/src/network/access/qspdyprotocolhandler.cpp index 4641516549..a87599c77a 100644 --- a/src/network/access/qspdyprotocolhandler.cpp +++ b/src/network/access/qspdyprotocolhandler.cpp @@ -935,19 +935,7 @@ void QSpdyProtocolHandler::parseHttpHeaders(char flags, const QByteArray &frameD } else if (name == "content-length") { httpReply->setContentLength(value.toLongLong()); } else { - if (value.contains('\0')) { - QList<QByteArray> values = value.split('\0'); - QByteArray binder(", "); - if (name == "set-cookie") - binder = "\n"; - value.clear(); - Q_FOREACH (const QByteArray& ivalue, values) { - if (value.isEmpty()) - value = ivalue; - else - value += binder + ivalue; - } - } + value.replace('\0', name == "set-cookie" ? "\n" : ", "); httpReply->setHeaderField(name, value); } } diff --git a/src/network/bearer/qnetworkconfigmanager_p.cpp b/src/network/bearer/qnetworkconfigmanager_p.cpp index f2a79319a1..2da073fa5a 100644 --- a/src/network/bearer/qnetworkconfigmanager_p.cpp +++ b/src/network/bearer/qnetworkconfigmanager_p.cpp @@ -100,7 +100,7 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration( { QMutexLocker locker(&mutex); - foreach (QBearerEngine *engine, sessionEngines) { + for (QBearerEngine *engine : sessionEngines) { QNetworkConfigurationPrivatePointer ptr = engine->defaultConfiguration(); if (ptr) { QNetworkConfiguration config; @@ -114,16 +114,10 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration( // Return first active snap QNetworkConfigurationPrivatePointer defaultConfiguration; - foreach (QBearerEngine *engine, sessionEngines) { - QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator it; - QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator end; - + for (QBearerEngine *engine : sessionEngines) { QMutexLocker locker(&engine->mutex); - for (it = engine->snapConfigurations.begin(), - end = engine->snapConfigurations.end(); it != end; ++it) { - QNetworkConfigurationPrivatePointer ptr = it.value(); - + for (const auto &ptr : qAsConst(engine->snapConfigurations)) { QMutexLocker configLocker(&ptr->mutex); if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) { @@ -156,15 +150,11 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::defaultConfiguration( 6. Discovered Other */ - foreach (QBearerEngine *engine, sessionEngines) { - QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator it; - QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator end; + for (QBearerEngine *engine : sessionEngines) { QMutexLocker locker(&engine->mutex); - for (it = engine->accessPointConfigurations.begin(), - end = engine->accessPointConfigurations.end(); it != end; ++it) { - QNetworkConfigurationPrivatePointer ptr = it.value(); + for (const auto &ptr : qAsConst(engine->accessPointConfigurations)) { QMutexLocker configLocker(&ptr->mutex); QNetworkConfiguration::BearerType bearerType = ptr->bearerType; @@ -219,17 +209,12 @@ QList<QNetworkConfiguration> QNetworkConfigurationManagerPrivate::allConfigurati QMutexLocker locker(&mutex); - foreach (QBearerEngine *engine, sessionEngines) { - QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator it; - QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator end; + for (QBearerEngine *engine : sessionEngines) { QMutexLocker locker(&engine->mutex); //find all InternetAccessPoints - for (it = engine->accessPointConfigurations.begin(), - end = engine->accessPointConfigurations.end(); it != end; ++it) { - QNetworkConfigurationPrivatePointer ptr = it.value(); - + for (const auto &ptr : qAsConst(engine->accessPointConfigurations)) { QMutexLocker configLocker(&ptr->mutex); if ((ptr->state & filter) == filter) { @@ -240,10 +225,7 @@ QList<QNetworkConfiguration> QNetworkConfigurationManagerPrivate::allConfigurati } //find all service networks - for (it = engine->snapConfigurations.begin(), - end = engine->snapConfigurations.end(); it != end; ++it) { - QNetworkConfigurationPrivatePointer ptr = it.value(); - + for (const auto &ptr : qAsConst(engine->snapConfigurations)) { QMutexLocker configLocker(&ptr->mutex); if ((ptr->state & filter) == filter) { @@ -263,7 +245,7 @@ QNetworkConfiguration QNetworkConfigurationManagerPrivate::configurationFromIden QMutexLocker locker(&mutex); - foreach (QBearerEngine *engine, sessionEngines) { + for (QBearerEngine *engine : sessionEngines) { QMutexLocker locker(&engine->mutex); if (auto ptr = engine->accessPointConfigurations.value(identifier)) { item.d = std::move(ptr); @@ -297,7 +279,7 @@ QNetworkConfigurationManager::Capabilities QNetworkConfigurationManagerPrivate:: QNetworkConfigurationManager::Capabilities capFlags; - foreach (QBearerEngine *engine, sessionEngines) + for (QBearerEngine *engine : sessionEngines) capFlags |= engine->capabilities(); return capFlags; @@ -442,11 +424,10 @@ void QNetworkConfigurationManagerPrivate::updateConfigurations() if (firstUpdate) { firstUpdate = false; - QList<QBearerEngine*> enginesToInitialize = sessionEngines; //shallow copy the list in case it is modified when we unlock mutex + const QList<QBearerEngine*> enginesToInitialize = sessionEngines; //shallow copy the list in case it is modified when we unlock mutex locker.unlock(); - foreach (QBearerEngine* engine, enginesToInitialize) { + for (QBearerEngine* engine : enginesToInitialize) QMetaObject::invokeMethod(engine, "initialize", Qt::BlockingQueuedConnection); - } } } @@ -461,7 +442,7 @@ void QNetworkConfigurationManagerPrivate::performAsyncConfigurationUpdate() updating = true; - foreach (QBearerEngine *engine, sessionEngines) { + for (QBearerEngine *engine : qAsConst(sessionEngines)) { updatingEngines.insert(engine); QMetaObject::invokeMethod(engine, "requestUpdate"); } @@ -491,7 +472,7 @@ void QNetworkConfigurationManagerPrivate::startPolling() if (pollTimer->isActive()) return; - foreach (QBearerEngine *engine, sessionEngines) { + for (QBearerEngine *engine : qAsConst(sessionEngines)) { if (engine->requiresPolling() && (forcedPolling || engine->configurationsInUse())) { pollTimer->start(); break; @@ -504,7 +485,7 @@ void QNetworkConfigurationManagerPrivate::pollEngines() { QMutexLocker locker(&mutex); - foreach (QBearerEngine *engine, sessionEngines) { + for (QBearerEngine *engine : qAsConst(sessionEngines)) { if (engine->requiresPolling() && (forcedPolling || engine->configurationsInUse())) { pollingEngines.insert(engine); QMetaObject::invokeMethod(engine, "requestUpdate"); diff --git a/src/network/bearer/qnetworkconfiguration.cpp b/src/network/bearer/qnetworkconfiguration.cpp index 3a0feb7d13..533a27357c 100644 --- a/src/network/bearer/qnetworkconfiguration.cpp +++ b/src/network/bearer/qnetworkconfiguration.cpp @@ -384,25 +384,21 @@ QList<QNetworkConfiguration> QNetworkConfiguration::children() const if (d->type != QNetworkConfiguration::ServiceNetwork || !d->isValid) return results; - QMutableMapIterator<unsigned int, QNetworkConfigurationPrivatePointer> i(d->serviceNetworkMembers); - while (i.hasNext()) { - i.next(); - - QNetworkConfigurationPrivatePointer p = i.value(); - + for (auto it = d->serviceNetworkMembers.begin(), end = d->serviceNetworkMembers.end(); it != end;) { + QNetworkConfigurationPrivatePointer p = it.value(); //if we have an invalid member get rid of it -> was deleted earlier on { QMutexLocker childLocker(&p->mutex); if (!p->isValid) { - i.remove(); + it = d->serviceNetworkMembers.erase(it); continue; } } - QNetworkConfiguration item; item.d = p; results << item; + ++it; } return results; diff --git a/src/network/bearer/qnetworksession.cpp b/src/network/bearer/qnetworksession.cpp index 1e7b080333..6d864a7d3e 100644 --- a/src/network/bearer/qnetworksession.cpp +++ b/src/network/bearer/qnetworksession.cpp @@ -249,7 +249,8 @@ QNetworkSession::QNetworkSession(const QNetworkConfiguration &connectionConfig, { // invalid configuration if (!connectionConfig.identifier().isEmpty()) { - foreach (QBearerEngine *engine, qNetworkConfigurationManagerPrivate()->engines()) { + const auto engines = qNetworkConfigurationManagerPrivate()->engines(); + for (QBearerEngine *engine : engines) { if (engine->hasIdentifier(connectionConfig.identifier())) { d = engine->createSessionBackend(); d->q = this; diff --git a/src/network/doc/snippets/code/src_network_kernel_qdnslookup.cpp b/src/network/doc/snippets/code/src_network_kernel_qdnslookup.cpp index dabd2373e7..76a0d61427 100644 --- a/src/network/doc/snippets/code/src_network_kernel_qdnslookup.cpp +++ b/src/network/doc/snippets/code/src_network_kernel_qdnslookup.cpp @@ -75,7 +75,8 @@ void MyObject::handleServers() } // Handle the results. - foreach (const QDnsServiceRecord &record, dns->serviceRecords()) { + const auto records = dns->serviceRecords(); + for (const QDnsServiceRecord &record : records) { ... } dns->deleteLater(); diff --git a/src/network/doc/snippets/code/src_network_kernel_qhostinfo.cpp b/src/network/doc/snippets/code/src_network_kernel_qhostinfo.cpp index 0d06fb44c7..b7939bb1c0 100644 --- a/src/network/doc/snippets/code/src_network_kernel_qhostinfo.cpp +++ b/src/network/doc/snippets/code/src_network_kernel_qhostinfo.cpp @@ -78,7 +78,8 @@ void MyWidget::lookedUp(const QHostInfo &host) return; } - foreach (const QHostAddress &address, host.addresses()) + const auto addresses = host.addresses(); + for (const QHostAddress &address : addresses) qDebug() << "Found address:" << address.toString(); } //! [3] diff --git a/src/network/doc/snippets/code/src_network_ssl_qsslcertificate.cpp b/src/network/doc/snippets/code/src_network_ssl_qsslcertificate.cpp index fd1de88754..12691da7a2 100644 --- a/src/network/doc/snippets/code/src_network_ssl_qsslcertificate.cpp +++ b/src/network/doc/snippets/code/src_network_ssl_qsslcertificate.cpp @@ -49,9 +49,9 @@ ****************************************************************************/ //! [0] -foreach (const QSslCertificate &cert, QSslCertificate::fromPath("C:/ssl/certificate.*.pem", - QSsl::Pem, - QRegExp::Wildcard)) { +const auto certs = QSslCertificate::fromPath("C:/ssl/certificate.*.pem", + QSsl::Pem, QRegExp::Wildcard); +for (const QSslCertificate &cert : certs) { qDebug() << cert.issuerInfo(QSslCertificate::Organization); } //! [0] diff --git a/src/network/kernel/qdnslookup.cpp b/src/network/kernel/qdnslookup.cpp index d8f8d78a0f..02df00a590 100644 --- a/src/network/kernel/qdnslookup.cpp +++ b/src/network/kernel/qdnslookup.cpp @@ -76,11 +76,11 @@ static void qt_qdnsmailexchangerecord_sort(QList<QDnsMailExchangeRecord> &record // Determine the slice of records with the current preference. QList<QDnsMailExchangeRecord> slice; - const quint16 slicePreference = records[i].preference(); + const quint16 slicePreference = records.at(i).preference(); for (int j = i; j < records.size(); ++j) { - if (records[j].preference() != slicePreference) + if (records.at(j).preference() != slicePreference) break; - slice << records[j]; + slice << records.at(j); } // Randomize the slice of records. @@ -119,13 +119,13 @@ static void qt_qdnsservicerecord_sort(QList<QDnsServiceRecord> &records) // Determine the slice of records with the current priority. QList<QDnsServiceRecord> slice; - const quint16 slicePriority = records[i].priority(); + const quint16 slicePriority = records.at(i).priority(); unsigned int sliceWeight = 0; for (int j = i; j < records.size(); ++j) { - if (records[j].priority() != slicePriority) + if (records.at(j).priority() != slicePriority) break; - sliceWeight += records[j].weight(); - slice << records[j]; + sliceWeight += records.at(j).weight(); + slice << records.at(j); } #ifdef QDNSLOOKUP_DEBUG qDebug("qt_qdnsservicerecord_sort() : priority %i (size: %i, total weight: %i)", @@ -137,15 +137,15 @@ static void qt_qdnsservicerecord_sort(QList<QDnsServiceRecord> &records) const unsigned int weightThreshold = qrand() % (sliceWeight + 1); unsigned int summedWeight = 0; for (int j = 0; j < slice.size(); ++j) { - summedWeight += slice[j].weight(); + summedWeight += slice.at(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()); + qPrintable(slice.at(j).target()), slice.at(j).port(), + slice.at(j).weight()); #endif // Adjust the slice weight and take the current record. - sliceWeight -= slice[j].weight(); + sliceWeight -= slice.at(j).weight(); records[i++] = slice.takeAt(j); break; } diff --git a/src/network/kernel/qdnslookup_unix.cpp b/src/network/kernel/qdnslookup_unix.cpp index d2c5542139..35981a2f2c 100644 --- a/src/network/kernel/qdnslookup_unix.cpp +++ b/src/network/kernel/qdnslookup_unix.cpp @@ -42,7 +42,6 @@ #include <qlibrary.h> #include <qscopedpointer.h> #include <qurl.h> -#include <private/qmutexpool_p.h> #include <private/qnativesocketengine_p.h> #include <sys/types.h> @@ -78,7 +77,7 @@ struct QDnsLookupStateDeleter } }; -static void resolveLibrary() +static bool resolveLibraryInternal() { QLibrary lib; #ifdef LIBRESOLV_SO @@ -88,7 +87,7 @@ static void resolveLibrary() { lib.setFileName(QLatin1String("resolv")); if (!lib.load()) - return; + return false; } local_dn_expand = dn_expand_proto(lib.resolve("__dn_expand")); @@ -112,19 +111,15 @@ static void resolveLibrary() 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")); + + return true; } +Q_GLOBAL_STATIC_WITH_ARGS(bool, resolveLibrary, (resolveLibraryInternal())) void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, const QHostAddress &nameserver, QDnsLookupReply *reply) { // Load dn_expand, res_ninit and res_nquery on demand. - static QBasicAtomicInt triedResolve = Q_BASIC_ATOMIC_INITIALIZER(false); - if (!triedResolve.loadAcquire()) { - QMutexLocker locker(QMutexPool::globalInstanceGet(&local_res_ninit)); - if (!triedResolve.load()) { - resolveLibrary(); - triedResolve.storeRelease(true); - } - } + resolveLibrary(); // If dn_expand, res_ninit or res_nquery is missing, fail. if (!local_dn_expand || !local_res_nclose || !local_res_ninit || !local_res_nquery) { diff --git a/src/network/kernel/qdnslookup_winrt.cpp b/src/network/kernel/qdnslookup_winrt.cpp index b459deb1ed..30510d89fc 100644 --- a/src/network/kernel/qdnslookup_winrt.cpp +++ b/src/network/kernel/qdnslookup_winrt.cpp @@ -146,7 +146,7 @@ void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestN PCWSTR rawString = name.GetRawBuffer(&length); addresses.insert(QHostAddress(QString::fromWCharArray(rawString, length))); } - foreach (const QHostAddress &address, addresses) { + for (const QHostAddress &address : qAsConst(addresses)) { QDnsHostAddressRecord record; record.d->name = aceHostname; record.d->value = address; diff --git a/src/network/kernel/qhostinfo.cpp b/src/network/kernel/qhostinfo.cpp index 293633d6bc..88df65dbcb 100644 --- a/src/network/kernel/qhostinfo.cpp +++ b/src/network/kernel/qhostinfo.cpp @@ -79,6 +79,22 @@ bool any_of(InputIt first, InputIt last, UnaryPredicate p) { return std::find_if(first, last, p) != last; } + +template <typename InputIt, typename OutputIt1, typename OutputIt2, typename UnaryPredicate> +std::pair<OutputIt1, OutputIt2> separate_if(InputIt first, InputIt last, OutputIt1 dest1, OutputIt2 dest2, UnaryPredicate p) +{ + while (first != last) { + if (p(*first)) { + *dest1 = *first; + ++dest1; + } else { + *dest2 = *first; + ++dest2; + } + ++first; + } + return std::make_pair(dest1, dest2); +} } /*! @@ -587,46 +603,37 @@ void QHostInfoLookupManager::work() finishedLookups.clear(); } - if (!postponedLookups.isEmpty()) { - // try to start the postponed ones - - QMutableListIterator<QHostInfoRunnable*> iterator(postponedLookups); - while (iterator.hasNext()) { - QHostInfoRunnable* postponed = iterator.next(); - - // check if none of the postponed hostnames is currently running - const bool alreadyRunning = any_of(currentLookups.cbegin(), currentLookups.cend(), ToBeLookedUpEquals(postponed->toBeLookedUp)); - if (!alreadyRunning) { - iterator.remove(); - scheduledLookups.prepend(postponed); // prepend! we want to finish it ASAP - } + auto isAlreadyRunning = [this](QHostInfoRunnable *lookup) { + return any_of(currentLookups.cbegin(), currentLookups.cend(), ToBeLookedUpEquals(lookup->toBeLookedUp)); + }; + + // Transfer any postponed lookups that aren't currently running to the scheduled list, keeping already-running lookups: + postponedLookups.erase(separate_if(postponedLookups.begin(), + postponedLookups.end(), + postponedLookups.begin(), + std::front_inserter(scheduledLookups), // prepend! we want to finish it ASAP + isAlreadyRunning).first, + postponedLookups.end()); + + // Unschedule and postpone any that are currently running: + scheduledLookups.erase(separate_if(scheduledLookups.begin(), + scheduledLookups.end(), + std::back_inserter(postponedLookups), + scheduledLookups.begin(), + isAlreadyRunning).second, + scheduledLookups.end()); + + const int availableThreads = threadPool.maxThreadCount() - currentLookups.size(); + if (availableThreads > 0) { + int readyToStartCount = qMin(availableThreads, scheduledLookups.size()); + auto it = scheduledLookups.begin(); + while (readyToStartCount--) { + // runnable now running in new thread, track this in currentLookups + threadPool.start(*it); + currentLookups.push_back(std::move(*it)); + ++it; } - } - - if (!scheduledLookups.isEmpty()) { - // try to start the new ones - QMutableListIterator<QHostInfoRunnable*> iterator(scheduledLookups); - while (iterator.hasNext()) { - QHostInfoRunnable *scheduled = iterator.next(); - - // check if a lookup for this host is already running, then postpone - const bool alreadyRunning = any_of(currentLookups.cbegin(), currentLookups.cend(), ToBeLookedUpEquals(scheduled->toBeLookedUp)); - if (alreadyRunning) { - iterator.remove(); - postponedLookups.append(scheduled); - scheduled = 0; - } - - if (scheduled && currentLookups.size() < threadPool.maxThreadCount()) { - // runnable now running in new thread, track this in currentLookups - threadPool.start(scheduled); - iterator.remove(); - currentLookups.append(scheduled); - } else { - // was postponed, continue iterating - continue; - } - }; + scheduledLookups.erase(scheduledLookups.begin(), it); } } diff --git a/src/network/kernel/qhostinfo_unix.cpp b/src/network/kernel/qhostinfo_unix.cpp index 8a3f3fa5c9..7af8db73e0 100644 --- a/src/network/kernel/qhostinfo_unix.cpp +++ b/src/network/kernel/qhostinfo_unix.cpp @@ -49,7 +49,6 @@ #include <qbasicatomic.h> #include <qurl.h> #include <qfile.h> -#include <private/qmutexpool_p.h> #include <private/qnet_unix_p.h> #include <sys/types.h> @@ -92,7 +91,7 @@ typedef void (*res_nclose_proto)(res_state_ptr); static res_nclose_proto local_res_nclose = 0; static res_state_ptr local_res = 0; -static void resolveLibrary() +static bool resolveLibraryInternal() { #if !defined(QT_NO_LIBRARY) && !defined(Q_OS_QNX) QLibrary lib; @@ -103,7 +102,7 @@ static void resolveLibrary() { lib.setFileName(QLatin1String("resolv")); if (!lib.load()) - return; + return false; } local_res_init = res_init_proto(lib.resolve("__res_init")); @@ -125,7 +124,10 @@ static void resolveLibrary() local_res_ninit = 0; } #endif + + return true; } +Q_GLOBAL_STATIC_WITH_ARGS(bool, resolveLibrary, (resolveLibraryInternal())) QHostInfo QHostInfoAgent::fromName(const QString &hostName) { @@ -137,14 +139,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName) #endif // Load res_init on demand. - static QBasicAtomicInt triedResolve = Q_BASIC_ATOMIC_INITIALIZER(false); - if (!triedResolve.loadAcquire()) { - QMutexLocker locker(QMutexPool::globalInstanceGet(&local_res_init)); - if (!triedResolve.load()) { - resolveLibrary(); - triedResolve.storeRelease(true); - } - } + resolveLibrary(); // If res_init is available, poll it. if (local_res_init) diff --git a/src/network/kernel/qhostinfo_win.cpp b/src/network/kernel/qhostinfo_win.cpp index 1d34ae8277..9e5d556f2b 100644 --- a/src/network/kernel/qhostinfo_win.cpp +++ b/src/network/kernel/qhostinfo_win.cpp @@ -45,7 +45,6 @@ #include <qmutex.h> #include <qbasicatomic.h> #include <qurl.h> -#include <private/qmutexpool_p.h> QT_BEGIN_NAMESPACE @@ -78,7 +77,7 @@ static getnameinfoProto local_getnameinfo = 0; static getaddrinfoProto local_getaddrinfo = 0; static freeaddrinfoProto local_freeaddrinfo = 0; -static void resolveLibrary() +static bool resolveLibraryInternal() { // Attempt to resolve getaddrinfo(); without it we'll have to fall // back to gethostbyname(), which has no IPv6 support. @@ -91,7 +90,9 @@ static void resolveLibrary() local_freeaddrinfo = (freeaddrinfoProto) QSystemLibrary::resolve(QLatin1String("ws2_32"), "freeaddrinfo"); local_getnameinfo = (getnameinfoProto) QSystemLibrary::resolve(QLatin1String("ws2_32"), "getnameinfo"); #endif + return true; } +Q_GLOBAL_STATIC_WITH_ARGS(bool, resolveLibrary, (resolveLibraryInternal())) static void translateWSAError(int error, QHostInfo *results) { @@ -114,14 +115,7 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName) QSysInfo::machineHostName(); // this initializes ws2_32.dll // Load res_init on demand. - static QBasicAtomicInt triedResolve = Q_BASIC_ATOMIC_INITIALIZER(false); - if (!triedResolve.loadAcquire()) { - QMutexLocker locker(QMutexPool::globalInstanceGet(&local_getaddrinfo)); - if (!triedResolve.load()) { - resolveLibrary(); - triedResolve.storeRelease(true); - } - } + resolveLibrary(); QHostInfo results; diff --git a/src/network/kernel/qnetworkinterface.cpp b/src/network/kernel/qnetworkinterface.cpp index e55e113619..c64d8e13cd 100644 --- a/src/network/kernel/qnetworkinterface.cpp +++ b/src/network/kernel/qnetworkinterface.cpp @@ -120,11 +120,11 @@ QSharedDataPointer<QNetworkInterfacePrivate> QNetworkInterfaceManager::interface QList<QSharedDataPointer<QNetworkInterfacePrivate> > QNetworkInterfaceManager::allInterfaces() { - QList<QNetworkInterfacePrivate *> list = postProcess(scan()); + const QList<QNetworkInterfacePrivate *> list = postProcess(scan()); QList<QSharedDataPointer<QNetworkInterfacePrivate> > result; result.reserve(list.size()); - foreach (QNetworkInterfacePrivate *ptr, list) + for (QNetworkInterfacePrivate *ptr : list) result << QSharedDataPointer<QNetworkInterfacePrivate>(ptr); return result; @@ -611,10 +611,10 @@ QString QNetworkInterface::interfaceNameFromIndex(int index) */ QList<QNetworkInterface> QNetworkInterface::allInterfaces() { - QList<QSharedDataPointer<QNetworkInterfacePrivate> > privs = manager()->allInterfaces(); + const QList<QSharedDataPointer<QNetworkInterfacePrivate> > privs = manager()->allInterfaces(); QList<QNetworkInterface> result; result.reserve(privs.size()); - foreach (const QSharedDataPointer<QNetworkInterfacePrivate> &p, privs) { + for (const auto &p : privs) { QNetworkInterface item; item.d = p; result << item; @@ -631,10 +631,10 @@ QList<QNetworkInterface> QNetworkInterface::allInterfaces() */ QList<QHostAddress> QNetworkInterface::allAddresses() { - QList<QSharedDataPointer<QNetworkInterfacePrivate> > privs = manager()->allInterfaces(); + const QList<QSharedDataPointer<QNetworkInterfacePrivate> > privs = manager()->allInterfaces(); QList<QHostAddress> result; - foreach (const QSharedDataPointer<QNetworkInterfacePrivate> &p, privs) { - foreach (const QNetworkAddressEntry &entry, p->addressEntries) + for (const auto &p : privs) { + for (const QNetworkAddressEntry &entry : qAsConst(p->addressEntries)) result += entry.ip(); } diff --git a/src/network/kernel/qnetworkproxy.cpp b/src/network/kernel/qnetworkproxy.cpp index 22400ef9ab..ad78c48fd8 100644 --- a/src/network/kernel/qnetworkproxy.cpp +++ b/src/network/kernel/qnetworkproxy.cpp @@ -297,7 +297,7 @@ public: QNetworkProxy applicationProxy() { - return proxyForQuery(QNetworkProxyQuery()).first(); + return proxyForQuery(QNetworkProxyQuery()).constFirst(); } QList<QNetworkProxy> proxyForQuery(const QNetworkProxyQuery &query); diff --git a/src/network/kernel/qnetworkproxy_generic.cpp b/src/network/kernel/qnetworkproxy_generic.cpp index db1083f3e0..e69870a98c 100644 --- a/src/network/kernel/qnetworkproxy_generic.cpp +++ b/src/network/kernel/qnetworkproxy_generic.cpp @@ -59,7 +59,7 @@ static bool ignoreProxyFor(const QNetworkProxyQuery &query) const QList<QByteArray> noProxyTokens = noProxy.split(','); - foreach (const QByteArray &rawToken, noProxyTokens) { + for (const QByteArray &rawToken : noProxyTokens) { QByteArray token = rawToken.trimmed(); QString peerHostName = query.peerHostName(); diff --git a/src/network/kernel/qnetworkproxy_libproxy.cpp b/src/network/kernel/qnetworkproxy_libproxy.cpp index e89df79226..184dc6469d 100644 --- a/src/network/kernel/qnetworkproxy_libproxy.cpp +++ b/src/network/kernel/qnetworkproxy_libproxy.cpp @@ -122,10 +122,10 @@ QList<QNetworkProxy> QNetworkProxyFactory::systemProxyForQuery(const QNetworkPro return proxyList; } - QList<QUrl> rawProxies = libProxyWrapper()->getProxies(queryUrl); + const QList<QUrl> rawProxies = libProxyWrapper()->getProxies(queryUrl); bool haveDirectConnection = false; - foreach (const QUrl& url, rawProxies) { + for (const QUrl& url : rawProxies) { QNetworkProxy::ProxyType type; const QString scheme = url.scheme(); if (scheme == QLatin1String("http")) { diff --git a/src/network/kernel/qnetworkproxy_win.cpp b/src/network/kernel/qnetworkproxy_win.cpp index a37585b5cd..03109b4e46 100644 --- a/src/network/kernel/qnetworkproxy_win.cpp +++ b/src/network/kernel/qnetworkproxy_win.cpp @@ -191,14 +191,16 @@ static bool isBypassed(const QString &host, const QStringList &bypassList) return true; // does it match the list of exclusions? - foreach (const QString &entry, bypassList) { + for (const QString &entry : bypassList) { if (entry == QLatin1String("<local>")) { if (isSimple) return true; if (isIpAddress) { //exclude all local subnets - foreach (const QNetworkInterface &iface, QNetworkInterface::allInterfaces()) { - foreach (const QNetworkAddressEntry netaddr, iface.addressEntries()) { + const auto ifaces = QNetworkInterface::allInterfaces(); + for (const QNetworkInterface &iface : ifaces) { + const auto netaddrs = iface.addressEntries(); + for (const QNetworkAddressEntry &netaddr : netaddrs) { if (ipAddress.isInSubnet(netaddr.ip(), netaddr.prefixLength())) { return true; } @@ -238,7 +240,7 @@ static QList<QNetworkProxy> filterProxyListByCapabilities(const QList<QNetworkPr break; } QList<QNetworkProxy> result; - foreach (const QNetworkProxy& proxy, proxyList) { + for (const QNetworkProxy &proxy : proxyList) { if (proxy.capabilities() & requiredCaps) result.append(proxy); } @@ -248,7 +250,7 @@ static QList<QNetworkProxy> filterProxyListByCapabilities(const QList<QNetworkPr static QList<QNetworkProxy> removeDuplicateProxies(const QList<QNetworkProxy> &proxyList) { QList<QNetworkProxy> result; - foreach (QNetworkProxy proxy, proxyList) { + for (const QNetworkProxy &proxy : proxyList) { bool append = true; for (int i=0; i < result.count(); i++) { if (proxy.hostName() == result.at(i).hostName() @@ -280,7 +282,7 @@ static QList<QNetworkProxy> parseServerList(const QNetworkProxyQuery &query, con QHash<QString, QNetworkProxy> taggedProxies; const QString requiredTag = query.protocolTag(); bool checkTags = !requiredTag.isEmpty() && query.queryType() != QNetworkProxyQuery::TcpServer; //windows tags are only for clients - foreach (const QString &entry, proxyList) { + for (const QString &entry : proxyList) { int server = 0; QNetworkProxy::ProxyType proxyType = QNetworkProxy::HttpProxy; @@ -329,7 +331,7 @@ static QList<QNetworkProxy> parseServerList(const QNetworkProxyQuery &query, con result << QNetworkProxy(proxyType, entry.mid(server, pos - server), port); if (!protocolTag.isEmpty()) - taggedProxies.insert(protocolTag.toString(), result.last()); + taggedProxies.insert(protocolTag.toString(), result.constLast()); } if (checkTags && taggedProxies.contains(requiredTag)) { @@ -389,9 +391,9 @@ public: } void clear() { - foreach (HANDLE event, m_watchEvents) + for (HANDLE event : qAsConst(m_watchEvents)) CloseHandle(event); - foreach (HKEY key, m_registryHandles) + for (HKEY key : qAsConst(m_registryHandles)) RegCloseKey(key); m_watchEvents.clear(); diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp index 03f2ddb968..cbae297278 100644 --- a/src/network/socket/qabstractsocket.cpp +++ b/src/network/socket/qabstractsocket.cpp @@ -917,7 +917,7 @@ void QAbstractSocketPrivate::resolveProxy(const QString &hostname, quint16 port) } // return the first that we can use - foreach (const QNetworkProxy &p, proxies) { + for (const QNetworkProxy &p : qAsConst(proxies)) { if (socketType == QAbstractSocket::UdpSocket && (p.capabilities() & QNetworkProxy::UdpTunnelingCapability) == 0) continue; @@ -997,9 +997,11 @@ void QAbstractSocketPrivate::_q_startConnecting(const QHostInfo &hostInfo) if (preferredNetworkLayerProtocol == QAbstractSocket::UnknownNetworkLayerProtocol || preferredNetworkLayerProtocol == QAbstractSocket::AnyIPProtocol) { addresses = hostInfo.addresses(); } else { - foreach (const QHostAddress &address, hostInfo.addresses()) + const auto candidates = hostInfo.addresses(); + for (const QHostAddress &address : candidates) { if (address.protocol() == preferredNetworkLayerProtocol) addresses += address; + } } @@ -2172,7 +2174,7 @@ bool QAbstractSocket::waitForReadyRead(int msecs) } do { - if (state() != ConnectedState) + if (state() != ConnectedState && state() != BoundState) return false; bool readyToRead = false; diff --git a/src/network/socket/qhttpsocketengine.cpp b/src/network/socket/qhttpsocketengine.cpp index 642c9bb10f..73b42ba432 100644 --- a/src/network/socket/qhttpsocketengine.cpp +++ b/src/network/socket/qhttpsocketengine.cpp @@ -497,9 +497,9 @@ void QHttpSocketEngine::slotSocketConnected() data += "Host: " + peerAddress + "\r\n"; if (!d->proxy.hasRawHeader("User-Agent")) data += "User-Agent: Mozilla/5.0\r\n"; - foreach (const QByteArray &header, d->proxy.rawHeaderList()) { + const auto headers = d->proxy.rawHeaderList(); + for (const QByteArray &header : headers) data += header + ": " + d->proxy.rawHeader(header) + "\r\n"; - } QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(d->authenticator); //qDebug() << "slotSocketConnected: priv=" << priv << (priv ? (int)priv->method : -1); if (priv && priv->method != QAuthenticatorPrivate::None) { diff --git a/src/network/socket/qlocalsocket.h b/src/network/socket/qlocalsocket.h index da91ef0e85..0eecab206b 100644 --- a/src/network/socket/qlocalsocket.h +++ b/src/network/socket/qlocalsocket.h @@ -130,7 +130,7 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_stateChanged(QAbstractSocket::SocketState)) Q_PRIVATE_SLOT(d_func(), void _q_error(QAbstractSocket::SocketError)) #elif defined(Q_OS_WIN) - Q_PRIVATE_SLOT(d_func(), void _q_bytesWritten(qint64)) + Q_PRIVATE_SLOT(d_func(), void _q_canWrite()) Q_PRIVATE_SLOT(d_func(), void _q_pipeClosed()) Q_PRIVATE_SLOT(d_func(), void _q_winError(ulong, const QString &)) #else diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h index 0f84aeea3e..cf36887e92 100644 --- a/src/network/socket/qlocalsocket_p.h +++ b/src/network/socket/qlocalsocket_p.h @@ -130,8 +130,7 @@ public: ~QLocalSocketPrivate(); void destroyPipeHandles(); void setErrorString(const QString &function); - void startNextWrite(); - void _q_bytesWritten(qint64 bytes); + void _q_canWrite(); void _q_pipeClosed(); void _q_winError(ulong windowsError, const QString &function); HANDLE handle; diff --git a/src/network/socket/qlocalsocket_tcp.cpp b/src/network/socket/qlocalsocket_tcp.cpp index d205836f69..4348b819d9 100644 --- a/src/network/socket/qlocalsocket_tcp.cpp +++ b/src/network/socket/qlocalsocket_tcp.cpp @@ -274,7 +274,7 @@ bool QLocalSocket::setSocketDescriptor(qintptr socketDescriptor, // Is our parent a localServer? Then it wants us to use its remote socket. QLocalServer* localServer = qobject_cast<QLocalServer*>( parent() ); if (localServer) { - foreach (QObject* child, localServer->children()) { + for (QObject* child : localServer->children()) { QTcpSocket* childTcpSocket = qobject_cast<QTcpSocket*>(child); if (childTcpSocket && childTcpSocket->socketDescriptor() == socketDescriptor) { d->setSocket( static_cast<QLocalUnixSocket*>(childTcpSocket) ); diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index 5fc34c3ed6..66b461522b 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -218,11 +218,12 @@ qint64 QLocalSocket::writeData(const char *data, qint64 len) memcpy(dest, data, len); if (!d->pipeWriter) { d->pipeWriter = new QWindowsPipeWriter(d->handle, this); - QObjectPrivate::connect(d->pipeWriter, &QWindowsPipeWriter::bytesWritten, - d, &QLocalSocketPrivate::_q_bytesWritten); + connect(d->pipeWriter, &QWindowsPipeWriter::bytesWritten, + this, &QLocalSocket::bytesWritten); + QObjectPrivate::connect(d->pipeWriter, &QWindowsPipeWriter::canWrite, + d, &QLocalSocketPrivate::_q_canWrite); } - if (!d->pipeWriter->isWriteOperationActive()) - d->startNextWrite(); + d->_q_canWrite(); return len; } @@ -275,7 +276,7 @@ qint64 QLocalSocket::bytesAvailable() const qint64 QLocalSocket::bytesToWrite() const { Q_D(const QLocalSocket); - return d->writeBuffer.size(); + return d->writeBuffer.size() + (d->pipeWriter ? d->pipeWriter->bytesToWrite() : 0); } bool QLocalSocket::canReadLine() const @@ -358,7 +359,7 @@ bool QLocalSocket::setSocketDescriptor(qintptr socketDescriptor, return true; } -void QLocalSocketPrivate::startNextWrite() +void QLocalSocketPrivate::_q_canWrite() { Q_Q(QLocalSocket); if (writeBuffer.isEmpty()) { @@ -366,18 +367,11 @@ void QLocalSocketPrivate::startNextWrite() q->close(); } else { Q_ASSERT(pipeWriter); - pipeWriter->write(writeBuffer.readPointer(), writeBuffer.nextDataBlockSize()); + if (!pipeWriter->isWriteOperationActive()) + pipeWriter->write(writeBuffer.read()); } } -void QLocalSocketPrivate::_q_bytesWritten(qint64 bytes) -{ - Q_Q(QLocalSocket); - writeBuffer.free(bytes); - startNextWrite(); - emit q->bytesWritten(bytes); -} - qintptr QLocalSocket::socketDescriptor() const { Q_D(const QLocalSocket); diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index 6e6191154e..b3e456be69 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -625,7 +625,7 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, mreq4.imr_multiaddr.s_addr = htonl(groupAddress.toIPv4Address()); if (interface.isValid()) { - QList<QNetworkAddressEntry> addressEntries = interface.addressEntries(); + const QList<QNetworkAddressEntry> addressEntries = interface.addressEntries(); if (!addressEntries.isEmpty()) { QHostAddress firstIP = addressEntries.first().ip(); mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address()); diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp index 07f4899bae..0c5b8d9264 100644 --- a/src/network/socket/qnativesocketengine_win.cpp +++ b/src/network/socket/qnativesocketengine_win.cpp @@ -572,6 +572,19 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters() } } + // Some Windows kernels return a v4-mapped QHostAddress::AnyIPv4 as a + // local address of the socket which bound on both IPv4 and IPv6 interfaces. + // This address does not match to any special address and should not be used + // to send the data. So, replace it with QHostAddress::Any. + if (socketProtocol == QAbstractSocket::IPv6Protocol) { + bool ok = false; + const quint32 localIPv4 = localAddress.toIPv4Address(&ok); + if (ok && localIPv4 == INADDR_ANY) { + socketProtocol = QAbstractSocket::AnyIPProtocol; + localAddress = QHostAddress::Any; + } + } + memset(&sa, 0, sizeof(sa)); if (::getpeername(socketDescriptor, &sa.a, &sockAddrSize) == 0) { qt_socket_getPortAndAddress(socketDescriptor, &sa, &peerPort, &peerAddress); @@ -934,7 +947,7 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, mreq4.imr_multiaddr.s_addr = htonl(groupAddress.toIPv4Address()); if (iface.isValid()) { - QList<QNetworkAddressEntry> addressEntries = iface.addressEntries(); + const QList<QNetworkAddressEntry> addressEntries = iface.addressEntries(); if (!addressEntries.isEmpty()) { QHostAddress firstIP = addressEntries.first().ip(); mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address()); @@ -1158,7 +1171,7 @@ qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const delete[] buf; #if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativePendingDatagramSize() == %li", ret); + qDebug("QNativeSocketEnginePrivate::nativePendingDatagramSize() == %lli", ret); #endif return ret; @@ -1258,10 +1271,11 @@ qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxL } #if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %li, %s, %i) == %li", + bool printSender = (ret != -1 && (options & QNativeSocketEngine::WantDatagramSender) != 0); + qDebug("QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %lli, %s, %i) == %lli", data, qt_prettyDebug(data, qMin<qint64>(ret, 16), ret).data(), maxLength, - address ? address->toString().toLatin1().constData() : "(nil)", - port ? *port : 0, ret); + printSender ? header->senderAddress.toString().toLatin1().constData() : "(unknown)", + printSender ? header->senderPort : 0, ret); #endif return ret; @@ -1368,9 +1382,10 @@ qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 l } #if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeSendDatagram(%p \"%s\", %li, \"%s\", %i) == %li", data, - qt_prettyDebug(data, qMin<qint64>(len, 16), len).data(), 0, address.toString().toLatin1().constData(), - port, ret); + qDebug("QNativeSocketEnginePrivate::nativeSendDatagram(%p \"%s\", %lli, \"%s\", %i) == %lli", data, + qt_prettyDebug(data, qMin<qint64>(len, 16), len).data(), len, + header.destinationAddress.toString().toLatin1().constData(), + header.destinationPort, ret); #endif return ret; diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp index 45ed1465f2..18f90a8a4e 100644 --- a/src/network/socket/qnativesocketengine_winrt.cpp +++ b/src/network/socket/qnativesocketengine_winrt.cpp @@ -245,7 +245,8 @@ bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket:: close(); // Currently, only TCP sockets are initialized this way. - d->socketDescriptor = qintptr(gSocketHandler->pendingTcpSockets.take(socketDescriptor)); + IStreamSocket *socket = gSocketHandler->pendingTcpSockets.take(socketDescriptor); + d->socketDescriptor = qintptr(socket); d->socketType = QAbstractSocket::TcpSocket; if (!d->socketDescriptor || !d->fetchConnectionParameters()) { @@ -255,6 +256,36 @@ bool QNativeSocketEngine::initialize(qintptr socketDescriptor, QAbstractSocket:: return false; } + // Start processing incoming data + if (d->socketType == QAbstractSocket::TcpSocket) { + HRESULT hr; + hr = QEventDispatcherWinRT::runOnXamlThread([d, socket, this]() { + ComPtr<IBuffer> buffer; + HRESULT hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer); + RETURN_HR_IF_FAILED("initialize(): Could not create buffer"); + + ComPtr<IInputStream> stream; + hr = socket->get_InputStream(&stream); + RETURN_HR_IF_FAILED("initialize(): Could not obtain input stream"); + hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, d->readOp.GetAddressOf()); + if (FAILED(hr)) { + qErrnoWarning(hr, "initialize(): Failed to read from the socket buffer (%s).", + socketDescription(this).constData()); + return E_FAIL; + } + hr = d->readOp->put_Completed(Callback<SocketReadCompletedHandler>(d, &QNativeSocketEnginePrivate::handleReadyRead).Get()); + if (FAILED(hr)) { + qErrnoWarning(hr, "initialize(): Failed to set socket read callback (%s).", + socketDescription(this).constData()); + return E_FAIL; + } + return S_OK; + }); + if (hr == E_FAIL) + return false; + Q_ASSERT_SUCCEEDED(hr); + } + d->socketState = socketState; return true; } @@ -358,8 +389,6 @@ bool QNativeSocketEngine::bind(const QHostAddress &address, quint16 port) } RETURN_HR_IF_FAILED("QNativeSocketEngine::bind: Unable to bind socket"); - hr = op->put_Completed(Callback<IAsyncActionCompletedHandler>(d, &QNativeSocketEnginePrivate::handleBindCompleted).Get()); - RETURN_HR_IF_FAILED("QNativeSocketEngine::bind: Could not register bind callback"); hr = QWinRTFunctions::await(op); RETURN_HR_IF_FAILED("QNativeSocketEngine::bind: Could not wait for bind to finish"); return S_OK; @@ -396,35 +425,9 @@ int QNativeSocketEngine::accept() return -1; } - // Start processing incoming data if (d->socketType == QAbstractSocket::TcpSocket) { IStreamSocket *socket = d->pendingConnections.takeFirst(); - HRESULT hr; - ComPtr<IBuffer> buffer; - hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer); - Q_ASSERT_SUCCEEDED(hr); - - ComPtr<IInputStream> stream; - hr = socket->get_InputStream(&stream); - Q_ASSERT_SUCCEEDED(hr); - ComPtr<IAsyncBufferOperation> op; - hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, &op); - if (FAILED(hr)) { - qErrnoWarning(hr, "accept(): Failed to read from the socket buffer (%s).", - socketDescription(this).constData()); - return -1; - } - hr = QEventDispatcherWinRT::runOnXamlThread([d, op]() { - return op->put_Completed(Callback<SocketReadCompletedHandler>(d, &QNativeSocketEnginePrivate::handleReadyRead).Get()); - }); - if (FAILED(hr)) { - qErrnoWarning(hr, "accept(): Failed to set socket read callback (%s).", - socketDescription(this).constData()); - return -1; - } - d->currentConnections.append(socket); - SocketHandler *handler = gSocketHandler(); handler->pendingTcpSockets.insert(++handler->socketCount, socket); return handler->socketCount; @@ -460,6 +463,32 @@ void QNativeSocketEngine::close() } } +#if _MSC_VER >= 1900 + // To close the connection properly (not with a hard reset) all pending read operation have to + // be finished or cancelled. The API isn't available on Windows 8.1 though. + ComPtr<IStreamSocket3> socket3; + hr = d->tcpSocket()->QueryInterface(IID_PPV_ARGS(&socket3)); + Q_ASSERT_SUCCEEDED(hr); + + ComPtr<IAsyncAction> action; + hr = socket3->CancelIOAsync(&action); + Q_ASSERT_SUCCEEDED(hr); + hr = QWinRTFunctions::await(action); + Q_ASSERT_SUCCEEDED(hr); +#endif // _MSC_VER >= 1900 + + if (d->readOp) { + ComPtr<IAsyncInfo> info; + hr = d->readOp.As(&info); + Q_ASSERT_SUCCEEDED(hr); + if (info) { + hr = info->Cancel(); + Q_ASSERT_SUCCEEDED(hr); + hr = info->Close(); + Q_ASSERT_SUCCEEDED(hr); + } + } + if (d->socketDescriptor != -1) { ComPtr<IClosable> socket; if (d->socketType == QAbstractSocket::TcpSocket) { @@ -477,7 +506,6 @@ void QNativeSocketEngine::close() if (socket) { hr = socket->Close(); Q_ASSERT_SUCCEEDED(hr); - d->socketDescriptor = -1; } d->socketDescriptor = -1; } @@ -791,17 +819,16 @@ void QNativeSocketEngine::establishRead() hr = QEventDispatcherWinRT::runOnXamlThread([d]() { ComPtr<IInputStream> stream; HRESULT hr = d->tcpSocket()->get_InputStream(&stream); - RETURN_HR_IF_FAILED("QNativeSocketEngine::establishRead: Failed to get socket input stream"); + RETURN_HR_IF_FAILED("establishRead(): Failed to get socket input stream"); ComPtr<IBuffer> buffer; hr = g->bufferFactory->Create(READ_BUFFER_SIZE, &buffer); - RETURN_HR_IF_FAILED("QNativeSocketEngine::establishRead: Failed to create buffer"); + RETURN_HR_IF_FAILED("establishRead(): Failed to create buffer"); - ComPtr<IAsyncBufferOperation> op; - hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, &op); - RETURN_HR_IF_FAILED("QNativeSocketEngine::establishRead: Failed to initiate socket read"); - hr = op->put_Completed(Callback<SocketReadCompletedHandler>(d, &QNativeSocketEnginePrivate::handleReadyRead).Get()); - RETURN_HR_IF_FAILED("QNativeSocketEngine::establishRead: Failed to register read callback"); + hr = stream->ReadAsync(buffer.Get(), READ_BUFFER_SIZE, InputStreamOptions_Partial, &d->readOp); + RETURN_HR_IF_FAILED("establishRead(): Failed to initiate socket read"); + hr = d->readOp->put_Completed(Callback<SocketReadCompletedHandler>(d, &QNativeSocketEnginePrivate::handleReadyRead).Get()); + RETURN_HR_IF_FAILED("establishRead(): Failed to register read callback"); return S_OK; }); Q_ASSERT_SUCCEEDED(hr); @@ -1167,11 +1194,6 @@ bool QNativeSocketEnginePrivate::fetchConnectionParameters() return true; } -HRESULT QNativeSocketEnginePrivate::handleBindCompleted(IAsyncAction *, AsyncStatus) -{ - return S_OK; -} - HRESULT QNativeSocketEnginePrivate::handleClientConnection(IStreamSocketListener *listener, IStreamSocketListenerConnectionReceivedEventArgs *args) { Q_Q(QNativeSocketEngine); @@ -1180,7 +1202,8 @@ HRESULT QNativeSocketEnginePrivate::handleClientConnection(IStreamSocketListener args->get_Socket(&socket); pendingConnections.append(socket); emit q->connectionReady(); - emit q->readReady(); + if (notifyOnRead) + emit q->readReady(); return S_OK; } @@ -1304,31 +1327,33 @@ HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *async if (notifyOnRead) emit q->readReady(); - ComPtr<IInputStream> stream; - hr = tcpSocket()->get_InputStream(&stream); - Q_ASSERT_SUCCEEDED(hr); + hr = QEventDispatcherWinRT::runOnXamlThread([buffer, q, this]() { + UINT32 readBufferLength; + ComPtr<IInputStream> stream; + HRESULT hr = tcpSocket()->get_InputStream(&stream); + RETURN_HR_IF_FAILED("handleReadyRead(): Could not obtain input stream"); - // Reuse the stream buffer - hr = buffer->get_Capacity(&bufferLength); - Q_ASSERT_SUCCEEDED(hr); - hr = buffer->put_Length(0); - Q_ASSERT_SUCCEEDED(hr); + // Reuse the stream buffer + hr = buffer->get_Capacity(&readBufferLength); + RETURN_HR_IF_FAILED("handleReadyRead(): Could not obtain buffer capacity"); + hr = buffer->put_Length(0); + RETURN_HR_IF_FAILED("handleReadyRead(): Could not set buffer length"); - ComPtr<IAsyncBufferOperation> op; - hr = stream->ReadAsync(buffer.Get(), bufferLength, InputStreamOptions_Partial, &op); - if (FAILED(hr)) { - qErrnoWarning(hr, "handleReadyRead(): Could not read into socket stream buffer (%s).", - socketDescription(q).constData()); + hr = stream->ReadAsync(buffer.Get(), readBufferLength, InputStreamOptions_Partial, &readOp); + if (FAILED(hr)) { + qErrnoWarning(hr, "handleReadyRead(): Could not read into socket stream buffer (%s).", + socketDescription(q).constData()); + return S_OK; + } + hr = readOp->put_Completed(Callback<SocketReadCompletedHandler>(this, &QNativeSocketEnginePrivate::handleReadyRead).Get()); + if (FAILED(hr)) { + qErrnoWarning(hr, "handleReadyRead(): Failed to set socket read callback (%s).", + socketDescription(q).constData()); + return S_OK; + } return S_OK; - } - hr = QEventDispatcherWinRT::runOnXamlThread([op, this]() { - return op->put_Completed(Callback<SocketReadCompletedHandler>(this, &QNativeSocketEnginePrivate::handleReadyRead).Get()); }); - if (FAILED(hr)) { - qErrnoWarning(hr, "handleReadyRead(): Failed to set socket read callback (%s).", - socketDescription(q).constData()); - return S_OK; - } + Q_ASSERT_SUCCEEDED(hr); return S_OK; } @@ -1362,7 +1387,8 @@ HRESULT QNativeSocketEnginePrivate::handleNewDatagram(IDatagramSocket *socket, I hr = reader->ReadBytes(length, reinterpret_cast<BYTE *>(datagram.data.data())); RETURN_OK_IF_FAILED("Could not read datagram"); pendingDatagrams.append(datagram); - emit q->readReady(); + if (notifyOnRead) + emit q->readReady(); return S_OK; } diff --git a/src/network/socket/qnativesocketengine_winrt_p.h b/src/network/socket/qnativesocketengine_winrt_p.h index 66ec2cbdd8..2c4d439a29 100644 --- a/src/network/socket/qnativesocketengine_winrt_p.h +++ b/src/network/socket/qnativesocketengine_winrt_p.h @@ -205,6 +205,7 @@ private: { return reinterpret_cast<ABI::Windows::Networking::Sockets::IDatagramSocket *>(socketDescriptor); } Microsoft::WRL::ComPtr<ABI::Windows::Networking::Sockets::IStreamSocketListener> tcpListener; Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncAction> connectOp; + Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Storage::Streams::IBuffer *, UINT32>> readOp; QBuffer readBytes; QMutex readMutex; @@ -215,7 +216,6 @@ private: QAbstractSocket *sslSocket; EventRegistrationToken connectionToken; - HRESULT handleBindCompleted(ABI::Windows::Foundation::IAsyncAction *, ABI::Windows::Foundation::AsyncStatus); HRESULT handleNewDatagram(ABI::Windows::Networking::Sockets::IDatagramSocket *socket, ABI::Windows::Networking::Sockets::IDatagramSocketMessageReceivedEventArgs *args); HRESULT handleClientConnection(ABI::Windows::Networking::Sockets::IStreamSocketListener *tcpListener, diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp index 369396271e..1870091693 100644 --- a/src/network/socket/qsocks5socketengine.cpp +++ b/src/network/socket/qsocks5socketengine.cpp @@ -392,12 +392,12 @@ void QSocks5BindStore::timerEvent(QTimerEvent * event) QMutexLocker lock(&mutex); if (event->timerId() == sweepTimerId) { QSOCKS5_DEBUG << "QSocks5BindStore performing sweep"; - QMutableHashIterator<int, QSocks5BindData *> it(store); - while (it.hasNext()) { - it.next(); + for (auto it = store.begin(), end = store.end(); it != end;) { if (it.value()->timeStamp.hasExpired(350000)) { QSOCKS5_DEBUG << "QSocks5BindStore removing JJJJ"; - it.remove(); + it = store.erase(it); + } else { + ++it; } } } diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp index 809b603403..d9ffdbd214 100644 --- a/src/network/socket/qtcpserver.cpp +++ b/src/network/socket/qtcpserver.cpp @@ -153,7 +153,7 @@ QNetworkProxy QTcpServerPrivate::resolveProxy(const QHostAddress &address, quint } // return the first that we can use - foreach (const QNetworkProxy &p, proxies) { + for (const QNetworkProxy &p : qAsConst(proxies)) { if (p.capabilities() & QNetworkProxy::ListeningCapability) return p; } diff --git a/src/network/ssl/qasn1element.cpp b/src/network/ssl/qasn1element.cpp index 7ac3a4b45d..dc59c41d59 100644 --- a/src/network/ssl/qasn1element.cpp +++ b/src/network/ssl/qasn1element.cpp @@ -192,7 +192,7 @@ QAsn1Element QAsn1Element::fromObjectId(const QByteArray &id) { QAsn1Element elem; elem.mType = ObjectIdentifierType; - QList<QByteArray> bits = id.split('.'); + const QList<QByteArray> bits = id.split('.'); Q_ASSERT(bits.size() > 2); elem.mValue += quint8((bits[0].toUInt() * 40 + bits[1].toUInt())); for (int i = 2; i < bits.size(); ++i) { @@ -311,11 +311,11 @@ QByteArray QAsn1Element::toObjectId() const { QByteArray key; if (mType == ObjectIdentifierType && !mValue.isEmpty()) { - quint8 b = mValue[0]; + quint8 b = mValue.at(0); key += QByteArray::number(b / 40) + '.' + QByteArray::number (b % 40); unsigned int val = 0; for (int i = 1; i < mValue.size(); ++i) { - b = mValue[i]; + b = mValue.at(i); val = (val << 7) | (b & 0x7f); if (!(b & 0x80)) { key += '.' + QByteArray::number(val); diff --git a/src/network/ssl/qsslcertificate_openssl.cpp b/src/network/ssl/qsslcertificate_openssl.cpp index a20100505a..28b7eda54a 100644 --- a/src/network/ssl/qsslcertificate_openssl.cpp +++ b/src/network/ssl/qsslcertificate_openssl.cpp @@ -507,7 +507,7 @@ QString QSslCertificate::toText() const void QSslCertificatePrivate::init(const QByteArray &data, QSsl::EncodingFormat format) { if (!data.isEmpty()) { - QList<QSslCertificate> certs = (format == QSsl::Pem) + const QList<QSslCertificate> certs = (format == QSsl::Pem) ? certificatesFromPem(data, 1) : certificatesFromDer(data, 1); if (!certs.isEmpty()) { diff --git a/src/network/ssl/qsslcertificate_qt.cpp b/src/network/ssl/qsslcertificate_qt.cpp index d712fe09b3..5e8f4cfac7 100644 --- a/src/network/ssl/qsslcertificate_qt.cpp +++ b/src/network/ssl/qsslcertificate_qt.cpp @@ -197,7 +197,7 @@ QString QSslCertificate::toText() const void QSslCertificatePrivate::init(const QByteArray &data, QSsl::EncodingFormat format) { if (!data.isEmpty()) { - QList<QSslCertificate> certs = (format == QSsl::Pem) + const QList<QSslCertificate> certs = (format == QSsl::Pem) ? certificatesFromPem(data, 1) : certificatesFromDer(data, 1); if (!certs.isEmpty()) { @@ -309,7 +309,7 @@ bool QSslCertificatePrivate::parse(const QByteArray &data) if (!elem.read(versionStream) || elem.type() != QAsn1Element::IntegerType) return false; - versionString = QByteArray::number(elem.value()[0] + 1); + versionString = QByteArray::number(elem.value().at(0) + 1); if (!elem.read(certStream)) return false; } else { @@ -451,7 +451,8 @@ bool QSslCertificatePrivate::parseExtension(const QByteArray &data, QSslCertific if (!val.read(valElem.value()) || val.type() != QAsn1Element::SequenceType) return false; QVariantMap result; - foreach (const QAsn1Element &el, val.toVector()) { + const auto elems = val.toVector(); + for (const QAsn1Element &el : elems) { QVector<QAsn1Element> items = el.toVector(); if (items.size() != 2) return false; @@ -495,11 +496,14 @@ bool QSslCertificatePrivate::parseExtension(const QByteArray &data, QSslCertific if (!val.read(valElem.value()) || val.type() != QAsn1Element::SequenceType) return false; QVariantMap result; - foreach (const QAsn1Element &el, val.toVector()) { + const auto elems = val.toVector(); + for (const QAsn1Element &el : elems) { if (el.type() == 0x80) { - result[QStringLiteral("keyid")] = el.value().toHex(); + const QString key = QStringLiteral("keyid"); + result[key] = el.value().toHex(); } else if (el.type() == 0x82) { - result[QStringLiteral("serial")] = colonSeparatedHex(el.value()); + const QString serial = QStringLiteral("serial"); + result[serial] = colonSeparatedHex(el.value()); } } value = result; diff --git a/src/network/ssl/qsslcipher.cpp b/src/network/ssl/qsslcipher.cpp index 806a27cd1a..738d521a38 100644 --- a/src/network/ssl/qsslcipher.cpp +++ b/src/network/ssl/qsslcipher.cpp @@ -90,7 +90,8 @@ QSslCipher::QSslCipher() QSslCipher::QSslCipher(const QString &name) : d(new QSslCipherPrivate) { - foreach (const QSslCipher &cipher, QSslConfiguration::supportedCiphers()) { + const auto ciphers = QSslConfiguration::supportedCiphers(); + for (const QSslCipher &cipher : ciphers) { if (cipher.name() == name) { *this = cipher; return; @@ -111,7 +112,8 @@ QSslCipher::QSslCipher(const QString &name) QSslCipher::QSslCipher(const QString &name, QSsl::SslProtocol protocol) : d(new QSslCipherPrivate) { - foreach (const QSslCipher &cipher, QSslConfiguration::supportedCiphers()) { + const auto ciphers = QSslConfiguration::supportedCiphers(); + for (const QSslCipher &cipher : ciphers) { if (cipher.name() == name && cipher.protocol() == protocol) { *this = cipher; return; diff --git a/src/network/ssl/qsslcontext_openssl.cpp b/src/network/ssl/qsslcontext_openssl.cpp index 0db7e10409..2c1f87128e 100644 --- a/src/network/ssl/qsslcontext_openssl.cpp +++ b/src/network/ssl/qsslcontext_openssl.cpp @@ -224,7 +224,8 @@ init_context: const QDateTime now = QDateTime::currentDateTimeUtc(); // Add all our CAs to this store. - foreach (const QSslCertificate &caCertificate, sslContext->sslConfiguration.caCertificates()) { + const auto caCertificates = sslContext->sslConfiguration.caCertificates(); + for (const QSslCertificate &caCertificate : caCertificates) { // From https://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html: // // If several CA certificates matching the name, key identifier, and @@ -243,9 +244,9 @@ init_context: if (QSslSocketPrivate::s_loadRootCertsOnDemand && allowRootCertOnDemandLoading) { // tell OpenSSL the directories where to look up the root certs on demand - QList<QByteArray> unixDirs = QSslSocketPrivate::unixRootCertDirectories(); - for (int a = 0; a < unixDirs.count(); ++a) - q_SSL_CTX_load_verify_locations(sslContext->ctx, 0, unixDirs.at(a).constData()); + const QList<QByteArray> unixDirs = QSslSocketPrivate::unixRootCertDirectories(); + for (const QByteArray &unixDir : unixDirs) + q_SSL_CTX_load_verify_locations(sslContext->ctx, 0, unixDir.constData()); } if (!sslContext->sslConfiguration.localCertificate().isNull()) { @@ -298,7 +299,7 @@ init_context: // If we have any intermediate certificates then we need to add them to our chain bool first = true; - foreach (const QSslCertificate &cert, configuration.d->localCertificateChain) { + for (const QSslCertificate &cert : qAsConst(configuration.d->localCertificateChain)) { if (first) { first = false; continue; diff --git a/src/network/ssl/qsslkey_qt.cpp b/src/network/ssl/qsslkey_qt.cpp index 196edb0956..3c5dc830d3 100644 --- a/src/network/ssl/qsslkey_qt.cpp +++ b/src/network/ssl/qsslkey_qt.cpp @@ -169,7 +169,7 @@ void QSslKeyPrivate::decodeDer(const QByteArray &der, bool deepClear) QDataStream keyStream(elem.value()); if (!elem.read(keyStream) || elem.type() != QAsn1Element::SequenceType) return; - QVector<QAsn1Element> infoItems = elem.toVector(); + const QVector<QAsn1Element> infoItems = elem.toVector(); if (infoItems.size() < 2 || infoItems[0].type() != QAsn1Element::ObjectIdentifierType) return; if (algorithm == QSsl::Rsa) { @@ -189,7 +189,7 @@ void QSslKeyPrivate::decodeDer(const QByteArray &der, bool deepClear) if (infoItems[1].type() != QAsn1Element::SequenceType) return; // key params - QVector<QAsn1Element> params = infoItems[1].toVector(); + const QVector<QAsn1Element> params = infoItems[1].toVector(); if (params.isEmpty() || params[0].type() != QAsn1Element::IntegerType) return; keyLength = numberOfBits(params[0].value()); @@ -202,7 +202,7 @@ void QSslKeyPrivate::decodeDer(const QByteArray &der, bool deepClear) } } else { - QVector<QAsn1Element> items = elem.toVector(); + const QVector<QAsn1Element> items = elem.toVector(); if (items.isEmpty()) return; @@ -249,7 +249,7 @@ void QSslKeyPrivate::decodePem(const QByteArray &pem, const QByteArray &passPhra QMap<QByteArray, QByteArray> headers; QByteArray data = derFromPem(pem, &headers); if (headers.value("Proc-Type") == "4,ENCRYPTED") { - QList<QByteArray> dekInfo = headers.value("DEK-Info").split(','); + const QList<QByteArray> dekInfo = headers.value("DEK-Info").split(','); if (dekInfo.size() != 2) { clear(deepClear); return; diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp index 82df861859..7fd2a361e3 100644 --- a/src/network/ssl/qsslsocket.cpp +++ b/src/network/ssl/qsslsocket.cpp @@ -1242,7 +1242,8 @@ void QSslSocket::setCiphers(const QString &ciphers) { Q_D(QSslSocket); d->configuration.ciphers.clear(); - foreach (const QString &cipherName, ciphers.split(QLatin1Char(':'), QString::SkipEmptyParts)) { + const auto cipherNames = ciphers.split(QLatin1Char(':'), QString::SkipEmptyParts); + for (const QString &cipherName : cipherNames) { QSslCipher cipher(cipherName); if (!cipher.isNull()) d->configuration.ciphers << cipher; @@ -2519,7 +2520,7 @@ void QSslSocketPrivate::_q_resumeImplementation() if (verifyErrorsHaveBeenIgnored()) { continueHandshake(); } else { - setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, sslErrors.first().errorString()); + setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, sslErrors.constFirst().errorString()); plainSocket->disconnectFromHost(); return; } diff --git a/src/network/ssl/qsslsocket_mac.cpp b/src/network/ssl/qsslsocket_mac.cpp index 99ae7923f4..c164342166 100644 --- a/src/network/ssl/qsslsocket_mac.cpp +++ b/src/network/ssl/qsslsocket_mac.cpp @@ -442,7 +442,7 @@ void QSslSocketPrivate::ensureInitialized() SSLGetSupportedCiphers(context, cfCiphers.data(), &numCiphers); for (size_t i = 0; i < size_t(cfCiphers.size()); ++i) { - const QSslCipher ciph(QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(cfCiphers[i])); + const QSslCipher ciph(QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(cfCiphers.at(i))); if (!ciph.isNull()) { ciphers << ciph; if (ciph.usedBits() >= 128) @@ -1033,7 +1033,7 @@ bool QSslSocketBackendPrivate::setSessionCertificate(QString &errorDescription, QSslCertificate localCertificate; if (!configuration.localCertificateChain.isEmpty()) - localCertificate = configuration.localCertificateChain[0]; + localCertificate = configuration.localCertificateChain.at(0); if (!localCertificate.isNull()) { // Require a private key as well. @@ -1227,7 +1227,7 @@ bool QSslSocketBackendPrivate::verifyPeerTrust() } // check the whole chain for blacklisting (including root, as we check for subjectInfo and issuer) - foreach (const QSslCertificate &cert, configuration.peerCertificateChain) { + for (const QSslCertificate &cert : qAsConst(configuration.peerCertificateChain)) { if (QSslCertificatePrivate::isBlacklisted(cert) && !canIgnoreVerify) { const QSslError error(QSslError::CertificateBlacklisted, cert); errors << error; @@ -1271,7 +1271,7 @@ bool QSslSocketBackendPrivate::verifyPeerTrust() // verify certificate chain QCFType<CFMutableArrayRef> certArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); - foreach (const QSslCertificate &cert, configuration.caCertificates) { + for (const QSslCertificate &cert : qAsConst(configuration.caCertificates)) { QCFType<CFDataRef> certData = cert.d->derData.toCFData(); QCFType<SecCertificateRef> certRef = SecCertificateCreateWithData(NULL, certData); CFArrayAppendValue(certArray, certRef); @@ -1327,7 +1327,7 @@ bool QSslSocketBackendPrivate::checkSslErrors() paused = true; } else { setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, - sslErrors.first().errorString()); + sslErrors.constFirst().errorString()); plainSocket->disconnectFromHost(); } return false; diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp index 5cbd2af323..c1ea10aefb 100644 --- a/src/network/ssl/qsslsocket_openssl.cpp +++ b/src/network/ssl/qsslsocket_openssl.cpp @@ -295,8 +295,8 @@ int q_X509Callback(int ok, X509_STORE_CTX *ctx) qCDebug(lcSsl) << "verification error: dumping bad certificate"; qCDebug(lcSsl) << QSslCertificatePrivate::QSslCertificate_from_X509(q_X509_STORE_CTX_get_current_cert(ctx)).toPem(); qCDebug(lcSsl) << "dumping chain"; - foreach (QSslCertificate cert, QSslSocketBackendPrivate::STACKOFX509_to_QSslCertificates(q_X509_STORE_CTX_get_chain(ctx))) { - QString certFormat(QStringLiteral("O=%1 CN=%2 L=%3 OU=%4 C=%5 ST=%6")); + const auto certs = QSslSocketBackendPrivate::STACKOFX509_to_QSslCertificates(q_X509_STORE_CTX_get_chain(ctx)); + for (const QSslCertificate &cert : certs) { qCDebug(lcSsl) << "Issuer:" << "O=" << cert.issuerInfo(QSslCertificate::Organization) << "CN=" << cert.issuerInfo(QSslCertificate::CommonName) << "L=" << cert.issuerInfo(QSslCertificate::LocalityName) @@ -746,9 +746,8 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates() certFiles.insert(it.fileInfo().canonicalFilePath()); } } - QSetIterator<QString> it(certFiles); - while (it.hasNext()) - systemCerts.append(QSslCertificate::fromPath(it.next(), platformEncodingFormat)); + for (const QString& file : qAsConst(certFiles)) + systemCerts.append(QSslCertificate::fromPath(file, platformEncodingFormat)); # ifndef Q_OS_ANDROID systemCerts.append(QSslCertificate::fromPath(QLatin1String("/etc/pki/tls/certs/ca-bundle.crt"), QSsl::Pem)); // Fedora, Mandriva systemCerts.append(QSslCertificate::fromPath(QLatin1String("/usr/local/share/certs/ca-root-nss.crt"), QSsl::Pem)); // FreeBSD's ca_root_nss @@ -1101,7 +1100,7 @@ bool QSslSocketBackendPrivate::startHandshake() QList<QSslError> errors; // check the whole chain for blacklisting (including root, as we check for subjectInfo and issuer) - foreach (const QSslCertificate &cert, configuration.peerCertificateChain) { + for (const QSslCertificate &cert : qAsConst(configuration.peerCertificateChain)) { if (QSslCertificatePrivate::isBlacklisted(cert)) { QSslError error(QSslError::CertificateBlacklisted, cert); errors << error; @@ -1234,7 +1233,7 @@ bool QSslSocketBackendPrivate::checkSslErrors() pauseSocketNotifiers(q); paused = true; } else { - setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, sslErrors.first().errorString()); + setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, sslErrors.constFirst().errorString()); plainSocket->disconnectFromHost(); } return false; @@ -1666,7 +1665,8 @@ QList<QSslError> QSslSocketBackendPrivate::verify(const QList<QSslCertificate> & } const QDateTime now = QDateTime::currentDateTimeUtc(); - foreach (const QSslCertificate &caCertificate, QSslConfiguration::defaultConfiguration().caCertificates()) { + const auto caCertificates = QSslConfiguration::defaultConfiguration().caCertificates(); + for (const QSslCertificate &caCertificate : caCertificates) { // From https://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.html: // // If several CA certificates matching the name, key identifier, and @@ -1700,7 +1700,7 @@ QList<QSslError> QSslSocketBackendPrivate::verify(const QList<QSslCertificate> & } bool first = true; - foreach (const QSslCertificate &cert, certificateChain) { + for (const QSslCertificate &cert : certificateChain) { if (first) { first = false; continue; diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp index f625fd3e96..66654e2a0d 100644 --- a/src/network/ssl/qsslsocket_openssl_symbols.cpp +++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp @@ -563,16 +563,16 @@ static QStringList libraryPathList() Q_NEVER_INLINE static QStringList findAllLibs(QLatin1String filter) { - QStringList paths = libraryPathList(); + const QStringList paths = libraryPathList(); QStringList found; const QStringList filters((QString(filter))); - foreach (const QString &path, paths) { + for (const QString &path : paths) { QDir dir(path); QStringList entryList = dir.entryList(filters, QDir::Files); std::sort(entryList.begin(), entryList.end(), LibGreaterThan()); - foreach (const QString &entry, entryList) + for (const QString &entry : qAsConst(entryList)) found << path + QLatin1Char('/') + entry; } @@ -702,16 +702,16 @@ static QPair<QLibrary*, QLibrary*> loadOpenSsl() #endif // third attempt: loop on the most common library paths and find libssl - QStringList sslList = findAllLibSsl(); - QStringList cryptoList = findAllLibCrypto(); + const QStringList sslList = findAllLibSsl(); + const QStringList cryptoList = findAllLibCrypto(); - foreach (const QString &crypto, cryptoList) { + for (const QString &crypto : cryptoList) { libcrypto->setFileNameAndVersion(crypto, -1); if (libcrypto->load()) { QFileInfo fi(crypto); QString version = fi.completeSuffix(); - foreach (const QString &ssl, sslList) { + for (const QString &ssl : sslList) { if (!ssl.endsWith(version)) continue; diff --git a/src/network/ssl/qsslsocket_winrt.cpp b/src/network/ssl/qsslsocket_winrt.cpp index 5704d6b151..f5dc9fcdcd 100644 --- a/src/network/ssl/qsslsocket_winrt.cpp +++ b/src/network/ssl/qsslsocket_winrt.cpp @@ -105,7 +105,7 @@ struct SslSocketGlobal void syncCaCertificates(const QSet<QSslCertificate> &add, const QSet<QSslCertificate> &remove) { QMutexLocker locker(&certificateMutex); - foreach (const QSslCertificate &certificate, add) { + for (const QSslCertificate &certificate : add) { QHash<QSslCertificate, QAtomicInt>::iterator it = additionalCertificates.find(certificate); if (it != additionalCertificates.end()) { it.value().ref(); // Add a reference @@ -117,7 +117,7 @@ struct SslSocketGlobal additionalCertificates.insert(certificate, 1); } } - foreach (const QSslCertificate &certificate, remove) { + for (const QSslCertificate &certificate : remove) { QHash<QSslCertificate, QAtomicInt>::iterator it = additionalCertificates.find(certificate); if (it != additionalCertificates.end() && !it.value().deref()) { // no more references, remove certificate @@ -617,7 +617,7 @@ HRESULT QSslSocketBackendPrivate::onSslUpgrade(IAsyncAction *action, AsyncStatus } // Peer chain validation - foreach (const QSslCertificate &certificate, peerCertificateChain) { + for (const QSslCertificate &certificate : qAsConst(peerCertificateChain)) { if (!QSslCertificatePrivate::isBlacklisted(certificate)) continue; @@ -628,10 +628,10 @@ HRESULT QSslSocketBackendPrivate::onSslUpgrade(IAsyncAction *action, AsyncStatus if (!sslErrors.isEmpty()) { emit q->sslErrors(sslErrors); - setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, sslErrors.first().errorString()); + setErrorAndEmit(QAbstractSocket::SslHandshakeFailedError, sslErrors.constFirst().errorString()); // Disconnect if there are any non-ignorable errors - foreach (const QSslError &error, sslErrors) { + for (const QSslError &error : qAsConst(sslErrors)) { if (ignoreErrorsList.contains(error)) continue; q->disconnectFromHost(); |