Compare commits

...

6 Commits

Author SHA1 Message Date
5b55646789 修改: debian/changelog
修改:     debian/control
	修改:     src/main.cpp
	修改:     src/widget.cpp
	新文件:   tool/btinst
	修改:     translations/spark-store_zh_CN.ts
2022-04-03 17:44:39 +08:00
44d1041087 删除文件 src/spark-dstore-patch/.qmake.stash 2022-04-02 14:28:47 +00:00
dd941bcf8e 修改版本号 2022-04-02 22:26:56 +08:00
75fc22d2a2 修改: debian/changelog
删除:     debian/source/format
	修改:     spark-store-project.pro
	新文件:   src/spark-dstore-patch/spark-dstore-patch.pro
	新文件:   src/spark-dstore-patch/spark-dstore-tool.cpp
	修改:     src/spark-store.pro
	删除:     tool/spark-dstore-patch
2022-04-02 22:24:11 +08:00
ee549b91f1 update tool/ussremove. 2022-03-07 12:04:56 +00:00
38209d0efb update tool/ussinstall. 2022-03-07 12:03:31 +00:00
14 changed files with 274 additions and 51 deletions

6
debian/changelog vendored
View File

@@ -1,5 +1,5 @@
spark-store (3.0.3-9) stable; urgency=medium
spark-store (3.0.3-11~bt) stable; urgency=medium
* BT test 01
* Support dpkg-buildpackage
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800

3
debian/control vendored
View File

@@ -32,6 +32,7 @@ Depends:${shlibs:Depends}, ${misc:Depends},
libdtkcore5,
libdtkgui5,
libdtkwidget5,
libnotify4
libnotify4,
aria2
Description: Spark Store
A community powered app store, based on DTK.

View File

@@ -1 +0,0 @@
3.0 (quilt)

View File

@@ -4,8 +4,10 @@ TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
src/spark-dstore-patch \
third-party/QtNetworkService \
src/spark-store.pro
spark-store.depends = third-party/QtNetworkService

View File

