From 05d3273591c197c24bb27a3a3efcd45da908e32e Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Wed, 19 Mar 2014 15:19:09 +0100 Subject: [PATCH] Detect the error that may happen when downloading a file --- src/mirall/propagator_qnam.cpp | 24 +++++++++++++++++++++--- src/mirall/propagator_qnam.h | 6 ++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/mirall/propagator_qnam.cpp b/src/mirall/propagator_qnam.cpp index 648e33f3c0..fa4cc2b1cf 100644 --- a/src/mirall/propagator_qnam.cpp +++ b/src/mirall/propagator_qnam.cpp @@ -296,8 +296,26 @@ void GETFileJob::start() { void GETFileJob::slotReadyRead() { - // FIXME: error handling (hard drive full, ....) - _device->write(reply()->readAll()); + int bufferSize = qMax(1024*8ll , reply()->bytesAvailable()); + QByteArray buffer(bufferSize, Qt::Uninitialized); + + while(reply()->bytesAvailable() > 0) { + qint64 r = reply()->read(buffer.data(), bufferSize); + if (r < 0) { + _errorString = reply()->errorString(); + qDebug() << "Error while reading from device: " << _errorString; + reply()->abort(); + return; + } + + qint64 w = _device->write(buffer.constData(), r); + if (w != r) { + _errorString = _device->errorString(); + qDebug() << "Error while writing to file" << w << r << _errorString; + reply()->abort(); + return; + } + } } @@ -395,7 +413,7 @@ void PropagateDownloadFileQNAM::slotGetFinished() } _item._httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); _propagator->_activeJobs--; - done(classifyError(err, _item._httpErrorCode), job->reply()->errorString()); + done(classifyError(err, _item._httpErrorCode), job->errorString()); return; } diff --git a/src/mirall/propagator_qnam.h b/src/mirall/propagator_qnam.h index f42bf07b45..0740a91911 100644 --- a/src/mirall/propagator_qnam.h +++ b/src/mirall/propagator_qnam.h @@ -97,7 +97,9 @@ class GETFileJob : public AbstractNetworkJob { Q_OBJECT QIODevice* _device; QMap _headers; + QString _errorString; public: + // DOES NOT take owncership of the device. explicit GETFileJob(Account* account, const QString& path, QIODevice *device, const QMap &headers, QObject* parent = 0) @@ -108,6 +110,10 @@ public: emit finishedSignal(); } + QString errorString() { + return _errorString.isEmpty() ? reply()->errorString() : _errorString; + }; + signals: void finishedSignal(); void downloadProgress(qint64,qint64);