From 0473d2bd344ab7f6ad4037c6b33a4735036d238a Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 11 Sep 2014 11:59:23 +0200 Subject: QNetworkRequest: Add new enum to emit all uploadProgress signals ... so that a user can have more fine-grained uploadProgress signal emissions if desired. Change-Id: I9f77fd80c100dbe249beaf3057e6e8974680ec59 Reviewed-by: Markus Goetz Reviewed-by: Richard J. Moore --- src/network/access/qnetworkreply.cpp | 1 + src/network/access/qnetworkreply_p.h | 1 + src/network/access/qnetworkreplyhttpimpl.cpp | 19 +++++--- src/network/access/qnetworkreplyimpl.cpp | 18 +++++--- src/network/access/qnetworkrequest.cpp | 7 +++ src/network/access/qnetworkrequest.h | 1 + .../access/qnetworkreply/tst_qnetworkreply.cpp | 54 ++++++++++++++++++++++ 7 files changed, 87 insertions(+), 14 deletions(-) diff --git a/src/network/access/qnetworkreply.cpp b/src/network/access/qnetworkreply.cpp index 39762e2324..1ec3fe31ac 100644 --- a/src/network/access/qnetworkreply.cpp +++ b/src/network/access/qnetworkreply.cpp @@ -41,6 +41,7 @@ const int QNetworkReplyPrivate::progressSignalInterval = 100; QNetworkReplyPrivate::QNetworkReplyPrivate() : readBufferMaxSize(0), + emitAllUploadProgressSignals(false), operation(QNetworkAccessManager::UnknownOperation), errorCode(QNetworkReply::NoError) , isFinished(false) diff --git a/src/network/access/qnetworkreply_p.h b/src/network/access/qnetworkreply_p.h index 6a68ecfea3..1d7d027954 100644 --- a/src/network/access/qnetworkreply_p.h +++ b/src/network/access/qnetworkreply_p.h @@ -74,6 +74,7 @@ public: qint64 readBufferMaxSize; QElapsedTimer downloadProgressSignalChoke; QElapsedTimer uploadProgressSignalChoke; + bool emitAllUploadProgressSignals; const static int progressSignalInterval; QNetworkAccessManager::Operation operation; QNetworkReply::NetworkError errorCode; diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp index 2af23a4eb5..f4fdc78576 100644 --- a/src/network/access/qnetworkreplyhttpimpl.cpp +++ b/src/network/access/qnetworkreplyhttpimpl.cpp @@ -753,6 +753,9 @@ void QNetworkReplyHttpImplPrivate::postRequest() QNetworkRequest::Automatic).toInt()) == QNetworkRequest::Manual) httpRequest.setWithCredentials(false); + if (request.attribute(QNetworkRequest::EmitAllUploadProgressSignalsAttribute).toBool() == true) + emitAllUploadProgressSignals = true; + // Create the HTTP thread delegate QHttpThreadDelegate *delegate = new QHttpThreadDelegate; @@ -1854,14 +1857,16 @@ void QNetworkReplyHttpImplPrivate::emitReplyUploadProgress(qint64 bytesSent, qin if (isFinished) return; - //choke signal emissions, except the first and last signals which are unconditional - if (uploadProgressSignalChoke.isValid()) { - if (bytesSent != bytesTotal && uploadProgressSignalChoke.elapsed() < progressSignalInterval) { - return; + if (!emitAllUploadProgressSignals) { + //choke signal emissions, except the first and last signals which are unconditional + if (uploadProgressSignalChoke.isValid()) { + if (bytesSent != bytesTotal && uploadProgressSignalChoke.elapsed() < progressSignalInterval) { + return; + } + uploadProgressSignalChoke.restart(); + } else { + uploadProgressSignalChoke.start(); } - uploadProgressSignalChoke.restart(); - } else { - uploadProgressSignalChoke.start(); } emit q->uploadProgress(bytesSent, bytesTotal); diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp index 5af3bb37be..3c7a911974 100644 --- a/src/network/access/qnetworkreplyimpl.cpp +++ b/src/network/access/qnetworkreplyimpl.cpp @@ -59,6 +59,8 @@ inline QNetworkReplyImplPrivate::QNetworkReplyImplPrivate() , downloadBufferMaximumSize(0) , downloadBuffer(0) { + if (request.attribute(QNetworkRequest::EmitAllUploadProgressSignalsAttribute).toBool() == true) + emitAllUploadProgressSignals = true; } void QNetworkReplyImplPrivate::_q_startOperation() @@ -542,14 +544,16 @@ void QNetworkReplyImplPrivate::emitUploadProgress(qint64 bytesSent, qint64 bytes Q_Q(QNetworkReplyImpl); bytesUploaded = bytesSent; - //choke signal emissions, except the first and last signals which are unconditional - if (uploadProgressSignalChoke.isValid()) { - if (bytesSent != bytesTotal && uploadProgressSignalChoke.elapsed() < progressSignalInterval) { - return; + if (!emitAllUploadProgressSignals) { + //choke signal emissions, except the first and last signals which are unconditional + if (uploadProgressSignalChoke.isValid()) { + if (bytesSent != bytesTotal && uploadProgressSignalChoke.elapsed() < progressSignalInterval) { + return; + } + uploadProgressSignalChoke.restart(); + } else { + uploadProgressSignalChoke.start(); } - uploadProgressSignalChoke.restart(); - } else { - uploadProgressSignalChoke.start(); } pauseNotificationHandling(); diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp index c51470e25a..2c0486d615 100644 --- a/src/network/access/qnetworkrequest.cpp +++ b/src/network/access/qnetworkrequest.cpp @@ -249,6 +249,13 @@ QT_BEGIN_NAMESPACE Indicates whether SPDY was used for receiving this reply. + \value EmitAllUploadProgressSignalsAttribute + Requests only, type: QMetaType::Bool (default: false) + Indicates whether all upload signals should be emitted. + By default, the uploadProgress signal is emitted only + in 100 millisecond intervals. + (This value was introduced in 5.5.) + \value User Special type. Additional information can be passed in QVariants with types ranging from User to UserMax. The default diff --git a/src/network/access/qnetworkrequest.h b/src/network/access/qnetworkrequest.h index 0239ae7f4b..3221438db4 100644 --- a/src/network/access/qnetworkrequest.h +++ b/src/network/access/qnetworkrequest.h @@ -80,6 +80,7 @@ public: BackgroundRequestAttribute, SpdyAllowedAttribute, SpdyWasUsedAttribute, + EmitAllUploadProgressSignalsAttribute, User = 1000, UserMax = 32767 diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp index ce1a4cee06..7ec35fb3c2 100644 --- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp @@ -315,6 +315,7 @@ private Q_SLOTS: void ioPostToHttpFromMiddleOfQBufferFiveBytes(); void ioPostToHttpNoBufferFlag(); void ioPostToHttpUploadProgress(); + void emitAllUploadProgressSignals(); void ioPostToHttpEmptyUploadProgress(); void lastModifiedHeaderForFile(); @@ -4979,6 +4980,59 @@ void tst_QNetworkReply::ioPostToHttpUploadProgress() server.close(); } +void tst_QNetworkReply::emitAllUploadProgressSignals() +{ + QFile sourceFile(testDataDir + "/image1.jpg"); + QVERIFY(sourceFile.open(QIODevice::ReadOnly)); + + // emulate a minimal http server + QTcpServer server; + server.listen(QHostAddress(QHostAddress::LocalHost), 0); + connect(&server, SIGNAL(newConnection()), &QTestEventLoop::instance(), SLOT(exitLoop())); + + QUrl url = QUrl(QString("http://127.0.0.1:%1/").arg(server.serverPort())); + QNetworkRequest normalRequest(url); + normalRequest.setRawHeader("Content-Type", "application/octet-stream"); + + QNetworkRequest catchAllSignalsRequest(normalRequest); + catchAllSignalsRequest.setAttribute(QNetworkRequest::EmitAllUploadProgressSignalsAttribute, true); + + QList requests; + requests << normalRequest << catchAllSignalsRequest; + + QList signalCount; + + foreach (const QNetworkRequest &request, requests) { + + sourceFile.seek(0); + QNetworkReplyPtr reply(manager.post(request, &sourceFile)); + QSignalSpy spy(reply.data(), SIGNAL(uploadProgress(qint64,qint64))); + + // get the request started and the incoming socket connected + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + QTcpSocket *incomingSocket = server.nextPendingConnection(); + QVERIFY(incomingSocket); + QTestEventLoop::instance().enterLoop(10); + + connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + incomingSocket->write("HTTP/1.0 200 OK\r\n"); + incomingSocket->write("Content-Length: 0\r\n"); + incomingSocket->write("\r\n"); + QTestEventLoop::instance().enterLoop(10); + // not timeouted -> finished() was emitted + QVERIFY(!QTestEventLoop::instance().timeout()); + + incomingSocket->close(); + signalCount.append(spy.count()); + reply->deleteLater(); + } + server.close(); + + // verify that the normal request emitted less signals than the one emitting all signals + QVERIFY2(signalCount.at(0) < signalCount.at(1), "no upload signal was suppressed"); +} + void tst_QNetworkReply::ioPostToHttpEmptyUploadProgress() { QByteArray ba; -- cgit v1.2.3