diff --git a/src/backend/downloadworker.cpp b/src/backend/downloadworker.cpp index a3003a0..7bbe142 100644 --- a/src/backend/downloadworker.cpp +++ b/src/backend/downloadworker.cpp @@ -145,17 +145,19 @@ void DownloadController::startDownload(const QString &url) command.append(aria2NoSeeds.toUtf8()); } qDebug() << command; - auto cmd = new QProcess(this); - cmd->setProcessChannelMode(QProcess::MergedChannels); - cmd->setProgram("aria2c"); - cmd->setArguments(command); - cmd->start(); - cmd->waitForStarted(); //等待启动完成 - QObject::connect(cmd, &QProcess::readyReadStandardOutput, [&]() + bool downloadSuccess = true; + QProcess cmd; + cmd.setProcessChannelMode(QProcess::MergedChannels); + cmd.setProgram("aria2c"); + cmd.setArguments(command); + cmd.start(); + cmd.waitForStarted(-1); //等待启动完成 + + connect(&cmd, &QProcess::readyReadStandardOutput, [&]() { //通过读取输出计算下载速度 - QString message = cmd->readAllStandardOutput().data(); + QString message = cmd.readAllStandardOutput().data(); // qDebug() << message; message = message.replace(" ", ""); QStringList list; @@ -195,17 +197,21 @@ void DownloadController::startDownload(const QString &url) emit downloadProcess(speedInfo, downloadSizeRecord, fileSize); } }); - QObject::connect(cmd, &QProcess::readyReadStandardError, [&]() + connect(&cmd, &QProcess::readyReadStandardError, [&]() { - emit errorOccur(cmd->readAllStandardError().data()); - return; + emit errorOccur(cmd.readAllStandardError().data()); + downloadSuccess = false; + cmd.close(); }); - auto pidNumber = cmd->processId(); - this->pidNumber = pidNumber; - while (cmd->waitForFinished(-1)) + pidNumber = cmd.processId(); + + cmd.waitForFinished(-1); + cmd.close(); + + if(!downloadSuccess) { - continue; + return; } // 统计下载量 @@ -218,7 +224,7 @@ void DownloadController::startDownload(const QString &url) mailProcess.start(SenderdPath.toUtf8(), QStringList() << metaUrl << "HD70642"); mailProcess.waitForStarted(); mailProcess.waitForFinished(3000); - mailProcess.deleteLater(); + mailProcess.close(); emit downloadFinished(); }); } diff --git a/src/backend/downloadworker.h b/src/backend/downloadworker.h index 5aeb353..83061c1 100644 --- a/src/backend/downloadworker.h +++ b/src/backend/downloadworker.h @@ -21,7 +21,7 @@ public: private: int threadNum; - int pidNumber = -1; + qint64 pidNumber = -1; QString filename; qint64 fileSize; QVector<QPair<qint64, qint64>> ranges; diff --git a/src/pages/appintopage.cpp b/src/pages/appintopage.cpp index 179e035..783f97d 100644 --- a/src/pages/appintopage.cpp +++ b/src/pages/appintopage.cpp @@ -291,34 +291,39 @@ void AppIntoPage::initConnections() void AppIntoPage::isDownloading(const QUrl &url) { - if (dw->getUrlList().lastIndexOf(url) == -1) + int index = dw->getUrlList().lastIndexOf(url); + if (index == -1) { ui->downloadButton->setEnabled(true); return; } - else + + DownloadItem *item = dw->getDIList().at(index); + if (item == nullptr) { - ui->downloadButton->setEnabled(false); + ui->downloadButton->setEnabled(true); + return; } + ui->downloadButton->setEnabled(false); ui->pushButton_3->hide(); - if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 2) + if (item->download == 2) { ui->downloadButton->setEnabled(true); ui->downloadButton->setText(tr("Download")); } - if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 1) + if (item->download == 1) { ui->downloadButton->setEnabled(true); ui->downloadButton->setText(tr("Install")); } - if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->isInstall) + if (item->isInstall) { ui->downloadButton->setEnabled(false); ui->downloadButton->setText(tr("Installing")); return; } - if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 3) + if (item->download == 3) { ui->downloadButton->setEnabled(true); ui->downloadButton->setText(tr("Reinstall")); @@ -368,32 +373,39 @@ void AppIntoPage::setAppinfoTags(const QStringList &tagList) void AppIntoPage::on_downloadButton_clicked() { + QString downloadUrl = SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString(); if (ui->downloadButton->text() == tr("Install")) { - dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())]->install(0); - isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); - connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())], &DownloadItem::finished, [=]() - { - isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); - disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())], &DownloadItem::finished, nullptr, nullptr); }); + DownloadItem *item = dw->getDIList()[dw->getUrlList().lastIndexOf(downloadUrl)]; + if (item == nullptr) + { + return; + } + + connect(item, &DownloadItem::finished, [=]() { isDownloading(downloadUrl); }); + + item->install(0); + isDownloading(downloadUrl); return; } emit clickedDownloadBtn(); - dw->addItem(info["Name"].toString(), info["Filename"].toString(), info["Pkgname"].toString(), iconpixmap, SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); + DownloadItem *item = dw->addItem(info["Name"].toString(), info["Filename"].toString(), info["Pkgname"].toString(), iconpixmap, downloadUrl); + if (item == nullptr) + { + return; + } + if (ui->downloadButton->text() == tr("Reinstall")) { - dw->getDIList()[dw->allDownload - 1]->reinstall = true; + item->reinstall = true; } ui->downloadButton->setEnabled(false); - connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())], &DownloadItem::finished, [=]() - { - isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); - disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())], &DownloadItem::finished, nullptr, nullptr); }); + connect(item, &DownloadItem::finished, [=]() { isDownloading(downloadUrl); }); - isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); + isDownloading(downloadUrl); } void AppIntoPage::on_pushButton_3_clicked() diff --git a/src/widgets/common/downloaditem.cpp b/src/widgets/common/downloaditem.cpp index 2161690..8aceda5 100644 --- a/src/widgets/common/downloaditem.cpp +++ b/src/widgets/common/downloaditem.cpp @@ -105,76 +105,10 @@ void DownloadItem::install(int t) ui->label_2->setToolTip(tr("Installing")); QtConcurrent::run([=]() - { - QProcess installer; - switch(t) - { - case 0: - installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8()); - break; - case 1: - installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8()); - break; - case 2: - installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8()); - break; - } + { + slotAsyncInstall(t); + }); - bool haveError = false; - bool notRoot = false; - installer.waitForFinished(-1); // 不设置超时 - out = installer.readAllStandardOutput(); - - QStringList everyOut = out.split("\n"); - for (int i = 0; i < everyOut.size(); i++) - { - if(everyOut[i].left(2) == "E:") - { - haveError = true; - } - if(everyOut[i].right(14) == "Not authorized") - { - notRoot = true; - } - } - - QProcess isInstall; - isInstall.start("dpkg", QStringList() << "-s" << pkgName); - isInstall.waitForFinished(180*1000); // 默认超时 3 分钟 - int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); - if (error == 0 && !haveError) - { - ui->pushButton_install->hide(); - Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete.")); - ui->label_2->setText(tr("Finish")); - ui->label_2->setToolTip(tr("Finish")); - download = 3; - ui->pushButton_3->show(); - } - else - { - ui->pushButton_install->show(); - ui->pushButton_install->setText(tr("Retry")); - download = 1; - Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again.")); - ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again")); - ui->label_2->setToolTip(tr("Error happened in dpkg progress , you can try it again")); - ui->pushButton_3->show(); - } - - if (notRoot) - { - Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been aborted,you can retry installation.")); - ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation")); - ui->label_2->setToolTip(tr("dpkg progress had been aborted,you can retry installation")); - ui->pushButton_install->show(); - ui->pushButton_3->hide(); - } - - ui->widget_spinner->hide(); - DownloadItem::isInstall = false; - emit finished(); }); - // emit finished(); qDebug() << ui->label_filename->text().toUtf8(); } } @@ -207,3 +141,75 @@ void DownloadItem::on_pushButton_3_clicked() output_w->layout()->addWidget(textbrowser); output_w->show(); } + +void DownloadItem::slotAsyncInstall(int t) +{ + QProcess installer; + switch(t) + { + case 0: + installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8()); + break; + case 1: + installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8()); + break; + case 2: + installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8()); + break; + } + + bool haveError = false; + bool notRoot = false; + installer.waitForFinished(-1); // 不设置超时 + out = installer.readAllStandardOutput(); + + QStringList everyOut = out.split("\n"); + for (int i = 0; i < everyOut.size(); i++) + { + if(everyOut[i].left(2) == "E:") + { + haveError = true; + } + if(everyOut[i].right(14) == "Not authorized") + { + notRoot = true; + } + } + + QProcess isInstall; + isInstall.start("dpkg", QStringList() << "-s" << pkgName); + isInstall.waitForFinished(180*1000); // 默认超时 3 分钟 + int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length(); + if (error == 0 && !haveError) + { + ui->pushButton_install->hide(); + Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete.")); + ui->label_2->setText(tr("Finish")); + ui->label_2->setToolTip(tr("Finish")); + download = 3; + ui->pushButton_3->show(); + } + else + { + ui->pushButton_install->show(); + ui->pushButton_install->setText(tr("Retry")); + download = 1; + Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again.")); + ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again")); + ui->label_2->setToolTip(tr("Error happened in dpkg progress , you can try it again")); + ui->pushButton_3->show(); + } + + if (notRoot) + { + Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been aborted,you can retry installation.")); + ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation")); + ui->label_2->setToolTip(tr("dpkg progress had been aborted,you can retry installation")); + ui->pushButton_install->show(); + ui->pushButton_3->hide(); + } + + ui->widget_spinner->hide(); + DownloadItem::isInstall = false; + emit finished(); +} diff --git a/src/widgets/common/downloaditem.h b/src/widgets/common/downloaditem.h index 036302a..05c9a3d 100644 --- a/src/widgets/common/downloaditem.h +++ b/src/widgets/common/downloaditem.h @@ -59,6 +59,8 @@ private slots: void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); + void slotAsyncInstall(int t); + signals: void finished(); }; diff --git a/src/widgets/downloadlistwidget.cpp b/src/widgets/downloadlistwidget.cpp index 28a31f3..9aaa2d4 100644 --- a/src/widgets/downloadlistwidget.cpp +++ b/src/widgets/downloadlistwidget.cpp @@ -54,36 +54,42 @@ DownloadListWidget::~DownloadListWidget() { if (downloadController) { + downloadController->disconnect(); downloadController->stopDownload(); + downloadController->deleteLater(); } + clearItem(); delete ui; } void DownloadListWidget::clearItem() { - ui->listWidget->vScrollBar->scrollTop(); - int n = ui->listWidget->count(); - for (int i = 0; i < n; i++) - { - QListWidgetItem *item = ui->listWidget->takeItem(0); - QWidget *card = ui->listWidget->itemWidget(item); - delete card; - card = NULL; - delete item; - item = NULL; - } + // QListWidgetItem *item = nullptr; + // while ((item = ui->listWidget->takeItem(0)) != nullptr) + // { + // QWidget *card = ui->listWidget->itemWidget(item); + // if (card) + // { + // card->deleteLater(); + // card = nullptr; + // } + // delete item; + // item = nullptr; + // } + + // ui->listWidget->vScrollBar->scrollTop(); ui->listWidget->clear(); } -void DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl) +DownloadItem* DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl) { if (fileName.isEmpty()) { - return; + return nullptr; } urList.append(downloadurl); allDownload += 1; - DownloadItem *di = new DownloadItem(this); + DownloadItem *di = new DownloadItem; dlist << downloadurl; downloaditemlist << di; di->setName(name); @@ -99,6 +105,8 @@ void DownloadListWidget::addItem(QString name, QString fileName, QString pkgName nowDownload += 1; startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求 } + + return di; } QList<DownloadItem *> DownloadListWidget::getDIList() @@ -119,7 +127,13 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName) isdownload = true; downloaditemlist[allDownload - 1]->free = false; - downloadController = new DownloadController(this); // 并发下载,在点击下载按钮的时候才会初始化 + if (downloadController) + { + downloadController->disconnect(); + downloadController->stopDownload(); + downloadController->deleteLater(); + } + downloadController = new DownloadController; // 并发下载,在点击下载按钮的时候才会初始化 connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress); connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished); // connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);}); diff --git a/src/widgets/downloadlistwidget.h b/src/widgets/downloadlistwidget.h index c3a864e..82f7cf8 100644 --- a/src/widgets/downloadlistwidget.h +++ b/src/widgets/downloadlistwidget.h @@ -20,7 +20,7 @@ class DownloadListWidget : public DBlurEffectWidget Q_OBJECT public: - void addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl); + DownloadItem *addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl); int nowDownload = 0; int allDownload = 0; QList<DownloadItem *> getDIList(); @@ -35,7 +35,7 @@ private: QStringList dlist; QList<QUrl> urList; QList<DownloadItem *> downloaditemlist; - DownloadController *downloadController; + DownloadController *downloadController = nullptr; int nowdownload = 0; QString theSpeed; QTimer download_speed;