更新模块
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.5 KiB

11 months ago
#include "downloader.h"
#include <QCoreApplication>
#include <QDebug>
#include <QJsonDocument>
#include <QRegularExpression>
Downloader::Downloader(QObject *parent)
: QObject{parent}
{
m_pNetWorkAccessManager = new QNetworkAccessManager(this);
dir.setPath(QCoreApplication::applicationDirPath());
}
void Downloader::setUrl(const QString &_url)
{
m_pUrl = QUrl(_url);
}
void Downloader::startDownload(const QString &_url)
{
if(m_bIsDownloading)
return;
m_bIsDownloading = true;
if(!_url.isEmpty())
m_pUrl.setUrl(_url);
if(!dir.exists())
{
dir.mkpath(".");
}
/* Rename old downloads */
QString _path = dir.path() + "/" + m_fileName;
if(QFile::exists(_path))
{
QFile _file(_path);
_file.rename(_path + "_" + QDateTime::currentDateTime().toString("yyyy-MM-dd"));
}
QFile::remove(dir.filePath(m_fileName));
QFile::remove(dir.filePath(m_fileName + ".part"));
QNetworkRequest request;
request.setUrl(m_pUrl);
m_pReply = m_pNetWorkAccessManager->get(request);
connect(m_pReply, &QNetworkReply::downloadProgress, this, [&](qint64 received, qint64 total)
{
emit doProgress(received, total);
if (total > 0)
{
if(file.fileName() != (dir.filePath(m_fileName + ".part")))
file.setFileName(dir.filePath(m_fileName + ".part"));
if(!file.isOpen())
{
file.open(QIODevice::WriteOnly | QIODevice::Append);
}
file.write(m_pReply->readAll());
}
});
connect(m_pReply, &QNetworkReply::metaDataChanged, this, [&]()
{
QString filename = "";
QVariant variant = m_pReply->header( QNetworkRequest::ContentDispositionHeader );
if ( variant.isValid() )
{
QString contentDisposition = QByteArray::fromPercentEncoding( variant.toByteArray() ).constData();
QRegularExpression regExp( "(.*)filename=\"(?<filename>.*)\"" );
QRegularExpressionMatch match = regExp.match( contentDisposition );
if ( match.hasMatch() )
{
filename = match.captured( "filename" );
}
m_fileName = filename;
auto localApplicationFilePath = QCoreApplication::applicationDirPath();
file.setFileName(localApplicationFilePath + "/" + m_fileName);
};
});
// connect(m_pReply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
connect(m_pReply, &QNetworkReply::finished, this, [&]()
{
if(file.isOpen())
file.close();
if(!file.exists())
{
emit doShowInfo("not exits");
}
if(file.isOpen())
{
emit doShowInfo("not close");
}
if(!file.rename(dir.path() + "/" + m_fileName))
{
emit doShowInfo("rename file failed");
}
file.setFileName(dir.filePath(m_fileName));
m_bIsDownloading = false;
emit doFinished();
});
connect(m_pReply, SIGNAL(errorOccurred(QNetworkReply::NetworkError)), this, SIGNAL(onError(QNetworkReply::NetworkError)));
}
void Downloader::checkVersion()
{
QNetworkRequest request(CHECK_URL);
m_pNetWorkAccessManager->get(request);
}
const QFile &Downloader::getFile() const
{
return file;
}
const QDir &Downloader::getDir() const
{
return dir;
}
const QString &Downloader::fileName() const
{
return m_fileName;
}
void Downloader::setFileName(const QString &newFileName)
{
m_fileName = newFileName;
}