@@ -1,7 +1,7 @@
#include <DApplication>
#include <DApplicationSettings>
#include <DWidgetUtil> // Dtk::Widget::moveToCenter(&w); 要调用它,就得引用 DWidgetUtil
#include <DAboutDialog>
#include <QScreen>
#include "widget.h"
@@ -16,33 +16,12 @@ int main(int argc, char *argv[])
a.setAttribute(Qt::AA_UseHighDpiPixmaps);
a.loadTranslator(); // 载入翻译
/* Customized DAboutDialog (Can't work on other distro like Ubuntu...)
*
* DAboutDialog dialog;
* a.setAboutDialog(&dialog);
* dialog.setLicense(QObject::tr("We publish this program under GPL V3"));
* dialog.setVersion(DApplication::buildVersion("Version 2.0.2.5"));
* 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 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>"
* )
* );
* dialog.setProductName(QLabel::tr("Spark Store"));
* dialog.setCompanyLogo(QPixmap(":/Logo-Spark.png"));
* dialog.setWebsiteName(QObject::tr("The Spark Project"));
* dialog.setWebsiteLink("https://gitee.com/deepin-community-store");
*/
a.setProductName(QLabel::tr("Spark Store"));
a.setProductIcon(QIcon::fromTheme("spark-store")); //设置Logo
a.setOrganizationName("spark-union");
a.setOrganizationDomain("https://www.deepinos.org/");
a.setApplicationName("Spark Store"); //不需要翻译,否则 ~/.local/share/ 下文件夹名称也被翻译为中文
a.setApplicationVersion(DApplication::buildVersion("3.0.3-9"));
a.setApplicationVersion(DApplication::buildVersion("3.0.3-11~bt"));
a.setApplicationAcknowledgementPage("https://gitee.com/deepin-community-store/spark-store");
a.setApplicationDescription(
QObject::tr(

View File

@@ -0,0 +1,9 @@
TARGET = spark-dstore-patch
TEMPLATE += app
QT += widgets
SOURCES += spark-dstore-tool.cpp
# Default rules for deployment.
qnx: target.path = /tmp/spark-store/bin
else: unix:!android: target.path = /opt/durapps/spark-store/bin
!isEmpty(target.path): INSTALLS += target

View File

@@ -0,0 +1,195 @@
#include <QCoreApplication>
#include <QDir>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>
#include <QDirIterator>
#include <QProcess>
#include <unistd.h>
QList<QJsonObject> enumAppInfoList()
{
QList<QJsonObject> appInfoList;
QDir apps("/opt/apps");
auto list = apps.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
for (auto &appID : list) {
auto infoPath = apps.absoluteFilePath(appID + "/info");
QFile infoFile(infoPath);
if (!infoFile.open(QIODevice::ReadOnly)) {
continue;
}
auto doc = QJsonDocument::fromJson(infoFile.readAll());
appInfoList.push_back(doc.object());
}
return appInfoList;
}
//这段是去找appid和info没看懂用来干啥的在此之后info文件也没再用过
//可能以后版本的实现会用到,等官方加功能再说
void linkDir(const QString &source, const QString &target)
{
auto ensureTargetDir = [](const QString &targetFile) {
QFileInfo t(targetFile);
QDir tDir(t.dir());
tDir.mkpath(".");
};
QDir sourceDir(source);
QDir targetDir(target);
QDirIterator iter(source, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while (iter.hasNext()) {
auto sourceFile = iter.next();
auto targetFile = targetDir.absoluteFilePath(sourceDir.relativeFilePath(sourceFile));
QFileInfo tfi(targetFile);
// if (tfi.isSymLink() && (tfi.canonicalFilePath() == sourceFile)) {
//这里官方应该是写错了,否则会每触发一次就把所有软链接都删了重新创建一次
if (tfi.isSymLink() && (tfi.symLinkTarget() == sourceFile)) {
continue;
} else {
QFile::remove(targetFile);
}
ensureTargetDir(targetFile);
auto ret = symlink(sourceFile.toStdString().c_str(), targetFile.toStdString().c_str());
if (0 != ret) {
qDebug() << "link failed" << sourceFile << "=>" << targetFile << ret;
}
}
}
//reset Dynamic library rpath
void setRpath(const QString &file, const QString &path)
{
if (!QFileInfo::exists(path))
return;
QProcess p;
auto cmd = "patchelf " + file + " --set-rpath " + path;
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
}
QString getGlic()
{
//get arch & glibc
QProcess p;
auto cmd = "gcc -dumpmachine";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
return p.readAll();
}
void linkApp(const QJsonObject &app)
{
auto appID = app.value("appid").toString();
auto appEntriesDir = QDir("/opt/apps/" + appID + "/entries");
auto appLibsDir = QDir("/opt/apps/" + appID + "/files/lib");
auto autoStartDir = QDir(appEntriesDir.absoluteFilePath("autostart"));
bool autoStart = app.value("permissions").toObject().value("autostart").toBool();
if (autoStart) {
linkDir(appEntriesDir.absoluteFilePath("autostart"), "/etc/xdg/autostart");
}
// link application
auto sysShareDir = QDir("/usr/share");
linkDir(appEntriesDir.absoluteFilePath("applications"), sysShareDir.absoluteFilePath("applications"));
linkDir(appEntriesDir.absoluteFilePath("icons"), sysShareDir.absoluteFilePath("icons"));
linkDir(appEntriesDir.absoluteFilePath("mime"), sysShareDir.absoluteFilePath("mime"));
linkDir(appEntriesDir.absoluteFilePath("glib-2.0"), sysShareDir.absoluteFilePath("glib-2.0"));
linkDir(appEntriesDir.absoluteFilePath("services"), sysShareDir.absoluteFilePath("dbus-1/services"));
linkDir(appEntriesDir.absoluteFilePath("GConf"), sysShareDir.absoluteFilePath("GConf"));
linkDir(appEntriesDir.absoluteFilePath("help"), sysShareDir.absoluteFilePath("help"));
linkDir(appEntriesDir.absoluteFilePath("locale"), sysShareDir.absoluteFilePath("locale"));
linkDir(appEntriesDir.absoluteFilePath("fcitx"), sysShareDir.absoluteFilePath("fcitx"));
linkDir(appEntriesDir.absoluteFilePath("polkit"), sysShareDir.absoluteFilePath("polkit-1"));
linkDir(appEntriesDir.absoluteFilePath("fonts/conf"), "/etc/fonts/conf.d");
linkDir(appEntriesDir.absoluteFilePath("fonts/files"), sysShareDir.absoluteFilePath("fonts"));
//原来会导致Gtk相关应用翻译缺失补足了
auto pluginDir = QDir(appEntriesDir.absoluteFilePath("plugins"));
if (pluginDir.exists()) {
QString arch = getGlic();
// if (pluginDir.exists()) {
// QDirIterator iter(pluginDir.absolutePath(), QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
// while (iter.hasNext()) {
// auto sourceFile = iter.next();
// setRpath(sourceFile, appLibsDir.absolutePath()); //set rpath
// }
// }
linkDir(appEntriesDir.absoluteFilePath("plugins/fcitx"), "/usr/lib/" + arch + "/fcitx");
linkDir(appEntriesDir.absoluteFilePath("plugins/browser"), "/usr/lib/mozilla/plugins");
}
}
void cleanLink()
{
auto cleanDirBrokenLink = [](const QString &dir) {
QProcess p;
auto cmd = "find " + dir + " -xtype l -delete";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
};
QString arch = getGlic();
auto sysShareDir = QDir("/usr/share");
cleanDirBrokenLink(sysShareDir.absoluteFilePath("applications"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("icons"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("mime/packages"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("glib-2.0"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("dbus-1/services"));
cleanDirBrokenLink("/etc/xdg/autostart");
cleanDirBrokenLink(sysShareDir.absoluteFilePath("fcitx"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("help"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("locale"));
cleanDirBrokenLink("/usr/lib/" + arch + "/fcitx");
cleanDirBrokenLink("/usr/lib/mozilla/plugins");
cleanDirBrokenLink(sysShareDir.absoluteFilePath("polkit-1/actions"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("fonts"));
cleanDirBrokenLink("/etc/fonts/conf.d");
}
void update()
{
QProcess p;
auto cmd = "glib-compile-schemas /usr/share/glib-2.0/schemas/";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
cmd = "update-icon-caches /usr/share/icons/*";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
cmd = "update-desktop-database -q";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
cmd = "update-mime-database -V /usr/share/mime";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
}
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
cleanLink();
for (auto &a : enumAppInfoList()) {
linkApp(a);
}
qInfo()<<"Spark dstore patch (c) The Spark Project 2022-Now. Modified from deepin-app-store-tool";
// trigger
update();
return 0;
}

View File

@@ -29,7 +29,7 @@ CONFIG += c++11 link_pkgconfig
PKGCONFIG += dtkcore dtkgui dtkwidget libnotify
# 禁止输出 qWarning / qDebug 信息
CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
#CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
SOURCES += \
appitem.cpp \

View File

@@ -18,7 +18,7 @@
#include <QSettings>
#include <QGraphicsOpacityEffect>
#include <QtConcurrent> // 并发
#include <QDebug>
#include <DApplication>
#include <DGuiApplicationHelper>
#include <DDialog>
@@ -606,19 +606,39 @@ void Widget::updatefoot()
void Widget::on_pushButton_download_clicked()
{
chooseLeftMenu(13);
// chooseLeftMenu(13);
allDownload += 1;
// allDownload += 1;
QFileInfo info(url.path());
QString fileName(info.fileName()); // 获取文件名
download_list[allDownload - 1].pkgName = pkgName;
if(fileName.isEmpty())
{
sendNotification(tr("Failed to get the name to the file to be downloaded."));
return;
}
// download_list[allDownload - 1].pkgName = pkgName;
QString downloadurl(url.path());
downloadurl.remove(0,2);
//日了获取serverurl那么远。。。直接写死了反正在测试
downloadurl.prepend("https://d.store.deepinos.org.cn");
qInfo()<<"下载链接拼接之后是"<<downloadurl<<"注意这里的serverUrl是写死的正式上线不要用"<<endl;
QString btUrl = downloadurl + ".torrent";
qInfo()<<"合成的bt链接是"<<btUrl<<endl;
qInfo()<<"虽然很奇怪这个链接为什么要这样处理但是确实能获取到的filename是"<<fileName<<endl;
QtConcurrent::run([=]()
{
ui->pushButton_download->setEnabled(false);
QProcess btinst;
btinst.start("x-terminal-emulator", QStringList() << "-e" << "/opt/durapps/spark-store/bin/btinst" << btUrl << fileName);
btinst.waitForFinished();
ui->pushButton_download->setEnabled(true);
});
/*
download_list[allDownload - 1].setParent(ui->listWidget);
QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
item->setSizeHint(download_list[allDownload - 1].size());
@@ -632,29 +652,24 @@ void Widget::on_pushButton_download_clicked()
icon.load("/tmp/spark-store/icon.png", "PNG");
system("cp /tmp/spark-store/icon.png /tmp/spark-store/icon_" + QString::number(allDownload - 1).toUtf8() + ".png");
download_list[allDownload - 1].seticon(icon);
*/
/*
if(!isBusy)
{
/*
file = new QFile(fileName);
if(!file->open(QIODevice::WriteOnly))
{
delete file;
file = nullptr;
return;
}
*/
nowDownload += 1;
startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求
}
*/
if(ui->pushButton_download->text() == tr("Reinstall"))
{
download_list[allDownload - 1].reinstall = true;
}
}
void Widget::startRequest(QUrl url, QString fileName)
{
ui->listWidget->show();
@@ -869,6 +884,8 @@ void Widget::sltAppinfoTags(QStringList *tagList)
}
}
// 在这里添加选择新的json项目比如bt专用链接
void Widget::sltAppinfoDetails(QString *name, QString *details, QString *info,
QString *website, QString *packageName, QUrl *fileUrl,
bool isInstalled, bool isUpdated)

21
tool/btinst Executable file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
# 第一个参数固定是bittorrent下载链接或者magnet
# 第二个参数就是文件名
export DISPLAY=:0
export XAUTHORITY=/home/shenmo/.Xauthority
if [ -x /tmp/spark-store/$2 ];then
rm /tmp/spark-store/$2
echo "检测到之前下载了软件包,未避免不能覆盖,先删除"
fi
mkdir -p /tmp/spark-store
cd /tmp/spark-store
echo "开始下载软件包"
aria2c "$1"
echo "安装"
pkexec ssinstall "/tmp/spark-store/$2"
echo 安装结束,按回车关闭窗口
read
exit 0

Binary file not shown.

View File

@@ -2,7 +2,7 @@
reset
echo Copyright (c) 2019-2021 The Spark Project
echo "Copyright (c) 2019-2021 The Spark Project"
if [ -x "/usr/bin/deepin-deb-installer" ] ; then
echo "深度软件包安装器已安装,开始检测证书"

View File

@@ -2,7 +2,7 @@
reset
echo Copyright (c) 2019-2021 The Spark Project
echo "Copyright (c) 2019-2021 The Spark Project"
if [ -x "/usr/bin/deepin-deb-installer" ] ; then
echo "深度软件包安装器已安装,开始检测证书"

View File

@@ -193,7 +193,7 @@
<location filename="../src/widget.cpp" line="902"/>
<location filename="../src/widget.cpp" line="1171"/>
<source>Install</source>
<translation></translation>
<translation>bt下载</translation>
</message>
<message>
<location filename="../src/widget.ui" line="313"/>