Import Upstream version 1.3.2.1

This commit is contained in:
谢炜 2022-07-21 18:14:33 +08:00
commit abb89a4585
31 changed files with 3093 additions and 0 deletions

36
README.md Normal file
View File

@ -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

20
checkUpdate.py Executable file
View File

@ -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()

BIN
checkUpdate.pyc Normal file

Binary file not shown.

6
data/Resources.qrc Normal file
View File

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/json"/>
<qresource prefix="/">
<file>update.png</file>
</qresource>
</RCC>

View File

@ -0,0 +1,10 @@
[Unit]
Description=系统升级后台检测程序
[Service]
Type=forking
TimeoutStartSec=infinity
ExecStart=/usr/share/kylin-update-notify/checkUpdate.py

View File

@ -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

View File

@ -0,0 +1,9 @@
[Settings]
powersize=1
setpackagesize=999999999
[Timer]
checkUpgradeTime=
checkUpgradeTimeSlot=9:30-11:30
RandomizedExecute=True

View File

@ -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

View File

@ -0,0 +1,6 @@
[Timer]
CheckUpgradeTime=
CheckCompleted=false
CheckUpgradeTimeSlot=09:30:00-11:30:00
GeneratRandomTime=true
RandomizedExecute=true

View File

@ -0,0 +1,39 @@
<schemalist gettext-domain="ukui-log4qt-kylin-background-upgrade">
<schema id="org.ukui.ukui-log4qt-kylin-background-upgrade" path="/org/ukui/ukui-log4qt-kylin-background-upgrade/">
<key type="s" name="log4j-handleqtmessages">
<default>"true"</default>
<summary>hook qt messages</summary>
<description>Control if hook qt messages</description>
</key>
<key type="s" name="log4j-rootlogger">
<default>"DEBUG,console,daily"</default>
<summary>config rootLogger's level and appenders</summary>
<description>config rootLogger's level and appenders:"level,appender"</description>
</key>
<key type="s" name="log4j-appender-daily-datepattern">
<default>".yyyy-MM-dd"</default>
<summary>daily log file pattern</summary>
<description>set daily log file pattern format:one day</description>
</key>
<key type="s" name="log4j-appender-daily-layout-conversionpattern">
<default>"%d{yyyy-MM-dd HH:mm:ss,zzz}(%-4r)[%t]|%-5p| - %m%n"</default>
<summary>set log message's format</summary>
<description>set log message's format</description>
</key>
<key type="i" name="delaytime">
<default>3600</default>
<summary>set check log files delay time</summary>
<description>set check log files delay time</description>
</key>
<key type="i" name="maxfilecount">
<default>7</default>
<summary>set log files count</summary>
<description>set log files count,unit s</description>
</key>
<key type="i" name="maxfilesize">
<default>512</default>
<summary>set log files total size</summary>
<description>set log files total size, unit M</description>
</key>
</schema>
</schemalist>

BIN
data/update.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

View File

@ -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

View File

@ -0,0 +1,315 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.11.0, 2022-07-21T18:04:32. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{3d34bcf0-6a81-46d0-90d9-4cc7667111f8}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">桌面</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">桌面</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{fb955230-392d-4c01-8fb0-8bfc9c0d7279}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/lxy/kylin-background-upgrade/sp3/build-kylin-background-upgrade-unknown-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/lxy/kylin-background-upgrade/sp3/build-kylin-background-upgrade-unknown-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/lxy/kylin-background-upgrade/sp3/build-kylin-background-upgrade-unknown-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">kylin-background-upgrade2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/lxy/kylin-background-upgrade/OpenKylin/make_deb/kylin-background-upgrade/kylin-background-upgrade.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/lxy/kylin-background-upgrade/OpenKylin/make_deb/kylin-background-upgrade/kylin-background-upgrade.pro</value>
<value type="QString" key="RunConfiguration.Arguments"></value>
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/lxy/kylin-background-upgrade/sp3/build-kylin-background-upgrade-unknown-Debug</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@ -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

