mirror of
https://gitee.com/spark-store-project/spark-store
synced 2025-12-15 13:22:04 +08:00
Compare commits
210 Commits
4.1.1
...
4.2.3.2Rea
| Author | SHA1 | Date | |
|---|---|---|---|
| aa85ee53a8 | |||
| ac45f5eec9 | |||
| 84cc4a9208 | |||
| 795a6ca709 | |||
| dab4606e9b | |||
| 1954196ba1 | |||
| fc0edab44c | |||
| a04cf4e6d9 | |||
| e85576e5f0 | |||
| efba72002a | |||
| 8ff46e554f | |||
| 57db01aeaf | |||
| 0ceb99e121 | |||
| 83b539e7da | |||
| ce6c0a4613 | |||
| cf59aeb4eb | |||
| 17ca13cf00 | |||
|
|
b99225bd3c | ||
| 8f39710cdb | |||
| 7ec6be1969 | |||
| 1543d75339 | |||
| 77eb0d84c7 | |||
| 68ddb3ffcc | |||
| 58ea0249d8 | |||
| eb01bf253e | |||
| c22ce6290b | |||
| 1f7608bf77 | |||
| 16115a455b | |||
| ce680d54f9 | |||
| a90699163f | |||
| 3edf39b4ef | |||
| f5c879b369 | |||
| 2bd9c4a440 | |||
| f494f15922 | |||
| d5df4057e9 | |||
| dc07b7cb02 | |||
| 1bb0bf7d71 | |||
| cf00d54355 | |||
| 1ea7067379 | |||
| 29ad3cc72d | |||
| dfe57bf2c3 | |||
| b37f8d7f7e | |||
| b51b248566 | |||
| 21baf598d7 | |||
| 2c6d706c58 | |||
| 1b1f7578d0 | |||
| 9275425bdf | |||
| 22b1d66c07 | |||
| a3e1d19ac3 | |||
| 762caae49f | |||
| 4e4ee205de | |||
| 9d4e19e606 | |||
| 4d142ec614 | |||
| 80cf746f90 | |||
| 3b83b335be | |||
| 1f0a0e48ff | |||
| 432215e040 | |||
| 1a65386c6b | |||
|
|
757dced302 | ||
|
|
854caafd6b | ||
| 1332107642 | |||
|
|
4825417de8 | ||
| 0001df153b | |||
| f88b38dd39 | |||
| 3f2404ec1c | |||
| 5b822194fa | |||
| 33ea9ee065 | |||
| d742e85332 | |||
|
|
8dfb1fbe2f | ||
| 4114b51d87 | |||
|
|
deec70f14b | ||
| ee0d3f87ec | |||
| 80adfd5dc1 | |||
| e81c846432 | |||
| 03d60d74f1 | |||
| 4f2c5f1bdc | |||
|
|
da03261cbb | ||
|
|
48d551424a | ||
|
|
ab6c3d37d2 | ||
| de2db98324 | |||
|
|
66d1aacbbe | ||
| 57f1b69663 | |||
|
|
cb093dcc2b | ||
| eaf268a10d | |||
|
|
1074e941a6 | ||
|
|
05cb318737 | ||
| 4ce19e25e5 | |||
| 17c152ce8b | |||
|
|
9275074e10 | ||
| e69eaa6296 | |||
| 35bc1efbad | |||
| 9420959023 | |||
| 7a16b5c52f | |||
| 24519e6560 | |||
| 2104b99208 | |||
|
|
cf549c540d | ||
|
|
4b40e3caca | ||
| 1a89c2a1a6 | |||
| b1fd1a3c3c | |||
| 50e895938b | |||
| 18d2b1edbb | |||
|
|
f91ee56d97 | ||
| 41a6a3fc04 | |||
| 1266b16d83 | |||
| 4359a9c58d | |||
| c243a30dec | |||
| f629dca03c | |||
| f2e1219a83 | |||
| e2f27c7746 | |||
| 72ba481180 | |||
| 8d41966d67 | |||
| f2a4ce3b25 | |||
| 0b2290344b | |||
| a7cb44348d | |||
| 384d4b300d | |||
| 19a1ba4289 | |||
| c160f4105d | |||
| 682a6e38d6 | |||
| e4a3a974b5 | |||
| eb38f2af05 | |||
| 7163f8ee80 | |||
| a934373f1e | |||
| ce6ded25f2 | |||
| f707fef65b | |||
| 721e6580c9 | |||
| e20572b28d | |||
| 05a6af8f86 | |||
| d4e84344c3 | |||
| f856060d3d | |||
| 49829f8d3c | |||
| 4cd3ca56e0 | |||
| 0538777ceb | |||
| d3b303c66c | |||
| 98c4e8a699 | |||
| 69b7cbe472 | |||
| 539a21ccec | |||
| eb40a32cc2 | |||
| 440b7ea88d | |||
| 36d273dd5e | |||
| 6bdc1ee51c | |||
| ecfa9a166d | |||
| 199700495c | |||
| 0bafab7f94 | |||
| dd4deff19d | |||
| 8b88573283 | |||
| 2717cf695c | |||
| 385803754f | |||
| 8ba377cf0b | |||
| c21d4dac96 | |||
| a85200338c | |||
| 5d34dd6413 | |||
| bd3daeba75 | |||
|
|
8b2a61e4b2 | ||
| 116f14845e | |||
| 77bf544c59 | |||
| f809d7c15d | |||
| 1f7f3edbba | |||
| 90f6b6a574 | |||
| 3e51ce8381 | |||
| b7df4a5801 | |||
| 980e4a17d9 | |||
| d5248f4c1b | |||
|
|
c169622806 | ||
|
|
cc54014b29 | ||
|
|
c636e0882b | ||
|
|
4120af7e24 | ||
| 09a5789c26 | |||
| fc658f324d | |||
| 2861b0573b | |||
| 2ab4ebc0e3 | |||
| e344b16aa0 | |||
| 30b65350ca | |||
| 0db8c8b1bb | |||
| 9e25584bdc | |||
| ee6d6f145f | |||
| 347f6e918f | |||
| 0fcbd15ab4 | |||
| 6bdac50059 | |||
| f45b2af260 | |||
| d744c1d978 | |||
| 0544761094 | |||
| e645c5e526 | |||
| d75fdd9f80 | |||
| 30f74db0dc | |||
| 2d0069ce18 | |||
| 48b91d1887 | |||
| 32cb3d7453 | |||
|
|
ba3071d62b | ||
|
|
dca80a3fbb | ||
| f99c0839dd | |||
| 8850cfd4a3 | |||
| bec8a14baf | |||
| 1b9c925183 | |||
| 09221bc2e9 | |||
| 98da0c22fc | |||
| cadbb351fb | |||
| 2de237ce83 | |||
| 511fbaa0b0 | |||
| a6d85b6ade | |||
| 5889ac3045 | |||
| c1ba14bbd0 | |||
| 7bdccc7783 | |||
|
|
3a54cba3e5 | ||
| 79463246fb | |||
| cc8ff5eff2 | |||
| 613327b2cc | |||
| 8b31db843c | |||
| fd4fdbe970 | |||
| 89a3ab0b4c | |||
| 0179c2f04f |
@@ -32,8 +32,7 @@ stages:
|
||||
- cd ..
|
||||
- rm -rf dtk-old-bundle
|
||||
- 'mk-build-deps --install --tool "apt-get -o Debug::pkgProblemResolver=yes -y" '
|
||||
- sed -i 's/-j$(JOBS)/-j2/g' debian/rules
|
||||
- dpkg-buildpackage -b -us -uc
|
||||
- dpkg-buildpackage -j2 -b -us -uc
|
||||
- cd ..
|
||||
- ls -all
|
||||
- pwd
|
||||
|
||||
@@ -33,8 +33,7 @@ stages:
|
||||
- rm -rf dtk-old-bundle
|
||||
- ''
|
||||
- 'mk-build-deps --install --tool "apt-get -o Debug::pkgProblemResolver=yes -y" '
|
||||
- sed -i 's/-j$(JOBS)/-j2/g' debian/rules
|
||||
- dpkg-buildpackage -b -us -uc
|
||||
- dpkg-buildpackage -j2 -b -us -uc
|
||||
- cd ..
|
||||
- ls -all
|
||||
- pwd
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
参数只有一个Url,该url应当遵循这种格式:`spk://<任意合法字符>/web分类/包名`
|
||||
|
||||
目前第一字段不进行处理,以后可能会对此识别。在目前阶段,这个字段可以填写任意合法字符
|
||||
|
||||
例如:
|
||||
|
||||
[spk://abcdefg/games/store.spark-app.hmcl](spk://abcdefg/games/store.spark-app.hmcl)
|
||||
@@ -11,15 +13,15 @@
|
||||
|
||||
| 分类名称 | web分类 |
|
||||
| -------- | -------------- |
|
||||
| 网络应用 | network |
|
||||
| 社交沟通 | chat |
|
||||
| 音乐欣赏 | music |
|
||||
| 视频播放 | video |
|
||||
| 图形图像 | graphics |
|
||||
| 游戏娱乐 | games |
|
||||
| 办公学习 | office |
|
||||
| 阅读翻译 | reading |
|
||||
| 编程开发 | development |
|
||||
| 系统工具 | tools |
|
||||
| 主题美化 | beautify |
|
||||
| 其他应用 | others |
|
||||
| 网络 | network |
|
||||
| 社交 | chat |
|
||||
| 音乐 | music |
|
||||
| 视频 | video |
|
||||
| 图像 | image_graphics |
|
||||
| 游戏 | games |
|
||||
| 办公 | office |
|
||||
| 阅读 | reading |
|
||||
| 开发 | development |
|
||||
| 工具 | tools |
|
||||
| 主题 | themes |
|
||||
| 其他 | others |
|
||||
|
||||
7
DOCS/内网部署.md
Normal file
7
DOCS/内网部署.md
Normal file
@@ -0,0 +1,7 @@
|
||||
需要修改的内容:商店默认源位置,aptss获取apt-fast.conf和sparkstore.list的地址,ssinstall做安装检查的源位置
|
||||
|
||||
服务器使用update.sh进行同步。
|
||||
|
||||
为方便使用(其实是早期屎山使然),请将仓库放置于 `/home/ftp/spark-store`
|
||||
|
||||
仓库管理相关代码请移步 [这里](https://gitee.com/deepin-community-store/repo_auto_update_script),update.sh请联系 @shenmo 获取
|
||||
73
README.en.md
73
README.en.md
@@ -1,73 +0,0 @@
|
||||
# Spark App Store
|
||||
[](https://gitee.com/deepin-community-store/spark-store/stargazers) [](https://gitee.com/deepin-community-store/spark-store/members)
|
||||
|
||||
Spark Store aims to collect Linux apps for the convieniece of Linux new comers
|
||||
|
||||
The collecting process needs everyone's help
|
||||
|
||||
We set up this APP Store and collect APPs/tools that everyone need widely. Also we pack Windows apps with wine.
|
||||
|
||||
All packages will be shared in our repository for users to get freely.
|
||||
|
||||
Distrobution supported:Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(May stop support in the future) ; UniontechOS Home 21
|
||||
|
||||
*About OpenKylin and deepin 23*
|
||||
|
||||
The adaptation work is scheduled after their official release.
|
||||
|
||||
You can track our Issue resoving progress here https://gitee.com/deepin-community-store/spark-store/board
|
||||
|
||||
|
||||
We hope people who see here can also join our team,development help or submit applications are welcomed
|
||||
|
||||
If you want to submit an APP to share with others,Please [Click here](https://upload.deepinos.org/index)
|
||||
|
||||
|
||||
## 🙌 A simple start
|
||||
|
||||
If you simply want to install the Spark Store,just enter the [Release] page, find the version you want and install.
|
||||
|
||||
If you are using Debian11/Ubuntu 20.04, you will need extra dependency package. Available [here](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
|
||||
|
||||
---
|
||||
#### Compile and developement
|
||||
|
||||
|
||||
For Deepin V20/UOS 21/ Debian 11
|
||||
|
||||
```shell
|
||||
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev
|
||||
|
||||
```
|
||||
|
||||
Ubuntu 22.04
|
||||
```shell
|
||||
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev
|
||||
|
||||
```
|
||||
|
||||
Then
|
||||
|
||||
```shell
|
||||
git clone https://gitee.com/deepin-community-store/spark-store.git
|
||||
cd spark-store
|
||||
dpkg-buildpackage
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 🚀 Coorperation
|
||||
|
||||
We use Gitee as our code hosting platform. Please click here to contact us.
|
||||
|
||||
https://gitee.com/deepin-community-store/spark-store
|
||||
|
||||
### Rocket Chat
|
||||
|
||||
https://chat.shenmo.tech/
|
||||
|
||||
PWA Client:
|
||||
|
||||
spk://store/chat/store.spark-app.feedback
|
||||
|
||||
(Copy and paste to search bar or in browser address bar after installing Spark Store)
|
||||
93
README.md
93
README.md
@@ -1,68 +1,87 @@
|
||||
# 星火应用商店
|
||||
# Spark App Store
|
||||
[](https://gitee.com/deepin-community-store/spark-store/stargazers) [](https://gitee.com/deepin-community-store/spark-store/members)
|
||||
|
||||
众所周知,国内的Linux应用比较少,wine应用难以获取,优质工具分散在民间各大论坛,无法形成合力,难以改善生态
|
||||
## Branch: Reason
|
||||
|
||||
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
|
||||
|
||||
我们创建了这个应用商店,广泛收录大家需要的软件包,搜集优质小工具,主动适配wine应用,存放到储存库供大家获取
|
||||
我们支持:Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(将会逐渐停止支持) ; UOS Home 21
|
||||
|
||||
## 关于协作:分支相关的文档见 [这里](https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo)
|
||||
|
||||
*关于OpenKylin和deepin 23*
|
||||
|
||||
支持计划将会在对应系统发布正式版之后开始评估和执行
|
||||
|
||||
希望看到这里的人也可以加入我们的队伍,开发或者投递应用都很欢迎,共同构建Linux应用生态
|
||||
|
||||
在这里追踪我们的Issue处理情况 https://gitee.com/deepin-community-store/spark-store/board
|
||||
|
||||
如果有想要提交的软件包,请 [在这里投稿](https://upload.deepinos.org/index)
|
||||
|
||||
|
||||
## 🙌 简单的开始
|
||||
|
||||
如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载。
|
||||
|
||||
如果你在使用 `Debian 11/Ubuntu 20.04`,你需要额外下载[依赖补充包](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
|
||||
This branch is for aarch64-store support
|
||||
|
||||
---
|
||||
#### 编译安装
|
||||
## You are informed that the aarch64 support is EXPERIMENTAL and there is NO GUARANTEE that this branch will be supported in the future
|
||||
|
||||
Spark Store aims to collect Linux apps for the convieniece of Linux new comers
|
||||
|
||||
The collecting process needs everyone's help
|
||||
|
||||
We set up this APP Store and collect APPs/tools that everyone need widely. Also we pack Windows apps with wine.
|
||||
|
||||
All packages will be shared in our repository for users to get freely.
|
||||
|
||||
Distrobution supported:Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(May stop support in the future) ; UniontechOS Home 21
|
||||
|
||||
*About OpenKylin and deepin 23*
|
||||
|
||||
The adaptation work is scheduled after their official release.
|
||||
|
||||
You can track our Issue resoving progress here https://gitee.com/deepin-community-store/spark-store/board
|
||||
|
||||
|
||||
Deepin V20/UOS 21 系统下, 安装依赖
|
||||
We hope people who see here can also join our team,development help or submit applications are welcomed
|
||||
|
||||
If you want to submit an APP to share with others,Please [Click here](https://upload.deepinos.org/index)
|
||||
|
||||
|
||||
## 🙌 A simple start
|
||||
|
||||
If you simply want to install the Spark Store,just enter the [Release] page, find the version you want and install.
|
||||
|
||||
If you are using Debian11/Ubuntu 20.04, you will need extra dependency package. Available [here](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
|
||||
|
||||
---
|
||||
#### Compile and developement
|
||||
|
||||
|
||||
For Deepin V20/UOS 21/ Debian 11
|
||||
|
||||
```shell
|
||||
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot
|
||||
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin
|
||||
|
||||
```
|
||||
|
||||
Ubuntu 22.04 系统下, 安装依赖
|
||||
Ubuntu 22.04
|
||||
```shell
|
||||
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev
|
||||
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools
|
||||
|
||||
```
|
||||
|
||||
然后
|
||||
Then
|
||||
|
||||
```shell
|
||||
git clone https://gitee.com/deepin-community-store/spark-store.git
|
||||
cd spark-store
|
||||
dpkg-buildpackage
|
||||
dpkg-buildpackage -j
|
||||
```
|
||||
|
||||
Or:
|
||||
```shell
|
||||
git clone https://gitee.com/deepin-community-store/spark-store.git
|
||||
cd spark-store
|
||||
./build_and_install.sh
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 🚀 协作
|
||||
## 🚀 Coorperation
|
||||
|
||||
非常感谢有兴趣的开发者或爱好者参与 `星火应用商店` 项目,分享你的见解与思路。
|
||||
We use Gitee as our code hosting platform. Please click here to contact us.
|
||||
|
||||
### 交流平台
|
||||
https://gitee.com/deepin-community-store/spark-store
|
||||
|
||||
### Rocket Chat
|
||||
|
||||
https://chat.shenmo.tech/
|
||||
|
||||
客户端PWA:
|
||||
PWA Client:
|
||||
|
||||
spk://store/chat/store.spark-app.feedback
|
||||
|
||||
(安装星火商店后在浏览器打开或复制到搜索栏打开)
|
||||
(Copy and paste to search bar or in browser address bar after installing Spark Store)
|
||||
|
||||
81
README.zh.md
Normal file
81
README.zh.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# 星火应用商店
|
||||
[](https://gitee.com/deepin-community-store/spark-store/stargazers) [](https://gitee.com/deepin-community-store/spark-store/members)
|
||||
|
||||
## 分支:原理
|
||||
|
||||
此分支用于aarch64-store支持
|
||||
|
||||
---
|
||||
## 请注意,aarch64的支持是实验性的,并未确认持续支持!
|
||||
|
||||
众所周知,国内的Linux应用比较少,wine应用难以获取,优质工具分散在民间各大论坛,无法形成合力,难以改善生态
|
||||
|
||||
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
|
||||
|
||||
我们创建了这个应用商店,广泛收录大家需要的软件包,搜集优质小工具,主动适配wine应用,存放到储存库供大家获取
|
||||
我们支持:Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(将会逐渐停止支持) ; UOS Home 21
|
||||
|
||||
## 关于协作:分支相关的文档见 [这里](https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo)
|
||||
|
||||
*关于OpenKylin和deepin 23*
|
||||
|
||||
支持计划将会在对应系统发布正式版之后开始评估和执行
|
||||
|
||||
希望看到这里的人也可以加入我们的队伍,开发或者投递应用都很欢迎,共同构建Linux应用生态
|
||||
|
||||
在这里追踪我们的Issue处理情况 https://gitee.com/deepin-community-store/spark-store/board
|
||||
|
||||
如果有想要提交的软件包,请 [在这里投稿](https://upload.deepinos.org/index)
|
||||
|
||||
|
||||
## 🙌 简单的开始
|
||||
|
||||
如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载。
|
||||
|
||||
如果你在使用 `Debian 11/Ubuntu 20.04`,你需要额外下载[依赖补充包](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
|
||||
|
||||
---
|
||||
#### 编译安装
|
||||
|
||||
|
||||
Deepin V20/UOS 21 系统下, 安装依赖
|
||||
|
||||
```shell
|
||||
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin libqt5svg5*
|
||||
|
||||
```
|
||||
|
||||
Ubuntu 22.04 系统下, 安装依赖
|
||||
```shell
|
||||
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools libqt5svg5*
|
||||
|
||||
```
|
||||
|
||||
然后
|
||||
```shell
|
||||
git clone https://gitee.com/deepin-community-store/spark-store.git
|
||||
cd spark-store
|
||||
dpkg-buildpackage -j
|
||||
```
|
||||
|
||||
或者: 编译并安装
|
||||
```shell
|
||||
git clone https://gitee.com/deepin-community-store/spark-store.git
|
||||
cd spark-store
|
||||
./build_and_install.sh
|
||||
```
|
||||
|
||||
|
||||
## 🚀 协作
|
||||
|
||||
非常感谢有兴趣的开发者或爱好者参与 `星火应用商店` 项目,分享你的见解与思路。
|
||||
|
||||
### 交流平台
|
||||
|
||||
https://chat.shenmo.tech/
|
||||
|
||||
客户端PWA:
|
||||
|
||||
spk://store/chat/store.spark-app.feedback
|
||||
|
||||
(安装星火商店后在浏览器打开或复制到搜索栏打开)
|
||||
24
build_and_install.sh
Executable file
24
build_and_install.sh
Executable file
@@ -0,0 +1,24 @@
|
||||
|
||||
# Deepin V20/UOS 21 系统下, 安装依赖
|
||||
|
||||
# ```shell
|
||||
# sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin
|
||||
|
||||
# ```
|
||||
|
||||
# Ubuntu 22.04 系统下, 安装依赖
|
||||
# ```shell
|
||||
# sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools
|
||||
|
||||
# ```
|
||||
|
||||
echo "Deepin V20/UOS 21 系统下, 安装依赖"
|
||||
echo "sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin"
|
||||
|
||||
echo "Ubuntu 22.04 系统下, 安装依赖"
|
||||
echo "sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools"
|
||||
|
||||
dpkg-buildpackage -j
|
||||
sudo apt reinstall ../spark-store_*.deb
|
||||
|
||||
rm ../spark-store_*
|
||||
322
debian/changelog
vendored
322
debian/changelog
vendored
@@ -1,67 +1,272 @@
|
||||
spark-store (4.2.3.2~Reason3) stable; urgency=medium
|
||||
* 现在可在x86上编译,使用同一套代码
|
||||
* 暂时在aarch64上使用旧web----等待柚子
|
||||
* 空间,疾疫,现在是静谧
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||
|
||||
spark-store (4.2.3.2~only-for-test1) stable; urgency=medium
|
||||
* 注意!!!!!! 此版本仅为启动测试,还需要进一步完善——hardcode需要改善——关于web界面的调用方式需要在柚子做好之后修改成新的
|
||||
* fix: hardcode
|
||||
* fix: sender-d
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (4.2.3.1) stable; urgency=medium
|
||||
* 修复: ssinstall验证签名出错
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (4.2.3) stable; urgency=medium
|
||||
* 修复: 编译依赖不全
|
||||
* 修复: prerm导致的dpkg崩溃
|
||||
* 新增: aptss 检查package配置增加sdu,store
|
||||
* 新增: 一键编译并安装脚本
|
||||
* 新增: 后台安装结束后退出任务栏驻留
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (4.2.3~test4) stable; urgency=medium
|
||||
|
||||
* 修复: aptss 无法安装
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (4.2.3~test3) stable; urgency=medium
|
||||
|
||||
* 调整:打包时从 debian/changelog 自动获取构建版本号并写入关于窗口保证与deb一致
|
||||
* 新增:支持 DTK 5.6.4 关于对话框“版本特性”显示功能。目前只在deepin编译安装时开启
|
||||
* 修复:修复下载列表对话框中,点击某个 item 取消下载按钮后下载列表无法再次显示的问题
|
||||
* 修复:多个应用安装可能会出现某一个应用没有安装
|
||||
* 修复:修复下载按钮点击/双击/拖动时,主窗口动作与下载管理对话框动作同时触发问题
|
||||
* aptss 获取线路信息 转到从 d. 服务器获取
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (4.2.3~test2) stable; urgency=medium
|
||||
|
||||
* 调整:开启安装包加固
|
||||
* 添加:zh_TW翻译
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.2.3~test1) stable; urgency=medium
|
||||
|
||||
* 修复:因判断安装状态错误创建多个相同任务的bug
|
||||
* 测试中:尝试修复安装结束的闪退问题 https://gitee.com/deepin-community-store/spark-store/commit/cb093dcc2bb0a193db89aa0ce5f20ea9cc5d56eb
|
||||
* 修复:Deepin 显示开发者模式未开启
|
||||
* 修复:从托盘打开主窗口时透明度动画不流畅
|
||||
* 修复:主窗口关闭后,从托盘打开关于窗口会被主窗口遮挡
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Sun, 05 Feb 2023 23:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.2.2) stable; urgency=medium
|
||||
|
||||
* 调整:脚本应用的transhell支持转为source导入
|
||||
* 修复:ssinstall弹窗支持wayland
|
||||
* 新增:应用托盘,下载时候可以放心关闭窗口了
|
||||
* 新增:支持spk://search/内容 格式链接
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.2.1) stable; urgency=medium
|
||||
|
||||
* 调整:支持在安装前进行测试(ss-do-upgrade-worker),但是未实装到appinfo
|
||||
* 修复:因依赖不完全导致在LinuxMint下无法下载统计
|
||||
* 新增:脚本系列应用支持英文
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.2) stable; urgency=medium
|
||||
|
||||
* 调整:UOS开发者模式提示现在不会那么挤了
|
||||
* 修复:wayland下可正常弹出更新提示
|
||||
* 调整:dwine5标签的文案改为:Wine应用
|
||||
* 新增:更新软件时弹窗会显示正在更新的软件包名
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.2~test3) stable; urgency=medium
|
||||
|
||||
* 修复: aptss ssupdates
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.2~test2) stable; urgency=medium
|
||||
|
||||
* 修复: 420t1版本中ssinstall有时会重新下载软件包的问题
|
||||
* 新增: 安装前会对软件包安装进行dry run以判断是否能正确安装
|
||||
* 调整: aptss在进行任何操作前均检测是否存在Packages文件,若存在,则不进行ssupdate
|
||||
* 调整: 修改apt-fast源代码以指定conf位置为/tmp/apt-fast,这部分不再使用bwrap模拟
|
||||
* 新增: aptss检测Package文件支持分目录(目前指定为store)
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.2~test1) stable; urgency=medium
|
||||
|
||||
* 新增: aptss支持显示报错
|
||||
* 新增: aptss部分提示汉化
|
||||
* 修复: 修复部分情况下ssinstall实际未安装但是错误显示
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.1.2) stable; urgency=medium
|
||||
|
||||
* feat: 初步的wayland支持
|
||||
* feat: UOS下检测开发者模式是否开启,若未开启则拒绝安装
|
||||
* fix: 首页的捐赠页面在中文环境下显示中文
|
||||
* fix: 更新检测模块在aptss ssupdate操作失败后现在会正确地移除锁而不是错误的残留锁。
|
||||
* chore: ssinstall现在拒绝安装验证失败的包,审核操作现在需要改用ssaudit
|
||||
* fix: Ubuntu下下载列表无法关闭
|
||||
* fix: 修复进入详情页时焦点默认在分享链接按钮上的问题
|
||||
* fix: 修复特定情况下的内存泄漏问题
|
||||
* fix: 适配c11代码规范,消除qt编译警告
|
||||
* fix: 默认服务器域名指向cdn域名
|
||||
* fix: 消除内部函数的无用变量,限制作用域
|
||||
* feat: aptss 除ssupdate外的操作时候如果检测到存在源文件存在则不再重复获取
|
||||
* fix: 修复在apt list锁被锁定的时候异常弹出有更新可用
|
||||
* chore: 去除安装依赖:g++
|
||||
* fix: 修复下载列表中进度提示文字显示不完整的问题
|
||||
* feat: ssinstall支持从单独文件夹中校验软件包
|
||||
* feat: 支持分单文件夹下载。具体内容参见:https://gitee.com/deepin-community-store/repo_auto_update_script/blob/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list
|
||||
* info: 非常感谢 @jwyh 对星火商店代码仓库设计了很多标准,参见 https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo?id=%e6%9b%b4%e6%96%b0%e6%97%a5%e5%bf%97%e8%a7%84%e5%88%99 ,不过shenmo是自由的
|
||||
|
||||
|
||||
* chore: 添加 Application 类,继承 DApplication,将 main 函数中设置属性、关于信息等操作移至 Application 构造函数中进行
|
||||
* chore: 添加 setOrganizationName 操作,设置组织名称为 spark-union,与 SWRT 保持一致
|
||||
* chore: 设置组织名称后,QStandardPaths::AppConfigLocation 等路径相应改变,修改所有配置文件和缓存文件路径
|
||||
* chore: 关于对话框设置父对象后,对话框背景色受主窗口样式表影响,移动部分控件样式表设置方式与位置
|
||||
* chore: 去除 .pro 文件中无效的更新翻译文件脚本调用,整理 .pro 文件,添加编译时更新 ts 文件脚本调用
|
||||
* chore: 继续修复偶现关闭客户端时崩溃问题(疑似 aria2c 进程未启动,pid 未初始化为随机值,执行 kill 操作时未判断导致)
|
||||
* chore: 新增编译依赖,测试安装时不会出现报错
|
||||
* chore: 暂时去除没有意义的 DBus 接口,使用 DGuiApplicationHelper::newProcessInstance 获取新进程的启动参数
|
||||
* chore: 更新翻译文件,去除已经不存在的翻译
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.1.2~test2) stable; urgency=medium
|
||||
|
||||
* feat: ssinstall支持从单独文件夹中校验软件包
|
||||
* feat: 支持分单文件夹下载。具体内容参见:https://gitee.com/deepin-community-store/repo_auto_update_script/blob/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list
|
||||
* info: 非常感谢 @jwyh 对星火商店代码仓库设计了很多标准,参见 https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo ,不过shenmo是自由的
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.1.2~test1) stable; urgency=medium
|
||||
|
||||
* feat: 初步的wayland支持
|
||||
* feat: UOS下检测开发者模式是否开启,若未开启则拒绝安装
|
||||
* fix: 首页的捐赠页面在中文环境下显示中文
|
||||
* fix: 更新检测模块在aptss ssupdate操作失败后现在会正确地移除锁而不是错误的残留锁。
|
||||
* chore: ssinstall现在拒绝安装验证失败的包,审核操作现在需要改用ssaudit
|
||||
* fix: Ubuntu下下载列表无法关闭
|
||||
* fix: 修复进入详情页时焦点默认在分享链接按钮上的问题
|
||||
* fix: 修复特定情况下的内存泄漏问题
|
||||
* fix: 适配c11代码规范,消除qt编译警告
|
||||
* fix: 默认服务器域名指向cdn域名
|
||||
* fix: 消除内部函数的无用变量,限制作用域
|
||||
* feat: aptss 除ssupdate外的操作时候如果检测到存在源文件存在则不再重复获取
|
||||
* fix: 修复在apt list锁被锁定的时候异常弹出有更新可用
|
||||
* chore: 去除安装依赖:g++
|
||||
* fix: 修复下载列表中进度提示文字显示不完整的问题
|
||||
|
||||
|
||||
* chore: 添加 Application 类,继承 DApplication,将 main 函数中设置属性、关于信息等操作移至 Application 构造函数中进行
|
||||
* chore: 添加 setOrganizationName 操作,设置组织名称为 spark-union,与 SWRT 保持一致
|
||||
* chore: 设置组织名称后,QStandardPaths::AppConfigLocation 等路径相应改变,修改所有配置文件和缓存文件路径
|
||||
* chore: 关于对话框设置父对象后,对话框背景色受主窗口样式表影响,移动部分控件样式表设置方式与位置
|
||||
* chore: 去除 .pro 文件中无效的更新翻译文件脚本调用,整理 .pro 文件,添加编译时更新 ts 文件脚本调用
|
||||
* chore: 继续修复偶现关闭客户端时崩溃问题(疑似 aria2c 进程未启动,pid 未初始化为随机值,执行 kill 操作时未判断导致)
|
||||
* chore: 新增编译依赖,测试安装时不会出现报错
|
||||
* chore: 暂时去除没有意义的 DBus 接口,使用 DGuiApplicationHelper::newProcessInstance 获取新进程的启动参数
|
||||
* chore: 更新翻译文件,去除已经不存在的翻译
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.1.1) stable; urgency=medium
|
||||
|
||||
* fix:更新失效
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.1.0) stable; urgency=medium
|
||||
|
||||
* feat: 现在可以支持UOS签名包问题了
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.0.1) stable; urgency=medium
|
||||
|
||||
* feat: 提升Ubuntu下的显示效果
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.0.0) stable; urgency=medium
|
||||
|
||||
* feat: 修复了成吨的bug后开始正式版
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.0.0~test2) stable; urgency=medium
|
||||
|
||||
* feat: 修复了成吨的bug后开始公测
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (4.0.0~test1) stable; urgency=medium
|
||||
|
||||
* feat: 柚子过来补充一下啦
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.4~test1) stable; urgency=medium
|
||||
|
||||
* feat: aptss不再尝试安装apt-fast,转而自带
|
||||
* chore: 删除password-check模块
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3.3) stable; urgency=medium
|
||||
|
||||
* feat: 首页链接调用浏览器打开
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
0spark-store (3.3.3~test5) stable; urgency=medium
|
||||
|
||||
spark-store (3.3.3~test5) stable; urgency=medium
|
||||
|
||||
* 修复可能的内存泄漏问题
|
||||
* 修复应用搜索为空但仍显示上一次搜索结果的问题
|
||||
* 修复动画加载延后的问题
|
||||
* 修复统计下载量卡主渲染线程的问题
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3.3~test4) stable; urgency=medium
|
||||
|
||||
* Enable i386 arch support by default
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3.3~test3) stable; urgency=medium
|
||||
|
||||
@@ -70,11 +275,13 @@ spark-store (3.3.3~test3) stable; urgency=medium
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3.3~test2) stable; urgency=medium
|
||||
|
||||
* bug fix: 更新和检查更新出错时不报错.此更新需要一个推送
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3.3~test1) stable; urgency=medium
|
||||
|
||||
@@ -82,132 +289,137 @@ spark-store (3.3.3~test1) stable; urgency=medium
|
||||
* 图形环境中所有root权限的组件剥离到cli(可用于deepin 23 daily,只保证商店本体正常运作,不处理安装依赖不满足)
|
||||
* 文案更改:更新检查-->检查更新
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3.1~test1) stable; urgency=medium
|
||||
|
||||
* 安装时不再需要联网
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3.0.4) stable; urgency=medium
|
||||
|
||||
* 为减轻服务器压力,不再单独更新某一个应用,而是作为整体更新
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.3.0.3) stable; urgency=medium
|
||||
|
||||
* 回滚 更新中行为到进度条而不是实时输出
|
||||
* 更新应用时显示正在更新哪个应用
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.3.0.2) stable; urgency=medium
|
||||
|
||||
* 修复 pkexec未执行
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.3.0.1) stable; urgency=medium
|
||||
|
||||
* 修复 检查更新的更新进程未实际运行
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.3) stable; urgency=medium
|
||||
|
||||
* 修复 检查更新 未刷新软件源
|
||||
* 把检查更新单独拿出作为左列
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3~test3) stable; urgency=medium
|
||||
|
||||
* 把检查更新加入免密码
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3~test2) stable; urgency=medium
|
||||
|
||||
* 更新检测功能全部更改到zenity
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.3~test1) stable; urgency=medium
|
||||
|
||||
* zenity,选择可更新应用
|
||||
* 自动更新检测现在会跳过hold
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.2.4) stable; urgency=medium
|
||||
|
||||
* 修改tag相关的文案内容:wine相关环境已可自动配置了
|
||||
* 准备发版
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.2.4~test4) stable; urgency=medium
|
||||
|
||||
* 现在在商店启动后点击spk链接仍会正常启动 https://gitee.com/deepin-community-store/spark-store/commit/dd6780d636042bf12d77414e6f1552cc7d1ed24c
|
||||
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.2.4~test3) stable; urgency=medium
|
||||
|
||||
* 发版,合入到master
|
||||
* 翻译完毕
|
||||
* 合入先前的各项改动,为:客户端集成投稿器入口和支持,修复:安装依赖时间较长时错误地返回“安装完毕”结果,现在客户端版本更新时不关闭免密码登录,UOS安装进程合并正常aptss中
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.2.4~test2) stable; urgency=medium
|
||||
|
||||
* 客户端集成投稿器入口和支持
|
||||
* 修复:安装依赖时间较长时错误地返回“安装完毕”结果
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.2.4~test1) stable; urgency=medium
|
||||
|
||||
* 客户端更新时不关闭免密码登录
|
||||
* UOS合并正常aptss中
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.2.3) stable; urgency=medium
|
||||
|
||||
* 客户端异常退出时仍然占用资源问题修复
|
||||
* 降低dtk依赖版本,Debian 11 stable可直接安装
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.2.2) stable; urgency=medium
|
||||
|
||||
* aptss will now refresh the system source before doing install, policy....etc
|
||||
* 启动客户端GPU加速支持
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.2.1) stable; urgency=medium
|
||||
|
||||
* 更改刷新系统源的功能
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.2) stable; urgency=medium
|
||||
|
||||
@@ -220,20 +432,22 @@ spark-store (3.2) stable; urgency=medium
|
||||
* 修复 在更新检测设置中的是否开启自动更新检测设置项的显示不随开启或关闭状态改变
|
||||
* 修复 在检测更新时临时降低优先级到100,防止系统中有且版本一致的包被反复来回更新
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.1.6) stable; urgency=medium
|
||||
|
||||
* 修复部分情况下无法选中正确的镜像源的问题
|
||||
* 合入3.1.5以来的各项修改
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.1.5-5) stable; urgency=medium
|
||||
|
||||
* 从所有镜像源中选取最快镜像源高速下载
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.1.5-4) stable; urgency=medium
|
||||
@@ -243,53 +457,54 @@ spark-store (3.1.5-4) stable; urgency=medium
|
||||
* 更新检测服务优化:从分体改为一体
|
||||
* aptss 支持自动补全
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.1.5-3) stable; urgency=medium
|
||||
|
||||
* 包内自带密钥
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.1.5-2) stable; urgency=medium
|
||||
|
||||
* 下载软件时跳过获取大小,修复部分软件无法下载的问题
|
||||
* 修复 获取key时出错,指定使用http1.1
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.1.5-1) stable; urgency=medium
|
||||
|
||||
* 改变更新策略,UOS也下载加速,但是安装不加速
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.1.5) stable; urgency=medium
|
||||
|
||||
* 改变更新策略,现在支持应用在更新时引入新依赖
|
||||
* ss-apt-fast现在默认允许降级,以与apt使用体验一致
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.1.4-2) stable; urgency=medium
|
||||
|
||||
* 客户端下载使用metalink来支持bt下载加速
|
||||
* 修复使用更新和安装设置更新商店本体时出错
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
spark-store (3.1.4-1) stable; urgency=medium
|
||||
|
||||
* 安装脚本和检测更新脚本检查网络时间超时时间延长至5s
|
||||
* 修复:ssinstall在没有安装apt-fast的情况下首次安装需要依赖的软件时安装失败
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.1.4) stable; urgency=medium
|
||||
|
||||
@@ -302,6 +517,7 @@ spark-store (3.1.4) stable; urgency=medium
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.1.3-2) stable; urgency=medium
|
||||
|
||||
* 调整 现在与系统更新分开,不再导致更新失败
|
||||
@@ -310,17 +526,17 @@ spark-store (3.1.3-2) stable; urgency=medium
|
||||
* 修改ss-apt-fast的策略,现在除了安装,下载和更新都改用apt
|
||||
* ssinstall 现在也会在不适用ss-apt-fast的时候模拟源了(针对UOS)
|
||||
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.1.3-1) stable; urgency=medium
|
||||
|
||||
* 修复 下载提前退出
|
||||
* 移除 下载量显示
|
||||
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.1.3) stable; urgency=medium
|
||||
|
||||
* Now uses aria2 to download softwares form all mirrors
|
||||
@@ -332,6 +548,7 @@ spark-store (3.1.3) stable; urgency=medium
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
spark-store (3.1.2) stable; urgency=medium
|
||||
|
||||
* Now let apt-fast method support all mirrors
|
||||
@@ -340,8 +557,6 @@ spark-store (3.1.2) stable; urgency=medium
|
||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
|
||||
|
||||
spark-store (3.1.1) stable; urgency=medium
|
||||
|
||||
* Now will delete the link of policy file after uninstall or upgrade
|
||||
@@ -350,8 +565,6 @@ spark-store (3.1.1) stable; urgency=medium
|
||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
|
||||
|
||||
spark-store (3.1.0) stable; urgency=medium
|
||||
|
||||
* Add pkexec policy: ssinstall. Only will be enabled after permitted.
|
||||
@@ -360,7 +573,6 @@ spark-store (3.1.0) stable; urgency=medium
|
||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
|
||||
spark-store (3.0.3-13) stable; urgency=medium
|
||||
|
||||
* Update the ssinstall script. Now support apt-fast and will temporarily increase the spark store source priority to 500 to make depends install correctly
|
||||
@@ -370,7 +582,6 @@ spark-store (3.0.3-13) stable; urgency=medium
|
||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
|
||||
spark-store (3.0.3-12) stable; urgency=medium
|
||||
|
||||
* Rollback to use DApplication::loadDXcbPlugin() to make titlebar behave normally in ubuntu
|
||||
@@ -380,8 +591,6 @@ spark-store (3.0.3-12) stable; urgency=medium
|
||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
|
||||
|
||||
spark-store (3.0.3-11) stable; urgency=medium
|
||||
|
||||
* Now support autoupdate
|
||||
@@ -389,8 +598,6 @@ spark-store (3.0.3-11) stable; urgency=medium
|
||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
|
||||
|
||||
spark-store (3.0.3-10) stable; urgency=medium
|
||||
|
||||
* Now also compile dstore patch
|
||||
@@ -403,3 +610,4 @@ spark-store (3.0.3-9) stable; urgency=medium
|
||||
* Support dpkg-buildpackage
|
||||
|
||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
||||
|
||||
|
||||
18
debian/control
vendored
18
debian/control
vendored
@@ -14,12 +14,16 @@ Build-Depends:
|
||||
libdtkcore-dev(>=5.0),
|
||||
libdtkgui-dev(>=5.0),
|
||||
libdtkwidget-dev(>=5.0),
|
||||
libqt5svg5-dev,
|
||||
qttools5-private-dev,
|
||||
qtwebengine5-dev
|
||||
Standards-Version: 3.0
|
||||
qtwebengine5-dev,
|
||||
qtwayland5,
|
||||
qtwayland5-dev-tools,
|
||||
gcc,
|
||||
g++
|
||||
Standards-Version: 4.0.0
|
||||
Homepage: https://www.spark-app.store/
|
||||
|
||||
|
||||
Package: spark-store
|
||||
Architecture: any
|
||||
Depends:${shlibs:Depends}, ${misc:Depends},
|
||||
@@ -28,18 +32,18 @@ Depends:${shlibs:Depends}, ${misc:Depends},
|
||||
libqt5widgets5,
|
||||
libqt5network5,
|
||||
libqt5concurrent5,
|
||||
qtwayland5,
|
||||
libdtkcore5,
|
||||
libdtkgui5,
|
||||
libdtkwidget5,
|
||||
curl,
|
||||
openssl,
|
||||
libssl-dev,
|
||||
dde-qt5integration,
|
||||
bubblewrap,
|
||||
aria2,
|
||||
gcc,
|
||||
g++,
|
||||
zenity
|
||||
zenity,
|
||||
libc6-dev,
|
||||
policykit-1
|
||||
Description: Spark Store
|
||||
A community powered app store, based on DTK.
|
||||
Recommends: apt-fast
|
||||
|
||||
15
debian/rules
vendored
15
debian/rules
vendored
@@ -1,13 +1,14 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
export QT_SELECT=5
|
||||
export QT_SELECT = qt5
|
||||
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||
include /usr/share/dpkg/default.mk
|
||||
|
||||
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
|
||||
DH_AUTO_ARGS = --parallel --buildsystem=qmake
|
||||
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
#export DH_VERBOSE=1
|
||||
#export DH_VERBOSE = 1
|
||||
|
||||
%:
|
||||
dh $@ --parallel
|
||||
@@ -17,20 +18,18 @@ override_dh_auto_clean:
|
||||
|
||||
override_dh_auto_configure:
|
||||
mkdir -p $(CURDIR)/build
|
||||
|
||||
dh_auto_configure MAKEFLAGS=-j$(JOBS) -- spark-store-project.pro \
|
||||
|
||||
qmake BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
|
||||
-spec linux-g++ CONFIG+=qtquickcompiler \
|
||||
-o $(CURDIR)/build/
|
||||
|
||||
|
||||
override_dh_auto_build:
|
||||
make -C $(CURDIR)/build -j$(JOBS)
|
||||
make MAKEFLAGS="$(MAKEFLAGS)" -C $(CURDIR)/build
|
||||
|
||||
override_dh_auto_install:
|
||||
make -C $(CURDIR)/build install \
|
||||
INSTALL_ROOT=$(CURDIR)/debian/spark-store
|
||||
|
||||
|
||||
# Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
|
||||
# Qt Mutidedia lib will ref to network libraray.
|
||||
override_dh_shlibdeps:
|
||||
|
||||
52
debian/spark-store.postinst
vendored
52
debian/spark-store.postinst
vendored
@@ -1,59 +1,57 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
case "$1" in
|
||||
configure)
|
||||
|
||||
# Enable i386 arch
|
||||
echo "Enable i386 arch..."
|
||||
dpkg --add-architecture i386
|
||||
case `arch` in
|
||||
x86_64)
|
||||
echo "Enabling i386 arch..."
|
||||
dpkg --add-architecture i386
|
||||
;;
|
||||
*)
|
||||
echo "Not amd64, skip enable i386 arch"
|
||||
;;
|
||||
esac
|
||||
|
||||
# config for aptss
|
||||
mkdir -p /etc/aptss/sources.list.d
|
||||
ln -s -f /etc/apt/sources.list /etc/aptss/sources.list
|
||||
|
||||
|
||||
# Remove the sources.list file
|
||||
if [ -e /etc/apt/sources.list.d/sparkstore.list ];then
|
||||
rm /etc/apt/sources.list.d/sparkstore.list
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Remove the sources.list file
|
||||
rm -f /etc/apt/sources.list.d/sparkstore.list
|
||||
|
||||
# Check if /usr/local/bin existed
|
||||
mkdir -p /usr/local/bin
|
||||
|
||||
# Create symbol links for binary files
|
||||
ln -s -f /opt/durapps/spark-store/bin/ussinstall /usr/local/bin/ussinstall
|
||||
ln -s -f /opt/durapps/spark-store/bin/ussremove /usr/local/bin/ussremove
|
||||
ln -s -f /opt/durapps/spark-store/bin/spark-store /usr/local/bin/spark-store
|
||||
ln -s -f /opt/durapps/spark-store/bin/ssinstall /usr/local/bin/ssinstall
|
||||
ln -s -f /opt/durapps/spark-store/bin/ssaudit /usr/local/bin/ssaudit
|
||||
ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/local/bin/spark-dstore-patch
|
||||
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast
|
||||
|
||||
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
|
||||
|
||||
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
|
||||
|
||||
# Create symbol links for SSINSTALL
|
||||
ln -s -f /opt/durapps/spark-store/bin/auto-install-policy/store.spark-app.ssinstall.policy /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
|
||||
|
||||
# Compile sender module
|
||||
echo "Compiling the Sender module..."
|
||||
|
||||
gcc /opt/durapps/spark-store/bin/ss-feedback/sender-d.sh.c -o /opt/durapps/spark-store/bin/ss-feedback/sender-d
|
||||
gcc -Wformat -Wformat-security -Werror=format-security /opt/durapps/spark-store/bin/ss-feedback/sender-d_$(arch).sh.c -o /opt/durapps/spark-store/bin/ss-feedback/sender-d
|
||||
|
||||
# Install key
|
||||
mkdir -p /tmp/spark-store-install/
|
||||
cp -f /opt/durapps/spark-store/bin/spark-store.asc /tmp/spark-store-install/spark-store.asc
|
||||
cp -f /opt/durapps/spark-store/bin/spark-store.asc /tmp/spark-store-install/spark-store.asc
|
||||
gpg --dearmor /tmp/spark-store-install/spark-store.asc
|
||||
cp -f /tmp/spark-store-install/spark-store.asc.gpg /etc/apt/trusted.gpg.d/spark-store.gpg
|
||||
|
||||
|
||||
|
||||
# Run apt update to avoid users being fucked up by the non-exist dependency problem
|
||||
# Run apt update to avoid users being fucked up by the non-exist dependency problem
|
||||
# Now abandoned as aptss now run ssupdate everytime
|
||||
#aptss ssupdate
|
||||
|
||||
|
||||
# Start upgrade detect service
|
||||
systemctl enable spark-update-notifier
|
||||
service spark-update-notifier start
|
||||
|
||||
systemctl start spark-update-notifier
|
||||
|
||||
# Update certain caches
|
||||
update-icon-caches /usr/share/icons/hicolor || true
|
||||
@@ -62,12 +60,10 @@ case "$1" in
|
||||
update-mime-database /usr/share/mime || true
|
||||
|
||||
# Send email for statistics
|
||||
# /tmp/spark-store-install/feedback.sh
|
||||
#/tmp/spark-store-install/feedback.sh
|
||||
|
||||
# Remove temp dir
|
||||
rm -rf /tmp/spark-store-install
|
||||
|
||||
|
||||
;;
|
||||
|
||||
triggered)
|
||||
|
||||
2
debian/spark-store.postrm
vendored
2
debian/spark-store.postrm
vendored
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
# Update certain caches
|
||||
update-icon-caches /usr/share/icons/hicolor || true
|
||||
|
||||
76
debian/spark-store.prerm
vendored
76
debian/spark-store.prerm
vendored
@@ -1,47 +1,51 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
function notify-send()
|
||||
{
|
||||
#Detect the user using such display
|
||||
local user=$(who | awk '{print $1}' | head -n 1)
|
||||
|
||||
if [ "$1" = "remove" ] || [ "$1" = "purge" ];then
|
||||
# Remove residual symbol links
|
||||
rm /usr/local/bin/spark-store
|
||||
rm /usr/local/bin/ssinstall
|
||||
rm /usr/local/bin/spark-dstore-patch
|
||||
rm /usr/local/bin/ussinstall
|
||||
rm /usr/local/bin/ussremove
|
||||
rm /usr/local/bin/ss-apt-fast
|
||||
rm /usr/bin/aptss
|
||||
#Detect the id of the user
|
||||
local uid=$(id -u $user)
|
||||
|
||||
rm -rf /etc/aptss/
|
||||
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "$@"
|
||||
}
|
||||
|
||||
# Remove Sender module
|
||||
rm /opt/durapps/spark-store/bin/ss-feedback/sender-d
|
||||
if [ "$1" = "remove" ] || [ "$1" = "purge" ] ; then
|
||||
# Remove residual symbol links
|
||||
rm -f /usr/local/bin/spark-store
|
||||
rm -f /usr/local/bin/ssinstall
|
||||
rm -f /usr/local/bin/ssaudit
|
||||
rm -f /usr/local/bin/spark-dstore-patch
|
||||
rm -f /usr/local/bin/ss-apt-fast
|
||||
rm -f /usr/bin/aptss
|
||||
|
||||
# Remove residual symbol links to stop upgrade detect if exist
|
||||
if [ -e /etc/xdg/autostart/spark-update-notifier.desktop ];then
|
||||
rm /etc/xdg/autostart/spark-update-notifier.desktop
|
||||
fi
|
||||
rm -rf /etc/aptss/
|
||||
|
||||
# Shutdown services
|
||||
service spark-update-notifier stop
|
||||
# Remove Sender module
|
||||
rm -f /opt/durapps/spark-store/bin/ss-feedback/sender-d
|
||||
|
||||
# Stop update detect service
|
||||
systemctl disable spark-update-notifier
|
||||
# Remove residual symbol links to stop upgrade detect
|
||||
rm -f /etc/xdg/autostart/spark-update-notifier.desktop
|
||||
|
||||
# Shutdown services
|
||||
systemctl stop spark-update-notifier
|
||||
# Stop update detect service
|
||||
systemctl disable spark-update-notifier
|
||||
|
||||
# Clean the auto install polkit file if exist
|
||||
rm -f /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
|
||||
|
||||
# Clean the auto install polkit file if exist
|
||||
if [ -f "/usr/share/polkit-1/actions/store.spark-app.ssinstall.policy" ] ; then
|
||||
rm /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
|
||||
fi
|
||||
|
||||
# Remove gpg key file
|
||||
if [ -f "/etc/apt/trusted.gpg.d/spark-store.gpg" ] ; then
|
||||
rm /etc/apt/trusted.gpg.d/spark-store.gpg
|
||||
fi
|
||||
|
||||
apt-key del '9D9A A859 F750 24B1 A1EC E16E 0E41 D354 A29A 440C'
|
||||
|
||||
# Remove gpg key file
|
||||
rm -f /etc/apt/trusted.gpg.d/spark-store.gpg
|
||||
apt-key del '9D9A A859 F750 24B1 A1EC E16E 0E41 D354 A29A 440C'
|
||||
else
|
||||
|
||||
echo "非卸载操作,不进行配置清理"
|
||||
|
||||
echo "非卸载操作,不进行配置清理"
|
||||
|
||||
if [ ! -z "`pidof spark-store`" ];then
|
||||
echo "关闭已有 spark-store.."
|
||||
notify-send "正在升级星火商店" "请在升级结束后重启星火商店" -i spark-store
|
||||
killall spark-store
|
||||
else
|
||||
echo "继续安装 spark-store.."
|
||||
fi
|
||||
fi
|
||||
|
||||
44
patchs/README.md
Normal file
44
patchs/README.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# 补丁操作说明
|
||||
|
||||
- 克隆与构建本项目
|
||||
|
||||
> 用于 zinface-community-cmake-build-system.patch 补丁化构建方式
|
||||
|
||||
```shell
|
||||
git clone https://gitee.com/deepin-community-store/spark-store
|
||||
cd spark-store
|
||||
git am < patchs/zinface-community-cmake-build-system.patch
|
||||
make package
|
||||
sudo dpkg -i build/*.deb
|
||||
```
|
||||
|
||||
|
||||
- 在应用补丁时,并对补丁进行的更新操作
|
||||
|
||||
```shell
|
||||
# 切换到一个新的分支,即可开始进行补丁内的更新提交
|
||||
git checkout -b cmake-build-system
|
||||
|
||||
# origin/dev 表示本仓库的 dev 开发分支
|
||||
# 在应用过补丁,并产生了新的提交,即可在当前所在补丁更新分支内
|
||||
# 相对基于 origin/dev 为参考,目前所包含的所有最新提交内容将生成为一个补丁文件(其中尾部为增量更新)
|
||||
git format-patch --stdout origin/dev > patchs/zinface-community-cmake-build-system.patch
|
||||
|
||||
# 最后,回到你的原 dev 分支,将被改变的补丁文件进行提交
|
||||
# 在推送完成后,即可放弃你在 cmake-build-system 分支中所有产生的内容(因为都已经进入补丁)
|
||||
```
|
||||
|
||||
- 一些注意事项
|
||||
|
||||
```shell
|
||||
# 在不了解补丁时,你需要认识一下补丁,但补丁与补丁之间有着不同的用法
|
||||
# 本 patchs/zinface-community-cmake-build-system.patch 补丁为 cmake 化构建
|
||||
|
||||
# 关于补丁的一些方面
|
||||
# 1. 首先你需要了解 git 是什么,以及简单的使用
|
||||
# 2. 你需要了解补丁是什么,以及简单的使用(应用补丁)
|
||||
# 3. 你需要了解如何创建一个补丁,最基本的就是相对于旧目标分支,将本分区新增的提交进行导出为补丁
|
||||
# 4. 你可能只会将单个提交、或多个提交导出为补丁,但这还不够,你需要具有绝对的对于补丁的理解
|
||||
# 5. 对于不同的目的补丁,应该是多个 patch 文件存在的形式
|
||||
# 6. 最后,不管在什么时候,你在应用补丁前,你应该考虑是否应用到当前分支?为什么不切换到一个新的分支呢?
|
||||
```
|
||||
@@ -1,7 +1,7 @@
|
||||
From 9d1714ec7ceb3748bd151af059389ed10d37e676 Mon Sep 17 00:00:00 2001
|
||||
From 2d49950909e0327b0ad72e008cb82ac97b7bae0e Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Sun, 11 Dec 2022 22:27:23 +0800
|
||||
Subject: [PATCH 1/5] =?UTF-8?q?repo:=20=E4=B8=80=E6=AC=A1=E6=80=A7?=
|
||||
Subject: [PATCH 01/11] =?UTF-8?q?repo:=20=E4=B8=80=E6=AC=A1=E6=80=A7?=
|
||||
=?UTF-8?q?=E5=AF=BC=E5=85=A5=20spark=20=E9=AA=A8=E6=9E=B6=E4=BB=A5?=
|
||||
=?UTF-8?q?=E5=8F=98=E4=B8=BA=20cmake=20=E6=9E=84=E5=BB=BA?=
|
||||
MIME-Version: 1.0
|
||||
@@ -1789,10 +1789,10 @@ index 0000000..0fa070b
|
||||
2.20.1
|
||||
|
||||
|
||||
From 1e1cb19995536d74626960ae863bf4c5cd9e3a4b Mon Sep 17 00:00:00 2001
|
||||
From d2524f967848e6ba0d2c8a097183264d0d197d68 Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Sun, 11 Dec 2022 22:37:26 +0800
|
||||
Subject: [PATCH 2/5] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20deb=20?=
|
||||
Subject: [PATCH 02/11] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20deb=20?=
|
||||
=?UTF-8?q?=E5=AE=89=E8=A3=85=E8=84=9A=E6=9C=AC=E7=9A=84=E9=97=AE=E9=A2=98?=
|
||||
=?UTF-8?q?=EF=BC=8C=E5=AE=8C=E6=88=90=20cmake=20=E5=8C=96=E6=9E=84?=
|
||||
=?UTF-8?q?=E5=BB=BA?=
|
||||
@@ -1856,10 +1856,10 @@ index 2ab24e7..38ad2d7 100644
|
||||
2.20.1
|
||||
|
||||
|
||||
From 4f07b34bc268bc3c49ef1c51c524d50ccbbf6d07 Mon Sep 17 00:00:00 2001
|
||||
From 7cd97a939b63143921936b9db3978d14f18a4f33 Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Mon, 12 Dec 2022 00:50:01 +0800
|
||||
Subject: [PATCH 3/5] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20Spark=20?=
|
||||
Subject: [PATCH 03/11] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20Spark=20?=
|
||||
=?UTF-8?q?=E6=9E=84=E5=BB=BA=20=E4=B8=8E=20CMake=20=E6=9E=84=E5=BB=BA?=
|
||||
=?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=A2=84=E8=A7=88=E6=96=87=E6=A1=A3?=
|
||||
MIME-Version: 1.0
|
||||
@@ -2184,10 +2184,10 @@ index 0000000..a807009
|
||||
2.20.1
|
||||
|
||||
|
||||
From cb59139fcfd74b530a14f2a987aa38d28d403225 Mon Sep 17 00:00:00 2001
|
||||
From bb128568ab7d1463c0002ffff470ad5c93364c99 Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Thu, 15 Dec 2022 19:59:46 +0800
|
||||
Subject: [PATCH 4/5] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
|
||||
Subject: [PATCH 04/11] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
|
||||
=?UTF-8?q?=E4=BA=8E=20Qt5=20Svg=20=E4=BE=9D=E8=B5=96=E7=9A=84=E6=9E=84?=
|
||||
=?UTF-8?q?=E5=BB=BA=E5=86=85=E5=AE=B9?=
|
||||
MIME-Version: 1.0
|
||||
@@ -2236,10 +2236,10 @@ index b56399f..67e29b6 100644
|
||||
2.20.1
|
||||
|
||||
|
||||
From 72e5ca47cef718cdbd4ea45134d574874fb43ba9 Mon Sep 17 00:00:00 2001
|
||||
From 877a52f4b753f55e087a6c58794d690fabb6ddbb Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Mon, 19 Dec 2022 02:58:17 +0800
|
||||
Subject: [PATCH 5/5] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
|
||||
Subject: [PATCH 05/11] =?UTF-8?q?repo:=20=E6=9B=B4=E6=96=B0=E7=94=A8?=
|
||||
=?UTF-8?q?=E4=BA=8E=E6=94=AF=E6=8C=81=20BaseWidgetOpacity=20=E5=9F=BA?=
|
||||
=?UTF-8?q?=E7=A1=80=E7=B1=BB=E7=9A=84=E6=9E=84=E5=BB=BA?=
|
||||
MIME-Version: 1.0
|
||||
@@ -2282,3 +2282,348 @@ index 14530e1..b5e32d8 100644
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From f89bb6a145f2a77fa0e1b55b3ad17ade69c53a69 Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Mon, 30 Jan 2023 20:48:25 +0800
|
||||
Subject: [PATCH 06/11] =?UTF-8?q?spark:=20=E5=88=9B=E5=BB=BA=E6=96=B0?=
|
||||
=?UTF-8?q?=E7=9A=84=E6=A8=A1=E5=9D=97=E7=94=A8=E4=BA=8E=20debian/changelo?=
|
||||
=?UTF-8?q?g=20=E7=9A=84=E7=89=88=E6=9C=AC=E5=8F=B7=E9=87=8D=E5=86=99?=
|
||||
=?UTF-8?q?=E8=A7=84=E5=88=99?=
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
1. SparkDebianChangelogVersion.cmake
|
||||
在此文件中提供 spark_debian_changelog_override_version 宏:
|
||||
基于指定的 debian/changelog 文件并用于读取最新版本号并覆盖到项目版本
|
||||
|
||||
@Since: v4.0.0
|
||||
---
|
||||
CMakeLists.txt | 4 ++
|
||||
cmake/SparkDebianChangelogVersion.cmake | 58 +++++++++++++++++++++++++
|
||||
2 files changed, 62 insertions(+)
|
||||
create mode 100644 cmake/SparkDebianChangelogVersion.cmake
|
||||
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index b5e32d8..73221bc 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -11,6 +11,10 @@ include(cmake/SparkFindDtkConfig.cmake) # 提供了 target_link_dtk 用
|
||||
include(cmake/SparkTranslatorConfig.cmake) # 提供了 qt5 ts转qm 的操作,最终生成 SPARK_QM_TRANSLATIONS 变量用于构建可执行文件时参与编译
|
||||
include(cmake/SparkMacrosExtendConfig.cmake) # 使用了 spark_ 宏基于已提供的宏参数自动展开构建可执行目标文件
|
||||
include(cmake/SparkInstallMacrosConfig.cmake) # 提供了 spark_install 开头的 macro 宏用于安装 target、file、program、directory、changelog 等内容
|
||||
+include(cmake/SparkDebianChangelogVersion.cmake)# 提供了 spark_debian_ 开头的宏进行进行覆盖 PROJECT_VERSION
|
||||
+
|
||||
+# 在开始之前,使用项目中提供的 debian/changelog 进行重写本构建系统的 PROJECT_VERSION
|
||||
+spark_debian_changelog_override_version(debian/changelog)
|
||||
|
||||
# 资源文件路径
|
||||
set(QRC_SOURCES "src/assets/assets.qrc")
|
||||
diff --git a/cmake/SparkDebianChangelogVersion.cmake b/cmake/SparkDebianChangelogVersion.cmake
|
||||
new file mode 100644
|
||||
index 0000000..9d8bca2
|
||||
--- /dev/null
|
||||
+++ b/cmake/SparkDebianChangelogVersion.cmake
|
||||
@@ -0,0 +1,58 @@
|
||||
+# SparkDebianChangelogVersion
|
||||
+
|
||||
+# 尝试读取 debian/changelog 文件的第一行数据,并查找
|
||||
+# spark-store (4.2.2) stable; urgency=medium
|
||||
+# 将 (version) 信息应用用于 PROJECT_VERSION
|
||||
+
|
||||
+
|
||||
+macro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
|
||||
+ set(CHANGELOG_FILE_PATH ${_CHANGELOG_FILE_PATH})
|
||||
+ set(CHANGELOG_FILE_EXISTS FALSE)
|
||||
+
|
||||
+ # 首次判断,如果判断文件不存在,将尽可能的判断文件是存在的
|
||||
+ if(NOT EXISTS ${CHANGELOG_FILE_PATH})
|
||||
+
|
||||
+ # 在 CMake v3.19 起,可以使用 file(REAL_PATH <path> <out-var>) 进行获取 path 的绝对路径
|
||||
+ if(CMAKE_VERSION GREATER_EQUAL 3.19)
|
||||
+ file(REAL_PATH ${CHANGELOG_FILE_PATH} CHANGELOG_FILE_ABSOLUTE_PATH)
|
||||
+ if(EXISTS ${CHANGELOG_FILE_ABSOLUTE_PATH})
|
||||
+ set(CHANGELOG_FILE_EXISTS TRUE)
|
||||
+ set(CHANGELOG_FILE_PATH ${CHANGELOG_FILE_ABSOLUTE_PATH})
|
||||
+ endif(EXISTS ${CHANGELOG_FILE_ABSOLUTE_PATH})
|
||||
+ endif(CMAKE_VERSION GREATER_EQUAL 3.19)
|
||||
+
|
||||
+ # 第二次判断与处理 使用 file(SIZE) 方式
|
||||
+ if(NOT CHANGELOG_FILE_EXISTS)
|
||||
+ file(SIZE ${CHANGELOG_FILE_PATH} CHANGELOG_FILE_SIZE)
|
||||
+ if(CHANGELOG_FILE_SIZE GREATER 0)
|
||||
+ set(CHANGELOG_FILE_EXISTS TRUE)
|
||||
+ endif(CHANGELOG_FILE_SIZE GREATER 0)
|
||||
+ endif(NOT CHANGELOG_FILE_EXISTS)
|
||||
+
|
||||
+ # 第三次判断与处理 使用路径拼接方式
|
||||
+ if(NOT CHANGELOG_FILE_EXISTS)
|
||||
+ if(EXISTS ${CMAKE_SOURCE_DIR}/${CHANGELOG_FILE_PATH})
|
||||
+ set(CHANGELOG_FILE_PATH ${CMAKE_SOURCE_DIR}/${CHANGELOG_FILE_PATH})
|
||||
+ set(CHANGELOG_FILE_EXISTS TRUE)
|
||||
+ endif(EXISTS ${CMAKE_SOURCE_DIR}/${CHANGELOG_FILE_PATH})
|
||||
+ endif(NOT CHANGELOG_FILE_EXISTS)
|
||||
+ endif(NOT EXISTS ${CHANGELOG_FILE_PATH})
|
||||
+
|
||||
+ message("> V = ${CHANGELOG_FILE_PATH}")
|
||||
+ if(CHANGELOG_FILE_EXISTS)
|
||||
+ file(READ ${CHANGELOG_FILE_PATH} CHANGELOG_CONTENT LIMIT 20)
|
||||
+
|
||||
+ string(FIND ${CHANGELOG_CONTENT} "(" V_PRE) # +1 to V_BEGIN
|
||||
+ string(FIND ${CHANGELOG_CONTENT} ")" V_END)
|
||||
+
|
||||
+ math(EXPR V_BEGIN "${V_PRE}+1")
|
||||
+ math(EXPR V_LENGTH "${V_END}-${V_BEGIN}")
|
||||
+
|
||||
+ string(SUBSTRING ${CHANGELOG_CONTENT} ${V_BEGIN} ${V_LENGTH} V)
|
||||
+
|
||||
+ message("> V = ${CHANGELOG_CONTENT}")
|
||||
+ message("> V = [${V}]")
|
||||
+
|
||||
+ set(PROJECT_VERSION ${V})
|
||||
+ endif(CHANGELOG_FILE_EXISTS)
|
||||
+endmacro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From b26bac7572ab7477ab4b94174fbdece759be8bc7 Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Mon, 30 Jan 2023 21:23:15 +0800
|
||||
Subject: [PATCH 07/11] =?UTF-8?q?spark:=20=E5=AF=B9=20SparkDebianChangelog?=
|
||||
=?UTF-8?q?Version.cmake=20=E6=A8=A1=E5=9D=97=E7=9A=84=E6=89=A9=E5=B1=95?=
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
1. 增加 SPARK_OVERRIDE_VERSION 的文件输出
|
||||
以解决 Makefile 中无法明确多个 deb 包时无法确定最新版本的情况
|
||||
---
|
||||
Makefile | 15 +++++++++++++--
|
||||
cmake/SparkDebianChangelogVersion.cmake | 1 +
|
||||
2 files changed, 14 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index c673c76..81ca078 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -8,6 +8,17 @@ SUFFIX=_$(OSID)$(OSRELEASE)
|
||||
endif
|
||||
|
||||
PROJECT_NAME=spark-store
|
||||
+PROJECT_VERSION=*
|
||||
+
|
||||
+ifneq ($(wildcard build/SPARK_OVERRIDE_VERSION),)
|
||||
+SPARK_OVERRIDE_VERSION=`cat build/SPARK_OVERRIDE_VERSION`
|
||||
+.PHONY: override-version
|
||||
+override-version:
|
||||
+ @echo $(SPARK_OVERRIDE_VERSION)
|
||||
+ @echo "wildcard - good: $(wildcard build/SPARK_OVERRIDE_VERSION)"
|
||||
+ @echo "wildcard - bad.: $(wildcard build/SPARK_OVERRIDE_VERSIONS)"
|
||||
+PROJECT_VERSION=$(SPARK_OVERRIDE_VERSION)-
|
||||
+endif
|
||||
|
||||
all:
|
||||
mkdir -p build
|
||||
@@ -44,7 +55,7 @@ debian-build-scripts:
|
||||
package: release debian-build-scripts
|
||||
cd build && make package
|
||||
tree build/_CPack_Packages/Linux/DEB/$(PROJECT_NAME)-*
|
||||
- dpkg-deb --contents build/$(PROJECT_NAME)_*$(CALENDAR)*$(SUFFIX).deb
|
||||
+ dpkg-deb --contents build/$(PROJECT_NAME)_$(PROJECT_VERSION)$(CALENDAR)*$(SUFFIX).deb
|
||||
# cd build/_CPack_Packages/Linux/DEB/$(PROJECT_NAME)_*$(CALENDAR)*$(SUFFIX).deb && find .
|
||||
|
||||
builddeps:
|
||||
@@ -54,7 +65,7 @@ cpus:
|
||||
@echo "CPU数量: $(CPUS)"
|
||||
|
||||
copytosource:package
|
||||
- cp build/$(PROJECT_NAME)_*$(CALENDAR)*.deb .
|
||||
+ cp build/$(PROJECT_NAME)_$(PROJECT_VERSION)$(CALENDAR)*.deb .
|
||||
|
||||
# 进入 qdebug 模式,在 deepin 中默认被禁用,可 env | grep QT 查看,并在 /etc/X11/Xsession.d/00deepin-dde-env 配置中已定义
|
||||
# 1. 禁止 qt 的 debug 打印: qt.*.debug=false
|
||||
diff --git a/cmake/SparkDebianChangelogVersion.cmake b/cmake/SparkDebianChangelogVersion.cmake
|
||||
index 9d8bca2..65e1c16 100644
|
||||
--- a/cmake/SparkDebianChangelogVersion.cmake
|
||||
+++ b/cmake/SparkDebianChangelogVersion.cmake
|
||||
@@ -54,5 +54,6 @@ macro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
|
||||
message("> V = [${V}]")
|
||||
|
||||
set(PROJECT_VERSION ${V})
|
||||
+ file(WRITE ${CMAKE_BINARY_DIR}/SPARK_OVERRIDE_VERSION ${V})
|
||||
endif(CHANGELOG_FILE_EXISTS)
|
||||
endmacro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 26f00f79a2b8613477059beb6c2f492bc24a7bb5 Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Mon, 30 Jan 2023 23:17:24 +0800
|
||||
Subject: [PATCH 08/11] =?UTF-8?q?repo:=20=E5=A4=84=E7=90=86=20v4.2.2=20?=
|
||||
=?UTF-8?q?=E7=89=88=E6=9C=AC=E6=97=B6=E6=9C=9F=E6=96=B0=E5=A2=9E=E7=9A=84?=
|
||||
=?UTF-8?q?=E5=AE=89=E8=A3=85=E6=96=87=E4=BB=B6?=
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
pkg/usr/share/ssinstall/transhell
|
||||
-> /usr/share/ssinstall
|
||||
---
|
||||
CMakeLists.txt | 5 +++++
|
||||
cmake/SparkInstallMacrosConfig.cmake | 2 +-
|
||||
2 files changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 73221bc..22a788d 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -86,6 +86,11 @@ spark_install_file(/usr/share/icons/hicolor/scalable/apps
|
||||
spark_install_program(/tmp/spark-store-install
|
||||
pkg/tmp/spark-store-install/feedback.sh)
|
||||
|
||||
+# 安装什么翻译? Since: v4.2.2
|
||||
+spark_install_directory(/usr/share/ssinstall
|
||||
+ pkg/usr/share/ssinstall/transhell
|
||||
+)
|
||||
+
|
||||
# 安装 qm 文件?
|
||||
spark_install_file(/usr/share/spark-store/translations
|
||||
${SPARK_QM_TRANSLATIONS})
|
||||
diff --git a/cmake/SparkInstallMacrosConfig.cmake b/cmake/SparkInstallMacrosConfig.cmake
|
||||
index bbb958a..c7ea53b 100644
|
||||
--- a/cmake/SparkInstallMacrosConfig.cmake
|
||||
+++ b/cmake/SparkInstallMacrosConfig.cmake
|
||||
@@ -79,7 +79,7 @@ macro(spark_install_directory INSTALL_DIRECTORY_DIR INSTALL_DIRECOTRY)
|
||||
# message(FATAL_ERROR " directory: ${INSTALL_DIRECTORY_FIND_INDEX_SUBSTRING_FILE_GLOB_LIST_LENGTH}")
|
||||
|
||||
else()
|
||||
- message(FATAL_ERROR "install: ${INSTALL_DIRECTORY_DIR}")
|
||||
+ # message(FATAL_ERROR "install: ${INSTALL_DIRECTORY_DIR}")
|
||||
|
||||
install(DIRECTORY
|
||||
${INSTALL_DIRECOTRY} ${ARGN}
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From e4401b16037cb3b1b10c59f4c7a0fa3c2cd563b3 Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Mon, 30 Jan 2023 23:18:44 +0800
|
||||
Subject: [PATCH 09/11] =?UTF-8?q?spark:=20=E5=AF=B9=20SparkTranslatorConfi?=
|
||||
=?UTF-8?q?g.cmake=20=E6=A8=A1=E5=9D=97=E7=9A=84=E6=89=A9=E5=B1=95?=
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
1. 增加 SPARK_QM_TRANSLATIONS 的文件输出
|
||||
无任何其它变动
|
||||
---
|
||||
cmake/SparkTranslatorConfig.cmake | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/cmake/SparkTranslatorConfig.cmake b/cmake/SparkTranslatorConfig.cmake
|
||||
index 272dd9d..689e70d 100644
|
||||
--- a/cmake/SparkTranslatorConfig.cmake
|
||||
+++ b/cmake/SparkTranslatorConfig.cmake
|
||||
@@ -12,6 +12,11 @@ endforeach(item IN LISTS SPARK_TRANSLATIONS)
|
||||
qt5_add_translation(SPARK_QM_TRANSLATIONS
|
||||
${SPARK_TRANSLATIONS})
|
||||
|
||||
+file(WRITE ${CMAKE_BINARY_DIR}/SPARK_QM_TRANSLATIONS "")
|
||||
+foreach(item IN LISTS SPARK_QM_TRANSLATIONS)
|
||||
+ file(APPEND ${CMAKE_BINARY_DIR}/SPARK_QM_TRANSLATIONS "${item}\n")
|
||||
+endforeach(item IN LISTS SPARK_QM_TRANSLATIONS)
|
||||
+
|
||||
message("translator(ts -> qm):")
|
||||
foreach(item IN LISTS SPARK_QM_TRANSLATIONS)
|
||||
message("-> ${item}")
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 2d8046099776e3909359ce49818ae28378af930c Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Mon, 30 Jan 2023 23:20:12 +0800
|
||||
Subject: [PATCH 10/11] =?UTF-8?q?make:=20=E5=A4=84=E7=90=86=E9=BB=98?=
|
||||
=?UTF-8?q?=E8=AE=A4=20make=20=E7=9B=AE=E6=A0=87=E4=B8=BA=20override-versi?=
|
||||
=?UTF-8?q?on=20=E7=9A=84=E9=97=AE=E9=A2=98?=
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
---
|
||||
Makefile | 16 ++++++++++------
|
||||
1 file changed, 10 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 81ca078..076502c 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -12,11 +12,6 @@ PROJECT_VERSION=*
|
||||
|
||||
ifneq ($(wildcard build/SPARK_OVERRIDE_VERSION),)
|
||||
SPARK_OVERRIDE_VERSION=`cat build/SPARK_OVERRIDE_VERSION`
|
||||
-.PHONY: override-version
|
||||
-override-version:
|
||||
- @echo $(SPARK_OVERRIDE_VERSION)
|
||||
- @echo "wildcard - good: $(wildcard build/SPARK_OVERRIDE_VERSION)"
|
||||
- @echo "wildcard - bad.: $(wildcard build/SPARK_OVERRIDE_VERSIONS)"
|
||||
PROJECT_VERSION=$(SPARK_OVERRIDE_VERSION)-
|
||||
endif
|
||||
|
||||
@@ -82,4 +77,13 @@ copytosource:package
|
||||
enter-qdebug-mode:
|
||||
# 进入新的 bash 环境
|
||||
@# export QT_LOGGING_RULES=".debug=true; qt.*.debug=false; dtk.*.debug=false; dde.*.debug=false; qtc*=false; " && bash
|
||||
- export QT_LOGGING_RULES=".debug=true" && bash
|
||||
\ No newline at end of file
|
||||
+ export QT_LOGGING_RULES=".debug=true" && bash
|
||||
+
|
||||
+
|
||||
+ifneq ($(wildcard build/SPARK_OVERRIDE_VERSION),)
|
||||
+.PHONY: override-version
|
||||
+override-version:
|
||||
+ @echo $(SPARK_OVERRIDE_VERSION)
|
||||
+ @echo "wildcard - good: $(wildcard build/SPARK_OVERRIDE_VERSION)"
|
||||
+ @echo "wildcard - bad.: $(wildcard build/SPARK_OVERRIDE_VERSIONS)"
|
||||
+endif
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
From 043e6fb78e2bcb1a6fecefe2ba9aceb9df84e96e Mon Sep 17 00:00:00 2001
|
||||
From: zinface <zinface@163.com>
|
||||
Date: Sun, 5 Feb 2023 16:09:40 +0800
|
||||
Subject: [PATCH 11/11] =?UTF-8?q?spark:=20=E5=A4=84=E7=90=86=E7=89=88?=
|
||||
=?UTF-8?q?=E6=9C=AC=E5=8F=B7=204.2.3~test1=20=E6=97=B6=E9=BB=98=E8=AE=A4?=
|
||||
=?UTF-8?q?=E7=9A=84=E6=88=AA=E5=8F=96=E5=AD=97=E7=AC=A6=E6=95=B0=E8=BF=87?=
|
||||
=?UTF-8?q?=E7=9F=AD=E9=97=AE=E9=A2=98?=
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
---
|
||||
cmake/SparkDebianChangelogVersion.cmake | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/cmake/SparkDebianChangelogVersion.cmake b/cmake/SparkDebianChangelogVersion.cmake
|
||||
index 65e1c16..3ed5fa2 100644
|
||||
--- a/cmake/SparkDebianChangelogVersion.cmake
|
||||
+++ b/cmake/SparkDebianChangelogVersion.cmake
|
||||
@@ -40,7 +40,8 @@ macro(spark_debian_changelog_override_version _CHANGELOG_FILE_PATH)
|
||||
|
||||
message("> V = ${CHANGELOG_FILE_PATH}")
|
||||
if(CHANGELOG_FILE_EXISTS)
|
||||
- file(READ ${CHANGELOG_FILE_PATH} CHANGELOG_CONTENT LIMIT 20)
|
||||
+ file(READ ${CHANGELOG_FILE_PATH} CHANGELOG_CONTENT LIMIT 30)
|
||||
+ # fix: spark-store (4.2.3~test1) 已经超过 20 字符位,所以使用 30 进行保守计算
|
||||
|
||||
string(FIND ${CHANGELOG_CONTENT} "(" V_PRE) # +1 to V_BEGIN
|
||||
string(FIND ${CHANGELOG_CONTENT} ")" V_END)
|
||||
--
|
||||
2.20.1
|
||||
|
||||
|
||||
26
pkg/usr/share/dsg/org.deepin.dtkwidget.feature-display.json
Normal file
26
pkg/usr/share/dsg/org.deepin.dtkwidget.feature-display.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"magic": "dsg.config.meta",
|
||||
"version": "1.0",
|
||||
"contents": {
|
||||
"featureUpdated": {
|
||||
"value": false,
|
||||
"serial": 0,
|
||||
"flags": [],
|
||||
"name": "Whether the application has new feature updates",
|
||||
"name[zh_CN]": "配置应用的更新状态",
|
||||
"description": "Configure the update status of the application",
|
||||
"permissions": "readwrite",
|
||||
"visibility": "public"
|
||||
},
|
||||
"autoDisplayFeature": {
|
||||
"value": false,
|
||||
"serial": 0,
|
||||
"flags": [],
|
||||
"name": "The application automatically display new features once",
|
||||
"name[zh_CN]": "配置应用是否自动展示一次新特性",
|
||||
"description": "The application automatically display updated contents once",
|
||||
"permissions": "readwrite",
|
||||
"visibility": "public"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_HASH_CHECK_FAILED="Failed in checking package hash! \nPossibly reason can be the package is broken, laggy in sync of Spark Store repository, or, there is a malware attempt to attack. \nIf you don't know what happend, please try install again after execute the command below\n sudo aptss ssupdate\n\nIf the problem still happen, please click APP Feedback button in the APP information page to feedback to us.\n\n If you are in the Audition Group,Please use ssaudit instead of ssinstall to audit APPs,for ssinstall is used for password-free install now.\nIf you want to install an app that is removed from Spark Store repository,you can also use ssaudit."
|
||||
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="Please run ssinstall as root"
|
||||
TRANSHELL_CONTENT_FILE_NOT_EXIST="File not exist"
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_HASH_CHECK_FAILED="软件包校验失败!这不应该发生!\n可能是因为软件包已损坏,星火仓库未同步,或者最坏的情况:恶意软件尝试利用自动安装来入侵系统!\n如果你不清楚发生了什么,请执行 sudo aptss ssupdate 后再尝试安装。\n如果问题仍然存在,请在应用信息界面点击 应用反馈 来提交反馈给我们!\n\n 如果你是审核人员,请使用 ssaudit来替代ssinstall进行审核工作,因为现在ssinstall已经被用于免密安装。\n如果你正在尝试安装已经下架的星火应用,也可用ssaudit来替代ssinstall"
|
||||
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="请使用root启动ssinstall"
|
||||
TRANSHELL_CONTENT_FILE_NOT_EXIST="文件不存在"
|
||||
@@ -7,19 +7,24 @@
|
||||
TARGET = spark-store
|
||||
TEMPLATE = subdirs
|
||||
|
||||
CONFIG += ordered
|
||||
#CONFIG += ordered
|
||||
CONFIG += wayland-compositor
|
||||
|
||||
SUBDIRS += \
|
||||
src/spark-dstore-patch \
|
||||
src/spark-store.pro
|
||||
|
||||
#TRANSLATIONS += \
|
||||
# translations/spark-store_fr.ts \
|
||||
# translations/spark-store_en.ts \
|
||||
# translations/spark-store_zh_CN.ts
|
||||
# https://wiki.debian.org/Hardening
|
||||
QMAKE_CFLAGS *= $(shell dpkg-buildflags --get CFLAGS)
|
||||
QMAKE_CPPFLAGS *= $(shell dpkg-buildflags --get CPPFLAGS)
|
||||
QMAKE_CXXFLAGS *= $(shell dpkg-buildflags --get CXXFLAGS)
|
||||
QMAKE_LFLAGS *= $(shell dpkg-buildflags --get LDFLAGS)
|
||||
|
||||
# Update translation files
|
||||
CONFIG(release, debug|release): system(bash $${PWD}/translate_generation.sh)
|
||||
CONFIG(release, debug | release) {
|
||||
system(bash $${PWD}/translate_update.sh)
|
||||
system(bash $${PWD}/translate_generation.sh)
|
||||
}
|
||||
|
||||
# Rules for deployment
|
||||
tool.files += tool/*
|
||||
@@ -49,6 +54,9 @@ polkit-1.path = /usr/share/polkit-1/actions/
|
||||
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
icon.path = /usr/share/icons/hicolor/scalable/apps
|
||||
|
||||
ssinstall-transhell.files += pkg/usr/share/ssinstall/transhell
|
||||
ssinstall-transhell.path = /usr/share/ssinstall/
|
||||
|
||||
tmp.files += pkg/tmp/spark-store-install/feedback.sh
|
||||
tmp.path = /tmp/spark-store-install
|
||||
|
||||
@@ -57,10 +65,10 @@ INSTALLS += \
|
||||
qm \
|
||||
desktop \
|
||||
icon \
|
||||
# preferences \
|
||||
ssinstall-transhell \
|
||||
# sourceslist \
|
||||
tmp \
|
||||
service \
|
||||
bash_completion \
|
||||
polkit-1
|
||||
# 暂时不添加
|
||||
# 暂时不添加
|
||||
|
||||
217
src/application.cpp
Normal file
217
src/application.cpp
Normal file
@@ -0,0 +1,217 @@
|
||||
#include "application.h"
|
||||
#include "mainwindow-dtk.h"
|
||||
#include "utils/utils.h"
|
||||
|
||||
#include <DPlatformWindowHandle>
|
||||
#include <DLog>
|
||||
#include <DGuiApplicationHelper>
|
||||
#include <DAboutDialog>
|
||||
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||
#include <DFeatureDisplayDialog>
|
||||
#endif
|
||||
|
||||
#include <QSettings>
|
||||
#include <QStandardPaths>
|
||||
|
||||
DCORE_USE_NAMESPACE
|
||||
|
||||
Application::Application(int &argc, char **argv)
|
||||
: DApplication(argc, argv)
|
||||
{
|
||||
// Wayland 环境下使用,防止子控件 Native 化
|
||||
if (!DPlatformWindowHandle::pluginVersion().isEmpty()) {
|
||||
setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
|
||||
}
|
||||
setAttribute(Qt::AA_UseHighDpiPixmaps);
|
||||
|
||||
setQuitOnLastWindowClosed(false); // 启用托盘图标时,关闭窗口程序仍然运行
|
||||
|
||||
loadTranslator(); // 载入翻译
|
||||
|
||||
setOrganizationName("spark-union");
|
||||
setApplicationName("spark-store"); // 影响 ~/.config/spark-union ~/.local/share/spark-union 下文件夹名称
|
||||
setApplicationDisplayName(QObject::tr("Spark Store")); // 设置窗口显示标题 (Wayland 下会显示 Qt 原生标题栏)
|
||||
setProductName(QObject::tr("Spark Store"));
|
||||
setProductIcon(QIcon::fromTheme("spark-store"));
|
||||
setApplicationHomePage("https://gitee.com/deepin-community-store");
|
||||
setApplicationDescription(
|
||||
QObject::tr(
|
||||
"<span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/>"
|
||||
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
|
||||
"<span style=' font-size:12pt;'>Spark developers</span>"));
|
||||
setApplicationLicense(" <a href='https://gitee.com/deepin-community-store/spark-store/blob/Flamescion/LICENSE'>GPLv3</a> ");
|
||||
|
||||
// 检查 ~/.config/spark-union/spark-store 文件夹是否存在
|
||||
checkAppConfigLocation();
|
||||
|
||||
// 初始化日志模块 (默认日志位置 ~/.cache/spark-union/spark-store)
|
||||
DLogManager::registerConsoleAppender();
|
||||
DLogManager::registerFileAppender();
|
||||
|
||||
// 获取版本特性信息
|
||||
m_featuresJsonObj = Utils::parseFeatureJsonFile();
|
||||
}
|
||||
|
||||
void Application::handleAboutAction()
|
||||
{
|
||||
if (aboutDialog() && aboutDialog()->parent() == m_mainWindow) {
|
||||
DApplication::handleAboutAction();
|
||||
return;
|
||||
}
|
||||
|
||||
initAboutDialog();
|
||||
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||
initFeatureDisplayDialog(); // 初始化版本特性对话框
|
||||
#endif
|
||||
DApplication::handleAboutAction();
|
||||
}
|
||||
|
||||
bool Application::notify(QObject *receiver, QEvent *event)
|
||||
{
|
||||
if (m_mainWindow) {
|
||||
m_mainWindow->notify(receiver, event);
|
||||
}
|
||||
|
||||
return DApplication::notify(receiver, event);
|
||||
}
|
||||
|
||||
void Application::checkAppConfigLocation()
|
||||
{
|
||||
QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation));
|
||||
if (!dir.exists()) {
|
||||
qWarning() << "AppConfigLocation not existed, creating...";
|
||||
dir.mkpath(dir.absolutePath());
|
||||
}
|
||||
}
|
||||
|
||||
void Application::setBuildDateTime(const QString &buildDateTime)
|
||||
{
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
if (config.value("build/version").toString() != QString(APP_VERSION)) {
|
||||
qDebug() << "Spark Store has been updated!";
|
||||
|
||||
config.setValue("build/version", QString(APP_VERSION));
|
||||
config.setValue("build/time", buildDateTime);
|
||||
config.sync();
|
||||
}
|
||||
|
||||
setApplicationVersion(DApplication::buildVersion(QString(APP_VERSION) + "-" + "Reason" + "-" + buildDateTime));
|
||||
}
|
||||
|
||||
void Application::setMainWindow(MainWindow *window)
|
||||
{
|
||||
m_mainWindow = window;
|
||||
if (aboutDialog() == nullptr || aboutDialog()->parent() != m_mainWindow)
|
||||
{
|
||||
initAboutDialog();
|
||||
}
|
||||
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||
if (featureDisplayDialog() == nullptr || featureDisplayDialog()->parent() != m_mainWindow)
|
||||
{
|
||||
initFeatureDisplayDialog(); // 初始化版本特性对话框
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
MainWindow *Application::mainWindow()
|
||||
{
|
||||
return m_mainWindow;
|
||||
}
|
||||
|
||||
void Application::initAboutDialog()
|
||||
{
|
||||
if (m_mainWindow == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (aboutDialog())
|
||||
{
|
||||
aboutDialog()->deleteLater();
|
||||
setAboutDialog(nullptr);
|
||||
}
|
||||
|
||||
// 自定义 DAboutDialog
|
||||
DAboutDialog *dialog = new DAboutDialog(m_mainWindow);
|
||||
dialog->setProductName(productName());
|
||||
dialog->setProductIcon(productIcon());
|
||||
dialog->setVersion(translate("DAboutDialog", "Version: %1").arg(applicationVersion()));
|
||||
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||
dialog->setVersion(applicationVersion());
|
||||
#endif
|
||||
// 根据 shenmo 要求,不显示组织 Logo
|
||||
// dialog->setCompanyLogo(QPixmap(":/icon/Logo-Spark.png"));
|
||||
dialog->setCompanyLogo(QPixmap());
|
||||
dialog->setWebsiteName(QObject::tr("Spark Project"));
|
||||
dialog->setWebsiteLink(applicationHomePage());
|
||||
dialog->setDescription(applicationDescription());
|
||||
dialog->setLicense(translate("DAboutDialog", "%1 is released under %2").arg(productName()).arg(applicationLicense()));
|
||||
|
||||
setAboutDialog(dialog);
|
||||
connect(aboutDialog(), &DAboutDialog::destroyed, this, [=]() {
|
||||
setAboutDialog(nullptr);
|
||||
});
|
||||
|
||||
dialog->hide();
|
||||
}
|
||||
|
||||
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||
/**
|
||||
* @brief Application::initFeatureDisplayDialog 初始化版本特性对话框
|
||||
*/
|
||||
void Application::initFeatureDisplayDialog()
|
||||
{
|
||||
if (featureDisplayDialog())
|
||||
{
|
||||
featureDisplayDialog()->deleteLater();
|
||||
setFeatureDisplayDialog(nullptr);
|
||||
}
|
||||
|
||||
// 自定义 DFeatureDisplayDialog
|
||||
DFeatureDisplayDialog *dialog = new DFeatureDisplayDialog(m_mainWindow);
|
||||
// 标题
|
||||
dialog->setTitle(m_featuresJsonObj.value("title").toString());
|
||||
// NOTE: json 文件中支持多语言;考虑到维护性,不放入翻译文件处理
|
||||
if (m_featuresJsonObj.contains(QString("title[%1]").arg(QLocale::system().name())))
|
||||
{
|
||||
dialog->setTitle(m_featuresJsonObj.value(QString("title[%1]").arg(QLocale::system().name())).toString());
|
||||
}
|
||||
|
||||
// 特性项
|
||||
QList<DFeatureItem *> items;
|
||||
foreach (const QJsonValue &jsonValue, m_featuresJsonObj.value("items").toArray())
|
||||
{
|
||||
QJsonObject jsonObj = jsonValue.toObject();
|
||||
QString name = jsonObj.value("name").toString();
|
||||
if (jsonObj.contains(QString("name[%1]").arg(QLocale::system().name())))
|
||||
{
|
||||
name = jsonObj.value(QString("name[%1]").arg(QLocale::system().name())).toString();
|
||||
}
|
||||
QString description = jsonObj.value("description").toString();
|
||||
if (jsonObj.contains(QString("description[%1]").arg(QLocale::system().name())))
|
||||
{
|
||||
description = jsonObj.value(QString("description[%1]").arg(QLocale::system().name())).toString();
|
||||
}
|
||||
|
||||
DFeatureItem *item = new DFeatureItem(QIcon::fromTheme("spark-store"), name, description, dialog);
|
||||
items.append(item);
|
||||
}
|
||||
dialog->addItems(items); // NOTE: 也支持 addItem 依次添加单个 item
|
||||
|
||||
// “了解更多”链接按钮
|
||||
dialog->setLinkUrl(m_featuresJsonObj.value("linkUrl").toString());
|
||||
dialog->setLinkButtonVisible(m_featuresJsonObj.value("linkButtonVisible").toBool());
|
||||
|
||||
setFeatureDisplayDialog(dialog);
|
||||
connect(featureDisplayDialog(), &DFeatureDisplayDialog::destroyed, this, [=]() {
|
||||
setFeatureDisplayDialog(nullptr);
|
||||
});
|
||||
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||
connect(aboutDialog(), &DAboutDialog::featureActivated, this, [=]() {
|
||||
featureDisplayDialog()->show();
|
||||
});
|
||||
#endif
|
||||
|
||||
dialog->hide();
|
||||
}
|
||||
#endif
|
||||
39
src/application.h
Normal file
39
src/application.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifndef APPLICATION_H
|
||||
#define APPLICATION_H
|
||||
|
||||
#include <DApplication>
|
||||
|
||||
#include <QJsonObject>
|
||||
|
||||
DWIDGET_USE_NAMESPACE
|
||||
|
||||
class MainWindow;
|
||||
class Application : public DApplication
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
Application(int &argc, char **argv);
|
||||
void handleAboutAction() override;
|
||||
bool notify(QObject *receiver, QEvent *event) override;
|
||||
|
||||
static void checkAppConfigLocation();
|
||||
|
||||
void setBuildDateTime(const QString &buildDateTime);
|
||||
|
||||
void setMainWindow(MainWindow *window);
|
||||
MainWindow *mainWindow();
|
||||
|
||||
private:
|
||||
void initAboutDialog();
|
||||
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||
void initFeatureDisplayDialog();
|
||||
#endif
|
||||
|
||||
private:
|
||||
QJsonObject m_featuresJsonObj;
|
||||
|
||||
MainWindow *m_mainWindow = nullptr;
|
||||
};
|
||||
|
||||
#endif // APPLICATION_H
|
||||
@@ -1,64 +1,66 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>icon/logo.svg</file>
|
||||
<file>tags/a2d-small.png</file>
|
||||
<file>tags/a2d.png</file>
|
||||
<file>tags/community-small.png</file>
|
||||
<file>tags/community.png</file>
|
||||
<file>tags/community.svg</file>
|
||||
<file>tags/deepin-small.png</file>
|
||||
<file>tags/deepin.svg</file>
|
||||
<file>tags/dtk-small.png</file>
|
||||
<file>tags/dwine2-small.png</file>
|
||||
<file>tags/dwine5-small.png</file>
|
||||
<file>tags/dwine5.svg</file>
|
||||
<file>tags/logo_icon.svg</file>
|
||||
<file>tags/ubuntu-small.png</file>
|
||||
<file>tags/ubuntu.png</file>
|
||||
<file>tags/uos-authorize.svg</file>
|
||||
<file>tags/uos-small.png</file>
|
||||
<file>tags/uos.svg</file>
|
||||
<file>icon/light/back.svg</file>
|
||||
<file>icon/light/download.svg</file>
|
||||
<file>icon/light/leftbutton_0.svg</file>
|
||||
<file>icon/light/leftbutton_1.svg</file>
|
||||
<file>icon/light/leftbutton_2.svg</file>
|
||||
<file>icon/light/leftbutton_3.svg</file>
|
||||
<file>icon/light/leftbutton_4.svg</file>
|
||||
<file>icon/light/leftbutton_5.svg</file>
|
||||
<file>icon/light/leftbutton_6.svg</file>
|
||||
<file>icon/light/leftbutton_7.svg</file>
|
||||
<file>icon/light/leftbutton_8.svg</file>
|
||||
<file>icon/light/leftbutton_9.svg</file>
|
||||
<file>icon/light/leftbutton_10.svg</file>
|
||||
<file>icon/light/leftbutton_11.svg</file>
|
||||
<file>icon/light/leftbutton_12.svg</file>
|
||||
<file>icon/light/box.svg</file>
|
||||
<file>icon/light/calendar.svg</file>
|
||||
<file>icon/light/globe.svg</file>
|
||||
<file>icon/light/folder.svg</file>
|
||||
<file>icon/light/text.svg</file>
|
||||
<file>icon/dark/back.svg</file>
|
||||
<file>icon/dark/box.svg</file>
|
||||
<file>icon/dark/calendar.svg</file>
|
||||
<file>icon/dark/download.svg</file>
|
||||
<file>icon/dark/folder.svg</file>
|
||||
<file>icon/dark/globe.svg</file>
|
||||
<file>icon/dark/leftbutton_0.svg</file>
|
||||
<file>icon/dark/leftbutton_1.svg</file>
|
||||
<file>icon/dark/leftbutton_2.svg</file>
|
||||
<file>icon/dark/leftbutton_3.svg</file>
|
||||
<file>icon/dark/leftbutton_4.svg</file>
|
||||
<file>icon/dark/leftbutton_5.svg</file>
|
||||
<file>icon/dark/leftbutton_6.svg</file>
|
||||
<file>icon/dark/leftbutton_7.svg</file>
|
||||
<file>icon/dark/leftbutton_8.svg</file>
|
||||
<file>icon/dark/leftbutton_9.svg</file>
|
||||
<file>icon/dark/leftbutton_10.svg</file>
|
||||
<file>icon/dark/leftbutton_11.svg</file>
|
||||
<file>icon/dark/leftbutton_12.svg</file>
|
||||
<file>icon/dark/text.svg</file>
|
||||
<file>icon/light/update.svg</file>
|
||||
<file>icon/dark/update.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>icon/Logo-Spark.png</file>
|
||||
<file>icon/dark/back.svg</file>
|
||||
<file>icon/dark/box.svg</file>
|
||||
<file>icon/dark/calendar.svg</file>
|
||||
<file>icon/dark/download.svg</file>
|
||||
<file>icon/dark/folder.svg</file>
|
||||
<file>icon/dark/globe.svg</file>
|
||||
<file>icon/dark/leftbutton_0.svg</file>
|
||||
<file>icon/dark/leftbutton_1.svg</file>
|
||||
<file>icon/dark/leftbutton_2.svg</file>
|
||||
<file>icon/dark/leftbutton_3.svg</file>
|
||||
<file>icon/dark/leftbutton_4.svg</file>
|
||||
<file>icon/dark/leftbutton_5.svg</file>
|
||||
<file>icon/dark/leftbutton_6.svg</file>
|
||||
<file>icon/dark/leftbutton_7.svg</file>
|
||||
<file>icon/dark/leftbutton_8.svg</file>
|
||||
<file>icon/dark/leftbutton_9.svg</file>
|
||||
<file>icon/dark/leftbutton_10.svg</file>
|
||||
<file>icon/dark/leftbutton_11.svg</file>
|
||||
<file>icon/dark/leftbutton_12.svg</file>
|
||||
<file>icon/dark/text.svg</file>
|
||||
<file>icon/dark/update.svg</file>
|
||||
<file>icon/light/back.svg</file>
|
||||
<file>icon/light/download.svg</file>
|
||||
<file>icon/light/leftbutton_0.svg</file>
|
||||
<file>icon/light/leftbutton_1.svg</file>
|
||||
<file>icon/light/leftbutton_2.svg</file>
|
||||
<file>icon/light/leftbutton_3.svg</file>
|
||||
<file>icon/light/leftbutton_4.svg</file>
|
||||
<file>icon/light/leftbutton_5.svg</file>
|
||||
<file>icon/light/leftbutton_6.svg</file>
|
||||
<file>icon/light/leftbutton_7.svg</file>
|
||||
<file>icon/light/leftbutton_8.svg</file>
|
||||
<file>icon/light/leftbutton_9.svg</file>
|
||||
<file>icon/light/leftbutton_10.svg</file>
|
||||
<file>icon/light/leftbutton_11.svg</file>
|
||||
<file>icon/light/leftbutton_12.svg</file>
|
||||
<file>icon/light/box.svg</file>
|
||||
<file>icon/light/calendar.svg</file>
|
||||
<file>icon/light/globe.svg</file>
|
||||
<file>icon/light/folder.svg</file>
|
||||
<file>icon/light/text.svg</file>
|
||||
<file>icon/light/update.svg</file>
|
||||
<file>icon/logo.svg</file>
|
||||
<file>json/features.json</file>
|
||||
<file>tags/a2d-small.png</file>
|
||||
<file>tags/a2d.png</file>
|
||||
<file>tags/community-small.png</file>
|
||||
<file>tags/community.png</file>
|
||||
<file>tags/community.svg</file>
|
||||
<file>tags/deepin-small.png</file>
|
||||
<file>tags/deepin.svg</file>
|
||||
<file>tags/dtk-small.png</file>
|
||||
<file>tags/dwine2-small.png</file>
|
||||
<file>tags/dwine5-small.png</file>
|
||||
<file>tags/dwine5.svg</file>
|
||||
<file>tags/logo_icon.svg</file>
|
||||
<file>tags/ubuntu-small.png</file>
|
||||
<file>tags/ubuntu.png</file>
|
||||
<file>tags/uos-authorize.svg</file>
|
||||
<file>tags/uos-small.png</file>
|
||||
<file>tags/uos.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 11 KiB |
25
src/assets/json/features.json
Normal file
25
src/assets/json/features.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"title": "Features",
|
||||
"title[zh_CN]": "版本特性",
|
||||
"items": [
|
||||
{
|
||||
"icon": "/usr/share/icons/hicolor/scalable/apps/spark-store.svg",
|
||||
"name": "Feature 1",
|
||||
"name[zh_CN]": "特性 1",
|
||||
"description": "Please click the learn more button to check",
|
||||
"description[zh_CN]": "请点击 了解更多 按钮来获取特性"
|
||||
},
|
||||
{
|
||||
"icon": ":/icon/logo.svg",
|
||||
"name": "Feature 2",
|
||||
"description": "Feature 2 detailed description..."
|
||||
},
|
||||
{
|
||||
"icon": "spark-store",
|
||||
"name": "Fix 1",
|
||||
"description": "Fix 1 detailed description..."
|
||||
}
|
||||
],
|
||||
"linkUrl": "https://gitee.com/deepin-community-store/spark-store/releases/4.2.3test3",
|
||||
"linkButtonVisible": true
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "downloadworker.h"
|
||||
#include <QEventLoop>
|
||||
|
||||
#include <QProcess>
|
||||
#include <QRegularExpression>
|
||||
#include <QDir>
|
||||
#include <QtConcurrent>
|
||||
#include <QStandardPaths>
|
||||
|
||||
DownloadController::DownloadController(QObject *parent)
|
||||
{
|
||||
@@ -30,7 +30,6 @@ void DownloadController::setFilename(QString filename)
|
||||
this->filename = filename;
|
||||
}
|
||||
|
||||
|
||||
bool checkMeatlink(QString metaUrl)
|
||||
{
|
||||
QFile metaStatus("/tmp/spark-store/metaStatus.txt");
|
||||
@@ -49,7 +48,7 @@ bool checkMeatlink(QString metaUrl)
|
||||
|
||||
void gennerateDomain(QVector<QString> &domains)
|
||||
{
|
||||
QFile serverList(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
|
||||
QFile serverList(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
|
||||
if (serverList.open(QFile::ReadOnly))
|
||||
{
|
||||
QStringList list = QString(serverList.readAll()).trimmed().split("\n");
|
||||
@@ -88,14 +87,17 @@ void DownloadController::startDownload(const QString &url)
|
||||
}
|
||||
|
||||
QtConcurrent::run([=]()
|
||||
{
|
||||
{
|
||||
QString metaUrl = url + ".metalink";
|
||||
qDebug() << "metalink" << metaUrl;
|
||||
bool useMetalink = false;
|
||||
if (checkMeatlink(metaUrl)){
|
||||
if (checkMeatlink(metaUrl))
|
||||
{
|
||||
useMetalink = true;
|
||||
qDebug() << "useMetalink:" << useMetalink;
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
gennerateDomain(domains);
|
||||
// qDebug() << domains << domains.size();
|
||||
}
|
||||
@@ -112,10 +114,12 @@ void DownloadController::startDownload(const QString &url)
|
||||
QString aria2ConnectionMax = "--max-concurrent-downloads=16";
|
||||
QString aria2DNSCommand = "--async-dns-server=119.29.29.29,223.5.5.5";
|
||||
|
||||
if (useMetalink){
|
||||
if (useMetalink)
|
||||
{
|
||||
command.append(metaUrl.toUtf8());
|
||||
}
|
||||
else{
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < domains.size(); i++)
|
||||
{
|
||||
command.append(replaceDomain(url, domains.at(i)).replace("+","%2B").toUtf8()); //对+进行转译,避免oss出错
|
||||
@@ -134,22 +138,24 @@ void DownloadController::startDownload(const QString &url)
|
||||
command.append(aria2ConnectionPerServer.toUtf8());
|
||||
command.append(aria2ConnectionMax.toUtf8());
|
||||
command.append(aria2DNSCommand.toUtf8());
|
||||
if (useMetalink){
|
||||
if (useMetalink)
|
||||
{
|
||||
command.append(aria2NoSeeds.toUtf8());
|
||||
}
|
||||
qDebug() << command;
|
||||
auto cmd = new QProcess(this);
|
||||
cmd->setProcessChannelMode(QProcess::MergedChannels);
|
||||
cmd->setProgram("aria2c");
|
||||
cmd->setArguments(command);
|
||||
cmd->start();
|
||||
cmd->waitForStarted(); //等待启动完成
|
||||
|
||||
QObject::connect(cmd, &QProcess::readyReadStandardOutput,
|
||||
[&]()
|
||||
bool downloadSuccess = true;
|
||||
QProcess cmd;
|
||||
cmd.setProcessChannelMode(QProcess::MergedChannels);
|
||||
cmd.setProgram("aria2c");
|
||||
cmd.setArguments(command);
|
||||
cmd.start();
|
||||
cmd.waitForStarted(-1); //等待启动完成
|
||||
|
||||
connect(&cmd, &QProcess::readyReadStandardOutput, [&]()
|
||||
{
|
||||
//通过读取输出计算下载速度
|
||||
QString message = cmd->readAllStandardOutput().data();
|
||||
QString message = cmd.readAllStandardOutput().data();
|
||||
// qDebug() << message;
|
||||
message = message.replace(" ", "");
|
||||
QStringList list;
|
||||
@@ -189,18 +195,21 @@ void DownloadController::startDownload(const QString &url)
|
||||
emit downloadProcess(speedInfo, downloadSizeRecord, fileSize);
|
||||
}
|
||||
});
|
||||
QObject::connect(cmd, &QProcess::readyReadStandardError,
|
||||
[&]()
|
||||
connect(&cmd, &QProcess::readyReadStandardError, [&]()
|
||||
{
|
||||
emit errorOccur(cmd->readAllStandardError().data());
|
||||
return;
|
||||
emit errorOccur(cmd.readAllStandardError().data());
|
||||
downloadSuccess = false;
|
||||
cmd.close();
|
||||
});
|
||||
|
||||
auto pidNumber = cmd->processId();
|
||||
this->pidNumber = pidNumber;
|
||||
while (cmd->waitForFinished(-1))
|
||||
pidNumber = cmd.processId();
|
||||
|
||||
cmd.waitForFinished(-1);
|
||||
cmd.close();
|
||||
|
||||
if(!downloadSuccess)
|
||||
{
|
||||
continue;
|
||||
return;
|
||||
}
|
||||
|
||||
// 统计下载量
|
||||
@@ -210,10 +219,10 @@ void DownloadController::startDownload(const QString &url)
|
||||
* HD 70642 is a star with an exoplanetary companion in the southern constellation of Puppis.
|
||||
*/
|
||||
QProcess mailProcess;
|
||||
mailProcess.start(SenderdPath.toUtf8() + " " + metaUrl.toUtf8() + " " + "HD70642");
|
||||
mailProcess.start(SenderdPath.toUtf8(), QStringList() << metaUrl << "HD70642");
|
||||
mailProcess.waitForStarted();
|
||||
mailProcess.waitForFinished(3000);
|
||||
mailProcess.deleteLater();
|
||||
mailProcess.close();
|
||||
|
||||
emit downloadFinished(); });
|
||||
}
|
||||
@@ -223,15 +232,22 @@ void DownloadController::startDownload(const QString &url)
|
||||
*/
|
||||
void DownloadController::stopDownload()
|
||||
{
|
||||
if (pidNumber < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 实现下载进程退出
|
||||
QString killCmd = QString("kill -9 %1").arg(pidNumber);
|
||||
system(killCmd.toUtf8());
|
||||
qDebug() << "kill aria2!";
|
||||
pidNumber = -1;
|
||||
}
|
||||
|
||||
qint64 DownloadController::getFileSize(const QString &url)
|
||||
{
|
||||
// 已经无需使用 qtnetwork 再获取 filesize,完全交给 aria2 来计算进度。 为保证兼容性,故保留此函数。
|
||||
qDebug() << "Begin download:" << url;
|
||||
qint64 fileSize = 10000;
|
||||
return fileSize;
|
||||
}
|
||||
|
||||
@@ -2,9 +2,7 @@
|
||||
#define DOWNLOADWORKER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QList>
|
||||
#include <QFile>
|
||||
#include <QNetworkReply>
|
||||
#include <QVector>
|
||||
|
||||
class DownloadController : public QObject
|
||||
{
|
||||
@@ -19,23 +17,19 @@ public:
|
||||
qint64 getFileSize(const QString& url);
|
||||
QString replaceDomain(const QString& url, const QString domain);
|
||||
|
||||
private:
|
||||
int threadNum;
|
||||
int pidNumber;
|
||||
QString filename;
|
||||
qint64 fileSize;
|
||||
QVector<QPair<qint64, qint64>> ranges;
|
||||
QFile *file;
|
||||
bool finished = false;
|
||||
QVector<QString> domains;
|
||||
|
||||
|
||||
|
||||
signals:
|
||||
void errorOccur(const QString& msg);
|
||||
void downloadProcess(QString, qint64, qint64);
|
||||
void downloadFinished();
|
||||
|
||||
private:
|
||||
int threadNum;
|
||||
qint64 pidNumber = -1;
|
||||
QString filename;
|
||||
qint64 fileSize;
|
||||
QVector<QPair<qint64, qint64>> ranges;
|
||||
bool finished = false;
|
||||
QVector<QString> domains;
|
||||
};
|
||||
|
||||
#endif // FILEDOWNLOADWORKER_H
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
#include "image_show.h"
|
||||
|
||||
#include <QHBoxLayout>
|
||||
#include <QScreen> // Qt5 不再建议使用 QDesktopWidget
|
||||
#include <QScreen> // Qt5 不再建议使用 QDesktopWidget
|
||||
#include <QGuiApplication>
|
||||
|
||||
image_show::image_show(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
m_dialog(new big_image),
|
||||
m_label(new QLabel)
|
||||
image_show::image_show(QWidget *parent) : QWidget(parent),
|
||||
m_dialog(new big_image),
|
||||
m_label(new QLabel)
|
||||
{
|
||||
QHBoxLayout *layout = new QHBoxLayout;
|
||||
layout->addWidget(m_label);
|
||||
@@ -27,7 +26,7 @@ void image_show::setImage(QPixmap image)
|
||||
desktop_w = QGuiApplication::primaryScreen()->geometry().width();
|
||||
desktop_h = QGuiApplication::primaryScreen()->geometry().height();
|
||||
|
||||
if(screen0.width() > (desktop_w - 20) || screen0.height() > (desktop_h - 20))
|
||||
if (screen0.width() > (desktop_w - 20) || screen0.height() > (desktop_h - 20))
|
||||
{
|
||||
re_screen1 = screen0.scaled(QSize(desktop_w - 20, desktop_h - 20), Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
m_image = QPixmap::fromImage(re_screen1);
|
||||
@@ -48,7 +47,7 @@ void image_show::mousePressEvent(QMouseEvent *)
|
||||
// 识别主屏幕尺寸并设置 widget 大小
|
||||
m_dialog->setFixedSize(desktop_w, desktop_h);
|
||||
|
||||
m_dialog->move(0,0);
|
||||
m_dialog->move(0, 0);
|
||||
}
|
||||
image_show::~image_show()
|
||||
{
|
||||
|
||||
@@ -1,74 +1,97 @@
|
||||
#include "sparkapi.h"
|
||||
|
||||
#include <QSettings>
|
||||
#include <QStandardPaths>
|
||||
#include <QDebug>
|
||||
|
||||
QString SparkAPI::serverUrl = "";
|
||||
#ifdef __x86_64__
|
||||
QString SparkAPI::serverUrlDir = "store";
|
||||
#elif __aarch64__
|
||||
QString SparkAPI::serverUrlDir = "aarch64-store";
|
||||
#endif
|
||||
|
||||
SparkAPI::SparkAPI(QObject *parent) : QObject(parent)
|
||||
{
|
||||
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
||||
if(!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE")
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
if (!config.value("server/choose").toString().isEmpty() && config.value("server/updated").toBool())
|
||||
{
|
||||
SparkAPI::setServerUrl(readConfig.value("server/choose").toString());
|
||||
SparkAPI::setServerUrl(config.value("server/choose").toString());
|
||||
}
|
||||
}
|
||||
|
||||
void SparkAPI::get(QUrl url)
|
||||
{
|
||||
QNetworkRequest request;
|
||||
HttpRequest *httprequest=new HttpRequest;
|
||||
request.setUrl(QUrl(url.toString().replace("+","%2B")));
|
||||
connect(httprequest,&HttpRequest::finished,[=](QString data){
|
||||
HttpRequest *httprequest = new HttpRequest;
|
||||
request.setUrl(QUrl(url.toString().replace("+", "%2B")));
|
||||
connect(httprequest, &HttpRequest::finished, [=](QString data)
|
||||
{
|
||||
QByteArray arr = data.toUtf8();
|
||||
//解析Json
|
||||
QJsonParseError error;
|
||||
if(QJsonDocument::fromJson(arr,&error).isArray())
|
||||
{
|
||||
auto doc = QJsonDocument::fromJson(arr,&error).array();
|
||||
emit finished(doc);
|
||||
}else {
|
||||
auto doc = QJsonDocument::fromJson(arr,&error).object();
|
||||
emit finishedObject(doc);
|
||||
}
|
||||
// 解析 Json
|
||||
QJsonParseError error;
|
||||
if(QJsonDocument::fromJson(arr,&error).isArray())
|
||||
{
|
||||
auto doc = QJsonDocument::fromJson(arr,&error).array();
|
||||
emit finished(doc);
|
||||
} else {
|
||||
auto doc = QJsonDocument::fromJson(arr,&error).object();
|
||||
emit finishedObject(doc);
|
||||
}
|
||||
|
||||
httprequest->deleteLater();
|
||||
httprequest->deleteLater();
|
||||
});
|
||||
|
||||
httprequest->getRequest(request);
|
||||
}
|
||||
|
||||
void SparkAPI::getRAW(QUrl url)
|
||||
{
|
||||
QNetworkRequest request;
|
||||
HttpRequest *httprequest=new HttpRequest;
|
||||
request.setUrl(QUrl(url.toString().replace("+","%2B")));
|
||||
connect(httprequest,&HttpRequest::finished,[=](QString data){
|
||||
HttpRequest *httprequest = new HttpRequest;
|
||||
request.setUrl(QUrl(url.toString().replace("+", "%2B")));
|
||||
connect(httprequest, &HttpRequest::finished, [=](QString data)
|
||||
{
|
||||
emit finishedRAW(data);
|
||||
httprequest->deleteLater();
|
||||
});
|
||||
httprequest->deleteLater(); });
|
||||
httprequest->getRequest(request);
|
||||
}
|
||||
|
||||
void SparkAPI::getAppList(QString type)
|
||||
{
|
||||
get(QUrl(getServerUrl()+"store/"+type+"/applist.json"));
|
||||
get(QUrl(getServerUrl() + SparkAPI::serverUrlDir + "/" + type + "/applist.json"));
|
||||
}
|
||||
|
||||
void SparkAPI::getSearchList(QString keyword)
|
||||
{
|
||||
get(QUrl("https://search.deepinos.org.cn/appinfo/search?keyword="+keyword));
|
||||
get(QUrl("https://search.deepinos.org.cn/appinfo/search?keyword=" + keyword));
|
||||
}
|
||||
|
||||
void SparkAPI::getAppInfo(QUrl spk)
|
||||
{
|
||||
get(QUrl(getServerUrl()+"store"+spk.path().replace("+","%2B") + "/app.json"));
|
||||
get(QUrl(getServerUrl() + SparkAPI::serverUrlDir + spk.path().replace("+", "%2B") + "/app.json"));
|
||||
}
|
||||
|
||||
QString SparkAPI::getArchDir()
|
||||
{
|
||||
return SparkAPI::serverUrlDir;
|
||||
}
|
||||
|
||||
void SparkAPI::getAppDownloadTimes(QUrl spk)
|
||||
{
|
||||
getRAW(QUrl(getServerUrl()+"store"+spk.path().replace("+","%2B") + "/download-times.txt"));
|
||||
getRAW(QUrl(getServerUrl() + SparkAPI::serverUrlDir + spk.path().replace("+", "%2B") + "/download-times.txt"));
|
||||
}
|
||||
|
||||
QString SparkAPI::getServerUrl()
|
||||
{
|
||||
return SparkAPI::serverUrl;
|
||||
}
|
||||
|
||||
QString SparkAPI::getImgServerUrl()
|
||||
{
|
||||
return SparkAPI::serverUrl;
|
||||
}
|
||||
|
||||
void SparkAPI::setServerUrl(QString url)
|
||||
{
|
||||
SparkAPI::serverUrl = url;
|
||||
|
||||
@@ -1,16 +1,21 @@
|
||||
#ifndef SPARKAPI_H
|
||||
#define SPARKAPI_H
|
||||
|
||||
#include "utils/httprequest.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
#include <QJsonParseError>
|
||||
#include "utils/httprequest.h"
|
||||
#include <QSettings>
|
||||
#include <QDir>
|
||||
|
||||
class SparkAPI : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SparkAPI(QObject *parent = nullptr);
|
||||
|
||||
static QString getServerUrl();
|
||||
static QString getImgServerUrl();
|
||||
static void setServerUrl(QString url);
|
||||
@@ -20,17 +25,16 @@ public:
|
||||
void getRAW(QUrl url);
|
||||
void getAppList(QString type);
|
||||
void getAppInfo(QUrl spk);
|
||||
explicit SparkAPI(QObject *parent = nullptr);
|
||||
|
||||
private:
|
||||
static QString serverUrl;
|
||||
static QString getArchDir();
|
||||
|
||||
signals:
|
||||
void finished(QJsonArray);
|
||||
void finishedRAW(QString);
|
||||
void finishedObject(QJsonObject);
|
||||
|
||||
public slots:
|
||||
private:
|
||||
static QString serverUrl;
|
||||
static QString serverUrlDir;
|
||||
};
|
||||
|
||||
#endif // SPARKAPI_H
|
||||
|
||||
@@ -3,10 +3,9 @@
|
||||
DBusSparkStoreService::DBusSparkStoreService(QObject *parent)
|
||||
: QDBusAbstractAdaptor(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void DBusSparkStoreService::activeWindow(const QString & arg)
|
||||
void DBusSparkStoreService::activeWindow(const QString &arg)
|
||||
{
|
||||
emit sigOpenUrl(arg);
|
||||
}
|
||||
|
||||
212
src/main.cpp
212
src/main.cpp
@@ -1,128 +1,144 @@
|
||||
#include "application.h"
|
||||
#include "mainwindow-dtk.h"
|
||||
#include "utils/utils.h"
|
||||
|
||||
#include <DApplication>
|
||||
#include <DLog>
|
||||
#include <DPlatformWindowHandle>
|
||||
#include <DSysInfo>
|
||||
#include <DApplicationSettings>
|
||||
#include <DAboutDialog>
|
||||
#include <QLabel>
|
||||
#include <DWidgetUtil>
|
||||
|
||||
#include <QDate>
|
||||
#include <QProcessEnvironment>
|
||||
#include <QSettings>
|
||||
#include <QFile>
|
||||
#include <QStandardPaths>
|
||||
#include <QSurfaceFormat>
|
||||
|
||||
DCORE_USE_NAMESPACE
|
||||
DWIDGET_USE_NAMESPACE
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// Get build time
|
||||
static const QString version = "Version 4.1.1";
|
||||
static const QDate buildDate = QLocale( QLocale::English ).toDate( QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy");
|
||||
static const QDate buildDate = QLocale(QLocale::English).toDate(QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy");
|
||||
static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss");
|
||||
static const QString buildDateTime = buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString("hh:mm:ss");
|
||||
|
||||
// NOTE: 提前设置组织名称和应用名称,避免配置文件位置错误
|
||||
DApplication::setOrganizationName("spark-union");
|
||||
DApplication::setApplicationName("spark-store");
|
||||
Application::checkAppConfigLocation(); // 检查 ~/.config/spark-union/spark-store 文件夹是否存在
|
||||
|
||||
// 初始化 config.ini 配置文件
|
||||
Utils::initConfig();
|
||||
|
||||
// Set display backend
|
||||
Utils::setQPAPlatform();
|
||||
|
||||
// 龙芯机器配置,使得 DApplication 能正确加载 QTWEBENGINE
|
||||
qputenv("DTK_FORCE_RASTER_WIDGETS", "FALSE");
|
||||
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-features=UseModernMediaControls");
|
||||
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
|
||||
|
||||
//设置桌面环境环境变量
|
||||
if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin")) {
|
||||
setenv("XDG_CURRENT_DESKTOP", "Deepin", 1);
|
||||
}
|
||||
DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持
|
||||
#ifndef DSTORE_NO_DXCBs
|
||||
DApplication::loadDXcbPlugin(); // 加载 DXCB 插件
|
||||
#endif
|
||||
|
||||
// 浏览器开启 GPU 支持
|
||||
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode");
|
||||
#ifdef __sw_64__
|
||||
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox");
|
||||
#elif __aarch64__
|
||||
if (!Utils::isWayland()) {
|
||||
QString env = QString::fromUtf8(qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"));
|
||||
env = env.trimmed();
|
||||
/**
|
||||
* NOTE: 参考帮助手册代码,对于部分ARM CPU 设备,
|
||||
* --disable-gpu 保证 X11 环境下网页正常显示
|
||||
* --single-process 避免 X11 环境下 QtWebEngine 崩溃(可选)
|
||||
*/
|
||||
env += " --disable-gpu";
|
||||
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", env.trimmed().toUtf8());
|
||||
|
||||
QVector<char*> fakeArgs(argc + 2);
|
||||
QSurfaceFormat format;
|
||||
format.setRenderableType(QSurfaceFormat::OpenGLES);
|
||||
QSurfaceFormat::setDefaultFormat(format);
|
||||
|
||||
/**
|
||||
* NOTE: https://zhuanlan.zhihu.com/p/550285855
|
||||
* 避免 X11 环境下从 QtWebEngine 后退回到 QWidget 时黑屏闪烁
|
||||
*/
|
||||
qputenv("QMLSCENE_DEVICE", "softwarecontext");
|
||||
DApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* FIXME: 对于麒麟 CPU 设备,调用 QtWebEngine 会导致客户端崩溃;
|
||||
* 暂时不对 CPU 进行判断,对 wayland 环境下统一处理
|
||||
*/
|
||||
if (Utils::isWayland()) {
|
||||
QString env = QString::fromUtf8(qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"));
|
||||
env = env.trimmed();
|
||||
/**
|
||||
* NOTE: 参考帮助手册代码,对于麒麟 CPU 设备,
|
||||
* --disable-gpu 保证 wayland 环境下网页正常显示
|
||||
* --single-process 避免 wayland 环境下 QtWebEngine 崩溃(可选)
|
||||
*/
|
||||
env += " --disable-gpu";
|
||||
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", env.trimmed().toUtf8());
|
||||
|
||||
/**
|
||||
* NOTE: 参考帮助手册代码,对于麒麟 CPU 设备,
|
||||
* 避免 wayland 环境下 QtWebEngine 崩溃
|
||||
*/
|
||||
qputenv("QT_WAYLAND_SHELL_INTEGRATION", "kwayland-shell");
|
||||
QSurfaceFormat format;
|
||||
format.setRenderableType(QSurfaceFormat::OpenGLES);
|
||||
QSurfaceFormat::setDefaultFormat(format);
|
||||
|
||||
/**
|
||||
* NOTE: https://zhuanlan.zhihu.com/p/550285855
|
||||
* 避免 wayland 环境下从 QtWebEngine 后退回到 QWidget 时黑屏闪烁
|
||||
*/
|
||||
qputenv("QMLSCENE_DEVICE", "softwarecontext");
|
||||
DApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
|
||||
}
|
||||
|
||||
DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持
|
||||
|
||||
// 强制使用 DTK 平台插件
|
||||
QVector<char *> fakeArgs(argc + 2);
|
||||
fakeArgs[0] = argv[0];
|
||||
fakeArgs[1] = "-platformtheme";
|
||||
fakeArgs[2] = "deepin";
|
||||
for(int i = 1; i < argc; i++) fakeArgs[i + 2] = argv[i];
|
||||
int fakeArgc = argc + 2; // 为啥DApplication的argc要用引用啊?
|
||||
DApplication a(fakeArgc, fakeArgs.data());
|
||||
|
||||
|
||||
//初始化日志模块 (默认日志位置 ~/.cache/deepin/spark-store)
|
||||
DLogManager::registerConsoleAppender();
|
||||
DLogManager::registerFileAppender();
|
||||
|
||||
|
||||
//Wayland 环境下使用,防止子控件 Native 化
|
||||
if (!DPlatformWindowHandle::pluginVersion().isEmpty()) {
|
||||
a.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
|
||||
}
|
||||
a.setAttribute(Qt::AA_UseHighDpiPixmaps);
|
||||
a.loadDXcbPlugin();
|
||||
|
||||
a.loadTranslator(); // 载入翻译
|
||||
|
||||
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
||||
|
||||
if (readConfig.value("build/version").toString() != version){
|
||||
qDebug() << "Spark Store has been updated!";
|
||||
QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
||||
setConfig->setValue("build/version", version);
|
||||
setConfig->setValue("build/time", buildDate.toString("yyyy.MM.dd")+"-"+buildTime.toString());
|
||||
setConfig->deleteLater();
|
||||
}
|
||||
|
||||
//Customized DAboutDialog
|
||||
|
||||
DAboutDialog dialog;
|
||||
a.setAboutDialog(&dialog);
|
||||
dialog.setLicense(QObject::tr("We publish this program under GPL V3"));
|
||||
dialog.setVersion(DApplication::buildVersion(readConfig.value("build/version").toString()+"-"+"Flamescion"+"-"+readConfig.value("build/time").toString()));
|
||||
dialog.setProductIcon(QIcon::fromTheme("spark-store")); // 设置Logo
|
||||
dialog.setProductName(QLabel::tr("Spark Store"));
|
||||
dialog.setDescription(
|
||||
QObject::tr(
|
||||
"<span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/>"
|
||||
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
|
||||
"<span style=' font-size:12pt;'>Spark developers</span>"
|
||||
)
|
||||
);
|
||||
|
||||
dialog.setProductName(QLabel::tr("Spark Store"));
|
||||
dialog.setCompanyLogo(QPixmap(":/spark-store.png"));
|
||||
dialog.setWebsiteName(QObject::tr("The Spark Project"));
|
||||
dialog.setWebsiteLink("https://gitee.com/deepin-community-store");
|
||||
|
||||
a.setOrganizationName("spark-union");
|
||||
a.setProductName(QObject::tr("Spark Store"));
|
||||
a.setApplicationName("Spark Store"); // 不用翻译,影响 ~/.local/share/spark-union 下文件夹名称
|
||||
a.setApplicationDisplayName(QObject::tr("Spark Store")); // 设置窗口显示标题 (Wayland 下会显示 Qt 原生标题栏)
|
||||
a.setWindowIcon(QIcon::fromTheme("spark-store"));
|
||||
a.setApplicationDescription(
|
||||
QObject::tr(
|
||||
"<span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/>"
|
||||
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
|
||||
"<span style='font-size:12pt;'>Spark developers</span><br/><br/>"
|
||||
"Published under GPL V3"
|
||||
)
|
||||
);
|
||||
// 限制单实例运行
|
||||
if(!a.setSingleInstance("spark-store"))
|
||||
fakeArgs[1] = const_cast<char *>("-platformtheme");
|
||||
fakeArgs[2] = const_cast<char *>("deepin");
|
||||
for (int i = 1; i < argc; i++)
|
||||
{
|
||||
qDebug() << "The application is already running!";
|
||||
QDBusInterface iface("com.gitee.spark.store",
|
||||
"/com/gitee/spark/store",
|
||||
"com.gitee.spark.store",
|
||||
QDBusConnection::sessionBus());
|
||||
|
||||
QString arg1 = argv[1];
|
||||
|
||||
iface.asyncCall("activeWindow",arg1);
|
||||
|
||||
fakeArgs[i + 2] = argv[i];
|
||||
}
|
||||
int fakeArgc = argc + 2; // QCoreApplication 的 argc 要用引用,避免 c++ 编译器优化
|
||||
Application a(fakeArgc, fakeArgs.data());
|
||||
// 设置版本和构建时间
|
||||
a.setBuildDateTime(buildDateTime);
|
||||
|
||||
// 限制单实例运行
|
||||
if (!a.setSingleInstance("spark-store"))
|
||||
{
|
||||
qWarning() << "Another instance has already started, activating...";
|
||||
return -1;
|
||||
}
|
||||
|
||||
DGuiApplicationHelper::instance()->setPaletteType(DGuiApplicationHelper::LightType); //固定主题为浅色主题
|
||||
DApplicationSettings settings; // 定义 DApplicationSettings,自动保存主题设置
|
||||
|
||||
MainWindow w;
|
||||
a.setMainWindow(&w); // 设置应用程序主窗口,用于初始化关于对话框
|
||||
// 让打开时界面显示在正中
|
||||
Dtk::Widget::moveToCenter(&w);
|
||||
|
||||
QString arg1 = argv[1];
|
||||
if (arg1.startsWith("spk://")) {
|
||||
w.openUrl(QUrl(argv[1]));
|
||||
if (argc > 1)
|
||||
{
|
||||
QString arg1 = argv[1];
|
||||
if (arg1.trimmed().startsWith("spk://"))
|
||||
{
|
||||
w.openUrl(arg1);
|
||||
}
|
||||
}
|
||||
w.show();
|
||||
|
||||
|
||||
@@ -1,86 +1,285 @@
|
||||
#include "mainwindow-dtk.h"
|
||||
#include "ui_mainwindow-dtk.h"
|
||||
#include "utils/widgetanimation.h"
|
||||
#include "widgets/common/progressbutton.h"
|
||||
#include "widgets/downloadlistwidget.h"
|
||||
#include "widgets/common/downloaditem.h"
|
||||
#include "dbus/dbussparkstoreservice.h"
|
||||
#include "application.h"
|
||||
|
||||
#include <DLabel>
|
||||
#include <DWidgetUtil>
|
||||
#include <DGuiApplicationHelper>
|
||||
#include <QSizePolicy>
|
||||
|
||||
#include <QDesktopServices>
|
||||
#include <QAbstractButton>
|
||||
#include <QtConcurrent>
|
||||
|
||||
#define AppPageApplist 0
|
||||
#define AppPageSearchlist 1
|
||||
#define AppPageAppdetail 2
|
||||
#define AppPageSettings 3
|
||||
#define WaylandSearchCenter 1
|
||||
#define OtherSearchCenter 2
|
||||
#define RightSearchSpace 1
|
||||
#define UploadServerUrl "https://upload.deepinos.org/"
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent)
|
||||
: BaseWidgetOpacity(parent)
|
||||
, ui(new Ui::MainWindow)
|
||||
, downloadlistwidget(new DownloadListWidget)
|
||||
, trayIcon(new QSystemTrayIcon(QIcon::fromTheme("spark-store"), this))
|
||||
{
|
||||
ui->setupUi(this);
|
||||
initConfig();
|
||||
moveToCenter(this); //让窗口居中显示
|
||||
|
||||
WidgetAnimation::widgetOpacity(this,true);
|
||||
initTmpDir();
|
||||
|
||||
initUI();
|
||||
initConnections();
|
||||
|
||||
downloadlistwidget = new DownloadListWidget;
|
||||
downloadButton = new ProgressButton(ui->titlebar);
|
||||
backButtom = new QPushButton(ui->titlebar);
|
||||
ui->appintopage->setDownloadWidget(downloadlistwidget);
|
||||
ui->stackedWidget->setCurrentIndex(0);
|
||||
ui->titlebar->setBackgroundTransparent(true);
|
||||
//ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单
|
||||
|
||||
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete ui;
|
||||
|
||||
downloadlistwidget->deleteLater();
|
||||
}
|
||||
|
||||
void MainWindow::initDbus()
|
||||
{
|
||||
DBusSparkStoreService *dbusInter = new DBusSparkStoreService(this);
|
||||
|
||||
QDBusConnection::sessionBus().registerService("com.gitee.spark.store");
|
||||
QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this);
|
||||
connect(dbusInter, &DBusSparkStoreService::sigOpenUrl, this, &MainWindow::onGetUrl);
|
||||
}
|
||||
|
||||
void MainWindow::onGetUrl(const QString &url)
|
||||
{
|
||||
if (url.trimmed().startsWith("spk://"))
|
||||
{
|
||||
openUrl(url);
|
||||
}
|
||||
|
||||
showWindowAnimation = false;
|
||||
closeWindowAnimation = false;
|
||||
|
||||
setWindowState(windowState() & Qt::WindowActive);
|
||||
activateWindow();
|
||||
show();
|
||||
}
|
||||
|
||||
void MainWindow::onNewProcessInstance(qint64 pid, const QStringList &arguments)
|
||||
{
|
||||
Q_UNUSED(pid)
|
||||
|
||||
onGetUrl(arguments.value(1, ""));
|
||||
}
|
||||
|
||||
void MainWindow::openUrl(const QString &url)
|
||||
{
|
||||
if (url.startsWith("spk://search/"))
|
||||
{
|
||||
QString keyword = url.mid(13);
|
||||
if (keyword == "%")
|
||||
{
|
||||
qWarning() << "keyword '%' is not valid, which will cause QtWebEngine crash.";
|
||||
return;
|
||||
}
|
||||
ui->applistpage_1->getSearchList(keyword);
|
||||
switchPage(AppPageSearchlist);
|
||||
}
|
||||
else if (url.startsWith("spk://"))
|
||||
{
|
||||
ui->appintopage->openUrl(QUrl::fromUserInput(url));
|
||||
switchPage(AppPageAppdetail);
|
||||
}
|
||||
else
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl::fromUserInput(url));
|
||||
}
|
||||
}
|
||||
|
||||
bool MainWindow::isCloseWindowAnimation()
|
||||
{
|
||||
return closeWindowAnimation;
|
||||
}
|
||||
|
||||
void MainWindow::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
// 判断下载任务数量,如果没有要下载的,就直接退出主程序
|
||||
if(!downloadlistwidget->isDownloadInProcess()){
|
||||
// 已经全部下载完成
|
||||
qApp->quit();
|
||||
}
|
||||
|
||||
BaseWidgetOpacity::closeEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::initUI()
|
||||
{
|
||||
setWindowTitle(QObject::tr("Spark Store"));
|
||||
setMaskAlpha(250);
|
||||
|
||||
initTitleBar();
|
||||
initLeftMenu();
|
||||
|
||||
ui->stackedWidget->setCurrentIndex(0);
|
||||
updateUi(0);
|
||||
|
||||
initTrayIcon();
|
||||
}
|
||||
|
||||
void MainWindow::initTitleBar()
|
||||
{
|
||||
ui->titlebar->setIcon(QIcon::fromTheme("spark-store"));
|
||||
ui->titlebar->setBackgroundTransparent(true);
|
||||
// ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单
|
||||
|
||||
// 初始化标题栏控件
|
||||
DLabel *title = new DLabel(ui->titlebar);
|
||||
title->setText(tr("Spark Store"));
|
||||
|
||||
backButton = new DPushButton(ui->titlebar);
|
||||
|
||||
searchEdit = new DSearchEdit(ui->titlebar);
|
||||
searchEdit->setPlaceholderText(tr("Search or enter spk://"));
|
||||
|
||||
downloadButton = new ProgressButton(ui->titlebar);
|
||||
downloadButton->setDownloadListWidget(downloadlistwidget);
|
||||
downloadButton->setFocusPolicy(Qt::FocusPolicy::ClickFocus);
|
||||
downloadlistwidget->setFocusProxy(downloadButton);
|
||||
|
||||
QWidget *w_titlebar = new QWidget(ui->titlebar);
|
||||
QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
|
||||
ly_titlebar->addWidget(title);
|
||||
ly_titlebar->addWidget(backButton);
|
||||
// Check wayland configs
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
if (!config.value("runtime/isDDE").toBool() && config.value("runtime/useWayland").toBool())
|
||||
{
|
||||
// Wayland 搜索栏居中
|
||||
ly_titlebar->addStretch(WaylandSearchCenter);
|
||||
}
|
||||
else
|
||||
{
|
||||
// dwayland dxcb 搜索栏顶部右侧居中
|
||||
ly_titlebar->addStretch(OtherSearchCenter);
|
||||
}
|
||||
ly_titlebar->addWidget(searchEdit);
|
||||
ly_titlebar->addWidget(downloadButton);
|
||||
ly_titlebar->addStretch(RightSearchSpace);
|
||||
ui->titlebar->setCustomWidget(w_titlebar);
|
||||
|
||||
initTitleBarMenu();
|
||||
|
||||
backButton->hide();
|
||||
downloadlistwidget->hide();
|
||||
}
|
||||
|
||||
void MainWindow::initTitleBarMenu()
|
||||
{
|
||||
QAction *actionSubmission = new QAction(tr("Submit App"), this);
|
||||
QAction *actionSubmissionWithClient = new QAction(tr("Submit App with client(Recommanded)"), this);
|
||||
QAction *setting = new QAction(tr("Settings"));
|
||||
QAction *upgrade = new QAction(tr("APP Upgrade and Install Settings"));
|
||||
QMenu *menu = new QMenu;
|
||||
QMenu *menu = new QMenu(ui->titlebar);
|
||||
menu->addAction(setting);
|
||||
menu->addAction(upgrade);
|
||||
menu->addAction(actionSubmission);
|
||||
menu->addAction(actionSubmissionWithClient);
|
||||
|
||||
ui->titlebar->setMenu(menu);
|
||||
connect(actionSubmission, &QAction::triggered, this, [=]{QDesktopServices::openUrl(QUrl("https://upload.deepinos.org/"));});
|
||||
connect(setting, &QAction::triggered, this, [=]{
|
||||
|
||||
connect(actionSubmission, &QAction::triggered, this, [=]
|
||||
{ QDesktopServices::openUrl(QUrl(UploadServerUrl)); });
|
||||
connect(setting, &QAction::triggered, this, [=]
|
||||
{
|
||||
switchPage(AppPageSettings);
|
||||
ui->settingspage->updateUI();
|
||||
});
|
||||
connect(upgrade, &QAction::triggered, this, [=]{QProcess::startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh");});
|
||||
ui->settingspage->updateUI(); });
|
||||
connect(upgrade, &QAction::triggered, this, [=]
|
||||
{ QProcess::startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh", QStringList()); });
|
||||
// 投稿器
|
||||
connect(actionSubmissionWithClient, &QAction::triggered, this, [=]
|
||||
{
|
||||
QString submitterSpk = "spk://store/tools/spark-store-submitter";
|
||||
QFile actionSubmissionClientStatus("/opt/spark-store-submitter/bin/spark-store-submitter");
|
||||
if (actionSubmissionClientStatus.exists())
|
||||
{
|
||||
qDebug() << "投稿器存在";
|
||||
QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter");
|
||||
}
|
||||
else{
|
||||
qDebug() << "投稿器不存在,跳转页面";
|
||||
openUrl(submitterSpk);
|
||||
}
|
||||
QString submitterSpk = "spk://store/tools/spark-store-submitter";
|
||||
QFile actionSubmissionClientStatus("/opt/spark-store-submitter/bin/spark-store-submitter");
|
||||
if (actionSubmissionClientStatus.exists())
|
||||
{
|
||||
qDebug() << "投稿器存在";
|
||||
QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter", QStringList());
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "投稿器不存在,跳转页面";
|
||||
openUrl(submitterSpk);
|
||||
} });
|
||||
}
|
||||
|
||||
});
|
||||
void MainWindow::initLeftMenu()
|
||||
{
|
||||
// 侧边栏按钮
|
||||
foreach (QAbstractButton *button, ui->buttonGroup->buttons())
|
||||
{
|
||||
button->setStyleSheet("QPushButton{qproperty-icon: url(data/images/userMangaer/teacher.png);}");
|
||||
connect(button, &QPushButton::toggled, [=](bool checked)
|
||||
{
|
||||
if (checked == true) {
|
||||
searchEdit->clearEdit();
|
||||
updateUi(ui->buttonGroup->buttons().indexOf(button));
|
||||
} });
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::initTrayIcon()
|
||||
{
|
||||
trayIcon->setToolTip(tr("Spark Store"));
|
||||
|
||||
//主题切换
|
||||
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) {
|
||||
QMenu *menu = new QMenu(this);
|
||||
QAction *showAction = new QAction(QObject::tr("Show MainWindow"), menu);
|
||||
QAction *aboutAction = new QAction(qApp->translate("TitleBarMenu", "About"), menu);
|
||||
QAction *exitAction = new QAction(qApp->translate("TitleBarMenu", "Exit"), menu);
|
||||
menu->addAction(showAction);
|
||||
menu->addAction(aboutAction);
|
||||
menu->addAction(exitAction);
|
||||
trayIcon->setContextMenu(menu);
|
||||
|
||||
connect(showAction, &QAction::triggered, this, [=]()
|
||||
{
|
||||
showWindowAnimation = false;
|
||||
closeWindowAnimation = false;
|
||||
|
||||
setWindowState(windowState() & Qt::WindowActive);
|
||||
activateWindow();
|
||||
show(); });
|
||||
connect(aboutAction, &QAction::triggered, this, [=]()
|
||||
{
|
||||
qobject_cast<Application *>(qApp)->handleAboutAction(); });
|
||||
connect(exitAction, &QAction::triggered, this, [=]()
|
||||
{
|
||||
qobject_cast<Application *>(qApp)->quit(); });
|
||||
|
||||
trayIcon->show();
|
||||
}
|
||||
|
||||
void MainWindow::initConnections()
|
||||
{
|
||||
// 主题切换
|
||||
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType)
|
||||
{
|
||||
if (themeType == DGuiApplicationHelper::DarkType) {
|
||||
//深色模式
|
||||
setMaskColor(QColor("#2a2b2b"));
|
||||
this->setStyleSheet("#mainpage{background-color: transparent;border-radius:14px;}\
|
||||
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#FFFFFF}\
|
||||
");
|
||||
backButtom->setIcon(QIcon(":/icon/dark/back.svg"));
|
||||
backButton->setIcon(QIcon(":/icon/dark/back.svg"));
|
||||
downloadButton->setIcon(":/icon/dark/download.svg");
|
||||
downloadButton->setBackgroundColor(QColor("#444444"));
|
||||
downloadButton->setColor(QColor("#66CCFF"));
|
||||
ui->pushButton_14->setIcon(QIcon(":/icon/dark/update.svg"));
|
||||
int i = 0;
|
||||
while (i < ui->buttonGroup->buttons().size()) {
|
||||
for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
|
||||
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/dark/leftbutton_" + QString::number(i) + ".svg"));
|
||||
if (QLocale::system().name() == "zh_CN") {
|
||||
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
|
||||
@@ -91,21 +290,16 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\
|
||||
QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
//亮色模式
|
||||
setMaskColor(QColor("#f3f7f8"));
|
||||
this->setStyleSheet("#mainpage{background-color: transparent;border-radius:14px;}\
|
||||
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#000000}\
|
||||
");
|
||||
backButtom->setIcon(QIcon(":/icon/light/back.svg"));
|
||||
backButton->setIcon(QIcon(":/icon/light/back.svg"));
|
||||
downloadButton->setBackgroundColor(QColor("#e3e4e4"));
|
||||
downloadButton->setColor(QColor("#66CCFF"));
|
||||
downloadButton->setIcon(":/icon/light/download.svg");
|
||||
ui->pushButton_14->setIcon(QIcon(":/icon/light/update.svg"));
|
||||
int i = 0;
|
||||
while (i < ui->buttonGroup->buttons().size()) {
|
||||
for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
|
||||
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/light/leftbutton_" + QString::number(i) + ".svg"));
|
||||
if (QLocale::system().name() == "zh_CN") {
|
||||
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
|
||||
@@ -116,186 +310,193 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\
|
||||
QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet());
|
||||
ui->applistpage->setTheme(themeType == DGuiApplicationHelper::DarkType);
|
||||
ui->applistpage_1->setTheme(themeType == DGuiApplicationHelper::DarkType);
|
||||
ui->appintopage->setTheme(themeType == DGuiApplicationHelper::DarkType);
|
||||
ui->settingspage->setTheme(themeType == DGuiApplicationHelper::DarkType);
|
||||
});
|
||||
ui->settingspage->setTheme(themeType == DGuiApplicationHelper::DarkType); });
|
||||
|
||||
//初始化标题栏控件
|
||||
connect(downloadButton, &ProgressButton::clicked, [=]() {
|
||||
QPoint pos;
|
||||
pos.setX(downloadButton->mapToGlobal(QPoint(0, 0)).x() + downloadButton->width() / 2 - downloadlistwidget->width() / 2);
|
||||
pos.setY(downloadButton->mapToGlobal(QPoint(0, 0)).y() + downloadButton->height() + 5);
|
||||
downloadlistwidget->m_move(pos.x(), pos.y());
|
||||
downloadlistwidget->show();
|
||||
});
|
||||
// appintopage按下下载按钮时标题栏下载列表按钮抖动
|
||||
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]()
|
||||
{
|
||||
WidgetAnimation::widgetShake(downloadButton, 6); // 第一个参数是抖动的控件,第二个参数是抖动范围(像素)
|
||||
});
|
||||
|
||||
//appintopage按下下载按钮时标题栏下载列表按钮抖动
|
||||
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]() {
|
||||
WidgetAnimation::widgetShake(downloadButton,6);//第一个参数是抖动的控件,第二个参数是抖动范围(像素)
|
||||
});
|
||||
|
||||
connect(backButtom, &QPushButton::clicked, [=]() {
|
||||
connect(backButton, &QPushButton::clicked, [=]()
|
||||
{
|
||||
ui->stackedWidget->setCurrentIndex(pageHistory.at(pageHistory.count() - 2));
|
||||
pageHistory.removeLast();
|
||||
if (pageHistory.count() > 1) {
|
||||
backButtom->show();
|
||||
backButton->show();
|
||||
} else {
|
||||
backButtom->hide();
|
||||
}
|
||||
});
|
||||
downloadlistwidget->hide();
|
||||
backButtom->hide();
|
||||
ui->titlebar->setIcon(QIcon::fromTheme(":/icon/logo.svg"));
|
||||
QWidget *w_titlebar = new QWidget(ui->titlebar);
|
||||
QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
|
||||
QLabel *title = new QLabel(this);
|
||||
title->setText(tr("Spark Store"));
|
||||
searchEdit->setPlaceholderText(tr("Search or enter spk://"));
|
||||
ly_titlebar->addWidget(title);
|
||||
ly_titlebar->addWidget(backButtom);
|
||||
ly_titlebar->addStretch(2.5);
|
||||
ly_titlebar->addWidget(searchEdit);
|
||||
ly_titlebar->addWidget(downloadButton);
|
||||
ly_titlebar->addStretch(1);
|
||||
ui->titlebar->setCustomWidget(w_titlebar);
|
||||
//侧边栏按钮
|
||||
int i = 0;
|
||||
while (i < ui->buttonGroup->buttons().size()) {
|
||||
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{qproperty-icon: url(data/images/userMangaer/teacher.png);}");
|
||||
connect(ui->buttonGroup->buttons()[i], &QPushButton::toggled, [=](bool checked) {
|
||||
if (checked == true) {
|
||||
searchEdit->clearEdit();
|
||||
updateUi(i);
|
||||
}
|
||||
});
|
||||
i++;
|
||||
}
|
||||
backButton->hide();
|
||||
} });
|
||||
|
||||
// 搜索事件
|
||||
connect(searchEdit, &DSearchEdit::returnPressed, this, [=]() {
|
||||
connect(searchEdit, &DSearchEdit::returnPressed, this, [=]()
|
||||
{
|
||||
QString searchtext = searchEdit->text();
|
||||
if (!searchtext.isEmpty()) {
|
||||
if (searchtext.startsWith("spk://")) {
|
||||
openUrl(QUrl(searchtext));
|
||||
openUrl(searchtext);
|
||||
searchEdit->clearEdit();
|
||||
} else {
|
||||
ui->applistpage_1->getSearchList(searchtext);
|
||||
switchPage(AppPageSearchlist);
|
||||
if (searchtext == "%")
|
||||
{
|
||||
qWarning() << "keyword '%' matches too many results, which will cause QtWebEngine crash.";
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->applistpage_1->getSearchList(searchtext);
|
||||
switchPage(AppPageSearchlist);
|
||||
}
|
||||
}
|
||||
}
|
||||
this->setFocus();
|
||||
});
|
||||
this->setFocus(); });
|
||||
|
||||
connect(downloadlistwidget, &DownloadListWidget::downloadProgress, this, [=](int i) {
|
||||
downloadButton->setProgress(i);
|
||||
});
|
||||
connect(downloadlistwidget, &DownloadListWidget::downloadProgress, this, [=](int i)
|
||||
{ downloadButton->setProgress(i); });
|
||||
// 列表点击事件
|
||||
connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk) {
|
||||
openUrl(spk);
|
||||
});
|
||||
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk) {
|
||||
openUrl(spk);
|
||||
});
|
||||
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk) {
|
||||
openUrl(spk);
|
||||
});
|
||||
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
|
||||
connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk)
|
||||
{ openUrl(spk.toString()); });
|
||||
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk)
|
||||
{ openUrl(spk.toString()); });
|
||||
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk)
|
||||
{ openUrl(spk.toString()); });
|
||||
|
||||
initDbus();
|
||||
// 托盘图标点击事件
|
||||
connect(trayIcon, &QSystemTrayIcon::activated, this, [=](QSystemTrayIcon::ActivationReason reason)
|
||||
{
|
||||
switch (reason) {
|
||||
case QSystemTrayIcon::Trigger:
|
||||
{
|
||||
showWindowAnimation = false;
|
||||
closeWindowAnimation = false;
|
||||
|
||||
setWindowState(windowState() & Qt::WindowActive);
|
||||
activateWindow();
|
||||
show();
|
||||
|
||||
Q_FALLTHROUGH();
|
||||
}
|
||||
default:
|
||||
break;
|
||||
} });
|
||||
|
||||
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::newProcessInstance, this, &MainWindow::onNewProcessInstance);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete searchEdit;
|
||||
delete downloadlistwidget;
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void MainWindow::initDbus()
|
||||
{
|
||||
DBusSparkStoreService *dbusInter = new DBusSparkStoreService(this);
|
||||
|
||||
QDBusConnection::sessionBus().registerService("com.gitee.spark.store");
|
||||
QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this);
|
||||
connect(dbusInter,&DBusSparkStoreService::sigOpenUrl,this,&MainWindow::onGetUrl);
|
||||
}
|
||||
|
||||
void MainWindow::onGetUrl(const QString &url)
|
||||
{
|
||||
if(url.left(6)=="spk://")
|
||||
{
|
||||
openUrl(QUrl(url));
|
||||
}
|
||||
activateWindow();
|
||||
}
|
||||
|
||||
void MainWindow::openUrl(QUrl url)
|
||||
{
|
||||
if (url.toString().startsWith("spk://")) {
|
||||
ui->appintopage->openUrl(QUrl(url.toString().replace("+","%2B")));
|
||||
switchPage(AppPageAppdetail);
|
||||
} else {
|
||||
QDesktopServices::openUrl(QUrl(url.toString().replace("+","%2B")));
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::initConfig()
|
||||
void MainWindow::initTmpDir()
|
||||
{
|
||||
// 新建临时文件夹
|
||||
QDir dir;
|
||||
dir.mkpath("/tmp/spark-store");
|
||||
}
|
||||
|
||||
void MainWindow::switchPage(int now) //临时方案,回家后修改
|
||||
void MainWindow::switchPage(int now) // 临时方案,回家后修改
|
||||
{
|
||||
qDebug() << pageHistory.count();
|
||||
if (pageHistory.count() >= 1) {
|
||||
backButtom->show();
|
||||
} else {
|
||||
backButtom->hide();
|
||||
if (pageHistory.count() >= 1)
|
||||
{
|
||||
backButton->show();
|
||||
}
|
||||
else
|
||||
{
|
||||
backButton->hide();
|
||||
}
|
||||
ui->stackedWidget->setCurrentIndex(now);
|
||||
ui->stackedWidget->currentWidget()->setFocus();
|
||||
pageHistory << now;
|
||||
}
|
||||
|
||||
//刷新界面
|
||||
// 刷新界面
|
||||
void MainWindow::updateUi(int now)
|
||||
{
|
||||
pageHistory.clear();
|
||||
QStringList itemlist;
|
||||
itemlist << ""
|
||||
<< "network"
|
||||
<< "chat"
|
||||
<< "music"
|
||||
<< "video"
|
||||
<< "image_graphics"
|
||||
<< "games"
|
||||
<< "office"
|
||||
<< "reading"
|
||||
<< "development"
|
||||
<< "tools"
|
||||
<< "themes"
|
||||
<< "others";
|
||||
ui->applistpage->getAppList(itemlist[now]);
|
||||
qDebug() << itemlist[now];
|
||||
switchPage(AppPageApplist);
|
||||
QStringList itemlist;
|
||||
itemlist << ""
|
||||
<< "network"
|
||||
<< "chat"
|
||||
<< "music"
|
||||
<< "video"
|
||||
<< "image_graphics"
|
||||
<< "games"
|
||||
<< "office"
|
||||
<< "reading"
|
||||
<< "development"
|
||||
<< "tools"
|
||||
<< "themes"
|
||||
<< "others";
|
||||
ui->applistpage->getAppList(itemlist[now]);
|
||||
qDebug() << itemlist[now];
|
||||
switchPage(AppPageApplist);
|
||||
}
|
||||
|
||||
void MainWindow::notify(QObject *receiver, QEvent *event)
|
||||
{
|
||||
if (!receiver) {
|
||||
return;
|
||||
}
|
||||
|
||||
Dtk::Widget::DStyle *o_ptr = qobject_cast<Dtk::Widget::DStyle *>(receiver);
|
||||
if (o_ptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (receiver->inherits("QWidgetWindow")
|
||||
|| receiver->inherits("QStyleSheetStyle")) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (event->type() == QEvent::FocusIn) {
|
||||
QList<QObject *> list = downloadButton->findChildren<QObject *>(QString(), Qt::FindChildrenRecursively);
|
||||
list << downloadlistwidget->findChildren<QObject *>(QString(), Qt::FindChildrenRecursively);
|
||||
if (receiver != downloadButton && receiver != downloadlistwidget && !list.contains(receiver)) {
|
||||
downloadlistwidget->hide();
|
||||
}
|
||||
} else if (event->type() == QEvent::FocusOut) {
|
||||
if (!downloadlistwidget->isActiveWindow() && !isActiveWindow()) {
|
||||
downloadlistwidget->hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_pushButton_14_clicked()
|
||||
{
|
||||
QFile upgradeStatus("/tmp/spark-store/upgradeStatus.txt");
|
||||
if (!upgradeStatus.exists()){
|
||||
QtConcurrent::run([=]{
|
||||
// Check UOS
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
if (config.contains("UOS/EnableDeveloperMode") && !config.value("UOS/EnableDeveloperMode").toBool())
|
||||
{
|
||||
qDebug() << "UOS Developer Mode has not been enabled!";
|
||||
QtConcurrent::run([=]
|
||||
{
|
||||
auto upgradeP = new QProcess();
|
||||
upgradeP->startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh");
|
||||
upgradeP->startDetached("zenity", QStringList() << "--info"
|
||||
<< "--text"
|
||||
<< "UOS开发者模式未开启,相关功能被禁用"
|
||||
<< "--title"
|
||||
<< "功能禁用提示"
|
||||
<< "--width"
|
||||
<< "360"
|
||||
);
|
||||
upgradeP->waitForStarted();
|
||||
upgradeP->waitForFinished(30);
|
||||
upgradeP->deleteLater(); });
|
||||
}
|
||||
else
|
||||
{
|
||||
QFile upgradeStatus("/tmp/spark-store/upgradeStatus.txt");
|
||||
if (!upgradeStatus.exists())
|
||||
{
|
||||
QtConcurrent::run([=]
|
||||
{
|
||||
auto upgradeP = new QProcess();
|
||||
upgradeP->startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh", QStringList());
|
||||
upgradeP->waitForStarted();
|
||||
upgradeP->waitForFinished(-1);
|
||||
});
|
||||
upgradeP->deleteLater(); });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,15 @@
|
||||
#ifndef MAINWINDOWDTK_H
|
||||
#define MAINWINDOWDTK_H
|
||||
|
||||
#include "widgets/base/basewidgetopacity.h"
|
||||
|
||||
#include <DMainWindow>
|
||||
#include <DTitlebar>
|
||||
#include <DPushButton>
|
||||
#include <DSearchEdit>
|
||||
#include <QGraphicsDropShadowEffect>
|
||||
#include <DGuiApplicationHelper>
|
||||
|
||||
#include <QPushButton>
|
||||
#include <QDir>
|
||||
#include <QDesktopServices>
|
||||
|
||||
#include "widgets/base/basewidgetopacity.h"
|
||||
#include "widgets/downloadlistwidget.h"
|
||||
#include "widgets/common/progressbutton.h"
|
||||
#include "utils/widgetanimation.h"
|
||||
#include "dbus/dbussparkstoreservice.h"
|
||||
#include <QSystemTrayIcon>
|
||||
|
||||
DWIDGET_USE_NAMESPACE
|
||||
|
||||
@@ -23,36 +17,55 @@ namespace Ui {
|
||||
class MainWindow;
|
||||
}
|
||||
|
||||
class ProgressButton;
|
||||
class DownloadListWidget;
|
||||
class MainWindow : public BaseWidgetOpacity
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(QWidget *parent = nullptr);
|
||||
~MainWindow();
|
||||
~MainWindow() override;
|
||||
|
||||
void openUrl(QUrl);
|
||||
void openUrl(const QString &url);
|
||||
|
||||
bool isCloseWindowAnimation();
|
||||
|
||||
protected:
|
||||
void closeEvent(QCloseEvent *event) override;
|
||||
|
||||
private:
|
||||
void initUI();
|
||||
void initTitleBar();
|
||||
void initTitleBarMenu();
|
||||
void initLeftMenu();
|
||||
void initTrayIcon();
|
||||
void initConnections();
|
||||
void initDbus();
|
||||
void initConfig();
|
||||
void initTmpDir();
|
||||
void switchPage(int now);
|
||||
void updateUi(int now);
|
||||
|
||||
private:
|
||||
QList<int> pageHistory;
|
||||
|
||||
DownloadListWidget *downloadlistwidget;
|
||||
ProgressButton *downloadButton;
|
||||
QPushButton *backButtom;
|
||||
DSearchEdit *searchEdit = new DSearchEdit;
|
||||
Ui::MainWindow *ui;
|
||||
public slots:
|
||||
void notify(QObject *receiver, QEvent *event);
|
||||
|
||||
private slots:
|
||||
//接受来自dbus的url
|
||||
void onGetUrl(const QString &url);
|
||||
void onNewProcessInstance(qint64 pid, const QStringList &arguments);
|
||||
void on_pushButton_14_clicked();
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
|
||||
DPushButton *backButton;
|
||||
DSearchEdit *searchEdit;
|
||||
ProgressButton *downloadButton;
|
||||
DownloadListWidget *downloadlistwidget;
|
||||
|
||||
QSystemTrayIcon *trayIcon = nullptr;
|
||||
|
||||
QList<int> pageHistory;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOWDTK_H
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1190</width>
|
||||
<height>651</height>
|
||||
<height>656</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -34,6 +34,12 @@
|
||||
<property name="autoFillBackground">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">.QWidget#mainpage {
|
||||
background: transparent;
|
||||
border-radius: 14px;
|
||||
}</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
|
||||
@@ -1,21 +1,189 @@
|
||||
#include "appintopage.h"
|
||||
#include "ui_appintopage.h"
|
||||
AppIntoPage::AppIntoPage(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::AppIntoPage)
|
||||
#include "backend/sparkapi.h"
|
||||
#include "widgets/downloadlistwidget.h"
|
||||
#include "widgets/common/downloaditem.h"
|
||||
#include "backend/image_show.h"
|
||||
#include "application.h"
|
||||
#include "utils/utils.h"
|
||||
|
||||
#include <QtConcurrent>
|
||||
#include <QClipboard>
|
||||
|
||||
AppIntoPage::AppIntoPage(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, ui(new Ui::AppIntoPage)
|
||||
, api(new SparkAPI(this))
|
||||
{
|
||||
initUI();
|
||||
initConnections();
|
||||
}
|
||||
|
||||
AppIntoPage::~AppIntoPage()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void AppIntoPage::openUrl(const QUrl &url)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
ui->listWidget->setViewMode(QListView::IconMode);
|
||||
ui->listWidget->setMovement(QListView::Static);
|
||||
ui->listWidget->setMaximumHeight(200);
|
||||
ui->listWidget->setFlow(QListView::TopToBottom);
|
||||
api1=new SparkAPI(this);
|
||||
connect(api1,&SparkAPI::finishedRAW,[=](QString download_times){
|
||||
download_times.remove(QRegExp("\\n"));
|
||||
ui->download_times->setText(download_times);
|
||||
qDebug()<<"Download Times:"+download_times;
|
||||
});
|
||||
clear();
|
||||
|
||||
// qDebug() << url;
|
||||
spk = url;
|
||||
|
||||
SparkAPI *api1 = new SparkAPI(this);
|
||||
connect(api1, &SparkAPI::finishedObject, [=](const QJsonObject &appinfo)
|
||||
{
|
||||
info = appinfo;
|
||||
|
||||
// 显示基本信息
|
||||
ui->title->setText(info["Name"].toString());
|
||||
ui->version->setText(info["Version"].toString());
|
||||
ui->author->setText(info["Author"].toString());
|
||||
ui->d_author->setText(info["Author"].toString());
|
||||
ui->d_size->setText(info["Size"].toString());
|
||||
ui->d_update->setText(info["Update"].toString());
|
||||
ui->d_pkgname->setText(info["Pkgname"].toString());
|
||||
ui->d_website->setText("<a href=\"" + info["Website"].toString() + "\">" + tr("Click Open"));
|
||||
ui->d_contributor->setText(info["Contributor"].toString());
|
||||
ui->label_2->setText(info["More"].toString());
|
||||
|
||||
// 显示 tags
|
||||
QStringList taglist = info["Tags"].toString().split(";", QString::SkipEmptyParts);
|
||||
setAppinfoTags(taglist);
|
||||
|
||||
// 获取图标
|
||||
QNetworkRequest request;
|
||||
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
|
||||
qDebug() << api->getImgServerUrl() + SparkAPI::getArchDir() + url.path() + "/icon.png";
|
||||
request.setUrl(QUrl(api->getImgServerUrl() + SparkAPI::getArchDir() + url.path() + "/icon.png"));
|
||||
request.setRawHeader("User-Agent", "Mozilla/5.0");
|
||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
||||
manager->get(request);
|
||||
QObject::connect(manager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
|
||||
{
|
||||
QByteArray jpegData = reply->readAll();
|
||||
iconpixmap.loadFromData(jpegData);
|
||||
iconpixmap.scaled(210, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
ui->icon->setPixmap(iconpixmap);
|
||||
ui->icon->setScaledContents(true);
|
||||
|
||||
manager->deleteLater(); });
|
||||
|
||||
// 获取截图
|
||||
QJsonParseError error;
|
||||
QJsonArray array = QJsonDocument::fromJson(info.value("img_urls").toString().toUtf8(), &error).array();
|
||||
QStringList imglist;
|
||||
foreach (const QJsonValue &value, array) {
|
||||
QString imgUrl = value.toString();
|
||||
imglist.append(imgUrl);
|
||||
}
|
||||
qDebug() << imglist;
|
||||
|
||||
for (int i = 0; i < imglist.size(); i++)
|
||||
{
|
||||
QNetworkRequest request;
|
||||
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
|
||||
request.setUrl(QUrl(imglist.value(i)));
|
||||
request.setRawHeader("User-Agent", "Mozilla/5.0");
|
||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
||||
manager->get(request);
|
||||
QObject::connect(manager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
|
||||
{
|
||||
QByteArray jpegData = reply->readAll();
|
||||
QPixmap pixmap;
|
||||
pixmap.loadFromData(jpegData);
|
||||
pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
image_show *img=new image_show(this);
|
||||
img->setImage(pixmap);
|
||||
//img->setScaledContents(true);
|
||||
QListWidgetItem* pItem = new QListWidgetItem();
|
||||
pItem->setSizeHint(QSize(280, 200));
|
||||
ui->listWidget->addItem(pItem);
|
||||
ui->listWidget->setItemWidget(pItem, img);
|
||||
|
||||
manager->deleteLater(); });
|
||||
}
|
||||
|
||||
// Check UOS
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
if (config.contains("UOS/EnableDeveloperMode") && !config.value("UOS/EnableDeveloperMode").toBool()){
|
||||
qDebug() << "UOS Developer Mode has not been enabled!";
|
||||
ui->downloadButton->setText(tr("Developer Mode Disabled"));
|
||||
ui->downloadButton->setEnabled(false);
|
||||
ui->downloadButton->show();
|
||||
}
|
||||
else // 非 UOS 或 UOS 已经开启开发者模式
|
||||
{
|
||||
QProcess isInstall;
|
||||
bool isInstalled;
|
||||
bool isUpdated;
|
||||
QString packagename = info["Pkgname"].toString();
|
||||
isInstall.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString());
|
||||
qDebug() << info["Pkgname"].toString();
|
||||
isInstall.waitForFinished(180 * 1000); // 默认超时 3 分钟
|
||||
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
||||
if (error == 0)
|
||||
{
|
||||
isInstalled = true;
|
||||
|
||||
QProcess isUpdate;
|
||||
isUpdate.start("dpkg-query", QStringList() << "--showformat='${Version}'"
|
||||
<< "--show" << info["Pkgname"].toString());
|
||||
isUpdate.waitForFinished(180 * 1000); // 默认超时 3 分钟
|
||||
QString localVersion = isUpdate.readAllStandardOutput();
|
||||
localVersion.replace("'", "");
|
||||
|
||||
isUpdate.start("dpkg", QStringList() << "--compare-versions" << localVersion << "ge" << info["Version"].toString());
|
||||
isUpdate.waitForFinished(180 * 1000); // 默认超时 3 分钟
|
||||
if (!isUpdate.exitCode())
|
||||
{
|
||||
isUpdated = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
isUpdated = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
isInstalled = false;
|
||||
isUpdated = false;
|
||||
}
|
||||
|
||||
if (isInstalled)
|
||||
{
|
||||
if (isUpdated)
|
||||
{
|
||||
ui->downloadButton->setText(tr("Reinstall"));
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->show();
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->downloadButton->setText(tr("Upgrade"));
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->show();
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->downloadButton->setText(tr("Download"));
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->show();
|
||||
}
|
||||
|
||||
isDownloading(SparkAPI::getServerUrl() + SparkAPI::getArchDir() + spk.path() + "/" + info["Filename"].toString());
|
||||
}
|
||||
|
||||
api1->disconnect();
|
||||
api1->deleteLater(); });
|
||||
|
||||
api1->getAppInfo(url);
|
||||
|
||||
api->getAppDownloadTimes(url);
|
||||
}
|
||||
|
||||
void AppIntoPage::clear()
|
||||
@@ -33,241 +201,31 @@ void AppIntoPage::clear()
|
||||
ui->author->clear();
|
||||
ui->label_2->clear();
|
||||
ui->downloadButton->hide();
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->setEnabled(false);
|
||||
ui->pushButton_3->hide();
|
||||
int n=ui->listWidget->count();
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
QListWidgetItem *item = ui->listWidget->takeItem(0);
|
||||
QWidget *card = ui->listWidget->itemWidget(item);
|
||||
delete card;
|
||||
card = NULL;
|
||||
delete item;
|
||||
item = NULL;
|
||||
}
|
||||
ui->listWidget->clear();
|
||||
}
|
||||
void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
|
||||
{
|
||||
dw=w;
|
||||
connect(w, &DownloadListWidget::downloadFinished, [=]() {
|
||||
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
||||
});
|
||||
}
|
||||
void AppIntoPage::openUrl(QUrl url)
|
||||
{
|
||||
spk=url;
|
||||
SparkAPI *api=new SparkAPI(this);
|
||||
clear();
|
||||
connect(api,&SparkAPI::finishedObject,[=](QJsonObject appinfo){
|
||||
|
||||
info = appinfo;
|
||||
// qDebug()<<url;
|
||||
//获取图标
|
||||
QNetworkAccessManager *naManager;
|
||||
QNetworkRequest request;
|
||||
naManager=new QNetworkAccessManager(this);
|
||||
qDebug()<<api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png";
|
||||
request.setUrl(QUrl(api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png"));
|
||||
request.setRawHeader("User-Agent", "Mozilla/5.0");
|
||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
||||
naManager->get(request);
|
||||
QObject::connect(naManager,&QNetworkAccessManager::finished,[=](QNetworkReply *reply){
|
||||
QByteArray jpegData = reply->readAll();
|
||||
iconpixmap.loadFromData(jpegData);
|
||||
iconpixmap.scaled(210, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
ui->icon->setPixmap(iconpixmap);
|
||||
ui->icon->setScaledContents(true);
|
||||
});
|
||||
ui->title->setText(info["Name"].toString());
|
||||
ui->version->setText(info["Version"].toString());
|
||||
ui->author->setText(info["Author"].toString());
|
||||
ui->d_author->setText(info["Author"].toString());
|
||||
ui->d_size->setText(info["Size"].toString());
|
||||
ui->d_update->setText(info["Update"].toString());
|
||||
ui->d_pkgname->setText(info["Pkgname"].toString());
|
||||
ui->d_website->setText("<a href=\""+info["Website"].toString()+"\">"+tr("Click Open"));
|
||||
ui->d_contributor->setText(info["Contributor"].toString());
|
||||
ui->label_2->setText(info["More"].toString());
|
||||
// QListWidgetItem *item = nullptr;
|
||||
// while ((item = ui->listWidget->takeItem(0)) != nullptr)
|
||||
// {
|
||||
// QWidget *card = ui->listWidget->itemWidget(item);
|
||||
// if (card)
|
||||
// {
|
||||
// card->deleteLater();
|
||||
// card = nullptr;
|
||||
// }
|
||||
// delete item;
|
||||
// item = nullptr;
|
||||
// }
|
||||
|
||||
QProcess isInstall;
|
||||
bool isInstalled;
|
||||
bool isUpdated;
|
||||
QString packagename = info["Pkgname"].toString();
|
||||
isInstall.start("dpkg -s " + info["Pkgname"].toString());
|
||||
qDebug()<<info["Pkgname"].toString();
|
||||
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟
|
||||
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
||||
if(error == 0)
|
||||
{
|
||||
isInstalled = true;
|
||||
|
||||
QProcess isUpdate;
|
||||
isUpdate.start("dpkg-query --showformat='${Version}' --show " + info["Pkgname"].toString());
|
||||
isUpdate.waitForFinished(180*1000); // 默认超时 3 分钟
|
||||
QString localVersion = isUpdate.readAllStandardOutput();
|
||||
localVersion.replace("'", "");
|
||||
|
||||
isUpdate.start("dpkg --compare-versions " + localVersion + " ge " + info["Version"].toString());
|
||||
isUpdate.waitForFinished(180*1000); // 默认超时 3 分钟
|
||||
if(!isUpdate.exitCode())
|
||||
{
|
||||
isUpdated = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
isUpdated = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
isInstalled = false;
|
||||
isUpdated = false;
|
||||
}
|
||||
|
||||
if(isInstalled)
|
||||
{
|
||||
if(isUpdated)
|
||||
{
|
||||
ui->downloadButton->setText(tr("Reinstall"));
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->show();
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->downloadButton->setText(tr("Upgrade"));
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->show();
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->downloadButton->setText(tr("Download"));
|
||||
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->show();
|
||||
}
|
||||
|
||||
QStringList taglist = info["Tags"].toString().split(";");
|
||||
QString tmp=info["img_urls"].toString();
|
||||
qDebug()<<tmp;
|
||||
if(tmp.left(2)=="[\"")
|
||||
{
|
||||
tmp.remove(0,2);
|
||||
}
|
||||
if(tmp.right(2)=="\"]")
|
||||
{
|
||||
tmp.remove(tmp.size()-2,tmp.size());
|
||||
}
|
||||
QStringList imglist = tmp.split("\",\"");
|
||||
qDebug()<<imglist;
|
||||
for(int i=0;i < imglist.size();i++)
|
||||
{
|
||||
QNetworkAccessManager *naManager;
|
||||
QNetworkRequest request;
|
||||
naManager=new QNetworkAccessManager(this);
|
||||
request.setUrl(QUrl(imglist[i].replace("+","%2B")));
|
||||
request.setRawHeader("User-Agent", "Mozilla/5.0");
|
||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
||||
naManager->get(request);
|
||||
QObject::connect(naManager,&QNetworkAccessManager::finished,[=](QNetworkReply *reply){
|
||||
QByteArray jpegData = reply->readAll();
|
||||
QPixmap pixmap;
|
||||
pixmap.loadFromData(jpegData);
|
||||
pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
image_show *img=new image_show(this);
|
||||
img->setImage(pixmap);
|
||||
//img->setScaledContents(true);
|
||||
QListWidgetItem* pItem = new QListWidgetItem();
|
||||
pItem->setSizeHint(QSize(280, 200));
|
||||
ui->listWidget->addItem(pItem);
|
||||
ui->listWidget->setItemWidget(pItem, img);
|
||||
});
|
||||
}
|
||||
this->sltAppinfoTags(&taglist);
|
||||
disconnect(api,&SparkAPI::finished,nullptr,nullptr);
|
||||
api->deleteLater();
|
||||
});
|
||||
api->getAppInfo(url);
|
||||
api1->getAppDownloadTimes(url);
|
||||
ui->listWidget->clear(); // NOTE: QListWidget::clear() 会析构所有 items
|
||||
}
|
||||
|
||||
void AppIntoPage::isDownloading(QUrl url)
|
||||
{
|
||||
if (dw->getUrlList().lastIndexOf(url) == -1) {
|
||||
ui->downloadButton->setEnabled(true);
|
||||
return;
|
||||
} else {
|
||||
ui->downloadButton->setEnabled(false);
|
||||
}
|
||||
|
||||
ui->pushButton_3->hide();
|
||||
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 2) {
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->setText(tr("Download"));
|
||||
}
|
||||
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 1) {
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->setText(tr("Install"));
|
||||
}
|
||||
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->isInstall) {
|
||||
ui->downloadButton->setEnabled(false);
|
||||
ui->downloadButton->setText(tr("Installing"));
|
||||
return;
|
||||
}
|
||||
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 3) {
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->setText(tr("Reinstall"));
|
||||
ui->downloadButton->show();
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
}
|
||||
|
||||
void AppIntoPage::sltAppinfoTags(QStringList *tagList)
|
||||
{
|
||||
foreach(const QString &tag, *tagList)
|
||||
{
|
||||
if(tag=="community")
|
||||
{
|
||||
ui->tag_community->show();
|
||||
}
|
||||
else if(tag=="ubuntu")
|
||||
{
|
||||
ui->tag_ubuntu->show();
|
||||
}
|
||||
else if(tag=="deepin")
|
||||
{
|
||||
ui->tag_deepin->show();
|
||||
}
|
||||
else if(tag=="uos")
|
||||
{
|
||||
ui->tag_uos->show();
|
||||
}
|
||||
else if(tag=="dtk5")
|
||||
{
|
||||
ui->tag_dtk5->show();
|
||||
}
|
||||
else if(tag=="dwine2")
|
||||
{
|
||||
ui->tag_dwine2->show();
|
||||
}
|
||||
else if(tag=="dwine5")
|
||||
{
|
||||
ui->tag_dwine5->show();
|
||||
}
|
||||
else if(tag=="a2d")
|
||||
{
|
||||
ui->tag_a2d->show();
|
||||
}
|
||||
}
|
||||
}
|
||||
void AppIntoPage::setTheme(bool dark)
|
||||
{
|
||||
if(dark)
|
||||
if (dark)
|
||||
{
|
||||
QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}";
|
||||
QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4 {background-color: #252525; border-radius: 14px; border: 1px solid rgb(64, 64, 64);}\
|
||||
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #FFFFFF}";
|
||||
ui->frame->setStyleSheet(frameStyleSheet);
|
||||
ui->frame_2->setStyleSheet(frameStyleSheet);
|
||||
ui->frame_3->setStyleSheet(frameStyleSheet);
|
||||
@@ -279,9 +237,12 @@ void AppIntoPage::setTheme(bool dark)
|
||||
ui->icon_4->setPixmap(QPixmap(":/icon/dark/text.svg"));
|
||||
ui->icon_5->setPixmap(QPixmap(":/icon/dark/folder.svg"));
|
||||
ui->icon_6->setPixmap(QPixmap(":/icon/dark/globe.svg"));
|
||||
}else {
|
||||
}
|
||||
else
|
||||
{
|
||||
//亮色模式
|
||||
QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4{background-color: #fbfbfb;border-radius:14px;border:1px solid rgb(229,229,229);}";
|
||||
QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4 {background-color: #fbfbfb; border-radius: 14px; border: 1px solid rgb(229,229,229);}\
|
||||
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #000000}";
|
||||
ui->frame->setStyleSheet(frameStyleSheet);
|
||||
ui->frame_2->setStyleSheet(frameStyleSheet);
|
||||
ui->frame_3->setStyleSheet(frameStyleSheet);
|
||||
@@ -293,90 +254,211 @@ void AppIntoPage::setTheme(bool dark)
|
||||
ui->icon_4->setPixmap(QPixmap(":/icon/light/text.svg"));
|
||||
ui->icon_5->setPixmap(QPixmap(":/icon/light/folder.svg"));
|
||||
ui->icon_6->setPixmap(QPixmap(":/icon/light/globe.svg"));
|
||||
|
||||
}
|
||||
}
|
||||
AppIntoPage::~AppIntoPage()
|
||||
|
||||
void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
|
||||
{
|
||||
delete ui;
|
||||
if (dw)
|
||||
{
|
||||
dw->deleteLater();
|
||||
dw = nullptr;
|
||||
}
|
||||
|
||||
dw = w;
|
||||
connect(w, &DownloadListWidget::downloadFinished, [=]()
|
||||
{ isDownloading(SparkAPI::getServerUrl() + SparkAPI::getArchDir() + spk.path() + "/" + info["Filename"].toString()); });
|
||||
}
|
||||
|
||||
void AppIntoPage::initUI()
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
ui->listWidget->setViewMode(QListView::IconMode);
|
||||
ui->listWidget->setFlow(QListView::TopToBottom);
|
||||
ui->listWidget->setMovement(QListView::Static);
|
||||
ui->listWidget->setMaximumHeight(200);
|
||||
|
||||
clear();
|
||||
}
|
||||
|
||||
void AppIntoPage::initConnections()
|
||||
{
|
||||
connect(api, &SparkAPI::finishedRAW, [=](QString download_times)
|
||||
{
|
||||
download_times = download_times.trimmed();
|
||||
qDebug() << "Download Times:" + download_times;
|
||||
ui->download_times->setText(download_times); });
|
||||
}
|
||||
|
||||
void AppIntoPage::isDownloading(const QUrl &url)
|
||||
{
|
||||
int index = dw->getUrlList().lastIndexOf(url);
|
||||
if (index == -1)
|
||||
{
|
||||
ui->downloadButton->setEnabled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
DownloadItem *item = dw->getDIList().at(index);
|
||||
if (item == nullptr)
|
||||
{
|
||||
ui->downloadButton->setEnabled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
ui->downloadButton->setEnabled(false);
|
||||
ui->pushButton_3->hide();
|
||||
if (item->download == 2)
|
||||
{
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->setText(tr("Download"));
|
||||
}
|
||||
if (item->download == 1)
|
||||
{
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->setText(tr("Install"));
|
||||
}
|
||||
if (item->isInstall)
|
||||
{
|
||||
ui->downloadButton->setEnabled(false);
|
||||
ui->downloadButton->setText(tr("Installing"));
|
||||
return;
|
||||
}
|
||||
if (item->download == 3)
|
||||
{
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->downloadButton->setText(tr("Reinstall"));
|
||||
ui->downloadButton->show();
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
}
|
||||
|
||||
void AppIntoPage::setAppinfoTags(const QStringList &tagList)
|
||||
{
|
||||
foreach (const QString &tag, tagList)
|
||||
{
|
||||
if (tag == "community")
|
||||
{
|
||||
ui->tag_community->show();
|
||||
}
|
||||
else if (tag == "ubuntu")
|
||||
{
|
||||
ui->tag_ubuntu->show();
|
||||
}
|
||||
else if (tag == "deepin")
|
||||
{
|
||||
ui->tag_deepin->show();
|
||||
}
|
||||
else if (tag == "uos")
|
||||
{
|
||||
ui->tag_uos->show();
|
||||
}
|
||||
else if (tag == "dtk5")
|
||||
{
|
||||
ui->tag_dtk5->show();
|
||||
}
|
||||
else if (tag == "dwine2")
|
||||
{
|
||||
ui->tag_dwine2->show();
|
||||
}
|
||||
else if (tag == "dwine5")
|
||||
{
|
||||
ui->tag_dwine5->show();
|
||||
}
|
||||
else if (tag == "a2d")
|
||||
{
|
||||
ui->tag_a2d->show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AppIntoPage::on_downloadButton_clicked()
|
||||
{
|
||||
if(ui->downloadButton->text() == tr("Install"))
|
||||
QString downloadUrl = SparkAPI::getServerUrl() + SparkAPI::getArchDir() + spk.path() + "/" + info["Filename"].toString();
|
||||
if (ui->downloadButton->text() == tr("Install"))
|
||||
{
|
||||
dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())]->install(0);
|
||||
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
||||
QObject::connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,[=](){
|
||||
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
||||
disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,nullptr,nullptr);
|
||||
});
|
||||
DownloadItem *item = dw->getDIList()[dw->getUrlList().lastIndexOf(downloadUrl)];
|
||||
if (item == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
connect(item, &DownloadItem::finished, [=]() { isDownloading(downloadUrl); });
|
||||
|
||||
item->install(0);
|
||||
isDownloading(downloadUrl);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
emit clickedDownloadBtn();
|
||||
dw->addItem(info["Name"].toString(),info["Filename"].toString(),info["Pkgname"].toString(),iconpixmap,SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
||||
if(ui->downloadButton->text() == tr("Reinstall"))
|
||||
|
||||
DownloadItem *item = dw->addItem(info["Name"].toString(), info["Filename"].toString(), info["Pkgname"].toString(), iconpixmap, downloadUrl);
|
||||
if (item == nullptr)
|
||||
{
|
||||
dw->getDIList()[dw->allDownload - 1]->reinstall = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (ui->downloadButton->text() == tr("Reinstall"))
|
||||
{
|
||||
item->reinstall = true;
|
||||
}
|
||||
ui->downloadButton->setEnabled(false);
|
||||
QObject::connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,[=](){
|
||||
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
||||
disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,nullptr,nullptr);
|
||||
});
|
||||
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
||||
connect(item, &DownloadItem::finished, [=]() { isDownloading(downloadUrl); });
|
||||
|
||||
isDownloading(downloadUrl);
|
||||
}
|
||||
|
||||
void AppIntoPage::on_pushButton_3_clicked()
|
||||
{
|
||||
QtConcurrent::run([=]()
|
||||
{
|
||||
ui->downloadButton->setEnabled(false);
|
||||
ui->pushButton_3->setEnabled(false);
|
||||
ui->downloadButton->setEnabled(false);
|
||||
ui->pushButton_3->setEnabled(false);
|
||||
|
||||
QProcess uninstall;
|
||||
uninstall.start("pkexec", QStringList() << "apt" << "purge" << "-y" << info["Pkgname"].toString().toLower());
|
||||
uninstall.waitForFinished(-1);
|
||||
QProcess uninstall;
|
||||
uninstall.start("pkexec", QStringList() << "apt" << "purge" << "-y" << info["Pkgname"].toString().toLower());
|
||||
uninstall.waitForFinished(-1);
|
||||
|
||||
QProcess check;
|
||||
check.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString().toLower());
|
||||
check.waitForFinished(10*1000);
|
||||
QProcess check;
|
||||
check.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString().toLower());
|
||||
check.waitForFinished(10*1000);
|
||||
|
||||
if (check.readAllStandardOutput().isEmpty())
|
||||
{
|
||||
ui->downloadButton->setText(tr("Install"));
|
||||
ui->pushButton_3->hide();
|
||||
if (check.readAllStandardOutput().isEmpty())
|
||||
{
|
||||
ui->downloadButton->setText(tr("Download"));
|
||||
ui->pushButton_3->hide();
|
||||
|
||||
updatesEnabled();
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Uninstall succeeded"));
|
||||
}
|
||||
updatesEnabled();
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Uninstall succeeded"));
|
||||
}
|
||||
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->pushButton_3->setEnabled(true);
|
||||
ui->downloadButton->setEnabled(true);
|
||||
ui->pushButton_3->setEnabled(true);
|
||||
});
|
||||
}
|
||||
|
||||
void AppIntoPage::on_shareButton_clicked()
|
||||
{
|
||||
qDebug() << "Share" << spk;
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("The URL has been copied to the clipboard"));
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
clipboard->setText(spk.toString());
|
||||
}
|
||||
Application::clipboard()->setText(spk.toString());
|
||||
|
||||
Utils::sendNotification("spark-store", tr("Spark Store"), tr("The URL has been copied to the clipboard"));
|
||||
}
|
||||
|
||||
void AppIntoPage::on_updateButton_clicked()
|
||||
{
|
||||
QString feedbackSpk = "spk://store/chat/store.spark-app.feedback";
|
||||
QFile actionSubmissionClientStatus("/opt/durapps/store.spark-app.feedback");
|
||||
if (actionSubmissionClientStatus.exists())
|
||||
QFileInfo actionSubmissionClientStatus("/opt/durapps/store.spark-app.feedback");
|
||||
if (actionSubmissionClientStatus.exists() && actionSubmissionClientStatus.isDir())
|
||||
{
|
||||
qDebug() << "反馈器存在";
|
||||
QProcess::startDetached("sh /opt/durapps/store.spark-app.feedback/launch.sh");
|
||||
QProcess::startDetached("sh", QStringList() << "/opt/durapps/store.spark-app.feedback/launch.sh");
|
||||
}
|
||||
else{
|
||||
else
|
||||
{
|
||||
qDebug() << "反馈器不存在,跳转页面";
|
||||
openUrl(feedbackSpk);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,51 +2,52 @@
|
||||
#define APPINTOPAGE_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QJsonObject>
|
||||
#include <QUrl>
|
||||
#include <QString>
|
||||
#include <QtConcurrent>
|
||||
#include <QClipboard>
|
||||
#include "backend/sparkapi.h"
|
||||
#include "backend/image_show.h"
|
||||
#include "widgets/downloadlistwidget.h"
|
||||
#include "utils/utils.h"
|
||||
|
||||
namespace Ui {
|
||||
class AppIntoPage;
|
||||
}
|
||||
|
||||
class SparkAPI;
|
||||
class DownloadListWidget;
|
||||
class AppIntoPage : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
void clear();
|
||||
void setDownloadWidget(DownloadListWidget *w);
|
||||
void setTheme(bool dark);
|
||||
void openUrl(QUrl url);
|
||||
explicit AppIntoPage(QWidget *parent = nullptr);
|
||||
~AppIntoPage();
|
||||
~AppIntoPage() override;
|
||||
|
||||
private slots:
|
||||
void on_downloadButton_clicked();
|
||||
|
||||
void on_pushButton_3_clicked();
|
||||
|
||||
void on_shareButton_clicked();
|
||||
|
||||
void on_updateButton_clicked();
|
||||
void openUrl(const QUrl &url);
|
||||
void clear();
|
||||
void setTheme(bool dark);
|
||||
void setDownloadWidget(DownloadListWidget *w);
|
||||
|
||||
private:
|
||||
SparkAPI *api1;
|
||||
QJsonObject info;
|
||||
QPixmap iconpixmap;
|
||||
QUrl spk;
|
||||
void isDownloading(QUrl url);
|
||||
void sltAppinfoTags(QStringList *tagList);
|
||||
DownloadListWidget *dw;
|
||||
Ui::AppIntoPage *ui;
|
||||
void initUI();
|
||||
void initConnections();
|
||||
void isDownloading(const QUrl &url);
|
||||
void setAppinfoTags(const QStringList &tagList);
|
||||
|
||||
signals:
|
||||
void clickedDownloadBtn();
|
||||
|
||||
private slots:
|
||||
void on_downloadButton_clicked();
|
||||
void on_pushButton_3_clicked();
|
||||
void on_shareButton_clicked();
|
||||
void on_updateButton_clicked();
|
||||
|
||||
private:
|
||||
Ui::AppIntoPage *ui;
|
||||
|
||||
SparkAPI *api;
|
||||
DownloadListWidget *dw = nullptr;
|
||||
|
||||
QJsonObject info;
|
||||
QPixmap iconpixmap;
|
||||
QUrl spk;
|
||||
};
|
||||
|
||||
#endif // APPINTOPAGE_H
|
||||
|
||||
@@ -426,10 +426,10 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Capable to Ubuntu 20.04</p></body></html></string>
|
||||
<string><html><head/><body><p>Capable to Ubuntu 22.04</p></body></html></string>
|
||||
</property>
|
||||
<property name="whatsThis">
|
||||
<string><html><head/><body><p>Capable to Ubuntu 20.04</p></body></html></string>
|
||||
<string><html><head/><body><p>Capable to Ubuntu 22.04</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p><img src=":/tags/ubuntu-small.png"/></p></body></html></string>
|
||||
@@ -540,10 +540,10 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>A deepin-wine5 app.Spark Store will automatically configure the wine kit for you</p></body></html></string>
|
||||
<string><html><head/><body><p>A Wine app.Spark Store will automatically configure the wine kit for you</p></body></html></string>
|
||||
</property>
|
||||
<property name="whatsThis">
|
||||
<string><html><head/><body><p>A deepin-wine5 app.Spark Store will automatically configure the wine kit for you</p></body></html></string>
|
||||
<string><html><head/><body><p>A Wine app.Spark Store will automatically configure the wine kit for you</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p><img src=":/tags/dwine5-small.png"/></p></body></html></string>
|
||||
|
||||
@@ -1,68 +1,93 @@
|
||||
#include "applistpage.h"
|
||||
#include "ui_applistpage.h"
|
||||
|
||||
AppListPage::AppListPage(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::AppListPage)
|
||||
|
||||
|
||||
AppListPage::AppListPage(QWidget *parent) : QWidget(parent),
|
||||
ui(new Ui::AppListPage)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
ui->webEngineView->page()->setBackgroundColor(Qt::transparent);
|
||||
}
|
||||
void AppListPage::setTheme(bool dark)
|
||||
{
|
||||
isDark=dark;
|
||||
if(dark)
|
||||
isDark = dark;
|
||||
if (dark)
|
||||
{
|
||||
this->setStyleSheet("#frame{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}");
|
||||
}else {
|
||||
//亮色模式
|
||||
}
|
||||
else
|
||||
{
|
||||
// 亮色模式
|
||||
this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}");
|
||||
}
|
||||
if(isSearch)
|
||||
if (isSearch)
|
||||
{
|
||||
getSearchList(nowType);
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
getAppList(nowType);
|
||||
}
|
||||
}
|
||||
void AppListPage::getAppList(QString type)
|
||||
{
|
||||
isSearch=false;
|
||||
nowType=type;
|
||||
SparkAPI *api=new SparkAPI(this);
|
||||
isSearch = false;
|
||||
nowType = type;
|
||||
SparkAPI *api = new SparkAPI(this);
|
||||
QString url;
|
||||
QString theme;
|
||||
if(isDark)
|
||||
if (isDark)
|
||||
{
|
||||
theme="theme=dark";
|
||||
}else{
|
||||
theme="theme=light";
|
||||
theme = "theme=dark";
|
||||
#ifdef __aarch64__
|
||||
theme = "dark";
|
||||
#endif
|
||||
}
|
||||
if(type=="")
|
||||
else
|
||||
{
|
||||
url=api->getServerUrl()+"store/#/flamescion/?"+theme;
|
||||
}else{
|
||||
url=api->getServerUrl()+"store/#/flamescion/applist?type="+type+"&"+theme;
|
||||
theme = "theme=light";
|
||||
#ifdef __aarch64__
|
||||
theme = "";
|
||||
#endif
|
||||
}
|
||||
if (type == "")
|
||||
{
|
||||
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/?" + theme;
|
||||
#ifdef __aarch64__
|
||||
url = api->getServerUrl() + "aarch64-store/#/"+ theme;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/applist?type=" + type + "&" + theme;
|
||||
#ifdef __aarch64__
|
||||
url = api->getServerUrl() + "aarch64-store/#/"+ theme + type;
|
||||
#endif
|
||||
}
|
||||
|
||||
ui->webEngineView->setUrl(url);
|
||||
delete api;
|
||||
}
|
||||
|
||||
void AppListPage::getSearchList(QString keyword)
|
||||
void AppListPage::getSearchList(const QString &keyword)
|
||||
{
|
||||
isSearch=true;
|
||||
nowType=keyword;
|
||||
SparkAPI *api=new SparkAPI(this);
|
||||
isSearch = true;
|
||||
nowType = keyword;
|
||||
SparkAPI *api = new SparkAPI(this);
|
||||
QString url;
|
||||
QString theme;
|
||||
if(isDark)
|
||||
if (isDark)
|
||||
{
|
||||
theme="theme=dark";
|
||||
}else{
|
||||
theme="theme=light";
|
||||
theme = "theme=dark";
|
||||
}
|
||||
url=api->getServerUrl()+"store/#/flamescion/search?keywords="+keyword+"&"+theme;
|
||||
else
|
||||
{
|
||||
theme = "theme=light";
|
||||
}
|
||||
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme;
|
||||
ui->webEngineView->setUrl(url);
|
||||
delete api;
|
||||
}
|
||||
|
||||
AppListPage::~AppListPage()
|
||||
@@ -72,15 +97,14 @@ AppListPage::~AppListPage()
|
||||
|
||||
void AppListPage::on_webEngineView_urlChanged(const QUrl &arg1)
|
||||
{
|
||||
if(arg1.path().right(8) == "app.json")
|
||||
{
|
||||
QString url = arg1.toString();
|
||||
url = url.mid(url.indexOf("/store/"));
|
||||
url = "spk:/"+url;
|
||||
url = url.mid(0,url.indexOf("/app.json"));
|
||||
qDebug() << "程序跳转链接地址:" << url;
|
||||
ui->webEngineView->back();
|
||||
emit clicked(url);
|
||||
}
|
||||
if (arg1.path().right(8) == "app.json")
|
||||
{
|
||||
QString url = arg1.toString();
|
||||
url = url.mid(url.indexOf("/" + SparkAPI::getArchDir() + "/"));
|
||||
url = "spk:/" + url;
|
||||
url = url.mid(0, url.indexOf("/app.json"));
|
||||
qDebug() << "程序跳转链接地址:" << url;
|
||||
ui->webEngineView->back();
|
||||
emit clicked(url);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ class AppListPage : public QWidget
|
||||
|
||||
public:
|
||||
void setTheme(bool dark);
|
||||
void getSearchList(QString keyword);
|
||||
void getSearchList(const QString &keyword);
|
||||
void getAppList(QString type);
|
||||
explicit AppListPage(QWidget *parent = nullptr);
|
||||
~AppListPage();
|
||||
|
||||
@@ -1,22 +1,37 @@
|
||||
#include "settingspage.h"
|
||||
#include "ui_settingspage.h"
|
||||
#include "../backend/sparkapi.h"
|
||||
#include "utils/utils.h"
|
||||
|
||||
#include <QSettings>
|
||||
#include <QtConcurrent>
|
||||
#include <QDebug>
|
||||
|
||||
#define TMP_PATH "/tmp/spark-store"
|
||||
#define DEFAULT_SERVER_URL "https://cdn.d.store.deepinos.org.cn/"
|
||||
#define DEFAULT_CHECK_DOMAIN "deepinos"
|
||||
|
||||
bool SettingsPage::isdownload = false;
|
||||
SettingsPage::SettingsPage(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::SettingsPage)
|
||||
|
||||
SettingsPage::SettingsPage(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, ui(new Ui::SettingsPage)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
configCanSave = false;
|
||||
initConfig();
|
||||
}
|
||||
|
||||
void SettingsPage::setTheme(bool dark)
|
||||
{
|
||||
if(dark)
|
||||
if (dark)
|
||||
{
|
||||
this->setStyleSheet("#frame{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}");
|
||||
}else {
|
||||
//亮色模式
|
||||
}
|
||||
else
|
||||
{
|
||||
// 亮色模式
|
||||
this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}");
|
||||
}
|
||||
}
|
||||
@@ -24,38 +39,44 @@ void SettingsPage::setTheme(bool dark)
|
||||
void SettingsPage::readServerList()
|
||||
{
|
||||
// 读取服务器列表并初始化
|
||||
QFile file(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
|
||||
QFile file(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
|
||||
|
||||
//判断文件是否存在
|
||||
// 判断文件是否存在
|
||||
if (!file.exists())
|
||||
{
|
||||
ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/");
|
||||
ui->comboBox_server->addItem(DEFAULT_SERVER_URL);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||
{
|
||||
qDebug()<<"无法读取server.list";
|
||||
qWarning() << "无法读取 server.list";
|
||||
return;
|
||||
}
|
||||
|
||||
//创建QTextStream对象
|
||||
// 创建 QTextStream 对象
|
||||
QTextStream textStream(&file);
|
||||
|
||||
QString lineData = textStream.readLine();//读取文件的第一行
|
||||
if (!textStream.readAll().contains(DEFAULT_CHECK_DOMAIN)) // 校验配置文件有效性
|
||||
{
|
||||
return;
|
||||
}
|
||||
textStream.seek(0); // 回到开头
|
||||
QString lineData = textStream.readLine(); // 读取文件的第一行
|
||||
ui->comboBox_server->addItem(lineData);
|
||||
while(!lineData.isNull())
|
||||
while (!lineData.isNull())
|
||||
{
|
||||
lineData = textStream.readLine();
|
||||
ui->comboBox_server->addItem(lineData);
|
||||
}
|
||||
for(int i = 0; i < ui->comboBox_server->count(); i++)
|
||||
for (int i = 0; i < ui->comboBox_server->count(); i++)
|
||||
{
|
||||
if(ui->comboBox_server->itemText(i) == "开发者模式 Dev only")
|
||||
if (ui->comboBox_server->itemText(i) == "开发者模式 Dev only")
|
||||
{
|
||||
ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(i, 0), QVariant(0), Qt::UserRole - 1);
|
||||
}
|
||||
if(ui->comboBox_server->itemText(i) == "镜像源 Download only")
|
||||
if (ui->comboBox_server->itemText(i) == "镜像源 Download only")
|
||||
{
|
||||
for(int j = i; j < ui->comboBox_server->count(); j++)
|
||||
for (int j = i; j < ui->comboBox_server->count(); j++)
|
||||
{
|
||||
ui->comboBox_server->model()->setData(ui->comboBox_server->model()->index(j, 0), QVariant(0), Qt::UserRole - 1);
|
||||
}
|
||||
@@ -70,14 +91,14 @@ void SettingsPage::initConfig()
|
||||
readServerList();
|
||||
|
||||
// 读取服务器URL并初始化菜单项的链接
|
||||
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
||||
if(!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE")
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
if (!config.value("server/choose").toString().isEmpty() && config.value("server/updated").toBool())
|
||||
{
|
||||
qDebug()<<readConfig.value("server/choose").toString();
|
||||
ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString());
|
||||
SparkAPI::setServerUrl(readConfig.value("server/choose").toString());
|
||||
qDebug() << config.value("server/choose").toString();
|
||||
ui->comboBox_server->setCurrentText(config.value("server/choose").toString());
|
||||
SparkAPI::setServerUrl(config.value("server/choose").toString());
|
||||
}
|
||||
configCanSave = true; // 防止触发保存配置信号
|
||||
configCanSave = true; // 防止触发保存配置信号
|
||||
}
|
||||
|
||||
SettingsPage::~SettingsPage()
|
||||
@@ -88,32 +109,42 @@ SettingsPage::~SettingsPage()
|
||||
void SettingsPage::on_pushButton_updateServer_clicked()
|
||||
{
|
||||
QtConcurrent::run([=]()
|
||||
{
|
||||
{
|
||||
ui->pushButton_updateServer->setEnabled(false);
|
||||
|
||||
|
||||
QFile::remove(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
|
||||
auto updateSuccess = system("curl -o " + QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation).toUtf8() + "/server.list https://d.store.deepinos.org.cn/store/server-and-mirror.list");
|
||||
qDebug() << "Update serverlist status:" << updateSuccess;
|
||||
if (updateSuccess != 0) // 更新失败不换服务器配置
|
||||
{
|
||||
QFile file(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
|
||||
if (file.exists())
|
||||
{
|
||||
file.remove();
|
||||
}
|
||||
// FIXME: 向用户提示更新失败
|
||||
ui->pushButton_updateServer->setEnabled(true);
|
||||
return;
|
||||
}
|
||||
ui->comboBox_server->clear();
|
||||
|
||||
QFile::remove(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
|
||||
system("curl -o " + QDir::homePath().toUtf8() + "/.config/spark-store/server.list https://d.store.deepinos.org.cn/store/server-and-mirror.list");
|
||||
|
||||
ui->pushButton_updateServer->setEnabled(true);
|
||||
readServerList();
|
||||
ui->comboBox_server->setCurrentIndex(0);
|
||||
});
|
||||
ui->comboBox_server->setCurrentIndex(0); });
|
||||
}
|
||||
|
||||
|
||||
void SettingsPage::on_comboBox_server_currentIndexChanged(const QString &arg1)
|
||||
{
|
||||
SparkAPI::setServerUrl(arg1); // 服务器信息更新
|
||||
qDebug()<<arg1;
|
||||
const QString updatedInfo = "TRUE";
|
||||
SparkAPI::setServerUrl(arg1); // 服务器信息更新
|
||||
qDebug() << arg1;
|
||||
bool updatedInfo = true;
|
||||
if(configCanSave)
|
||||
{
|
||||
// ui->label_setting1->show();
|
||||
QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
||||
setConfig->setValue("server/choose", arg1);
|
||||
setConfig->setValue("server/updated", updatedInfo);
|
||||
setConfig->deleteLater();
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
config.setValue("server/choose", arg1);
|
||||
config.setValue("server/updated", updatedInfo);
|
||||
config.sync();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +155,7 @@ void SettingsPage::setIsDownload(bool isdownload)
|
||||
|
||||
void SettingsPage::updateUI()
|
||||
{
|
||||
if(isdownload)
|
||||
if (isdownload)
|
||||
{
|
||||
ui->pushButton_clear->setEnabled(false);
|
||||
}
|
||||
@@ -135,15 +166,15 @@ void SettingsPage::updateUI()
|
||||
// 显示缓存占用空间
|
||||
quint64 tmp_size = dirFileSize(QString::fromUtf8(TMP_PATH));
|
||||
QString tmp_size_str;
|
||||
if(tmp_size < 1024)
|
||||
if (tmp_size < 1024)
|
||||
{
|
||||
tmp_size_str = QString::number(tmp_size) + "B";
|
||||
}
|
||||
else if(tmp_size < (1024 * 1024))
|
||||
else if (tmp_size < (1024 * 1024))
|
||||
{
|
||||
tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / 1024))) + "KB";
|
||||
}
|
||||
else if(tmp_size<(1024*1024*1024))
|
||||
else if (tmp_size < (1024 * 1024 * 1024))
|
||||
{
|
||||
tmp_size_str = QString::number(0.01 * int(100 * (tmp_size / (1024 * 1024)))) + "MB";
|
||||
}
|
||||
@@ -160,13 +191,13 @@ quint64 SettingsPage::dirFileSize(const QString &path)
|
||||
QDir dir(path);
|
||||
quint64 size = 0;
|
||||
// dir.entryInfoList(QDir::Files); // 返回文件信息
|
||||
foreach(QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
|
||||
foreach (QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
|
||||
{
|
||||
// 计算文件大小
|
||||
size += quint64(fileInfo.size());
|
||||
}
|
||||
// dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot); // 返回所有子目录,并进行过滤
|
||||
foreach(QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
|
||||
foreach (QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
|
||||
{
|
||||
// 若存在子目录,则递归调用 dirFileSize() 函数
|
||||
size += dirFileSize(path + QDir::separator() + subDir);
|
||||
@@ -177,7 +208,7 @@ quint64 SettingsPage::dirFileSize(const QString &path)
|
||||
void SettingsPage::on_pushButton_updateApt_clicked()
|
||||
{
|
||||
QtConcurrent::run([=]()
|
||||
{
|
||||
{
|
||||
ui->pushButton_updateApt->setEnabled(false);
|
||||
ui->label_aptserver->setText(tr("Updating, please wait..."));
|
||||
|
||||
@@ -185,17 +216,16 @@ void SettingsPage::on_pushButton_updateApt_clicked()
|
||||
ui->label_aptserver->setText(tr(""));
|
||||
|
||||
ui->pushButton_updateApt->setEnabled(true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void SettingsPage::on_pushButton_clear_clicked()
|
||||
{
|
||||
QtConcurrent::run([=]()
|
||||
{
|
||||
{
|
||||
ui->pushButton_clear->setEnabled(false);
|
||||
|
||||
QDir tmpdir("/tmp/spark-store");
|
||||
QDir tmpdir(QString::fromUtf8(TMP_PATH));
|
||||
tmpdir.setFilter(QDir::Files);
|
||||
int quantity = int(tmpdir.count());
|
||||
for(int i = 0; i < quantity; i++)
|
||||
@@ -204,23 +234,21 @@ void SettingsPage::on_pushButton_clear_clicked()
|
||||
}
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Temporary cache was cleaned"));
|
||||
ui->pushButton_clear->setEnabled(true);
|
||||
updateUI();
|
||||
});
|
||||
updateUI(); });
|
||||
}
|
||||
|
||||
|
||||
void SettingsPage::on_pushButton_clearWebCache_clicked()
|
||||
{
|
||||
QtConcurrent::run([=]()
|
||||
{
|
||||
QString dataLocal = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
|
||||
qDebug() << dataLocal;
|
||||
QDir dataDir(dataLocal);
|
||||
QString localDataLocation = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/QtWebEngine";
|
||||
qDebug() << localDataLocation;
|
||||
QDir dataDir(localDataLocation);
|
||||
dataDir.removeRecursively();
|
||||
dataLocal = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
|
||||
qDebug() << dataLocal;
|
||||
QDir cacheDir(dataLocal);
|
||||
|
||||
QString cacheLocation = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/QtWebEngine";
|
||||
qDebug() << cacheLocation;
|
||||
QDir cacheDir(cacheLocation);
|
||||
cacheDir.removeRecursively();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -2,14 +2,7 @@
|
||||
#define SETTINGSPAGE_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QFile>
|
||||
#include <QDir>
|
||||
#include <QDebug>
|
||||
#include <QSettings>
|
||||
#include <QtConcurrent>
|
||||
#include "../backend/sparkapi.h"
|
||||
#include "utils/utils.h"
|
||||
#define TMP_PATH "/tmp/spark-store"
|
||||
#include <QUrl>
|
||||
|
||||
namespace Ui {
|
||||
class SettingsPage;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui network concurrent webenginewidgets dbus svg
|
||||
QT += core gui concurrent dbus network svg webenginewidgets
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
@@ -22,78 +22,81 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
DEFINES += QT_APP_DEBUG
|
||||
# Get build version from qmake
|
||||
VERSION = $$BUILD_VERSION
|
||||
isEmpty(VERSION): VERSION = 4.0.0
|
||||
DEFINES += APP_VERSION=\\\"'$${VERSION}'\\\"
|
||||
|
||||
# Disable qWarning / qDebug output in Release
|
||||
#CONFIG(release, debug | release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
|
||||
|
||||
CONFIG += c++11 link_pkgconfig
|
||||
PKGCONFIG += dtkcore dtkgui dtkwidget
|
||||
|
||||
# Disable qWarning / qDebug output in Release
|
||||
CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
|
||||
|
||||
# Update translation files
|
||||
CONFIG(release, debug|release): system(bash $${PWD}/translate_generation.sh)
|
||||
|
||||
TRANSLATIONS += \
|
||||
../translations/spark-store_en.ts \
|
||||
../translations/spark-store_fr.ts \
|
||||
../translations/spark-store_zh_CN.ts
|
||||
|
||||
SOURCES += \
|
||||
dbus/dbussparkstoreservice.cpp \
|
||||
main.cpp \
|
||||
mainwindow-dtk.cpp \
|
||||
backend/downloadworker.cpp \
|
||||
backend/image_show.cpp \
|
||||
backend/sparkapi.cpp \
|
||||
dbus/dbussparkstoreservice.cpp \
|
||||
pages/appintopage.cpp \
|
||||
pages/applistpage.cpp \
|
||||
pages/settingspage.cpp \
|
||||
utils/httprequest.cpp \
|
||||
utils/utils.cpp \
|
||||
utils/widgetanimation.cpp \
|
||||
widgets/common/progressbutton.cpp \
|
||||
widgets/common/webenginepage.cpp \
|
||||
widgets/common/webengineview.cpp \
|
||||
widgets/downloadlistwidget.cpp \
|
||||
widgets/base/basewidgetopacity.cpp \
|
||||
widgets/common/downloaditem.cpp \
|
||||
widgets/common/progressbutton.cpp \
|
||||
widgets/common/smoothlistwidget.cpp \
|
||||
widgets/common/smoothscrollbar.cpp \
|
||||
utils/httprequest.cpp \
|
||||
pages/applistpage.cpp \
|
||||
backend/downloadworker.cpp \
|
||||
pages/appintopage.cpp \
|
||||
widgets/common/webenginepage.cpp \
|
||||
widgets/common/webengineview.cpp \
|
||||
widgets/big_image.cpp \
|
||||
backend/image_show.cpp \
|
||||
widgets/base/basewidgetopacity.cpp
|
||||
widgets/downloadlistwidget.cpp \
|
||||
application.cpp \
|
||||
main.cpp \
|
||||
mainwindow-dtk.cpp
|
||||
|
||||
HEADERS += \
|
||||
dbus/dbussparkstoreservice.h \
|
||||
mainwindow-dtk.h \
|
||||
backend/downloadworker.h \
|
||||
backend/image_show.h \
|
||||
backend/sparkapi.h \
|
||||
dbus/dbussparkstoreservice.h \
|
||||
pages/appintopage.h \
|
||||
pages/applistpage.h \
|
||||
pages/settingspage.h \
|
||||
utils/httprequest.h \
|
||||
utils/utils.h \
|
||||
utils/widgetanimation.h \
|
||||
widgets/common/progressbutton.h \
|
||||
widgets/common/webenginepage.h \
|
||||
widgets/common/webengineview.h \
|
||||
widgets/downloadlistwidget.h \
|
||||
widgets/base/basewidgetopacity.h \
|
||||
widgets/common/downloaditem.h \
|
||||
widgets/common/progressbutton.h \
|
||||
widgets/common/smoothlistwidget.h \
|
||||
widgets/common/smoothscrollbar.h \
|
||||
utils/httprequest.h \
|
||||
pages/applistpage.h \
|
||||
backend/downloadworker.h \
|
||||
pages/appintopage.h \
|
||||
widgets/common/webenginepage.h \
|
||||
widgets/common/webengineview.h \
|
||||
widgets/big_image.h \
|
||||
backend/image_show.h \
|
||||
widgets/base/basewidgetopacity.h
|
||||
widgets/downloadlistwidget.h \
|
||||
application.h \
|
||||
mainwindow-dtk.h
|
||||
|
||||
FORMS += \
|
||||
mainwindow-dtk.ui \
|
||||
pages/settingspage.ui \
|
||||
widgets/downloadlistwidget.ui \
|
||||
widgets/common/downloaditem.ui \
|
||||
pages/appintopage.ui \
|
||||
pages/applistpage.ui \
|
||||
pages/appintopage.ui
|
||||
pages/settingspage.ui \
|
||||
widgets/common/downloaditem.ui \
|
||||
widgets/downloadlistwidget.ui \
|
||||
mainwindow-dtk.ui
|
||||
|
||||
RESOURCES += \
|
||||
assets/assets.qrc
|
||||
|
||||
TRANSLATIONS += \
|
||||
../translations/spark-store_en.ts \
|
||||
../translations/spark-store_fr.ts \
|
||||
../translations/spark-store_zh_CN.ts \
|
||||
../translations/spark-store_zh_TW.ts
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/durapps/$${TARGET}/bin
|
||||
|
||||
@@ -1,22 +1,19 @@
|
||||
#include "httprequest.h"
|
||||
|
||||
|
||||
|
||||
HttpRequest::HttpRequest()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void HttpRequest::getRequest(QNetworkRequest request)
|
||||
{
|
||||
QNetworkAccessManager *naManager=new QNetworkAccessManager(this);
|
||||
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
|
||||
|
||||
request.setRawHeader("User-Agent", "Mozilla/5.0");
|
||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
||||
request.setRawHeader("Content-Type", "application/json");
|
||||
|
||||
naManager->get(request);
|
||||
QObject::connect(naManager,&QNetworkAccessManager::finished,this,&HttpRequest::readdata_slot);
|
||||
QObject::connect(naManager, &QNetworkAccessManager::finished, this, &HttpRequest::readdata_slot);
|
||||
}
|
||||
void HttpRequest::readdata_slot(QNetworkReply *reply)
|
||||
{
|
||||
@@ -24,19 +21,19 @@ void HttpRequest::readdata_slot(QNetworkReply *reply)
|
||||
}
|
||||
QString HttpRequest::postRequest(QString url, QString jsondata)
|
||||
{
|
||||
QByteArray array= jsondata.toLatin1();
|
||||
QByteArray array = jsondata.toLatin1();
|
||||
QNetworkRequest request;
|
||||
QNetworkAccessManager *naManager=new QNetworkAccessManager(this);
|
||||
QUrl strUrl = url.replace("+","%2B");
|
||||
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
|
||||
QUrl strUrl = url.replace("+", "%2B");
|
||||
request.setUrl(strUrl);
|
||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
||||
request.setRawHeader("Content-Type", "application/json");
|
||||
|
||||
QNetworkReply* reply = naManager->post(request, array);
|
||||
QNetworkReply *reply = naManager->post(request, array);
|
||||
QEventLoop eventLoop;
|
||||
connect(naManager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
|
||||
connect(naManager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));
|
||||
eventLoop.exec();
|
||||
QTextCodec* codec = QTextCodec::codecForName("utf8");
|
||||
QTextCodec *codec = QTextCodec::codecForName("utf8");
|
||||
QString strReply = codec->toUnicode(reply->readAll());
|
||||
reply->deleteLater();
|
||||
return strReply;
|
||||
|
||||
@@ -1,26 +1,215 @@
|
||||
#include "utils.h"
|
||||
#include "application.h"
|
||||
|
||||
Utils::Utils()
|
||||
#include <DSysInfo>
|
||||
|
||||
#include <QDBusInterface>
|
||||
#include <QProcessEnvironment>
|
||||
#include <QSettings>
|
||||
#include <QStandardPaths>
|
||||
#include <QFile>
|
||||
#include <QJsonDocument>
|
||||
|
||||
#define UOSDeveloperModeFile "/var/lib/deepin/developer-mode/enabled"
|
||||
|
||||
/**
|
||||
* @author chatGPT
|
||||
* @brief Utils::sendNotification 发送系统通知
|
||||
* @param icon 图标名称
|
||||
* @param title 通知标题
|
||||
* @param body 通知内容
|
||||
*/
|
||||
void Utils::sendNotification(const QString &icon, const QString &title, const QString &body)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//这个函数是chatGPT写的
|
||||
void Utils::sendNotification(QString icon,QString title,QString body)
|
||||
{
|
||||
QDBusInterface iface("org.freedesktop.Notifications",
|
||||
"/org/freedesktop/Notifications",
|
||||
"org.freedesktop.Notifications");
|
||||
QDBusInterface interface("org.freedesktop.Notifications",
|
||||
"/org/freedesktop/Notifications",
|
||||
"org.freedesktop.Notifications");
|
||||
|
||||
QVariantList args;
|
||||
args << QCoreApplication::applicationName() // the name of the application
|
||||
<< (uint)0 // replaces the previous notification with the same ID
|
||||
<< icon // the application icon of the notification
|
||||
<< title // the title of the notification
|
||||
<< body // the body of the notification
|
||||
<< QStringList() // no actions
|
||||
<< QVariantMap() // no hints
|
||||
<< -1; // no timeout
|
||||
args << Application::applicationName() // the name of the application
|
||||
<< static_cast<quint32>(0) // replaces the previous notification with the same ID
|
||||
<< icon // the application icon of the notification
|
||||
<< title // the title of the notification
|
||||
<< body // the body of the notification
|
||||
<< QStringList() // no actions
|
||||
<< QVariantMap() // no hints
|
||||
<< -1; // no timeout
|
||||
|
||||
iface.callWithArgumentList(QDBus::AutoDetect, "Notify", args);
|
||||
interface.callWithArgumentList(QDBus::AutoDetect, "Notify", args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Utils::isDDE 判断是否使用 DDE 桌面环境
|
||||
* @return
|
||||
*/
|
||||
bool Utils::isDDE()
|
||||
{
|
||||
bool isDDE = true;
|
||||
if (!QString::fromUtf8(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin"))
|
||||
{
|
||||
qputenv("XDG_CURRENT_DESKTOP", "Deepin");
|
||||
isDDE = false;
|
||||
}
|
||||
|
||||
return isDDE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Utils::isWayland 判断是否使用 wayland 显示协议
|
||||
* @return bool true: 使用 wayland 显示协议 false: 使用 x11 显示协议
|
||||
*/
|
||||
bool Utils::isWayland()
|
||||
{
|
||||
bool isWayland = false;
|
||||
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
||||
QString XDG_SESSION_TYPE = env.value(QStringLiteral("XDG_SESSION_TYPE"));
|
||||
QString WAYLAND_DISPLAY = env.value(QStringLiteral("WAYLAND_DISPLAY"));
|
||||
if (XDG_SESSION_TYPE == QLatin1String("wayland") || WAYLAND_DISPLAY.contains(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||
{
|
||||
isWayland = true;
|
||||
}
|
||||
|
||||
return isWayland;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Utils::initConfig 初始化 config.ini 配置文件,去除废弃字段
|
||||
*/
|
||||
void Utils::initConfig()
|
||||
{
|
||||
// WARNING: 请在 组织名称 和 应用程序名称 初始化完成后调用
|
||||
bool useWayland = true;
|
||||
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
if (config.contains("build/useWayland"))
|
||||
{
|
||||
useWayland = config.value("build/useWayland").toBool();
|
||||
}
|
||||
config.remove("build/isDeepinOS");
|
||||
config.remove("build/isWayland");
|
||||
config.remove("build/useWayland");
|
||||
|
||||
config.setValue("runtime/isDDE", isDDE());
|
||||
config.setValue("runtime/isWayland", isWayland());
|
||||
// Check config file, if there is no wayland config, then set it to default, which means use wayland if possible.
|
||||
if (!config.contains("runtime/useWayland"))
|
||||
{
|
||||
config.setValue("runtime/useWayland", useWayland);
|
||||
}
|
||||
config.sync(); // 写入更改至 config.ini,并同步最新内容
|
||||
|
||||
checkUOSDeveloperMode(); // Check UOS developer mode
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Utils::isUOS 判断是否为 UOS 操作系统
|
||||
* @return bool true: UOS 操作系统 false: 非 UOS 操作系统
|
||||
*/
|
||||
bool Utils::isUOS()
|
||||
{
|
||||
// WARNING: 请在 组织名称 和 应用程序名称 初始化完成后调用
|
||||
bool isUOS = false;
|
||||
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
if (Dtk::Core::DSysInfo::productType() == Dtk::Core::DSysInfo::Uos)
|
||||
{
|
||||
isUOS = true;
|
||||
config.setValue("UOS/isUOS", true);
|
||||
}
|
||||
else
|
||||
{
|
||||
isUOS = false;
|
||||
config.remove("UOS");
|
||||
}
|
||||
config.sync(); // 写入更改至 config.ini,并同步最新内容
|
||||
|
||||
return isUOS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Utils::setQPAPlatform Set display backend
|
||||
*/
|
||||
void Utils::setQPAPlatform()
|
||||
{
|
||||
// WARNING: 请在 initConfig() 执行后调用
|
||||
bool isDDE = Utils::isDDE(); // WARNING: 只能执行一次,后续执行时环境变量已经被覆盖,导致判断错误
|
||||
bool isWayland = Utils::isWayland();
|
||||
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
bool useWayland = config.value("runtime/useWayland").toBool();
|
||||
|
||||
qDebug() << "System Wayland enabled:" << isWayland << "Spark Wayland enabled:" << useWayland;
|
||||
|
||||
if (isWayland && useWayland && !(Dtk::Core::DSysInfo::isDeepin() || isDDE))
|
||||
{
|
||||
qputenv("QT_QPA_PLATFORM", "wayland");
|
||||
}
|
||||
else if (isWayland && useWayland && (Dtk::Core::DSysInfo::isDeepin() && isDDE))
|
||||
{
|
||||
qputenv("QT_QPA_PLATFORM", "dwayland");
|
||||
}
|
||||
else
|
||||
{
|
||||
qputenv("QT_QPA_PLATFORM", "dxcb");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Utils::checkUOSDeveloperMode Check UOS developer mode
|
||||
*/
|
||||
void Utils::checkUOSDeveloperMode()
|
||||
{
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
|
||||
QFile file(UOSDeveloperModeFile);
|
||||
if (Utils::isUOS() && file.exists() && file.open(QFile::ReadOnly | QFile::Text))
|
||||
{
|
||||
QString lineData = QString::fromUtf8(file.readLine());
|
||||
bool devmode = lineData.trimmed().toInt();
|
||||
qDebug() << "UOS Developer Mode Status:" << devmode;
|
||||
config.setValue("UOS/EnableDeveloperMode", devmode);
|
||||
}
|
||||
else
|
||||
{
|
||||
/**
|
||||
* NOTE: Utils::isUOS() 中,判断为非 UOS 时已经从 config 中删除 UOS 组,
|
||||
* 此处若包含该字段则一定是 UOS,直接写入开发者模式开关状态即可
|
||||
*/
|
||||
if (config.contains("UOS/EnableDeveloperMode"))
|
||||
{
|
||||
config.setValue("UOS/EnableDeveloperMode", false);
|
||||
}
|
||||
}
|
||||
file.close();
|
||||
config.sync(); // 写入更改至 config.ini,并同步最新内容
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Utils::parseFeatureJsonFile 解析版本特性 json 文件
|
||||
* @return 返回 QJsonObject
|
||||
*/
|
||||
QJsonObject Utils::parseFeatureJsonFile()
|
||||
{
|
||||
QFile file(":/json/features.json");
|
||||
if (!file.open(QFile::ReadOnly))
|
||||
{
|
||||
qWarning() << Q_FUNC_INFO << "features.json open failed";
|
||||
return QJsonObject();
|
||||
}
|
||||
|
||||
QJsonParseError error;
|
||||
QJsonDocument jsonDoc = QJsonDocument::fromJson(file.readAll(), &error);
|
||||
if (error.error != QJsonParseError::NoError || jsonDoc.isNull())
|
||||
{
|
||||
qWarning() << Q_FUNC_INFO << "features.json validate failed:" << error.errorString();
|
||||
return QJsonObject();
|
||||
}
|
||||
|
||||
if (jsonDoc.isEmpty() || !jsonDoc.isObject())
|
||||
{
|
||||
qWarning() << Q_FUNC_INFO << "features jsonDoc parse failed:" << jsonDoc;
|
||||
return QJsonObject();
|
||||
}
|
||||
|
||||
return jsonDoc.object();
|
||||
}
|
||||
|
||||
@@ -2,13 +2,19 @@
|
||||
#define UTILS_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QtDBus>
|
||||
#include <QJsonObject>
|
||||
|
||||
class Utils
|
||||
{
|
||||
public:
|
||||
Utils();
|
||||
static void sendNotification(QString icon,QString title,QString body);
|
||||
static void sendNotification(const QString &icon, const QString &title, const QString &body);
|
||||
static bool isDDE();
|
||||
static bool isWayland();
|
||||
static void initConfig();
|
||||
static bool isUOS();
|
||||
static void setQPAPlatform();
|
||||
static void checkUOSDeveloperMode();
|
||||
static QJsonObject parseFeatureJsonFile();
|
||||
};
|
||||
|
||||
#endif // UTILS_H
|
||||
|
||||
@@ -1,52 +1,59 @@
|
||||
#include "widgetanimation.h"
|
||||
|
||||
WidgetAnimation::WidgetAnimation()
|
||||
{
|
||||
|
||||
}
|
||||
#include "widgets/base/basewidgetopacity.h"
|
||||
|
||||
void WidgetAnimation::widgetShake(QWidget *pWidget, int nRange)
|
||||
{
|
||||
int nX = pWidget->x();
|
||||
int nY = pWidget->y();
|
||||
QPropertyAnimation *pAnimation = new QPropertyAnimation(pWidget,"geometry");
|
||||
QPropertyAnimation *pAnimation = new QPropertyAnimation(pWidget, "geometry");
|
||||
pAnimation->setEasingCurve(QEasingCurve::InOutSine);
|
||||
pAnimation->setDuration(400);
|
||||
pAnimation->setStartValue(QRect(QPoint(nX,nY),pWidget->size()));
|
||||
pAnimation->setStartValue(QRect(QPoint(nX, nY), pWidget->size()));
|
||||
|
||||
int nShakeCount = 8;
|
||||
double nStep = 1.0/nShakeCount;
|
||||
for(int i = 1; i < nShakeCount; i++){
|
||||
nRange = i&1 ? -nRange : nRange;
|
||||
pAnimation->setKeyValueAt(nStep*i,QRect(QPoint(nX + nRange,nY),pWidget->size()));
|
||||
double nStep = 1.0 / nShakeCount;
|
||||
for (int i = 1; i < nShakeCount; i++)
|
||||
{
|
||||
nRange = i & 1 ? -nRange : nRange;
|
||||
pAnimation->setKeyValueAt(nStep * i, QRect(QPoint(nX + nRange, nY), pWidget->size()));
|
||||
}
|
||||
|
||||
pAnimation->setEndValue(QRect(QPoint(nX,nY),pWidget->size()));
|
||||
pAnimation->setEndValue(QRect(QPoint(nX, nY), pWidget->size()));
|
||||
pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
|
||||
}
|
||||
|
||||
QPropertyAnimation* WidgetAnimation::createWidgetOpacity(QWidget *pWidget, bool isAppear)
|
||||
QPropertyAnimation *WidgetAnimation::createWidgetOpacity(QWidget *pWidget, bool isAppear)
|
||||
{
|
||||
QPropertyAnimation *animation = new QPropertyAnimation(pWidget, "windowOpacity", pWidget);
|
||||
//设置动画效果
|
||||
animation->setEasingCurve(QEasingCurve::Linear);
|
||||
//设置动画时间(单位:毫秒)
|
||||
// 设置动画时间(单位:毫秒)
|
||||
animation->setDuration(500);
|
||||
// 设置动画步长值,以及在该位置时显示的透明度
|
||||
if(isAppear)
|
||||
if (isAppear)
|
||||
{
|
||||
animation->setKeyValueAt(0, 0);
|
||||
// m_animation->setKeyValueAt(0.5, 0);
|
||||
animation->setKeyValueAt(1, 1);
|
||||
}else{
|
||||
animation->setKeyValueAt(0, 1);
|
||||
animation->setKeyValueAt(1, 0);
|
||||
// 设置动画效果
|
||||
animation->setEasingCurve(QEasingCurve::Linear);
|
||||
// 设置动画步长值,以及在该位置时显示的透明度(即动画关键帧)
|
||||
animation->setKeyValueAt(0.0, 0.0);
|
||||
animation->setKeyValueAt(1.0, 1.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
animation->setEasingCurve(QEasingCurve::OutQuart);
|
||||
animation->setKeyValueAt(0.0, 1.0);
|
||||
animation->setKeyValueAt(1.0, 0.0);
|
||||
|
||||
QObject::connect(animation, &QPropertyAnimation::finished, pWidget, [=]() { pWidget->close(); });
|
||||
}
|
||||
|
||||
QObject::connect(animation, &QPropertyAnimation::valueChanged, pWidget, [=]()
|
||||
{
|
||||
pWidget->update(); // NOTE: 保证窗口透明度动画平滑
|
||||
});
|
||||
|
||||
return animation;
|
||||
}
|
||||
|
||||
void WidgetAnimation::widgetOpacity(QWidget *pWidget, bool isAppear)
|
||||
{
|
||||
// 开始动画
|
||||
createWidgetOpacity(pWidget, isAppear)->start();
|
||||
{
|
||||
// 启动/关闭动画
|
||||
createWidgetOpacity(pWidget, isAppear)->start(QPropertyAnimation::DeleteWhenStopped);
|
||||
}
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
#ifndef WIDGETANIMATION_H
|
||||
#define WIDGETANIMATION_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QWidget>
|
||||
#include <QPropertyAnimation>
|
||||
|
||||
class WidgetAnimation
|
||||
{
|
||||
public:
|
||||
WidgetAnimation();
|
||||
static void widgetShake(QWidget *pWidget, int nRange);
|
||||
|
||||
static QPropertyAnimation* createWidgetOpacity(QWidget *pWidget, bool isAppear);
|
||||
|
||||
@@ -1,38 +1,61 @@
|
||||
#include "basewidgetopacity.h"
|
||||
#include "utils/widgetanimation.h"
|
||||
#include "utils/utils.h"
|
||||
|
||||
#include <QCloseEvent>
|
||||
#include <QSettings>
|
||||
#include <QStandardPaths>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QCloseEvent>
|
||||
|
||||
BaseWidgetOpacity::BaseWidgetOpacity(QWidget *parent) : DBlurEffectWidget(parent)
|
||||
{
|
||||
// WidgetAnimation::widgetOpacity(this,true);
|
||||
}
|
||||
|
||||
/// @brief 窗口关闭事件
|
||||
/// @param event
|
||||
/**
|
||||
* @brief 窗口显示事件
|
||||
* @param event
|
||||
*/
|
||||
void BaseWidgetOpacity::showEvent(QShowEvent *event)
|
||||
{
|
||||
// FIXME: wayland 不支持直接设置窗口透明度,需要调用 wayland 相关库(考虑抄控制中心“窗口移动时启用透明特效”代码?)
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
bool isWayland = Utils::isWayland();
|
||||
if (!isWayland)
|
||||
{
|
||||
if (!showWindowAnimation)
|
||||
{
|
||||
showWindowAnimation = true;
|
||||
WidgetAnimation::widgetOpacity(this, true);
|
||||
}
|
||||
}
|
||||
|
||||
DBlurEffectWidget::showEvent(event);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 窗口关闭事件
|
||||
* @param event
|
||||
*/
|
||||
void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
if (!closeWindowAnimation) {
|
||||
// FIXME: wayland 不支持直接设置窗口透明度,需要调用 wayland 相关库(考虑抄控制中心“窗口移动时启用透明特效”代码?)
|
||||
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||
bool isWayland = Utils::isWayland();
|
||||
if (isWayland)
|
||||
{
|
||||
closeWindowAnimation = true;
|
||||
return DBlurEffectWidget::closeEvent(event);
|
||||
}
|
||||
|
||||
QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
|
||||
animation->setEasingCurve(QEasingCurve::OutQuart);
|
||||
animation->setDuration(500);
|
||||
animation->setStartValue(1.0);
|
||||
animation->setEndValue(0.0);
|
||||
if (!closeWindowAnimation)
|
||||
{
|
||||
closeWindowAnimation = true;
|
||||
WidgetAnimation::widgetOpacity(this, false);
|
||||
|
||||
QObject::connect(animation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value){
|
||||
this->update();
|
||||
// setWindowTitle(QString("ヾ(⌒∇⌒*)See You♪ - %1%").arg(int(value.toFloat() * 100)));
|
||||
});
|
||||
|
||||
QObject::connect(animation, &QPropertyAnimation::finished, this, [=](){
|
||||
this->close();
|
||||
});
|
||||
|
||||
animation->start();
|
||||
event->ignore();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
event->accept();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,17 +8,17 @@ DWIDGET_USE_NAMESPACE
|
||||
class BaseWidgetOpacity : public DBlurEffectWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit BaseWidgetOpacity(QWidget *parent = nullptr);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
// QWidget interface
|
||||
protected:
|
||||
bool closeWindowAnimation = false;
|
||||
void showEvent(QShowEvent *event) override;
|
||||
void closeEvent(QCloseEvent *event) override;
|
||||
|
||||
protected:
|
||||
bool showWindowAnimation = false;
|
||||
bool closeWindowAnimation = false;
|
||||
};
|
||||
|
||||
#endif // BASEWIDGETOPACITY_H
|
||||
|
||||
@@ -3,11 +3,10 @@
|
||||
#include <QHBoxLayout>
|
||||
#include <QtConcurrent>
|
||||
|
||||
big_image::big_image(DBlurEffectWidget *parent) :
|
||||
DBlurEffectWidget(parent),
|
||||
m_image(new QLabel)
|
||||
big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent),
|
||||
m_image(new QLabel)
|
||||
{
|
||||
// setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint); // 设置图片对话框总在最前
|
||||
// setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint); // 设置图片对话框总在最前
|
||||
setWindowModality(Qt::ApplicationModal); // 以上无效不如直接使用 模态化对话框
|
||||
setRadius(0);
|
||||
setMaskAlpha(60);
|
||||
|
||||
@@ -6,13 +6,12 @@
|
||||
|
||||
bool DownloadItem::isInstall = false;
|
||||
|
||||
DownloadItem::DownloadItem(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
reinstall(false),
|
||||
close(false),
|
||||
ui(new Ui::DownloadItem),
|
||||
output_w(new DDialog),
|
||||
textbrowser(new QTextBrowser)
|
||||
DownloadItem::DownloadItem(QWidget *parent) : QWidget(parent),
|
||||
reinstall(false),
|
||||
close(false),
|
||||
ui(new Ui::DownloadItem),
|
||||
output_w(new DDialog),
|
||||
textbrowser(new QTextBrowser)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
@@ -23,6 +22,9 @@ DownloadItem::DownloadItem(QWidget *parent) :
|
||||
ui->pushButton_3->hide();
|
||||
ui->widget_spinner->start();
|
||||
ui->widget_spinner->hide();
|
||||
|
||||
ui->label->setElideMode(Qt::TextElideMode::ElideRight);
|
||||
ui->label_2->setElideMode(Qt::TextElideMode::ElideRight);
|
||||
}
|
||||
|
||||
DownloadItem::~DownloadItem()
|
||||
@@ -34,10 +36,12 @@ void DownloadItem::setValue(qint64 value)
|
||||
{
|
||||
ui->progressBar->setValue(qint32(value));
|
||||
ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")");
|
||||
if(ui->label_2->text().left(4) == "100%")
|
||||
ui->label_2->setToolTip(QString::number(double(value) / 100) + "% (" + speed + ")");
|
||||
if (ui->label_2->text().left(4) == "100%")
|
||||
{
|
||||
download = 1;
|
||||
ui->label_2->setText(tr("Download Complete."));
|
||||
ui->label_2->setToolTip(tr("Download Complete."));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +53,7 @@ void DownloadItem::setMax(qint64 max)
|
||||
void DownloadItem::setName(QString name)
|
||||
{
|
||||
ui->label->setText(name);
|
||||
ui->label->setToolTip(name);
|
||||
}
|
||||
|
||||
QString DownloadItem::getName()
|
||||
@@ -56,16 +61,31 @@ QString DownloadItem::getName()
|
||||
return ui->label_filename->text();
|
||||
}
|
||||
|
||||
void DownloadItem::readyInstall()
|
||||
|
||||
/***************************************************************
|
||||
* @brief 告知界面,准备安装
|
||||
* @param
|
||||
* @note 如果正在安装,返回-1
|
||||
* @Sample usage: DownloadItem::install(0);
|
||||
**************************************************************/
|
||||
int DownloadItem::readyInstall()
|
||||
{
|
||||
if(!close)
|
||||
// 检查是否正在安装,如果是返回错误 -1
|
||||
if (isInstall)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!close)
|
||||
{
|
||||
ui->progressBar->hide();
|
||||
ui->pushButton_install->setEnabled(true);
|
||||
ui->pushButton_install->show();
|
||||
DownloadItem::install(0);
|
||||
ui->pushButton_2->hide();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void DownloadItem::setFileName(QString fileName)
|
||||
@@ -88,86 +108,29 @@ void DownloadItem::setSpeed(QString s)
|
||||
speed = s;
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
* @brief 安装当前应用
|
||||
* @param int t, t为安装方式,可以为 0,1,2
|
||||
* @note 执行这个函数时,需要已经检查是否可以安装,但该函数仍然会再检测一次!
|
||||
* @Sample usage: DownloadItem::install(0);
|
||||
**************************************************************/
|
||||
void DownloadItem::install(int t)
|
||||
{
|
||||
if(!isInstall)
|
||||
if (!isInstall)
|
||||
{
|
||||
isInstall = true;
|
||||
ui->pushButton_install->hide();
|
||||
ui->widget_spinner->show();
|
||||
qDebug() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8();
|
||||
ui->label_2->setText(tr("Installing"));
|
||||
ui->label_2->setToolTip(tr("Installing"));
|
||||
|
||||
QtConcurrent::run([=]()
|
||||
{
|
||||
QProcess installer;
|
||||
switch(t)
|
||||
{
|
||||
case 0:
|
||||
installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||
break;
|
||||
case 1:
|
||||
installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||
break;
|
||||
case 2:
|
||||
installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||
break;
|
||||
}
|
||||
|
||||
bool haveError = false;
|
||||
bool notRoot = false;
|
||||
installer.waitForFinished(-1); // 不设置超时
|
||||
out = installer.readAllStandardOutput();
|
||||
|
||||
QStringList everyOut = out.split("\n");
|
||||
for(int i=0;i<everyOut.size();i++)
|
||||
{
|
||||
if(everyOut[i].left(2) == "E:")
|
||||
{
|
||||
haveError = true;
|
||||
}
|
||||
if(everyOut[i].right(14) == "Not authorized")
|
||||
{
|
||||
notRoot = true;
|
||||
}
|
||||
}
|
||||
|
||||
QProcess isInstall;
|
||||
isInstall.start("dpkg -s " + pkgName);
|
||||
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟
|
||||
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
||||
if(error == 0)
|
||||
{
|
||||
ui->pushButton_install->hide();
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete."));
|
||||
ui->label_2->setText(tr("Finish"));
|
||||
download = 3;
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->pushButton_install->show();
|
||||
ui->pushButton_install->setText(tr("Retry"));
|
||||
download = 1;
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again."));
|
||||
ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
|
||||
if(notRoot)
|
||||
{
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been aborted,you can retry installation."));
|
||||
ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation"));
|
||||
ui->pushButton_install->show();
|
||||
ui->pushButton_3->hide();
|
||||
}
|
||||
|
||||
ui->widget_spinner->hide();
|
||||
DownloadItem::isInstall = false;
|
||||
emit finished();
|
||||
slotAsyncInstall(t);
|
||||
});
|
||||
// emit finished();
|
||||
qDebug()<<ui->label_filename->text().toUtf8();
|
||||
|
||||
qDebug() << ui->label_filename->text().toUtf8();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,6 +142,7 @@ void DownloadItem::on_pushButton_install_clicked()
|
||||
void DownloadItem::on_pushButton_2_clicked()
|
||||
{
|
||||
ui->label_2->setText(tr("Download canceled"));
|
||||
ui->label_2->setToolTip(tr("Download canceled"));
|
||||
download = 2;
|
||||
ui->pushButton_2->setEnabled(false);
|
||||
ui->progressBar->hide();
|
||||
@@ -198,3 +162,81 @@ void DownloadItem::on_pushButton_3_clicked()
|
||||
output_w->layout()->addWidget(textbrowser);
|
||||
output_w->show();
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
* @brief 实际安装应用
|
||||
* @param int t, t为安装方式,可以为 0,1,2
|
||||
* @note 备注
|
||||
* @Sample usage: slotAsyncInstall(0);
|
||||
**************************************************************/
|
||||
void DownloadItem::slotAsyncInstall(int t)
|
||||
{
|
||||
QProcess installer;
|
||||
switch(t)
|
||||
{
|
||||
case 0:
|
||||
installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||
break;
|
||||
case 1:
|
||||
installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||
break;
|
||||
case 2:
|
||||
installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||
break;
|
||||
}
|
||||
|
||||
bool haveError = false;
|
||||
bool notRoot = false;
|
||||
installer.waitForFinished(-1); // 不设置超时
|
||||
out = installer.readAllStandardOutput();
|
||||
|
||||
QStringList everyOut = out.split("\n");
|
||||
for (int i = 0; i < everyOut.size(); i++)
|
||||
{
|
||||
if(everyOut[i].left(2) == "E:")
|
||||
{
|
||||
haveError = true;
|
||||
}
|
||||
if(everyOut[i].right(14) == "Not authorized")
|
||||
{
|
||||
notRoot = true;
|
||||
}
|
||||
}
|
||||
|
||||
QProcess isInstall;
|
||||
isInstall.start("dpkg", QStringList() << "-s" << pkgName);
|
||||
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟
|
||||
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
||||
if (error == 0 && !haveError)
|
||||
{
|
||||
ui->pushButton_install->hide();
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete."));
|
||||
ui->label_2->setText(tr("Finish"));
|
||||
ui->label_2->setToolTip(tr("Finish"));
|
||||
download = 3;
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->pushButton_install->show();
|
||||
ui->pushButton_install->setText(tr("Retry"));
|
||||
download = 1;
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again."));
|
||||
ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
|
||||
ui->label_2->setToolTip(tr("Error happened in dpkg progress , you can try it again"));
|
||||
ui->pushButton_3->show();
|
||||
}
|
||||
|
||||
if (notRoot)
|
||||
{
|
||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been aborted,you can retry installation."));
|
||||
ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation"));
|
||||
ui->label_2->setToolTip(tr("dpkg progress had been aborted,you can retry installation"));
|
||||
ui->pushButton_install->show();
|
||||
ui->pushButton_3->hide();
|
||||
}
|
||||
|
||||
ui->widget_spinner->hide();
|
||||
DownloadItem::isInstall = false;
|
||||
emit finished(error == 0 && !haveError && !notRoot);
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ public:
|
||||
void setMax(qint64);
|
||||
void setName(QString);
|
||||
QString getName();
|
||||
void readyInstall();
|
||||
int readyInstall();
|
||||
|
||||
void setFileName(QString);
|
||||
void seticon(const QPixmap);
|
||||
@@ -59,8 +59,10 @@ private slots:
|
||||
void on_pushButton_2_clicked();
|
||||
void on_pushButton_3_clicked();
|
||||
|
||||
void slotAsyncInstall(int t);
|
||||
|
||||
signals:
|
||||
void finished();
|
||||
void finished(bool success);
|
||||
};
|
||||
|
||||
#endif // DOWNLOADITEM_H
|
||||
|
||||
@@ -7,13 +7,25 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>666</width>
|
||||
<height>54</height>
|
||||
<height>56</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>56</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>54</height>
|
||||
<height>56</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -40,10 +52,22 @@
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>48</width>
|
||||
<height>16777215</height>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
@@ -52,6 +76,9 @@
|
||||
<property name="scaledContents">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@@ -70,6 +97,31 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="DLabel" name="label">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>120</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>120</width>
|
||||
<height>48</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Name</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_filename">
|
||||
<property name="maximumSize">
|
||||
@@ -83,33 +135,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>13</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Name</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
@@ -153,11 +178,14 @@
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>8</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
<number>8</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QProgressBar" name="progressBar">
|
||||
@@ -188,7 +216,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<widget class="DLabel" name="label_2">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>9</pointsize>
|
||||
@@ -297,6 +325,11 @@
|
||||
<header location="global">dspinner.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>DLabel</class>
|
||||
<extends>QLabel</extends>
|
||||
<header>dlabel.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
|
||||
@@ -1,112 +1,54 @@
|
||||
#include "progressbutton.h"
|
||||
#include "widgets/downloadlistwidget.h"
|
||||
|
||||
#include <QPainter>
|
||||
#include <QPainterPath>
|
||||
#include <QRect>
|
||||
#include <QConicalGradient>
|
||||
#include <QVariantAnimation>
|
||||
#include <QMoveEvent>
|
||||
#include <QSvgRenderer>
|
||||
|
||||
ProgressButton::ProgressButton(QWidget *parent)
|
||||
: QWidget{parent}
|
||||
{
|
||||
//this->setWindowFlags(Qt::FramelessWindowHint);
|
||||
this->setAttribute(Qt::WA_TranslucentBackground, true);
|
||||
setMinimumWidth(36);
|
||||
setMinimumHeight(36);
|
||||
svgPath="";
|
||||
backColor=Qt::transparent;
|
||||
setMouseTracking(true);
|
||||
// this->setWindowFlags(Qt::FramelessWindowHint);
|
||||
// this->setAttribute(Qt::WA_TranslucentBackground, true);
|
||||
setMinimumSize(36, 36);
|
||||
|
||||
connect(this,&ProgressButton::startProcessing,this,&ProgressButton::operationProcessing,Qt::QueuedConnection);
|
||||
svgPath = "";
|
||||
backColor = Qt::transparent;
|
||||
|
||||
connect(this, &ProgressButton::startProcessing, this, &ProgressButton::operationProcessing, Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
ProgressButton::~ProgressButton()
|
||||
{
|
||||
}
|
||||
|
||||
void ProgressButton::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
QPainter painter(this);
|
||||
painter.setRenderHint(QPainter::Antialiasing,true);
|
||||
auto rect = event->rect();
|
||||
|
||||
if(buttonState == state::normal || buttonState == state::hover)
|
||||
{
|
||||
auto radiu = (rect.height() - 6) / 2;
|
||||
painter.translate(rect.center());
|
||||
painter.setPen(Qt::transparent);
|
||||
painter.setBrush(QColor(buttonState == state::normal ? color : color.darker()));
|
||||
//painter.drawEllipse(QPoint(0,0),radiu,radiu);
|
||||
|
||||
//radiu -= 3;
|
||||
painter.setBrush(backColor);
|
||||
painter.drawEllipse(QPoint(0,0),radiu,radiu);
|
||||
|
||||
QSvgRenderer m_svgRender;
|
||||
m_svgRender.load(svgPath);
|
||||
m_svgRender.render(&painter ,QRectF(-radiu / 2,-radiu / 2,radiu,radiu));
|
||||
}
|
||||
else if(buttonState == state::openProgress)
|
||||
{
|
||||
painter.translate(rect.center());
|
||||
auto radiu = (rect.height() - 6) / 2 -3;
|
||||
painter.setBrush(backColor);
|
||||
painter.setPen(QPen(backColor,3));
|
||||
painter.drawEllipse(QPoint(0,0),radiu,radiu);
|
||||
|
||||
painter.setPen(QPen(backColor,3));
|
||||
|
||||
QSvgRenderer m_svgRender;
|
||||
m_svgRender.load(svgPath);
|
||||
m_svgRender.render(&painter ,QRectF(-radiu / 2,-radiu / 2,radiu,radiu));
|
||||
|
||||
QRect rect = QRect(-radiu, -radiu,
|
||||
radiu*2, radiu*2);
|
||||
|
||||
painter.setPen(QPen(color.darker(100),3));
|
||||
auto angle = progress * 360 / 100;
|
||||
painter.drawArc(rect.adjusted(-3,-3,3,3),90 * 16,-static_cast<int>(angle * 16));
|
||||
}
|
||||
else if(buttonState == state::closeProgress)
|
||||
{
|
||||
auto radiu = (rect.height() - 6) / 2;
|
||||
painter.translate(rect.center());
|
||||
painter.setPen(Qt::transparent);
|
||||
painter.setBrush(QColor(0, 0, 0, 63));
|
||||
painter.drawEllipse(QPoint(0,0),radiu,radiu);
|
||||
|
||||
radiu -= 3;
|
||||
painter.setBrush(backColor);
|
||||
painter.drawEllipse(QPoint(0,0),radiu,radiu);
|
||||
|
||||
painter.setPen(QPen(color,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
|
||||
painter.drawLine(QPoint(-radiu / 3,0),
|
||||
QPoint(-radiu / 5,radiu / 3));
|
||||
painter.drawLine(QPoint(-radiu / 5,radiu / 3),
|
||||
QPoint(radiu / 4,-radiu / 4));
|
||||
}
|
||||
}
|
||||
|
||||
void ProgressButton::setProgress(int progress)
|
||||
{
|
||||
buttonState = state::openProgress;
|
||||
ProgressButton::progress = progress;
|
||||
if(progress == 0)
|
||||
if (progress == 0)
|
||||
{
|
||||
buttonState = state::normal;
|
||||
update();
|
||||
}
|
||||
if(progress == 100)
|
||||
if (progress == 100)
|
||||
{
|
||||
buttonState = state::closeProgress;
|
||||
update();
|
||||
auto waterDrop = new WaterDrop();
|
||||
waterDrop->move(this->mapToGlobal(this->rect().center()));
|
||||
WaterDrop *waterDrop = new WaterDrop(parentWidget());
|
||||
waterDrop->move(geometry().center());
|
||||
waterDrop->show();
|
||||
}
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
|
||||
void ProgressButton::setDownloadListWidget(DownloadListWidget *widget)
|
||||
{
|
||||
m_downloadListWidget = widget;
|
||||
}
|
||||
|
||||
void ProgressButton::setIcon(QString svgPATH)
|
||||
{
|
||||
svgPath = svgPATH;
|
||||
@@ -125,9 +67,59 @@ void ProgressButton::setColor(QColor color)
|
||||
update();
|
||||
}
|
||||
|
||||
void ProgressButton::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mouseMoved = false;
|
||||
m_isDownloadListWidgetVisible = m_downloadListWidget->isVisible();
|
||||
m_downloadListWidget->hide();
|
||||
QWidget::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void ProgressButton::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
if (buttonState == state::hover || buttonState == state::normal)
|
||||
{
|
||||
widthChangeValue = (this->width() - 6) / 2;
|
||||
update();
|
||||
}
|
||||
else if (buttonState == state::closeProgress)
|
||||
{
|
||||
update();
|
||||
}
|
||||
|
||||
if (m_mouseMoved) {
|
||||
return QWidget::mouseReleaseEvent(event);
|
||||
}
|
||||
|
||||
if (m_isDownloadListWidgetVisible) {
|
||||
m_downloadListWidget->hide();
|
||||
} else {
|
||||
QPoint pos(this->mapToGlobal(QPoint(0, 0)));
|
||||
pos += QPoint(width() / 2 - m_downloadListWidget->width() / 2, height() + 5);
|
||||
m_downloadListWidget->m_move(pos.x(), pos.y());
|
||||
m_downloadListWidget->setWindowState(windowState() & Qt::WindowState::WindowActive);
|
||||
m_downloadListWidget->activateWindow();
|
||||
m_downloadListWidget->show();
|
||||
m_downloadListWidget->raise();
|
||||
}
|
||||
m_isDownloadListWidgetVisible = m_downloadListWidget->isVisible();
|
||||
QWidget::mouseReleaseEvent(event);
|
||||
}
|
||||
|
||||
void ProgressButton::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
{
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void ProgressButton::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mouseMoved = true;
|
||||
QWidget::mouseMoveEvent(event);
|
||||
}
|
||||
|
||||
void ProgressButton::leaveEvent(QEvent *event)
|
||||
{
|
||||
if(buttonState == state::hover)
|
||||
if (buttonState == state::hover)
|
||||
{
|
||||
buttonState = state::normal;
|
||||
update();
|
||||
@@ -135,41 +127,89 @@ void ProgressButton::leaveEvent(QEvent *event)
|
||||
QWidget::leaveEvent(event);
|
||||
}
|
||||
|
||||
void ProgressButton::mousePressEvent(QMouseEvent *event)
|
||||
void ProgressButton::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
if(buttonState == state::hover || buttonState == state::normal)
|
||||
QPainter painter(this);
|
||||
painter.setRenderHint(QPainter::Antialiasing, true);
|
||||
QRect rect = event->rect();
|
||||
|
||||
if (buttonState == state::normal || buttonState == state::hover)
|
||||
{
|
||||
widthChangeValue = (this->width() - 6) / 2;
|
||||
update();
|
||||
int radius = (rect.height() - 6) / 2;
|
||||
painter.translate(rect.center());
|
||||
painter.setPen(Qt::transparent);
|
||||
painter.setBrush(QColor(buttonState == state::normal ? color : color.darker()));
|
||||
// painter.drawEllipse(QPoint(0, 0), radius, radius);
|
||||
|
||||
// radiu -= 3;
|
||||
painter.setBrush(backColor);
|
||||
painter.drawEllipse(QPoint(0, 0), radius, radius);
|
||||
|
||||
QSvgRenderer m_svgRender;
|
||||
m_svgRender.load(svgPath);
|
||||
m_svgRender.render(&painter, QRectF(-radius / 2, -radius / 2, radius, radius));
|
||||
}
|
||||
else if(buttonState == state::closeProgress)
|
||||
else if (buttonState == state::openProgress)
|
||||
{
|
||||
update();
|
||||
painter.translate(rect.center());
|
||||
int radius = (rect.height() - 6) / 2 - 3;
|
||||
painter.setBrush(backColor);
|
||||
painter.setPen(QPen(backColor, 3));
|
||||
painter.drawEllipse(QPoint(0, 0), radius, radius);
|
||||
|
||||
painter.setPen(QPen(backColor, 3));
|
||||
|
||||
QSvgRenderer m_svgRender;
|
||||
m_svgRender.load(svgPath);
|
||||
m_svgRender.render(&painter, QRectF(-radius / 2, -radius / 2, radius, radius));
|
||||
|
||||
QRect rect = QRect(-radius, -radius,
|
||||
radius * 2, radius * 2);
|
||||
|
||||
painter.setPen(QPen(color.darker(100), 3));
|
||||
qreal angle = progress * 360 / 100 * 1.0;
|
||||
painter.drawArc(rect.adjusted(-3, -3, 3, 3), 90 * 16, -qIntCast(angle * 16));
|
||||
}
|
||||
emit clicked();
|
||||
QWidget::mousePressEvent(event);
|
||||
else if (buttonState == state::closeProgress)
|
||||
{
|
||||
auto radius = (rect.height() - 6) / 2;
|
||||
painter.translate(rect.center());
|
||||
painter.setPen(Qt::transparent);
|
||||
painter.setBrush(QColor(0, 0, 0, 63));
|
||||
painter.drawEllipse(QPoint(0, 0), radius, radius);
|
||||
|
||||
radius -= 3;
|
||||
painter.setBrush(backColor);
|
||||
painter.drawEllipse(QPoint(0, 0), radius, radius);
|
||||
|
||||
painter.setPen(QPen(color, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
|
||||
painter.drawLine(QPoint(-radius / 3, 0),
|
||||
QPoint(-radius / 5, radius / 3));
|
||||
painter.drawLine(QPoint(-radius / 5, radius / 3),
|
||||
QPoint(radius / 4, -radius / 4));
|
||||
}
|
||||
QWidget::paintEvent(event);
|
||||
}
|
||||
|
||||
void ProgressButton::operationProcessing()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
const int RADIUS = 60;
|
||||
WaterDrop::WaterDrop(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, m_waterDropAnimation(nullptr)
|
||||
, m_waterDropAnimation(new QVariantAnimation(this))
|
||||
, m_animationRadius(0)
|
||||
{
|
||||
this->setFixedSize(QSize(RADIUS * 2, RADIUS * 2));
|
||||
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
|
||||
this->setAttribute(Qt::WA_TranslucentBackground);
|
||||
this->setAttribute(Qt::WA_DeleteOnClose);
|
||||
m_waterDropAnimation = new QVariantAnimation(this);
|
||||
// m_waterDropAnimation->setEasingCurve(QEasingCurve(static_cast<QEasingCurve::Type>(QRandomGenerator::global()->bounded(40))));
|
||||
// this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
|
||||
// this->setAttribute(Qt::WA_TranslucentBackground);
|
||||
// this->setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
// m_waterDropAnimation->setEasingCurve(QEasingCurve(static_cast<QEasingCurve::Type>(QRandomGenerator::global()->bounded(40))));
|
||||
}
|
||||
|
||||
//把鼠标点击的点转换为圆心点坐标
|
||||
// 把鼠标点击的点转换为圆心点坐标
|
||||
void WaterDrop::move(const QPoint &point)
|
||||
{
|
||||
QPoint translatePoint = point - QPoint(RADIUS, RADIUS);
|
||||
@@ -182,9 +222,9 @@ void WaterDrop::show()
|
||||
m_waterDropAnimation->setEndValue(RADIUS);
|
||||
m_waterDropAnimation->setDuration(350);
|
||||
|
||||
connect(m_waterDropAnimation, &QVariantAnimation::valueChanged, this, &WaterDrop::onRaduisChanged);
|
||||
connect(m_waterDropAnimation, &QVariantAnimation::valueChanged, this, &WaterDrop::onRadiusChanged);
|
||||
connect(m_waterDropAnimation, &QVariantAnimation::finished, this, &WaterDrop::close);
|
||||
m_waterDropAnimation->start();
|
||||
m_waterDropAnimation->start(QVariantAnimation::DeleteWhenStopped);
|
||||
QWidget::show();
|
||||
}
|
||||
|
||||
@@ -192,14 +232,15 @@ void WaterDrop::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
QPainter painter(this);
|
||||
painter.setRenderHint(QPainter::Antialiasing);
|
||||
QPen pen;
|
||||
pen.setColor(QColor(0xffffff80));
|
||||
QPen pen(QBrush(QColor("#ffff80")), 5.0);
|
||||
pen.setWidth(5);
|
||||
painter.setPen(pen);
|
||||
painter.drawEllipse(event->rect().center(),m_animationRadius, m_animationRadius);
|
||||
painter.drawEllipse(event->rect().center(), m_animationRadius, m_animationRadius);
|
||||
|
||||
QWidget::paintEvent(event);
|
||||
}
|
||||
|
||||
void WaterDrop::onRaduisChanged(QVariant value)
|
||||
void WaterDrop::onRadiusChanged(const QVariant &value)
|
||||
{
|
||||
m_animationRadius = value.toInt();
|
||||
update();
|
||||
|
||||
@@ -1,53 +1,62 @@
|
||||
#ifndef PROGRESSBUTTON_H
|
||||
#define PROGRESSBUTTON_H
|
||||
|
||||
|
||||
#include <QtWidgets/QWidget>
|
||||
|
||||
#include <QPaintEvent>
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTimer>
|
||||
#include <QTimerEvent>
|
||||
#include<QColor>
|
||||
#include <QList>
|
||||
#include <QMouseEvent>
|
||||
|
||||
#include <QVariantAnimation>
|
||||
|
||||
class DownloadListWidget;
|
||||
class ProgressButton : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ProgressButton(QWidget *parent = nullptr);
|
||||
explicit ProgressButton(QWidget *parent = nullptr);
|
||||
~ProgressButton() override;
|
||||
|
||||
void setIcon(QString svgPATH);
|
||||
void setBackgroundColor(QColor color);
|
||||
void setColor(QColor color);
|
||||
void setProgress(int progress);
|
||||
~ProgressButton();
|
||||
|
||||
void setDownloadListWidget(DownloadListWidget *widget);
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent *event) override;
|
||||
void mouseReleaseEvent(QMouseEvent *event) override;
|
||||
void mouseDoubleClickEvent(QMouseEvent *event) override;
|
||||
void mouseMoveEvent(QMouseEvent *event) override;
|
||||
void leaveEvent(QEvent *event) override;
|
||||
void paintEvent(QPaintEvent *event) override;
|
||||
|
||||
signals:
|
||||
void startProcessing();
|
||||
void clicked();
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *event)override;
|
||||
void leaveEvent(QEvent *event)override;
|
||||
void mousePressEvent(QMouseEvent *event)override;
|
||||
private slots:
|
||||
void operationProcessing();
|
||||
|
||||
private:
|
||||
enum class state
|
||||
enum state
|
||||
{
|
||||
normal,
|
||||
hover,
|
||||
openProgress,
|
||||
closeProgress,
|
||||
recovery
|
||||
}
|
||||
buttonState{state::normal};
|
||||
};
|
||||
|
||||
DownloadListWidget *m_downloadListWidget = nullptr;
|
||||
|
||||
state buttonState{state::normal};
|
||||
QColor backColor;
|
||||
QColor color;
|
||||
QString svgPath;
|
||||
int widthChangeValue{0};
|
||||
void operationProcessing();
|
||||
int progress{0};//处理百分比
|
||||
|
||||
bool m_mouseMoved = false;
|
||||
bool m_isDownloadListWidgetVisible = true;
|
||||
};
|
||||
|
||||
class WaterDrop : public QWidget
|
||||
@@ -55,19 +64,19 @@ class WaterDrop : public QWidget
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
WaterDrop(QWidget *parent = Q_NULLPTR);
|
||||
explicit WaterDrop(QWidget *parent = nullptr);
|
||||
void show();
|
||||
void move(const QPoint &point);
|
||||
|
||||
private:
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *event);
|
||||
void onRaduisChanged(QVariant value);
|
||||
|
||||
private slots:
|
||||
void onRadiusChanged(const QVariant &value);
|
||||
|
||||
private:
|
||||
class QVariantAnimation* m_waterDropAnimation;
|
||||
QVariantAnimation *m_waterDropAnimation = nullptr;
|
||||
int m_animationRadius;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // PROGRESSBUTTON_H
|
||||
|
||||
@@ -5,21 +5,20 @@
|
||||
#include <QDebug>
|
||||
SmoothListWidget::SmoothListWidget(QWidget *parent) : QListWidget(parent)
|
||||
{
|
||||
vScrollBar->setOrientation(Qt::Orientation::Vertical); //将滚动条设置为纵向
|
||||
setVerticalScrollBar(vScrollBar); //设置纵向滚动条
|
||||
vScrollBar->setOrientation(Qt::Orientation::Vertical); // 将滚动条设置为纵向
|
||||
setVerticalScrollBar(vScrollBar); // 设置纵向滚动条
|
||||
connect(vScrollBar, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int)));
|
||||
}
|
||||
void SmoothListWidget::wheelEvent(QWheelEvent *e)
|
||||
{
|
||||
//当捕获到事件后,调用相对滚动的槽函数
|
||||
// 当捕获到事件后,调用相对滚动的槽函数
|
||||
vScrollBar->scroll(e->angleDelta().y());
|
||||
}
|
||||
void SmoothListWidget::onSliderChanged(int p)
|
||||
{
|
||||
int startRow = count();
|
||||
if (p == vScrollBar->maximum())
|
||||
{
|
||||
emit reachedBottom(); // 1
|
||||
}
|
||||
emit msliderChanged(p); // 2
|
||||
emit msliderChanged(p); // 2
|
||||
}
|
||||
|
||||
@@ -1,56 +1,56 @@
|
||||
#include "smoothscrollbar.h"
|
||||
#include <QWheelEvent>
|
||||
#include <QDebug>
|
||||
SmoothScrollBar::SmoothScrollBar(QWidget* parent):QScrollBar(parent)
|
||||
SmoothScrollBar::SmoothScrollBar(QWidget *parent) : QScrollBar(parent)
|
||||
{
|
||||
m_scrollAni=new QPropertyAnimation(this);
|
||||
m_scrollAni = new QPropertyAnimation(this);
|
||||
m_scrollAni->setTargetObject(this);
|
||||
m_scrollAni->setPropertyName("value");
|
||||
m_scrollAni->setEasingCurve(QEasingCurve::OutQuint); //设置动画曲线,在Qt文档中有详细的介绍
|
||||
m_scrollAni->setDuration(500); //设置动画时间,数值越小播放越快
|
||||
m_targetValue_v=value(); //将m_targetValue_v初始化
|
||||
m_scrollAni->setEasingCurve(QEasingCurve::OutQuint); // 设置动画曲线,在Qt文档中有详细的介绍
|
||||
m_scrollAni->setDuration(500); // 设置动画时间,数值越小播放越快
|
||||
m_targetValue_v = value(); // 将m_targetValue_v初始化
|
||||
}
|
||||
|
||||
void SmoothScrollBar::setValue(int value)
|
||||
{
|
||||
m_scrollAni->stop();//停止现在的动画,防止出现冲突
|
||||
m_scrollAni->setStartValue(this->value()); //设置动画滚动的初始值为当前位置
|
||||
m_scrollAni->setEndValue(value); //设置动画的结束位置为目标值
|
||||
m_scrollAni->start(); //开始动画
|
||||
m_scrollAni->stop(); // 停止现在的动画,防止出现冲突
|
||||
m_scrollAni->setStartValue(this->value()); // 设置动画滚动的初始值为当前位置
|
||||
m_scrollAni->setEndValue(value); // 设置动画的结束位置为目标值
|
||||
m_scrollAni->start(); // 开始动画
|
||||
}
|
||||
void SmoothScrollBar::scrollTop()
|
||||
{
|
||||
setValue(-m_targetValue_v); //开始动画
|
||||
m_targetValue_v=0;
|
||||
setValue(-m_targetValue_v); // 开始动画
|
||||
m_targetValue_v = 0;
|
||||
}
|
||||
void SmoothScrollBar::scroll(int value)
|
||||
{
|
||||
//这里推荐评论区中大佬优化的写法
|
||||
if(m_targetValue_v-value>=0)
|
||||
// 这里推荐评论区中大佬优化的写法
|
||||
if (m_targetValue_v - value >= 0)
|
||||
{
|
||||
m_targetValue_v-=value; //将目标值和相对位置进行运算
|
||||
setValue(m_targetValue_v); //开始动画
|
||||
m_targetValue_v -= value; // 将目标值和相对位置进行运算
|
||||
setValue(m_targetValue_v); // 开始动画
|
||||
}
|
||||
}
|
||||
|
||||
void SmoothScrollBar::mousePressEvent(QMouseEvent *e)
|
||||
{
|
||||
//当使用鼠标操作滚动条时,不会刷新m_targetValue_v的值,因而需要重写事件,对其进行刷新。
|
||||
// 当使用鼠标操作滚动条时,不会刷新m_targetValue_v的值,因而需要重写事件,对其进行刷新。
|
||||
m_scrollAni->stop();
|
||||
QScrollBar::mousePressEvent(e);
|
||||
m_targetValue_v=value();
|
||||
m_targetValue_v = value();
|
||||
}
|
||||
|
||||
void SmoothScrollBar::mouseReleaseEvent(QMouseEvent *e)
|
||||
{
|
||||
m_scrollAni->stop();
|
||||
QScrollBar::mouseReleaseEvent(e);
|
||||
m_targetValue_v=value();
|
||||
m_targetValue_v = value();
|
||||
}
|
||||
|
||||
void SmoothScrollBar::mouseMoveEvent(QMouseEvent *e)
|
||||
{
|
||||
m_scrollAni->stop();
|
||||
QScrollBar::mouseMoveEvent(e);
|
||||
m_targetValue_v=value();
|
||||
m_targetValue_v = value();
|
||||
}
|
||||
|
||||
@@ -1,10 +1,26 @@
|
||||
#include "webenginepage.h"
|
||||
|
||||
#include <QDesktopServices>
|
||||
#include <QWebEngineSettings>
|
||||
#include <QWebEngineProfile>
|
||||
|
||||
WebEnginePage::WebEnginePage(QObject *parent)
|
||||
: QWebEnginePage(parent)
|
||||
{
|
||||
QLocale ql;
|
||||
switch (ql.language())
|
||||
{
|
||||
case QLocale::Chinese:
|
||||
{
|
||||
// 系统语言是中文,获取网页为中文 @momen @uniartisan
|
||||
QWebEngineProfile *profile = QWebEngineProfile::defaultProfile();
|
||||
qDebug() << profile->httpAcceptLanguage();
|
||||
profile->setHttpAcceptLanguage("zh-CN,zh;q=0.8,en;q=0.6");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
WebEnginePage::~WebEnginePage()
|
||||
@@ -13,7 +29,8 @@ WebEnginePage::~WebEnginePage()
|
||||
|
||||
void WebEnginePage::setUrl(const QUrl &url)
|
||||
{
|
||||
if (m_currentUrl == url) {
|
||||
if (m_currentUrl == url)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -32,7 +49,8 @@ QWebEnginePage *WebEnginePage::createWindow(QWebEnginePage::WebWindowType type)
|
||||
|
||||
void WebEnginePage::slotUrlChanged(const QUrl &url)
|
||||
{
|
||||
if (m_currentUrl == url) {
|
||||
if (m_currentUrl == url)
|
||||
{
|
||||
sender()->deleteLater();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,25 +1,33 @@
|
||||
#include "downloadlistwidget.h"
|
||||
#include "ui_downloadlistwidget.h"
|
||||
#include <QGraphicsOpacityEffect>
|
||||
#include <QPropertyAnimation>
|
||||
#include "widgets/common/downloaditem.h"
|
||||
#include "backend/sparkapi.h"
|
||||
#include "backend/downloadworker.h"
|
||||
#include "utils/utils.h"
|
||||
#include "application.h"
|
||||
#include "mainwindow-dtk.h"
|
||||
|
||||
#include <QDesktopServices>
|
||||
#include <QtConcurrent>
|
||||
#include <QDebug>
|
||||
DownloadListWidget::DownloadListWidget(QWidget *parent) :
|
||||
DBlurEffectWidget(parent),
|
||||
ui(new Ui::DownloadListWidget)
|
||||
|
||||
DownloadListWidget::DownloadListWidget(QWidget *parent) : DBlurEffectWidget(parent),
|
||||
ui(new Ui::DownloadListWidget)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setWindowTitle(QObject::tr("Download list"));
|
||||
installEventFilter(this);
|
||||
this->setAttribute(Qt::WA_Hover,true);
|
||||
this->setAttribute(Qt::WA_Hover, true);
|
||||
setFocus();
|
||||
setFixedSize(500,400);
|
||||
setFixedSize(500, 400);
|
||||
setMaskAlpha(250);
|
||||
ui->listWidget->hide();
|
||||
ui->widget->show();
|
||||
// 计算显示下载速度
|
||||
download_speed.setInterval(1000);
|
||||
download_speed.start();
|
||||
connect(&download_speed,&QTimer::timeout,[=]()
|
||||
{
|
||||
connect(&download_speed, &QTimer::timeout, [=]()
|
||||
{
|
||||
if(isdownload && theSpeed == "")
|
||||
{
|
||||
size1 = download_size;
|
||||
@@ -47,59 +55,67 @@ DownloadListWidget::DownloadListWidget(QWidget *parent) :
|
||||
downloaditemlist[nowDownload - 1]->setSpeed(theSpeed);
|
||||
}else{
|
||||
emit downloadProgress(0);
|
||||
}
|
||||
});
|
||||
} });
|
||||
}
|
||||
|
||||
DownloadListWidget::~DownloadListWidget()
|
||||
{
|
||||
if (downloadController) {
|
||||
if (downloadController)
|
||||
{
|
||||
downloadController->disconnect();
|
||||
downloadController->stopDownload();
|
||||
downloadController->deleteLater();
|
||||
// 这里没有释放 downloadController,使用懒汉式单例
|
||||
}
|
||||
|
||||
clearItem();
|
||||
delete ui;
|
||||
}
|
||||
|
||||
bool DownloadListWidget::isDownloadInProcess()
|
||||
{
|
||||
if (toDownload > 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void DownloadListWidget::clearItem()
|
||||
{
|
||||
ui->listWidget->vScrollBar->scrollTop();
|
||||
int n=ui->listWidget->count();
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
QListWidgetItem *item = ui->listWidget->takeItem(0);
|
||||
QWidget *card = ui->listWidget->itemWidget(item);
|
||||
delete card;
|
||||
card = NULL;
|
||||
delete item;
|
||||
item = NULL;
|
||||
}
|
||||
ui->listWidget->clear();
|
||||
}
|
||||
void DownloadListWidget::addItem(QString name,QString fileName,QString pkgName,const QPixmap icon,QString downloadurl)
|
||||
|
||||
DownloadItem* DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl)
|
||||
{
|
||||
if(fileName.isEmpty())
|
||||
if (fileName.isEmpty())
|
||||
{
|
||||
return;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
urList.append(downloadurl);
|
||||
allDownload += 1;
|
||||
DownloadItem *di=new DownloadItem(this);
|
||||
dlist<<downloadurl;
|
||||
downloaditemlist<<di;
|
||||
toDownload += 1;
|
||||
|
||||
DownloadItem *di = new DownloadItem;
|
||||
connect(di, &DownloadItem::finished, this, &DownloadListWidget::slotInstallFinished, Qt::QueuedConnection);
|
||||
|
||||
dlist << downloadurl;
|
||||
downloaditemlist << di;
|
||||
di->setName(name);
|
||||
di->setFileName(fileName);
|
||||
di->pkgName=pkgName;
|
||||
di->pkgName = pkgName;
|
||||
di->seticon(icon);
|
||||
QListWidgetItem* pItem = new QListWidgetItem();
|
||||
pItem->setSizeHint(QSize(240, 50));
|
||||
QListWidgetItem *pItem = new QListWidgetItem();
|
||||
pItem->setSizeHint(QSize(240, 56)); // ui 中单个 downloaditem 高度固定 56px(上下 margin 8px,图片固定 48x48)
|
||||
ui->listWidget->addItem(pItem);
|
||||
ui->listWidget->setItemWidget(pItem, di);
|
||||
if(!isBusy)
|
||||
if (!isBusy)
|
||||
{
|
||||
nowDownload += 1;
|
||||
startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求
|
||||
startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求
|
||||
}
|
||||
|
||||
return di;
|
||||
}
|
||||
|
||||
QList<DownloadItem *> DownloadListWidget::getDIList()
|
||||
@@ -120,52 +136,76 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName)
|
||||
isdownload = true;
|
||||
downloaditemlist[allDownload - 1]->free = false;
|
||||
|
||||
downloadController = new DownloadController(this); // 并发下载,在点击下载按钮的时候才会初始化
|
||||
// 使用懒汉式单例来存储downloadController
|
||||
if (downloadController == nullptr)
|
||||
{
|
||||
downloadController = new DownloadController; // 并发下载,在第一次点击下载按钮的时候才会初始化
|
||||
}
|
||||
else
|
||||
{
|
||||
downloadController->disconnect();
|
||||
downloadController->stopDownload();
|
||||
}
|
||||
|
||||
connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress);
|
||||
connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished);
|
||||
//connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});
|
||||
// connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});
|
||||
downloadController->setFilename(fileName);
|
||||
downloadController->startDownload(url.toString());
|
||||
}
|
||||
|
||||
/***************************************************************
|
||||
* @brief 下载列表完成下载的回调函数
|
||||
* @param
|
||||
* @note 如果正在安装,则在新开的线程空间中等待上一个安装完
|
||||
* @Sample usage:
|
||||
**************************************************************/
|
||||
void DownloadListWidget::httpFinished() // 完成下载
|
||||
{
|
||||
isdownload = false;
|
||||
isBusy = false;
|
||||
downloaditemlist[nowDownload - 1]->readyInstall();
|
||||
downloaditemlist[nowDownload - 1]->free = true;
|
||||
emit downloadFinished();
|
||||
if(nowDownload < allDownload)
|
||||
|
||||
QtConcurrent::run([=]()
|
||||
{
|
||||
// 如果有排队则下载下一个
|
||||
qDebug() << "切换下一个下载...";
|
||||
nowDownload += 1;
|
||||
while(downloaditemlist[nowDownload - 1]->close)
|
||||
while (downloaditemlist[nowDownload - 1]->readyInstall() == -1) // 安装当前应用,堵塞安装,后面的下载suspend
|
||||
{
|
||||
nowDownload += 1;
|
||||
if(nowDownload >= allDownload)
|
||||
{
|
||||
nowDownload = allDownload;
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
QString fileName = downloaditemlist[nowDownload - 1]->getName();
|
||||
startRequest(urList.at(nowDownload-1), fileName);
|
||||
}
|
||||
downloaditemlist[nowDownload - 1]->free = true;
|
||||
emit downloadFinished();
|
||||
|
||||
if (nowDownload < allDownload)
|
||||
{
|
||||
// 如果有排队则下载下一个
|
||||
qDebug() << "Download: 切换下一个下载...";
|
||||
nowDownload += 1;
|
||||
while (downloaditemlist[nowDownload - 1]->close)
|
||||
{
|
||||
nowDownload += 1;
|
||||
if (nowDownload >= allDownload)
|
||||
{
|
||||
nowDownload = allDownload;
|
||||
return;
|
||||
}
|
||||
}
|
||||
QString fileName = downloaditemlist[nowDownload - 1]->getName();
|
||||
startRequest(urList.at(nowDownload - 1), fileName);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes)
|
||||
{
|
||||
if(totalBytes <= 0)
|
||||
if (totalBytes <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
theSpeed = speedInfo;
|
||||
downloaditemlist[nowDownload - 1]->setMax(10000); // 最大值
|
||||
downloaditemlist[nowDownload - 1]->setValue(int(bytesRead * 100 / totalBytes) * 100); // 当前值
|
||||
downloaditemlist[nowDownload - 1]->setMax(10000); // 最大值
|
||||
downloaditemlist[nowDownload - 1]->setValue(int(bytesRead * 100 / totalBytes) * 100); // 当前值
|
||||
emit downloadProgress(int(bytesRead * 100 / totalBytes));
|
||||
download_size = bytesRead;
|
||||
if(downloaditemlist[nowDownload - 1]->close)
|
||||
if (downloaditemlist[nowDownload - 1]->close)
|
||||
{
|
||||
// 随时检测下载是否被取消
|
||||
downloadController->disconnect();
|
||||
@@ -175,26 +215,14 @@ void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesR
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DownloadListWidget::m_move(int x,int y)
|
||||
void DownloadListWidget::m_move(int x, int y)
|
||||
{
|
||||
m_rect.setX(x);
|
||||
m_rect.setY(y);
|
||||
move(x,y);
|
||||
move(x, y);
|
||||
return;
|
||||
}
|
||||
bool DownloadListWidget::eventFilter(QObject *watched, QEvent *event)
|
||||
{
|
||||
if (Q_NULLPTR == watched) {
|
||||
return false;
|
||||
}
|
||||
if (QEvent::ActivationChange == event->type()) {
|
||||
if(QApplication::activeWindow() != this){
|
||||
this->close();
|
||||
}
|
||||
}
|
||||
return QWidget::eventFilter(watched, event);
|
||||
}
|
||||
|
||||
void DownloadListWidget::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
setGeometry(m_rect);
|
||||
@@ -204,3 +232,23 @@ void DownloadListWidget::on_pushButton_clicked()
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl("file:///tmp/spark-store", QUrl::TolerantMode));
|
||||
}
|
||||
|
||||
void DownloadListWidget::slotInstallFinished(bool success)
|
||||
{
|
||||
// NOTE: 仅在安装成功后判断是否需要退出后台
|
||||
if (success) {
|
||||
toDownload -= 1; // 安装完以后减少待安装数目
|
||||
qDebug() << "Download: 还没有下载的数目:" << toDownload;
|
||||
|
||||
if (toDownload == 0)
|
||||
{
|
||||
Application *app = qobject_cast<Application *>(qApp);
|
||||
MainWindow *mainWindow = app->mainWindow();
|
||||
if (mainWindow->isCloseWindowAnimation() == true)
|
||||
{
|
||||
qDebug() << "Download: 后台安装结束,退出程序";
|
||||
qApp->quit();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,38 @@
|
||||
#ifndef DOWNLOADLISTWIDGET_H
|
||||
#define DOWNLOADLISTWIDGET_H
|
||||
|
||||
#include <DBlurEffectWidget>
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTimer>
|
||||
#include <DBlurEffectWidget>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QDesktopServices>
|
||||
#include "widgets/common/downloaditem.h"
|
||||
#include "backend/sparkapi.h"
|
||||
#include "backend/downloadworker.h"
|
||||
#include "utils/utils.h"
|
||||
DWIDGET_USE_NAMESPACE
|
||||
|
||||
namespace Ui {
|
||||
class DownloadListWidget;
|
||||
}
|
||||
|
||||
DWIDGET_USE_NAMESPACE
|
||||
|
||||
class DownloadItem;
|
||||
class DownloadController;
|
||||
class DownloadListWidget : public DBlurEffectWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
void addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl);
|
||||
DownloadItem *addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl);
|
||||
int nowDownload = 0;
|
||||
int allDownload = 0;
|
||||
int toDownload = 0;
|
||||
QList<DownloadItem *> getDIList();
|
||||
QList<QUrl> getUrlList();
|
||||
void m_move(int x, int y);
|
||||
explicit DownloadListWidget(QWidget *parent = nullptr);
|
||||
~DownloadListWidget();
|
||||
~DownloadListWidget() override;
|
||||
|
||||
bool isDownloadInProcess();
|
||||
|
||||
protected:
|
||||
void mouseMoveEvent(QMouseEvent *event) override;
|
||||
|
||||
private:
|
||||
int isdownload = false;
|
||||
@@ -35,7 +40,7 @@ private:
|
||||
QStringList dlist;
|
||||
QList<QUrl> urList;
|
||||
QList<DownloadItem *> downloaditemlist;
|
||||
DownloadController *downloadController;
|
||||
DownloadController *downloadController = nullptr;
|
||||
int nowdownload = 0;
|
||||
QString theSpeed;
|
||||
QTimer download_speed;
|
||||
@@ -48,13 +53,14 @@ private:
|
||||
void clearItem();
|
||||
QRect m_rect;
|
||||
Ui::DownloadListWidget *ui;
|
||||
private slots:
|
||||
bool eventFilter(QObject *, QEvent *);
|
||||
void mouseMoveEvent(QMouseEvent *event);
|
||||
void on_pushButton_clicked();
|
||||
|
||||
signals:
|
||||
void downloadFinished();
|
||||
void downloadProgress(int i);
|
||||
|
||||
private slots:
|
||||
void on_pushButton_clicked();
|
||||
void slotInstallFinished(bool success);
|
||||
};
|
||||
|
||||
#endif // DOWNLOADLISTWIDGET_H
|
||||
|
||||
@@ -85,7 +85,7 @@ QListWidget::item::selected
|
||||
}</string>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="verticalScrollBarPolicy">
|
||||
<enum>Qt::ScrollBarAsNeeded</enum>
|
||||
@@ -99,9 +99,15 @@ QListWidget::item::selected
|
||||
<property name="autoScrollMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="editTriggers">
|
||||
<set>QAbstractItemView::NoEditTriggers</set>
|
||||
</property>
|
||||
<property name="resizeMode">
|
||||
<enum>QListView::Fixed</enum>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>4</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
||||
@@ -11,8 +11,20 @@
|
||||
#
|
||||
# Default: apt-get
|
||||
#
|
||||
_APTMGR=apt
|
||||
_APTMGR=apt-get
|
||||
|
||||
if [ -x "$(command -v apt)" ]; then
|
||||
_APTMGR=apt
|
||||
fi
|
||||
|
||||
|
||||
if grep -Eqi "linuxmint" /etc/os-release;then
|
||||
_APTMGR=apt-get
|
||||
fi
|
||||
|
||||
if [ -x "$(command -v oyo)" ]; then
|
||||
_APTMGR=/usr/bin/apt
|
||||
fi
|
||||
|
||||
####
|
||||
#
|
||||
@@ -25,6 +37,8 @@ AUTH_UOS_PASSWD="`cat /etc/apt/auth.conf.d/uos.conf | grep home-packages.chinau
|
||||
AUTH_UOS_PASSWD=`echo ${AUTH_UOS_PASSWD#*password }`
|
||||
|
||||
fi
|
||||
##### UOS自动读取账号密码以实现使用aptss来加速下载
|
||||
|
||||
# Enable DOWNLOADBEFORE to suppress apt-fast confirmation dialog and download
|
||||
# packages directly.
|
||||
#
|
||||
@@ -65,7 +79,7 @@ DOWNLOADBEFORE=true
|
||||
#
|
||||
# Default: disabled
|
||||
#
|
||||
MIRRORS=( 'https://d.store.deepinos.org.cn/,https://mirrors.sdu.edu.cn/spark-store-repository/,http://cdn.dl.uniartisan.com:9000/deepinos/,https://d1.store.deepinos.org.cn/,https://d2.store.deepinos.org.cn/,https://d4.store.deepinos.org.cn/,https://d5.store.deepinos.org.cn/' )
|
||||
MIRRORS=( 'https://d.store.deepinos.org.cn/,https://zunyun01.store.deepinos.org.cn/,https://mirrors.sdu.edu.cn/spark-store-repository/,http://cdn.dl.uniartisan.com:9000/deepinos/,https://d1.store.deepinos.org.cn/,https://d2.store.deepinos.org.cn/,https://d3.store.deepinos.org.cn/,https://d4.store.deepinos.org.cn/,https://d5.store.deepinos.org.cn/' )
|
||||
|
||||
|
||||
# Maximum number of connections
|
||||
@@ -73,7 +87,7 @@ MIRRORS=( 'https://d.store.deepinos.org.cn/,https://mirrors.sdu.edu.cn/spark-sto
|
||||
#
|
||||
# Default: 5
|
||||
#
|
||||
_MAXNUM=5
|
||||
_MAXNUM=16
|
||||
|
||||
|
||||
# Maximum number of connections per server
|
||||
|
||||
@@ -161,7 +161,8 @@ VERBOSE_OUTPUT=
|
||||
_DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} -i ${DLLIST} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} --connect-timeout=600 --timeout=600 -m0'
|
||||
|
||||
# Load config file.
|
||||
CONFFILE="/etc/apt-fast.conf"
|
||||
CONFFILE="/tmp/aptss-conf/apt-fast.conf"
|
||||
#### Spark Store apt-fast conf is in /tmp
|
||||
if [ -e "$CONFFILE" ]; then
|
||||
source "$CONFFILE"
|
||||
fi
|
||||
@@ -207,7 +208,9 @@ fi
|
||||
msg_already_running()
|
||||
{
|
||||
msg "apt-fast already running!" "warning"
|
||||
msg "apt-fast 已经在运行了" "warning"
|
||||
msg "Verify that all apt-fast processes are finished then remove $LCK_FILE.lock and try again." "hint"
|
||||
msg "请确认所有的apt-fast进程已经结束,然后删除 $LCK_FILE.lock 后重试." "hint"
|
||||
}
|
||||
|
||||
# Check if a lock file exists.
|
||||
@@ -246,6 +249,7 @@ cleanup_dllist()
|
||||
if ! rm -f -- "$DLLIST" 2>/dev/null
|
||||
then
|
||||
msg "Could not clean up download list file." "warning"
|
||||
msg "无法清除下载列表文件." "warning"
|
||||
CLEANUP_STATE=1
|
||||
fi
|
||||
fi
|
||||
@@ -304,12 +308,14 @@ get_uris(){
|
||||
if ! mkdir -p -- "$(dirname "$DLLIST")"
|
||||
then
|
||||
msg "Could not create download file directory." "warning"
|
||||
msg "无法创建下载文件夹" "warning"
|
||||
exit 1
|
||||
fi
|
||||
elif [ -f "$DLLIST" ]; then
|
||||
if ! rm -f -- "$DLLIST" 2>/dev/null && ! touch -- "$DLLIST" 2>/dev/null
|
||||
then
|
||||
msg "Unable to write to download file. Try restarting with root permissions or run 'apt-fast clean' first." "warning"
|
||||
msg "Unable to write to download file. Try restarting with root permissions or run 'aptss clean' first." "warning"
|
||||
msg "无法下载文件。尝试使用root权限,或者运行 'aptss clean'" "warning"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
@@ -318,15 +324,19 @@ get_uris(){
|
||||
echo "# apt-fast mirror list: $(date)" > "$DLLIST"
|
||||
#NOTE: aptitude doesn't have this functionality, so we use apt-get to get
|
||||
# package URIs.
|
||||
case "$_APTMGR" in
|
||||
apt|apt-get) uri_mgr=$_APTMGR;;
|
||||
*) uri_mgr=apt-get;;
|
||||
esac
|
||||
# case "$_APTMGR" in
|
||||
# apt|apt-get) uri_mgr=$_APTMGR;;
|
||||
# *) uri_mgr=apt-get;;
|
||||
# esac
|
||||
# NOTE:apt可能出现变动,不建议在脚本中使用,因此在此统一改用apt-get
|
||||
uri_mgr=apt-get
|
||||
uris_full="$("$uri_mgr" "${APT_SCRIPT_WARNING[@]}" -y --print-uris "$@")"
|
||||
uris_full_ret="$?"
|
||||
if [ "$uris_full_ret" -ne 0 ]
|
||||
then
|
||||
msg "Package manager quit with exit code." "warning"
|
||||
msg "Package manager quit with exit code.Here is the log" "warning"
|
||||
msg "包管理器以错误代码退出.日志如下" "warning"
|
||||
msg "${uris_full}"
|
||||
exit "$uris_full_ret"
|
||||
fi
|
||||
while read -r pkg_uri_info
|
||||
@@ -396,6 +406,7 @@ get_uris(){
|
||||
checksum="$(echo "$patch_checksum" | cut -d' ' -f2)"
|
||||
else
|
||||
msg "Couldn't get supported checksum for $pkg_name ($pkg_version)." "warning"
|
||||
msg "无法获得 $pkg_name ($pkg_version) 的受支持的散列验证值" "warning"
|
||||
REMOVE_WORKING_MESSAGE=
|
||||
fi
|
||||
fi
|
||||
@@ -434,6 +445,7 @@ display_downloadfile(){
|
||||
done <<<"$(echo -e "$DOWNLOAD_DISPLAY" | sort "${DISPLAY_SORT_OPTIONS[@]}")"
|
||||
fi
|
||||
msg "Download size: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
|
||||
msg "下载大小: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
|
||||
}
|
||||
|
||||
# Create and insert a PID number to lockfile.
|
||||
@@ -477,6 +489,7 @@ if [ "$CMD" == "aria2c" ]; then
|
||||
done
|
||||
if [ -z "$HASH_SUPPORTED" ]; then
|
||||
msg "Couldn't find supported checksum algorithm from aria2c. Checksums disabled." "warning"
|
||||
msg "无法找到aria2c支持的散列验证算法. 散列验证已被禁用." "warning"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -531,6 +544,7 @@ fi
|
||||
if [ "$option" == "install" ]; then
|
||||
msg
|
||||
msg "Working... this may take a while." "normal"
|
||||
msg "正在工作中,请稍等" "normal"
|
||||
REMOVE_WORKING_MESSAGE=y
|
||||
|
||||
get_uris "$@"
|
||||
@@ -598,6 +612,7 @@ elif [ "$option" == "clean" ]; then
|
||||
elif [ "$option" == "download" ]; then
|
||||
msg
|
||||
msg "Working... this may take a while." "normal"
|
||||
msg "正在工作中,请稍等" "normal"
|
||||
REMOVE_WORKING_MESSAGE=y
|
||||
|
||||
get_uris "$@"
|
||||
@@ -616,6 +631,7 @@ elif [ "$option" == "download" ]; then
|
||||
elif [ "$option" == "source" ]; then
|
||||
msg
|
||||
msg "Working... this may take a while." "normal"
|
||||
msg "正在工作中,请稍等" "normal"
|
||||
REMOVE_WORKING_MESSAGE=y
|
||||
|
||||
get_uris "$@"
|
||||
|
||||
55
tool/aptss
55
tool/aptss
@@ -1,50 +1,79 @@
|
||||
#!/bin/bash
|
||||
|
||||
case `arch` in
|
||||
x86_64)
|
||||
STORE_URL="store"
|
||||
STORE_LIST_URL=""
|
||||
;;
|
||||
aarch64)
|
||||
STORE_URL="aarch64-store"
|
||||
STORE_LIST_URL="-aarch64"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
SS_APT_FAST="/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast"
|
||||
|
||||
if [ ! -e "/tmp/aptss-conf/apt-fast.conf" ];then
|
||||
###刷新apt-fast配置
|
||||
mkdir -p /tmp/aptss-conf/
|
||||
echo "从服务器获取配置和镜像列表..."
|
||||
echo "Getting server and mirror lists..."
|
||||
echo
|
||||
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
|
||||
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
|
||||
chmod -R 755 /tmp/aptss-conf
|
||||
|
||||
fi
|
||||
|
||||
|
||||
if [ ! -e "/var/lib/apt/lists/d.spark-app.store_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/apt/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages" ];then
|
||||
echo "接收星火仓库软件信息中..."
|
||||
|
||||
mkdir -p /tmp/aptss-conf/
|
||||
echo "从服务器获取配置和镜像列表..."
|
||||
echo "Getting server and mirror lists..."
|
||||
echo
|
||||
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
|
||||
chmod -R 755 /tmp/aptss-conf
|
||||
|
||||
sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore${STORE_LIST_URL}.list"
|
||||
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
||||
|
||||
#只更新星火源
|
||||
|
||||
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] ; then
|
||||
|
||||
|
||||
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
||||
|
||||
###执行
|
||||
bwrap --dev-bind / / \
|
||||
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \
|
||||
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
|
||||
/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast "$@" --allow-downgrades
|
||||
${SS_APT_FAST} "$@" --allow-downgrades
|
||||
|
||||
|
||||
elif [ "$1" = "download" ];then
|
||||
|
||||
###执行
|
||||
bwrap --dev-bind / / \
|
||||
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \
|
||||
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
|
||||
/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast "$@" --allow-downgrades
|
||||
${SS_APT_FAST} "$@" --allow-downgrades
|
||||
|
||||
|
||||
elif [ "$1" = "policy" ] || [ "$1" = "search" ];then
|
||||
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
||||
|
||||
|
||||
|
||||
###执行
|
||||
bwrap --dev-bind / / \
|
||||
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \
|
||||
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
|
||||
apt "$@" --allow-downgrades
|
||||
apt "$@"
|
||||
|
||||
elif [ "$1" = "ssupdate" ];then
|
||||
|
||||
@@ -52,23 +81,23 @@ mkdir -p /tmp/aptss-conf/
|
||||
echo "从服务器获取配置和镜像列表..."
|
||||
echo "Getting server and mirror lists..."
|
||||
echo
|
||||
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
|
||||
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
|
||||
chmod -R 755 /tmp/aptss-conf
|
||||
|
||||
sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
|
||||
sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore${STORE_LIST_URL}.list"
|
||||
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
||||
|
||||
#只更新星火源
|
||||
|
||||
elif [ "$1" = "update" ];then
|
||||
sudo curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
|
||||
sudo curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore${STORE_LIST_URL}.list"
|
||||
|
||||
|
||||
mkdir -p /tmp/aptss-conf/
|
||||
echo "从服务器获取配置和镜像列表..."
|
||||
echo "Getting server and mirror lists..."
|
||||
echo
|
||||
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
|
||||
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
|
||||
chmod -R 755 /tmp/aptss-conf
|
||||
### 额外一份拿来给aptss自动补全用
|
||||
bwrap --dev-bind / / \
|
||||
|
||||
31
tool/bashimport/transhell.amber
Executable file
31
tool/bashimport/transhell.amber
Executable file
@@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
|
||||
##load transhell
|
||||
function load_transhell_debug()
|
||||
{
|
||||
local WORK_PATH="$(cd "$(dirname "${0}")" && pwd)"
|
||||
local CURRENT_LANG="$(echo ${LANG%.*})"
|
||||
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell; echo "Loading transhell from /usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell ..."; fi
|
||||
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell; echo "Loading transhell from /usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell ..."; fi
|
||||
if [ -e "${WORK_PATH}/transhell/$(basename $0)_en_US.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_en_US.transhell; echo "Loading transhell from ${WORK_PATH}/transhell/$(basename $0)_en_US.transhell ..."; fi
|
||||
if [ -e "${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell; echo "Loading transhell from ${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell ..."; fi
|
||||
|
||||
echo "-----------------------------------------------------------------------------"
|
||||
}
|
||||
|
||||
function load_transhell()
|
||||
{
|
||||
local WORK_PATH="$(cd "$(dirname "${0}")" && pwd)"
|
||||
local CURRENT_LANG="$(echo ${LANG%.*})"
|
||||
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell; fi
|
||||
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell; fi
|
||||
if [ -e "${WORK_PATH}/transhell/$(basename $0)_en_US.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_en_US.transhell; fi
|
||||
if [ -e "${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell; fi
|
||||
|
||||
}
|
||||
|
||||
function update_transhell()
|
||||
{
|
||||
load_transhell $@
|
||||
}
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
# Feadback 反馈脚本
|
||||
使用 shc 加密, 需要使用 cc、gcc 编译。
|
||||
|
||||
此处既支持amd64也支持aarch64,参见mailget仓库,loongarch的时候再修改
|
||||
|
||||
@@ -1,817 +0,0 @@
|
||||
#if 0
|
||||
shc Version 4.0.3, Generic Shell Script Compiler
|
||||
GNU GPL Version 3 Md Jahidul Hamid <jahidulhamid@yahoo.com>
|
||||
|
||||
shc -v -r -f sender-d.sh
|
||||
#endif
|
||||
|
||||
static char data [] =
|
||||
#define pswd_z 256
|
||||
#define pswd ((&data[15]))
|
||||
"\073\237\114\151\003\324\064\061\057\100\342\310\062\343\346\075"
|
||||
"\105\011\036\257\154\107\223\050\237\060\137\020\063\015\377\156"
|
||||
"\162\230\321\117\026\333\267\322\335\062\077\075\261\355\172\366"
|
||||
"\367\231\246\144\341\071\215\201\151\354\221\234\371\221\013\153"
|
||||
"\052\334\273\101\267\162\023\224\244\123\322\125\100\115\114\067"
|
||||
"\347\362\233\310\053\050\111\225\025\333\061\016\154\075\172\227"
|
||||
"\031\065\330\320\250\354\145\114\077\067\242\200\204\357\267\154"
|
||||
"\341\123\064\015\174\176\242\221\131\324\240\306\021\032\136\053"
|
||||
"\117\066\373\367\043\141\104\142\230\347\342\035\326\232\212\270"
|
||||
"\356\276\306\152\075\151\374\227\076\234\135\120\266\273\173\006"
|
||||
"\362\167\376\025\330\103\170\161\052\133\217\001\366\031\272\344"
|
||||
"\330\201\116\025\352\113\254\051\347\012\171\236\305\365\245\270"
|
||||
"\154\243\316\105\346\106\267\021\242\106\023\230\137\316\174\067"
|
||||
"\117\313\115\072\026\371\143\376\003\334\234\311\322\101\202\076"
|
||||
"\345\120\204\313\227\073\335\071\202\360\321\341\276\116\031\016"
|
||||
"\031\146\110\057\140\253\056\144\210\312\056\132\014\260\231\361"
|
||||
"\000\036\275\230\131\232\321\333\213\243\275\112\361\327\130\360"
|
||||
"\173\100\213\115\034\027\361\331\141\342\261\272\356\360\133\051"
|
||||
"\217\247\222\222\173\307\304\253\007\247\163\072\212\132\052\005"
|
||||
"\232\266\123\266\315\104\220"
|
||||
#define date_z 1
|
||||
#define date ((&data[311]))
|
||||
"\375"
|
||||
#define tst2_z 19
|
||||
#define tst2 ((&data[312]))
|
||||
"\031\242\273\246\041\336\076\145\246\300\036\051\047\366\106\356"
|
||||
"\220\064\226"
|
||||
#define shll_z 10
|
||||
#define shll ((&data[331]))
|
||||
"\142\312\022\213\061\052\357\062\161\266\353\321"
|
||||
#define inlo_z 3
|
||||
#define inlo ((&data[343]))
|
||||
"\216\314\250"
|
||||
#define msg1_z 65
|
||||
#define msg1 ((&data[347]))
|
||||
"\300\115\164\240\306\270\356\211\346\362\207\042\205\377\337\231"
|
||||
"\113\016\267\021\330\324\374\242\242\336\361\041\143\054\223\355"
|
||||
"\361\326\220\125\016\336\260\031\012\341\025\102\124\131\005\244"
|
||||
"\234\133\315\262\013\375\340\025\227\352\060\034\236\222\347\136"
|
||||
"\160\356\206\333\112\340\006\120\173\274\243\061"
|
||||
#define chk1_z 22
|
||||
#define chk1 ((&data[427]))
|
||||
"\270\017\004\242\044\277\223\036\316\135\273\047\172\354\056\123"
|
||||
"\141\200\041\375\363\101\127\122\242\373\336\067\346\143\370"
|
||||
#define text_z 1869
|
||||
#define text ((&data[549]))
|
||||
"\071\315\146\114\156\047\322\111\162\262\117\303\055\014\146\137"
|
||||
"\226\117\042\116\136\046\360\203\135\327\346\126\251\033\243\342"
|
||||
"\351\012\056\127\062\000\240\244\263\360\147\341\374\316\101\222"
|
||||
"\035\143\341\174\212\322\377\350\251\345\076\122\001\342\065\352"
|
||||
"\355\143\101\037\144\342\304\030\323\053\372\320\372\073\142\030"
|
||||
"\237\104\224\051\026\223\022\300\171\121\023\172\064\110\144\041"
|
||||
"\131\377\367\164\123\316\261\141\353\367\301\016\274\016\120\047"
|
||||
"\114\046\100\031\034\140\073\010\260\305\236\267\340\334\172\305"
|
||||
"\021\246\221\332\021\311\021\154\112\347\316\242\317\135\332\301"
|
||||
"\336\151\126\072\217\354\230\133\220\107\301\140\001\353\360\166"
|
||||
"\213\363\372\027\233\047\323\276\201\201\216\023\154\320\161\313"
|
||||
"\320\152\257\025\322\272\025\153\247\235\321\160\071\321\067\253"
|
||||
"\241\156\046\022\220\271\031\066\331\215\206\354\323\250\277\275"
|
||||
"\253\021\137\373\037\247\054\101\371\345\374\104\113\056\231\313"
|
||||
"\256\361\253\230\051\271\176\340\337\333\050\341\362\056\167\255"
|
||||
"\110\043\213\146\047\300\122\142\314\236\021\040\074\377\243\374"
|
||||
"\373\242\311\017\027\025\325\213\232\031\105\104\013\052\212\072"
|
||||
"\030\104\271\142\045\220\026\110\122\375\151\376\117\030\367\246"
|
||||
"\217\256\245\325\077\346\276\327\045\113\166\374\164\175\046\022"
|
||||
"\327\265\135\221\047\346\332\276\260\240\227\230\211\165\023\170"
|
||||
"\316\154\240\317\001\217\073\173\212\106\115\070\141\315\324\116"
|
||||
"\204\026\326\026\254\252\257\044\333\310\024\223\327\026\336\312"
|
||||
"\151\363\273\204\220\242\016\226\317\314\156\124\240\122\232\124"
|
||||
"\110\055\240\223\016\373\000\136\102\135\122\057\222\070\210\130"
|
||||
"\012\234\324\361\047\201\232\126\155\021\270\134\303\377\110\250"
|
||||
"\220\352\314\011\276\260\131\175\233\367\254\266\366\263\014\102"
|
||||
"\237\066\305\270\257\117\034\316\147\136\133\373\051\333\006\077"
|
||||
"\242\225\073\276\155\106\311\232\247\112\341\143\016\103\013\062"
|
||||
"\214\247\315\302\241\024\076\037\135\126\145\227\342\323\061\230"
|
||||
"\016\246\203\251\033\223\105\251\131\001\060\306\305\034\005\133"
|
||||
"\161\366\173\132\343\314\135\205\273\260\170\145\370\262\153\321"
|
||||
"\253\345\131\260\346\020\367\016\127\056\307\040\112\052\012\264"
|
||||
"\247\057\273\157\016\275\270\226\173\033\071\042\072\142\170\134"
|
||||
"\045\016\163\251\362\073\214\166\354\103\017\330\122\073\211\204"
|
||||
"\200\004\003\176\324\343\275\017\056\341\055\071\173\175\144\147"
|
||||
"\365\115\274\012\253\277\036\370\220\115\307\120\131\037\206\063"
|
||||
"\355\032\324\265\064\114\014\217\113\302\125\301\033\100\357\042"
|
||||
"\334\212\202\353\262\040\130\240\027\110\343\271\356\171\001\325"
|
||||
"\167\062\056\061\210\316\075\142\261\005\116\142\230\367\343\135"
|
||||
"\174\302\375\047\075\334\222\326\253\073\174\173\360\260\021\344"
|
||||
"\331\315\146\233\057\007\314\231\256\113\221\021\126\173\045\315"
|
||||
"\247\126\162\253\375\041\043\263\232\274\171\132\320\020\070\152"
|
||||
"\013\224\371\045\350\270\077\251\145\063\357\171\036\245\125\315"
|
||||
"\020\206\333\111\062\331\054\144\346\173\132\113\374\043\022\371"
|
||||
"\311\101\043\300\337\334\367\145\030\023\207\043\253\042\227\302"
|
||||
"\350\037\067\332\350\253\117\124\243\341\046\211\061\007\303\154"
|
||||
"\022\210\064\112\311\170\123\071\332\266\205\151\265\300\343\237"
|
||||
"\147\001\024\013\173\265\330\375\070\111\044\246\204\155\146\067"
|
||||
"\036\060\065\251\005\354\200\115\136\076\034\040\335\033\043\221"
|
||||
"\374\211\170\061\251\321\372\116\023\167\330\007\310\060\175\076"
|
||||
"\064\242\253\131\116\074\275\022\133\016\203\214\254\115\002\325"
|
||||
"\046\213\073\107\241\341\273\110\300\236\005\231\275\325\012\175"
|
||||
"\365\056\370\275\132\330\041\035\166\130\240\013\162\041\163\140"
|
||||
"\377\225\075\315\115\106\270\277\233\113\106\305\270\240\026\106"
|
||||
"\317\325\264\324\126\337\214\155\366\331\372\200\306\272\163\333"
|
||||
"\266\343\246\100\016\002\242\070\231\262\005\137\323\257\343\047"
|
||||
"\301\206\266\341\302\046\266\167\227\276\125\165\027\044\353\035"
|
||||
"\043\036\300\137\140\244\156\205\364\361\067\016\324\110\142\167"
|
||||
"\125\216\360\003\023\161\060\263\356\073\050\173\151\371\005\027"
|
||||
"\027\273\363\163\017\044\064\055\267\345\052\320\370\132\374\123"
|
||||
"\020\263\163\176\037\145\346\003\275\377\154\040\166\363\224\240"
|
||||
"\214\304\332\367\057\146\070\165\101\026\125\361\100\357\001\031"
|
||||
"\305\363\242\164\125\067\077\063\134\271\250\242\243\022\031\114"
|
||||
"\225\006\352\203\137\376\201\147\225\372\053\217\331\003\156\143"
|
||||
"\332\361\315\167\027\232\307\331\314\071\025\271\047\031\126\310"
|
||||
"\254\200\324\257\022\351\244\007\335\036\150\036\362\072\021\007"
|
||||
"\140\155\073\242\063\071\162\205\121\257\302\056\155\071\306\057"
|
||||
"\236\364\027\143\074\375\254\324\117\176\242\267\247\215\374\137"
|
||||
"\003\123\113\247\064\347\123\321\123\044\211\351\253\045\226\324"
|
||||
"\034\147\117\066\000\370\074\041\242\137\270\361\106\154\113\045"
|
||||
"\275\172\101\331\157\137\222\202\136\241\075\132\267\033\325\113"
|
||||
"\042\352\305\133\274\252\111\213\330\215\261\145\322\246\174\031"
|
||||
"\267\347\275\247\251\030\255\106\116\362\117\277\024\135\356\172"
|
||||
"\033\066\346\252\205\144\302\147\131\076\122\021\152\225\313\235"
|
||||
"\202\066\043\300\027\147\263\001\201\341\121\051\310\140\317\333"
|
||||
"\131\254\112\104\337\014\320\143\375\231\252\220\064\143\234\000"
|
||||
"\017\304\317\113\131\055\324\177\367\224\230\264\132\311\261\152"
|
||||
"\034\137\223\225\365\314\014\076\377\025\023\040\222\043\022\047"
|
||||
"\332\363\144\102\015\314\010\256\206\065\310\103\337\001\326\206"
|
||||
"\024\354\074\045\337\107\003\225\137\032\055\332\056\347\073\055"
|
||||
"\267\115\315\204\061\310\304\007\065\267\107\176\066\216\011\014"
|
||||
"\066\215\236\247\176\327\164\113\353\215\343\313\302\106\302\250"
|
||||
"\077\220\165\207\015\144\336\311\065\351\311\163\104\104\267\262"
|
||||
"\307\057\106\061\110\271\053\136\133\263\066\177\103\212\234\166"
|
||||
"\271\130\043\076\352\006\066\017\220\207\275\024\235\356\377\344"
|
||||
"\005\257\200\002\253\123\052\015\326\342\225\116\137\256\213\354"
|
||||
"\251\026\237\347\166\014\121\075\306\022\247\276\265\017\375\161"
|
||||
"\174\113\273\017\227\064\057\217\376\326\311\140\354\074\160\121"
|
||||
"\346\370\327\255\277\376\062\301\033\111\042\016\233\162\101\303"
|
||||
"\161\123\210\042\157\270\114\252\372\315\352\335\221\115\300\252"
|
||||
"\163\344\140\324\157\261\256\232\173\171\024\250\006\342\320\340"
|
||||
"\365\137\167\336\216\320\337\345\265\346\363\133\023\076\121\117"
|
||||
"\002\021\237\112\206\043\012\370\033\045\133\151\303\330\001\222"
|
||||
"\073\174\074\320\054\005\127\000\210\240\347\131\256\126\253\007"
|
||||
"\342\137\135\162\075\344\340\210\333\057\141\042\223\055\006\174"
|
||||
"\000\005\225\117\203\320\143\136\130\037\333\217\136\371\221\220"
|
||||
"\052\071\173\374\261\213\235\241\071\260\057\226\360\212\211\346"
|
||||
"\333\062\135\157\357\316\156\022\111\201\010\151\065\111\364\364"
|
||||
"\137\005\161\265\354\014\003\204\117\112\075\042\357\165\042\354"
|
||||
"\263\304\343\323\045\127\244\326\160\216\335\042\353\173\135\061"
|
||||
"\354\306\013\252\265\013\046\173\100\050\146\372\303\210\171\200"
|
||||
"\160\377\013\300\245\265\307\146\355\047\052\007\011\214\060\367"
|
||||
"\177\327\043\302\111\263\123\276\107\220\316\207\024\142\070\325"
|
||||
"\004\262\276\355\075\175\146\163\370\345\135\214\322\041\105\047"
|
||||
"\371\073\016\023\064\231\203\005\246\204\203\306\340\002\160\365"
|
||||
"\315\022\302\170\340\356\151\323\344\242\134\046\134\162\227\117"
|
||||
"\262\240\062\234\324\135\326\242\341\066\232\314\200\331\124\077"
|
||||
"\201\245\227\252\073\356\252\367\277\232\331\005\324\350\032\261"
|
||||
"\035\246\325\177\334\121\146\316\041\043\352\253\373\043\035\234"
|
||||
"\231\321\046\171\221\105\216\272\025\321\042\222\007\351\363\232"
|
||||
"\006\016\231\137\124\215\132\071\166\042\065\127\337\253\307\021"
|
||||
"\337\364\070\261\112\201\310\242\335\104\353\055\277\322\232\240"
|
||||
"\007\374\034\322\312\373\031\130\204\036\362\373\142\043\273\315"
|
||||
"\216\373\273\260\310\111\070\031\207\101\325\157\110\142\216\357"
|
||||
"\172\023\345\067\105\007\375\023\053\256\121\163\255\323\257\132"
|
||||
"\164\360\307\234\106\130\275\217\211\327\300\322\261\206\364\326"
|
||||
"\021\255\077\302\202\027\207\370\263\313\333\070\010\115\377\271"
|
||||
"\173\302\243\224\126\201\255\356\261\176\213\135\216\054\237\371"
|
||||
"\040\174\342\367\323\053\341\031\333\211\214\042\343\254\122\252"
|
||||
"\325\326\263\326\325\063\065\362\114\161\314\151\116\237\160\073"
|
||||
"\321\025\336\117\020\055\371\021\371\104\001\072\204\064\227\333"
|
||||
"\034\374\123\265\343\026\372\207\264\033\065\316\147\211\142\366"
|
||||
"\371\257\120\162\107\234\134\010\035\212\241\132\317\254\246\101"
|
||||
"\020\211\005\051\134\061\043\054\054\137\217\104\376\323\330\050"
|
||||
"\352\154\072\253\345\214\276\137\300\006\304\341\262\152\043\303"
|
||||
"\364\051\354\120\132\017\175\207\156\014\313\155\337\244\225\312"
|
||||
"\020\320\165\366\134\063\126\034\072\032\376\355\205\041\260\171"
|
||||
"\113\234\312\245\254\107\055\033\123\370\210\063\235\036\375\256"
|
||||
"\356\163\245\113\247\373\150\341\025\146\316\233\210\177\024\323"
|
||||
"\034\336\171\310\046\246\343\171\237\153\255\075\211\252\353\170"
|
||||
"\036\220\304\305\214\054\246\242\222\165\075\033\365\122\357\021"
|
||||
"\061\150\331\127\017\275\321\257\051\176"
|
||||
#define chk2_z 19
|
||||
#define chk2 ((&data[2562]))
|
||||
"\330\053\107\261\150\156\021\060\277\165\015\167\176\171\251\302"
|
||||
"\276\160\207\325\012\334"
|
||||
#define lsto_z 1
|
||||
#define lsto ((&data[2581]))
|
||||
"\010"
|
||||
#define xecc_z 15
|
||||
#define xecc ((&data[2582]))
|
||||
"\005\040\327\254\114\361\156\300\024\244\110\337\050\143\126\227"
|
||||
"\257"
|
||||
#define tst1_z 22
|
||||
#define tst1 ((&data[2603]))
|
||||
"\036\047\271\057\207\076\001\326\201\264\356\151\036\164\071\111"
|
||||
"\027\304\031\244\017\252\223\354\153\051\130\042\011\260"
|
||||
#define msg2_z 19
|
||||
#define msg2 ((&data[2632]))
|
||||
"\341\357\377\335\143\002\251\076\361\005\267\075\204\313\320\034"
|
||||
"\012\023\243\361\261\374\315\242"
|
||||
#define rlax_z 1
|
||||
#define rlax ((&data[2653]))
|
||||
"\121"
|
||||
#define opts_z 1
|
||||
#define opts ((&data[2654]))
|
||||
"\241"/* End of data[] */;
|
||||
#define hide_z 4096
|
||||
#define SETUID 0 /* Define as 1 to call setuid(0) at start of script */
|
||||
#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */
|
||||
#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */
|
||||
#define HARDENING 0 /* Define as 1 to disable ptrace/dump the executable */
|
||||
#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */
|
||||
|
||||
#if HARDENING
|
||||
static const char * shc_x[] = {
|
||||
"/*",
|
||||
" * Copyright 2019 - Intika <intika@librefox.org>",
|
||||
" * Replace ******** with secret read from fd 21",
|
||||
" * Also change arguments location of sub commands (sh script commands)",
|
||||
" * gcc -Wall -fpic -shared -o shc_secret.so shc_secret.c -ldl",
|
||||
" */",
|
||||
"",
|
||||
"#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */",
|
||||
"#define PLACEHOLDER \"********\"",
|
||||
"#include <dlfcn.h>",
|
||||
"#include <stdlib.h>",
|
||||
"#include <string.h>",
|
||||
"#include <unistd.h>",
|
||||
"#include <stdio.h>",
|
||||
"#include <signal.h>",
|
||||
"",
|
||||
"static char secret[128000]; //max size",
|
||||
"typedef int (*pfi)(int, char **, char **);",
|
||||
"static pfi real_main;",
|
||||
"",
|
||||
"// copy argv to new location",
|
||||
"char **copyargs(int argc, char** argv){",
|
||||
" char **newargv = malloc((argc+1)*sizeof(*argv));",
|
||||
" char *from,*to;",
|
||||
" int i,len;",
|
||||
"",
|
||||
" for(i = 0; i<argc; i++){",
|
||||
" from = argv[i];",
|
||||
" len = strlen(from)+1;",
|
||||
" to = malloc(len);",
|
||||
" memcpy(to,from,len);",
|
||||
" // zap old argv space",
|
||||
" memset(from,'\\0',len);",
|
||||
" newargv[i] = to;",
|
||||
" argv[i] = 0;",
|
||||
" }",
|
||||
" newargv[argc] = 0;",
|
||||
" return newargv;",
|
||||
"}",
|
||||
"",
|
||||
"static int mymain(int argc, char** argv, char** env) {",
|
||||
" //fprintf(stderr, \"Inject main argc = %d\\n\", argc);",
|
||||
" return real_main(argc, copyargs(argc,argv), env);",
|
||||
"}",
|
||||
"",
|
||||
"int __libc_start_main(int (*main) (int, char**, char**),",
|
||||
" int argc,",
|
||||
" char **argv,",
|
||||
" void (*init) (void),",
|
||||
" void (*fini)(void),",
|
||||
" void (*rtld_fini)(void),",
|
||||
" void (*stack_end)){",
|
||||
" static int (*real___libc_start_main)() = NULL;",
|
||||
" int n;",
|
||||
"",
|
||||
" if (!real___libc_start_main) {",
|
||||
" real___libc_start_main = dlsym(RTLD_NEXT, \"__libc_start_main\");",
|
||||
" if (!real___libc_start_main) abort();",
|
||||
" }",
|
||||
"",
|
||||
" n = read(21, secret, sizeof(secret));",
|
||||
" if (n > 0) {",
|
||||
" int i;",
|
||||
"",
|
||||
" if (secret[n - 1] == '\\n') secret[--n] = '\\0';",
|
||||
" for (i = 1; i < argc; i++)",
|
||||
" if (strcmp(argv[i], PLACEHOLDER) == 0)",
|
||||
" argv[i] = secret;",
|
||||
" }",
|
||||
"",
|
||||
" real_main = main;",
|
||||
"",
|
||||
" return real___libc_start_main(mymain, argc, argv, init, fini, rtld_fini, stack_end);",
|
||||
"}",
|
||||
"",
|
||||
0};
|
||||
#endif /* HARDENING */
|
||||
|
||||
/* rtc.c */
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* 'Alleged RC4' */
|
||||
|
||||
static unsigned char stte[256], indx, jndx, kndx;
|
||||
|
||||
/*
|
||||
* Reset arc4 stte.
|
||||
*/
|
||||
void stte_0(void)
|
||||
{
|
||||
indx = jndx = kndx = 0;
|
||||
do {
|
||||
stte[indx] = indx;
|
||||
} while (++indx);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set key. Can be used more than once.
|
||||
*/
|
||||
void key(void * str, int len)
|
||||
{
|
||||
unsigned char tmp, * ptr = (unsigned char *)str;
|
||||
while (len > 0) {
|
||||
do {
|
||||
tmp = stte[indx];
|
||||
kndx += tmp;
|
||||
kndx += ptr[(int)indx % len];
|
||||
stte[indx] = stte[kndx];
|
||||
stte[kndx] = tmp;
|
||||
} while (++indx);
|
||||
ptr += 256;
|
||||
len -= 256;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Crypt data.
|
||||
*/
|
||||
void arc4(void * str, int len)
|
||||
{
|
||||
unsigned char tmp, * ptr = (unsigned char *)str;
|
||||
while (len > 0) {
|
||||
indx++;
|
||||
tmp = stte[indx];
|
||||
jndx += tmp;
|
||||
stte[indx] = stte[jndx];
|
||||
stte[jndx] = tmp;
|
||||
tmp += stte[indx];
|
||||
*ptr ^= stte[tmp];
|
||||
ptr++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
/* End of ARC4 */
|
||||
|
||||
#if HARDENING
|
||||
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
#include <sys/prctl.h>
|
||||
#define PR_SET_PTRACER 0x59616d61
|
||||
|
||||
/* Seccomp Sandboxing Init */
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/prctl.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <linux/filter.h>
|
||||
#include <linux/seccomp.h>
|
||||
#include <linux/audit.h>
|
||||
|
||||
#define ArchField offsetof(struct seccomp_data, arch)
|
||||
|
||||
#define Allow(syscall) \
|
||||
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_##syscall, 0, 1), \
|
||||
BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW)
|
||||
|
||||
struct sock_filter filter[] = {
|
||||
/* validate arch */
|
||||
BPF_STMT(BPF_LD+BPF_W+BPF_ABS, ArchField),
|
||||
BPF_JUMP( BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 1, 0),
|
||||
BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL),
|
||||
|
||||
/* load syscall */
|
||||
BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)),
|
||||
|
||||
/* list of allowed syscalls */
|
||||
Allow(exit_group), /* exits a process */
|
||||
Allow(brk), /* for malloc(), inside libc */
|
||||
Allow(mmap), /* also for malloc() */
|
||||
Allow(munmap), /* for free(), inside libc */
|
||||
|
||||
/* and if we don't match above, die */
|
||||
BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL),
|
||||
};
|
||||
struct sock_fprog filterprog = {
|
||||
.len = sizeof(filter)/sizeof(filter[0]),
|
||||
.filter = filter
|
||||
};
|
||||
|
||||
/* Seccomp Sandboxing - Set up the restricted environment */
|
||||
void seccomp_hardening() {
|
||||
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
|
||||
perror("Could not start seccomp:");
|
||||
exit(1);
|
||||
}
|
||||
if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &filterprog) == -1) {
|
||||
perror("Could not start seccomp:");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
/* End Seccomp Sandboxing Init */
|
||||
|
||||
void shc_x_file() {
|
||||
FILE *fp;
|
||||
int line = 0;
|
||||
|
||||
if ((fp = fopen("/tmp/shc_x.c", "w")) == NULL ) {exit(1); exit(1);}
|
||||
for (line = 0; shc_x[line]; line++) fprintf(fp, "%s\n", shc_x[line]);
|
||||
fflush(fp);fclose(fp);
|
||||
}
|
||||
|
||||
int make() {
|
||||
char * cc, * cflags, * ldflags;
|
||||
char cmd[4096];
|
||||
|
||||
cc = getenv("CC");
|
||||
if (!cc) cc = "cc";
|
||||
|
||||
sprintf(cmd, "%s %s -o %s %s", cc, "-Wall -fpic -shared", "/tmp/shc_x.so", "/tmp/shc_x.c -ldl");
|
||||
if (system(cmd)) {remove("/tmp/shc_x.c"); return -1;}
|
||||
remove("/tmp/shc_x.c"); return 0;
|
||||
}
|
||||
|
||||
void arc4_hardrun(void * str, int len) {
|
||||
//Decode locally
|
||||
char tmp2[len];
|
||||
char tmp3[len+1024];
|
||||
memcpy(tmp2, str, len);
|
||||
|
||||
unsigned char tmp, * ptr = (unsigned char *)tmp2;
|
||||
int lentmp = len;
|
||||
int pid, status;
|
||||
pid = fork();
|
||||
|
||||
shc_x_file();
|
||||
if (make()) {exit(1);}
|
||||
|
||||
setenv("LD_PRELOAD","/tmp/shc_x.so",1);
|
||||
|
||||
if(pid==0) {
|
||||
|
||||
//Start tracing to protect from dump & trace
|
||||
if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) {
|
||||
kill(getpid(), SIGKILL);
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
//Decode Bash
|
||||
while (len > 0) {
|
||||
indx++;
|
||||
tmp = stte[indx];
|
||||
jndx += tmp;
|
||||
stte[indx] = stte[jndx];
|
||||
stte[jndx] = tmp;
|
||||
tmp += stte[indx];
|
||||
*ptr ^= stte[tmp];
|
||||
ptr++;
|
||||
len--;
|
||||
}
|
||||
|
||||
//Do the magic
|
||||
sprintf(tmp3, "%s %s", "'********' 21<<<", tmp2);
|
||||
|
||||
//Exec bash script //fork execl with 'sh -c'
|
||||
system(tmp2);
|
||||
|
||||
//Empty script variable
|
||||
memcpy(tmp2, str, lentmp);
|
||||
|
||||
//Clean temp
|
||||
remove("/tmp/shc_x.so");
|
||||
|
||||
//Sinal to detach ptrace
|
||||
ptrace(PTRACE_DETACH, 0, 0, 0);
|
||||
exit(0);
|
||||
}
|
||||
else {wait(&status);}
|
||||
|
||||
/* Seccomp Sandboxing - Start */
|
||||
seccomp_hardening();
|
||||
|
||||
exit(0);
|
||||
}
|
||||
#endif /* HARDENING */
|
||||
|
||||
/*
|
||||
* Key with file invariants.
|
||||
*/
|
||||
int key_with_file(char * file)
|
||||
{
|
||||
struct stat statf[1];
|
||||
struct stat control[1];
|
||||
|
||||
if (stat(file, statf) < 0)
|
||||
return -1;
|
||||
|
||||
/* Turn on stable fields */
|
||||
memset(control, 0, sizeof(control));
|
||||
control->st_ino = statf->st_ino;
|
||||
control->st_dev = statf->st_dev;
|
||||
control->st_rdev = statf->st_rdev;
|
||||
control->st_uid = statf->st_uid;
|
||||
control->st_gid = statf->st_gid;
|
||||
control->st_size = statf->st_size;
|
||||
control->st_mtime = statf->st_mtime;
|
||||
control->st_ctime = statf->st_ctime;
|
||||
key(control, sizeof(control));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if DEBUGEXEC
|
||||
void debugexec(char * sh11, int argc, char ** argv)
|
||||
{
|
||||
int i;
|
||||
fprintf(stderr, "shll=%s\n", sh11 ? sh11 : "<null>");
|
||||
fprintf(stderr, "argc=%d\n", argc);
|
||||
if (!argv) {
|
||||
fprintf(stderr, "argv=<null>\n");
|
||||
} else {
|
||||
for (i = 0; i <= argc ; i++)
|
||||
fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : "<null>");
|
||||
}
|
||||
}
|
||||
#endif /* DEBUGEXEC */
|
||||
|
||||
void rmarg(char ** argv, char * arg)
|
||||
{
|
||||
for (; argv && *argv && *argv != arg; argv++);
|
||||
for (; argv && *argv; argv++)
|
||||
*argv = argv[1];
|
||||
}
|
||||
|
||||
void chkenv_end(void);
|
||||
|
||||
int chkenv(int argc)
|
||||
{
|
||||
char buff[512];
|
||||
unsigned long mask, m;
|
||||
int l, a, c;
|
||||
char * string;
|
||||
extern char ** environ;
|
||||
|
||||
mask = (unsigned long)getpid();
|
||||
stte_0();
|
||||
key(&chkenv, (void*)&chkenv_end - (void*)&chkenv);
|
||||
key(&data, sizeof(data));
|
||||
key(&mask, sizeof(mask));
|
||||
arc4(&mask, sizeof(mask));
|
||||
sprintf(buff, "x%lx", mask);
|
||||
string = getenv(buff);
|
||||
#if DEBUGEXEC
|
||||
fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : "<null>");
|
||||
#endif
|
||||
l = strlen(buff);
|
||||
if (!string) {
|
||||
/* 1st */
|
||||
sprintf(&buff[l], "=%lu %d", mask, argc);
|
||||
putenv(strdup(buff));
|
||||
return 0;
|
||||
}
|
||||
c = sscanf(string, "%lu %d%c", &m, &a, buff);
|
||||
if (c == 2 && m == mask) {
|
||||
/* 3rd */
|
||||
rmarg(environ, &string[-l - 1]);
|
||||
return 1 + (argc - a);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void chkenv_end(void){}
|
||||
|
||||
#if HARDENING
|
||||
|
||||
static void gets_process_name(const pid_t pid, char * name) {
|
||||
char procfile[BUFSIZ];
|
||||
sprintf(procfile, "/proc/%d/cmdline", pid);
|
||||
FILE* f = fopen(procfile, "r");
|
||||
if (f) {
|
||||
size_t size;
|
||||
size = fread(name, sizeof (char), sizeof (procfile), f);
|
||||
if (size > 0) {
|
||||
if ('\n' == name[size - 1])
|
||||
name[size - 1] = '\0';
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
|
||||
void hardening() {
|
||||
prctl(PR_SET_DUMPABLE, 0);
|
||||
prctl(PR_SET_PTRACER, -1);
|
||||
|
||||
int pid = getppid();
|
||||
char name[256] = {0};
|
||||
gets_process_name(pid, name);
|
||||
|
||||
if ( (strcmp(name, "bash") != 0)
|
||||
&& (strcmp(name, "/bin/bash") != 0)
|
||||
&& (strcmp(name, "sh") != 0)
|
||||
&& (strcmp(name, "/bin/sh") != 0)
|
||||
&& (strcmp(name, "sudo") != 0)
|
||||
&& (strcmp(name, "/bin/sudo") != 0)
|
||||
&& (strcmp(name, "/usr/bin/sudo") != 0)
|
||||
&& (strcmp(name, "gksudo") != 0)
|
||||
&& (strcmp(name, "/bin/gksudo") != 0)
|
||||
&& (strcmp(name, "/usr/bin/gksudo") != 0)
|
||||
&& (strcmp(name, "kdesu") != 0)
|
||||
&& (strcmp(name, "/bin/kdesu") != 0)
|
||||
&& (strcmp(name, "/usr/bin/kdesu") != 0)
|
||||
)
|
||||
{
|
||||
printf("Operation not permitted\n");
|
||||
kill(getpid(), SIGKILL);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* HARDENING */
|
||||
|
||||
#if !TRACEABLE
|
||||
|
||||
#define _LINUX_SOURCE_COMPAT
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if !defined(PT_ATTACHEXC) /* New replacement for PT_ATTACH */
|
||||
#if !defined(PTRACE_ATTACH) && defined(PT_ATTACH)
|
||||
#define PT_ATTACHEXC PT_ATTACH
|
||||
#elif defined(PTRACE_ATTACH)
|
||||
#define PT_ATTACHEXC PTRACE_ATTACH
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void untraceable(char * argv0)
|
||||
{
|
||||
char proc[80];
|
||||
int pid, mine;
|
||||
|
||||
switch(pid = fork()) {
|
||||
case 0:
|
||||
pid = getppid();
|
||||
/* For problematic SunOS ptrace */
|
||||
#if defined(__FreeBSD__)
|
||||
sprintf(proc, "/proc/%d/mem", (int)pid);
|
||||
#else
|
||||
sprintf(proc, "/proc/%d/as", (int)pid);
|
||||
#endif
|
||||
close(0);
|
||||
mine = !open(proc, O_RDWR|O_EXCL);
|
||||
if (!mine && errno != EBUSY)
|
||||
mine = !ptrace(PT_ATTACHEXC, pid, 0, 0);
|
||||
if (mine) {
|
||||
kill(pid, SIGCONT);
|
||||
} else {
|
||||
perror(argv0);
|
||||
kill(pid, SIGKILL);
|
||||
}
|
||||
_exit(mine);
|
||||
case -1:
|
||||
break;
|
||||
default:
|
||||
if (pid == waitpid(pid, 0, 0))
|
||||
return;
|
||||
}
|
||||
perror(argv0);
|
||||
_exit(1);
|
||||
}
|
||||
#endif /* !TRACEABLE */
|
||||
|
||||
char * xsh(int argc, char ** argv)
|
||||
{
|
||||
char * scrpt;
|
||||
int ret, i, j;
|
||||
char ** varg;
|
||||
char * me = argv[0];
|
||||
if (me == NULL) { me = getenv("_"); }
|
||||
if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); }
|
||||
|
||||
ret = chkenv(argc);
|
||||
stte_0();
|
||||
key(pswd, pswd_z);
|
||||
arc4(msg1, msg1_z);
|
||||
arc4(date, date_z);
|
||||
if (date[0] && (atoll(date)<time(NULL)))
|
||||
return msg1;
|
||||
arc4(shll, shll_z);
|
||||
arc4(inlo, inlo_z);
|
||||
arc4(xecc, xecc_z);
|
||||
arc4(lsto, lsto_z);
|
||||
arc4(tst1, tst1_z);
|
||||
key(tst1, tst1_z);
|
||||
arc4(chk1, chk1_z);
|
||||
if ((chk1_z != tst1_z) || memcmp(tst1, chk1, tst1_z))
|
||||
return tst1;
|
||||
arc4(msg2, msg2_z);
|
||||
if (ret < 0)
|
||||
return msg2;
|
||||
varg = (char **)calloc(argc + 10, sizeof(char *));
|
||||
if (!varg)
|
||||
return 0;
|
||||
if (ret) {
|
||||
arc4(rlax, rlax_z);
|
||||
if (!rlax[0] && key_with_file(shll))
|
||||
return shll;
|
||||
arc4(opts, opts_z);
|
||||
#if HARDENING
|
||||
arc4_hardrun(text, text_z);
|
||||
exit(0);
|
||||
/* Seccomp Sandboxing - Start */
|
||||
seccomp_hardening();
|
||||
#endif
|
||||
arc4(text, text_z);
|
||||
arc4(tst2, tst2_z);
|
||||
key(tst2, tst2_z);
|
||||
arc4(chk2, chk2_z);
|
||||
if ((chk2_z != tst2_z) || memcmp(tst2, chk2, tst2_z))
|
||||
return tst2;
|
||||
/* Prepend hide_z spaces to script text to hide it. */
|
||||
scrpt = malloc(hide_z + text_z);
|
||||
if (!scrpt)
|
||||
return 0;
|
||||
memset(scrpt, (int) ' ', hide_z);
|
||||
memcpy(&scrpt[hide_z], text, text_z);
|
||||
} else { /* Reexecute */
|
||||
if (*xecc) {
|
||||
scrpt = malloc(512);
|
||||
if (!scrpt)
|
||||
return 0;
|
||||
sprintf(scrpt, xecc, me);
|
||||
} else {
|
||||
scrpt = me;
|
||||
}
|
||||
}
|
||||
j = 0;
|
||||
#if BUSYBOXON
|
||||
varg[j++] = "busybox";
|
||||
varg[j++] = "sh";
|
||||
#else
|
||||
varg[j++] = argv[0]; /* My own name at execution */
|
||||
#endif
|
||||
if (ret && *opts)
|
||||
varg[j++] = opts; /* Options on 1st line of code */
|
||||
if (*inlo)
|
||||
varg[j++] = inlo; /* Option introducing inline code */
|
||||
varg[j++] = scrpt; /* The script itself */
|
||||
if (*lsto)
|
||||
varg[j++] = lsto; /* Option meaning last option */
|
||||
i = (ret > 1) ? ret : 0; /* Args numbering correction */
|
||||
while (i < argc)
|
||||
varg[j++] = argv[i++]; /* Main run-time arguments */
|
||||
varg[j] = 0; /* NULL terminated array */
|
||||
#if DEBUGEXEC
|
||||
debugexec(shll, j, varg);
|
||||
#endif
|
||||
execvp(shll, varg);
|
||||
return shll;
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
#if SETUID
|
||||
setuid(0);
|
||||
#endif
|
||||
#if DEBUGEXEC
|
||||
debugexec("main", argc, argv);
|
||||
#endif
|
||||
#if HARDENING
|
||||
hardening();
|
||||
#endif
|
||||
#if !TRACEABLE
|
||||
untraceable(argv[0]);
|
||||
#endif
|
||||
argv[1] = xsh(argc, argv);
|
||||
fprintf(stderr, "%s%s%s: %s\n", argv[0],
|
||||
errno ? ": " : "",
|
||||
errno ? strerror(errno) : "",
|
||||
argv[1] ? argv[1] : "<null>"
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
551
tool/ss-feedback/sender-d_aarch64.sh.c
Normal file
551
tool/ss-feedback/sender-d_aarch64.sh.c
Normal file
@@ -0,0 +1,551 @@
|
||||
#if 0
|
||||
shc Version 3.9.6, Generic Shell Script Compiler
|
||||
GNU GPL Version 3 Md Jahidul Hamid <jahidulhamid@yahoo.com>
|
||||
|
||||
shc -f sender-d.sh
|
||||
#endif
|
||||
|
||||
static char data [] =
|
||||
#define rlax_z 1
|
||||
#define rlax ((&data[0]))
|
||||
"\063"
|
||||
#define tst1_z 22
|
||||
#define tst1 ((&data[4]))
|
||||
"\361\021\166\247\054\162\052\130\306\260\015\342\206\111\251\225"
|
||||
"\014\257\133\377\311\127\030\125\000\302\054\054\113\243"
|
||||
#define text_z 1976
|
||||
#define text ((&data[444]))
|
||||
"\371\056\127\353\324\272\303\246\127\103\073\027\017\312\311\013"
|
||||
"\011\120\251\004\101\273\172\004\347\246\120\212\167\046\371\161"
|
||||
"\124\121\134\051\014\037\320\143\142\013\173\161\326\104\175\337"
|
||||
"\224\047\343\326\342\135\332\311\004\052\124\173\120\116\354\245"
|
||||
"\237\111\316\254\150\236\017\313\252\212\075\200\317\273\137\144"
|
||||
"\342\103\072\304\240\025\216\245\077\343\041\220\061\015\065\321"
|
||||
"\126\004\176\277\243\215\212\115\030\310\315\350\203\055\114\145"
|
||||
"\160\207\052\021\234\270\267\334\234\330\154\315\346\242\237\075"
|
||||
"\246\035\374\112\253\207\227\304\117\145\254\322\223\370\070\004"
|
||||
"\200\142\026\034\033\315\370\267\245\145\205\213\007\045\310\256"
|
||||
"\103\304\370\356\114\220\263\234\366\137\156\211\130\247\216\330"
|
||||
"\012\244\364\045\161\355\335\027\122\143\242\131\210\152\010\313"
|
||||
"\057\000\272\173\221\155\030\207\314\206\021\045\056\237\376\070"
|
||||
"\104\363\136\266\340\073\315\062\236\157\214\047\332\224\362\011"
|
||||
"\225\254\205\047\032\235\256\347\044\300\014\123\140\012\213\245"
|
||||
"\375\351\133\336\045\050\021\304\227\235\353\162\062\336\173\310"
|
||||
"\213\001\357\245\237\236\215\303\137\231\026\300\244\242\145\242"
|
||||
"\214\300\200\262\350\222\166\200\060\142\363\142\101\156\053\314"
|
||||
"\160\033\162\017\272\377\323\031\231\351\331\076\214\077\340\030"
|
||||
"\377\141\312\350\364\101\151\044\244\134\206\345\313\262\261\073"
|
||||
"\315\044\112\210\043\036\242\275\007\173\373\224\272\334\254\272"
|
||||
"\076\167\242\062\270\013\126\134\150\335\102\063\217\364\156\135"
|
||||
"\030\271\345\074\327\210\371\337\004\364\163\276\320\037\171\016"
|
||||
"\227\034\101\120\047\227\254\217\164\357\303\004\343\061\141\373"
|
||||
"\352\107\067\302\317\060\241\323\045\024\222\365\064\014\004\314"
|
||||
"\050\105\034\120\335\311\340\121\270\243\126\233\324\122\357\013"
|
||||
"\070\017\057\033\361\302\125\023\157\131\212\025\047\257\370\016"
|
||||
"\010\366\143\065\131\176\051\066\270\360\232\062\302\250\250\177"
|
||||
"\136\117\242\120\250\347\324\357\214\270\132\335\126\136\050\114"
|
||||
"\222\114\360\150\163\035\211\116\174\332\227\153\326\016\366\366"
|
||||
"\072\123\302\126\122\137\270\200\001\155\105\331\354\075\055\326"
|
||||
"\220\047\224\036\275\257\275\117\123\205\136\141\102\024\270\310"
|
||||
"\107\134\354\353\353\042\127\124\122\074\302\346\005\014\334\232"
|
||||
"\152\144\130\275\141\331\214\251\153\141\043\352\112\002\315\206"
|
||||
"\340\315\070\004\346\240\255\002\135\342\156\334\237\163\250\267"
|
||||
"\175\120\003\240\051\367\113\007\247\061\171\233\300\274\140\152"
|
||||
"\235\043\211\064\154\113\027\106\256\110\210\265\050\347\221\121"
|
||||
"\267\310\161\074\356\126\221\004\312\253\305\025\012\251\360\062"
|
||||
"\056\043\144\341\034\005\004\273\234\305\201\126\233\320\266\073"
|
||||
"\024\033\223\126\012\311\022\322\312\341\043\070\146\153\137\307"
|
||||
"\046\174\220\116\101\360\320\213\035\140\366\275\075\140\157\153"
|
||||
"\073\246\030\245\010\061\134\031\012\325\245\332\235\150\054\253"
|
||||
"\342\052\334\033\222\303\163\311\046\251\332\170\177\037\020\355"
|
||||
"\246\311\236\003\146\043\116\234\127\061\176\166\001\162\066\167"
|
||||
"\015\056\045\316\155\276\113\011\010\343\044\363\001\004\030\370"
|
||||
"\303\000\137\326\235\356\336\026\132\246\200\264\155\326\201\215"
|
||||
"\016\275\072\353\002\315\252\115\353\335\007\001\244\370\112\212"
|
||||
"\130\115\005\264\250\162\010\130\042\145\272\020\337\002\303\143"
|
||||
"\064\136\343\301\174\020\243\346\321\233\146\316\263\110\222\371"
|
||||
"\173\324\003\323\254\354\004\134\367\077\346\160\061\013\030\273"
|
||||
"\025\071\021\050\235\317\024\323\161\371\220\137\042\356\235\322"
|
||||
"\174\334\201\125\241\221\376\232\271\015\175\043\007\212\335\314"
|
||||
"\073\141\100\134\277\332\242\010\162\261\021\203\244\061\026\210"
|
||||
"\360\045\322\151\304\270\114\051\125\060\362\265\005\300\134\176"
|
||||
"\132\040\215\273\264\074\312\021\141\307\236\372\376\163\037\353"
|
||||
"\103\114\213\176\350\207\272\236\112\311\030\075\165\221\006\007"
|
||||
"\104\135\121\024\270\210\031\160\205\317\344\253\016\016\124\007"
|
||||
"\025\317\220\045\070\323\354\205\017\023\063\020\041\323\236\317"
|
||||
"\133\063\271\022\224\223\147\242\104\177\276\312\000\003\267\203"
|
||||
"\361\033\051\371\035\001\051\117\304\105\007\011\115\242\160\145"
|
||||
"\036\216\162\273\025\206\107\240\254\103\314\364\221\346\316\177"
|
||||
"\107\262\376\226\114\203\167\055\077\356\170\243\016\010\140\301"
|
||||
"\135\330\346\136\037\301\177\120\042\063\206\067\155\354\036\036"
|
||||
"\072\065\346\274\130\205\372\263\062\342\275\133\124\271\311\061"
|
||||
"\074\005\056\226\126\221\056\303\113\370\216\313\062\011\205\001"
|
||||
"\212\170\377\316\345\026\014\067\065\214\071\257\046\204\226\341"
|
||||
"\343\344\100\253\112\123\307\334\170\303\334\170\070\170\130\216"
|
||||
"\224\350\020\336\230\141\067\272\233\016\035\255\206\345\101\152"
|
||||
"\233\360\260\342\101\047\335\155\334\311\257\304\226\137\001\112"
|
||||
"\071\367\057\253\342\034\230\201\077\103\207\123\142\364\264\370"
|
||||
"\223\212\164\034\031\051\045\127\315\270\323\322\133\006\247\265"
|
||||
"\366\244\012\222\175\272\273\307\144\044\066\261\124\112\270\322"
|
||||
"\001\247\234\225\324\000\007\330\033\121\236\233\367\013\233\303"
|
||||
"\311\200\315\010\104\326\274\004\257\233\267\152\367\214\367\032"
|
||||
"\021\230\307\240\350\164\045\374\345\345\374\045\322\173\333\054"
|
||||
"\005\204\271\171\313\020\064\031\375\006\352\275\324\301\312\114"
|
||||
"\120\265\001\124\371\161\043\071\271\231\136\270\344\143\315\361"
|
||||
"\072\032\246\303\242\074\250\203\153\014\320\315\361\175\251\036"
|
||||
"\277\304\162\115\132\363\362\100\255\322\241\015\120\065\102\363"
|
||||
"\024\367\330\317\210\342\155\055\320\211\337\000\052\310\345\203"
|
||||
"\030\345\265\352\343\132\015\367\120\273\362\216\123\047\367\377"
|
||||
"\130\156\215\051\154\255\045\216\115\116\310\264\331\134\122\132"
|
||||
"\177\130\266\246\346\307\226\067\014\071\076\023\266\226\205\127"
|
||||
"\027\005\334\124\302\045\263\330\276\001\264\021\000\306\112\207"
|
||||
"\077\217\057\104\303\055\362\154\334\334\376\064\275\232\337\265"
|
||||
"\253\122\270\335\274\332\326\333\176\063\321\276\041\366\001\341"
|
||||
"\361\004\263\273\361\054\251\006\330\312\171\056\016\015\265\140"
|
||||
"\173\332\351\334\001\327\024\204\304\345\034\103\371\133\140\171"
|
||||
"\074\002\111\001\357\070\252\311\003\200\064\124\151\051\342\203"
|
||||
"\144\027\000\265\046\302\105\206\132\235\061\130\313\037\206\337"
|
||||
"\354\166\300\062\161\027\051\135\277\216\143\230\106\120\063\147"
|
||||
"\253\362\275\307\302\321\255\075\370\152\164\302\341\114\037\043"
|
||||
"\227\223\140\377\264\071\127\372\324\320\116\104\332\224\200\304"
|
||||
"\131\304\007\226\074\331\073\246\154\300\175\313\226\014\132\362"
|
||||
"\357\101\356\334\024\016\346\130\216\004\226\040\221\165\244\223"
|
||||
"\015\071\034\323\226\166\244\031\376\254\364\246\104\165\223\062"
|
||||
"\045\245\144\253\154\356\016\266\264\005\005\227\012\110\050\017"
|
||||
"\366\262\144\171\055\104\200\175\234\235\061\067\043\300\105\110"
|
||||
"\037\100\220\232\123\236\125\274\047\010\331\300\206\052\335\012"
|
||||
"\316\262\014\103\256\171\333\132\042\023\325\250\131\221\362\203"
|
||||
"\324\054\333\020\307\153\031\340\155\313\174\036\023\202\017\142"
|
||||
"\303\204\115\055\057\106\104\157\152\310\061\256\174\101\036\176"
|
||||
"\324\007\062\216\152\120\276\334\260\124\126\200\274\046\273\141"
|
||||
"\311\307\037\330\307\134\261\270\306\076\272\203\022\310\252\365"
|
||||
"\313\330\110\056\045\027\350\130\301\123\351\023\325\250\322\375"
|
||||
"\244\363\314\276\050\223\174\215\161\171\357\271\007\052\065\102"
|
||||
"\062\151\205\164\272\201\162\352\221\337\316\235\353\124\031\041"
|
||||
"\037\115\204\207\051\234\263\354\171\203\152\144\271\240\362\143"
|
||||
"\121\013\327\010\167\244\123\300\022\235\233\037\240\143\273\261"
|
||||
"\325\061\137\316\357\072\367\331\267\114\102\264\215\134\272\160"
|
||||
"\241\022\353\166\141\023\052\004\110\260\165\251\236\072\256\362"
|
||||
"\344\312\344\170\125\230\056\237\220\251\005\336\255\060\211\105"
|
||||
"\026\200\072\116\104\074\370\300\242\041\125\056\273\356\173\340"
|
||||
"\146\350\357\152\330\105\045\362\174\342\202\371\047\115\356\241"
|
||||
"\233\122\325\366\346\137\132\173\166\246\120\131\171\237\031\147"
|
||||
"\362\304\065\304\040\356\303\146\353\056\322\355\246\155\336\225"
|
||||
"\135\335\344\212\171\010\254\210\002\046\004\012\015\037\270\216"
|
||||
"\110\161\212\203\164\273\322\176\207\205\166\361\157\113\172\261"
|
||||
"\304\230\024\113\117\212\360\310\243\254\104\307\001\173\013\253"
|
||||
"\206\317\037\060\354\223\356\300\146\161\052\100\234\300\175\230"
|
||||
"\224\002\056\217\233\126\045\337\314\111\231\230\074\054\360\146"
|
||||
"\144\341\142\320\023\244\022\307\360\213\023\310\213\101\023\216"
|
||||
"\275\056\245\130\375\320\213\176\177\377\251\222\132\166\312\103"
|
||||
"\117\072\242\152\275\256\033\204\210\126\026\055\343\104\167\362"
|
||||
"\165\132\173\106\245\247\263\000\205\117\353\217\371\307\214\222"
|
||||
"\111\260\301\006\074\356\025\016\152\172\350\227\372\172\055\043"
|
||||
"\007\344\200\325\221\102\227\237\315\367\045\352\220\015\224\355"
|
||||
"\324\303\142\040\227\107\130\264\334\252\076\144\053\224\100\244"
|
||||
"\345\321\074\170\271\317\040\100\152\031\233\201\103\363\015\207"
|
||||
"\232\131\054\124\052\272\350\341\212\116\254\322\307\316\002\165"
|
||||
"\362\146\015\121\352\343\335\266\273\362\020\030\035\243\064\132"
|
||||
"\110\327\003\144\000\167\333\323\272\362\144\127\236\147\057\073"
|
||||
"\061\355\072\123\242\330\300\031\245\107\143\345\142\210\162\020"
|
||||
"\244\237\025\222\265\335\034\066\150\344\000\077\143\145\204\134"
|
||||
"\066\112\166\256\030\245\250\145\374\211\240\105\316\075\005\271"
|
||||
"\221\112\303\272\352\060\133\306\245\102\164\350\007\355\170\233"
|
||||
"\015\157\306\151\156\064\376\120\377\161\263\161\214\132\114\005"
|
||||
"\325\105\215\333\163\073\023\313\314\203\035\132\153\375\263\042"
|
||||
"\265\053\016\335\163\003\075\322\006\176\213\156\234\043\024\377"
|
||||
"\103\102\035\173\057\061\152\015\327\037\250\054\334\303\243\057"
|
||||
"\240\112\002\053\266\146\135\257\347\131\000\013\264\117\235\313"
|
||||
"\351\103\357\361\243\273\161\001\127\032\322\215\377\366\164\340"
|
||||
"\137\310\110\217\242\260\165\347\340\141\241\034\352\217\105\130"
|
||||
"\003\015\341\101\173\142\326\142\075\132\315\302\033\106\164\261"
|
||||
"\212\177\221\240\344\302\137\142\326\115\221\250\052\202\103\057"
|
||||
"\177\352\147\060\244\376\316\130\127\163\076\173\146\302\041\232"
|
||||
"\350\020\266\311\033\271\157\177\121\043\005\062\312\263\262\060"
|
||||
"\075\063\047\023\221\361\020\337\050\042\132\072\247\334\211\176"
|
||||
"\127\050\002\075\374\357\362\114\042\246\244\111\110\017\264\215"
|
||||
"\002\236\114\127\232\267\226\277\377\316\201\317\376\043\243\044"
|
||||
"\070\066\031\155\103\036\071\153\144\125\274\101\036\234\223\327"
|
||||
"\077\351\162\024\241\011\324\241\327\126\161\326\171\025\372\262"
|
||||
"\114\024\037\217\063\131\373\227\256\267\331\315\123\155\244\223"
|
||||
"\127\027\247\371\040\173\232\370\321\014\316\113\041\311\375\155"
|
||||
"\335\035\375\020\166\370\250\045\257\202\362\003\360\227\226\107"
|
||||
"\256\075\100\317\271\333\307\213\347\226\327\011\137\325\167\075"
|
||||
"\362\164\115\150\154\366\215\034\170\200\037\151\027\266\260\306"
|
||||
"\363\360\226\255\314\136\071\263\364\020\275\124\345\064\221\327"
|
||||
"\250\337\100\025\326\315\062\117\115\122\270\145\010\150\054\374"
|
||||
"\131\302\251\045\041\343\331\026\363\226\152\331\313\374\261\164"
|
||||
"\334\361\211\262\277\274\001\015\016\272\163\026\042\237\022\174"
|
||||
"\142\274\242\203\237\173\231\223\022\004\155\336\000\036\122\335"
|
||||
"\020\334\217\317\230\221\335\247\113\120\275\156"
|
||||
#define chk2_z 19
|
||||
#define chk2 ((&data[2639]))
|
||||
"\122\215\215\326\254\156\367\131\245\150\023\100\222\145\033\255"
|
||||
"\221\065\047\012\113\366\232\054\011\157\300"
|
||||
#define msg1_z 65
|
||||
#define msg1 ((&data[2669]))
|
||||
"\372\165\113\114\122\134\050\147\272\275\200\201\317\154\106\232"
|
||||
"\347\373\057\320\014\123\274\261\222\205\223\033\263\362\155\320"
|
||||
"\157\217\077\166\061\374\373\334\033\035\312\163\330\110\036\276"
|
||||
"\065\375\137\264\267\307\216\263\362\023\157\214\324\042\252\153"
|
||||
"\072\341\103\047\276\003\317\212\342\054\301"
|
||||
#define lsto_z 1
|
||||
#define lsto ((&data[2737]))
|
||||
"\166"
|
||||
#define opts_z 1
|
||||
#define opts ((&data[2738]))
|
||||
"\126"
|
||||
#define date_z 1
|
||||
#define date ((&data[2739]))
|
||||
"\006"
|
||||
#define shll_z 10
|
||||
#define shll ((&data[2741]))
|
||||
"\245\120\032\327\074\336\117\215\105\162\100\162"
|
||||
#define tst2_z 19
|
||||
#define tst2 ((&data[2755]))
|
||||
"\161\312\126\130\156\376\051\126\202\366\153\372\216\321\052\312"
|
||||
"\061\263\236\122\364\211\237\304\313\353"
|
||||
#define inlo_z 3
|
||||
#define inlo ((&data[2778]))
|
||||
"\270\246\000"
|
||||
#define xecc_z 15
|
||||
#define xecc ((&data[2784]))
|
||||
"\373\163\175\232\263\074\171\320\261\163\206\331\252\020\227\143"
|
||||
"\020\246\144"
|
||||
#define chk1_z 22
|
||||
#define chk1 ((&data[2805]))
|
||||
"\141\041\203\171\275\321\255\040\267\363\057\347\326\007\040\342"
|
||||
"\271\052\224\344\246\315\077\014\343\011\120\010\037\060"
|
||||
#define pswd_z 256
|
||||
#define pswd ((&data[2882]))
|
||||
"\053\231\150\313\136\064\266\157\122\375\252\122\161\246\305\356"
|
||||
"\012\370\306\226\132\347\031\323\244\041\363\325\333\302\347\007"
|
||||
"\134\117\322\272\204\210\052\326\206\324\050\370\172\355\347\205"
|
||||
"\346\255\034\100\117\237\241\001\377\312\136\172\147\102\271\007"
|
||||
"\154\045\155\221\344\017\240\323\145\152\314\235\103\000\241\031"
|
||||
"\327\250\361\047\110\222\051\107\135\207\302\304\312\173\314\066"
|
||||
"\241\071\310\205\111\150\131\256\323\045\113\027\046\355\060\376"
|
||||
"\226\041\045\336\264\116\046\021\325\350\326\237\143\243\326\005"
|
||||
"\335\236\212\046\007\344\324\333\012\040\362\060\015\043\056\243"
|
||||
"\104\124\202\371\242\250\013\170\221\341\030\364\204\357\372\142"
|
||||
"\216\205\210\226\151\134\161\163\174\144\244\211\207\322\055\314"
|
||||
"\046\257\305\311\127\320\102\350\262\133\335\067\112\327\231\331"
|
||||
"\135\041\157\306\175\341\072\372\105\336\203\314\261\260\230\330"
|
||||
"\140\136\242\267\056\344\240\340\077\176\027\212\126\260\143\263"
|
||||
"\322\323\172\117\264\265\111\371\224\315\306\105\176\137\036\336"
|
||||
"\275\300\226\353\244\067\314\344\265\344\157\014\225\323\277\147"
|
||||
"\246\072\267\133\357\001\125\203\316\034\310\115\173\347\054\070"
|
||||
"\247\302\044\114\372\360\061\257\325\240\273\152\164\173\321\033"
|
||||
"\265\210\166\245\212\314\050\130\350\361\246\143\330\322\234\177"
|
||||
"\224\300\313\216\224\065\024\071"
|
||||
#define msg2_z 19
|
||||
#define msg2 ((&data[3142]))
|
||||
"\120\022\076\170\355\122\230\332\246\007\333\366\215\012\226\304"
|
||||
"\030\062\202"/* End of data[] */;
|
||||
#define hide_z 4096
|
||||
#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */
|
||||
#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */
|
||||
#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */
|
||||
|
||||
/* rtc.c */
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* 'Alleged RC4' */
|
||||
|
||||
static unsigned char stte[256], indx, jndx, kndx;
|
||||
|
||||
/*
|
||||
* Reset arc4 stte.
|
||||
*/
|
||||
void stte_0(void)
|
||||
{
|
||||
indx = jndx = kndx = 0;
|
||||
do {
|
||||
stte[indx] = indx;
|
||||
} while (++indx);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set key. Can be used more than once.
|
||||
*/
|
||||
void key(void * str, int len)
|
||||
{
|
||||
unsigned char tmp, * ptr = (unsigned char *)str;
|
||||
while (len > 0) {
|
||||
do {
|
||||
tmp = stte[indx];
|
||||
kndx += tmp;
|
||||
kndx += ptr[(int)indx % len];
|
||||
stte[indx] = stte[kndx];
|
||||
stte[kndx] = tmp;
|
||||
} while (++indx);
|
||||
ptr += 256;
|
||||
len -= 256;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Crypt data.
|
||||
*/
|
||||
void arc4(void * str, int len)
|
||||
{
|
||||
unsigned char tmp, * ptr = (unsigned char *)str;
|
||||
while (len > 0) {
|
||||
indx++;
|
||||
tmp = stte[indx];
|
||||
jndx += tmp;
|
||||
stte[indx] = stte[jndx];
|
||||
stte[jndx] = tmp;
|
||||
tmp += stte[indx];
|
||||
*ptr ^= stte[tmp];
|
||||
ptr++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
/* End of ARC4 */
|
||||
|
||||
/*
|
||||
* Key with file invariants.
|
||||
*/
|
||||
int key_with_file(char * file)
|
||||
{
|
||||
struct stat statf[1];
|
||||
struct stat control[1];
|
||||
|
||||
if (stat(file, statf) < 0)
|
||||
return -1;
|
||||
|
||||
/* Turn on stable fields */
|
||||
memset(control, 0, sizeof(control));
|
||||
control->st_ino = statf->st_ino;
|
||||
control->st_dev = statf->st_dev;
|
||||
control->st_rdev = statf->st_rdev;
|
||||
control->st_uid = statf->st_uid;
|
||||
control->st_gid = statf->st_gid;
|
||||
control->st_size = statf->st_size;
|
||||
control->st_mtime = statf->st_mtime;
|
||||
control->st_ctime = statf->st_ctime;
|
||||
key(control, sizeof(control));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if DEBUGEXEC
|
||||
void debugexec(char * sh11, int argc, char ** argv)
|
||||
{
|
||||
int i;
|
||||
fprintf(stderr, "shll=%s\n", sh11 ? sh11 : "<null>");
|
||||
fprintf(stderr, "argc=%d\n", argc);
|
||||
if (!argv) {
|
||||
fprintf(stderr, "argv=<null>\n");
|
||||
} else {
|
||||
for (i = 0; i <= argc ; i++)
|
||||
fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : "<null>");
|
||||
}
|
||||
}
|
||||
#endif /* DEBUGEXEC */
|
||||
|
||||
void rmarg(char ** argv, char * arg)
|
||||
{
|
||||
for (; argv && *argv && *argv != arg; argv++);
|
||||
for (; argv && *argv; argv++)
|
||||
*argv = argv[1];
|
||||
}
|
||||
|
||||
void chkenv_end(void);
|
||||
|
||||
int chkenv(int argc)
|
||||
{
|
||||
char buff[512];
|
||||
unsigned long mask, m;
|
||||
int l, a, c;
|
||||
char * string;
|
||||
extern char ** environ;
|
||||
|
||||
mask = (unsigned long)getpid();
|
||||
stte_0();
|
||||
key(&chkenv, (void*)&chkenv_end - (void*)&chkenv);
|
||||
key(&data, sizeof(data));
|
||||
key(&mask, sizeof(mask));
|
||||
arc4(&mask, sizeof(mask));
|
||||
sprintf(buff, "x%lx", mask);
|
||||
string = getenv(buff);
|
||||
#if DEBUGEXEC
|
||||
fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : "<null>");
|
||||
#endif
|
||||
l = strlen(buff);
|
||||
if (!string) {
|
||||
/* 1st */
|
||||
sprintf(&buff[l], "=%lu %d", mask, argc);
|
||||
putenv(strdup(buff));
|
||||
return 0;
|
||||
}
|
||||
c = sscanf(string, "%lu %d%c", &m, &a, buff);
|
||||
if (c == 2 && m == mask) {
|
||||
/* 3rd */
|
||||
rmarg(environ, &string[-l - 1]);
|
||||
return 1 + (argc - a);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void chkenv_end(void){}
|
||||
|
||||
#if !TRACEABLE
|
||||
|
||||
#define _LINUX_SOURCE_COMPAT
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if !defined(PTRACE_ATTACH) && defined(PT_ATTACH)
|
||||
# define PTRACE_ATTACH PT_ATTACH
|
||||
#endif
|
||||
void untraceable(char * argv0)
|
||||
{
|
||||
char proc[80];
|
||||
int pid, mine;
|
||||
|
||||
switch(pid = fork()) {
|
||||
case 0:
|
||||
pid = getppid();
|
||||
/* For problematic SunOS ptrace */
|
||||
#if defined(__FreeBSD__)
|
||||
sprintf(proc, "/proc/%d/mem", (int)pid);
|
||||
#else
|
||||
sprintf(proc, "/proc/%d/as", (int)pid);
|
||||
#endif
|
||||
close(0);
|
||||
mine = !open(proc, O_RDWR|O_EXCL);
|
||||
if (!mine && errno != EBUSY)
|
||||
mine = !ptrace(PTRACE_ATTACH, pid, 0, 0);
|
||||
if (mine) {
|
||||
kill(pid, SIGCONT);
|
||||
} else {
|
||||
perror(argv0);
|
||||
kill(pid, SIGKILL);
|
||||
}
|
||||
_exit(mine);
|
||||
case -1:
|
||||
break;
|
||||
default:
|
||||
if (pid == waitpid(pid, 0, 0))
|
||||
return;
|
||||
}
|
||||
perror(argv0);
|
||||
_exit(1);
|
||||
}
|
||||
#endif /* !TRACEABLE */
|
||||
|
||||
char * xsh(int argc, char ** argv)
|
||||
{
|
||||
char * scrpt;
|
||||
int ret, i, j;
|
||||
char ** varg;
|
||||
char * me = argv[0];
|
||||
if (me == NULL) { me = getenv("_"); }
|
||||
if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); }
|
||||
|
||||
ret = chkenv(argc);
|
||||
stte_0();
|
||||
key(pswd, pswd_z);
|
||||
arc4(msg1, msg1_z);
|
||||
arc4(date, date_z);
|
||||
if (date[0] && (atoll(date)<time(NULL)))
|
||||
return msg1;
|
||||
arc4(shll, shll_z);
|
||||
arc4(inlo, inlo_z);
|
||||
arc4(xecc, xecc_z);
|
||||
arc4(lsto, lsto_z);
|
||||
arc4(tst1, tst1_z);
|
||||
key(tst1, tst1_z);
|
||||
arc4(chk1, chk1_z);
|
||||
if ((chk1_z != tst1_z) || memcmp(tst1, chk1, tst1_z))
|
||||
return tst1;
|
||||
arc4(msg2, msg2_z);
|
||||
if (ret < 0)
|
||||
return msg2;
|
||||
varg = (char **)calloc(argc + 10, sizeof(char *));
|
||||
if (!varg)
|
||||
return 0;
|
||||
if (ret) {
|
||||
arc4(rlax, rlax_z);
|
||||
if (!rlax[0] && key_with_file(shll))
|
||||
return shll;
|
||||
arc4(opts, opts_z);
|
||||
arc4(text, text_z);
|
||||
arc4(tst2, tst2_z);
|
||||
key(tst2, tst2_z);
|
||||
arc4(chk2, chk2_z);
|
||||
if ((chk2_z != tst2_z) || memcmp(tst2, chk2, tst2_z))
|
||||
return tst2;
|
||||
/* Prepend hide_z spaces to script text to hide it. */
|
||||
scrpt = malloc(hide_z + text_z);
|
||||
if (!scrpt)
|
||||
return 0;
|
||||
memset(scrpt, (int) ' ', hide_z);
|
||||
memcpy(&scrpt[hide_z], text, text_z);
|
||||
} else { /* Reexecute */
|
||||
if (*xecc) {
|
||||
scrpt = malloc(512);
|
||||
if (!scrpt)
|
||||
return 0;
|
||||
sprintf(scrpt, xecc, me);
|
||||
} else {
|
||||
scrpt = me;
|
||||
}
|
||||
}
|
||||
j = 0;
|
||||
#if BUSYBOXON
|
||||
varg[j++] = "busybox";
|
||||
varg[j++] = "sh";
|
||||
#else
|
||||
varg[j++] = argv[0]; /* My own name at execution */
|
||||
#endif
|
||||
if (ret && *opts)
|
||||
varg[j++] = opts; /* Options on 1st line of code */
|
||||
if (*inlo)
|
||||
varg[j++] = inlo; /* Option introducing inline code */
|
||||
varg[j++] = scrpt; /* The script itself */
|
||||
if (*lsto)
|
||||
varg[j++] = lsto; /* Option meaning last option */
|
||||
i = (ret > 1) ? ret : 0; /* Args numbering correction */
|
||||
while (i < argc)
|
||||
varg[j++] = argv[i++]; /* Main run-time arguments */
|
||||
varg[j] = 0; /* NULL terminated array */
|
||||
#if DEBUGEXEC
|
||||
debugexec(shll, j, varg);
|
||||
#endif
|
||||
execvp(shll, varg);
|
||||
return shll;
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
#if DEBUGEXEC
|
||||
debugexec("main", argc, argv);
|
||||
#endif
|
||||
#if !TRACEABLE
|
||||
untraceable(argv[0]);
|
||||
#endif
|
||||
argv[1] = xsh(argc, argv);
|
||||
fprintf(stderr, "%s%s%s: %s\n", argv[0],
|
||||
errno ? ": " : "",
|
||||
errno ? strerror(errno) : "",
|
||||
argv[1] ? argv[1] : "<null>"
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
534
tool/ss-feedback/sender-d_x86_64.sh.c
Normal file
534
tool/ss-feedback/sender-d_x86_64.sh.c
Normal file
@@ -0,0 +1,534 @@
|
||||
#if 0
|
||||
shc Version 3.9.6, Generic Shell Script Compiler
|
||||
GNU GPL Version 3 Md Jahidul Hamid <jahidulhamid@yahoo.com>
|
||||
|
||||
shc -f sender-d.sh
|
||||
#endif
|
||||
|
||||
static char data [] =
|
||||
#define chk1_z 22
|
||||
#define chk1 ((&data[5]))
|
||||
"\250\277\114\224\251\153\106\010\262\300\062\112\153\256\366\036"
|
||||
"\106\002\145\140\125\310\174\373\152\251\071\211\003"
|
||||
#define opts_z 1
|
||||
#define opts ((&data[29]))
|
||||
"\207"
|
||||
#define text_z 1976
|
||||
#define text ((&data[168]))
|
||||
"\255\305\314\313\244\163\366\103\251\145\024\020\016\143\035\240"
|
||||
"\140\167\110\037\304\334\311\115\340\210\347\130\122\057\302\000"
|
||||
"\364\216\314\231\002\302\335\254\050\361\275\066\124\332\326\265"
|
||||
"\121\037\324\026\374\236\143\334\047\113\065\172\173\367\172\157"
|
||||
"\206\106\011\211\011\346\065\061\327\362\147\054\315\076\341\036"
|
||||
"\135\266\065\131\124\231\066\173\344\153\365\137\143\160\317\351"
|
||||
"\267\330\163\300\277\250\362\226\233\132\302\150\230\243\207\366"
|
||||
"\132\274\117\256\125\206\052\072\362\040\232\126\220\152\100\107"
|
||||
"\103\263\010\002\134\372\231\367\124\133\315\150\163\215\252\312"
|
||||
"\233\275\011\023\315\117\350\323\224\073\252\215\223\362\271\173"
|
||||
"\022\335\241\117\356\214\176\107\050\116\011\237\072\375\065\301"
|
||||
"\226\134\050\061\242\226\337\312\204\223\345\135\161\370\041\162"
|
||||
"\345\331\355\073\260\040\227\303\065\264\036\254\326\211\162\135"
|
||||
"\277\270\325\243\136\252\235\042\242\323\311\057\372\324\252\270"
|
||||
"\026\017\115\067\311\277\277\050\010\210\071\230\035\227\066\244"
|
||||
"\073\047\165\266\347\220\237\114\215\136\115\131\103\262\225\242"
|
||||
"\103\007\105\014\240\212\216\256\252\372\302\267\134\205\313\220"
|
||||
"\045\300\113\166\143\072\255\277\377\056\136\140\131\273\162\177"
|
||||
"\303\320\343\040\223\323\302\115\377\122\231\045\132\240\304\332"
|
||||
"\350\116\271\364\275\002\336\310\324\271\044\131\372\262\217\211"
|
||||
"\062\122\177\071\160\301\114\356\234\253\356\274\307\363\140\072"
|
||||
"\316\136\310\175\100\267\361\016\056\376\332\155\207\104\354\034"
|
||||
"\235\170\340\214\027\141\365\077\302\237\333\341\301\003\070\360"
|
||||
"\052\361\310\107\261\140\255\043\001\363\026\021\027\323\367\117"
|
||||
"\251\176\021\030\257\332\344\220\156\117\036\301\003\077\176\375"
|
||||
"\231\046\060\121\111\223\227\031\231\270\140\132\315\135\157\120"
|
||||
"\325\326\244\326\163\044\251\127\103\233\352\060\063\034\012\336"
|
||||
"\365\033\026\277\143\227\037\104\312\122\334\322\133\226\004\255"
|
||||
"\270\271\130\177\045\253\054\343\265\074\177\173\033\351\025\026"
|
||||
"\141\131\334\277\311\054\252\105\321\333\351\351\023\171\053\213"
|
||||
"\112\260\211\010\304\055\246\110\310\355\067\304\014\143\303\076"
|
||||
"\235\047\344\324\027\071\127\014\232\050\167\152\317\005\206\305"
|
||||
"\013\022\101\231\376\371\216\104\134\241\045\216\314\144\357\202"
|
||||
"\261\074\017\321\170\211\026\371\324\110\033\267\216\365\205\271"
|
||||
"\264\055\367\312\223\013\044\330\255\071\332\154\375\173\233\322"
|
||||
"\355\362\165\151\232\035\164\063\324\135\357\071\231\210\045\100"
|
||||
"\052\373\030\240\051\270\044\055\337\202\224\140\064\171\153\066"
|
||||
"\354\000\374\221\144\336\052\147\250\244\164\075\041\241\130\250"
|
||||
"\274\325\135\255\345\100\362\241\131\017\237\002\325\225\334\366"
|
||||
"\366\336\231\202\073\126\240\155\026\203\375\166\350\317\072\172"
|
||||
"\052\153\062\036\370\143\236\367\173\073\357\244\214\112\300\073"
|
||||
"\272\322\022\332\350\111\372\071\322\371\325\072\055\152\015\120"
|
||||
"\162\015\065\217\316\234\240\213\021\255\374\102\200\216\360\142"
|
||||
"\320\221\044\146\041\113\022\131\033\337\361\007\347\054\101\205"
|
||||
"\156\061\345\027\325\163\223\320\133\043\256\264\351\166\173\203"
|
||||
"\111\104\056\107\040\302\335\244\232\241\067\122\150\353\125\361"
|
||||
"\046\176\303\312\063\264\045\073\165\133\346\150\335\326\145\161"
|
||||
"\205\041\056\011\070\132\265\325\070\130\173\020\353\260\346\320"
|
||||
"\121\364\275\070\270\361\372\007\234\177\135\211\000\303\316\004"
|
||||
"\235\056\254\244\146\300\160\260\003\264\062\350\227\144\013\176"
|
||||
"\274\051\107\050\222\203\145\154\310\071\205\035\170\337\174\203"
|
||||
"\255\022\062\334\104\025\152\164\175\216\004\356\004\072\054\124"
|
||||
"\247\345\035\026\364\200\003\254\172\011\202\226\364\327\360\204"
|
||||
"\274\002\036\152\127\171\235\150\056\115\316\265\274\364\053\343"
|
||||
"\021\025\122\026\255\326\127\154\212\235\244\247\234\212\304\321"
|
||||
"\000\222\262\000\113\146\047\140\027\255\207\360\136\350\200\017"
|
||||
"\062\262\250\345\276\323\314\313\204\221\333\024\157\277\010\074"
|
||||
"\107\266\370\002\143\354\073\326\261\244\027\202\165\127\042\012"
|
||||
"\170\065\262\152\012\157\262\020\246\063\342\163\014\322\254\053"
|
||||
"\013\054\156\073\236\264\134\260\261\075\215\005\361\071\260\372"
|
||||
"\276\372\111\233\100\304\116\053\203\107\124\167\051\316\351\045"
|
||||
"\165\101\144\144\126\363\215\021\310\044\133\302\227\112\254\356"
|
||||
"\103\004\367\271\335\317\277\333\070\013\035\035\116\256\055\275"
|
||||
"\324\006\356\357\020\144\013\200\261\137\170\005\060\007\333\025"
|
||||
"\261\356\271\024\205\202\033\110\106\377\305\201\353\135\161\007"
|
||||
"\125\360\345\055\005\244\272\172\016\053\273\101\120\234\336\334"
|
||||
"\163\002\216\163\110\306\104\007\037\204\260\063\370\146\271\002"
|
||||
"\366\275\161\371\203\050\241\374\333\133\254\224\320\005\160\246"
|
||||
"\147\100\254\013\314\215\072\003\373\361\144\236\265\114\365\103"
|
||||
"\031\044\120\010\320\370\231\263\071\264\073\073\131\100\165\351"
|
||||
"\202\277\357\372\142\322\113\274\260\336\127\024\133\223\375\345"
|
||||
"\007\323\116\017\322\021\072\162\034\102\214\161\321\346\200\154"
|
||||
"\356\044\225\233\023\370\057\001\076\073\167\046\376\332\326\215"
|
||||
"\156\373\064\176\376\202\125\112\000\022\346\167\352\034\076\221"
|
||||
"\071\105\300\223\101\151\170\120\033\357\210\117\136\377\070\257"
|
||||
"\056\075\174\203\360\052\140\370\326\317\260\134\116\355\322\014"
|
||||
"\045\204\171\067\217\377\304\127\146\244\263\262\167\334\140\174"
|
||||
"\154\057\141\157\340\327\006\162\214\244\102\111\002\074\326\127"
|
||||
"\325\201\270\260\263\046\240\235\203\202\263\315\072\120\136\307"
|
||||
"\167\102\275\074\003\267\200\170\110\312\352\354\115\124\166\055"
|
||||
"\240\051\047\304\117\224\215\163\126\022\224\374\140\246\065\264"
|
||||
"\155\215\153\036\246\176\032\334\040\331\012\174\011\212\363\255"
|
||||
"\063\066\032\204\264\376\337\030\113\001\325\135\226\156\176\056"
|
||||
"\334\214\320\210\356\370\377\242\355\341\071\327\034\252\224\170"
|
||||
"\030\201\367\062\100\030\307\133\173\160\133\233\020\114\050\344"
|
||||
"\300\134\242\352\162\061\251\132\372\251\100\034\061\122\201\261"
|
||||
"\322\364\031\174\132\026\036\073\311\061\302\335\114\121\375\270"
|
||||
"\236\107\357\174\323\237\362\055\145\223\233\075\111\161\321\226"
|
||||
"\302\256\265\150\261\246\175\162\276\124\021\246\041\237\064\074"
|
||||
"\234\103\376\124\156\246\121\151\141\360\221\176\356\377\134\272"
|
||||
"\137\242\236\365\240\163\143\261\357\210\263\001\356\213\310\204"
|
||||
"\355\325\214\305\042\041\322\130\314\062\017\106\244\235\034\237"
|
||||
"\051\072\117\043\164\250\233\151\262\123\037\113\247\302\052\267"
|
||||
"\360\375\376\102\327\002\236\026\311\275\242\170\064\252\013\303"
|
||||
"\271\122\112\113\145\201\154\277\172\137\333\026\122\224\144\371"
|
||||
"\232\233\067\126\237\230\011\303\177\374\165\242\010\066\301\371"
|
||||
"\171\012\273\216\366\156\304\221\031\326\351\061\004\343\350\155"
|
||||
"\107\306\012\074\374\370\323\115\016\043\343\276\157\257\304\070"
|
||||
"\242\221\342\206\324\125\325\230\016\117\143\161\205\016\172\056"
|
||||
"\174\247\144\343\333\031\250\351\137\215\263\102\112\330\314\322"
|
||||
"\070\050\013\202\022\272\171\351\022\330\324\311\274\201\173\131"
|
||||
"\352\375\116\300\373\362\245\222\033\037\232\015\244\311\260\314"
|
||||
"\035\030\064\356\023\320\026\315\361\141\175\062\276\053\057\007"
|
||||
"\222\212\130\000\233\302\313\162\316\054\301\223\352\321\056\065"
|
||||
"\064\251\057\342\072\171\142\036\314\217\121\303\240\035\311\247"
|
||||
"\066\173\176\100\031\171\276\215\272\206\026\351\102\355\177\376"
|
||||
"\006\004\217\030\111\137\220\344\153\210\157\173\100\234\035\340"
|
||||
"\225\331\265\257\061\324\036\133\276\013\176\162\144\314\305\342"
|
||||
"\066\115\016\222\332\102\342\366\126\361\255\375\031\324\050\152"
|
||||
"\065\120\355\351\336\312\301\302\231\047\123\253\155\044\123\306"
|
||||
"\226\222\347\315\272\032\025\302\174\031\302\305\102\373\131\372"
|
||||
"\040\176\201\357\172\161\233\007\362\373\174\106\247\272\115\166"
|
||||
"\011\104\331\233\331\011\105\342\054\014\071\173\142\321\326\262"
|
||||
"\023\342\036\171\077\310\310\337\157\277\326\100\215\141\053\110"
|
||||
"\307\063\146\140\055\107\374\116\337\142\130\226\336\232\311\246"
|
||||
"\241\314\147\077\166\277\332\106\066\367\315\143\024\076\061\061"
|
||||
"\261\326\221\342\254\224\207\046\102\211\230\253\060\030\132\273"
|
||||
"\313\366\313\071\133\140\245\125\013\052\217\063\376\061\262\175"
|
||||
"\125\112\222\147\016\276\002\316\061\205\052\157\166\360\163\145"
|
||||
"\333\325\335\100\117\041\114\107\370\257\104\364\144\224\102\124"
|
||||
"\247\050\041\260\240\015\370\206\140\255\072\202\267\004\133\010"
|
||||
"\001\103\275\010\104\202\103\122\270\267\360\074\261\054\301\043"
|
||||
"\352\105\237\340\155\143\311\224\144\242\360\134\071\324\162\172"
|
||||
"\353\220\006\374\005\064\250\172\143\027\275\266\002\354\327\164"
|
||||
"\322\020\267\340\352\135\112\115\114\241\077\231\367\306\115\117"
|
||||
"\251\071\172\066\347\377\016\203\110\233\314\205\341\321\322\076"
|
||||
"\314\236\336\341\033\305\214\015\067\123\357\325\016\334\175\251"
|
||||
"\074\376\062\331\370\332\277\017\072\257\045\116\044\037\320\271"
|
||||
"\126\270\162\125\137\144\126\135\045\242\126\131\175\060\363\235"
|
||||
"\364\007\306\175\274\324\065\241\213\377\016\170\350\223\037\114"
|
||||
"\051\273\100\365\310\362\244\207\201\140\365\350\305\356\316\362"
|
||||
"\122\016\242\304\332\073\312\174\373\042\343\117\266\073\200\043"
|
||||
"\116\244\140\355\377\350\343\132\244\063\010\372\271\063\065\254"
|
||||
"\123\317\002\344\071\102\054\175\365\064\177\121\057\030\111\204"
|
||||
"\164\252\161\164\222\124\316\066\210\327\061\101\012\146\356\136"
|
||||
"\065\360\102\157\062\156\354\050\243\154\172\323\204\304\127\371"
|
||||
"\156\311\156\000\036\075\067\246\025\150\350\037\316\326\176\004"
|
||||
"\306\300\164\371\057\141\042\323\315\235\246\122\141\376\114\317"
|
||||
"\307\272\317\345\367\006\213\014\157\164\054\076\112\253\103\021"
|
||||
"\154\267\012\233\030\055\157\346\312\025\070\053\024\204\373\333"
|
||||
"\076\312\301\066\321\115\103\101\301\160\177\013\033\302\034\207"
|
||||
"\171\047\043\222\125\222\170\037\250\260\113\274\065\106\230\164"
|
||||
"\021\131\252\343\246\356\044\147\136\243\163\171\146\220\001\340"
|
||||
"\270\044\163\015\267\353\054\137\234\170\033\321\277\263\105\320"
|
||||
"\015\360\264\264\336\330\033\075\174\217\266\343\037\270\303"
|
||||
#define tst2_z 19
|
||||
#define tst2 ((&data[2353]))
|
||||
"\345\223\042\022\357\241\112\354\260\222\102\167\252\056\120\014"
|
||||
"\076\214\307\026\157\130\244\363"
|
||||
#define chk2_z 19
|
||||
#define chk2 ((&data[2375]))
|
||||
"\220\111\122\133\224\270\135\156\155\316\001\121\000\005\210\301"
|
||||
"\344\112\207\200\252"
|
||||
#define pswd_z 256
|
||||
#define pswd ((&data[2448]))
|
||||
"\320\307\316\204\246\247\240\343\044\060\232\007\117\122\312\047"
|
||||
"\056\001\014\302\043\036\265\342\251\304\163\362\207\111\015\130"
|
||||
"\021\333\334\267\203\175\232\247\255\064\256\375\206\171\045\265"
|
||||
"\172\062\170\235\121\055\146\272\255\036\204\154\131\010\212\014"
|
||||
"\021\104\302\357\201\202\015\133\347\257\236\056\376\011\324\351"
|
||||
"\150\047\105\305\016\254\200\274\313\005\050\044\015\263\061\037"
|
||||
"\367\363\016\171\165\033\324\135\313\163\214\312\174\141\263\345"
|
||||
"\211\371\252\227\246\053\124\161\061\174\226\077\060\307\136\047"
|
||||
"\273\154\241\061\210\165\217\124\351\034\036\146\175\322\113\006"
|
||||
"\313\366\236\161\042\362\343\123\157\171\222\237\100\360\306\374"
|
||||
"\135\147\055\346\335\274\072\307\331\131\055\126\053\170\134\367"
|
||||
"\157\373\150\221\355\114\344\134\305\166\373\006\146\302\002\304"
|
||||
"\052\060\252\010\355\345\317\306\076\374\034\151\165\171\140\344"
|
||||
"\164\311\165\142\025\131\276\333\317\272\341\066\175\344\372\247"
|
||||
"\025\245\257\002\212\177\310\310\173\345\062\360\137\223\324\324"
|
||||
"\134\111\066\162\243\365\115\162\260\057\251\055\023\244\324\050"
|
||||
"\111\204\053\324\003\364\235\177\331\317\157\071\142\104\015\277"
|
||||
"\216\104\061\061\071\176\244\351\256\116\026\301\362\353\352\074"
|
||||
"\157\025\020\163\012\255\362\344\175\142\035\337\247\053\236\065"
|
||||
"\157\320\147\250\117\014\177\372\362\363\355\172"
|
||||
#define shll_z 10
|
||||
#define shll ((&data[2712]))
|
||||
"\116\326\177\257\317\335\162\123\050\324\344\244\257\005"
|
||||
#define xecc_z 15
|
||||
#define xecc ((&data[2724]))
|
||||
"\312\105\336\014\160\351\140\311\301\063\375\121\331\242\037\000"
|
||||
"\331"
|
||||
#define msg1_z 65
|
||||
#define msg1 ((&data[2752]))
|
||||
"\134\050\374\022\242\056\212\100\177\270\300\246\373\100\315\245"
|
||||
"\164\205\022\167\263\367\065\001\253\244\304\177\247\306\023\242"
|
||||
"\210\302\371\325\060\023\104\341\145\324\350\321\153\167\015\367"
|
||||
"\052\260\264\020\041\120\320\077\164\240\162\015\216\162\162\060"
|
||||
"\262\165\235\351\005\042\055\331\327\317\061\134\171\252\263\147"
|
||||
"\044\360\141\367\077\070\246\105\222\323"
|
||||
#define date_z 1
|
||||
#define date ((&data[2831]))
|
||||
"\337"
|
||||
#define rlax_z 1
|
||||
#define rlax ((&data[2832]))
|
||||
"\117"
|
||||
#define inlo_z 3
|
||||
#define inlo ((&data[2833]))
|
||||
"\356\063\363"
|
||||
#define lsto_z 1
|
||||
#define lsto ((&data[2836]))
|
||||
"\307"
|
||||
#define tst1_z 22
|
||||
#define tst1 ((&data[2838]))
|
||||
"\154\343\141\256\045\147\355\072\031\127\273\063\274\063\151\005"
|
||||
"\245\312\202\350\203\025\003\017"
|
||||
#define msg2_z 19
|
||||
#define msg2 ((&data[2861]))
|
||||
"\125\166\060\370\333\360\072\122\317\063\176\252\305\345\310\253"
|
||||
"\031\367\354\017\073\264"/* End of data[] */;
|
||||
#define hide_z 4096
|
||||
#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */
|
||||
#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */
|
||||
#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */
|
||||
|
||||
/* rtc.c */
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* 'Alleged RC4' */
|
||||
|
||||
static unsigned char stte[256], indx, jndx, kndx;
|
||||
|
||||
/*
|
||||
* Reset arc4 stte.
|
||||
*/
|
||||
void stte_0(void)
|
||||
{
|
||||
indx = jndx = kndx = 0;
|
||||
do {
|
||||
stte[indx] = indx;
|
||||
} while (++indx);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set key. Can be used more than once.
|
||||
*/
|
||||
void key(void * str, int len)
|
||||
{
|
||||
unsigned char tmp, * ptr = (unsigned char *)str;
|
||||
while (len > 0) {
|
||||
do {
|
||||
tmp = stte[indx];
|
||||
kndx += tmp;
|
||||
kndx += ptr[(int)indx % len];
|
||||
stte[indx] = stte[kndx];
|
||||
stte[kndx] = tmp;
|
||||
} while (++indx);
|
||||
ptr += 256;
|
||||
len -= 256;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Crypt data.
|
||||
*/
|
||||
void arc4(void * str, int len)
|
||||
{
|
||||
unsigned char tmp, * ptr = (unsigned char *)str;
|
||||
while (len > 0) {
|
||||
indx++;
|
||||
tmp = stte[indx];
|
||||
jndx += tmp;
|
||||
stte[indx] = stte[jndx];
|
||||
stte[jndx] = tmp;
|
||||
tmp += stte[indx];
|
||||
*ptr ^= stte[tmp];
|
||||
ptr++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
/* End of ARC4 */
|
||||
|
||||
/*
|
||||
* Key with file invariants.
|
||||
*/
|
||||
int key_with_file(char * file)
|
||||
{
|
||||
struct stat statf[1];
|
||||
struct stat control[1];
|
||||
|
||||
if (stat(file, statf) < 0)
|
||||
return -1;
|
||||
|
||||
/* Turn on stable fields */
|
||||
memset(control, 0, sizeof(control));
|
||||
control->st_ino = statf->st_ino;
|
||||
control->st_dev = statf->st_dev;
|
||||
control->st_rdev = statf->st_rdev;
|
||||
control->st_uid = statf->st_uid;
|
||||
control->st_gid = statf->st_gid;
|
||||
control->st_size = statf->st_size;
|
||||
control->st_mtime = statf->st_mtime;
|
||||
control->st_ctime = statf->st_ctime;
|
||||
key(control, sizeof(control));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if DEBUGEXEC
|
||||
void debugexec(char * sh11, int argc, char ** argv)
|
||||
{
|
||||
int i;
|
||||
fprintf(stderr, "shll=%s\n", sh11 ? sh11 : "<null>");
|
||||
fprintf(stderr, "argc=%d\n", argc);
|
||||
if (!argv) {
|
||||
fprintf(stderr, "argv=<null>\n");
|
||||
} else {
|
||||
for (i = 0; i <= argc ; i++)
|
||||
fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : "<null>");
|
||||
}
|
||||
}
|
||||
#endif /* DEBUGEXEC */
|
||||
|
||||
void rmarg(char ** argv, char * arg)
|
||||
{
|
||||
for (; argv && *argv && *argv != arg; argv++);
|
||||
for (; argv && *argv; argv++)
|
||||
*argv = argv[1];
|
||||
}
|
||||
|
||||
void chkenv_end(void);
|
||||
|
||||
int chkenv(int argc)
|
||||
{
|
||||
char buff[512];
|
||||
unsigned long mask, m;
|
||||
int l, a, c;
|
||||
char * string;
|
||||
extern char ** environ;
|
||||
|
||||
mask = (unsigned long)getpid();
|
||||
stte_0();
|
||||
key(&chkenv, (void*)&chkenv_end - (void*)&chkenv);
|
||||
key(&data, sizeof(data));
|
||||
key(&mask, sizeof(mask));
|
||||
arc4(&mask, sizeof(mask));
|
||||
sprintf(buff, "x%lx", mask);
|
||||
string = getenv(buff);
|
||||
#if DEBUGEXEC
|
||||
fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : "<null>");
|
||||
#endif
|
||||
l = strlen(buff);
|
||||
if (!string) {
|
||||
/* 1st */
|
||||
sprintf(&buff[l], "=%lu %d", mask, argc);
|
||||
putenv(strdup(buff));
|
||||
return 0;
|
||||
}
|
||||
c = sscanf(string, "%lu %d%c", &m, &a, buff);
|
||||
if (c == 2 && m == mask) {
|
||||
/* 3rd */
|
||||
rmarg(environ, &string[-l - 1]);
|
||||
return 1 + (argc - a);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void chkenv_end(void){}
|
||||
|
||||
#if !TRACEABLE
|
||||
|
||||
#define _LINUX_SOURCE_COMPAT
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if !defined(PTRACE_ATTACH) && defined(PT_ATTACH)
|
||||
# define PTRACE_ATTACH PT_ATTACH
|
||||
#endif
|
||||
void untraceable(char * argv0)
|
||||
{
|
||||
char proc[80];
|
||||
int pid, mine;
|
||||
|
||||
switch(pid = fork()) {
|
||||
case 0:
|
||||
pid = getppid();
|
||||
/* For problematic SunOS ptrace */
|
||||
#if defined(__FreeBSD__)
|
||||
sprintf(proc, "/proc/%d/mem", (int)pid);
|
||||
#else
|
||||
sprintf(proc, "/proc/%d/as", (int)pid);
|
||||
#endif
|
||||
close(0);
|
||||
mine = !open(proc, O_RDWR|O_EXCL);
|
||||
if (!mine && errno != EBUSY)
|
||||
mine = !ptrace(PTRACE_ATTACH, pid, 0, 0);
|
||||
if (mine) {
|
||||
kill(pid, SIGCONT);
|
||||
} else {
|
||||
perror(argv0);
|
||||
kill(pid, SIGKILL);
|
||||
}
|
||||
_exit(mine);
|
||||
case -1:
|
||||
break;
|
||||
default:
|
||||
if (pid == waitpid(pid, 0, 0))
|
||||
return;
|
||||
}
|
||||
perror(argv0);
|
||||
_exit(1);
|
||||
}
|
||||
#endif /* !TRACEABLE */
|
||||
|
||||
char * xsh(int argc, char ** argv)
|
||||
{
|
||||
char * scrpt;
|
||||
int ret, i, j;
|
||||
char ** varg;
|
||||
char * me = argv[0];
|
||||
if (me == NULL) { me = getenv("_"); }
|
||||
if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); }
|
||||
|
||||
ret = chkenv(argc);
|
||||
stte_0();
|
||||
key(pswd, pswd_z);
|
||||
arc4(msg1, msg1_z);
|
||||
arc4(date, date_z);
|
||||
if (date[0] && (atoll(date)<time(NULL)))
|
||||
return msg1;
|
||||
arc4(shll, shll_z);
|
||||
arc4(inlo, inlo_z);
|
||||
arc4(xecc, xecc_z);
|
||||
arc4(lsto, lsto_z);
|
||||
arc4(tst1, tst1_z);
|
||||
key(tst1, tst1_z);
|
||||
arc4(chk1, chk1_z);
|
||||
if ((chk1_z != tst1_z) || memcmp(tst1, chk1, tst1_z))
|
||||
return tst1;
|
||||
arc4(msg2, msg2_z);
|
||||
if (ret < 0)
|
||||
return msg2;
|
||||
varg = (char **)calloc(argc + 10, sizeof(char *));
|
||||
if (!varg)
|
||||
return 0;
|
||||
if (ret) {
|
||||
arc4(rlax, rlax_z);
|
||||
if (!rlax[0] && key_with_file(shll))
|
||||
return shll;
|
||||
arc4(opts, opts_z);
|
||||
arc4(text, text_z);
|
||||
arc4(tst2, tst2_z);
|
||||
key(tst2, tst2_z);
|
||||
arc4(chk2, chk2_z);
|
||||
if ((chk2_z != tst2_z) || memcmp(tst2, chk2, tst2_z))
|
||||
return tst2;
|
||||
/* Prepend hide_z spaces to script text to hide it. */
|
||||
scrpt = malloc(hide_z + text_z);
|
||||
if (!scrpt)
|
||||
return 0;
|
||||
memset(scrpt, (int) ' ', hide_z);
|
||||
memcpy(&scrpt[hide_z], text, text_z);
|
||||
} else { /* Reexecute */
|
||||
if (*xecc) {
|
||||
scrpt = malloc(512);
|
||||
if (!scrpt)
|
||||
return 0;
|
||||
sprintf(scrpt, xecc, me);
|
||||
} else {
|
||||
scrpt = me;
|
||||
}
|
||||
}
|
||||
j = 0;
|
||||
#if BUSYBOXON
|
||||
varg[j++] = "busybox";
|
||||
varg[j++] = "sh";
|
||||
#else
|
||||
varg[j++] = argv[0]; /* My own name at execution */
|
||||
#endif
|
||||
if (ret && *opts)
|
||||
varg[j++] = opts; /* Options on 1st line of code */
|
||||
if (*inlo)
|
||||
varg[j++] = inlo; /* Option introducing inline code */
|
||||
varg[j++] = scrpt; /* The script itself */
|
||||
if (*lsto)
|
||||
varg[j++] = lsto; /* Option meaning last option */
|
||||
i = (ret > 1) ? ret : 0; /* Args numbering correction */
|
||||
while (i < argc)
|
||||
varg[j++] = argv[i++]; /* Main run-time arguments */
|
||||
varg[j] = 0; /* NULL terminated array */
|
||||
#if DEBUGEXEC
|
||||
debugexec(shll, j, varg);
|
||||
#endif
|
||||
execvp(shll, varg);
|
||||
return shll;
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
#if DEBUGEXEC
|
||||
debugexec("main", argc, argv);
|
||||
#endif
|
||||
#if !TRACEABLE
|
||||
untraceable(argv[0]);
|
||||
#endif
|
||||
argv[1] = xsh(argc, argv);
|
||||
fprintf(stderr, "%s%s%s: %s\n", argv[0],
|
||||
errno ? ": " : "",
|
||||
errno ? strerror(errno) : "",
|
||||
argv[1] ? argv[1] : "<null>"
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
44
tool/ssaudit
Executable file
44
tool/ssaudit
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "Spark Store Audit script.星火商店审核脚本"
|
||||
|
||||
|
||||
#################检测文件是否存在
|
||||
if [ $# -eq 0 ];then
|
||||
echo "没有接收到参数,退出"
|
||||
echo "用法:$0 deb路径"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ ! -f "$1" ]
|
||||
then
|
||||
echo "文件不存在"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != "0" ];then
|
||||
#############################无root权限时
|
||||
echo "请使用root启动ssaudit"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
###
|
||||
|
||||
|
||||
DEBPATH=`realpath $1`
|
||||
|
||||
echo ----------------------------------------------------------------------------------
|
||||
try_run_output=$(aptss --dry-run install $DEBPATH)
|
||||
try_run_ret="$?"
|
||||
|
||||
if [ "$try_run_ret" -ne 0 ]
|
||||
then
|
||||
echo "Package manager quit with exit code.Here is the log"
|
||||
echo "包管理器以错误代码退出.日志如下"
|
||||
echo
|
||||
echo -e "${try_run_output}"
|
||||
exit "$try_run_ret"
|
||||
fi
|
||||
dpkg -i "$DEBPATH" || aptss install -yf
|
||||
|
||||
|
||||
@@ -1,33 +1,43 @@
|
||||
#!/bin/bash
|
||||
|
||||
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
||||
load_transhell_debug
|
||||
|
||||
case `arch` in
|
||||
x86_64)
|
||||
STORE_URL="store"
|
||||
;;
|
||||
aarch64)
|
||||
STORE_URL="aarch64-store"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
|
||||
|
||||
echo "Spark Store Install script.星火商店安装脚本"
|
||||
|
||||
function pkexec_as_current_user() {
|
||||
#Detect the name of the display in use
|
||||
local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
|
||||
|
||||
#Detect the user using such display
|
||||
local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1)
|
||||
|
||||
#Detect the id of the user
|
||||
local uid=$(id -u $user)
|
||||
|
||||
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus pkexec "$@"
|
||||
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus pkexec "$@"
|
||||
}
|
||||
|
||||
function zenity() {
|
||||
#Detect the name of the display in use
|
||||
local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
|
||||
function zenity()
|
||||
{
|
||||
|
||||
|
||||
#Detect the user using such display
|
||||
local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1)
|
||||
local user=$(who | awk '{print $1}' | head -n 1)
|
||||
|
||||
#Detect the id of the user
|
||||
local uid=$(id -u $user)
|
||||
|
||||
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus zenity "$@"
|
||||
}
|
||||
|
||||
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus zenity "$@"
|
||||
}
|
||||
#################检测文件是否存在
|
||||
if [ $# -eq 0 ];then
|
||||
echo "没有接收到参数,退出"
|
||||
@@ -37,13 +47,13 @@ fi
|
||||
|
||||
if [ ! -f "$1" ]
|
||||
then
|
||||
echo "文件不存在"
|
||||
echo "${TRANSHELL_CONTENT_FILE_NOT_EXIST}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != "0" ];then
|
||||
#############################无root权限时
|
||||
echo "请使用root启动ssinstall"
|
||||
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -52,32 +62,56 @@ fi
|
||||
|
||||
DEBPATH=`realpath $1`
|
||||
|
||||
if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ];then
|
||||
if [ ! -e "/var/lib/apt/lists/d.spark-app.store_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/apt/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages" ];then
|
||||
echo "接收星火仓库软件信息中..."
|
||||
aptss ssupdate
|
||||
fi
|
||||
|
||||
### 选择包信息位置
|
||||
|
||||
if [ -e "/var/lib/apt/lists/d.spark-app.store_${STORE_URL}_Packages" ];then
|
||||
PACKAGES_DATA_PATH="/var/lib/apt/lists/d.spark-app.store_${STORE_URL}_Packages"
|
||||
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH,是星火域名单目录仓库配置"
|
||||
elif [ -e "/var/lib/apt/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ];then
|
||||
PACKAGES_DATA_PATH="/var/lib/apt/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages"
|
||||
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH,是星火域名单目录仓库配置"
|
||||
else
|
||||
PACKAGES_DATA_PATH="/var/lib/apt/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages"
|
||||
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH,是SDU镜像仓库配置"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
echo "正在计算hash并与星火仓库匹配..."
|
||||
|
||||
DEB_MD5SUM=`md5sum "$DEBPATH" | cut -c -32`
|
||||
|
||||
IS_MD5SUM_CHECKD=`cat /var/lib/apt/lists/d.store.deepinos.org.cn_Packages | grep $DEB_MD5SUM`
|
||||
IS_MD5SUM_CHECKD=`cat $PACKAGES_DATA_PATH | grep $DEB_MD5SUM`
|
||||
if [ ! -z "$IS_MD5SUM_CHECKD" ];then
|
||||
|
||||
echo "校验成功,开始安装"
|
||||
echo ----------------------------------------------------------------------------------
|
||||
dpkg -i "$DEBPATH" || aptss install -yf
|
||||
|
||||
try_run_output=$(aptss --dry-run install $DEBPATH)
|
||||
try_run_ret="$?"
|
||||
|
||||
if [ "$try_run_ret" -ne 0 ]
|
||||
then
|
||||
echo "Package manager quit with exit code.Here is the log"
|
||||
echo "包管理器以错误代码退出.日志如下"
|
||||
echo
|
||||
echo -e "${try_run_output}"
|
||||
exit "$try_run_ret"
|
||||
fi
|
||||
|
||||
|
||||
dpkg -i "$DEBPATH" || aptss install -yf
|
||||
|
||||
else
|
||||
|
||||
|
||||
zenity --info --icon-name=spark-store --height 270 --width 500 --text "软件包校验失败!这不应该发生!\n可能是因为软件包已损坏,星火仓库未同步,或者最坏的情况:恶意软件尝试利用自动安装来入侵系统!\n如果你不清楚发生了什么,请在接下来的认证窗口中选择取消认证\n执行 sudo aptss ssupdate 后再尝试安装。\n如果问题仍然存在,请在应用信息界面点击 应用反馈 来提交反馈给我们!\n\n如果你是审核人员,这是正常现象,在审核通过前星火仓库不会保存相关信息。请在接下来的弹窗中进行认证即可"
|
||||
zenity --info --icon-name=spark-store --height 270 --width 500 --text "${TRANSHELL_CONTENT_HASH_CHECK_FAILED}"
|
||||
|
||||
echo "软件包校验失败!这不应该发生!"
|
||||
echo "执行 sudo aptss ssupdate 后再尝试安装。"
|
||||
echo "如果问题仍然存在,请在应用信息界面点击 应用反馈 来提交反馈给我们!"
|
||||
echo "如果你是审核人员,这是正常现象,在审核通过前星火仓库不会保存相关信息。请在接下来的弹窗中进行认证即可"
|
||||
|
||||
pkexec_as_current_user bash -c "dpkg -i "$DEBPATH" || aptss install -yf "
|
||||
echo -e ${TRANSHELL_CONTENT_HASH_CHECK_FAILED}
|
||||
|
||||
fi
|
||||
|
||||
@@ -28,10 +28,25 @@ case $1 in
|
||||
;;
|
||||
|
||||
upgrade-app)
|
||||
aptss install "${@:2}" --only-upgrade 2>&1 | tee /tmp/spark-store-app-upgrade-log.txt
|
||||
aptss install "${@:2}" --only-upgrade 2>&1 | tee /tmp/spark-store-app-upgrade-log.txt
|
||||
IS_UPGRADE_ERROR=`cat /tmp/spark-store-app-upgrade-log.txt | grep "Package manager quit with exit code."`
|
||||
echo "$IS_UPGRADE_ERROR" > /tmp/spark-store-app-upgrade-status.txt
|
||||
;;
|
||||
test-install-app)
|
||||
try_run_output=$(aptss --dry-run install $2)
|
||||
try_run_ret="$?"
|
||||
|
||||
if [ "$try_run_ret" -ne 0 ]
|
||||
then
|
||||
echo "Package manager quit with exit code.Here is the log"
|
||||
echo "包管理器以错误代码退出.日志如下"
|
||||
echo
|
||||
echo -e "${try_run_output}"
|
||||
exit "$try_run_ret"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
;;
|
||||
|
||||
clean-log)
|
||||
rm -f /tmp/spark-store-app-ssupdate-status.txt /tmp/spark-store-app-ssupdate-log.txt /tmp/spark-store-app-upgrade-log.txt /tmp/spark-store-app-upgrade-status.txt
|
||||
|
||||
@@ -1,17 +1,21 @@
|
||||
#!/bin/bash
|
||||
|
||||
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
||||
load_transhell_debug
|
||||
|
||||
|
||||
touch /tmp/spark-store/upgradeStatus.txt
|
||||
|
||||
# 执行 apt update
|
||||
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh ssupdate | zenity --progress --auto-close --pulsate --no-cancel --text="正在检查更新,请稍候..." --height 70 --width 400 --title="星火商店更新模块" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh ssupdate | zenity --progress --auto-close --pulsate --no-cancel --text="${TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT}" --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
|
||||
if [ -z `cat /tmp/spark-store-app-ssupdate-status.txt` ] ; then
|
||||
echo "无错误"
|
||||
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
|
||||
else
|
||||
zenity --error --text "检查更新进程出现错误!按确定查看报错,可用于反馈" --title "星火商店更新检测模块" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --text-info --filename=/tmp/spark-store-app-ssupdate-log.txt --checkbox="我已复制了此文本框中的日志,且将会在反馈时附上。反馈渠道可以在右上角菜单的设置中找到" --title="反馈渠道在商店右上角的设置里" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --error --text "${TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --text-info --filename=/tmp/spark-store-app-ssupdate-log.txt --checkbox="${TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK}" --title="${TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
|
||||
rm -f /tmp/spark-store/upgradeStatus.txt
|
||||
exit
|
||||
fi
|
||||
|
||||
@@ -19,7 +23,7 @@ fi
|
||||
PKG_LIST="$(pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)"
|
||||
## 如果没更新,就弹出不需要更新
|
||||
if [ -z "$PKG_LIST" ] ; then
|
||||
zenity --info --text "没有软件需要更新\n但是你并没有站在世界之巅" --title "星火商店更新检测模块" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
else
|
||||
## 获取用户选择的要更新的应用
|
||||
### 指定分隔符为 \n
|
||||
@@ -44,7 +48,7 @@ else
|
||||
echo "$PKG_CUR_VER"
|
||||
else
|
||||
echo "false"
|
||||
echo "$PKG_NAME(无法更新:已被标记为保留)"
|
||||
echo "$PKG_NAME${TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD}"
|
||||
echo "$PKG_NEW_VER"
|
||||
echo "$PKG_CUR_VER"
|
||||
fi
|
||||
@@ -55,27 +59,29 @@ done`
|
||||
|
||||
## 如果没有应用需要更新,则直接退出
|
||||
if [ -z "$PKG_UPGRADE_LIST" ] ; then
|
||||
zenity --info --text "没有软件需要更新\n但是你并没有站在世界之巅" --title "星火商店更新检测服务" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
else
|
||||
PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="选择你想更新的应用" --column="是否更新" --column="包名" --column="新版本" --column="从该版本更新" --separator=" " --checklist --multiple --print-column=2 --height 350 --width 550 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg)
|
||||
PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="${TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE}" --column="${TRANSHELL_CONTENT_CHOOSE}" --column="${TRANSHELL_CONTENT_PKG_NAME}" --column="${TRANSHELL_CONTENT_NEW_VERSION}" --column="${TRANSHELL_CONTENT_UPGRADE_FROM}" --separator=" " --checklist --multiple --print-column=2 --height 350 --width 550 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg)
|
||||
## 如果没有选择,则直接退出
|
||||
if [ -z "$PKG_UPGRADE_LIST" ] ; then
|
||||
zenity --info --text "没有选中任何软件\n但是你并没有站在世界之巅" --title "星火商店更新检测服务" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --info --text "${TRANSHELL_CONTENT_NO_APP_IS_CHOSEN}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
else
|
||||
### 更新用户选择的应用
|
||||
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE_LIST -y | zenity --progress --auto-close --no-cancel --pulsate --text="正在更新已选中的应用,请稍候..." --height 70 --width 400 --title="星火商店更新模块" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
|
||||
for PKG_UPGRADE in $PKG_UPGRADE_LIST;do
|
||||
update_transhell
|
||||
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE -y | zenity --progress --auto-close --no-cancel --pulsate --text="${TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT}" --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
done
|
||||
#### 更新成功
|
||||
if [ -z "`cat /tmp/spark-store-app-upgrade-status.txt`" ] ; then
|
||||
zenity --info --text "选中的软件已经更新完毕" --title "星火商店更新检测模块" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --info --text "${TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
else
|
||||
#### 更新异常
|
||||
zenity --error --text "更新出现错误!按确定查看报错,可用于反馈" --title "星火商店更新检测模块" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --text-info --filename=/tmp/spark-store-app-upgrade-log.txt --checkbox="我已复制了此文本框中的日志,且将会在反馈时附上 。反馈渠道可以在右上角菜单的设置中找到" --title="反馈渠道在商店右上角的设置里往下拉" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --error --text "${TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
zenity --text-info --filename=/tmp/spark-store-app-upgrade-log.txt --checkbox="${TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK}" --title="${TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
rm -f touch /tmp/spark-store/upgradeStatus.txt
|
||||
rm -f /tmp/spark-store/upgradeStatus.txt
|
||||
# 从最开头
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
||||
load_transhell_debug
|
||||
|
||||
endloop=0
|
||||
|
||||
@@ -7,42 +9,39 @@ endloop=0
|
||||
while [ $endloop -eq 0 ] ;do
|
||||
|
||||
if [ -e /etc/systemd/system/multi-user.target.wants/spark-update-notifier.service ];then
|
||||
text_update_open="关闭"
|
||||
text_update_open="${TRANSHELL_CONTENT_CLOSE}"
|
||||
#已经开启了就显示关闭
|
||||
else
|
||||
text_update_open="开启"
|
||||
text_update_open="${TRANSHELL_CONTENT_OPEN}"
|
||||
fi
|
||||
|
||||
update_transhell
|
||||
|
||||
|
||||
option=`zenity --list --text="欢迎使用星火更新和安装设置工具\n请在以下操作中选择一个进行~" --column 数字 --column=操作选项 --print-column=2 --height 350 --width 760 0 "查看自动更新相关功能使用前须知(重要)" 1 "$text_update_open星火更新检测工具(如果开启则会在系统启动后自动检测更新。如有更新则会弹出通知)" 2 查看可更新软件包列表并决定是否更新 4 退出脚本 --hide-column=1 --print-column=1`
|
||||
option=`zenity --list --text="${TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN}" --column 数字 --column=${TRANSHELL_CONTENT_OPTIONS} --print-column=2 --height 350 --width 760 0 "${TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK}" 1 "${TRANSHELL_CONTENT_CHECK_FOR_UPDATE}" 2 "${TRANSHELL_CONTENT_EXIT}" --hide-column=1 --print-column=1`
|
||||
|
||||
case $option in
|
||||
0)
|
||||
zenity --info --icon-name=spark-store --height 450 --width 500 --text "此须知适用于自动更新功能\n\n此脚本可以检测星火源中是否有比当前系统更高版本的软件包,由您决定是否安装;在安装更新过程中请不要直接点击关闭本页面,以免发生错误\n\n此脚本使用apt update/apt list --upgrade/apt upgrade来更新软件源、列出更新列表和操作更新\n\n该脚本不对其使用效果有任何明示或暗示的担保,在使用前请您确保您清楚地知道您在干什么。您应当清楚,星火商店的软件包并不是适配所有发行版的;尽管绝大多数的软件更新是无害的,您仍然应该仔细检查显示出来的更新内容,以确保不会对您的依赖环境造成破坏,尤其是那些看起来和系统依赖相关的软件包。在查看过更新列表之后,确认更新之前,您仍有取消更新的机会。\n\n本脚本的开发者不对使用该脚本可能造成的后果负责"
|
||||
;;
|
||||
1)
|
||||
if [ -e /etc/systemd/system/multi-user.target.wants/spark-update-notifier.service ];then
|
||||
zenity --info --icon-name=spark-store --height 150 --width 200 --text "检测到已经启动了自动更新检测,执行关闭" --timeout=2
|
||||
zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK}" --timeout=2
|
||||
pkexec systemctl disable spark-update-notifier
|
||||
zenity --info --icon-name=spark-store --height 150 --width 200 --text "已关闭" --timeout=2
|
||||
zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_CLOSED}" --timeout=2
|
||||
else
|
||||
zenity --info --icon-name=spark-store --height 150 --width 200 --text "未检测到自动更新检测,执行启动" --timeout=2
|
||||
zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK}" --timeout=2
|
||||
pkexec systemctl enable spark-update-notifier
|
||||
pkexec service spark-update-notifier start
|
||||
zenity --info --icon-name=spark-store --height 150 --width 200 --text "已启动" --timeout=2
|
||||
zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_OPENED}" --timeout=2
|
||||
fi
|
||||
;;
|
||||
|
||||
2)
|
||||
1)
|
||||
/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh
|
||||
;;
|
||||
|
||||
4)
|
||||
2)
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
exit 0
|
||||
esac
|
||||
|
||||
done
|
||||
done
|
||||
|
||||
@@ -1,18 +1,23 @@
|
||||
#!/bin/bash
|
||||
LANGUAGE=en_US
|
||||
|
||||
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
||||
load_transhell_debug
|
||||
|
||||
#############################################################
|
||||
|
||||
|
||||
# 发送通知
|
||||
function notify-send() {
|
||||
# Detect name of the display in use
|
||||
local display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
|
||||
|
||||
|
||||
# Detect user using the display
|
||||
local user=$(who | grep '('$display')' | awk '{print $1}' | head -n 1)
|
||||
local user=$(who | awk '{print $1}' | head -n 1)
|
||||
|
||||
# Detect uid of the user
|
||||
local uid=$(id -u $user)
|
||||
|
||||
sudo -u $user DISPLAY=$display DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus notify-send "$@"
|
||||
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus notify-send "$@"
|
||||
}
|
||||
|
||||
# 检测网络链接畅通
|
||||
@@ -38,16 +43,27 @@ function network()
|
||||
|
||||
network
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "Network fail. Stop to avoid bother dpkg"
|
||||
echo "$TRANSHELL_CONTENT_NETWORK_FAIL"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# The code above is modified from https://blog.csdn.net/yaxuan88521/article/details/120516298
|
||||
|
||||
# 每日更新星火源文件
|
||||
curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
|
||||
|
||||
updatetext=`aptss ssupdate`
|
||||
|
||||
|
||||
updatetext=`aptss ssupdate 2>&1`
|
||||
|
||||
until [ "`echo $updatetext | grep E: `" = "" ];do
|
||||
echo "${TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC}"
|
||||
sleep 15
|
||||
updatetext=`aptss ssupdate 2>&1`
|
||||
|
||||
|
||||
|
||||
done
|
||||
|
||||
isupdate=`echo ${updatetext: -5}`
|
||||
if [ "$isupdate" = "date." ] ; then
|
||||
exit 0
|
||||
@@ -84,10 +100,10 @@ done
|
||||
|
||||
# 还原分隔符
|
||||
IFS="$IFS_OLD"
|
||||
|
||||
if [ $update_app_number -le 0 ] ; then
|
||||
exit 0
|
||||
fi
|
||||
update_transhell
|
||||
|
||||
## 如果都是hold或者版本一致的那就直接退出,否则把剩余的给提醒了
|
||||
notify-send -a spark-store "星火更新提醒" "星火商店仓库中有$update_app_number个软件包可以更新啦!请到星火商店的菜单处理"
|
||||
notify-send -a spark-store "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY}" "${TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE}"
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT="Checking for update, please wait..."
|
||||
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="Spark Store APP Upgrade model"
|
||||
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="Error occured in checking for update! Press Confirm to get the error log (Can be useful when feedback)"
|
||||
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="I already copied the log in the text box and I will attach it when feeding back. You can find feedback entry in the settings which is located in the top right of the store."
|
||||
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="Feedback entry in the settings which is located in the top right of the store"
|
||||
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="All APPs are up to date.\nBut you are not standing at the top of the world"
|
||||
TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD="(Unable to upgrade: Being marked as hold)"
|
||||
TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE="Choose the app you want to upgrade"
|
||||
TRANSHELL_CONTENT_CHOOSE="Choose"
|
||||
TRANSHELL_CONTENT_PKG_NAME="Pkg name"
|
||||
TRANSHELL_CONTENT_NEW_VERSION="New version"
|
||||
TRANSHELL_CONTENT_UPGRADE_FROM="Upgrade from"
|
||||
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="No app is chosen\nBut you are not standing at the top of the world"
|
||||
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="Upgrading $PKG_UPGRADE , please wait..."
|
||||
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="The chosen app is upgraded"
|
||||
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="Error occured when upgrading! Press Confirm to get the error log (Can be useful when feedback)"
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT="正在检查更新,请稍候..."
|
||||
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="星火商店更新模块"
|
||||
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="检查更新进程出现错误!按确定查看报错,可用于反馈"
|
||||
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="我已复制了此文本框中的日志,且将会在反馈时附上。反馈渠道可以在右上角菜单的设置中找到"
|
||||
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="反馈渠道在商店右上角的设置里"
|
||||
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="没有软件需要更新\n但是你并没有站在世界之巅"
|
||||
TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD="(无法更新:已被标记为保留)"
|
||||
TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE="选择你想更新的应用"
|
||||
TRANSHELL_CONTENT_CHOOSE="选择"
|
||||
TRANSHELL_CONTENT_PKG_NAME="包名"
|
||||
TRANSHELL_CONTENT_NEW_VERSION="新版本"
|
||||
TRANSHELL_CONTENT_UPGRADE_FROM="从该版本更新"
|
||||
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何软件\n但是你并没有站在世界之巅"
|
||||
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $PKG_UPGRADE ,请稍候..."
|
||||
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="选中的软件已经更新完毕"
|
||||
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="更新出现错误!按确定查看报错,可用于反馈"
|
||||
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT="正在檢查更新,請稍候…"
|
||||
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="星火商店更新模塊"
|
||||
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="檢查更新行程出現錯誤! 按確定查看報錯,可用於回報"
|
||||
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="我已複製了此文字方塊中的日誌,且將會在回報時附上。 迴響通路可以在右上角選單的設定中找到 "
|
||||
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="回報入口在商店右上角的設定裏"
|
||||
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="沒有軟體需要更新\n但是你並沒有站在世界之巔"
|
||||
TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD="(无法更新:已被标记为保留)"
|
||||
TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE="选择你想更新的应用"
|
||||
TRANSHELL_CONTENT_CHOOSE="选择"
|
||||
TRANSHELL_CONTENT_PKG_NAME="包名"
|
||||
TRANSHELL_CONTENT_NEW_VERSION="新版本"
|
||||
TRANSHELL_CONTENT_UPGRADE_FROM="从该版本更新"
|
||||
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何軟體\n但是你並沒有站在世界之巔"
|
||||
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $PKG_UPGRADE ,请稍候..."
|
||||
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="选中的軟體已经更新完毕"
|
||||
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="更新出现错误!按确定查看报错,可用于反馈"
|
||||
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_CLOSE="关闭"
|
||||
TRANSHELL_CONTENT_OPEN="开启"
|
||||
TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN="欢迎使用星火更新和安装设置工具\n请在以下操作中选择一个进行~"
|
||||
TRANSHELL_CONTENT_OPTIONS="操作选项"
|
||||
TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK="$text_update_open星火更新检测工具(如果开启则会在系统启动后自动检测更新。如有更新则会弹出通知)"
|
||||
TRANSHELL_CONTENT_CHECK_FOR_UPDATE="查看可更新软件包列表"
|
||||
TRANSHELL_CONTENT_EXIT="退出"
|
||||
TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK="执行关闭自动更新检测,请授权"
|
||||
TRANSHELL_CONTENT_CLOSED="已关闭"
|
||||
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="执行启动自动更新检测,请授权"
|
||||
TRANSHELL_CONTENT_OPENED="已开启"
|
||||
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_CLOSE="Close"
|
||||
TRANSHELL_CONTENT_OPEN="Open"
|
||||
TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN="Welcome to Spark Store APP Upgrade Settings\nPlease choose one option to run"
|
||||
TRANSHELL_CONTENT_OPTIONS="Options"
|
||||
TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK="$text_update_open Spark Store APP upgrade check. (Will notify APP upgrade at start up if opened.)"
|
||||
TRANSHELL_CONTENT_CHECK_FOR_UPDATE="Check Upgradable app list."
|
||||
TRANSHELL_CONTENT_EXIT="Exit"
|
||||
TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK="Please authorize to close APP upgrade check"
|
||||
TRANSHELL_CONTENT_CLOSED="Closed"
|
||||
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="Please authorize to open APP upgrade check"
|
||||
TRANSHELL_CONTENT_OPENED="Opened"
|
||||
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_CLOSE="关闭"
|
||||
TRANSHELL_CONTENT_OPEN="开启"
|
||||
TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN="欢迎使用星火更新和安装设置工具\n请在以下操作中选择一个进行~"
|
||||
TRANSHELL_CONTENT_OPTIONS="操作选项"
|
||||
TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK="$text_update_open星火更新检测工具(如果开启则会在系统启动后自动检测更新。如有更新则会弹出通知)"
|
||||
TRANSHELL_CONTENT_CHECK_FOR_UPDATE="查看可更新软件包列表"
|
||||
TRANSHELL_CONTENT_EXIT="退出"
|
||||
TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK="执行关闭自动更新检测,请授权"
|
||||
TRANSHELL_CONTENT_CLOSED="已关闭"
|
||||
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="执行启动自动更新检测,请授权"
|
||||
TRANSHELL_CONTENT_OPENED="已开启"
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_NETWORK_FAIL="Network fail. Stop to avoid bother dpkg"
|
||||
TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC="Update error! Wait for 15 seconds..."
|
||||
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY="Spark Store Upgrade Notifier"
|
||||
TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE="There are ${update_app_number} APPs available to upgrade! Please go to Spark Store to upgrade."
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_NETWORK_FAIL="网络错误!为防止阻塞dpkg,停止"
|
||||
TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC="更新出现异常状况,等待十五秒"
|
||||
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY="星火更新提醒"
|
||||
TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE="星火商店仓库中有$update_app_number个软件包可以更新啦!请到星火商店的菜单处理"
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
TRANSHELL_CONTENT_NETWORK_FAIL="网络错误!为防止阻塞dpkg,停止"
|
||||
TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC="更新出现异常状况,等待十五秒"
|
||||
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY="星火更新提醒"
|
||||
TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE="星火商店仓库中有$update_app_number个软件包可以更新啦!请到星火商店的菜单处理"
|
||||
@@ -1,10 +1,6 @@
|
||||
#!/bin/bash
|
||||
# this file is used to auto-generate .qm file from .ts file.
|
||||
|
||||
ts_list=(`ls ./translations/*.ts`)
|
||||
cd $(dirname $0)
|
||||
|
||||
for ts in "${ts_list[@]}"
|
||||
do
|
||||
printf "\nprocess ${ts}\n"
|
||||
lrelease "${ts}"
|
||||
done
|
||||
lrelease ./src/spark-store.pro
|
||||
|
||||
6
translate_update.sh
Executable file
6
translate_update.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
# this file is used to auto-update .ts file.
|
||||
|
||||
cd $(dirname $0)
|
||||
|
||||
lupdate ./src/spark-store.pro -no-obsolete
|
||||
@@ -10,8 +10,9 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="244"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="147"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="209"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="173"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="315"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="430"/>
|
||||
<source>Download</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -41,12 +42,6 @@
|
||||
<source><html><head/><body><p><img src=":/tags/community-small.png"/></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="429"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="432"/>
|
||||
<source><html><head/><body><p>Capable to Ubuntu 20.04</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="435"/>
|
||||
<source><html><head/><body><p><img src=":/tags/ubuntu-small.png"/></p></body></html></source>
|
||||
@@ -107,12 +102,6 @@
|
||||
<source><html><head/><body><p><img src=":/tags/a2d-small.png"/></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="543"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="546"/>
|
||||
<source><html><head/><body><p>A deepin-wine5 app.Spark Store will automatically configure the wine kit for you</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="549"/>
|
||||
<source><html><head/><body><p><img src=":/tags/dwine5-small.png"/></p></body></html></source>
|
||||
@@ -143,6 +132,18 @@
|
||||
<source>Screen capture</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="429"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="432"/>
|
||||
<source><html><head/><body><p>Capable to Ubuntu 22.04</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="543"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="546"/>
|
||||
<source><html><head/><body><p>A Wine app.Spark Store will automatically configure the wine kit for you</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="1161"/>
|
||||
<source>Update</source>
|
||||
@@ -174,47 +175,51 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="89"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="47"/>
|
||||
<source>Click Open</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="132"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="224"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="316"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="112"/>
|
||||
<source>Developer Mode Disabled</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="158"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="331"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="403"/>
|
||||
<source>Reinstall</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="139"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="165"/>
|
||||
<source>Upgrade</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="214"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="308"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="341"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="320"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="379"/>
|
||||
<source>Install</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="219"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="325"/>
|
||||
<source>Installing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="345"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="356"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="434"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="447"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="345"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="434"/>
|
||||
<source>Uninstall succeeded</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="356"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="447"/>
|
||||
<source>The URL has been copied to the clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -232,102 +237,121 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DAboutDialog</name>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="138"/>
|
||||
<source>Version: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="148"/>
|
||||
<source>%1 is released under %2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DownloadItem</name>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="20"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="32"/>
|
||||
<source>Form</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="50"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="74"/>
|
||||
<source>icon</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="82"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="134"/>
|
||||
<source>TextLabel</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="106"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="121"/>
|
||||
<source>Name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="198"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="226"/>
|
||||
<source>Waiting to download</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="249"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="277"/>
|
||||
<source>Install</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="268"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="296"/>
|
||||
<source>Cancel</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="287"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="315"/>
|
||||
<source>Info</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="40"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="43"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="44"/>
|
||||
<source>Download Complete.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="142"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="99"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
|
||||
<source>Installing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="142"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
|
||||
<source>Installation complete.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="143"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="214"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="215"/>
|
||||
<source>Finish</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="222"/>
|
||||
<source>Retry</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
|
||||
<source>Error happened in dpkg progress , you can try it again.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="153"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="225"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="226"/>
|
||||
<source>Error happened in dpkg progress , you can try it again</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
|
||||
<source>dpkg progress had been aborted,you can retry installation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="233"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="234"/>
|
||||
<source>dpkg progress had been aborted,you can retry installation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="181"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
|
||||
<source>Download canceled</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -345,7 +369,7 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/downloadlistwidget.ui" line="110"/>
|
||||
<location filename="../src/widgets/downloadlistwidget.ui" line="116"/>
|
||||
<source>Open download directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -358,141 +382,134 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="160"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="166"/>
|
||||
<source>Home</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="197"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="203"/>
|
||||
<source>Network</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="225"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="231"/>
|
||||
<source>Chat</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="253"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="259"/>
|
||||
<source>Music</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="281"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="287"/>
|
||||
<source>Video</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="309"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="315"/>
|
||||
<source>Picture</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="337"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="343"/>
|
||||
<source>Game</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="365"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="371"/>
|
||||
<source>Office</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="393"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="399"/>
|
||||
<source>Reading</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="421"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="427"/>
|
||||
<source>Development</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="449"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="455"/>
|
||||
<source>Tool</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="477"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="483"/>
|
||||
<source>Theme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="505"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="511"/>
|
||||
<source>Other</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="533"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="539"/>
|
||||
<source>APP Upgrade</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="34"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="186"/>
|
||||
<source>Submit App</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="35"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
|
||||
<source>Submit App with client(Recommanded)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="36"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
|
||||
<source>Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="37"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
|
||||
<source>APP Upgrade and Install Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="158"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="145"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="240"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="159"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="150"/>
|
||||
<source>Search or enter spk://</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QLabel</name>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="64"/>
|
||||
<location filename="../src/main.cpp" line="73"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QObject</name>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="61"/>
|
||||
<source>We publish this program under GPL V3</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="66"/>
|
||||
<source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="75"/>
|
||||
<source>The Spark Project</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="79"/>
|
||||
<location filename="../src/main.cpp" line="81"/>
|
||||
<location filename="../src/application.cpp" line="33"/>
|
||||
<location filename="../src/application.cpp" line="34"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="125"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="84"/>
|
||||
<source><span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style='font-size:12pt;'>Spark developers</span><br/><br/>Published under GPL V3</source>
|
||||
<location filename="../src/application.cpp" line="38"/>
|
||||
<source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="145"/>
|
||||
<source>Spark Project</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/downloadlistwidget.cpp" line="18"/>
|
||||
<source>Download list</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="243"/>
|
||||
<source>Show MainWindow</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
@@ -584,30 +601,32 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.cpp" line="181"/>
|
||||
<location filename="../src/pages/settingspage.cpp" line="213"/>
|
||||
<source>Updating, please wait...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.cpp" line="204"/>
|
||||
<location filename="../src/pages/settingspage.cpp" line="235"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.cpp" line="204"/>
|
||||
<location filename="../src/pages/settingspage.cpp" line="235"/>
|
||||
<source>Temporary cache was cleaned</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Widget</name>
|
||||
<name>TitleBarMenu</name>
|
||||
<message>
|
||||
<source>Share</source>
|
||||
<translation type="obsolete">Spk share link</translation>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>0B</source>
|
||||
<translation type="obsolete">0B</translation>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
|
||||
<source>Exit</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
||||
@@ -10,8 +10,9 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="244"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="147"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="209"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="173"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="315"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="430"/>
|
||||
<source>Download</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -41,12 +42,6 @@
|
||||
<source><html><head/><body><p><img src=":/tags/community-small.png"/></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="429"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="432"/>
|
||||
<source><html><head/><body><p>Capable to Ubuntu 20.04</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="435"/>
|
||||
<source><html><head/><body><p><img src=":/tags/ubuntu-small.png"/></p></body></html></source>
|
||||
@@ -107,12 +102,6 @@
|
||||
<source><html><head/><body><p><img src=":/tags/a2d-small.png"/></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="543"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="546"/>
|
||||
<source><html><head/><body><p>A deepin-wine5 app.Spark Store will automatically configure the wine kit for you</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="549"/>
|
||||
<source><html><head/><body><p><img src=":/tags/dwine5-small.png"/></p></body></html></source>
|
||||
@@ -143,6 +132,18 @@
|
||||
<source>Screen capture</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="429"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="432"/>
|
||||
<source><html><head/><body><p>Capable to Ubuntu 22.04</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="543"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="546"/>
|
||||
<source><html><head/><body><p>A Wine app.Spark Store will automatically configure the wine kit for you</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="1161"/>
|
||||
<source>Update</source>
|
||||
@@ -174,47 +175,51 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="89"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="47"/>
|
||||
<source>Click Open</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="132"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="224"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="316"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="112"/>
|
||||
<source>Developer Mode Disabled</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="158"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="331"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="403"/>
|
||||
<source>Reinstall</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="139"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="165"/>
|
||||
<source>Upgrade</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="214"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="308"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="341"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="320"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="379"/>
|
||||
<source>Install</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="219"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="325"/>
|
||||
<source>Installing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="345"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="356"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="434"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="447"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="345"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="434"/>
|
||||
<source>Uninstall succeeded</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="356"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="447"/>
|
||||
<source>The URL has been copied to the clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -232,102 +237,121 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DAboutDialog</name>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="138"/>
|
||||
<source>Version: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="148"/>
|
||||
<source>%1 is released under %2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DownloadItem</name>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="20"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="32"/>
|
||||
<source>Form</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="50"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="74"/>
|
||||
<source>icon</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="82"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="134"/>
|
||||
<source>TextLabel</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="106"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="121"/>
|
||||
<source>Name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="198"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="226"/>
|
||||
<source>Waiting to download</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="249"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="277"/>
|
||||
<source>Install</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="268"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="296"/>
|
||||
<source>Cancel</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="287"/>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="315"/>
|
||||
<source>Info</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="40"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="43"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="44"/>
|
||||
<source>Download Complete.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="142"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="99"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
|
||||
<source>Installing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="142"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
|
||||
<source>Installation complete.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="143"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="214"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="215"/>
|
||||
<source>Finish</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="222"/>
|
||||
<source>Retry</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="152"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
|
||||
<source>Error happened in dpkg progress , you can try it again.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="153"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="225"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="226"/>
|
||||
<source>Error happened in dpkg progress , you can try it again</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
|
||||
<source>dpkg progress had been aborted,you can retry installation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="233"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="234"/>
|
||||
<source>dpkg progress had been aborted,you can retry installation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="181"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
|
||||
<source>Download canceled</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -345,7 +369,7 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/downloadlistwidget.ui" line="110"/>
|
||||
<location filename="../src/widgets/downloadlistwidget.ui" line="116"/>
|
||||
<source>Open download directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -358,152 +382,134 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="160"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="166"/>
|
||||
<source>Home</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="197"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="203"/>
|
||||
<source>Network</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="225"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="231"/>
|
||||
<source>Chat</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="253"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="259"/>
|
||||
<source>Music</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="281"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="287"/>
|
||||
<source>Video</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="309"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="315"/>
|
||||
<source>Picture</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="337"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="343"/>
|
||||
<source>Game</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="365"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="371"/>
|
||||
<source>Office</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="393"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="399"/>
|
||||
<source>Reading</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="421"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="427"/>
|
||||
<source>Development</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="449"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="455"/>
|
||||
<source>Tool</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="477"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="483"/>
|
||||
<source>Theme</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="505"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="511"/>
|
||||
<source>Other</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="533"/>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="539"/>
|
||||
<source>APP Upgrade</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="34"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="186"/>
|
||||
<source>Submit App</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="35"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
|
||||
<source>Submit App with client(Recommanded)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="36"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
|
||||
<source>Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="37"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
|
||||
<source>APP Upgrade and Install Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="158"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="145"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="240"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="159"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="150"/>
|
||||
<source>Search or enter spk://</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QLabel</name>
|
||||
<message>
|
||||
<source>Spark应用商店</source>
|
||||
<translation type="vanished">Spark Store</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>社区驱动的一款为第三方应用商店,为改变而生
|
||||
本程序按GPL第三版开源</source>
|
||||
<translation type="vanished">Un app store tier alimenté par la communauté Deepin
|
||||
Spark Store est publié sous licence GPL V3
|
||||
Nous sommes nés pour le changement.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="64"/>
|
||||
<location filename="../src/main.cpp" line="73"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QObject</name>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="61"/>
|
||||
<source>We publish this program under GPL V3</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="66"/>
|
||||
<source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="75"/>
|
||||
<source>The Spark Project</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="79"/>
|
||||
<location filename="../src/main.cpp" line="81"/>
|
||||
<location filename="../src/application.cpp" line="33"/>
|
||||
<location filename="../src/application.cpp" line="34"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="125"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/main.cpp" line="84"/>
|
||||
<source><span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style='font-size:12pt;'>Spark developers</span><br/><br/>Published under GPL V3</source>
|
||||
<location filename="../src/application.cpp" line="38"/>
|
||||
<source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="145"/>
|
||||
<source>Spark Project</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/downloadlistwidget.cpp" line="18"/>
|
||||
<source>Download list</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="243"/>
|
||||
<source>Show MainWindow</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
@@ -595,212 +601,32 @@ Nous sommes nés pour le changement.</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.cpp" line="181"/>
|
||||
<location filename="../src/pages/settingspage.cpp" line="213"/>
|
||||
<source>Updating, please wait...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.cpp" line="204"/>
|
||||
<location filename="../src/pages/settingspage.cpp" line="235"/>
|
||||
<source>Spark Store</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.cpp" line="204"/>
|
||||
<location filename="../src/pages/settingspage.cpp" line="235"/>
|
||||
<source>Temporary cache was cleaned</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Widget</name>
|
||||
<name>TitleBarMenu</name>
|
||||
<message>
|
||||
<source>视频播放</source>
|
||||
<translatorcomment>Lecteurs vidéo et créateurs vidéo</translatorcomment>
|
||||
<translation type="vanished">Vidéo</translation>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>下载列表</source>
|
||||
<translation type="vanished">Liste de téléchargement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>系统工具</source>
|
||||
<translation type="vanished">Outils</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>主题美化</source>
|
||||
<translatorcomment>Thème des icônes et autres </translatorcomment>
|
||||
<translation type="vanished">Thèmes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>音乐欣赏</source>
|
||||
<translation type="vanished">Musique</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>编程开发</source>
|
||||
<translation type="vanished">Développement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>办公学习</source>
|
||||
<translation type="vanished">Bureau</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>阅读翻译</source>
|
||||
<translation type="vanished">Traduire</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>其他应用</source>
|
||||
<translation type="vanished">Autres</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>商店首页</source>
|
||||
<translation type="vanished">Accueil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>图形图像</source>
|
||||
<translation type="vanished">Images</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>游戏娱乐</source>
|
||||
<translation type="vanished">Jeux</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>社交沟通</source>
|
||||
<translation type="vanished">Chat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>网络应用</source>
|
||||
<translation type="vanished">Réseau</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>当前下载列表为空</source>
|
||||
<translation type="vanished">La liste de téléchargement est vide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>打开文件夹</source>
|
||||
<translation type="vanished">Ouvrir dans le gestionnaire de fichiers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>安装</source>
|
||||
<translation type="vanished">Installer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>卸载</source>
|
||||
<translation type="vanished">Supprimer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>官网</source>
|
||||
<translation type="vanished">Site</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>软件名</source>
|
||||
<translation type="vanished">Nom</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>图标</source>
|
||||
<translation type="vanished">Icon</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>分享</source>
|
||||
<translation type="vanished">Partager</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>详细介绍</source>
|
||||
<translation type="vanished">Détails</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>由社区爱好者开发的软件商店</p></body></html></source>
|
||||
<translation type="vanished"><html><head/><body><p>magasin de logiciels développé par des passionnés de la communauté</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>软件截图</source>
|
||||
<translation type="vanished">Captures d'écran</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>线路设置</source>
|
||||
<translation type="vanished">Line Settings</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>线路选择:</source>
|
||||
<translation type="vanished">Choisissez: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>刷新</source>
|
||||
<translation type="vanished">Mise à jour</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> 重启商店后生效</source>
|
||||
<translation type="vanished">Redémarrez pour prendre effet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>源服务器的作用是保证软件更新,并且支持使用apt工具获取软件。通常我们更建议你使用第一个线路作为更新源,一般是最稳定的。</p></body></html></source>
|
||||
<translation type="vanished"><html><head/><body><p>Le rôle du serveur source est de s'assurer que le logiciel est mis à jour et prend en charge l'utilisation de l'outil apt pour obtenir le logiciel. Nous préférons généralement que vous utilisiez la première ligne comme source de mise à jour, qui est généralement la plus stable. </p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>更新源</source>
|
||||
<translation type="vanished">Mettre à jour la source APT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>更新源服务器:</source>
|
||||
<translation type="vanished">Source APT: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>服务器</source>
|
||||
<translation type="vanished">serveur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>缓存目录</source>
|
||||
<translation type="vanished">Temp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>清空</source>
|
||||
<translation type="vanished">Nettoyer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>因为这个目录位于/tmp下,所以即使你不手动清空的话,其也将在系统重启时自动清空。</source>
|
||||
<translation type="vanished">Étant donné que ce répertoire se trouve sous /tmp, même si vous ne l'effacez pas manuellement, il sera effacé automatiquement au redémarrage du système.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>目录大小:</source>
|
||||
<translation type="vanished">Taille: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>0B</source>
|
||||
<translation type="obsolete">0B</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>目录位置:/tmp/spark-store</source>
|
||||
<translation type="vanished">Emplacement:/tmp/spark-store</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>关于我们</source>
|
||||
<translation type="vanished">À propos de nous</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>我们并不是官方团队,和你一样,我们也只是众多Linux/deepin系统爱好者和用户之中的一员,我们开发并且运营这个“Spark应用商店”,是为了让社区的朋友们一起分享好用的软件,或者一起参与开发,让大家都用到最新的,最优秀的软件。</p><p>我们并没有因此盈利,所有开发和维护人员都不会获得报酬,我们的主要支出大部分依赖于社区对我们的捐助,很感谢大家,这部分捐助让我们并不需要耗费太多精力去担心资金问题。</p><p>我们的服务和开发的软件都是免费供给大家使用,交流,学习的,但是在您的使用过程中一定要遵守当地的法律法规,否则出现任何问题和我们无关。</p><p>如果商店中任何一部分有侵犯您权益的行为,请告知我们&lt;jifengshenmo@outlook.com&gt;,我们会第一时间删除侵权内容。</p><p>如果你也想参与我们,不管是参与开发,设计,投递还是投稿作品,我们都欢迎你的加入。</p><p>QQ群:872690351<br/></p></body></html></source>
|
||||
<translation type="vanished"><html><head/><body><p>Nous ne sommes pas l'équipe officielle, tout comme vous, nous ne sommes qu'un des nombreux passionnés et utilisateurs de systèmes Linux / deepin, nous développons et gérons le "Spark Store"! ", est de rassembler la communauté pour partager des logiciels utiles, ou pour participer au développement ensemble, afin que nous utilisions tous les derniers et meilleurs logiciels. </p><p> Nous n'en tirons aucun profit, tous les développeurs et mainteneurs ne sont pas payés, et nous comptons sur les dons de la communauté pour la plupart de nos dépenses, dont nous sommes reconnaissants et qui nous permettent de ne pas dépenser trop d'énergie se soucier du financement. </p><p>Notre service et nos logiciels sont gratuits pour tout le monde à utiliser, à communiquer et à apprendre, mais vous devez vous conformer aux lois et réglementations locales dans le processus de votre utilisation, sinon tout problème n'a rien à voir avec nous. </p><p>Si une partie du magasin enfreint vos droits, veuillez nous en informer &lt;jifengshenmo@outlook.com&gt; nous retirerons le contenu en infraction dès que possible. </p><p>Si vous souhaitez également vous impliquer avec nous, que vous soyez impliqué dans le développement, la conception, le pitching ou la soumission de travaux, nous vous invitons à nous rejoindre. </p><p>QQ group:872690351<br/></p></body></html></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>downloadlist</name>
|
||||
<message>
|
||||
<source>名称</source>
|
||||
<translation type="vanished">Nom</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>等待开始下载</source>
|
||||
<translatorcomment>Attendez pour téléchargerd</translatorcomment>
|
||||
<translation type="vanished">Attendez pour télécharger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>安装</source>
|
||||
<translation type="vanished">Installer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>取消</source>
|
||||
<translation type="vanished">Annuler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>详情</source>
|
||||
<translation type="vanished">Détail</translation>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
|
||||
<source>Exit</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
632
translations/spark-store_zh_TW.ts
Normal file
632
translations/spark-store_zh_TW.ts
Normal file
@@ -0,0 +1,632 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="zh_TW">
|
||||
<context>
|
||||
<name>AppIntoPage</name>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="244"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="173"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="315"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="430"/>
|
||||
<source>Download</source>
|
||||
<translation>下载</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="290"/>
|
||||
<source>Uninstall</source>
|
||||
<translation>移除安裝</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="346"/>
|
||||
<source>0</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="356"/>
|
||||
<source>Download Times</source>
|
||||
<translation>下載次數</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="410"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="413"/>
|
||||
<source><html><head/><body><p>This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology</p></body></html></source>
|
||||
<translation><html><head/><body><p>这款应用是社区开发者开发的,我们为社区开发者颁发这款勋章以表彰他们对Linux生态的贡献</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="416"/>
|
||||
<source><html><head/><body><p><img src=":/tags/community-small.png"/></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="435"/>
|
||||
<source><html><head/><body><p><img src=":/tags/ubuntu-small.png"/></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="448"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="451"/>
|
||||
<source><html><head/><body><p>Capable to UOS home 20</p></body></html></source>
|
||||
<translation><html><head/><body><p>支持UOS家庭版 20</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="454"/>
|
||||
<source><html><head/><body><p><img src=":/tags/uos-small.png"/></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="467"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="470"/>
|
||||
<source><html><head/><body><p>A deepin-wine2 app. Spark Store will automatically configure the wine kit for you.</p></body></html></source>
|
||||
<translation>这是一款 deepin-wine2 应用。星火商店会为你自动配置wine环境</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="473"/>
|
||||
<source><html><head/><body><p><img src=":/tags/dwine2-small.png"/></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="486"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="489"/>
|
||||
<source><html><head/><body><p>This is a DTK5 app,which means it would have better effect on Deepin Desktop Environment</p></body></html></source>
|
||||
<translation><html><head/><body><p>这是一款DTK5应用,请使用深度桌面环境来获得最完美的体验</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="492"/>
|
||||
<source><html><head/><body><p><img src=":/tags/dtk-small.png"/></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="505"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="508"/>
|
||||
<source><html><head/><body><p>Capable to deepin 20</p></body></html></source>
|
||||
<translation><html><head/><body><p>支持deepin 20</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="511"/>
|
||||
<source><html><head/><body><p><img src=":/tags/deepin-small.png"/></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="524"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="527"/>
|
||||
<source><html><head/><body><p>An Appimage to deb app.</p></body></html></source>
|
||||
<translation><html><head/><body><p>这是一款Appimage转制应用.</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="530"/>
|
||||
<source><html><head/><body><p><img src=":/tags/a2d-small.png"/></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="549"/>
|
||||
<source><html><head/><body><p><img src=":/tags/dwine5-small.png"/></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="602"/>
|
||||
<source>Share</source>
|
||||
<translation>Spk共享链接</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="609"/>
|
||||
<source>APP Feedback</source>
|
||||
<translation>軟件錯誤回報</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="1068"/>
|
||||
<source>Description</source>
|
||||
<translation>軟體詳細資料</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="903"/>
|
||||
<source>Screen capture</source>
|
||||
<translation>軟體演示</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="429"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="432"/>
|
||||
<source><html><head/><body><p>Capable to Ubuntu 22.04</p></body></html></source>
|
||||
<translation><html><head/><body><p>支持Ubuntu 22.04</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="543"/>
|
||||
<location filename="../src/pages/appintopage.ui" line="546"/>
|
||||
<source><html><head/><body><p>A Wine app.Spark Store will automatically configure the wine kit for you</p></body></html></source>
|
||||
<translation>这是一款 Wine 应用。星火商店会为你自动配置wine环境</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="765"/>
|
||||
<source>Introduction</source>
|
||||
<translation>軟體介紹</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="1161"/>
|
||||
<source>Update</source>
|
||||
<translation>更新时间</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="1190"/>
|
||||
<source>Contributor</source>
|
||||
<translation>投稿用户</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="1197"/>
|
||||
<source>Pkgname</source>
|
||||
<translation>软件包名</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="1303"/>
|
||||
<source>Author</source>
|
||||
<translation>软件作者</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="1339"/>
|
||||
<source>Size</source>
|
||||
<translation>软件大小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.ui" line="1375"/>
|
||||
<source>Website</source>
|
||||
<translation>软件官网</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="47"/>
|
||||
<source>Click Open</source>
|
||||
<translation>点击跳转</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="112"/>
|
||||
<source>Developer Mode Disabled</source>
|
||||
<translation>开发者模式未开启</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="158"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="331"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="403"/>
|
||||
<source>Reinstall</source>
|
||||
<translation>重新安裝</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="165"/>
|
||||
<source>Upgrade</source>
|
||||
<translation>升级</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="320"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="379"/>
|
||||
<source>Install</source>
|
||||
<translation>安装</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="325"/>
|
||||
<source>Installing</source>
|
||||
<translation>正在安装</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="434"/>
|
||||
<location filename="../src/pages/appintopage.cpp" line="447"/>
|
||||
<source>Spark Store</source>
|
||||
<translation>星火应用商店</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="434"/>
|
||||
<source>Uninstall succeeded</source>
|
||||
<translation>卸载成功</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/appintopage.cpp" line="447"/>
|
||||
<source>The URL has been copied to the clipboard</source>
|
||||
<translation>链接已复制到剪贴板</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AppListPage</name>
|
||||
<message>
|
||||
<location filename="../src/pages/applistpage.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/applistpage.ui" line="60"/>
|
||||
<source>about:blank</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DAboutDialog</name>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="138"/>
|
||||
<source>Version: %1</source>
|
||||
<translation>版本:%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="148"/>
|
||||
<source>%1 is released under %2</source>
|
||||
<translation>%1遵循%2协议发布</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DownloadItem</name>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="32"/>
|
||||
<source>Form</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="74"/>
|
||||
<source>icon</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="134"/>
|
||||
<source>TextLabel</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="121"/>
|
||||
<source>Name</source>
|
||||
<translation>软件名</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="226"/>
|
||||
<source>Waiting to download</source>
|
||||
<translation>正在等待下载</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="277"/>
|
||||
<source>Install</source>
|
||||
<translation>安裝</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="296"/>
|
||||
<source>Cancel</source>
|
||||
<translation>取消</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.ui" line="315"/>
|
||||
<source>Info</source>
|
||||
<translation>详情</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="43"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="44"/>
|
||||
<source>Download Complete.</source>
|
||||
<translation>下載完成.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
|
||||
<source>Spark Store</source>
|
||||
<translation>星火应用商店</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
|
||||
<source>Installing</source>
|
||||
<translation>正在安裝</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
|
||||
<source>Installation complete.</source>
|
||||
<translation>安裝完成.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="214"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="215"/>
|
||||
<source>Finish</source>
|
||||
<translation>完成</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="222"/>
|
||||
<source>Retry</source>
|
||||
<translation>重试</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
|
||||
<source>Error happened in dpkg progress , you can try it again.</source>
|
||||
<translation>安装被中止,可重新安装。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="225"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="226"/>
|
||||
<source>Error happened in dpkg progress , you can try it again</source>
|
||||
<translation>dpkg出现错误,可重新安装</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
|
||||
<source>dpkg progress had been aborted,you can retry installation.</source>
|
||||
<translation>dpkg进程被中断,您可重试安装。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="233"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="234"/>
|
||||
<source>dpkg progress had been aborted,you can retry installation</source>
|
||||
<translation>安装被中止,可重新安装</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
|
||||
<location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
|
||||
<source>Download canceled</source>
|
||||
<translation>下载已取消</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DownloadListWidget</name>
|
||||
<message>
|
||||
<location filename="../src/widgets/downloadlistwidget.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/downloadlistwidget.ui" line="41"/>
|
||||
<source>The list is currently empty. Go and download some softwares!</source>
|
||||
<translation>当前下载列表为空。去下载些软件吧!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/downloadlistwidget.ui" line="116"/>
|
||||
<source>Open download directory</source>
|
||||
<translation>打开下载文件夹</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="14"/>
|
||||
<source>MainWindow</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="166"/>
|
||||
<source>Home</source>
|
||||
<translation>首頁</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="203"/>
|
||||
<source>Network</source>
|
||||
<translation>網路</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="231"/>
|
||||
<source>Chat</source>
|
||||
<translation>聊天</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="259"/>
|
||||
<source>Music</source>
|
||||
<translation>音樂</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="287"/>
|
||||
<source>Video</source>
|
||||
<translation>播放</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="315"/>
|
||||
<source>Picture</source>
|
||||
<translation>圖片</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="343"/>
|
||||
<source>Game</source>
|
||||
<translation>遊戲</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="371"/>
|
||||
<source>Office</source>
|
||||
<translation>辦公</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="399"/>
|
||||
<source>Reading</source>
|
||||
<translation>閱讀</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="427"/>
|
||||
<source>Development</source>
|
||||
<translation>開發</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="455"/>
|
||||
<source>Tool</source>
|
||||
<translation>工具</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="483"/>
|
||||
<source>Theme</source>
|
||||
<translation>主題</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="511"/>
|
||||
<source>Other</source>
|
||||
<translation>其他</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.ui" line="539"/>
|
||||
<source>APP Upgrade</source>
|
||||
<translation>軟體更新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="186"/>
|
||||
<source>Submit App</source>
|
||||
<translation>上傳軟體</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
|
||||
<source>Submit App with client(Recommanded)</source>
|
||||
<translation>從客戶端上傳軟體(推薦的)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
|
||||
<source>Settings</source>
|
||||
<translation>設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
|
||||
<source>APP Upgrade and Install Settings</source>
|
||||
<translation>軟體升級 和 安裝設定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="145"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="240"/>
|
||||
<source>Spark Store</source>
|
||||
<translation>星火应用商店</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="150"/>
|
||||
<source>Search or enter spk://</source>
|
||||
<translation>搜索或打开链接</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QObject</name>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="33"/>
|
||||
<location filename="../src/application.cpp" line="34"/>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="125"/>
|
||||
<source>Spark Store</source>
|
||||
<translation>星火应用商店</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="38"/>
|
||||
<source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source>
|
||||
<translation><span style=' font-size:10pt;font-weight:60;'>一款由社区提供的应用商店</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>星火计划开发者</span></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/application.cpp" line="145"/>
|
||||
<source>Spark Project</source>
|
||||
<translation>星火计划</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/widgets/downloadlistwidget.cpp" line="18"/>
|
||||
<source>Download list</source>
|
||||
<translation>下载列表</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="243"/>
|
||||
<source>Show MainWindow</source>
|
||||
<translation>显示主窗口</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="14"/>
|
||||
<source>Form</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="91"/>
|
||||
<source>Line Settings</source>
|
||||
<translation>线路设置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="107"/>
|
||||
<source>Choose Line:</source>
|
||||
<translation>线路选择:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="130"/>
|
||||
<source>Refresh</source>
|
||||
<translation>刷新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="143"/>
|
||||
<source>Take effect when restart</source>
|
||||
<translation>重启商店后生效</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="185"/>
|
||||
<source><html><head/><body><p>Check update for Spark Store. </p></body></html></source>
|
||||
<translation>检查星火应用商店更新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="202"/>
|
||||
<source>Update</source>
|
||||
<translation>更新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="195"/>
|
||||
<source>Spark Store Update</source>
|
||||
<translation>星火应用商店更新检测</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="230"/>
|
||||
<source>Temp</source>
|
||||
<translation>缓存目录</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="243"/>
|
||||
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
|
||||
<translation>因为这个目录位于/tmp下,所以即使你不手动清空的话,其也将在系统重启时自动清空。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="250"/>
|
||||
<source>0B</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="257"/>
|
||||
<source>Location:/tmp/spark-store</source>
|
||||
<translation>目录位置:/tmp/spark-store</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="277"/>
|
||||
<source>Clean</source>
|
||||
<translation>清空</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="290"/>
|
||||
<source>Size:</source>
|
||||
<translation>目录大小:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="297"/>
|
||||
<source>Clear Web Cache</source>
|
||||
<translation>清理网页缓存</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="318"/>
|
||||
<source>About us</source>
|
||||
<translation>关于我们</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.ui" line="325"/>
|
||||
<source><html><head/><body><p>We are <span style=" font-weight:600;">NOT</span> the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &quot;Spark Store&quot;! &quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. </p><p>We don't make a profit from this, all developers and maintainers don't get paid, and we rely on the community's donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. </p><p>Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. </p><p>If any part of the store infringes your rights, please tell us &lt;jifengshenmo@outlook.com&gt; we will remove the infringing content as soon as possible. </p><p>If you'd like to get involved with us too, whether you're involved in development, design, pitching or submitting work, we welcome you to join us. </p><p>Connect us on Spark IM: <a href="https://chat.shenmo.tech"><span style=" text-decoration: underline; color:#0000ff;">https://chat.shenmo.tech<br/></span></a>Our QQ Group number:872690351</p></body></html></source>
|
||||
<translation><html><head/><body><p>我们并<span style=" font-weight:600;">不是</span>官方团队,和你一样,我们也只是众多Linux/deepin系统爱好者和用户之中的一员,我们开发并且运营这个“Spark应用商店”,是为了让社区的朋友们一起分享好用的软件,或者一起参与开发,让大家都用到最新的,最优秀的软件。</p><p>我们并没有因此盈利,所有开发和维护人员都不会获得报酬,我们的主要支出大部分依赖于社区对我们的捐助,很感谢大家,这部分捐助让我们并不需要耗费太多精力去担心资金问题。</p><p>我们的服务和开发的软件都是免费供给大家使用,交流,学习的,但是在您的使用过程中一定要遵守当地的法律法规,否则出现任何问题和我们无关。</p><p>如果商店中任何一部分有侵犯您权益的行为,请告知我们 &lt;jifengshenmo@outlook.com&gt; ,我们会第一时间删除侵权内容。</p><p>如果你也想参与我们,不管是参与开发,设计,投递还是投稿作品,我们都欢迎你的加入。</p><p>在 Spark IM 联系我们:<a href="https://chat.shenmo.tech"><span style=" text-decoration: underline; color:#0000ff;">https://chat.shenmo.tech<br/></span></a>QQ 群:872690351</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.cpp" line="213"/>
|
||||
<source>Updating, please wait...</source>
|
||||
<translation>正在更新,请稍候……</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.cpp" line="235"/>
|
||||
<source>Spark Store</source>
|
||||
<translation>星火应用商店</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/pages/settingspage.cpp" line="235"/>
|
||||
<source>Temporary cache was cleaned</source>
|
||||
<translation>缓存目录已清空</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TitleBarMenu</name>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
|
||||
<source>About</source>
|
||||
<translation>关于</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
|
||||
<source>Exit</source>
|
||||
<translation>退出</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
Reference in New Issue
Block a user