From abb89a45855e3b153ce78cc853197ab3987227a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E7=82=9C?= Date: Thu, 21 Jul 2022 18:14:33 +0800 Subject: [PATCH] Import Upstream version 1.3.2.1 --- README.md | 36 + checkUpdate.py | 20 + checkUpdate.pyc | Bin 0 -> 897 bytes data/Resources.qrc | 6 + data/kylin-background-upgrade-manul.service | 10 + data/kylin-background-upgrade-manul.timer | 12 + data/kylin-background-upgrade-template.conf | 9 + data/kylin-background-upgrade.desktop | 10 + data/kylin-update.timer.conf | 6 + ...og4qt.kylin-background-upgrade.gschema.xml | 39 + data/update.png | Bin 0 -> 715 bytes kylin-background-upgrade.pro | 73 ++ kylin-background-upgrade.pro.user | 315 +++++++++ kylin-update-notify.desktop | 6 + src/core.cpp | 22 + src/core.h | 23 + src/main.cpp | 154 ++++ src/traydbus.cpp | 458 ++++++++++++ src/traydbus.h | 160 +++++ src/trayicon.cpp | 35 + src/trayicon.h | 33 + src/updatehandle.cpp | 667 ++++++++++++++++++ src/updatehandle.h | 103 +++ src/updatewidget.cpp | 502 +++++++++++++ src/updatewidget.h | 119 ++++ src/updatewidget.ui | 21 + translations/UapLBi.json | 1 + .../kylin-background-upgrade_bo_CN.qm | Bin 0 -> 2535 bytes .../kylin-background-upgrade_bo_CN.ts | 92 +++ .../kylin-background-upgrade_zh_CN.qm | Bin 0 -> 1306 bytes .../kylin-background-upgrade_zh_CN.ts | 161 +++++ 31 files changed, 3093 insertions(+) create mode 100644 README.md create mode 100755 checkUpdate.py create mode 100644 checkUpdate.pyc create mode 100644 data/Resources.qrc create mode 100644 data/kylin-background-upgrade-manul.service create mode 100644 data/kylin-background-upgrade-manul.timer create mode 100644 data/kylin-background-upgrade-template.conf create mode 100644 data/kylin-background-upgrade.desktop create mode 100644 data/kylin-update.timer.conf create mode 100644 data/org.ukui.log4qt.kylin-background-upgrade.gschema.xml create mode 100644 data/update.png create mode 100644 kylin-background-upgrade.pro create mode 100644 kylin-background-upgrade.pro.user create mode 100644 kylin-update-notify.desktop create mode 100644 src/core.cpp create mode 100644 src/core.h create mode 100644 src/main.cpp create mode 100644 src/traydbus.cpp create mode 100644 src/traydbus.h create mode 100644 src/trayicon.cpp create mode 100644 src/trayicon.h create mode 100644 src/updatehandle.cpp create mode 100644 src/updatehandle.h create mode 100644 src/updatewidget.cpp create mode 100644 src/updatewidget.h create mode 100644 src/updatewidget.ui create mode 100644 translations/UapLBi.json create mode 100644 translations/kylin-background-upgrade_bo_CN.qm create mode 100644 translations/kylin-background-upgrade_bo_CN.ts create mode 100644 translations/kylin-background-upgrade_zh_CN.qm create mode 100644 translations/kylin-background-upgrade_zh_CN.ts diff --git a/README.md b/README.md new file mode 100644 index 0000000..2620f7b --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# kylin-background-upgrade + +## 主要功能: + +> 由后台定时器定时调起,访问源服务器检测是否有强制更新与可选更新 +> +> 检测到强制更新内容在后台升级,托盘不显示 +> +> 如果控制面板的自动检测更新关闭,则后台托盘程序不提醒用户更新 +> +> 检测到可选更新弹出交互界面 +> +> 点击同意更新按钮,调到控制面板更新页面,托盘程序退出 +> +> 点击暂不更新按钮,退出托盘程序 + +## 注意事项: + +> 如果托盘应该出现的情况下没出现,请查看是否收纳。在控制面板>个性化>显示在托盘上的图标中,把更新管理器托盘程序改成显示。 +> +> 如果托盘打印信息为:“源管理器updateSource is failed,连接失败,程序退出”,请查看源管理器是否启动,如已启动,请执行: sudo pkill -f start_dbus sudo +> +> killall kylin-software-properties-service sudo kylin-software-properties-service 后,再启动托盘程序。 +> +> 静默升级时,会在命令行打印信息 +> +> 右下角提示,在不进行其他操作时,不退出 +> + +## 启动定时器: + +> 定时器与托盘服务名称: kylin-background-upgrade-timer.timer kylin-background-upgrade.service +> +> 查看定时器是否工作: systemctl --user status kylin-background-upgrade-timer.timer + + diff --git a/checkUpdate.py b/checkUpdate.py new file mode 100755 index 0000000..23ce81a --- /dev/null +++ b/checkUpdate.py @@ -0,0 +1,20 @@ +#!/usr/bin/python3 +import apt +import subprocess + +def calculate_upgradable_pkgs(): + cache = apt.Cache() + pkgs_to_upgrade = [] + + for pkg in cache: + if pkg.is_installed and pkg.is_upgradable : + pkgs_to_upgrade.append(pkg.name) + + if cache.get_changes(): + cache.clear() + + if len(pkgs_to_upgrade) != 0: + subprocess.Popen('dbus-send --system --type=signal / com.kylin.update.notification.DownloadFinish', shell=True) + +if __name__ == "__main__": + calculate_upgradable_pkgs() diff --git a/checkUpdate.pyc b/checkUpdate.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d168620b274bb1adf61330a3835fcfc695a16e4d GIT binary patch literal 897 zcmcIiO^e$w5FN?c?54G8cMmPO^;SdK=1_Vllu}4x7YZpPErmiciY*-5itV*zNFX_F z|73qhe?a?23FOq{3TgCaG#_sy1%IMPFQ5HhrgR(<`$sJM4kE)8WQcwMNcsgJC<{E0 zqyx$ZR7vXIk`{DNbaPw#h(&yc=;ANN%x4au@|t2<4dIANAF?OPiS~jvZ)ivK>E|oj zOWH{)k$3Dt;DMlW;MFs_7bNb+g!vsI<&aBvio?ru#sVyMf)=qrrCEHz^|-ofonvBC zm9Df4feM=xwROrEow?{>=-a$gnOYj{hCZm(b>;?uwOVWU7$Da!Nmr`Qwe<;8qg5Ak ziG%9%KY`j-xlLS?9CB*U0=5`OoVXkN6oN!3hB6XY;<*e(BvZEW;H#Tr z*%1Uj!Obl`!y@MIF|${YD^(ok3)457UT=$2S10sv{c#Hp_kW4qGA$DB0y0U~s;HAB rW`{Z3=lo=Ie(s|Kzat#@>?9tJDYJUNZnEC!4@}guA(W$N6old*X&BY( literal 0 HcmV?d00001 diff --git a/data/Resources.qrc b/data/Resources.qrc new file mode 100644 index 0000000..6859cf5 --- /dev/null +++ b/data/Resources.qrc @@ -0,0 +1,6 @@ + + + + update.png + + diff --git a/data/kylin-background-upgrade-manul.service b/data/kylin-background-upgrade-manul.service new file mode 100644 index 0000000..d5e9c63 --- /dev/null +++ b/data/kylin-background-upgrade-manul.service @@ -0,0 +1,10 @@ +[Unit] +Description=系统升级后台检测程序 + + +[Service] +Type=forking +TimeoutStartSec=infinity +ExecStart=/usr/share/kylin-update-notify/checkUpdate.py + + diff --git a/data/kylin-background-upgrade-manul.timer b/data/kylin-background-upgrade-manul.timer new file mode 100644 index 0000000..4268f77 --- /dev/null +++ b/data/kylin-background-upgrade-manul.timer @@ -0,0 +1,12 @@ +[Unit] +Description=系统升级定时检测 + +[Timer] +OnStartupSec=5min 10s +OnUnitInactiveSec=5min 10s +AccuracySec=5s +Unit=kylin-background-upgrade-manul.service + +[Install] +WantedBy=default.target + diff --git a/data/kylin-background-upgrade-template.conf b/data/kylin-background-upgrade-template.conf new file mode 100644 index 0000000..0ac8fb8 --- /dev/null +++ b/data/kylin-background-upgrade-template.conf @@ -0,0 +1,9 @@ +[Settings] +powersize=1 +setpackagesize=999999999 + +[Timer] +checkUpgradeTime= +checkUpgradeTimeSlot=9:30-11:30 +RandomizedExecute=True + diff --git a/data/kylin-background-upgrade.desktop b/data/kylin-background-upgrade.desktop new file mode 100644 index 0000000..f592f81 --- /dev/null +++ b/data/kylin-background-upgrade.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=kylin-background-upgrade +Name[zh_CN]=更新管理器托盘程序 +Exec=/usr/bin/kylin-background-upgrade %u +Icon=kylin-update-manager +Type=Application +X-UKUI-AutoRestart=true +OnlyShowIn=UKUI +X-UKUI-Autostart-Phase=Application +NoDisplay=true diff --git a/data/kylin-update.timer.conf b/data/kylin-update.timer.conf new file mode 100644 index 0000000..09880ea --- /dev/null +++ b/data/kylin-update.timer.conf @@ -0,0 +1,6 @@ +[Timer] +CheckUpgradeTime= +CheckCompleted=false +CheckUpgradeTimeSlot=09:30:00-11:30:00 +GeneratRandomTime=true +RandomizedExecute=true \ No newline at end of file diff --git a/data/org.ukui.log4qt.kylin-background-upgrade.gschema.xml b/data/org.ukui.log4qt.kylin-background-upgrade.gschema.xml new file mode 100644 index 0000000..cc35fcd --- /dev/null +++ b/data/org.ukui.log4qt.kylin-background-upgrade.gschema.xml @@ -0,0 +1,39 @@ + + + + "true" + hook qt messages + Control if hook qt messages + + + "DEBUG,console,daily" + config rootLogger's level and appenders + config rootLogger's level and appenders:"level,appender" + + + ".yyyy-MM-dd" + daily log file pattern + set daily log file pattern format:one day + + + "%d{yyyy-MM-dd HH:mm:ss,zzz}(%-4r)[%t]|%-5p| - %m%n" + set log message's format + set log message's format + + + 3600 + set check log files delay time + set check log files delay time + + + 7 + set log files count + set log files count,unit s + + + 512 + set log files total size + set log files total size, unit M + + + diff --git a/data/update.png b/data/update.png new file mode 100644 index 0000000000000000000000000000000000000000..a28e913243c91874881e9b93cdabdf95a8e18d21 GIT binary patch literal 715 zcmV;+0yO=JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&0$@o*K~y+TZBk25 z6Hyo){{&*i|DtH(#s$Vi9hVq6$WOjI_mlo+E#k=6noG(`%1Nz0?o zP+oPI4xK*ev@=r{dc5Z%jVNDo($n+!W^Q{G{4=_)Bce_sm(yUEYZBzt=*7n)C|$WF zLEc`_YPCd2MZMv{Y5E6(o_ni!Ez+X146qjyiC!-O39HOc9rnhI4pY`JyYVz!yb+VUCbLb+!(fTxW6btPK_Qj zXGNBs@Yn>DWGV~Os-a65%8-wzSqInO+BkH_#Hm3`f}9#XW&-a#*Vp<%Q7>iSESCaGCiBZYGDh3L29mn_-Q#MPD;X=L;ha?6H9I8}slyLBMcZ)Q99QFJ)%s~j3rv7i+Y zoilLyNgaVc523^+g7Hms-1Vgv%NjBh3{T2VdjW^ShmjC6i|fcPZR|s4aqn|oW_EUV x{5Dknisjo$tNeghO5NixqE2k8I+002ovPDHLkV1j>-K#%|c literal 0 HcmV?d00001 diff --git a/kylin-background-upgrade.pro b/kylin-background-upgrade.pro new file mode 100644 index 0000000..0c28cdf --- /dev/null +++ b/kylin-background-upgrade.pro @@ -0,0 +1,73 @@ +QT += core gui dbus network KWindowSystem sql +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 link_pkgconfig + +# 项目名 +TARGET = kylin-background-upgrade +TEMPLATE = app + +LIBS +=-lukui-log4qt -lpython2.7 + +# 执行文件装载 +target.path = /usr/bin +target.source += $$TARGET + +SOURCES += \ + ./src/core.cpp \ + ./src/main.cpp \ + ./src/traydbus.cpp \ + ./src/trayicon.cpp \ + ./src/updatehandle.cpp \ + ./src/updatewidget.cpp + +HEADERS += \ + ./src/core.h \ + ./src/traydbus.h \ + ./src/trayicon.h \ + ./src/updatehandle.h \ + ./src/updatewidget.h + +# service文件装载 manul +service_manul.files = ./data/kylin-background-upgrade-manul.service +service_manul.path = /usr/lib/systemd/user/ + +# timer文件装载 +timer_manul.files = ./data/kylin-background-upgrade-manul.timer +timer_manul.path = /usr/lib/systemd/user/ + + +# desktop文件装载 +desktop.files = ./data/kylin-background-upgrade.desktop +desktop.path = /usr/share/applications/ + +conf.files = ./data/kylin-background-upgrade-template.conf +conf.path = /var/lib/kylin-background-upgrade/ + +# 日志配置文件 +schemes.files += data/org.ukui.log4qt.kylin-background-upgrade.gschema.xml +schemes.path = /usr/share/glib-2.0/schemas/ + + +TRANSLATIONS += translations/kylin-background-upgrade_zh_CN.ts + translations/kylin-background-upgrade_bo_CN.ts + translation.path = /usr/share/kylin-background-upgrade + translation.files += translations/kylin-background-upgrade_zh_CN.qm + translation.files += translations/kylin-background-upgrade_bo_CN.qm + + +INSTALLS += target desktop conf translation schemes service_manul timer_manul + +PKGCONFIG += gsettings-qt + +FORMS += \ + ./src/updatewidget.ui + +RESOURCES += \ + ./data/Resources.qrc + +DISTFILES += \ + ./data/update.png + +DISTFILES += \ + checkUpdate.py diff --git a/kylin-background-upgrade.pro.user b/kylin-background-upgrade.pro.user new file mode 100644 index 0000000..c7c7ba3 --- /dev/null +++ b/kylin-background-upgrade.pro.user @@ -0,0 +1,315 @@ + + + + + + EnvironmentId + {3d34bcf0-6a81-46d0-90d9-4cc7667111f8} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + 桌面 + 桌面 + {fb955230-392d-4c01-8fb0-8bfc9c0d7279} + 0 + 0 + 0 + + /home/lxy/kylin-background-upgrade/sp3/build-kylin-background-upgrade-unknown-Debug + + + true + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + /home/lxy/kylin-background-upgrade/sp3/build-kylin-background-upgrade-unknown-Release + + + true + QtProjectManager.QMakeBuildStep + false + + false + false + false + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + + /home/lxy/kylin-background-upgrade/sp3/build-kylin-background-upgrade-unknown-Profile + + + true + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + kylin-background-upgrade2 + Qt4ProjectManager.Qt4RunConfiguration:/home/lxy/kylin-background-upgrade/OpenKylin/make_deb/kylin-background-upgrade/kylin-background-upgrade.pro + /home/lxy/kylin-background-upgrade/OpenKylin/make_deb/kylin-background-upgrade/kylin-background-upgrade.pro + + false + + false + true + true + false + false + true + + /home/lxy/kylin-background-upgrade/sp3/build-kylin-background-upgrade-unknown-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/kylin-update-notify.desktop b/kylin-update-notify.desktop new file mode 100644 index 0000000..662e431 --- /dev/null +++ b/kylin-update-notify.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Name=update-notify-force +Exec=/usr/bin/kylin-background-upgrade --check-upgrade +Type=Application +NoDisplay=true +Comment=update-notify-force diff --git a/src/core.cpp b/src/core.cpp new file mode 100644 index 0000000..00dc303 --- /dev/null +++ b/src/core.cpp @@ -0,0 +1,22 @@ +#include "core.h" + +core::core(QString getnum, QWidget *parent) + : QMainWindow(parent) +{ + updateHandle = new updatehandle(getnum,this); + connect(updateHandle,&updatehandle::execSignal,this,&core::execSlots); + this->setWindowFlags(Qt::SubWindow); + +} + +core::~core() +{ + +} + +void core::execSlots() +{ + emit execSignal(); +} + + diff --git a/src/core.h b/src/core.h new file mode 100644 index 0000000..9647b0e --- /dev/null +++ b/src/core.h @@ -0,0 +1,23 @@ +#ifndef CORE_H +#define CORE_H + +#include +#include "updatehandle.h" + +class core : public QMainWindow +{ + Q_OBJECT + +public: + core(QString getnum, QWidget *parent = nullptr); + ~core(); + updatehandle *updateHandle; + +signals: + void execSignal(); + +protected slots: + void execSlots(); + +}; +#endif // CORE_H diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..f7179b2 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,154 @@ +#include "core.h" +#include +#include +#include +#include +#include +#include +#include + +#define PROGRAM_NAME "kylin-background-upgrade" + +static FILE *fp = NULL; + +void msgHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg) +{ + static char logPath[255] = {0}; + static int uid = -1; + + Q_UNUSED(context); + + QDateTime currentTime = QDateTime::currentDateTime(); + QString timeStr = currentTime.toString("yy.MM.dd hh:mm:ss +zzz"); + + // 获取用于控制命令行输出的环境变量 + char *ctrlEnv = getenv("XXXX_DEBUG"); + QString env; + + // 格式化输出字符串,添加消息发生时间、消息等级 + QString outMsg; + switch (type) { + case QtDebugMsg: + outMsg = QString("[%1 D]: %2").arg(timeStr).arg(msg); + break; + case QtInfoMsg: + outMsg = QString("[%1 I]: %2").arg(timeStr).arg(msg); + break; + case QtWarningMsg: + outMsg = QString("[%1 W]: %2").arg(timeStr).arg(msg); + break; + case QtCriticalMsg: + outMsg = QString("[%1 C]: %2").arg(timeStr).arg(msg); + break; + case QtFatalMsg: + outMsg = QString("[%1 F]: %2").arg(timeStr).arg(msg); + } + + if (fp != NULL) { + // 日志文件存在,则输出到日志文件中 + fprintf(fp, "%s\n", outMsg.toUtf8().data()); + fflush(fp); + } + + if (ctrlEnv != NULL) { + // 环境变量为true或者1,则将信息输出到命令行 + env = QString(ctrlEnv).toLower(); + if ((env == "true") || (env == "1")) { + fprintf(stdout, "%s\n", outMsg.toStdString().c_str()); + fflush(stdout); + } + } + + // 遇到致命错误,需要终止程序(这里终止程序是可选的) + if (type == QtFatalMsg) + abort(); +} + +void log_env_init(){ + static int uid = -1; + static char logPath[255] = {0}; + bool _is_root = false; + + // 初始执行时,设置log文件路径 + if (uid == -1) { + uid = getuid(); + + } + if (uid == 0) { + // root user + sprintf(logPath, "/var/log/kylin-background-upgrade/kylin-background-upgrade.log", uid, PROGRAM_NAME); + _is_root = true; + } else { + // normal user + sprintf(logPath, "/run/user/%d/%s.log", uid, PROGRAM_NAME); + } + printf("Logfile path: %s\n", logPath); + + if (access(logPath, F_OK|W_OK) == 0) { // log文件存在且可写 + if (fp == NULL) + fp = fopen(logPath, "a+"); + QFileInfo info(logPath); + if (info.size() > 1024*1024*200) { //200MB + fclose(fp); fp = NULL; + QFile fileclean(logPath); + fileclean.open(QIODevice::WriteOnly | QIODevice::Text | QFile::Truncate); + fileclean.close(); + if (fp == NULL) + fp = fopen(logPath, "a+"); + } + } else if (access(logPath, F_OK) != 0){ //文件不存在 + if (fp == NULL) { + if (_is_root) { //root用户日志文件 + QDir* dir = new QDir(); + if(!dir->exists("/var/log/kylin-background-upgrade/")){ + dir->mkpath("/var/log/kylin-background-upgrade/"); + } + fp = fopen(logPath, "a+"); + if (fp == NULL) + printf("Can't open logfile!\n"); + } else { + fp = fopen(logPath, "a+"); + if (fp == NULL) + printf("Can't open logfile!\n"); + } + } + } else { + // log文件不可写,则需要判断是否被打开过,被打开过就需要关闭 + if (fp != NULL) + fclose(fp); + fp = NULL; + } +} + +int main(int argc, char *argv[]) +{ + QString arg=QString::fromLatin1(argv[1]); +// initUkuiLog4qt("kylin-background-upgrade"); + log_env_init(); + qInstallMessageHandler(msgHandler); + char *x=getenv("DISPLAY"); + + qDebug()<<""; + qDebug()<<"---------------------------------------------------------------------------------------------------"; + qDebug()<<"Start check upgradable ..."; + + QString s1(x); + if(s1 != NULL){ + qDebug()<<"The desktop graphics environment is normal ."; + } else { + qDebug()<<"The desktop graphics environment is abnormal ."; + putenv("DISPLAY=:0"); + } +#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); +#endif +// callPyFunc *lxy = new callPyFunc(); + + setenv("QT_QPA_PLATFORMTHEME","ukui",true); + qunsetenv("SESSION_MANAGER"); + QApplication a(argc, argv); + core *m_core= new core(arg); + QObject::connect(m_core,SIGNAL(execSignal()),&a,SLOT(quit())); + return a.exec(); +} diff --git a/src/traydbus.cpp b/src/traydbus.cpp new file mode 100644 index 0000000..9d44cd5 --- /dev/null +++ b/src/traydbus.cpp @@ -0,0 +1,458 @@ +#include "traydbus.h" +#include +#include +#include + +//托盘d-bus 服务 +traydbusservice::traydbusservice() +{ + +} + +QStringList traydbusservice::getCrucial() +{ + QFile file("/var/lib/kylin-software-properties/template/crucial.list"); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + return crucial; + while (!file.atEnd()) { + QByteArray line = file.readLine(); + QString str = QString(line); + qDebug()<isValid()) { + qDebug() << qPrintable(QDBusConnection::systemBus().lastError().message()); + exit(1); + } + + interface1->setTimeout(123456789); + //调用远程的value方法,源管理器update + qDebug()<<"Start updateSourceTemplate ..."; + QDBusReply reply1 = interface1->call(QDBus::Block, "updateSourceTemplate"); + if (reply1.isValid()) { + if (reply1.value()) { +// QDBusReply reply2 = interface1->call(QDBus::Block, "updateSourcePackages","kylin-background-upgrade"); +// if (reply2.isValid()) { +// qDebug()<<"updateSourcePackages return value:"<start(3000); + if (initSource_Dbus()) { + connectTimer->stop(); + } else { + num ++; + if (num >2) { + qDebug()<<"updateSourceTemplate failed, exit."; + exit(0); + } + qDebug()<<"updateSourceTemplate failed,Retries are in progress for the "<isValid()) { + qDebug() << qPrintable(QDBusConnection::systemBus().lastError().message()); + qDebug() << "Failed to connect /com/kylin/systemupgrade "; + exit(1); + } + interface_utils = new QDBusInterface("com.kylin.systemupgrade", "/com/kylin/systemupgrade/utils", + "com.kylin.systemupgrade.interface", + QDBusConnection::systemBus()); + if (!interface_utils->isValid()) { + qDebug() << qPrintable(QDBusConnection::systemBus().lastError().message()); + qDebug() << "Failed to connect /com/kylin/systemupgrade "; + exit(1); + } + + //监听D-bus信号,获取安装信息与进度 +// connect(interface,SIGNAL(UpdateDloadAndInstStaChanged(QStringList, int, QString, QString)),this,SLOT(getsignal(QStringList, int, QString, QString))); +// QDBusConnection::systemBus().connect(QString("com.kylin.systemupgrade"), QString("/com/kylin/systemupgrade"), +// QString("com.kylin.systemupgrade.interface"), +// QString("UpdateDloadAndInstStaChanged"), this, SLOT(getsignal(QStringList, int32_t, QString, QString))); + +} + +/** + * @brief update_dbus::getsignal + * 获取下载进度 + */ +void update_dbus::getsignal(QStringList pkgs, int progess, QString status, QString current_details) +{ + QString aptStatus = ""; +// QString aptAppName; + int aptPercent = 0; + +// QVariant dateQVariant; +// aptStatus = arg; + +// QVariantMap::Iterator it; +// for (it = key.begin(); it != key.end(); ++it) { +// if (it.key() == "apt_appname") { +// dateQVariant = it.value(); +// aptAppName = dateQVariant.toString(); +// } +// if (it.key() == "apt_percent") { +// dateQVariant = it.value(); +// aptPercent = dateQVariant.toFloat(); +// } +// } + +// if (arg == "apt_start" && aptD_busStatus == true) { +// aptD_busStatus =false; +// } +// if ((arg == "apt_start" || arg == "apt_finish") && (aptPercent == 0 || aptPercent == 100)) { +// emit aptAppNames_Percentsignal(aptAppName,aptPercent,true); +// } else if (arg == "apt_error" ) { +// emit aptAppNames_Percentsignal(aptAppName,aptPercent,false); +// } + if (aptPercent != progess) { + aptPercent = progess; + emit aptAppNames_Percentsignal(pkgs.at(0),aptPercent,status); + } + +} + +/** + * @brief update_dbus::checkForUpdates + * 检测强制推送列表 + */ +QStringList update_dbus::checkForUpdates(QStringList arg) +{ + QDBusReply reply = interface_utils->call("CheckInstalledOrUpgrade",arg); + if (reply.isValid()) + { + qDebug()<<"The upgradeable list:"< res = interface->call("UpdateDetect"); +// QProcess process; +// process.start("/home/lxy/kylin-background-upgrade/OpenKylin/kylin-background-upgrade/checkUpdate.py"); +// process.waitForStarted(); +// process.waitForFinished();//以阻塞的方式等待释放 +// QStringList updatelists; +// updatelists.append("kylin-video"); +// QString errorcode = ""; +// QString errorstring = ""; +// UpdateDectSlot(true,updatelists,errorcode, errorstring); + return true; +} + +/** + * @brief update_dbus::installAndUpgrade + * 静默升级入口 + */ +bool update_dbus::installAndUpgrade(QStringList pkgNames) +{ + installpkgs = pkgNames; + + //调用D-bus接口,安装软件 + connect(interface,SIGNAL(UpdateDetectFinished(bool,QStringList,QString,QString)),this,SLOT(slotUpdateCache(bool,QStringList,QString,QString))); +// QDBusPendingCall call = interface_utils->asyncCall("InstallPackages","kylin-background-upgrade", installpkgs); + QDBusPendingCall call = interface->asyncCall("UpdateCache"); + qDebug() << "UpdateCache (mode: MODE_UPDATE_CACHE) ..."; //MODE_UPDATE_CACHE + return true; +} + +void update_dbus::slotInstallFinish(bool status, QStringList pkgs,QString error,QString details) +{ + emit UpdateInstallFinished(status,pkgs,error,details); +} + +void update_dbus::UpdateDectSlot(bool status, QStringList pkgs,QString error,QString details) +{ + emit UpdateDectFinished(status,pkgs,error,details); +} + +void update_dbus::slotUpdateCache(bool status,QStringList pkgslist,QString errorstring,QString errorcode) +{ + if (status) { + qDebug() << "MODE_UPDATE_CACHE finish ."; + connect(interface,SIGNAL(UpdateInstallFinished(bool,QStringList,QString,QString)),this,SLOT(slotInstallFinish(bool,QStringList,QString,QString))); + interface->asyncCall("InstallPackages", installpkgs); + } else { + qDebug() << "Call UpdateCache (mode: MODE_UPDATE_CACHE) failed, exit!"; + exit(0); + } +} + +/** + * @brief update_dbus::listenState + * 监听状态 + * @return + */ +bool update_dbus::listenState() +{ + QDBusReply r4eply = interface->call("get_important_status"); + return r4eply; +} + + +//连接电源的d-bus································ + +power_dbus::power_dbus(QObject *parent) + :QObject(parent) +{ + +} + +power_dbus::~power_dbus() +{ + +} + +/** + * @brief power_dbus::initDbusaddrest + * 连接电源管理器的dbus,获取dbus路径 + * @return + */ +bool power_dbus::initDbusaddrest() +{ + + QStringList users; + QDBusInterface m_interface1( "org.freedesktop.UPower", + "/org/freedesktop/UPower", + "org.freedesktop.UPower", + QDBusConnection::systemBus() ); + if (!m_interface1.isValid()) { + qDebug() << "< org.freedesktop.UPower > initialization failed!"; + return false; + } + + QDBusReply> obj_reply = m_interface1.call("EnumerateDevices"); + + + if (obj_reply.isValid()) { + for (QDBusObjectPath op : obj_reply.value()) + users << op.path(); + if (users.size()==1 || users.isEmpty()) { + qDebug()<<"Failed to obtain the remaining battery capacity, The built-in power supply cannot be detected ..."; + return false; + } + powerpath=users.at(1); + return true; + } + return true; +} + +/** + * @brief power_dbus::getPower_Dbus + * 连接电源管理器的dbus + * @return + */ +QString power_dbus::getPower_Dbus() +{ + QDBusInterface m_interface( "org.freedesktop.UPower", + powerpath, + "org.freedesktop.DBus.Properties", + QDBusConnection::systemBus()); + + if (!m_interface.isValid()) { + qDebug() << "电源管理器dbus接口初始化失败"; + return "false"; + } + + QDBusReply obj_reply = m_interface.call("Get","org.freedesktop.UPower.Device","Percentage"); + QString Ele_surplus=obj_reply.value().toString(); + return Ele_surplus; +} + +//判断是否为活跃用户的dbus······························· + +UserIdStatus::UserIdStatus(QObject *parent) + :QObject(parent) +{ + initUserIdStatus(); +} + +UserIdStatus::~UserIdStatus() +{ + +} + + +void UserIdStatus::initConnectionInfo() +{ +// qRegisterMetaType("MyClass"); +// QDBusInterface m_interface1("org.freedesktop.login1", +// "/org/freedesktop/login1", +// "org.freedesktop.login1.Manager", +// QDBusConnection::systemBus() ); +// if (!m_interface1.isValid()) { +// qDebug() << "dbus接口初始化失败"; +// return; +// } + +// QDBusMessage res = m_interface1.call("ListUsers"); + +// qDebug() << res.arguments().at(0).value().IDName; +// qDebug()< res = m_interface1.call("Get","org.freedesktop.login1.User","State"); + UIDStatus = res.value().toString(); +} + + + + diff --git a/src/traydbus.h b/src/traydbus.h new file mode 100644 index 0000000..4772831 --- /dev/null +++ b/src/traydbus.h @@ -0,0 +1,160 @@ +#ifndef TRAYDBUSSERVICE_H +#define TRAYDBUSSERVICE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +class traydbusservice : public QObject +{ + Q_OBJECT + //定义Interface名称为com.scorpio.test.value + Q_CLASSINFO("D-Bus Interface", "com.scorpio.test.value") +public: + traydbusservice(); + + QStringList crucial; + QStringList important; + +public slots: + QStringList getCrucial(); + QStringList getImportant(); + + void connectSuccessslots(); + void quitslots(); + +private: + +Q_SIGNALS: // SIGNALS + QString ready(QString ret); + QString connectSuccessSignal(); + QString quitsignal(); + +}; + +//连接源管理器的d-bus································ + +class source_dbus: public QObject +{ + Q_OBJECT + +public: + explicit source_dbus(QObject *parent = nullptr); + ~source_dbus(); + QString serialNumber; + QTimer *connectTimer; + int num=0; + static source_dbus *getInstance(); + QDBusInterface *interface1; //连接源更新管理器的D-bus + + bool initSource_Dbus(); + static source_dbus *sourceMutual; //UpdateDbus类静态对象 + +public slots: + void connectDbus(); + +Q_SIGNALS: + void ready(); +}; + +//连接更新管理器的d-bus································ + +class update_dbus: public QObject +{ + Q_OBJECT + +public: + explicit update_dbus(QObject *parent = nullptr); + ~update_dbus(); + static update_dbus *getInstance(); + QDBusInterface *interface; //连接更新管理器的D-bus + QDBusInterface *interface_utils; //kylin-system-updater utils + void initUpdate_Dbus(); + static update_dbus *updateMutual; //UpdateDbus类静态对象 + QStringList checkForUpdates(QStringList arg); //检测是否有更新 + bool checkForUpdateDect(); //检测系统更新 + bool installAndUpgrade(QStringList pkgNames); //静默升级入口 + QTimer *timer; + + bool aptD_busStatus=true; //发送状态的标志位 + + bool listenState(); + QStringList installpkgs; +Q_SIGNALS: + void ready(); + void aptAppNames_Percentsignal(QString arg,int32_t args,QString state); //发送正在下载安装的包名以及进度 + void dowloadStart(); + void UpdateInstallFinished(bool,QStringList,QString,QString); + void UpdateDectFinished(bool,QStringList,QString,QString); + +protected slots: + void getsignal(QStringList, int, QString, QString); + void slotUpdateCache(bool,QStringList,QString,QString); + void slotInstallFinish(bool,QStringList,QString,QString); + void UpdateDectSlot(bool,QStringList,QString,QString); +}; + +//连接电源的d-bus································ + +class power_dbus: public QObject +{ + Q_OBJECT +public: + power_dbus(QObject *parent = nullptr); + ~power_dbus(); + QDBusInterface *interface; //连接更新管理器的D-bus + bool initDbusaddrest(); + QString getPower_Dbus(); + QString powerpath; + + +Q_SIGNALS: + void ready(); + +protected slots: + +}; + +//判断是否为活跃用户的dbus······························· + + +class MyClass +{ +public: + uint32_t uidnum; + QString IDName; + QDBusObjectPath address; +}; +Q_DECLARE_METATYPE(MyClass) + +class UserIdStatus: public QObject +{ + Q_OBJECT +public: + UserIdStatus(QObject *parent = nullptr); + ~UserIdStatus(); + QString UIDStatus; + void initConnectionInfo(); + void initUserIdStatus(); + +Q_SIGNALS: + void ready(); + +protected slots: + +}; + + +#endif // TRAYDBUSSERVICE_H diff --git a/src/trayicon.cpp b/src/trayicon.cpp new file mode 100644 index 0000000..612e126 --- /dev/null +++ b/src/trayicon.cpp @@ -0,0 +1,35 @@ +#include "trayicon.h" + +trayicon::trayicon(QWidget *parent) : QSystemTrayIcon(parent) +{ + initAction(); +} + +void trayicon::initAction() +{ + this->setToolTip(tr("The system is updating silently")); + this->setIcon(QIcon(":/update.png")); + + m_trayMenu = new QMenu(); + m_topWidget = new QWidget(); + m_topWidget->setFixedSize(30,30); + m_topWidget->installEventFilter(this); + m_topWidgetAction = new QWidgetAction(this); + +} + +/** + * @brief trayicon::eventFilter + * 事件过滤器 + */ +bool trayicon::eventFilter(QObject *obj, QEvent *event) +{ +// if (obj == m_topWidget && event->type() == QEvent::MouseButtonPress) +// { +// QPainter painter(m_topWidget); +// painter.setPen(Qt::NoPen); +// painter.setBrush(QColor(42,120,192)); +// painter.drawRect(m_topWidget->rect()); +// } + return QSystemTrayIcon::eventFilter(obj,event); +} diff --git a/src/trayicon.h b/src/trayicon.h new file mode 100644 index 0000000..6e49374 --- /dev/null +++ b/src/trayicon.h @@ -0,0 +1,33 @@ +#ifndef TRAYICON_H +#define TRAYICON_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class trayicon : public QSystemTrayIcon +{ + Q_OBJECT +public: + explicit trayicon(QWidget *parent = nullptr); + void initAction(); + + QAction *action_show; + QMenu *m_trayMenu; + QWidget *m_topWidget; + QWidgetAction *m_topWidgetAction; + QMenu* trayIconMenu; + QAction* OpenSetUp; +protected: + bool eventFilter(QObject *obj, QEvent *event); + +signals: + +}; + +#endif // TRAYICON_H diff --git a/src/updatehandle.cpp b/src/updatehandle.cpp new file mode 100644 index 0000000..2559021 --- /dev/null +++ b/src/updatehandle.cpp @@ -0,0 +1,667 @@ +#include "updatehandle.h" +#include + +updatehandle::updatehandle(QString getnum1,QWidget *parent) : QWidget(parent) +{ + argnum = getnum1; + + initTranslator(); //加载翻译文件 + getpower(); //获取电量值 + readconf(); //读取配置文件设定值 + initDbus(); //初始化dbus + initUI(argnum); //初始化托盘程序 +} + +updatehandle::~updatehandle() +{ + +} + +/** + * @brief updatehandle::initTranslator + * 加载翻译文件 + */ +void updatehandle::initTranslator() +{ + QTranslator *translator = new QTranslator; + if (translator->load(QLocale(), QLatin1String("kylin-background-upgrade"), QLatin1String("_"), QLatin1String("/usr/share/kylin-background-upgrade"))) { + QApplication::installTranslator(translator); + } else { + qDebug() << "cannot load translator kylin-background-upgrade_" << QLocale::system().name() << ".qm!"; + } + +} + +/** + * @brief updatehandle::getpower + * 获取电量值 + */ +void updatehandle::getpower() +{ + //获取电量信息 + Power_dbus = new power_dbus(this); + powerState = Power_dbus->initDbusaddrest(); + if (powerState) { + powerNum = Power_dbus->getPower_Dbus(); + qDebug()<<"电脑电量值为:"<UIDStatus == "online") { + qDebug()<<"非活跃窗口,禁止启动"; + exit(0); + } + m_updateMutual = update_dbus::getInstance(); //初始化更新管理器d-bus + m_sourceMutual = source_dbus::getInstance(); //初始化源管理器d-bus + +} + + +/** + * @brief updatehandle::initUI + * 初始化界面类 + */ +void updatehandle::initUI(QString argnum) +{ + timerDownload = new QTimer(this); + connect(timerDownload, SIGNAL(timeout()), this, SLOT(downloadTimeout())); + + trayIcon = new trayicon(this); + choice_window = new updatewidget();//更新选择页面 + tip_window = new updateTip(); //静默升级提示 + + if (argnum.contains("--check-upgrade",Qt::CaseInsensitive)) { + //连接关闭功能槽函数 + connect(choice_window,&updatewidget::disAgreeBtnSignals,this,&updatehandle::execslots); + UpdateDectCheck(); + } else { + qDebug()<<"no --check-upgrade, exit."; + exit(0); + } +} + +/** + * @brief updatehandle::tray_Show + * 启动托盘选择页面 + */ +void updatehandle::tray_Show() +{ + if(checktime()){ + if (!m_updateMutual->listenState()) { + if (m_getsql()) { + qDebug()<<"m_getsql 的值为true"; + choice_window->update_lab->setText(tr("System update detected")); + if (argnum != "update") { + choice_window->show(); + } + } else { + qDebug()<<"更新管理器关闭检测更新,托盘程序结束"; + exit(0); + } + } else { + qDebug()<<"更新管理器已运行,程序退出"; + exit(0); + } + } else { + qDebug()<<"配置文件设定时间未到,程序退出"; + exit(0); + } +} + +/** + * @brief updatehandle::checktime + * 进行当前时间与配置文件时间比对 + * @return + * true: 当前时间大于配置文件时间 + * false: 当前时间小于配置文件时间 + */ +bool updatehandle::checktime() +{ + timersetting->beginGroup(QString::fromLocal8Bit("Timer")); + CheckUpgradeTime = timersetting->value("CheckUpgradeTime").toString(); + QDateTime datetime = QDateTime::fromString(CheckUpgradeTime, "yyyy-MM-dd hh:mm:ss"); + //结束组 + timersetting->endGroup(); + QDateTime Nowtime = QDateTime::currentDateTime(); //获取系统现在的时间 + qint64 nSecs = Nowtime.secsTo(datetime); //对比 + qDebug()<<"Get timing time: "<isHidden()){ + QPoint pt=cursor().pos(); + tip_window->move(pt.x(),pt.y()-45); + tip_window->show(); + } else { + tip_window->hide(); + } +} + +/** + * @brief updatehandle::getTemplateList + * 获取源管理器文件中的可选更新与强制更新列表 + */ +void updatehandle::getTemplateList() +{ + qDebug()<<"Parses the optional update list and the mandatory update list ..."; + QMap updatedata; + QString str1; + QString str2; + QStringList m_crucial; + QFile file1("/var/lib/kylin-software-properties/template/crucial.list"); + if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) + return ; + while (!file1.atEnd()) { + QByteArray line = file1.readLine(); + str1 += QString(line); + } + str1.replace(QString("\n"), QString("")); + m_crucial = str1.split(QRegExp("[ ]")); + m_crucial.removeAll(QString("")); + qDebug()<<"The crucial lists: "< data) +{ + qDebug()<<"Monitor the installation progress and status signal ..."; + //ksu获取进度,状态 + connect(m_updateMutual,&update_dbus::UpdateInstallFinished,this,&updatehandle::InstallFinsih); + QStringList crucial; + QMap::iterator it; + for (it = data.begin();it != data.end();it++) { + if (it.key() == "crucial") { + crucial = it.value(); + } else if (it.key() == "important") { + important = it.value(); + } + } + qDebug()<<"Checking silent upgrade list: "<checkForUpdates(crucial); + if (!checkCrucialAll.isEmpty()) { + handleCrucial(checkCrucialAll); + } else { + qDebug() << "Silent upgrade list is empty, exit!"; + exit(0); + } +} + +/** + * @brief updatehandle::handleCrucial + * 处理静默升级包 + * @param checkCrucialAll + * 传入包列表 + */ +void updatehandle::handleCrucial(QStringList checkCrucialAll) +{ + QStringList crucialPackageSize; + QStringList crucialPackage; + + if (checkCrucialAll.count()%2 != 0) { + qDebug()<<"The format of the silent upgrade list is incorrect, exit!"; + exit(0); + } + if (argnum != "update") { + //提取包名与大小信息 + for (int i=0;istart(20*60*1000); + if (powerState) { //判断是否获取到电量 + if (powerNum.toInt()setVisible(true); + qDebug()<<"The system is updating silently ..."; + m_updateMutual->installAndUpgrade(crucialPackage); + } else { + exit(0); + } + } else { + notify_send(tr("The system is updating silently")); + trayIcon->setVisible(true); + qDebug()<<"The system is updating silently ..."; + m_updateMutual->installAndUpgrade(crucialPackage); + } + } else { + notify_send(tr("The system is updating silently")); + trayIcon->setVisible(true); + qDebug()<<"The system is updating silently ..."; +// m_updateMutual->installAndUpgrade(crucialPackage); + } + } +} + +/** + * @brief updatehandle::handleImportant + * 处理可选升级包 + */ +void updatehandle::UpdateDectSlot() +{ +// if (!status) { +//// qDebug() << "Update Detect failed: " << QString("%1 %2").arg(errorstring).arg(errorcode); +// exit(0); +// } else { +// if (list.length() == 0) { +// qDebug() << "The software on this computer is up to date, exit!"; +// exit(0); +// } else { + choice_window->update_lab->setText(tr("System update detected")); + if (argnum != "update") { + choice_window->show(); + } +// } +// } + //完成检测,刷新下次更新标志位 + timersetting->beginGroup(QString::fromLocal8Bit("Timer")); + timersetting->setValue("GeneratRandomTime",true); + timersetting->setValue("CheckCompleted",true); + timersetting->sync(); + timersetting->endGroup(); +} + +/** + * @brief updatehandle::UpdateDectCheck + * 处理可选升级包 + */ +void updatehandle::UpdateDectCheck() +{ + //判断是否有系统更新 + if(!checktime()){ + qDebug()<<"Detection update has been opened ..."; +// connect(m_updateMutual,&update_dbus::UpdateDectFinished,this,&updatehandle::UpdateDectSlot); + QDBusConnection::systemBus().connect(QString(),QString("/"),"com.kylin.update.notification","DownloadFinish",this,SLOT(UpdateDectSlot())); +// bool ret= m_updateMutual->checkForUpdateDect(); + } else { + qDebug()<<"The scheduled time is not reached, exit."; + exit(0); + } +} + +/** + * @brief updatehandle::handleImportant + * 处理可选升级包 + */ +void updatehandle::handleImportant() +{ + //判断是否需要检查系统更新 + + if(checktime()){ + if (!m_updateMutual->listenState()) { + if (m_getsql()) { + qDebug()<<"Detection update has been opened ..."; + connect(m_updateMutual,&update_dbus::UpdateDectFinished,this,&updatehandle::UpdateDectSlot); + bool ret= m_updateMutual->checkForUpdateDect(); + } else { + qDebug()<<"Detection updates have been disabled, exit!"; + exit(0); + } + } else { + qDebug()<<"更新管理器已运行,程序退出"; + exit(0); + } + } else { + qDebug()<<"The scheduled time is not reached, exit."; + exit(0); + } +} + +/** + * @brief updatehandle::packageDownOrNot + * 判断是否超出设定大小 + * @param arg + * 传入包列表 + * @return + * true:符合预定大小 + * false:超出设定大小 + */ +bool updatehandle::packageDownOrNot(QStringList arg) +{ + qDebug()<<"开始检测包大小是否超出设定大小"; + for (int i = 0 ;i setPackageSize) { + qDebug()<<"包大小超出设定大小,程序退出"; + return false; + } + } + qDebug()<<"包大小符合预定大小"; + return true; +} + +/** + * @brief updatehandle::register_dbus + */ +void updatehandle::register_dbus() +{ + //建立到session bus的连接 + QDBusConnection connection = QDBusConnection::sessionBus(); + + //在session bus上注册名为com.scorpio.test的服务 + if (!connection.registerService("com.scorpio.test")) { + qDebug() << "error:" << connection.lastError().message(); + exit(-1); + } + object = new traydbusservice(); + + //注册名为/test/objects的对象,把类Object所有槽函数导出为object的method + connection.registerObject("/test/objectsd", object,QDBusConnection::ExportAllSlots| QDBusConnection :: ExportAllSignals); + + connect(object,&traydbusservice::quitsignal,[=](){ + emit execSignal(); + }); + + connect(object,&traydbusservice::connectSuccessSignal,[=](){ + dbusConnectStatus = true; + emit object->ready("success"); + }); + +} + +/** + * @brief updatehandle::d_busStatus + * 判断下载状态的槽函数 + * @param arg : Appname + * @param args : aptpercent + * @param state : state + */ +void updatehandle::d_busStatus(QString arg,int32_t args,QString state) +{ + if (!checkCrucial.isEmpty() && messstate2) { + messstate2=false; + trayIcon->setVisible(true); + } + +// qDebug()<<"下载进度:"; +// qDebug()<<"Appname:"<stop(); + if(state){ + qDebug() << "Silent upgrade is complete, exit."; +// qDebug() << (tr("The system has completed an important update, It is recommended that you restart immediately.")); + notify_send(tr("The system has completed an important update, It is recommended that you restart immediately.")); + }else{ + QString errorstate = tr("update error"); + QString errorName; + errorName = QString("%1 %2").arg(error).arg(errorstate); + qDebug() << "Silent update failed: "<setVisible(false); + tip_window->hide(); + exit(0); +} + +/** + * @brief updatehandle::execslots + * 关闭界面槽函数 + */ +void updatehandle::execslots() +{ + emit execSignal(); +} + +/** + * @brief updatehandle::notify_send + * 发送消息通知函数 + * @param arg + * 发送的正文 + */ +void updatehandle::notify_send(QString arg) +{ + QDBusInterface iface("org.freedesktop.Notifications", + "/org/freedesktop/Notifications", + "org.freedesktop.Notifications", + QDBusConnection::sessionBus()); + QList args; + args< time2Slot.at(0)) { + return 1; + } else if (time1Slot.at(0) == time2Slot.at(0)) { + if (time1Slot.at(1) > time2Slot.at(1)) { + return 1; + } else if (time1Slot.at(1) == time2Slot.at(1)) { + return 0; + } else if (time1Slot.at(1) < time2Slot.at(1)) { + return -1; + } + } else if (time1Slot.at(0) < time2Slot.at(0)) { + return -1; + } +} + +/** + * @brief updatehandle::readconf + * 读取配置文件 + */ +void updatehandle::readconf() +{ + QMap Timer; + Timer.insert("CheckCompleted", bool(false)); + Timer.insert("CheckUpgradeTime", " "); + Timer.insert("CheckUpgradeTimeSlot", "14:30:00-16:30:00"); + Timer.insert("GeneratRandomTime", bool(true)); + Timer.insert("RandomizedExecute", bool(true)); + QMap Settings; + Settings.insert("powersize", int(1)); + Settings.insert("setpackagesize", "999999999"); +// qDebug()<<"Settings "< ir_timer(Timer); + QMapIterator ir_settings(Settings); + QSettings *code_conf = new QSettings(confPath,QSettings::IniFormat); + code_conf->beginGroup(QString::fromLocal8Bit("Timer")); + while(ir_timer.hasNext()){ + ir_timer.next(); + code_conf->setValue(ir_timer.key(), ir_timer.value()); + } + code_conf->sync(); + code_conf->endGroup(); + code_conf->beginGroup(QString::fromLocal8Bit("Settings")); + while(ir_settings.hasNext()){ + ir_settings.next(); + code_conf->setValue(ir_settings.key(), ir_settings.value()); + } + code_conf->sync(); + code_conf->endGroup(); + } + + timersetting = new QSettings(confPath,QSettings::IniFormat); + timersetting->beginGroup(QString::fromLocal8Bit("Timer")); + CheckUpgradeTime = timersetting->value("CheckUpgradeTime").toString(); + CheckUpgradeTimeSlot = timersetting->value("CheckUpgradeTimeSlot").toString(); + RandomizedExecute = timersetting->value("RandomizedExecute").toBool(); + GeneratRandomTime = timersetting->value("GeneratRandomTime").toBool(); + CheckCompleted = timersetting->value("CheckCompleted").toBool(); + qDebug()<<"[ CheckUpgradeTime: "<endGroup(); + + timersetting->beginGroup(QString::fromLocal8Bit("Settings")); + powerSize = timersetting->value("powersize").toInt(); + setPackageSize = timersetting->value("setpackagesize").toFloat(); + timersetting->endGroup(); + + QStringList timeSlot = CheckUpgradeTimeSlot.split("-"); + qDebug()<<"timeSlot "<beginGroup(QString::fromLocal8Bit("Timer")); + QString timing = current_date+' '+timeSlot.at(0); + QString start_timing = timeSlot.at(0); + QString end_timing = timeSlot.at(1); + QStringList start_timingSlot,end_timingSlot; + QString time0,time1,time2,time3; + if (start_timing.contains(":")){ + start_timingSlot = start_timing.split(":"); + time0 = start_timingSlot.at(0); + time1 = start_timingSlot.at(1); + } + if (end_timing.contains(":")){ + end_timingSlot = end_timing.split(":"); + time2 = end_timingSlot.at(0); + time3 = end_timingSlot.at(1); + } + int strayParameter = (time2.toInt()*60+time3.toInt())-(time0.toInt()*60+time1.toInt()); + a = 0; + if (strayParameter<0){ + qDebug() << "Time format error."; + }else if (strayParameter==0) { + qDebug() << "strayParameter: "<< strayParameter << ", a "<setValue("CheckCompleted",false); + } + QString timing_time = bojb.toString("yyyy-MM-dd hh:mm:ss").toLatin1().data(); + + timersetting->setValue("CheckUpgradeTime",timing_time); + timersetting->setValue("GeneratRandomTime",false); + qDebug()<< "CheckUpgradeTime "<sync(); + timersetting->endGroup(); + } +} + diff --git a/src/updatehandle.h b/src/updatehandle.h new file mode 100644 index 0000000..49ebe77 --- /dev/null +++ b/src/updatehandle.h @@ -0,0 +1,103 @@ +#ifndef TRAY_H +#define TRAY_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "traydbus.h" +#include "trayicon.h" +#include "updatewidget.h" + + +class updatehandle : public QWidget +{ + Q_OBJECT +public: + updatehandle(QString getnum1,QWidget *parent = nullptr); + ~updatehandle(); + trayicon *trayIcon; //托盘实例化 + QStringList important; //保存重要更新包名 + QString argnum; //得到命令行输入参数 + traydbusservice *object; //托盘dbus服务 + bool powerState; //保存电量是否可获取 + QString powerNum = "0"; //保存电量值 + QString confPath = ""; //保存配置文件位置 + + bool dbusConnectStatus=false; //d-bus连接状态 + bool messstate1=true; + bool messstate2=true; + int powerSize; //电源设定值 + float setPackageSize; //包大小设定值 + QString CheckUpgradeTime; //检查更新时间 + QString CheckUpgradeTimeSlot; //检查更新时间段 + bool CheckCompleted; //是否检查完成 + bool RandomizedExecute; //是否随机执行 + bool GeneratRandomTime; //是否刷新随机时间 + bool errorStatus=false; //是否完整下载安装的状态值 + + updatewidget *choice_window; //托盘选择框 + updateTip *tip_window; //托盘提示框框 + QStringList checkCrucial; //保存静默升级包以及大小信息 + + source_dbus *m_sourceMutual; //源管理器dbus + update_dbus *m_updateMutual; //更新管理器dbus + power_dbus *Power_dbus; + QTimer *timerDownload; //托盘下载时间错误延时处理 + QTimer *timerLock; //文件锁定时检测 + QSettings *mqsetting; //读取配置文件 + QSettings *timersetting; //读取timer配置文件 + + + void initUI(QString); //初始化界面 + void initDbus(); //初始化dbus + void initTranslator(); //初始化翻译加载 + void getTemplateList(); //获取源管理器文件中的可选更新与强制更新 + void processData(QMap data); //处理获取的更新数据 + void handleCrucial(QStringList checkCrucialAll); //处理静默升级包 + void handleImportant(); //处理可选升级包 + void register_dbus(); //注册D-bus服务 + bool checktime(); //检查设定更新时间 + + //数据库相关 + QSqlDatabase db; + QSqlQueryModel model; + + bool m_getsql(); //获取更新管理器数据库信息 + void notify_send(QString arg); //向notification发送信息显示 + + bool packageDownOrNot(QStringList arg); + void readconf(); //读取配置文件 + int _secsTo(QString,QString); //时间差 + void getpower(); //获取电量值 + void UpdateDectCheck(); //调用后端UpdateDetect +signals: + void execSignal(); //关闭窗口信号 + +protected slots: + void onActivated(trayicon::ActivationReason reason); //更新选择页面 + void tray_Show(); //启动托盘显示 + void execslots(); //关闭窗口槽函数 + void d_busStatus(QString,int32_t,QString); //判断下载状态的槽函数 + void InstallFinsih(bool,QStringList,QString,QString); //状态槽函数 + void downloadTimeout(); //延时检测下载状态 + void UpdateDectSlot(); //updatedetect回调函数 +}; + +#endif // TRAY_H diff --git a/src/updatewidget.cpp b/src/updatewidget.cpp new file mode 100644 index 0000000..5babafa --- /dev/null +++ b/src/updatewidget.cpp @@ -0,0 +1,502 @@ +#include "updatewidget.h" +#include "ui_updatewidget.h" +#include +#define PANEL_DBUS_SERVICE "com.ukui.panel.desktop" +#define PANEL_DBUS_PATH "/" +#define PANEL_DBUS_INTERFACE "com.ukui.panel.desktop" +#define UKUI_PANEL_SETTING "org.ukui.panel.settings" + +#define DBUS_NAME "org.ukui.SettingsDaemon" +#define DBUS_PATH "/org/ukui/SettingsDaemon/wayland" +#define DBUS_INTERFACE "org.ukui.SettingsDaemon.wayland" + +updatewidget::updatewidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::Form) +{ + ui->setupUi(this); + //设置出现在屏幕的位置以及大小 + listenPanelChange(); + QString xdg_session_type = qgetenv("XDG_SESSION_TYPE"); + if (xdg_session_type != "wayland"){ + initPanelDbusGsetting(); + GetsAvailableAreaScreen(); + qDebug()<<"not wayland"; + } else { + //注释掉的是原先的接口,已经废除。采用原本的获取方式 +// initset_window_position(); +// set_window_position(); + initPanelDbusGsetting(); + GetsAvailableAreaScreen(); + qDebug()<<"wayland"; + } + + //设置任务栏无显示 + setWindowFlags(Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint); + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + + update_lab = new QLabel(); + tip_lab = new QLabel(); + tip_lab->setText(tr("at")); + tip_lab1 = new QLabel(); + tip_lab1->setText(tr("No reminders")); + agreebtn = new QPushButton(); + disagreebtn = new QPushButton(); + + m_pfirstlayout = new QVBoxLayout(); + m_labellayout = new QHBoxLayout(); + m_psecondlayout = new QHBoxLayout(); + m_pselectlayout = new QHBoxLayout(); + + comboBox = new QComboBox(); + comboBox->clear(); + strList<addItems(strList); + + labelwidget = new QWidget(); + statwidget = new QWidget(); + selectWidget = new QWidget(); + + agreebtn->setText(tr("Update")); + disagreebtn->setText(tr("Delay")); + + connect(agreebtn,&QPushButton::clicked,this,&updatewidget::agreeBtnClicked); + connect(disagreebtn,&QPushButton::clicked,this,&updatewidget::disAgreeBtnClicked); + + + m_labellayout->addWidget(update_lab); + labelwidget->setLayout(m_labellayout); + + m_pselectlayout->addWidget(tip_lab); + m_pselectlayout->addWidget(comboBox); + m_pselectlayout->addWidget(tip_lab1); + m_pselectlayout->addStretch(); + selectWidget->setLayout(m_pselectlayout); + + + m_psecondlayout->addWidget(disagreebtn); + m_psecondlayout->addWidget(agreebtn); + statwidget->setLayout(m_psecondlayout); + + m_pfirstlayout->addWidget(labelwidget); + m_pfirstlayout->addWidget(selectWidget); + m_pfirstlayout->addWidget(statwidget); + this->setLayout(m_pfirstlayout); + this->setAttribute(Qt::WA_TranslucentBackground); + this->setFixedSize(330,180); + +} + +updatewidget::~updatewidget() +{ + delete ui; +} + +/** + * @brief updatewidget::initPanelDbusGsetting + * 初始化与任务栏gsetting和dbus + */ +void updatewidget::initPanelDbusGsetting() +{ + /* 链接任务栏Dbus接口,获取任务栏高度和位置 */ + m_pServiceInterface = new QDBusInterface(PANEL_DBUS_SERVICE, PANEL_DBUS_PATH, PANEL_DBUS_INTERFACE, QDBusConnection::sessionBus()); + m_pServiceInterface->setTimeout(2147483647); + connect(m_pPanelSetting, &QGSettings::changed,[=](QString key){ + if ("panelposition" == key | "panelsize" == key) { + GetsAvailableAreaScreen(); + } + }); +} + +void updatewidget::listenPanelChange() +{ + /* 链接任务栏dgsetting接口 */ + if(QGSettings::isSchemaInstalled(UKUI_PANEL_SETTING)) + m_pPanelSetting = new QGSettings(UKUI_PANEL_SETTING); +} + +/** + * @brief updatewidget::connectTaskBarDbus + * 链接任务栏dbus获取高度的接口 + * @return + */ +int updatewidget::connectTaskBarDbus() +{ + int panelHeight = 46; + if (m_pPanelSetting != nullptr) { + QStringList keys = m_pPanelSetting->keys(); + if (keys.contains("panelsize")) { + panelHeight = m_pPanelSetting->get("panelsize").toInt(); + } + } else { + QDBusMessage msg = m_pServiceInterface->call("GetPanelSize", QVariant("Hight")); + panelHeight = msg.arguments().at(0).toInt(); + return panelHeight; + } + return panelHeight; +} + +/** + * @brief updatewidget::getPanelSite + * 获取任务栏状态位置下上左右 + * @return + * 返回任务栏位置 + */ +int updatewidget::getPanelSite() +{ + int panelPosition = 0; + if (m_pPanelSetting != nullptr) { + QStringList keys = m_pPanelSetting->keys(); + if (keys.contains("panelposition")) { + panelPosition = m_pPanelSetting->get("panelposition").toInt(); + } + } else { + QDBusMessage msg = m_pServiceInterface->call("GetPanelPosition", QVariant("Site")); + panelPosition = msg.arguments().at(0).toInt(); + } + qDebug() << "Current Position of ukui panel: " << panelPosition; + return panelPosition; +} + +/** + * @brief updatewidget::GetsAvailableAreaScreen + * 获取屏幕的可用区域高度和宽度并设置位置 + */ +void updatewidget::GetsAvailableAreaScreen() +{ + //如果取不到任务栏的高度,还是优先获取桌面分辨率,可用区域 + if ((0 == connectTaskBarDbus()) && (0 == getPanelSite())) { + QScreen* pScreen = QGuiApplication::primaryScreen(); + QRect DeskSize = pScreen->availableGeometry(); + m_nScreenWidth = DeskSize.width(); //桌面分辨率的宽 + m_nScreenHeight = DeskSize.height(); //桌面分辨率的高 + } else { + //如果取到任务栏的高度,则取屏幕分辨率的高度 + int h = connectTaskBarDbus(); + QRect screenRect = QGuiApplication::primaryScreen()->geometry(); + m_nScreenWidth = screenRect.width(); + m_nScreenHeight = screenRect.height(); + m_pPeonySite = getPanelSite(); + switch (m_pPeonySite) + { + case updatewidget::PanelDown : + { + this->setGeometry(m_nScreenWidth - 340,m_nScreenHeight - h - 190,300,150-100); + qDebug()<<"Taskbar coordinates: [ '"<setGeometry(m_nScreenWidth - 340,m_nScreenHeight - 190,300,150-100); + qDebug()<<"任务栏在上方: 显示坐标为: "<setGeometry(m_nScreenWidth - 340,m_nScreenHeight - 190,300,150-100); + qDebug()<<"任务栏在左侧: 显示坐标为: "<setGeometry(m_nScreenWidth - 340 - h,m_nScreenHeight - 190,300,150-100); + qDebug()<<"任务栏在右侧: 显示坐标为: "< reply = interface.call("GetPanelPosition", str); + return reply; +} + +int updatewidget::getTaskbarHeight(QString str) +{ + QDBusInterface interface( "com.ukui.panel.desktop", + "/", + "com.ukui.panel.desktop", + QDBusConnection::sessionBus() ); + + QDBusReply reply = interface.call("GetPanelSize", str); + return reply; +} + + +int updatewidget::getScreenGeometry(QString methodName) +{ + int res = 0; + QDBusMessage message = QDBusMessage::createMethodCall(DBUS_NAME, + DBUS_PATH, + DBUS_INTERFACE, + methodName); + QDBusMessage response = QDBusConnection::sessionBus().call(message); + if (response.type() == QDBusMessage::ReplyMessage) { + if(response.arguments().isEmpty() == false) { + int value = response.arguments().takeFirst().toInt(); + res = value; + } + } else { + qDebug()<geometry(); + int priX = getScreenGeometry("x"); + int priY = getScreenGeometry("y"); + int priWid = getScreenGeometry("width"); + int priHei = getScreenGeometry("height"); + QRect screenGeometry = qApp->primaryScreen()->geometry(); + + availableWidth = priX + priWid; + availableHeight = priY + priHei; + totalHeight = screenGeometry.height(); + totalWidth = screenGeometry.width(); + + int distance = 4; + int n = 0; + int m = 46; + + n = getTaskbarPos("position"); + m = getTaskbarHeight("height"); + if(n == 0){ + //任务栏在下侧 + this->setGeometry(priWid-330-distance,availableHeight-180-m-distance,this->width(),this->height()); + qDebug()<<"任务栏在下侧"<width()<<" "<height(); + }else if(n == 1){ + //任务栏在上侧 + this->setGeometry(priWid-330-distance,availableHeight-180-distance,this->width(),this->height()); + qDebug()<<"任务栏在上侧"<width()<<" "<height(); + } else if (n == 2){ + //任务栏在左侧 + this->setGeometry(priWid-330-distance,availableHeight-180-distance,this->width(),this->height()); + qDebug()<<"任务栏在左侧"<width()<<" "<height(); + } else if (n == 3){ + //任务栏在右侧 + this->setGeometry(availableWidth-330-m-distance,availableHeight-180-distance,this->width(),this->height()); + qDebug()<<"任务栏在右侧"<width()<<" "<height(); + } +} + +/** + * @brief updatewidget::insideTime + * 获取时间 + * @return + */ +char *updatewidget::insideTime() +{ + qDebug()<currentText(); + QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 + QString str = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式 + QByteArray str2char2 = str.toLatin1(); // must + char *nowtime = str2char2.data(); + + if(comboBox->currentText() == strList.at(0)) { + QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 + QString str = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式 + QDateTime bojb = QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss").addSecs(1800); + QString str1 = bojb.toString("yyyy-MM-dd hh:mm:ss"); + QByteArray str2char2 = str1.toLatin1(); // must + nowtime = str2char2.data(); + return nowtime; + } else if (comboBox->currentText() == strList.at(1)) { + QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 + QString str = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式 + QDateTime bojb = QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss").addSecs(3600); + QString str1 = bojb.toString("yyyy-MM-dd hh:mm:ss"); + QByteArray str2char2 = str1.toLatin1(); // must + nowtime = str2char2.data(); + return nowtime; + } else if (comboBox->currentText() == strList.at(2)) { + QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 + QString str = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式 + QDateTime bojb = QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss").addSecs(18000); + QString str1 = bojb.toString("yyyy-MM-dd hh:mm:ss"); + QByteArray str2char2 = str1.toLatin1(); // must + nowtime = str2char2.data(); + return nowtime; + } else if (comboBox->currentText() == strList.at(3)) { + QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 + QString str = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式 + QDateTime bojb = QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss").addDays(1); + QString str1 = bojb.toString("yyyy-MM-dd hh:mm:ss"); + QByteArray str2char2 = str1.toLatin1(); // must + nowtime = str2char2.data(); + return nowtime; + } else if (comboBox->currentText() == strList.at(4)) { + QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 + QString str = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式 + QDateTime bojb = QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss").addDays(3); + QString str1 = bojb.toString("yyyy-MM-dd hh:mm:ss"); + QByteArray str2char2 = str1.toLatin1(); // must + nowtime = str2char2.data(); + return nowtime; + } else if (comboBox->currentText() == strList.at(5)) { + QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 + QString str = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式 + QDateTime bojb = QDateTime::fromString(str,"yyyy-MM-dd hh:mm:ss").addDays(5); + QString str1 = bojb.toString("yyyy-MM-dd hh:mm:ss"); + QByteArray str2char2 = str1.toLatin1(); // must + nowtime = str2char2.data(); + return nowtime; + } + return nowtime; + +} + +/** + * @brief updatewidget::agreeBtnClicked + * 同意更新按钮槽函数 + */ +void updatewidget::agreeBtnClicked() +{ + emit agreeBtnSignals(); + qDebug()<<"WifiButtonClickSlot is running"; + QProcess p(0); + p.startDetached("ukui-control-center -m upgrade"); + p.waitForStarted(); + qDebug()<<"Open the control panel and start updating immediately, exit tray program!"; + exit(0); +} + +/** + * @brief updatewidget::disAgreeBtnClicked + * 延迟提醒按钮槽函数 + */ +void updatewidget::disAgreeBtnClicked() +{ + //判断是否有kylin-background-upgrade目录,没有则创建 + QString toDir = QDir::homePath(); + toDir += "/.config/kylin-background-upgrade/"; + QDir dir(toDir); + if(! dir.exists()) { + dir.mkdir(toDir);//只创建一级子目录,即必须保证上级目录存在 + } + + toDir += "kylin-background-upgrade-conf.ini"; + QFileInfo fileInfo(toDir); + if (!fileInfo.exists()) { + qDebug()<<"The periodic configuration file fails to be opened, exit!"; + exit(0); + } else { + char *nowtime=insideTime(); + qDebug() << "nowtime "<beginGroup(QString::fromLocal8Bit("Timer")); + timersettings->setValue("CheckUpgradeTime",nowtime); + timersettings->sync(); + timersettings->endGroup(); + } + emit disAgreeBtnSignals(); + qDebug()<<"Users do not update, exit tray program!"; + exit(0); +} + +/** + * @brief updatewidget::paintEvent + * 样式绘画画家 + * @param e + */ +void updatewidget::paintEvent(QPaintEvent *e) +{ + QStyleOption opt; + opt.init(this); + QPainter p(this); + /* 获取当前剪贴板中字体的颜色,作为背景色; + * 白字体 --> 黑背景 + * 黑字体 --> 白字体 + */ + p.setBrush(opt.palette.color(QPalette::Base)); + p.setOpacity(1); + p.setPen(QPen(QColor(220,220,220))); + QPainterPath path; + opt.rect.adjust(0,0,0,0); + path.addRoundedRect(opt.rect,12,12); + p.setRenderHint(QPainter::Antialiasing); //反锯齿 + p.drawRoundedRect(opt.rect,12,12); + setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); + QWidget::paintEvent(e); +} + +/** + * @brief updateTip::updateTip + * 提示框 + * @param parent + */ +updateTip::updateTip(QWidget *parent) : + QWidget(parent) +{ + //设置任务栏无显示 + setWindowFlags(Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint); + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint | Qt::Popup); + + m_layout = new QVBoxLayout(); + tipLabel = new QLabel(); + tipLabel->setText(tr("The system is updating silently")); + m_layout->addWidget(tipLabel); + this->setLayout(m_layout); + this->setAttribute(Qt::WA_TranslucentBackground); +} + +updateTip::~updateTip() +{ + +} + +/** + * @brief updateTip::paintEvent + * 样式绘画画家 + * @param e + */ +void updateTip::paintEvent(QPaintEvent *e) +{ + QStyleOption opt; + opt.init(this); + QPainter p(this); + /* 获取当前剪贴板中字体的颜色,作为背景色; + * 白字体 --> 黑背景 + * 黑字体 --> 白字体 + */ + p.setBrush(opt.palette.color(QPalette::Base)); + p.setOpacity(1); + p.setPen(QPen(QColor(220,220,220))); + QPainterPath path; + opt.rect.adjust(0,0,0,0); + path.addRoundedRect(opt.rect,4,4); + p.setRenderHint(QPainter::Antialiasing); //反锯齿 + p.drawRoundedRect(opt.rect,4,4); + setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); + QWidget::paintEvent(e); +} + + diff --git a/src/updatewidget.h b/src/updatewidget.h new file mode 100644 index 0000000..c27b470 --- /dev/null +++ b/src/updatewidget.h @@ -0,0 +1,119 @@ +#ifndef TRAYWIDGET_H +#define TRAYWIDGET_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Ui { +class Form; +} + +class updatewidget : public QWidget +{ + Q_OBJECT + +public: + explicit updatewidget(QWidget *parent = nullptr); + ~updatewidget(); + + enum PanelStatePosition + { + PanelDown = 0, + PanelUp, + PanelLeft, + PanelRight + }; + + QLabel *update_lab; + QLabel *tip_lab; + QLabel *tip_lab1; + + QPushButton *agreebtn; + QPushButton *disagreebtn; + QWidget *labelwidget; + QWidget *statwidget; + QWidget *selectWidget; + QStringList strList; + + QVBoxLayout *m_pfirstlayout = nullptr; + QHBoxLayout *m_labellayout = nullptr; + QHBoxLayout *m_psecondlayout = nullptr; + QHBoxLayout *m_pselectlayout = nullptr; + + QDBusInterface* m_pServiceInterface; // 获取任务栏的高度 + QGSettings *m_pPanelSetting = nullptr; + QComboBox *comboBox; + + int m_nScreenWidth; // 屏幕分辨率的宽 + int m_nScreenHeight; // 屏幕分辨率的高 + int m_pPeonySite; // 任务栏位置 + QSettings *timersettings; //读取timer配置文件 + + int connectTaskBarDbus(); + int getPanelSite(); + void GetsAvailableAreaScreen(); + char *insideTime(); + int getTaskbarPos(QString str); + int getTaskbarHeight(QString str); + int getScreenGeometry(QString methodName); + void set_window_position(); + void initset_window_position(); + void listenPanelChange(); + void initPanelDbusGsetting(); // 初始化与任务栏gsetting和dbus + +private: + Ui::Form *ui; + void paintEvent(QPaintEvent *e); + +signals: + void agreeBtnSignals(); + void disAgreeBtnSignals(); + +protected slots: + void agreeBtnClicked(); + void disAgreeBtnClicked(); + +}; + + + + + +class updateTip : public QWidget +{ + Q_OBJECT +public: + explicit updateTip(QWidget *parent = nullptr); + ~updateTip(); + QLabel *tipLabel; + QVBoxLayout *m_layout = nullptr; + + +private: + void paintEvent(QPaintEvent *e); + + +signals: + +protected slots: +}; + +#endif // TRAYWIDGET_H diff --git a/src/updatewidget.ui b/src/updatewidget.ui new file mode 100644 index 0000000..d527737 --- /dev/null +++ b/src/updatewidget.ui @@ -0,0 +1,21 @@ + + + + + Form + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + diff --git a/translations/UapLBi.json b/translations/UapLBi.json new file mode 100644 index 0000000..c82f587 --- /dev/null +++ b/translations/UapLBi.json @@ -0,0 +1 @@ +[{"excluded":[],"includePaths":["/usr/include/x86_64-linux-gnu/qt5/QGSettings","/usr/include/KF5/KWindowSystem","/usr/include/x86_64-linux-gnu/qt5","/usr/include/x86_64-linux-gnu/qt5/QtWidgets","/usr/include/x86_64-linux-gnu/qt5/QtGui","/usr/include/x86_64-linux-gnu/qt5/QtDBus","/usr/include/x86_64-linux-gnu/qt5/QtNetwork","/usr/include/x86_64-linux-gnu/qt5/QtSql","/usr/include/x86_64-linux-gnu/qt5/QtCore","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade"],"projectFile":"/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/kylin-background-upgrade.pro","sources":["/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/core.cpp","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/core.h","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/main.cpp","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/traydbus.cpp","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/traydbus.h","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/trayicon.cpp","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/trayicon.h","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/updatehandle.cpp","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/updatehandle.h","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/updatewidget.cpp","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/updatewidget.h","/home/li/ukui/kylin-background-upgrade/kylin-background-upgrade/updatewidget.ui"]}] diff --git a/translations/kylin-background-upgrade_bo_CN.qm b/translations/kylin-background-upgrade_bo_CN.qm new file mode 100644 index 0000000000000000000000000000000000000000..ced5ae65599d9983068fb2f55cf94d8ea9c26eeb GIT binary patch literal 2535 zcmd5-&ubJ(6s}3kBq13q1P#GoTgrM_R#}yZ2M=b5fhY*sOhO2YYo)tprg5fwsIE~) z0v;4ZghgCMQBgcB$if~>5cVR12M>Zb4_;)w=+%S&fZwa`OgBjcNvYMaI}I#_|^#>%Ps7J-dwSyX^0M&tQ+|md)F<^{puj>Kb`MxFT#G@kbigq{;#{9Kl}^0zvmynnt~PG z_MG3)x9cMCI`8#8eh>fd|N8F?ykac3y|Cj-FYIDrSMuyihb7t~8!s5usO8zNxjk@lKD?vgJ8}pZgxz^jeOp(jXqC&_?>^f0g)KFTmABKNJ_8MzGB9w?{K;xM+lyM>}ci;nS^}=kJ+E zb5?ZF^xZwpMny|kWo{Hq-l&~(T1&JAXo9HvQRmI4rX?S3qimQT;kf*Pn6@D4Wio5W zH{lrPEtJ-Q&ITOfG`G49^~ipk5{RxbRg?BB5`&%f+=?=Gb#DRxtJae?N*Vc)Jqnxn z7bbjh;1^N%{H9T1ibD!#5W8j3ZXm*=Nl5(rPXricxVuWP;l8OYXr`Rg^hr!tB^7xW z*e}_-P*tX|&u9;h$NRU0bHb!Unr!+Tv9O~h>hS9+hmB?Lj1sPFi5du`^krPCauPqN+2ZST+{Ogz;Gp SgDDPCV + + + + updatewidget + + at + རླུང་གནོན་ཆེན་པོ། + + + Delay + ཕྱིར་འགྱངས། + + + five hours later + རྗེས་སུ་དུས་ཚོད%d + + + one hours later + ཆུ་ཚོད་གཅིག + + + three day later + ཉིན་གསུམ། + + + In 30 minutes + སྐར་མ་སུམ་ཅུ། + + + Update + གསར་སྒྱུར། + + + No reminders + དྲན་སྐུལ། + + + five day later + ཉིན་ལྔ། + + + one day later + ཉིན་གཅིག + + + + updatehandle + + update error + རིམ་འཕར་འགྲུབ་མེད། + + + kylin-background-upgrade + རྒྱབ་སྟེགས་རིམ་འགྱུར་བྱ་རིམ། + + + The system is updating silently + རྒྱུད་ཁོངས་ཁ་རོག་གེར་རིམ་འགྱུར་བྱེད་སྒང་། + + + update + ཁུངས་གསར་བསྒྱུར། + + + The system has completed an important update. It is recommended that you restart immediately + རྒྱུད་ཁོངས་ཀྱིས་གནད་འགག་གི་རིམ་འགྱུར་ཞིག་ལེགས་འགྲུབ་བྱུང་བས། བསམ་ཚུལ་ཡིན་ན་ཁྱེད་ཀྱིས་མྱུར་དུ་འཁོར་སྒོ་སླར་ཕྱེ་བྱོས། + + + System update detected + རྒྱུད་ཁོངས་རིམ་འགྱུར་ཞིག་ཞིབ་དཔྱད་ཚད་ལེན་བྱས་པ། + + + The system has completed a critical update, and some software packages failed to update. It is recommended that you restart immediately + རྒྱུད་ཁོངས་ཀྱིས་གནད་འགག་གི་རིམ་འགྱུར་ཞིག་ལེགས་འགྲུབ་བྱུང་བས། མཉེན་ཆས་ཁག་གཅིག་རིམ་འགྱུར་ལེགས་འགྲུབ་མ་བྱུང་་། བསམ་འཆར་ཡིན་ན་ཁྱེད་ཀྱིས་མྱུར་དུ་འཁོར་སྒོ་སླར་ཕྱེ་བྱོས། + + + + trayicon + + The system is updating silently + རྒྱུད་ཁོངས་ཁ་རོག་གེར་རིམ་འགྱུར་བྱེད་སྒང་། + + + + updateTip + + The system is updating silently + རྒྱུད་ཁོངས་ཁ་རོག་གེར་རིམ་འགྱུར་བྱེད་སྒང་། + + + diff --git a/translations/kylin-background-upgrade_zh_CN.qm b/translations/kylin-background-upgrade_zh_CN.qm new file mode 100644 index 0000000000000000000000000000000000000000..99232f2a03815338f03a5b4fa911733d4b2e17af GIT binary patch literal 1306 zcmbtSO=uHA6rOC-?ZzfeD5wP$M^K2x)>hF|FBP#=Wg$(Z1T}QJGs!O5>@K?#Wvf*1 z=O9}8LyA^K@lXsNM3jOTsr2AMDM;x-5NR)Z)q{A@gU)8dvemQ{dKez>&G+-(o9TXq zTi<E7YPrK$>JP~+#Wh(%IMGmyt3O9gxgAF*8E=}~HQoY1C=~p1?*)t9A--~rp=TQ2R%Y0J3qQM*V)>`WYR+vJ61`a_ zx6(BG)#2wN_v1?}pN<|`ImGfsg^3tJR*7H!J+fSo1`>BN4?pI9kmmv`0-l}SX_-LF zwkRn=#eyXRBdTb5XelbusA@Mdj6h9fE0V4SHm?<~I*_ztxMK2~;;H`5eAsDlRb$&y zZc{EEVnT^T33mF4xHTDRSS3}Ny$=2C?V-2`?%GLfs>6}`6UqL%^=z;*{61w(ETj*5 zGoSa(EF%j_deKmsK88qxO3~0wiZtr(f*gQ-)Y*(l7_3M%%wSYT6xw=;6)lQPcF%6G zf+$h#j`|&L?gjpzIFfEoeRrlDZpw~%leHFXRngjqkW|QLUtbIMvh7 zmmhiPXrBfTcfz8gl_;@%`aaf{B3SwDoI~OBAJzBgd!wGCK-f2?8-YXeSUpHqy=CRx|(FVj|OAOHXW literal 0 HcmV?d00001 diff --git a/translations/kylin-background-upgrade_zh_CN.ts b/translations/kylin-background-upgrade_zh_CN.ts new file mode 100644 index 0000000..2e07623 --- /dev/null +++ b/translations/kylin-background-upgrade_zh_CN.ts @@ -0,0 +1,161 @@ + + + + + Form + + + Form + + + + + QObject + + The system is updating silently + 系统正在静默更新 + + + + trayicon + + + The system is updating silently + 系统正在静默更新 + + + + updateTip + + + The system is updating silently + 系统正在静默更新 + + + + updatehandle + + The system has completed an important update. It is recommended that you restart immediately. + 系统已经完成一项关键更新,建议您立即重启 + + + + + + The system is updating silently + 系统正在静默更新 + + + System update detected + 检测到有系统更新 + + + + + System update detected + 检测到有系统更新 + + + The system has completed a critical update, and some software packages failed to update. It is recommended that you restart immediately + 系统完成一项关键更新,部分软件包更新失败,建议您立即重启 + + + + + The system has completed an important update, It is recommended that you restart immediately. + 系统完成一项关键更新,建议您立即重启 + + + + update error + 升级失败 + + + + kylin-background-upgrade + 后台更新程序 + + + + update + 系统升级 + + + + updatewidget + + Please remind me later + 请在以下时间段之后提醒我 + + + + at + + + + No more reminders + 内不再提醒 + + + + No reminders + 内不再提醒 + + + + In 30 minutes + 三十分钟 + + + + one hours later + 一个小时 + + + + three day later + 三天 + + + + five day later + 五天 + + + + Update + 立即更新 + + + + Delay + 推迟 + + + Two hours later + 两个小时 + + + + five hours later + 五个小时 + + + + one day later + 一天 + + + two day later + 两天 + + + Agree + 立即更新 + + + Disagree + 推迟 + + +