22
src/core.cpp Normal file
View File

@ -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();
}

23
src/core.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef CORE_H
#define CORE_H
#include <QMainWindow>
#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

154
src/main.cpp Normal file
View File

@ -0,0 +1,154 @@
#include "core.h"
#include <QApplication>
#include <QDebug>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
#include <ukui-log4qt.h>
#include<qdebug.h>
#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();
}

458
src/traydbus.cpp Normal file
View File

@ -0,0 +1,458 @@
#include "traydbus.h"
#include <iostream>
#include <ostream>
#include <QDateTime>
//托盘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()<<str;
crucial = str.split(QRegExp("[ ]"));
qDebug()<<"d-bus crucial: "<<crucial;
}
return crucial;
}
QStringList traydbusservice::getImportant()
{
QFile file("/var/lib/kylin-software-properties/template/important.list");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return important;
while (!file.atEnd()) {
QByteArray line = file.readLine();
QString str = QString(line);
qDebug()<<str;
important = str.split(QRegExp("[ ]"));
qDebug()<<"d-bus important: "<<important;
}
return important;
}
void traydbusservice::connectSuccessslots()
{
emit connectSuccessSignal();
}
void traydbusservice::quitslots()
{
emit quitsignal();
}
//连接源管理器的d-bus································
source_dbus* source_dbus::sourceMutual = nullptr;
using namespace std;
/**
* @brief source_dbus::getInstance
*
* @return
*/
source_dbus* source_dbus::getInstance()
{
static QMutex mutex;
if (nullptr == sourceMutual) {
QMutexLocker locker(&mutex);
sourceMutual = new source_dbus;
}
return sourceMutual;
}
source_dbus::source_dbus(QObject *parent)
:QObject(parent)
{
connectTimer = new QTimer(this);
// connect(connectTimer, SIGNAL(timeout()), this, SLOT(connectDbus()));
}
source_dbus::~source_dbus()
{
}
/**
* @brief source_dbus::initSource_Dbus
* dbus
* @return
*/
bool source_dbus::initSource_Dbus()
{
//创建QDBusInterface接口
interface1 = new QDBusInterface("com.kylin.software.properties", "/com/kylin/software/properties",
"com.kylin.software.properties.interface",
QDBusConnection::systemBus());
if (!interface1->isValid()) {
qDebug() << qPrintable(QDBusConnection::systemBus().lastError().message());
exit(1);
}
interface1->setTimeout(123456789);
//调用远程的value方法源管理器update
qDebug()<<"Start updateSourceTemplate ...";
QDBusReply<bool> reply1 = interface1->call(QDBus::Block, "updateSourceTemplate");
if (reply1.isValid()) {
if (reply1.value()) {
// QDBusReply<int> reply2 = interface1->call(QDBus::Block, "updateSourcePackages","kylin-background-upgrade");
// if (reply2.isValid()) {
// qDebug()<<"updateSourcePackages return value:"<<reply2.value();
// if (reply2.value() == 100) {
// qDebug()<<"源管理器 updateSource 连接成功";
// emit ready();
// } else {
// qDebug()<<"源管理器updateSourcePackages failed连接失败 ";
// return false;
// }
// } else {
// qDebug() << "源管理器updateSourcePackages failed ";
// return false;
// }
emit ready();
} else {
qDebug()<<"updateSourceTemplate failed ";
return false;
}
} else {
qDebug() << "updateSourceTemplate method called failed ";
return false;
}
return true;
}
/**
* @brief source_dbus::connectDbus
*
*/
void source_dbus::connectDbus()
{
connectTimer->start(3000);
if (initSource_Dbus()) {
connectTimer->stop();
} else {
num ++;
if (num >2) {
qDebug()<<"updateSourceTemplate failed, exit.";
exit(0);
}
qDebug()<<"updateSourceTemplate failedRetries are in progress for the "<<num<<"th time.";
}
}
//连接更新管理器的d-bus································
update_dbus* update_dbus::updateMutual = nullptr;
using namespace std;
update_dbus* update_dbus::getInstance()
{
static QMutex mutex;
if (nullptr == updateMutual) {
QMutexLocker locker(&mutex);
updateMutual = new update_dbus;
}
return updateMutual;
}
update_dbus::update_dbus(QObject *parent)
:QObject(parent)
{
// initUpdate_Dbus();
}
update_dbus::~update_dbus()
{
}
/**
* @brief update_dbus::initUpdate_Dbus
* dbus
*/
void update_dbus::initUpdate_Dbus()
{
//创建QDBusInterface接口
interface = new QDBusInterface("com.kylin.systemupgrade", "/com/kylin/systemupgrade",
"com.kylin.systemupgrade.interface",
QDBusConnection::systemBus());
if (!interface->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<QStringList> reply = interface_utils->call("CheckInstalledOrUpgrade",arg);
if (reply.isValid())
{
qDebug()<<"The upgradeable list"<<reply.value();
return reply.value();
} else {
qDebug() << "Get upgradeable list failed, exit";
exit(0);
}
}
/**
* @brief update_dbus::checkForUpdateDect
*
*/
bool update_dbus::checkForUpdateDect()
{
qDebug()<<"Start to check system upgrade ...";
// connect(interface,SIGNAL(UpdateDetectFinished(bool, QStringList, QString, QString)),this,SLOT(UpdateDectSlot(bool, QStringList, QString, QString)));
// QDBusReply<QVariantList> 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<bool> 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
* dbusdbus路径
* @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<QList<QDBusObjectPath>> 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<QVariant> 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>("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<MyClass>().IDName;
// qDebug()<<res;
}
void UserIdStatus::initUserIdStatus()
{
static int uid = -1;
uid = getuid();
QString uIDaddress = QString("/org/freedesktop/login1/user/_%1").arg(uid);
QDBusInterface m_interface1("org.freedesktop.login1",
uIDaddress,
"org.freedesktop.DBus.Properties",
QDBusConnection::systemBus());
if (!m_interface1.isValid()) {
qDebug() << "dbus接口初始化失败";
return;
}
QDBusReply<QVariant> res = m_interface1.call("Get","org.freedesktop.login1.User","State");
UIDStatus = res.value().toString();
}

160
src/traydbus.h Normal file
View File

@ -0,0 +1,160 @@
#ifndef TRAYDBUSSERVICE_H
#define TRAYDBUSSERVICE_H
#include <QObject>
#include <QDBusInterface>
#include <QDBusReply>
#include <QDBusMessage>
#include <QDBusReply>
#include <QDBusConnection>
#include <QTimer>
#include <QDebug>
#include <QFile>
#include <QMutexLocker>
#include <QProcess>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
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

35
src/trayicon.cpp Normal file
View File

@ -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);
}

