yhkylin-backup-tools/kybackup/module/systemrestore.cpp

986 lines
36 KiB
C++
Raw Normal View History

2021-11-17 13:23:38 +08:00
#include "systemrestore.h"
#include <QLabel>
#include <QPushButton>
#include <QComboBox>
#include <QCheckBox>
#include <QMovie>
2021-12-01 15:12:38 +08:00
#include <QHBoxLayout>
#include <QVBoxLayout>
2021-11-17 13:23:38 +08:00
#include <unistd.h>
#include "../component/circlelabel.h"
2021-12-01 15:12:38 +08:00
#include "../component/mycheckbox.h"
2021-11-17 13:23:38 +08:00
#include "../component/myiconlabel.h"
#include "../component/mylabel.h"
#include "../component/mylineedit.h"
#include "../component/mypushbutton.h"
#include "../component/linelabel.h"
#include "../component/ringsprogressbar.h"
#include "../../common/utils.h"
#include "../globalbackupinfo.h"
2021-12-01 15:12:38 +08:00
#include "messageboxutils.h"
2021-12-06 14:55:00 +08:00
#include "selectrestorepoint.h"
2021-11-17 13:23:38 +08:00
SystemRestore::SystemRestore(QWidget *parent) :
QStackedWidget(parent)
{
2021-11-20 12:09:26 +08:00
m_isRetainUserData = false;
2021-12-01 15:12:38 +08:00
m_isFactoryRestore = false;
m_pInterface = nullptr;
2021-12-09 10:00:07 +08:00
2021-11-17 13:23:38 +08:00
// 界面手写代码创建,作为练手
initFirstWidget();
2021-12-09 10:00:07 +08:00
initSecondWidget();
2021-12-11 09:49:09 +08:00
initThirdWidget();
initLastWidget();
2021-11-17 13:23:38 +08:00
}
SystemRestore::~SystemRestore()
2021-12-01 15:12:38 +08:00
{
delete m_pInterface;
m_pInterface = nullptr;
}
2021-11-17 13:23:38 +08:00
/**
* @brief
*/
void SystemRestore::initFirstWidget()
{
QWidget *first = new QWidget;
// 图片
QLabel *imageRestore_firstPage = new QLabel(first);
imageRestore_firstPage->setGeometry(421, 120, 300, 326);
QPixmap pixmap(":/images/system_restore.svg");
imageRestore_firstPage->setPixmap(pixmap);
imageRestore_firstPage->setScaledContents(true);
// 系统还原大字提示
MyLabel *labelRestore_firstPage = new MyLabel(first);
labelRestore_firstPage->setDeplayText(tr("System Restore"));
labelRestore_firstPage->setFixedWidth(500);
labelRestore_firstPage->setFixedHeight(48);
labelRestore_firstPage->move(41, 120);
QFont font;
font.setBold(true);
font.setPixelSize(36);
labelRestore_firstPage->setFont(font);
// labelRestore_firstPage->setAttribute(Qt::WA_TranslucentBackground);
labelRestore_firstPage->setScaledContents(true);
labelRestore_firstPage->adjustSize();
// 系统还原说明
MyLabel *labelNote_firstPage = new MyLabel(first);
labelNote_firstPage->setFixedWidth(700);
labelNote_firstPage->setFixedHeight(24);
labelNote_firstPage->move(41, 180);
// 在您遇到问题时可将系统还原到以前的状态
labelNote_firstPage->setDeplayText(tr("You can restore the system to its previous state"));
font.setBold(false);
font.setPixelSize(18);
labelNote_firstPage->setFont(font);
labelNote_firstPage->setScaledContents(true);
labelNote_firstPage->adjustSize();
2021-12-28 16:51:35 +08:00
// 操作简单
MyIconLabel *iconSimple_firstPage = new MyIconLabel(first);
iconSimple_firstPage->setGeometry(41, 244, 180, 36);
iconSimple_firstPage->setThemeIcon("ukui-bf-simple-symbolic", ":/symbos/ukui-bf-simple-symbolic.png");
iconSimple_firstPage->setDesplayText(tr("Simple"));
iconSimple_firstPage->setEnabled(false);
2021-11-17 13:23:38 +08:00
2021-12-28 16:51:35 +08:00
// 安全可靠
2021-11-17 13:23:38 +08:00
MyIconLabel *iconSecurity_firstPage = new MyIconLabel(first);
2021-12-28 16:51:35 +08:00
iconSecurity_firstPage->setGeometry(201, 244, 180, 36);
2021-11-17 13:23:38 +08:00
iconSecurity_firstPage->setThemeIcon("ukui-bf-security-symbolic", ":/symbos/ukui-bf-security-symbolic.png");
iconSecurity_firstPage->setDesplayText(tr("Security"));
iconSecurity_firstPage->setEnabled(false);
2021-12-28 16:51:35 +08:00
// 修复系统损坏
MyIconLabel *iconMultiBackup_firstPage = new MyIconLabel(first);
iconMultiBackup_firstPage->setGeometry(41, 296, 180, 36);
iconMultiBackup_firstPage->setThemeIcon("ukui-bf-damage-symbolic", ":/symbos/ukui-bf-damage-symbolic.png");
iconMultiBackup_firstPage->setDesplayText(tr("Repair"));
iconMultiBackup_firstPage->setEnabled(false);
// 自主操作
MyIconLabel *iconSmallSize_firstPage = new MyIconLabel(first);
iconSmallSize_firstPage->setGeometry(201, 296, 180, 36);
iconSmallSize_firstPage->setThemeIcon("document-properties-symbolic", ":/symbos/document-properties-symbolic.png");
iconSmallSize_firstPage->setDesplayText(tr("Independent"));
iconSmallSize_firstPage->setEnabled(false);
2021-11-17 13:23:38 +08:00
// 开始还原按钮
MyPushButton *beginRestore = new MyPushButton(first);
beginRestore->setGeometry(41, 372, 180, 52);
beginRestore->setText(tr("Start Restore"));
beginRestore->setEnabled(true);
beginRestore->setAutoRepeat(true);
font.setPixelSize(24);
beginRestore->setFont(font);
2021-12-01 15:12:38 +08:00
connect(beginRestore, &MyPushButton::clicked, this, &SystemRestore::on_button_beginRestore_clicked);
// 底部控件布局
2022-01-19 14:42:11 +08:00
QHBoxLayout *bottomHBoxLayout = new QHBoxLayout;
2021-12-01 15:12:38 +08:00
bottomHBoxLayout->addStretch();
// 恢复出厂复选框
2022-01-19 14:42:11 +08:00
MyCheckBox * checkFactoryRestore = new MyCheckBox(tr("Factory Restore"));
2021-12-26 18:15:21 +08:00
if (!Utils::isHuawei990())
checkFactoryRestore->setVisible(false);
2021-11-17 13:23:38 +08:00
// 保留用户数据复选框
2022-01-19 14:42:11 +08:00
MyCheckBox * retainUserData = new MyCheckBox(tr("Retaining User Data"));
2021-12-01 15:12:38 +08:00
bottomHBoxLayout->addWidget(checkFactoryRestore);
bottomHBoxLayout->addSpacing(10);
bottomHBoxLayout->addWidget(retainUserData);
bottomHBoxLayout->addSpacing(20);
2022-01-19 14:42:11 +08:00
QVBoxLayout *bottomVBoxLayout = new QVBoxLayout;
bottomVBoxLayout->addStretch();
bottomVBoxLayout->addLayout(bottomHBoxLayout);
bottomVBoxLayout->addSpacing(20);
first->setLayout(bottomVBoxLayout);
2021-12-01 15:12:38 +08:00
connect(checkFactoryRestore, &MyCheckBox::stateChanged, this, [=](int state) {
this->m_isFactoryRestore = Qt::Unchecked == state ? false : true;
if (this->m_isFactoryRestore) {
retainUserData->setChecked(false);
}
});
connect(retainUserData, &MyCheckBox::stateChanged, this, [=](int state) {
this->m_isRetainUserData = Qt::Unchecked == state ? false : true;
if (this->m_isRetainUserData) {
checkFactoryRestore->setChecked(false);
}
});
2021-11-17 13:23:38 +08:00
addWidget(first);
}
/**
* @brief
* @param checked
*/
void SystemRestore::on_pre_clicked(bool checked)
{
Q_UNUSED(checked)
int index = this->currentIndex() - 1;
if (index >= 0) {
this->setCurrentIndex(index);
}
}
/**
2021-12-01 15:12:38 +08:00
* @brief
2021-11-17 13:23:38 +08:00
* @param checked
*/
void SystemRestore::on_next_clicked(bool checked)
{
Q_UNUSED(checked)
int index = this->currentIndex() + 1;
if (index < this->count()) {
this->setCurrentIndex(index);
}
}
/**
2021-12-01 15:12:38 +08:00
* @brief
* @param checked
2021-11-17 13:23:38 +08:00
*/
2021-12-01 15:12:38 +08:00
void SystemRestore::on_button_beginRestore_clicked(bool checked)
2021-11-17 13:23:38 +08:00
{
2021-12-01 15:12:38 +08:00
Q_UNUSED(checked)
2021-12-26 18:15:21 +08:00
this->m_uuid = "";
this->m_devPath = "";
2021-12-30 10:27:03 +08:00
this->m_backupName = "";
2021-12-26 18:15:21 +08:00
this->m_isOtherMachine = "";
2021-12-01 15:12:38 +08:00
// 出厂还原,不用去选择备份点
if (m_isFactoryRestore) {
2021-12-06 16:57:11 +08:00
// 出厂还原后,用户数据将会丢失
2021-12-01 15:12:38 +08:00
if (!MessageBoxUtils::QMESSAGE_BOX_WARNING_CANCEL(this, QObject::tr("Warning"),
QObject::tr("Restore factory settings, your system user data will not be retained"),
QObject::tr("Continue"), QObject::tr("Cancel"))) {
return;
}
//出厂还原
m_uuid = FACTORY_BACKUP_UUID;
2021-12-06 16:57:11 +08:00
m_devPath = "";
2021-12-30 10:27:03 +08:00
this->m_backupName = "";
2021-12-11 15:10:58 +08:00
this->m_isOtherMachine = false;
2021-12-01 15:12:38 +08:00
} else {
// 系统备份点列表中选择备份点
2021-12-06 16:57:11 +08:00
SelectRestorePoint *selectRestoreDialog = new SelectRestorePoint(this);
connect(selectRestoreDialog, &SelectRestorePoint::selected, this, [=](ParseBackupList::BackupPoint backupPoint){
this->m_uuid = backupPoint.m_uuid;
this->m_devPath = backupPoint.m_path;
2021-12-30 10:27:03 +08:00
this->m_backupName = backupPoint.m_backupName;
2021-12-09 10:00:07 +08:00
this->m_isOtherMachine = backupPoint.m_iPosition == BackupPosition::OTHER ? true : false;
2021-12-06 16:57:11 +08:00
});
2021-12-26 18:15:21 +08:00
if (QDialog::Rejected == selectRestoreDialog->exec()) {
selectRestoreDialog->deleteLater();
return ;
}
2021-12-06 16:57:11 +08:00
selectRestoreDialog->deleteLater();
2021-12-01 15:12:38 +08:00
}
2021-12-06 16:57:11 +08:00
on_next_clicked();
2021-12-09 10:00:07 +08:00
emit this->startCheckEnv();
2021-11-17 13:23:38 +08:00
}
2021-12-09 10:00:07 +08:00
/**
2021-12-11 09:49:09 +08:00
* @brief --
2021-12-09 10:00:07 +08:00
*/
void SystemRestore::initSecondWidget()
{
QWidget *second = new QWidget;
// 流程进度提示栏
CircleLable *one = new CircleLable("1", second, 24, QColor(COLOR_BLUE));
LineLabel *line1 = new LineLabel(second, QColor(COLOR_BLUE), QSize(200, 24));
CircleLable *two = new CircleLable("2", second);
LineLabel *line2 = new LineLabel(second, QColor(COLOR_GRAY), QSize(200, 24));
CircleLable *three = new CircleLable("3", second);
QHBoxLayout *layoutLine1 = new QHBoxLayout;
layoutLine1->addStretch();
layoutLine1->addWidget(one);
layoutLine1->addWidget(line1);
layoutLine1->addWidget(two);
layoutLine1->addWidget(line2);
layoutLine1->addWidget(three);
layoutLine1->addStretch();
MyLabel *label1 = new MyLabel(tr("checking"), second);
label1->setIsOriginal(true);
label1->setFontColor(QColor(COLOR_BLUE));
MyLabel *label2 = new MyLabel(tr("restoring"), second);
label2->setIsOriginal(true);
MyLabel *label3 = new MyLabel(tr("finished"), second);
label3->setIsOriginal(true);
QHBoxLayout *layoutLine2 = new QHBoxLayout;
layoutLine2->addSpacing(100);
layoutLine2->addWidget(label1);
layoutLine2->addStretch();
layoutLine2->addWidget(label2);
layoutLine2->addStretch();
layoutLine2->addWidget(label3);
layoutLine2->addSpacing(100);
// ------------ 中部布局begin-------------
QWidget *centerFont = new QWidget(second);
QVBoxLayout *vlayoutCenterFont = new QVBoxLayout;
// 第一行
QHBoxLayout *hlayoutCenterFont1 = new QHBoxLayout;
// 检测等待图标
QLabel *loadingGif = new QLabel(centerFont);
loadingGif->setFixedSize(20,20);
// 环境检测等待动画
QMovie *movie = new QMovie(":/images/loading.gif", QByteArray(), centerFont);
loadingGif->setMovie(movie);
hlayoutCenterFont1->addWidget(loadingGif);
// 检测结果对错图标
QLabel *resultLogo = new QLabel(centerFont);
resultLogo->setFixedSize(20,20);
hlayoutCenterFont1->addWidget(resultLogo);
// 检测中大标题
MyLabel *bigTitle = new MyLabel(centerFont);
bigTitle->setFontSize(24);
bigTitle->setMaximumWidth(700);
hlayoutCenterFont1->addWidget(bigTitle);
hlayoutCenterFont1->addStretch();
vlayoutCenterFont->addLayout(hlayoutCenterFont1);
// 第二行
QHBoxLayout *hlayoutCenterFont2 = new QHBoxLayout;
hlayoutCenterFont2->addSpacing(10);
// 检测中的记录黑点1和文字1
CircleLable *dot1 = new CircleLable(QString(""), centerFont, 6, Qt::black);
hlayoutCenterFont2->addWidget(dot1);
hlayoutCenterFont2->addSpacing(5);
MyLabel *labelCheck1 = new MyLabel(centerFont);
labelCheck1->setMinimumWidth(400);
labelCheck1->setMaximumWidth(600);
labelCheck1->setIsOriginal(true);
labelCheck1->setWordWrap(true);
labelCheck1->adjustSize();
hlayoutCenterFont2->addWidget(labelCheck1);
hlayoutCenterFont2->addStretch();
vlayoutCenterFont->addLayout(hlayoutCenterFont2);
// 第三行
QHBoxLayout *hlayoutCenterFont3 = new QHBoxLayout;
hlayoutCenterFont3->addSpacing(10);
// 检测中的记录黑点2和文字2
CircleLable *dot2 = new CircleLable(QString(""), centerFont, 6, Qt::black);
hlayoutCenterFont3->addWidget(dot2);
hlayoutCenterFont3->addSpacing(5);
MyLabel *labelCheck2 = new MyLabel(centerFont);
labelCheck2->setMinimumWidth(400);
labelCheck2->setMaximumWidth(600);
labelCheck2->setIsOriginal(true);
labelCheck2->setWordWrap(true);
labelCheck2->adjustSize();
hlayoutCenterFont3->addWidget(labelCheck2);
hlayoutCenterFont3->addStretch();
vlayoutCenterFont->addLayout(hlayoutCenterFont3);
// 第四行
vlayoutCenterFont->addSpacing(30);
// 第五行
QHBoxLayout *hlayoutCenterFont5 = new QHBoxLayout;
hlayoutCenterFont5->addStretch();
// 上一步按钮
MyPushButton *preStep = new MyPushButton(centerFont);
preStep->setFixedSize(97, 36);
preStep->setText(tr("back"));
preStep->setEnabled(true);
preStep->setAutoRepeat(true);
connect(preStep, &MyPushButton::clicked, this, &SystemRestore::on_pre_clicked);
hlayoutCenterFont5->addWidget(preStep);
hlayoutCenterFont5->addSpacing(20);
// 下一步按钮
MyPushButton *nextStep = new MyPushButton(centerFont);
nextStep->setFixedSize(97, 36);
nextStep->setText(tr("next"));
nextStep->setEnabled(true);
nextStep->setAutoRepeat(true);
connect(nextStep, &MyPushButton::clicked, this, [=](bool checked) {
this->on_next_clicked(checked);
2021-12-28 16:51:35 +08:00
emit this->startRestore();
2021-12-09 10:00:07 +08:00
});
hlayoutCenterFont5->addWidget(nextStep);
// 重新检测按钮
MyPushButton *recheck = new MyPushButton(centerFont);
recheck->setFixedSize(97, 36);
recheck->setText(tr("recheck"));
recheck->setEnabled(true);
recheck->setAutoRepeat(true);
hlayoutCenterFont5->addWidget(recheck);
hlayoutCenterFont5->addStretch();
vlayoutCenterFont->addLayout(hlayoutCenterFont5);
centerFont->setLayout(vlayoutCenterFont);
// ------------ 中部布局end-------------
QHBoxLayout *layoutLine3 = new QHBoxLayout;
layoutLine3->addStretch();
layoutLine3->addWidget(centerFont);
layoutLine3->addStretch();
// 布局
QVBoxLayout *vlayout = new QVBoxLayout;
vlayout->addSpacing(40);
vlayout->addLayout(layoutLine1);
vlayout->addLayout(layoutLine2);
vlayout->addSpacing(50);
vlayout->addLayout(layoutLine3);
vlayout->addStretch();
second->setLayout(vlayout);
// 开始检测
connect(this, &SystemRestore::startCheckEnv, this, [=]() {
this->m_systemRestoreState = SystemRestoreState::CHECKING;
loadingGif->setVisible(true);
movie->start();
resultLogo->setVisible(false);
// 环境检测中,请等待
bigTitle->setDeplayText(tr("Checking, wait a moment ..."));
dot1->setBackgroundColor(Qt::black);
dot2->setBackgroundColor(Qt::black);
2021-12-11 15:10:58 +08:00
labelCheck1->setFontColor(Qt::black);
labelCheck2->setFontColor(Qt::black);
2021-12-09 10:00:07 +08:00
// 还原过程中不要做其它操作,以防数据丢失
labelCheck1->setDeplayText(tr("Check whether the restore environment meets the requirements"));
// 检测还原环境是否满足
labelCheck2->setDeplayText(tr("Do not perform other operations during restore to avoid data loss"));
preStep->setVisible(false);
nextStep->setVisible(false);
recheck->setVisible(false);
this->on_checkEnv_start();
});
// 检测结果
connect(this, &SystemRestore::checkEnvResult, this, [=](bool result, const QString &errMsg, const QString &errTip) {
loadingGif->setVisible(false);
movie->stop();
if (result) {
QIcon icon = QIcon::fromTheme("ukui-dialog-success", QIcon(":/symbos/ukui-dialog-success.png"));
resultLogo->setPixmap(icon.pixmap(QSize(20,20)));
resultLogo->setVisible(true);
// 检测成功
bigTitle->setDeplayText(tr("Succeeded to check the environment"));
// 还原完成后将自动重启
labelCheck1->setDeplayText(tr("The system will reboot automatically after the restore is successful"));
dot2->setBackgroundColor(COLOR_YELLOW);
labelCheck2->setFontColor(COLOR_YELLOW);
labelCheck2->setFontWordWrap(true);
// 请确保电脑已连接电源或电量超过60%
labelCheck2->setDeplayText(tr("Make sure the computer is plugged in or the battery level is above 60%"));
dot1->setVisible(true);
dot2->setVisible(true);
labelCheck1->setVisible(true);
labelCheck2->setVisible(true);
nextStep->setVisible(true);
recheck->setVisible(false);
} else {
QIcon icon = QIcon::fromTheme("dialog-error.png", QIcon(":/symbos/dialog-error.png"));
resultLogo->setPixmap(icon.pixmap(QSize(20,20)));
resultLogo->setVisible(true);
// 环境校验失败
bigTitle->setDeplayText(tr("Failed to check the environment"));
labelCheck1->setDeplayText(errMsg);
labelCheck2->setDeplayText(errTip);
if (errMsg.isEmpty()) {
dot1->setVisible(false);
labelCheck1->setVisible(false);
} else {
dot1->setVisible(true);
labelCheck1->setVisible(true);
}
if (errTip.isEmpty()) {
dot2->setVisible(false);
labelCheck2->setVisible(false);
} else {
dot2->setVisible(true);
labelCheck2->setVisible(true);
}
recheck->setVisible(true);
nextStep->setVisible(false);
}
preStep->setVisible(true);
});
2021-12-11 09:49:09 +08:00
// 重新检查
connect(recheck, &MyPushButton::clicked, this, [=](bool checked) {
Q_UNUSED(checked)
emit this->startCheckEnv();
});
2021-12-09 10:00:07 +08:00
addWidget(second);
}
/**
* @brief
*/
void SystemRestore::on_checkEnv_start()
{
GlobelBackupInfo::inst().setIsBusy(true);
m_pInterface = new ComKylinBackupManagerInterface("com.kylin.backup", "/", QDBusConnection::systemBus(), this);
connect(m_pInterface, &ComKylinBackupManagerInterface::sendEnvCheckResult, this, &SystemRestore::on_checkEnv_end);
// 是否已存在备份、还原等操作
bool isActive = false;
if(int(BackupState::BACKUP_STATE_INIT) != m_pInterface->getBackupState(isActive)){
on_checkEnv_end(int(BackupResult::OTHER_BACKUP_OR_RESTORE_RUNNING));
return;
}
BackupWrapper backupWrapper;
backupWrapper.m_type = m_isRetainUserData ? BackupType::RESTORE_SYSTEM_WITH_DATA : BackupType::RESTORE_SYSTEM;
backupWrapper.m_iPosition = m_devPath.isEmpty() ? BackupPosition::LOCAL : BackupPosition::UDISK;
2021-12-11 15:10:58 +08:00
backupWrapper.m_uuid = m_uuid;
2021-12-30 10:27:03 +08:00
backupWrapper.m_backupName = m_backupName;
2021-12-09 10:00:07 +08:00
backupWrapper.m_prefixDestPath = m_devPath;
backupWrapper.m_isOtherMachine = m_isOtherMachine ? 1 : 0;
backupWrapper.m_frontUid = getuid();
2022-01-13 14:06:40 +08:00
backupWrapper.m_frontUserName = qgetenv("USER");
2021-12-09 10:00:07 +08:00
backupWrapper.m_gid = getgid();
m_pInterface->checkEnv(backupWrapper);
}
/**
* @brief
* @param result,
*/
void SystemRestore::on_checkEnv_end(int result)
{
m_systemRestoreState = SystemRestoreState::IDEL;
bool bRst = false;
QString errMsg, errTip;
switch (result) {
case int(BackupResult::LOCK_PROGRAM_FAIL):
// 程序锁定失败,请重试
errMsg = tr("Program lock failed, please retry");
// 可能有其它备份/还原等任务在执行
errTip = tr("There may be other backups or restores being performed");
break;
case int(BackupResult::NO_FOUND_DEALCLASS):
// 不支持的任务类型
errMsg = tr("Unsupported task type");
// 没有找到相应的处理逻辑
errTip = tr("No processing logic was found in the service");
break;
2021-12-11 09:49:09 +08:00
case int(BackupResult::WRITE_BACKUP_PATHS_TO_USER_FAILED):
// ".user.txt文件不存在"
2021-12-11 16:17:02 +08:00
errMsg = tr("The .user.txt file does not exist");
2021-12-11 09:49:09 +08:00
// 备份点可能被损坏
errTip = tr("Backup points may be corrupted");
2021-12-09 10:00:07 +08:00
break;
2021-12-11 09:49:09 +08:00
case int(BackupResult::WRITE_EXCLUDE_BACKUP_PATHS_TO_USER_FAILED):
// .exclude.user.txt文件不存在
2021-12-11 16:17:02 +08:00
errMsg = tr("The .exclude.user.txt file does not exist");
2021-12-11 09:49:09 +08:00
// 备份点可能被损坏
errTip = tr("Backup points may be corrupted");
2021-12-09 10:00:07 +08:00
break;
2021-12-11 09:49:09 +08:00
case int(BackupResult::INC_NOT_FOUND_DIR):
// 备份点数据目录不存在
errMsg = tr("The backup point data directory does not exist");
// 备份点可能被损坏
errTip = tr("Backup points may be corrupted");
2021-12-09 10:00:07 +08:00
break;
2021-12-11 09:49:09 +08:00
case int(BackupResult::EFI_RSYNC_FAIL):
// 同步/boot/efi失败
errMsg = tr("Failed to rsync /boot/efi");
// 请检查/boot/efi分区挂载方式
errTip = tr("Check the mounting mode of the /boot/efi partition");
2021-12-09 10:00:07 +08:00
break;
default:
bRst = true;
break;
}
2022-01-20 15:08:22 +08:00
Utils::wait(2);
2021-12-09 10:00:07 +08:00
emit checkEnvResult(bRst, errMsg, errTip);
GlobelBackupInfo::inst().setIsBusy(false);
disconnect(m_pInterface, &ComKylinBackupManagerInterface::sendEnvCheckResult, this, &SystemRestore::on_checkEnv_end);
delete m_pInterface;
m_pInterface = nullptr;
}
2021-12-11 09:49:09 +08:00
/**
* @brief -
*/
void SystemRestore::initThirdWidget()
{
QWidget *third = new QWidget;
// 流程进度提示栏
CircleLable *one = new CircleLable("1", third, 24, QColor(COLOR_BLUE));
LineLabel *line1 = new LineLabel(third, QColor(COLOR_BLUE), QSize(200, 24));
CircleLable *two = new CircleLable("2", third, 24, QColor(COLOR_BLUE));
LineLabel *line2 = new LineLabel(third, QColor(COLOR_GRAY), QSize(200, 24));
CircleLable *three = new CircleLable("3", third);
QHBoxLayout *layoutLine1 = new QHBoxLayout;
layoutLine1->addStretch();
layoutLine1->addWidget(one);
layoutLine1->addWidget(line1);
layoutLine1->addWidget(two);
layoutLine1->addWidget(line2);
layoutLine1->addWidget(three);
layoutLine1->addStretch();
MyLabel *label1 = new MyLabel(tr("checking"), third);
label1->setIsOriginal(true);
label1->setFontColor(QColor(COLOR_BLUE));
MyLabel *label2 = new MyLabel(tr("restoring"), third);
label2->setIsOriginal(true);
label2->setFontColor(QColor(COLOR_BLUE));
MyLabel *label3 = new MyLabel(tr("finished"), third);
label3->setIsOriginal(true);
QHBoxLayout *layoutLine2 = new QHBoxLayout;
layoutLine2->addSpacing(100);
layoutLine2->addWidget(label1);
layoutLine2->addStretch();
layoutLine2->addWidget(label2);
layoutLine2->addStretch();
layoutLine2->addWidget(label3);
layoutLine2->addSpacing(100);
// ------------ 中部布局begin-------------
QWidget *centerFont = new QWidget(third);
QVBoxLayout *vlayoutCenterFont = new QVBoxLayout;
// 中部第一行
QHBoxLayout *hlayoutCenterFont1 = new QHBoxLayout;
// 检测等待图标
QLabel *loadingGif = new QLabel(centerFont);
// 环境检测等待动画
QMovie *movie = new QMovie(":/images/loading.gif", QByteArray(), centerFont);
loadingGif->setMovie(movie);
// 进度条
RingsProgressbar *progressBar = new RingsProgressbar(centerFont);
progressBar->setFixedSize(100, 100);
hlayoutCenterFont1->addStretch();
hlayoutCenterFont1->addWidget(loadingGif);
hlayoutCenterFont1->addWidget(progressBar);
2022-01-19 14:42:11 +08:00
hlayoutCenterFont1->addSpacing(20);
2021-12-11 09:49:09 +08:00
hlayoutCenterFont1->addStretch();
// 第二行
QHBoxLayout *hlayoutCenterFont2 = new QHBoxLayout;
// 提醒
MyLabel *labelTip = new MyLabel(centerFont);
labelTip->setAlignment(Qt::AlignCenter);
labelTip->setIsOriginal(true);
labelTip->setFontWordWrap(true);
// 不要使用电脑,以防数据丢失
2022-01-19 18:08:43 +08:00
labelTip->setDeplayText(tr("Do not use computer in case of data loss"));
2021-12-11 09:49:09 +08:00
hlayoutCenterFont2->addStretch();
hlayoutCenterFont2->addWidget(labelTip);
hlayoutCenterFont2->addStretch();
vlayoutCenterFont->addLayout(hlayoutCenterFont1);
vlayoutCenterFont->addLayout(hlayoutCenterFont2);
vlayoutCenterFont->addStretch();
centerFont->setLayout(vlayoutCenterFont);
// ------------ 中部布局end-------------
QHBoxLayout *layoutLine3 = new QHBoxLayout;
layoutLine3->addStretch();
layoutLine3->addSpacing(80);
layoutLine3->addWidget(centerFont);
layoutLine3->addStretch();
// 布局
QVBoxLayout *vlayout = new QVBoxLayout;
vlayout->addSpacing(40);
vlayout->addLayout(layoutLine1);
vlayout->addLayout(layoutLine2);
vlayout->addSpacing(50);
vlayout->addLayout(layoutLine3);
vlayout->addStretch();
third->setLayout(vlayout);
2021-12-11 15:10:58 +08:00
// 开始还原
2021-12-11 09:49:09 +08:00
connect(this, &SystemRestore::startRestore, this, [=] {
2021-12-11 15:10:58 +08:00
progressBar->setPersent(0);
2021-12-11 09:49:09 +08:00
movie->start();
2021-12-11 15:10:58 +08:00
// 开始还原
2021-12-11 09:49:09 +08:00
this->on_restore_start();
});
// 进度
connect(this, &SystemRestore::progress, this, [=](int state, int rate) {
Q_UNUSED(state)
progressBar->setPersent(rate);
});
addWidget(third);
}
/**
* @brief
*/
void SystemRestore::on_restore_start()
{
GlobelBackupInfo::inst().setIsBusy(true);
m_systemRestoreState = SystemRestoreState::RESTORING;
m_pInterface = new ComKylinBackupManagerInterface("com.kylin.backup", "/", QDBusConnection::systemBus(), this);
connect(m_pInterface, &ComKylinBackupManagerInterface::sendEnvCheckResult, this, &SystemRestore::on_checkRestore_end);
connect(m_pInterface, &ComKylinBackupManagerInterface::progress, this, &SystemRestore::progress);
connect(m_pInterface, &ComKylinBackupManagerInterface::sendRestoreResult, this, &SystemRestore::on_restore_end);
// 是否已存在备份、还原等操作
bool isActive = false;
if(int(BackupState::BACKUP_STATE_INIT) != m_pInterface->getBackupState(isActive)){
on_checkEnv_end(int(BackupResult::OTHER_BACKUP_OR_RESTORE_RUNNING));
return;
}
BackupWrapper backupWrapper;
backupWrapper.m_type = m_isRetainUserData ? BackupType::RESTORE_SYSTEM_WITH_DATA : BackupType::RESTORE_SYSTEM;
backupWrapper.m_iPosition = m_devPath.isEmpty() ? BackupPosition::LOCAL : BackupPosition::UDISK;
2021-12-11 15:10:58 +08:00
backupWrapper.m_uuid = m_uuid;
2021-12-30 10:27:03 +08:00
backupWrapper.m_backupName = m_backupName;
2021-12-11 09:49:09 +08:00
backupWrapper.m_prefixDestPath = m_devPath;
backupWrapper.m_isOtherMachine = m_isOtherMachine ? 1 : 0;
backupWrapper.m_frontUid = getuid();
2022-01-13 14:06:40 +08:00
backupWrapper.m_frontUserName = qgetenv("USER");
2021-12-11 09:49:09 +08:00
backupWrapper.m_gid = getgid();
m_pInterface->goRestore(backupWrapper);
}
/**
* @brief
* @param result
*/
void SystemRestore::on_checkRestore_end(int result)
{
bool bRst = false;
QString errMsg, errTip;
switch (result) {
case int(BackupResult::LOCK_PROGRAM_FAIL):
// 程序锁定失败,请重试
errMsg = tr("Program lock failed, please retry");
// 可能有其它备份/还原等任务在执行
errTip = tr("There may be other backups or restores being performed");
break;
case int(BackupResult::NO_FOUND_DEALCLASS):
// 不支持的任务类型
errMsg = tr("Unsupported task type");
// 没有找到相应的处理逻辑
errTip = tr("No processing logic was found in the service");
break;
case int(BackupResult::WRITE_BACKUP_PATHS_TO_USER_FAILED):
// ".user.txt文件不存在"
2021-12-11 16:17:02 +08:00
errMsg = tr("The .user.txt file does not exist");
2021-12-11 09:49:09 +08:00
// 备份点可能被损坏
errTip = tr("Backup points may be corrupted");
break;
case int(BackupResult::WRITE_EXCLUDE_BACKUP_PATHS_TO_USER_FAILED):
// .exclude.user.txt文件不存在
2021-12-11 16:17:02 +08:00
errMsg = tr("The .exclude.user.txt file does not exist");
2021-12-11 09:49:09 +08:00
// 备份点可能被损坏
errTip = tr("Backup points may be corrupted");
break;
case int(BackupResult::INC_NOT_FOUND_DIR):
// 备份点数据目录不存在
errMsg = tr("The backup point data directory does not exist");
// 备份点可能被损坏
errTip = tr("Backup points may be corrupted");
break;
case int(BackupResult::EFI_RSYNC_FAIL):
// 同步/boot/efi失败
errMsg = tr("Failed to rsync /boot/efi");
// 请检查/boot/efi分区挂载方式
errTip = tr("Check the mounting mode of the /boot/efi partition");
break;
case int(BackupResult::RESTOREDIR_PREPARE_FAILED):
// 还原目录准备失败
errMsg = tr("Failed to prepare the restore directory");
// 更多信息请参考日志/var/log/backup.log
errTip = tr("Refer to log :/var/log/backup.log for more information");
break;
default:
bRst = true;
break;
}
if (!bRst) {
GlobelBackupInfo::inst().setIsBusy(false);
m_systemRestoreState = SystemRestoreState::IDEL;
this->on_next_clicked(true);
emit this->checkRestoreResult(bRst, errMsg, errTip);
disconnect(m_pInterface, &ComKylinBackupManagerInterface::sendEnvCheckResult, this, &SystemRestore::on_checkRestore_end);
disconnect(m_pInterface, &ComKylinBackupManagerInterface::progress, this, &SystemRestore::progress);
disconnect(m_pInterface, &ComKylinBackupManagerInterface::sendRestoreResult, this, &SystemRestore::on_restore_end);
delete m_pInterface;
m_pInterface = nullptr;
}
}
/**
* @brief
* @param result-false ; true
*/
void SystemRestore::on_restore_end(bool result)
{
m_systemRestoreState = SystemRestoreState::IDEL;
this->on_next_clicked(true);
if (result) {
emit checkRestoreResult(result);
} else {
// 还原过程中出现错误
QString errMsg = tr("An error occurred during restore");
// 错误信息参考日志文件:/var/log/backup.log
QString errTip = tr("Error messages refer to log file : /var/log/backup.log");
emit checkRestoreResult(result, errMsg, errTip);
}
GlobelBackupInfo::inst().setIsBusy(false);
disconnect(m_pInterface, &ComKylinBackupManagerInterface::sendEnvCheckResult, this, &SystemRestore::on_checkRestore_end);
disconnect(m_pInterface, &ComKylinBackupManagerInterface::progress, this, &SystemRestore::progress);
disconnect(m_pInterface, &ComKylinBackupManagerInterface::sendRestoreResult, this, &SystemRestore::on_restore_end);
delete m_pInterface;
m_pInterface = nullptr;
}
/**
* @brief
*/
void SystemRestore::initLastWidget()
{
QWidget *last = new QWidget;
// 流程进度提示栏
CircleLable *one = new CircleLable("1", last, 24, QColor(COLOR_BLUE));
LineLabel *line1 = new LineLabel(last, QColor(COLOR_BLUE), QSize(200, 24));
CircleLable *two = new CircleLable("2", last, 24, QColor(COLOR_BLUE));
2021-12-28 16:51:35 +08:00
LineLabel *line2 = new LineLabel(last, QColor(COLOR_BLUE), QSize(200, 24));
2021-12-11 09:49:09 +08:00
CircleLable *three = new CircleLable("3", last, 24, QColor(COLOR_BLUE));
QHBoxLayout *layoutLine1 = new QHBoxLayout;
layoutLine1->addStretch();
layoutLine1->addWidget(one);
layoutLine1->addWidget(line1);
layoutLine1->addWidget(two);
layoutLine1->addWidget(line2);
layoutLine1->addWidget(three);
layoutLine1->addStretch();
MyLabel *label1 = new MyLabel(tr("checking"), last);
label1->setIsOriginal(true);
label1->setFontColor(QColor(COLOR_BLUE));
MyLabel *label2 = new MyLabel(tr("restoring"), last);
label2->setIsOriginal(true);
label2->setFontColor(QColor(COLOR_BLUE));
MyLabel *label3 = new MyLabel(tr("finished"), last);
label3->setIsOriginal(true);
label3->setFontColor(QColor(COLOR_BLUE));
QHBoxLayout *layoutLine2 = new QHBoxLayout;
layoutLine2->addSpacing(100);
layoutLine2->addWidget(label1);
layoutLine2->addStretch();
layoutLine2->addWidget(label2);
layoutLine2->addStretch();
layoutLine2->addWidget(label3);
layoutLine2->addSpacing(100);
// ------------ 中部布局begin-------------
QWidget *centerFont = new QWidget(last);
QVBoxLayout *vlayoutCenterFont = new QVBoxLayout;
// 中部第一行
QHBoxLayout *hlayoutCenterFont1 = new QHBoxLayout;
// 备份结果对错图标
QLabel *resultLogo = new QLabel(centerFont);
resultLogo->setFixedSize(20,20);
hlayoutCenterFont1->addWidget(resultLogo);
// 检测中大标题
MyLabel *bigTitle = new MyLabel(centerFont);
bigTitle->setFontSize(24);
bigTitle->setMaximumWidth(700);
hlayoutCenterFont1->addWidget(bigTitle);
hlayoutCenterFont1->addStretch();
vlayoutCenterFont->addLayout(hlayoutCenterFont1);
// 第二行
QHBoxLayout *hlayoutCenterFont2 = new QHBoxLayout;
hlayoutCenterFont2->addSpacing(10);
// 备份结果错误提示:黑点和文字
CircleLable *dot1 = new CircleLable(QString(""), centerFont, 6, Qt::black);
hlayoutCenterFont2->addWidget(dot1);
hlayoutCenterFont2->addSpacing(5);
MyLabel *labelError1 = new MyLabel(centerFont);
labelError1->setMinimumWidth(400);
labelError1->setMaximumWidth(600);
labelError1->setIsOriginal(true);
labelError1->setWordWrap(true);
labelError1->adjustSize();
hlayoutCenterFont2->addWidget(labelError1);
hlayoutCenterFont2->addStretch();
vlayoutCenterFont->addLayout(hlayoutCenterFont2);
// 第三行
QHBoxLayout *hlayoutCenterFont3 = new QHBoxLayout;
hlayoutCenterFont3->addSpacing(10);
// 检测中的记录黑点2和文字2
CircleLable *dot2 = new CircleLable(QString(""), centerFont, 6, Qt::black);
hlayoutCenterFont3->addWidget(dot2);
hlayoutCenterFont3->addSpacing(5);
MyLabel *labelError2 = new MyLabel(centerFont);
//labelError2->setMinimumWidth(400);
//labelError2->setMaximumWidth(600);
labelError2->setIsOriginal(true);
labelError2->setWordWrap(true);
labelError2->adjustSize();
hlayoutCenterFont3->addWidget(labelError2);
hlayoutCenterFont3->addStretch();
vlayoutCenterFont->addLayout(hlayoutCenterFont3);
// 第四行
vlayoutCenterFont->addSpacing(30);
// 第五行
QHBoxLayout *hlayoutCenterFont5 = new QHBoxLayout;
hlayoutCenterFont5->addSpacing(100);
2022-01-20 13:42:08 +08:00
// 返回首页
MyPushButton *homePage = new MyPushButton(centerFont);
homePage->setFixedSize(97, 36);
homePage->setText(tr("home page"));
homePage->setEnabled(true);
homePage->setAutoRepeat(true);
hlayoutCenterFont5->addWidget(homePage);
hlayoutCenterFont5->addSpacing(20);
2021-12-11 09:49:09 +08:00
// 再试一次
MyPushButton *retry = new MyPushButton(centerFont);
retry->setFixedSize(97, 36);
retry->setText(tr("retry"));
retry->setEnabled(true);
retry->setAutoRepeat(true);
hlayoutCenterFont5->addWidget(retry);
hlayoutCenterFont5->addStretch();
vlayoutCenterFont->addLayout(hlayoutCenterFont5);
vlayoutCenterFont->addStretch();
centerFont->setLayout(vlayoutCenterFont);
// ------------ 中部布局end-------------
QHBoxLayout *layoutLine3 = new QHBoxLayout;
layoutLine3->addStretch();
layoutLine3->addWidget(centerFont);
layoutLine3->addStretch();
// 布局
QVBoxLayout *vlayout = new QVBoxLayout;
vlayout->addSpacing(40);
vlayout->addLayout(layoutLine1);
vlayout->addLayout(layoutLine2);
vlayout->addSpacing(50);
vlayout->addLayout(layoutLine3);
vlayout->addStretch();
last->setLayout(vlayout);
// 还原检测结果
connect(this, &SystemRestore::checkRestoreResult, this, [=](bool result, const QString &errMsg, const QString &errTip) {
if (result) {
QIcon icon = QIcon::fromTheme("ukui-dialog-success", QIcon(":/symbos/ukui-dialog-success.png"));
resultLogo->setPixmap(icon.pixmap(QSize(20,20)));
resultLogo->setVisible(true);
// 系统还原成功
bigTitle->setDeplayText(tr("Successfully restoring the system"));
dot1->setVisible(true);
dot2->setVisible(false);
labelError1->setVisible(true);
// 系统将自动重启
labelError1->setDeplayText(tr("The system will automatically reboot"));
labelError2->setVisible(false);
retry->setVisible(false);
2022-01-20 13:42:08 +08:00
homePage->setVisible(true);
2021-12-11 09:49:09 +08:00
} else {
QIcon icon = QIcon::fromTheme("dialog-error.png", QIcon(":/symbos/dialog-error.png"));
resultLogo->setPixmap(icon.pixmap(QSize(20,20)));
resultLogo->setVisible(true);
// 系统还原失败
bigTitle->setDeplayText(tr("Restoring the system failed"));
dot1->setVisible(true);
dot2->setVisible(true);
2022-01-20 14:25:00 +08:00
labelError1->setVisible(true);
labelError2->setVisible(true);
2021-12-11 09:49:09 +08:00
labelError1->setDeplayText(errMsg);
labelError2->setDeplayText(errTip);
retry->setVisible(true);
2022-01-20 13:42:08 +08:00
homePage->setVisible(true);
2021-12-11 09:49:09 +08:00
}
});
// 再试一次
connect(retry, &MyPushButton::clicked, this, [=](bool checked) {
Q_UNUSED(checked)
this->setCurrentIndex(SystemRestorePage::RESTORE_PAGE);
2021-12-28 16:51:35 +08:00
emit this->startRestore();
2021-12-11 09:49:09 +08:00
});
2022-01-20 13:42:08 +08:00
// 返回首页
connect(homePage, &MyPushButton::clicked, this, [=](bool checked) {
Q_UNUSED(checked)
this->setCurrentIndex(SystemRestorePage::HOME_PAGE);
});
2021-12-11 09:49:09 +08:00
addWidget(last);
}
2021-12-09 10:00:07 +08:00