summaryrefslogtreecommitdiff
path: root/src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp
diff options
context:
space:
mode:
authorPierre Rossi <pierre.rossi@digia.com>2014-09-03 17:25:07 +0200
committerPierre Rossi <pierre.rossi@gmail.com>2014-09-22 14:08:41 +0200
commiteef0ba60200d8039c05073ce707c2352ac0944a8 (patch)
tree993969f004733e6de39f6139c7c1089ab24516ff /src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp
parente51cecfc4e28bf7776abf89b9acb86ff5aa01ea0 (diff)
downloadqtxmlpatterns-eef0ba60200d8039c05073ce707c2352ac0944a8.tar.gz
Don't spin a nested event loop for loading schemas synchronously over HTTP.
Instead, use the internal synchronous load API in QNAM that relies on a separate thread with a blocking queued connection, just like QtWebKit does for synchronous XHR. FTP doesn't support this attribute, so we have to keep the event loop trick for that one. Change-Id: I785fa6d967160552b31778fcfc120d7ec4194a08 Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp')
-rw-r--r--src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp b/src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp
index 7c877c6..85ea41a 100644
--- a/src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp
+++ b/src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp
@@ -110,15 +110,20 @@ QNetworkReply *AccelTreeResourceLoader::load(const QUrl &uri,
Q_ASSERT(networkManager);
Q_ASSERT(uri.isValid());
- NetworkLoop networkLoop;
-
+ const bool ftpSchemeUsed = (uri.scheme() == QStringLiteral("ftp"));
+ // QNAM doesn't have support for SynchronousRequestAttribute in its ftp backend.
+ QEventLoop ftpNetworkLoop;
QNetworkRequest request(uri);
+ if (!ftpSchemeUsed)
+ request.setAttribute(QNetworkRequest::SynchronousRequestAttribute, true);
QNetworkReply *const reply = networkManager->get(request);
- networkLoop.connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(error(QNetworkReply::NetworkError)));
- networkLoop.connect(reply, SIGNAL(finished()), SLOT(finished()));
+ if (ftpSchemeUsed) {
+ ftpNetworkLoop.connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(quit()));
+ ftpNetworkLoop.connect(reply, SIGNAL(finished()), SLOT(quit()));
+ ftpNetworkLoop.exec(QEventLoop::ExcludeUserInputEvents);
+ }
- if(networkLoop.exec(QEventLoop::ExcludeUserInputEvents))
- {
+ if (reply->error() != QNetworkReply::NoError) {
const QString errorMessage(escape(reply->errorString()));
/* Note, we delete reply before we exit this function with error(). */
@@ -130,8 +135,7 @@ QNetworkReply *AccelTreeResourceLoader::load(const QUrl &uri,
context->error(errorMessage, ReportContext::FODC0002, location);
return 0;
- }
- else
+ } else
return reply;
}