33
src/trayicon.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef TRAYICON_H
#define TRAYICON_H
#include <QWidget>
#include <QSystemTrayIcon>
#include <QAction>
#include <QMenu>
#include <QPainter>
#include <QEvent>
#include <QDebug>
#include <QWidgetAction>
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

667
src/updatehandle.cpp Normal file
View File

@ -0,0 +1,667 @@
#include "updatehandle.h"
#include <iostream>
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()<<"电脑电量值为:"<<powerNum;
}
}
/**
* @brief updatehandle::initDbus
* dbus
*/
void updatehandle::initDbus()
{
UserIdStatus *arg = new UserIdStatus(); //查看当前是否为用户操作的用户
if(arg->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: "<<CheckUpgradeTime;
qDebug()<<"Current system time: "<<Nowtime;
qDebug()<<"nSecs"<<nSecs;
if(nSecs == 0){
qDebug()<<"The timing configuration file is abnormalckeck upgrade ...";
return true;
}
if(nSecs < 0){
qDebug()<<"Check upgrade starts when the scheduled time is reached.";
return true;
}
return false;
}
/**
* @brief updatehandle::m_getsql
*
* @return
* true:
* false:
*/
bool updatehandle::m_getsql()
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("/var/cache/kylin-system-updater/kylin-system-updater.db");
if (!db.open()) {
qDebug()<<"open sql error";
return false;
}
QSqlQuery query;
query.exec("SELECT * FROM display");
while(query.next()){
QString tmp=query.value(3).toString();
if (tmp == "true") {
return true;
} else if (tmp == "false") {
return false;
}
}
qDebug()<<"从数据库未读到正确的标志信息";
return false;
}
/**
* @brief updatehandle::onActivated
*
* @param reason
* reason:
*/
void updatehandle::onActivated(trayicon::ActivationReason reason)
{
if(tip_window->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<QString,QStringList> 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: "<<m_crucial;
QStringList m_important;
QFile file2("/var/lib/kylin-software-properties/template/important.list");
if (!file2.open(QIODevice::ReadOnly | QIODevice::Text))
return ;
while (!file2.atEnd()) {
QByteArray line = file2.readLine();
str2 += QString(line);
}
str2.replace(QString("\n"), QString(""));
m_important = str2.split(QRegExp("[ ]"));
m_important.removeAll(QString(""));
qDebug()<<"The important lists: "<<m_important;
updatedata.insert("crucial",m_crucial);
updatedata.insert("important",m_important);
processData(updatedata);
}
/**
* @brief updatehandle::processData
*
* @param data
*
*/
void updatehandle::processData(QMap<QString,QStringList> data)
{
qDebug()<<"Monitor the installation progress and status signal ...";
//ksu获取进度状态
connect(m_updateMutual,&update_dbus::UpdateInstallFinished,this,&updatehandle::InstallFinsih);
QStringList crucial;
QMap<QString,QStringList>::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: "<<crucial;
QStringList checkCrucialAll;
checkCrucialAll = m_updateMutual->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;i<checkCrucialAll.count();i+=2) {
crucialPackage.append(checkCrucialAll.at(i));
}
for (int i=1;i<checkCrucialAll.count();i+=2) {
crucialPackageSize.append(checkCrucialAll.at(i));
}
qDebug()<<"Checking for inactivity in silent upgrading ...";
timerDownload->start(20*60*1000);
if (powerState) { //判断是否获取到电量
if (powerNum.toInt()<powerSize) { //判断电量是否达到警戒值
qDebug()<<"超出设定电源警戒值,判断包大小是否符合继续下载条件";
if (packageDownOrNot(crucialPackageSize)) {
notify_send(tr("The system is updating silently"));
trayIcon->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<arg.count();i++) {
QString pagesize = arg.at(i);
if (pagesize.toFloat() > 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:"<<arg;
// qDebug()<<"aptpercent:"<<args;
}
void updatehandle::InstallFinsih(bool state,QStringList pkgname,QString error,QString reason)
{
timerDownload->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: "<<errorName;
notify_send(errorName);
}
trayIcon->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<QVariant> args;
args<<tr("kylin-background-upgrade")
<<((unsigned int) 0)
<<QString("kylin-update-manager")
<<tr("update") //显示的是什么类型的信息//系统升级
<<arg //显示的具体信息
<<QStringList()
<<QVariantMap()
<<(int)-1;
iface.callWithArgumentList(QDBus::AutoDetect,"Notify",args);
}
/**
* @brief updatehandle::downloadTimeout
*
*/
void updatehandle::downloadTimeout()
{
qDebug() << "Download the timeout, exit!";
exit(0);
}
/**
* @brief updatehandle::_secsTo
*/
int updatehandle::_secsTo(QString time1, QString time2)
{
QStringList time1Slot,time2Slot;
// **:**
if (time1.contains(":")){
time1Slot = time1.split(":");
}else{return -1;}
if (time2.contains(":")){
time2Slot = time2.split(":");
}else{return -1;}
if (time1Slot.at(0) > 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<QString, QVariant> 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<QString, QVariant> Settings;
Settings.insert("powersize", int(1));
Settings.insert("setpackagesize", "999999999");
// qDebug()<<"Settings "<<QString::number(float(999999999),'f',2);
confPath = QDir::homePath()+"/.config/kylin-background-upgrade/kylin-background-upgrade-conf.ini";
QFileInfo fileInfo(confPath);
if (!fileInfo.exists()) {
qDebug()<<"The background-upgrade configuration file isn't exists.";
QMapIterator<QString, QVariant> ir_timer(Timer);
QMapIterator<QString, QVariant> 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: "<<CheckUpgradeTime<<", CheckUpgradeTimeSlot: "<<CheckUpgradeTimeSlot \
<<", RandomizedExecute: "<<RandomizedExecute<<", GeneratRandomTime: "<<GeneratRandomTime<<", CheckUpgradeTime: "<<CheckUpgradeTime\
<<", CheckCompleted: "<<CheckCompleted<<" ]";
timersetting->endGroup();
timersetting->beginGroup(QString::fromLocal8Bit("Settings"));
powerSize = timersetting->value("powersize").toInt();
setPackageSize = timersetting->value("setpackagesize").toFloat();
timersetting->endGroup();
QStringList timeSlot = CheckUpgradeTimeSlot.split("-");
qDebug()<<"timeSlot "<<timeSlot;
//需要刷新检测时间
if (GeneratRandomTime) {
QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间
QString current_datetime = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式
QString current_date= time.toString("yyyy-MM-dd"); //设置显示格式
QString current_time= time.toString("hh:mm:ss"); //设置显示格式
QString nowtime;
QByteArray str2char2 = current_time.toLatin1(); // must
nowtime = str2char2.data();
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
int a = 0;
timersetting->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 "<<a;
} else {
a = qrand()%(strayParameter);
qDebug() << "strayParameter: "<< strayParameter << ", a "<<a;
}
QDateTime bojb = QDateTime::fromString(timing,"yyyy-MM-dd hh:mm:ss").addSecs(a*60);
if (CheckCompleted) {
bojb = bojb.addDays(1);
timersetting->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 "<<timing_time;
timersetting->sync();
timersetting->endGroup();
}
}

103
src/updatehandle.h Normal file
View File

@ -0,0 +1,103 @@
#ifndef TRAY_H
#define TRAY_H
#include <QMap>
#include <QDebug>
#include <QWidget>
#include <QProcess>
#include <QSettings>
#include <QSqlQuery>
#include <QTextCodec>
#include <QPushButton>
#include <QTranslator>
#include <QSqlDatabase>
#include <QNetworkReply>
#include <QSqlQueryModel>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <string.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/stat.h>
#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<QString,QStringList> 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

502
src/updatewidget.cpp Normal file
View File

@ -0,0 +1,502 @@
#include "updatewidget.h"
#include "ui_updatewidget.h"
#include <QPainterPath>
#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<<tr("In 30 minutes")<<tr("one hours later")<<tr("five hours later")<<tr("one day later")<<tr("three day later")<<tr("five day later");
comboBox->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: [ '"<<m_nScreenWidth-340<<"','"<< m_nScreenHeight-h-190<<"','"<<300<<"','"<<150 - 100<<"']";
}
break;
case updatewidget::PanelUp:
{
this->setGeometry(m_nScreenWidth - 340,m_nScreenHeight - 190,300,150-100);
qDebug()<<"任务栏在上方: 显示坐标为: "<<m_nScreenWidth - 340 << m_nScreenHeight - 190 << 300 << 150 - 100;
}
break;
case updatewidget::PanelLeft:
{
this->setGeometry(m_nScreenWidth - 340,m_nScreenHeight - 190,300,150-100);
qDebug()<<"任务栏在左侧: 显示坐标为: "<<m_nScreenWidth - 340 << m_nScreenHeight - 190 << 300 << 150 - 100;
}
break;
case updatewidget::PanelRight:
{
this->setGeometry(m_nScreenWidth - 340 - h,m_nScreenHeight - 190,300,150-100);
qDebug()<<"任务栏在右侧: 显示坐标为: "<<m_nScreenWidth - 340 - h << m_nScreenHeight - 190 << 300 << 150 - 100;
}
break;
default:
break;
}
}
qDebug() << "Current screen width: " << m_nScreenWidth <<"; height:"<< m_nScreenHeight;
}
int updatewidget::getTaskbarPos(QString str)
{
QDBusInterface interface( "com.ukui.panel.desktop",
"/",
"com.ukui.panel.desktop",
QDBusConnection::sessionBus() );
QDBusReply<int> 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<int> 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()<<methodName<<"called failed";
}
return res;
}
void updatewidget::initset_window_position()
{
connect(m_pPanelSetting, &QGSettings::changed,[=](QString key){
if ("panelposition" == key | "panelsize" == key) {
set_window_position();
}
}
);
}
void updatewidget::set_window_position()
{
QRect rect;
int availableWidth,totalWidth;
int availableHeight,totalHeight;
rect = this->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()<<"任务栏在下侧"<<priWid-330-distance<<" "<<availableHeight-180-m-distance <<" "<<this->width()<<" "<<this->height();
}else if(n == 1){
//任务栏在上侧
this->setGeometry(priWid-330-distance,availableHeight-180-distance,this->width(),this->height());
qDebug()<<"任务栏在上侧"<<priWid-330-distance<<" "<<availableHeight-180-distance <<" "<<this->width()<<" "<<this->height();
} else if (n == 2){
//任务栏在左侧
this->setGeometry(priWid-330-distance,availableHeight-180-distance,this->width(),this->height());
qDebug()<<"任务栏在左侧"<<priWid-330-distance<<" "<<availableHeight-180-distance <<" "<<this->width()<<" "<<this->height();
} else if (n == 3){
//任务栏在右侧
this->setGeometry(availableWidth-330-m-distance,availableHeight-180-distance,this->width(),this->height());
qDebug()<<"任务栏在右侧"<<availableWidth-330-m-distance<<" "<<availableHeight-180-distance <<" "<<this->width()<<" "<<this->height();
}
}
/**
* @brief updatewidget::insideTime
*
* @return
*/
char *updatewidget::insideTime()
{
qDebug()<<comboBox->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 "<<nowtime;
timersettings = new QSettings(toDir,QSettings::IniFormat);
timersettings->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);
}

