Changed: Use IOperationProgressListener for CDownloader
This commit is contained in:
parent
7f7c9aa1f5
commit
38d50cd5ec
4 changed files with 34 additions and 63 deletions
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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)));
|
||||
|
||||
|
|
|
@ -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()));
|
||||
|
||||
|
|
Loading…
Reference in a new issue