yhkylin-backup-tools/kybackup/main.cpp

180 lines
5.8 KiB
C++
Raw Normal View History

2021-08-06 10:20:03 +08:00
#include "maindialog.h"
#include <QApplication>
2021-09-16 16:05:46 +08:00
#include <QLibraryInfo>
#include <QTextCodec>
#include <QTranslator>
#include <QCommandLineParser>
#include <QtDBus>
#include <QMessageBox>
#include <QDesktopWidget>
#include <signal.h>
2021-09-16 16:05:46 +08:00
#include <unistd.h>
#include "qtsingleapplication/qtsingleapplication.h"
#include "../common/utils.h"
#include "xatom-helper.h"
2021-12-26 18:15:21 +08:00
#include "globalbackupinfo.h"
2022-02-15 16:51:03 +08:00
#include "messageboxutils.h"
2021-09-16 16:05:46 +08:00
// 声明
void initApp(QApplication& a);
bool isManager();
void centerToScreen(QWidget* widget);
2021-08-06 10:20:03 +08:00
int main(int argc, char *argv[])
{
2021-09-16 16:05:46 +08:00
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
#endif
2022-02-15 16:51:03 +08:00
QtSingleApplication a ("kybackup", argc, argv);
2021-09-16 16:05:46 +08:00
initApp(a);
// 当前只支持管理员用户使用备份还原工具
2022-02-22 17:22:45 +08:00
GlobelBackupInfo::inst().setIsManager(isManager());
2022-02-22 15:49:57 +08:00
// if (!GlobelBackupInfo::inst().isManager() && GlobelBackupInfo::inst().hasArgRestore()) {
// MessageBoxUtils::QMESSAGE_BOX_WARNING(nullptr, QObject::tr("Information"),
// QObject::tr("This function can only be used by administrator."),
// QObject::tr("Ok"));
// return EXIT_FAILURE;
// }
2021-09-16 16:05:46 +08:00
if (a.isRunning()) {
QString strUid = QString::number(getuid());
QString ack = a.sendMessage(strUid, 3000);
if (strUid != ack) {
2022-02-15 16:51:03 +08:00
MessageBoxUtils::QMESSAGE_BOX_WARNING(nullptr, QObject::tr("Information"),
QObject::tr("Another user had opened kybackup, you can not start it again."),
QObject::tr("Ok"));
2021-09-16 16:05:46 +08:00
}
return EXIT_SUCCESS;
}
2021-08-06 10:20:03 +08:00
MainDialog w;
2021-09-16 16:05:46 +08:00
// 居中窗口
centerToScreen(&w);
a.setWindowIcon(QIcon::fromTheme(THEME_YHKYLIN_BACKUP_TOOLS));
a.setActivationWindow(&w, true);
//如果是第一个实例,则绑定,方便下次调用
QObject::connect(&a,SIGNAL(messageReceived(const QString&)),&w,SLOT(sltMessageReceived(const QString&)));
2021-08-06 10:20:03 +08:00
w.show();
return a.exec();
}
2021-09-16 16:05:46 +08:00
/**
* @brief
* @param a
* @note new出来的两个QTranslator不用删除
*/
void initApp(QApplication& a)
{
//前端向后端传递QString参数若参数中含有中文则保证不会乱码
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
//区分中英文
QString locale = QLocale::system().name();
//QT自身标准的翻译
#ifndef QT_NO_TRANSLATION
QString translatorFileName = QLatin1String("qt_");
translatorFileName += locale;
QTranslator *selfTransOfQt = new QTranslator();
if (selfTransOfQt->load(translatorFileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
a.installTranslator(selfTransOfQt);
else
qDebug() << "load qt translator file failed!";
#endif
//应用内的翻译
QTranslator *translator = new QTranslator();
if (locale == "zh_CN") {
//中文需要翻译
2022-02-11 13:48:46 +08:00
if (!translator->load(":/language/qt_zh_CN.qm")) //qtcreator启动后看到在资源目录下
2021-09-16 16:05:46 +08:00
qDebug() << "load translator file failed!";
else
a.installTranslator(translator);
}
// 命令行参数
QCoreApplication::setApplicationName(QObject::tr("kybackup"));
QCoreApplication::setApplicationVersion("4.0.14");
QCommandLineParser parser;
parser.setApplicationDescription("kybackup helper");
parser.addHelpOption();
parser.addVersionOption();
// 启动后进入的页面
QCommandLineOption functionOption(QStringList() << "r" << "restore", QCoreApplication::translate("restore", "system restore"));
parser.addOption(functionOption);
parser.process(a);
2021-12-26 18:15:21 +08:00
GlobelBackupInfo::inst().setHasArgRestore(parser.isSet(functionOption));
2021-09-16 16:05:46 +08:00
QString qsAppPath = QCoreApplication::applicationDirPath();
Utils::initSysRootPath(qsAppPath);
}
/**
* @brief
* @return true-false-
*/
bool isManager()
{
2022-02-22 17:22:45 +08:00
uid_t uid = getuid();
QString sid = QString::number(uid);
GlobelBackupInfo::inst().setCurUserId(sid);
2021-09-16 16:05:46 +08:00
QString rootPath = Utils::getSysRootPath();
// 只正常启动程序时需校验是否管理员账号启动
if ("/" != rootPath)
return true;
// root用户
if (0 == uid)
return true;
QString userObject = "/org/freedesktop/Accounts/User" + sid;
// 创建QDBusInterface
QDBusInterface iface("org.freedesktop.Accounts", userObject, "org.freedesktop.DBus.Properties", QDBusConnection::systemBus());
if (!iface.isValid()) {
qDebug() << qPrintable(QDBusConnection::systemBus().lastError().message());
exit(1);
}
int result = 0;
QDBusReply<QDBusVariant> reply = iface.call("Get", QString("org.freedesktop.Accounts.User"), QString("AccountType"));
if (reply.isValid()) {
QVariant val = reply.value().variant();
result = val.toInt();
}
return 0 == result ? false : true;
}
/**
* @brief
* @param widget
*/
void centerToScreen(QWidget* widget)
{
if (!widget)
return;
QDesktopWidget* m = QApplication::desktop();
// QRect desk_rect = m->screenGeometry(m->screenNumber(QCursor::pos()));
QRect desk_rect = m->screenGeometry(widget);
int desk_x = desk_rect.width();
int desk_y = desk_rect.height();
int x = widget->width();
int y = widget->height();
widget->move(desk_x / 2 - x / 2 + desk_rect.left(), desk_y / 2 - y / 2 + desk_rect.top());
}