119
src/updatewidget.h Normal file
View File

@ -0,0 +1,119 @@
#ifndef TRAYWIDGET_H
#define TRAYWIDGET_H
#include <QWidget>
#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QDebug>
#include <QPainter>
#include <QProcess>
#include <QComboBox>
#include <QDir>
#include <fcntl.h>
#include <QDateTime>
#include <QPoint>
#include <QDBusInterface>
#include <QGSettings>
#include <QScreen>
#include <QDBusReply>
#include <QSettings>
#include <sys/stat.h>
#include <unistd.h>
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

21
src/updatewidget.ui Normal file
View File

@ -0,0 +1,21 @@
<ui version="4.0">
<author/>
<comment/>
<exportmacro/>
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
</widget>
<pixmapfunction/>
<connections/>
</ui>

1
translations/UapLBi.json Normal file
View File

@ -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"]}]

Binary file not shown.

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="bo_CN">
<context>
<name>updatewidget</name>
<message>
<source>at</source>
<translation></translation>
</message>
<message>
<source>Delay</source>
<translation></translation>
</message>
<message>
<source>five hours later</source>
<translation>%d</translation>
</message>
<message>
<source>one hours later</source>
<translation></translation>
</message>
<message>
<source>three day later</source>
<translation></translation>
</message>
<message>
<source>In 30 minutes</source>
<translation></translation>
</message>
<message>
<source>Update</source>
<translation></translation>
</message>
<message>
<source>No reminders</source>
<translation></translation>
</message>
<message>
<source>five day later</source>
<translation></translation>
</message>
<message>
<source>one day later</source>
<translation></translation>
</message>
</context>
<context>
<name>updatehandle</name>
<message>
<source>update error</source>
<translation></translation>
</message>
<message>
<source>kylin-background-upgrade</source>
<translation></translation>
</message>
<message>
<source>The system is updating silently</source>
<translation></translation>
</message>
<message>
<source>update</source>
<translation></translation>
</message>
<message>
<source>The system has completed an important update. It is recommended that you restart immediately</source>
<translation> </translation>
</message>
<message>
<source>System update detected</source>
<translation></translation>
</message>
<message>
<source>The system has completed a critical update, and some software packages failed to update. It is recommended that you restart immediately</source>
<translation> </translation>
</message>
</context>
<context>
<name>trayicon</name>
<message>
<source>The system is updating silently</source>
<translation></translation>
</message>
</context>
<context>
<name>updateTip</name>
<message>
<source>The system is updating silently</source>
<translation></translation>
</message>
</context>
</TS>

