mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-17 11:28:07 +00:00
Fix codec downloading and popup progress bar.
This commit is contained in:
parent
338772da77
commit
1ebcc2f565
4 changed files with 292 additions and 280 deletions
|
|
@ -4,7 +4,12 @@ All notable changes to this project will be documented in this file.
|
|||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## 4.4.0 - [Undefined]
|
||||
## 4.4.1 - [undefined]
|
||||
|
||||
### Fixed
|
||||
- Fix codec downloading on Windows and popup progress bar.
|
||||
|
||||
## 4.4.0 - 2022-04-04
|
||||
|
||||
### Added
|
||||
- Features:
|
||||
|
|
|
|||
|
|
@ -29,259 +29,267 @@
|
|||
// =============================================================================
|
||||
|
||||
namespace {
|
||||
constexpr char cDefaultFileName[] = "download";
|
||||
constexpr char cDefaultFileName[] = "download";
|
||||
}
|
||||
|
||||
static QString getDownloadFilePath (const QString &folder, const QUrl &url, const bool& overwrite) {
|
||||
QFileInfo fileInfo(url.path());
|
||||
QString fileName = fileInfo.fileName();
|
||||
if (fileName.isEmpty())
|
||||
fileName = cDefaultFileName;
|
||||
|
||||
fileName.prepend(folder);
|
||||
if( overwrite && QFile::exists(fileName))
|
||||
QFile::remove(fileName);
|
||||
if (!QFile::exists(fileName))
|
||||
return fileName;
|
||||
|
||||
// Already exists, don't overwrite.
|
||||
QString baseName = fileInfo.completeBaseName();
|
||||
if (baseName.isEmpty())
|
||||
baseName = cDefaultFileName;
|
||||
|
||||
QString suffix = fileInfo.suffix();
|
||||
if (!suffix.isEmpty())
|
||||
suffix.prepend(".");
|
||||
|
||||
for (int i = 1; true; ++i) {
|
||||
fileName = folder + baseName + "(" + QString::number(i) + ")" + suffix;
|
||||
if (!QFile::exists(fileName))
|
||||
break;
|
||||
}
|
||||
return fileName;
|
||||
QFileInfo fileInfo(url.path());
|
||||
QString fileName = fileInfo.fileName();
|
||||
if (fileName.isEmpty())
|
||||
fileName = cDefaultFileName;
|
||||
|
||||
fileName.prepend(folder);
|
||||
if( overwrite && QFile::exists(fileName))
|
||||
QFile::remove(fileName);
|
||||
if (!QFile::exists(fileName))
|
||||
return fileName;
|
||||
|
||||
// Already exists, don't overwrite.
|
||||
QString baseName = fileInfo.completeBaseName();
|
||||
if (baseName.isEmpty())
|
||||
baseName = cDefaultFileName;
|
||||
|
||||
QString suffix = fileInfo.suffix();
|
||||
if (!suffix.isEmpty())
|
||||
suffix.prepend(".");
|
||||
|
||||
for (int i = 1; true; ++i) {
|
||||
fileName = folder + baseName + "(" + QString::number(i) + ")" + suffix;
|
||||
if (!QFile::exists(fileName))
|
||||
break;
|
||||
}
|
||||
return fileName;
|
||||
}
|
||||
|
||||
static bool isHttpRedirect (QNetworkReply *reply) {
|
||||
Q_CHECK_PTR(reply);
|
||||
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
return statusCode == 301 || statusCode == 302 || statusCode == 303
|
||||
|| statusCode == 305 || statusCode == 307 || statusCode == 308;
|
||||
Q_CHECK_PTR(reply);
|
||||
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
return statusCode == 301 || statusCode == 302 || statusCode == 303
|
||||
|| statusCode == 305 || statusCode == 307 || statusCode == 308;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
void FileDownloader::download () {
|
||||
if (mDownloading) {
|
||||
qWarning() << "Unable to download file. Already downloading!";
|
||||
return;
|
||||
}
|
||||
setDownloading(true);
|
||||
|
||||
QNetworkRequest request(mUrl);
|
||||
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
|
||||
mNetworkReply = mManager.get(request);
|
||||
|
||||
QNetworkReply *data = mNetworkReply.data();
|
||||
|
||||
QObject::connect(data, &QNetworkReply::readyRead, this, &FileDownloader::handleReadyData);
|
||||
QObject::connect(data, &QNetworkReply::finished, this, &FileDownloader::handleDownloadFinished);
|
||||
QObject::connect(data, QNonConstOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error), this, &FileDownloader::handleError);
|
||||
QObject::connect(data, &QNetworkReply::downloadProgress, this, &FileDownloader::handleDownloadProgress);
|
||||
|
||||
#if QT_CONFIG(ssl)
|
||||
QObject::connect(data, &QNetworkReply::sslErrors, this, &FileDownloader::handleSslErrors);
|
||||
#endif
|
||||
|
||||
if (mDownloadFolder.isEmpty()) {
|
||||
if(CoreManager::isInstanciated())
|
||||
mDownloadFolder = CoreManager::getInstance()->getSettingsModel()->getDownloadFolder();
|
||||
else
|
||||
mDownloadFolder = QDir::cleanPath(Utils::coreStringToAppString(Paths::getDownloadDirPath ()) + QDir::separator());
|
||||
emit downloadFolderChanged(mDownloadFolder);
|
||||
}
|
||||
|
||||
Q_ASSERT(!mDestinationFile.isOpen());
|
||||
mDestinationFile.setFileName(getDownloadFilePath(QDir::cleanPath(mDownloadFolder) + QDir::separator(), mUrl, mOverwriteFile));
|
||||
if (!mDestinationFile.open(QIODevice::WriteOnly))
|
||||
emitOutputError();
|
||||
else {
|
||||
mTimeoutReadBytes = 0;
|
||||
mTimeout.start();
|
||||
}
|
||||
if (mDownloading) {
|
||||
qWarning() << "Unable to download file. Already downloading!";
|
||||
return;
|
||||
}
|
||||
setDownloading(true);
|
||||
|
||||
QNetworkRequest request(mUrl);
|
||||
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
|
||||
mNetworkReply = mManager.get(request);
|
||||
|
||||
QNetworkReply *data = mNetworkReply.data();
|
||||
|
||||
QObject::connect(data, &QNetworkReply::readyRead, this, &FileDownloader::handleReadyData);
|
||||
QObject::connect(data, &QNetworkReply::finished, this, &FileDownloader::handleDownloadFinished);
|
||||
#if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)
|
||||
QObject::connect(data, &QNetworkReply::errorOccurred, this, &FileDownloader::handleError);
|
||||
#else
|
||||
QObject::connect(data, QNonConstOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error), this, &FileDownloader::handleError);
|
||||
#endif
|
||||
QObject::connect(data, &QNetworkReply::downloadProgress, this, &FileDownloader::handleDownloadProgress);
|
||||
|
||||
#if QT_CONFIG(ssl)
|
||||
QObject::connect(data, &QNetworkReply::sslErrors, this, &FileDownloader::handleSslErrors);
|
||||
#endif
|
||||
|
||||
if (mDownloadFolder.isEmpty()) {
|
||||
if(CoreManager::isInstanciated())
|
||||
mDownloadFolder = CoreManager::getInstance()->getSettingsModel()->getDownloadFolder();
|
||||
else
|
||||
mDownloadFolder = QDir::cleanPath(Utils::coreStringToAppString(Paths::getDownloadDirPath ()) + QDir::separator());
|
||||
emit downloadFolderChanged(mDownloadFolder);
|
||||
}
|
||||
|
||||
Q_ASSERT(!mDestinationFile.isOpen());
|
||||
mDestinationFile.setFileName(getDownloadFilePath(QDir::cleanPath(mDownloadFolder) + QDir::separator(), mUrl, mOverwriteFile));
|
||||
if (!mDestinationFile.open(QIODevice::WriteOnly))
|
||||
emitOutputError();
|
||||
else {
|
||||
mTimeoutReadBytes = 0;
|
||||
mTimeout.start();
|
||||
}
|
||||
}
|
||||
|
||||
bool FileDownloader::remove () {
|
||||
return mDestinationFile.exists() && !mDestinationFile.isOpen() && mDestinationFile.remove();
|
||||
return mDestinationFile.exists() && !mDestinationFile.isOpen() && mDestinationFile.remove();
|
||||
}
|
||||
|
||||
void FileDownloader::emitOutputError () {
|
||||
qWarning() << QStringLiteral("Could not write into `%1` (%2).")
|
||||
.arg(mDestinationFile.fileName()).arg(mDestinationFile.errorString());
|
||||
mNetworkReply->abort();
|
||||
qWarning() << QStringLiteral("Could not write into `%1` (%2).")
|
||||
.arg(mDestinationFile.fileName()).arg(mDestinationFile.errorString());
|
||||
mNetworkReply->abort();
|
||||
}
|
||||
|
||||
void FileDownloader::cleanDownloadEnd () {
|
||||
mTimeout.stop();
|
||||
mNetworkReply->deleteLater();
|
||||
setDownloading(false);
|
||||
mTimeout.stop();
|
||||
mNetworkReply->deleteLater();
|
||||
setDownloading(false);
|
||||
}
|
||||
|
||||
void FileDownloader::handleReadyData () {
|
||||
QByteArray data = mNetworkReply->readAll();
|
||||
if (mDestinationFile.write(data) == -1)
|
||||
emitOutputError();
|
||||
QByteArray data = mNetworkReply->readAll();
|
||||
if (mDestinationFile.write(data) == -1)
|
||||
emitOutputError();
|
||||
}
|
||||
|
||||
void FileDownloader::handleDownloadFinished() {
|
||||
if (mNetworkReply->error() != QNetworkReply::NoError)
|
||||
return;
|
||||
|
||||
if (isHttpRedirect(mNetworkReply)) {
|
||||
qWarning() << QStringLiteral("Request was redirected.");
|
||||
mDestinationFile.remove();
|
||||
cleanDownloadEnd();
|
||||
emit downloadFailed();
|
||||
} else {
|
||||
qInfo() << QStringLiteral("Download of %1 finished to %2").arg(mUrl.toString(), mDestinationFile.fileName());
|
||||
mDestinationFile.close();
|
||||
cleanDownloadEnd();
|
||||
emit downloadFinished(mDestinationFile.fileName());
|
||||
}
|
||||
if (mNetworkReply->error() != QNetworkReply::NoError)
|
||||
return;
|
||||
|
||||
if (isHttpRedirect(mNetworkReply)) {
|
||||
qWarning() << QStringLiteral("Request was redirected.");
|
||||
mDestinationFile.remove();
|
||||
cleanDownloadEnd();
|
||||
emit downloadFailed();
|
||||
} else {
|
||||
qInfo() << QStringLiteral("Download of %1 finished to %2").arg(mUrl.toString(), mDestinationFile.fileName());
|
||||
mDestinationFile.close();
|
||||
cleanDownloadEnd();
|
||||
emit downloadFinished(mDestinationFile.fileName());
|
||||
}
|
||||
}
|
||||
|
||||
void FileDownloader::handleError (QNetworkReply::NetworkError code) {
|
||||
if (code != QNetworkReply::OperationCanceledError)
|
||||
qWarning() << QStringLiteral("Download of %1 failed: %2")
|
||||
.arg(mUrl.toString()).arg(mNetworkReply->errorString());
|
||||
mDestinationFile.remove();
|
||||
|
||||
cleanDownloadEnd();
|
||||
|
||||
emit downloadFailed();
|
||||
if (code != QNetworkReply::OperationCanceledError)
|
||||
qWarning() << QStringLiteral("Download of %1 failed: %2")
|
||||
.arg(mUrl.toString()).arg(mNetworkReply->errorString());
|
||||
mDestinationFile.remove();
|
||||
|
||||
cleanDownloadEnd();
|
||||
|
||||
emit downloadFailed();
|
||||
}
|
||||
|
||||
void FileDownloader::handleSslErrors (const QList<QSslError> &sslErrors) {
|
||||
#if QT_CONFIG(ssl)
|
||||
for (const QSslError &error : sslErrors)
|
||||
qWarning() << QStringLiteral("SSL error: %1").arg(error.errorString());
|
||||
#else
|
||||
Q_UNUSED(sslErrors);
|
||||
#endif
|
||||
#if QT_CONFIG(ssl)
|
||||
for (const QSslError &error : sslErrors)
|
||||
qWarning() << QStringLiteral("SSL error: %1").arg(error.errorString());
|
||||
#else
|
||||
Q_UNUSED(sslErrors);
|
||||
#endif
|
||||
}
|
||||
|
||||
void FileDownloader::handleTimeout () {
|
||||
if (mReadBytes == mTimeoutReadBytes) {
|
||||
qWarning() << QStringLiteral("Download of %1 failed: timeout.").arg(mUrl.toString());
|
||||
mNetworkReply->abort();
|
||||
} else
|
||||
mTimeoutReadBytes = mReadBytes;
|
||||
if (mReadBytes == mTimeoutReadBytes) {
|
||||
qWarning() << QStringLiteral("Download of %1 failed: timeout.").arg(mUrl.toString());
|
||||
mNetworkReply->abort();
|
||||
} else
|
||||
mTimeoutReadBytes = mReadBytes;
|
||||
}
|
||||
|
||||
void FileDownloader::handleDownloadProgress (qint64 readBytes, qint64 totalBytes) {
|
||||
setReadBytes(readBytes);
|
||||
setTotalBytes(totalBytes);
|
||||
setReadBytes(readBytes);
|
||||
setTotalBytes(totalBytes);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
QUrl FileDownloader::getUrl () const {
|
||||
return mUrl;
|
||||
return mUrl;
|
||||
}
|
||||
|
||||
void FileDownloader::setUrl (const QUrl &url) {
|
||||
if (mDownloading) {
|
||||
qWarning() << QStringLiteral("Unable to set url, a file is downloading.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mUrl != url) {
|
||||
mUrl = url;
|
||||
emit urlChanged(mUrl);
|
||||
}
|
||||
if (mDownloading) {
|
||||
qWarning() << QStringLiteral("Unable to set url, a file is downloading.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mUrl != url) {
|
||||
mUrl = url;
|
||||
if(!QSslSocket::supportsSsl() && mUrl.scheme() == "https") {
|
||||
qWarning() << "Https has been requested but SSL is not supported. Fallback to http. Install manually OpenSSL libraries in your PATH.";
|
||||
mUrl.setScheme("http");
|
||||
}
|
||||
emit urlChanged(mUrl);
|
||||
}
|
||||
}
|
||||
|
||||
QString FileDownloader::getDownloadFolder () const {
|
||||
return mDownloadFolder;
|
||||
return mDownloadFolder;
|
||||
}
|
||||
|
||||
void FileDownloader::setDownloadFolder (const QString &downloadFolder) {
|
||||
if (mDownloading) {
|
||||
qWarning() << QStringLiteral("Unable to set download folder, a file is downloading.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mDownloadFolder != downloadFolder) {
|
||||
mDownloadFolder = downloadFolder;
|
||||
emit downloadFolderChanged(mDownloadFolder);
|
||||
}
|
||||
if (mDownloading) {
|
||||
qWarning() << QStringLiteral("Unable to set download folder, a file is downloading.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mDownloadFolder != downloadFolder) {
|
||||
mDownloadFolder = downloadFolder;
|
||||
emit downloadFolderChanged(mDownloadFolder);
|
||||
}
|
||||
}
|
||||
|
||||
QString FileDownloader::getDestinationFileName () const{
|
||||
return mDestinationFile.fileName();
|
||||
return mDestinationFile.fileName();
|
||||
}
|
||||
|
||||
void FileDownloader::setOverwriteFile(const bool &overwrite){
|
||||
mOverwriteFile = overwrite;
|
||||
mOverwriteFile = overwrite;
|
||||
}
|
||||
|
||||
QString FileDownloader::synchronousDownload(const QUrl &url, const QString &destinationFolder, const bool &overwriteFile){
|
||||
QString filePath;
|
||||
FileDownloader downloader;
|
||||
if(url.isRelative())
|
||||
qWarning() << "FileDownloader: The specified URL is not valid";
|
||||
else{
|
||||
bool isOver = false;
|
||||
bool * pIsOver = &isOver;
|
||||
downloader.setUrl(url);
|
||||
downloader.setOverwriteFile(overwriteFile);
|
||||
downloader.setDownloadFolder(destinationFolder);
|
||||
connect(&downloader, &FileDownloader::downloadFinished, [pIsOver]()mutable{
|
||||
*pIsOver=true;
|
||||
});
|
||||
connect(&downloader, &FileDownloader::downloadFailed, [pIsOver]()mutable{
|
||||
*pIsOver=true;
|
||||
});
|
||||
downloader.download();
|
||||
if(QTest::qWaitFor([&]() {return isOver;}, DefaultTimeout)){
|
||||
filePath = downloader.getDestinationFileName();
|
||||
if(!QFile::exists(filePath)) {
|
||||
filePath = "";
|
||||
qWarning() << "FileDownloader: Cannot download the specified file";
|
||||
}
|
||||
}
|
||||
}
|
||||
return filePath;
|
||||
QString filePath;
|
||||
FileDownloader downloader;
|
||||
if(url.isRelative())
|
||||
qWarning() << "FileDownloader: The specified URL is not valid";
|
||||
else{
|
||||
bool isOver = false;
|
||||
bool * pIsOver = &isOver;
|
||||
downloader.setUrl(url);
|
||||
downloader.setOverwriteFile(overwriteFile);
|
||||
downloader.setDownloadFolder(destinationFolder);
|
||||
connect(&downloader, &FileDownloader::downloadFinished, [pIsOver]()mutable{
|
||||
*pIsOver=true;
|
||||
});
|
||||
connect(&downloader, &FileDownloader::downloadFailed, [pIsOver]()mutable{
|
||||
*pIsOver=true;
|
||||
});
|
||||
downloader.download();
|
||||
if(QTest::qWaitFor([&]() {return isOver;}, DefaultTimeout)){
|
||||
filePath = downloader.getDestinationFileName();
|
||||
if(!QFile::exists(filePath)) {
|
||||
filePath = "";
|
||||
qWarning() << "FileDownloader: Cannot download the specified file";
|
||||
}
|
||||
}
|
||||
}
|
||||
return filePath;
|
||||
}
|
||||
|
||||
qint64 FileDownloader::getReadBytes () const {
|
||||
return mReadBytes;
|
||||
return mReadBytes;
|
||||
}
|
||||
|
||||
void FileDownloader::setReadBytes (qint64 readBytes) {
|
||||
if (mReadBytes != readBytes) {
|
||||
mReadBytes = readBytes;
|
||||
emit readBytesChanged(readBytes);
|
||||
}
|
||||
if (mReadBytes != readBytes) {
|
||||
mReadBytes = readBytes;
|
||||
emit readBytesChanged(readBytes);
|
||||
}
|
||||
}
|
||||
|
||||
qint64 FileDownloader::getTotalBytes () const {
|
||||
return mTotalBytes;
|
||||
return mTotalBytes;
|
||||
}
|
||||
|
||||
void FileDownloader::setTotalBytes (qint64 totalBytes) {
|
||||
if (mTotalBytes != totalBytes) {
|
||||
mTotalBytes = totalBytes;
|
||||
emit totalBytesChanged(totalBytes);
|
||||
}
|
||||
if (mTotalBytes != totalBytes) {
|
||||
mTotalBytes = totalBytes;
|
||||
emit totalBytesChanged(totalBytes);
|
||||
}
|
||||
}
|
||||
|
||||
bool FileDownloader::getDownloading () const {
|
||||
return mDownloading;
|
||||
return mDownloading;
|
||||
}
|
||||
|
||||
void FileDownloader::setDownloading (bool downloading) {
|
||||
if (mDownloading != downloading) {
|
||||
mDownloading = downloading;
|
||||
emit downloadingChanged(downloading);
|
||||
}
|
||||
if (mDownloading != downloading) {
|
||||
mDownloading = downloading;
|
||||
emit downloadingChanged(downloading);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,28 +38,28 @@ FileExtractor::FileExtractor (QObject *parent) : QObject(parent) {}
|
|||
FileExtractor::~FileExtractor () {}
|
||||
|
||||
void FileExtractor::extract () {
|
||||
if (mExtracting) {
|
||||
qWarning() << "Unable to extract file. Already extracting!";
|
||||
return;
|
||||
}
|
||||
setExtracting(true);
|
||||
QFileInfo fileInfo(mFile);
|
||||
if(!fileInfo.isReadable()){
|
||||
emitExtractFailed(-1);
|
||||
return;
|
||||
}
|
||||
|
||||
mDestinationFile = QDir::cleanPath(mExtractFolder) + QDir::separator() + (mExtractName.isEmpty() ? fileInfo.completeBaseName() : mExtractName);
|
||||
if(QFile::exists(mDestinationFile) && !QFile::remove(mDestinationFile)){
|
||||
emitOutputError();
|
||||
return;
|
||||
}
|
||||
if( mTimer == nullptr){
|
||||
mTimer = new QTimer(this);
|
||||
QObject::connect(mTimer, &QTimer::timeout, this, &FileExtractor::handleExtraction);
|
||||
}
|
||||
if (mExtracting) {
|
||||
qWarning() << "Unable to extract file. Already extracting!";
|
||||
return;
|
||||
}
|
||||
setExtracting(true);
|
||||
QFileInfo fileInfo(mFile);
|
||||
if(!fileInfo.isReadable()){
|
||||
emitExtractFailed(-1);
|
||||
return;
|
||||
}
|
||||
|
||||
mDestinationFile = QDir::cleanPath(mExtractFolder) + QDir::separator() + (mExtractName.isEmpty() ? fileInfo.completeBaseName() : mExtractName);
|
||||
if(QFile::exists(mDestinationFile) && !QFile::remove(mDestinationFile)){
|
||||
emitOutputError();
|
||||
return;
|
||||
}
|
||||
if( mTimer == nullptr){
|
||||
mTimer = new QTimer(this);
|
||||
QObject::connect(mTimer, &QTimer::timeout, this, &FileExtractor::handleExtraction);
|
||||
}
|
||||
#ifdef WIN32
|
||||
// Test the presence of bzip2 in the system
|
||||
// Test the presence of bzip2 in the system
|
||||
QProcess process;
|
||||
process.closeReadChannel(QProcess::StandardOutput);
|
||||
process.closeReadChannel(QProcess::StandardError);
|
||||
|
|
@ -76,17 +76,19 @@ void FileExtractor::extract () {
|
|||
fileDownloader->setDownloadFolder(Utils::coreStringToAppString(Paths::getToolsDirPath()));
|
||||
QObject::connect(fileDownloader, &FileDownloader::totalBytesChanged, this, &FileExtractor::setTotalBytes);
|
||||
QObject::connect(fileDownloader, &FileDownloader::readBytesChanged, this, &FileExtractor::setReadBytes);
|
||||
|
||||
QObject::connect(fileDownloader, &FileDownloader::downloadFinished, [fileDownloader, timer, downloadStep ]()mutable {
|
||||
|
||||
QObject::connect(fileDownloader, &FileDownloader::downloadFinished, [fileDownloader, timer, downloadStep,this ]()mutable {
|
||||
if( downloadStep++ == 0){
|
||||
fileDownloader->setUrl(QUrl(Constants::LinphoneBZip2_dll));
|
||||
fileDownloader->download();
|
||||
}else {
|
||||
fileDownloader->deleteLater();
|
||||
QObject::disconnect(fileDownloader, &FileDownloader::totalBytesChanged, this, &FileExtractor::setTotalBytes);
|
||||
QObject::disconnect(fileDownloader, &FileDownloader::readBytesChanged, this, &FileExtractor::setReadBytes);
|
||||
timer->start();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
QObject::connect(fileDownloader, &FileDownloader::downloadFailed, [fileDownloader, this]() {
|
||||
fileDownloader->deleteLater();
|
||||
emitExtractorFailed();
|
||||
|
|
@ -99,141 +101,138 @@ void FileExtractor::extract () {
|
|||
}
|
||||
|
||||
bool FileExtractor::remove () {
|
||||
return QFile::exists(mDestinationFile) && QFile::remove(mDestinationFile);
|
||||
return QFile::exists(mDestinationFile) && QFile::remove(mDestinationFile);
|
||||
}
|
||||
|
||||
QString FileExtractor::getFile () const {
|
||||
return mFile;
|
||||
return mFile;
|
||||
}
|
||||
|
||||
void FileExtractor::setFile (const QString &file) {
|
||||
if (mExtracting) {
|
||||
qWarning() << QStringLiteral("Unable to set file, a file is extracting.");
|
||||
return;
|
||||
}
|
||||
if (mFile != file) {
|
||||
mFile = file;
|
||||
emit fileChanged(mFile);
|
||||
}
|
||||
if (mExtracting) {
|
||||
qWarning() << QStringLiteral("Unable to set file, a file is extracting.");
|
||||
return;
|
||||
}
|
||||
if (mFile != file) {
|
||||
mFile = file;
|
||||
emit fileChanged(mFile);
|
||||
}
|
||||
}
|
||||
|
||||
QString FileExtractor::getExtractFolder () const {
|
||||
return mExtractFolder;
|
||||
return mExtractFolder;
|
||||
}
|
||||
|
||||
void FileExtractor::setExtractFolder (const QString &extractFolder) {
|
||||
if (mExtracting) {
|
||||
qWarning() << QStringLiteral("Unable to set extract folder, a file is extracting.");
|
||||
return;
|
||||
}
|
||||
if (mExtractFolder != extractFolder) {
|
||||
mExtractFolder = extractFolder;
|
||||
emit extractFolderChanged(mExtractFolder);
|
||||
}
|
||||
if (mExtracting) {
|
||||
qWarning() << QStringLiteral("Unable to set extract folder, a file is extracting.");
|
||||
return;
|
||||
}
|
||||
if (mExtractFolder != extractFolder) {
|
||||
mExtractFolder = extractFolder;
|
||||
emit extractFolderChanged(mExtractFolder);
|
||||
}
|
||||
}
|
||||
|
||||
QString FileExtractor::getExtractName () const {
|
||||
return mExtractName;
|
||||
return mExtractName;
|
||||
}
|
||||
|
||||
void FileExtractor::setExtractName (const QString &extractName) {
|
||||
if (mExtracting) {
|
||||
qWarning() << QStringLiteral("Unable to set extract name, a file is extracting.");
|
||||
return;
|
||||
}
|
||||
if (mExtractName != extractName) {
|
||||
mExtractName = extractName;
|
||||
emit extractNameChanged(mExtractName);
|
||||
}
|
||||
if (mExtracting) {
|
||||
qWarning() << QStringLiteral("Unable to set extract name, a file is extracting.");
|
||||
return;
|
||||
}
|
||||
if (mExtractName != extractName) {
|
||||
mExtractName = extractName;
|
||||
emit extractNameChanged(mExtractName);
|
||||
}
|
||||
}
|
||||
|
||||
bool FileExtractor::getExtracting () const {
|
||||
return mExtracting;
|
||||
return mExtracting;
|
||||
}
|
||||
|
||||
void FileExtractor::setExtracting (bool extracting) {
|
||||
if (mExtracting != extracting) {
|
||||
mExtracting = extracting;
|
||||
emit extractingChanged(extracting);
|
||||
}
|
||||
if (mExtracting != extracting) {
|
||||
mExtracting = extracting;
|
||||
emit extractingChanged(extracting);
|
||||
}
|
||||
}
|
||||
|
||||
qint64 FileExtractor::getReadBytes () const {
|
||||
return mReadBytes;
|
||||
return mReadBytes;
|
||||
}
|
||||
|
||||
void FileExtractor::setReadBytes (qint64 readBytes) {
|
||||
if (mReadBytes != readBytes) {
|
||||
mReadBytes = readBytes;
|
||||
emit readBytesChanged(readBytes);
|
||||
}
|
||||
}
|
||||
|
||||
qint64 FileExtractor::getTotalBytes () const {
|
||||
return mTotalBytes;
|
||||
return mTotalBytes;
|
||||
}
|
||||
|
||||
void FileExtractor::setTotalBytes (qint64 totalBytes) {
|
||||
if (mTotalBytes != totalBytes) {
|
||||
mTotalBytes = totalBytes;
|
||||
emit totalBytesChanged(totalBytes);
|
||||
}
|
||||
}
|
||||
void FileExtractor::clean () {
|
||||
if (mTimer) {
|
||||
mTimer->stop();
|
||||
mTimer->deleteLater();
|
||||
mTimer = nullptr;
|
||||
}
|
||||
setExtracting(false);
|
||||
if (mTimer) {
|
||||
mTimer->stop();
|
||||
mTimer->deleteLater();
|
||||
mTimer = nullptr;
|
||||
}
|
||||
setExtracting(false);
|
||||
}
|
||||
|
||||
void FileExtractor::emitExtractorFailed () {
|
||||
qWarning() << QStringLiteral("Unable to extract file `%1`. bzip2 is unavailable, please install it.")
|
||||
.arg(mFile);
|
||||
clean();
|
||||
emit extractFailed();
|
||||
qWarning() << QStringLiteral("Unable to extract file `%1`. bzip2 is unavailable, please install it.")
|
||||
.arg(mFile);
|
||||
clean();
|
||||
emit extractFailed();
|
||||
}
|
||||
void FileExtractor::emitExtractFailed (int error) {
|
||||
qWarning() << QStringLiteral("Unable to extract file with bzip2: `%1` (code: %2).")
|
||||
.arg(mFile).arg(error);
|
||||
clean();
|
||||
emit extractFailed();
|
||||
qWarning() << QStringLiteral("Unable to extract file with bzip2: `%1` (code: %2).")
|
||||
.arg(mFile).arg(error);
|
||||
clean();
|
||||
emit extractFailed();
|
||||
}
|
||||
|
||||
void FileExtractor::emitExtractFinished () {
|
||||
clean();
|
||||
emit extractFinished();
|
||||
clean();
|
||||
emit extractFinished();
|
||||
}
|
||||
|
||||
void FileExtractor::emitOutputError () {
|
||||
qWarning() << QStringLiteral("Could not write into `%1`.")
|
||||
.arg(mDestinationFile);
|
||||
clean();
|
||||
emit extractFailed();
|
||||
qWarning() << QStringLiteral("Could not write into `%1`.")
|
||||
.arg(mDestinationFile);
|
||||
clean();
|
||||
emit extractFailed();
|
||||
}
|
||||
|
||||
void FileExtractor::handleExtraction () {
|
||||
QString tempDestination = mDestinationFile+"."+QFileInfo(mFile).suffix();
|
||||
QStringList args;
|
||||
args.push_back("-dq");
|
||||
args.push_back(tempDestination);
|
||||
QFile::copy(mFile, tempDestination);
|
||||
QString tempDestination = mDestinationFile+"."+QFileInfo(mFile).suffix();
|
||||
QStringList args;
|
||||
args.push_back("-dq");
|
||||
args.push_back(tempDestination);
|
||||
QFile::copy(mFile, tempDestination);
|
||||
#ifdef WIN32
|
||||
int result = QProcess::execute("bzip2.exe", args);
|
||||
if( result == -2)
|
||||
result = QProcess::execute(Utils::coreStringToAppString(Paths::getToolsDirPath())+"\\bzip2.exe", args);
|
||||
int result = QProcess::execute("bzip2.exe", args);
|
||||
if( result == -2)
|
||||
result = QProcess::execute(Utils::coreStringToAppString(Paths::getToolsDirPath())+"\\bzip2.exe", args);
|
||||
#else
|
||||
int result = QProcess::execute("bzip2", args);
|
||||
int result = QProcess::execute("bzip2", args);
|
||||
#endif
|
||||
if(QFile::exists(tempDestination))
|
||||
QFile::remove(tempDestination);
|
||||
if (result == 0)
|
||||
emitExtractFinished();
|
||||
else if (result > 0)
|
||||
emitExtractFailed(result);
|
||||
else if(result == -2)
|
||||
emitExtractorFailed();
|
||||
else
|
||||
emitOutputError();
|
||||
if(QFile::exists(tempDestination))
|
||||
QFile::remove(tempDestination);
|
||||
if (result == 0){
|
||||
setReadBytes(getTotalBytes());
|
||||
emitExtractFinished();
|
||||
}else if (result > 0)
|
||||
emitExtractFailed(result);
|
||||
else if(result == -2)
|
||||
emitExtractorFailed();
|
||||
else
|
||||
emitOutputError();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ DialogPlus {
|
|||
|
||||
to: target.totalBytes
|
||||
value: target.readBytes
|
||||
indeterminate : true
|
||||
indeterminate : target.totalBytes == 0
|
||||
|
||||
background: Rectangle {
|
||||
color: OnlineInstallerDialogStyle.column.bar.background.color
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue