修复下载软件失败导致的崩溃,更改APT源更新逻辑

下载失败会导致发射的progress信号已接受数和总数均为0,导致计算进度时被零除;
APT源更新逻辑代码重构,将需要复用的值单独创建变量,重新格式化代码,以及加入了已经废弃的星火源降低优先级代码
This commit is contained in:
RigoLigoRLC 2020-10-02 12:03:40 +08:00
parent f0bf0e5aec
commit eff8878e8b

View File

@ -574,7 +574,8 @@ int Widget::loadappinfo(QUrl arg1)
label_screen[3]=ui->screen_3;
label_screen[4]=ui->screen_4;
for (int i=0;i<5;i++) {
get_json.start("curl -o screen_"+QString::number(i+1)+".png "+urladdress+"screen_"+QString::number(i+1)+".png");
QString cmd = "curl -o screen_"+QString::number(i+1)+".png "+urladdress+"screen_"+QString::number(i+1)+".png";
get_json.start(cmd);
get_json.waitForFinished();
if(screen[i].load("screen_"+QString::number(i+1)+".png")){
label_screen[i]->setImage(screen[i]);
@ -673,6 +674,7 @@ void Widget::httpReadyRead()
void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{
if(totalBytes <= 0) return;
download_list[nowDownload-1].setMax(10000); // 最大值
download_list[nowDownload-1].setValue((bytesRead*10000)/totalBytes); // 当前值
download_size=bytesRead;
@ -778,24 +780,47 @@ void Widget::on_pushButton_updateApt_clicked()
QtConcurrent::run([=](){
ui->pushButton_updateApt->setEnabled(false);
ui->label_aptserver->setText(tr("Updating, please wait..."));
std::fstream sourcesList;
std::fstream sourcesList, policy, update;
QDir tmpdir("/tmp");
auto tmpPath = QString::fromUtf8(TMP_PATH).toStdString();
bool unknownError = true;
tmpdir.mkpath("spark-store");
sourcesList.open(QString::fromUtf8(TMP_PATH).toStdString()+"/sparkstore.list",std::ios::out);
if(sourcesList){
sourcesList.open(tmpPath + "/sparkstore.list", std::ios::out);
//policy.open(tmpPath + "/sparkstore", std::ios::out);
// 商店已经下架会替换系统库的包优先级policy弃用
if(sourcesList /*&& policy*/) {
auto serverAddr = ui->comboBox_server->currentText();
sourcesList << "deb [by-hash=force] ";
sourcesList<<QString::fromUtf8(ui->comboBox_server->currentText().toUtf8()).toStdString();
sourcesList << serverAddr.toUtf8().toStdString();
sourcesList << " /";
std::fstream update;
update.open(QString::fromUtf8(TMP_PATH).toStdString()+"/update.sh",std::ios::out);
update<<"#!/bin/sh\n";
update<<"mv "+QString::fromUtf8(TMP_PATH).toStdString()+"/sparkstore.list /etc/apt/sources.list.d/sparkstore.list && apt update";
sourcesList.close();
/*
policy << "Package: *\n"
"Pin: origin *" << serverAddr.mid(serverAddr.indexOf('.')).toUtf8().toStdString() << "\n"
"Pin-Priority: 90"; // 降低星火源的优先级,防止从星火安装已存在的系统包,破坏依赖
policy.close();
*/
update.open(tmpPath + "/update.sh",std::ios::out);
if(update) {
unknownError = false;
update << "#!/bin/sh\n"
"mv " + tmpPath + "/sparkstore.list /etc/apt/sources.list.d/sparkstore.list && "
// "mv " + tmpPath + "/sparkstore /etc/apt/preferences.d/sparkstore && "
"apt update";
update.close();
system("chmod +x "+QString::fromUtf8(TMP_PATH).toUtf8()+"/update.sh");
system(("chmod +x " + tmpPath + "/update.sh").c_str());
QProcess runupdate;
runupdate.start("pkexec "+QString::fromUtf8(TMP_PATH)+"/update.sh");
runupdate.start(QString::fromStdString("pkexec " + tmpPath + "/update.sh"));
runupdate.waitForFinished();
QString error=QString::fromStdString(runupdate.readAllStandardError().toStdString());
QString error = runupdate.readAllStandardError();
QStringList everyError = error.split("\n");
bool haveError = false;
for (int i=0; i < everyError.size(); i++) {
@ -803,13 +828,17 @@ void Widget::on_pushButton_updateApt_clicked()
haveError = true;
}
}
if(!haveError) {
ui->label_aptserver->setText("deb [by-hash=force] " + ui->comboBox_server->currentText().toUtf8() + " /");
} else {
ui->label_aptserver->setText(tr("Apt has reported an error. Please use apt update in terminal to locate the problem."));
}
}else {
ui->label_aptserver->setText(tr("Unknown server error!"));
}
}
if(unknownError) {
ui->label_aptserver->setText(tr("Unknown error!"));
}
ui->pushButton_updateApt->setEnabled(true);