Binary file not shown.

View File

@ -0,0 +1,161 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>Form</name>
<message>
<location filename="../src/updatewidget.ui" line="16"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<source>The system is updating silently</source>
<translation type="vanished"></translation>
</message>
</context>
<context>
<name>trayicon</name>
<message>
<location filename="../src/trayicon.cpp" line="10"/>
<source>The system is updating silently</source>
<translation></translation>
</message>
</context>
<context>
<name>updateTip</name>
<message>
<location filename="../src/updatewidget.cpp" line="464"/>
<source>The system is updating silently</source>
<translation></translation>
</message>
</context>
<context>
<name>updatehandle</name>
<message>
<source>The system has completed an important update. It is recommended that you restart immediately.</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/updatehandle.cpp" line="303"/>
<location filename="../src/updatehandle.cpp" line="310"/>
<location filename="../src/updatehandle.cpp" line="315"/>
<source>The system is updating silently</source>
<translation></translation>
</message>
<message>
<source>System update detected </source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/updatehandle.cpp" line="105"/>
<location filename="../src/updatehandle.cpp" line="336"/>
<source>System update detected</source>
<translation></translation>
</message>
<message>
<source>The system has completed a critical update, and some software packages failed to update. It is recommended that you restart immediately</source>
<translation type="obsolete"></translation>
</message>
<message>
<location filename="../src/updatehandle.cpp" line="482"/>
<location filename="../src/updatehandle.cpp" line="483"/>
<source>The system has completed an important update, It is recommended that you restart immediately.</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatehandle.cpp" line="485"/>
<source>update error</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatehandle.cpp" line="518"/>
<source>kylin-background-upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatehandle.cpp" line="521"/>
<source>update</source>
<translation></translation>
</message>
</context>
<context>
<name>updatewidget</name>
<message>
<source>Please remind me later</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="40"/>
<source>at</source>
<translation></translation>
</message>
<message>
<source>No more reminders</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="42"/>
<source>No reminders</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="53"/>
<source>In 30 minutes</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="53"/>
<source>one hours later</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="53"/>
<source>three day later</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="53"/>
<source>five day later</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="60"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="61"/>
<source>Delay</source>
<translation></translation>
</message>
<message>
<source>Two hours later</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="53"/>
<source>five hours later</source>
<translation></translation>
</message>
<message>
<location filename="../src/updatewidget.cpp" line="53"/>
<source>one day later</source>
<translation></translation>
</message>
<message>
<source>two day later</source>
<translation type="vanished"></translation>
</message>
<message>
<source>Agree</source>
<translation type="vanished"></translation>
</message>
<message>
<source>Disagree</source>
<translation type="vanished"></translation>
</message>
</context>
</TS>