Changed: Use IOperationProgressListener for CDownloader

This commit is contained in:
kervala 2016-06-12 14:11:58 +02:00
parent 37587ca8a3
commit fa6f292065
4 changed files with 34 additions and 63 deletions

View file

@ -15,6 +15,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdpch.h"
#include "operation.h"
#include "downloader.h"
#include "nel/misc/system_info.h"
@ -24,9 +25,9 @@
#define new DEBUG_NEW
#endif
CDownloader::CDownloader(QObject *parent):QObject(parent), m_manager(NULL), m_reply(NULL), m_timer(NULL),
CDownloader::CDownloader(QObject *parent, IOperationProgressListener *listener):QObject(parent), m_listener(listener), m_manager(NULL), m_reply(NULL), m_timer(NULL),
m_offset(0), m_size(0), m_supportsAcceptRanges(false), m_supportsContentRange(false),
m_downloadAfterHead(false), m_aborted(false), m_file(NULL)
m_downloadAfterHead(false), m_file(NULL)
{
m_manager = new QNetworkAccessManager(this);
m_timer = new QTimer(this);
@ -60,7 +61,7 @@ bool CDownloader::prepareFile(const QString &url, const QString &fullPath)
m_downloadAfterHead = false;
emit downloadPrepare();
if (m_listener) m_listener->operationPrepare();
m_fullPath = fullPath;
m_url = url;
@ -86,15 +87,6 @@ bool CDownloader::getFile()
return true;
}
bool CDownloader::stop()
{
if (!m_reply) return false;
m_reply->abort();
return true;
}
void CDownloader::startTimer()
{
stopTimer();
@ -154,12 +146,12 @@ void CDownloader::getFileHead()
if (checkDownloadedFile())
{
// file is already downloaded
emit downloadSuccess(m_size);
if (m_listener) m_listener->operationSuccess(m_size);
}
else
{
// or has wrong size
emit downloadFail(tr("File (%1B) is larger than expected (%2B)").arg(m_offset).arg(m_size));
if (m_listener) m_listener->operationFail(tr("File (%1B) is larger than expected (%2B)").arg(m_offset).arg(m_size));
}
return;
@ -189,13 +181,13 @@ void CDownloader::downloadFile()
if (freeSpace < m_size - m_offset)
{
// we have not enough free disk space to continue download
emit downloadFail(tr("You only have %1 bytes left on device, but %2 bytes are required.").arg(freeSpace).arg(m_size - m_offset));
if (m_listener) m_listener->operationFail(tr("You only have %1 bytes left on device, but %2 bytes are required.").arg(freeSpace).arg(m_size - m_offset));
return;
}
if (!openFile())
{
emit downloadFail(tr("Unable to write file"));
if (m_listener) m_listener->operationFail(tr("Unable to write file"));
return;
}
@ -214,7 +206,7 @@ void CDownloader::downloadFile()
connect(m_reply, SIGNAL(downloadProgress(qint64, qint64)), SLOT(onDownloadProgress(qint64, qint64)));
connect(m_reply, SIGNAL(readyRead()), SLOT(onDownloadRead()));
emit downloadStart();
if (m_listener) m_listener->operationStart();
startTimer();
}
@ -230,7 +222,7 @@ void CDownloader::onTimeout()
{
qDebug() << "Timeout";
emit downloadFail(tr("Timeout"));
if (m_listener) m_listener->operationFail(tr("Timeout"));
}
void CDownloader::onHtmlPageFinished()
@ -267,7 +259,7 @@ void CDownloader::onHeadFinished()
{
if (redirection.isEmpty())
{
emit downloadFail(tr("Redirection URL is not defined"));
if (m_listener) m_listener->operationFail(tr("Redirection URL is not defined"));
return;
}
@ -289,7 +281,7 @@ void CDownloader::onHeadFinished()
else if (status == 200)
{
// update size
emit downloadInit(0, m_size);
if (m_listener) m_listener->operationInit(0, m_size);
if (!m_supportsAcceptRanges && acceptRanges == "bytes")
{
@ -321,7 +313,7 @@ void CDownloader::onHeadFinished()
m_size = regexp.cap(3).toLongLong();
// update offset and size
emit downloadInit(m_offset, m_size);
if (m_listener) m_listener->operationInit(m_offset, m_size);
}
else
{
@ -332,7 +324,7 @@ void CDownloader::onHeadFinished()
// other status
else
{
emit downloadFail(tr("Wrong status code: %1").arg(status));
if (m_listener) m_listener->operationFail(tr("Wrong status code: %1").arg(status));
return;
}
@ -356,28 +348,29 @@ void CDownloader::onDownloadFinished()
closeFile();
if (m_aborted)
if (m_listener && m_listener->operationShouldStop())
{
m_aborted = false;
emit downloadStop();
m_listener->operationStop();
}
else
{
bool ok = NLMISC::CFile::setFileModificationDate(m_fullPath.toUtf8().constData(), m_lastModified.toTime_t());
emit downloadSuccess(m_size);
if (m_listener) m_listener->operationSuccess(m_size);
}
}
void CDownloader::onError(QNetworkReply::NetworkError error)
{
if (!m_listener) return;
if (error == QNetworkReply::OperationCanceledError)
{
m_aborted = true;
m_listener->operationStop();
}
else
{
emit downloadFail(tr("Network error: %1").arg(error));
m_listener->operationFail(tr("Network error: %1").arg(error));
}
}
@ -385,7 +378,12 @@ void CDownloader::onDownloadProgress(qint64 current, qint64 total)
{
stopTimer();
emit downloadProgress(m_offset + current);
if (!m_listener) return;
m_listener->operationProgress(m_offset + current, ""); // TODO: put file
// abort download
if (m_listener->operationShouldStop() && m_reply) m_reply->abort();
}
void CDownloader::onDownloadRead()

View file

@ -17,6 +17,8 @@
#ifndef DOWNLOADER_H
#define DOWNLOADER_H
class IOperationProgressListener;
/**
* Files downloader, please note that only one file can be downloaded at once.
*
@ -28,41 +30,19 @@ class CDownloader : public QObject
Q_OBJECT
public:
CDownloader(QObject *parent);
CDownloader(QObject *parent, IOperationProgressListener *listener);
virtual ~CDownloader();
bool getHtmlPageContent(const QString &url);
bool prepareFile(const QString &url, const QString &fullPath);
bool getFile();
bool stop();
bool supportsResume() const { return m_supportsAcceptRanges && m_supportsContentRange; }
bool isDownloading() const { return m_file != NULL; }
signals:
// emitted when requesting real URL
void downloadPrepare();
// emitted when we got the initial (local) and total (remote) size of file
void downloadInit(qint64 current, qint64 total);
// emitted when we begin to download
void downloadStart();
// emitted when the download stopped
void downloadStop();
// emittd when downloading
void downloadProgress(qint64 current);
// emitted when the whole file is downloaded
void downloadSuccess(qint64 total);
// emitted when an error occurs
void downloadFail(const QString &error);
void htmlPageContent(const QString &html);
private slots:
@ -75,6 +55,8 @@ private slots:
void onDownloadRead();
protected:
IOperationProgressListener *m_listener;
void startTimer();
void stopTimer();
@ -102,7 +84,6 @@ protected:
bool m_supportsContentRange;
bool m_downloadAfterHead;
bool m_aborted;
QFile *m_file;
};

View file

@ -35,7 +35,7 @@ CMainWindow::CMainWindow():QMainWindow()
setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint);
// downloader
m_downloader = new CDownloader(this);
m_downloader = new CDownloader(this, NULL);
connect(m_downloader, SIGNAL(htmlPageContent(QString)), SLOT(onHtmlPageContent(QString)));

View file

@ -55,15 +55,7 @@ COperationDialog::COperationDialog(QWidget *parent):QDialog(parent), m_aborting(
// connect(stopButton, SIGNAL(clicked()), SLOT(onStopClicked()));
// downloader
m_downloader = new CDownloader(this);
connect(m_downloader, SIGNAL(downloadPrepare()), SLOT(onProgressPrepare()));
connect(m_downloader, SIGNAL(downloadInit(qint64, qint64)), SLOT(onProgressInit(qint64, qint64)));
connect(m_downloader, SIGNAL(downloadStart()), SLOT(onProgressStart()));
connect(m_downloader, SIGNAL(downloadStop()), SLOT(onProgressStop()));
connect(m_downloader, SIGNAL(downloadProgress(qint64, QString)), SLOT(onProgressProgress(qint64, QString)));
connect(m_downloader, SIGNAL(downloadSuccess(qint64)), SLOT(onProgressSuccess(qint64)));
connect(m_downloader, SIGNAL(downloadFail(QString)), SLOT(onProgressFail(QString)));
m_downloader = new CDownloader(this, this);
connect(operationButtonBox, SIGNAL(clicked(QAbstractButton*)), SLOT(onAbortClicked()));