Add AUTO_START field.

Add a interface to get desktop file path by desktop file name.
This commit is contained in:
JunjieBai 2023-04-17 16:14:44 +08:00 committed by iaom
parent 65060337de
commit b59d0a57d8
9 changed files with 140 additions and 38 deletions

View File

@ -52,7 +52,8 @@ public:
QString lastError(void) const; QString lastError(void) const;
//通过pid查找desktop文件 //通过pid查找desktop文件
bool tranPidToDesktopFp(int pid, QString &desktopfp); bool tranPidToDesktopFp(uint pid, QString &desktopfp);
bool desktopFilePathFromName(const QString &desktopFileName, QString &desktopFilePath);
//下面的接口都不外放,暂时没啥用 //下面的接口都不外放,暂时没啥用
bool setAppLaunchTimes(const QString &desktopfp, size_t num); bool setAppLaunchTimes(const QString &desktopfp, size_t num);

View File

@ -176,7 +176,7 @@ QString AppInfoTablePrivate::lastError() const
return m_database->lastError().text(); return m_database->lastError().text();
} }
bool AppInfoTablePrivate::tranPidToDesktopFp(int pid, QString &desktopfp) bool AppInfoTablePrivate::tranPidToDesktopFp(uint pid, QString &desktopfp)
{ {
QDBusReply<QString> reply = m_appDBInterface->call("tranPidToDesktopFp", pid); QDBusReply<QString> reply = m_appDBInterface->call("tranPidToDesktopFp", pid);
if (reply.isValid()) { if (reply.isValid()) {
@ -188,6 +188,18 @@ bool AppInfoTablePrivate::tranPidToDesktopFp(int pid, QString &desktopfp)
} }
} }
bool AppInfoTablePrivate::desktopFilePathFromName(const QString &desktopFileName, QString &desktopFilePath)
{
QDBusReply<QString> reply = m_appDBInterface->call("desktopFilePathFromName", desktopFileName);
if (reply.isValid()) {
desktopFilePath = reply.value();
return true;
} else {
qDebug() << m_appDBInterface->lastError();
return false;
}
}
bool AppInfoTablePrivate::setAppLaunchTimes(const QString &desktopfp, size_t num) bool AppInfoTablePrivate::setAppLaunchTimes(const QString &desktopfp, size_t num)
{ {
bool res(true); bool res(true);
@ -556,11 +568,16 @@ QString AppInfoTable::lastError() const
return d->lastError(); return d->lastError();
} }
bool AppInfoTable::tranPidToDesktopFp(int pid, QString &desktopfp) bool AppInfoTable::tranPidToDesktopFp(uint pid, QString &desktopfp)
{ {
return d->tranPidToDesktopFp(pid, desktopfp); return d->tranPidToDesktopFp(pid, desktopfp);
} }
bool AppInfoTable::desktopFilePathFromName(const QString &desktopFileName, QString &desktopFilePath)
{
return d->desktopFilePathFromName(desktopFileName, desktopFilePath);
}
//下面接口暂时没啥用,不外放。 //下面接口暂时没啥用,不外放。
bool AppInfoTable::setAppLaunchTimes(const QString &desktopfp, size_t num) bool AppInfoTable::setAppLaunchTimes(const QString &desktopfp, size_t num)
{ {

View File

@ -95,7 +95,9 @@ public:
* @param desktopfp: the desktop file path of the process corresponding to pid * @param desktopfp: the desktop file path of the process corresponding to pid
* @return bool:true if success,else false * @return bool:true if success,else false
*/ */
bool tranPidToDesktopFp(int pid, QString &desktopfp); bool tranPidToDesktopFp(uint pid, QString &desktopfp);
bool desktopFilePathFromName(const QString &desktopFileName, QString &desktopFilePath);
private: private:
//暂不外放的接口 //暂不外放的接口

View File

@ -96,3 +96,13 @@ bool ApplicationInfo::tranPidToDesktopFp(int pid, QString &desktopFilePath)
{ {
return AppInfoTable::self()->tranPidToDesktopFp(pid, desktopFilePath); return AppInfoTable::self()->tranPidToDesktopFp(pid, desktopFilePath);
} }
bool ApplicationInfo::tranPidToDesktopFp(uint pid, QString &desktopFilePath)
{
return AppInfoTable::self()->tranPidToDesktopFp(pid, desktopFilePath);
}
bool ApplicationInfo::desktopFilePathFromName(const QString &desktopFileName, QString &desktopFilePath)
{
return AppInfoTable::self()->desktopFilePathFromName(desktopFileName, desktopFilePath);
}

View File

@ -109,7 +109,17 @@ public:
* @param desktopFilePath: the desktop file path of the process corresponding to pid * @param desktopFilePath: the desktop file path of the process corresponding to pid
* @return bool:true if success,else false * @return bool:true if success,else false
*/ */
bool tranPidToDesktopFp(int pid, QString &desktopFilePath); bool tranPidToDesktopFp(int pid, QString &desktopFilePath);//obsolete
bool tranPidToDesktopFp(uint pid, QString &desktopFilePath);
/**
* @brief ApplicationInfo::desktopFilePathFromName
* find the desktop file path of the process which corresponds to the desktop file name (without .desktop)
* @param desktopFileName: the desktop file name of the process which need to get its desktop file path
* @param desktopFilePath: the desktop file path of the process corresponding to pid
* @return bool:true if success,else false
*/
bool desktopFilePathFromName(const QString &desktopFileName, QString &desktopFilePath);
Q_SIGNALS: Q_SIGNALS:
void DBOpenFailed(); void DBOpenFailed();

View File

@ -105,6 +105,10 @@ ApplicationPropertyHelper::ApplicationPropertyHelper(ApplicationProperty::Proper
case ApplicationProperty::DontDisplay: case ApplicationProperty::DontDisplay:
d->m_databaseField = "DONT_DISPLAY"; d->m_databaseField = "DONT_DISPLAY";
d->m_valueType = QMetaType::Int; d->m_valueType = QMetaType::Int;
break;
case ApplicationProperty::AutoStart:
d->m_databaseField = "AUTO_START";
d->m_valueType = QMetaType::Int;
} }
} }

View File

@ -52,7 +52,8 @@ enum Property {
Launched, //是否从开始菜单启动过 Launched, //是否从开始菜单启动过
Top, //置顶顺序0 未置顶) Top, //置顶顺序0 未置顶)
Lock, //是否锁定(不允许显示或打开) Lock, //是否锁定(不允许显示或打开)
DontDisplay //是否不需要显示设置了Nodisplay等字段 DontDisplay, //是否不需要显示设置了Nodisplay等字段
AutoStart //是否自启动(位于自启动目录/etc/xdg/autostart下
}; };
} //namespace ApplicationProperty } //namespace ApplicationProperty
typedef QVector<ApplicationProperty::Property> ApplicationProperties; typedef QVector<ApplicationProperty::Property> ApplicationProperties;

View File

@ -29,12 +29,12 @@
#define GENERAL_APP_DESKTOP_PATH "/usr/share/applications" #define GENERAL_APP_DESKTOP_PATH "/usr/share/applications"
#define ANDROID_APP_DESKTOP_PATH QDir::homePath() + "/.local/share/applications" #define ANDROID_APP_DESKTOP_PATH QDir::homePath() + "/.local/share/applications"
#define SNAPD_APP_DESKTOP_PATH "/var/lib/snapd/desktop/applications" #define SNAPD_APP_DESKTOP_PATH "/var/lib/snapd/desktop/applications"
#define AUTOSTART_APP_DESKTOP_PATH "/etc/xdg/autostart"
#define LAST_LOCALE_NAME QDir::homePath() + "/.config/org.ukui/ukui-search/appdata/last-locale-name.conf" #define LAST_LOCALE_NAME QDir::homePath() + "/.config/org.ukui/ukui-search/appdata/last-locale-name.conf"
#define LOCALE_NAME_VALUE "CurrentLocaleName" #define LOCALE_NAME_VALUE "CurrentLocaleName"
#define APP_DATABASE_VERSION_CONFIG QDir::homePath() + "/.config/org.ukui/ukui-search/appdata/app-database-version.conf" #define APP_DATABASE_VERSION_CONFIG QDir::homePath() + "/.config/org.ukui/ukui-search/appdata/app-database-version.conf"
#define APP_DATABASE_VERSION_VALUE "AppDatabaseVersion" #define APP_DATABASE_VERSION_VALUE "AppDatabaseVersion"
static const QString AUTOSTART_APP_DESKTOP_PATH = "/etc/xdg/autostart";
using namespace UkuiSearch; using namespace UkuiSearch;
static AppDBManager *global_instance; static AppDBManager *global_instance;
@ -207,7 +207,7 @@ void AppDBManager::buildAppInfoDB()
{ {
qDebug() << "I'm going to build app info database."; qDebug() << "I'm going to build app info database.";
QSqlQuery sql(m_database); QSqlQuery sql(m_database);
QString cmd = QString("CREATE TABLE IF NOT EXISTS appInfo(%1, %2, %3, %4, %5, %6, %7, %8,%9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21)") QString cmd = QString("CREATE TABLE IF NOT EXISTS appInfo(%1, %2, %3, %4, %5, %6, %7, %8,%9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22)")
// .arg("ID INT")//自增id // .arg("ID INT")//自增id
.arg("DESKTOP_FILE_PATH TEXT PRIMARY KEY NOT NULL")//desktop文件路径 .arg("DESKTOP_FILE_PATH TEXT PRIMARY KEY NOT NULL")//desktop文件路径
.arg("MODIFYED_TIME TEXT")//YYYYMMDDHHmmSS 修改日期 .arg("MODIFYED_TIME TEXT")//YYYYMMDDHHmmSS 修改日期
@ -229,7 +229,8 @@ void AppDBManager::buildAppInfoDB()
.arg("LAUNCHED INT")//应用安装后是否打开过0:未打开过;1:打开过 .arg("LAUNCHED INT")//应用安装后是否打开过0:未打开过;1:打开过
.arg("TOP INT")//置顶顺序 0:未置顶;>0的数字表示置顶顺序 .arg("TOP INT")//置顶顺序 0:未置顶;>0的数字表示置顶顺序
.arg("LOCK INT")//应用是否锁定管控0未锁定1锁定 .arg("LOCK INT")//应用是否锁定管控0未锁定1锁定
.arg("DONT_DISPLAY INT");//应用隐藏(NoDisplay, NotShowIn或位于autostart) .arg("DONT_DISPLAY INT")//应用隐藏(NoDisplay, NotShowIn)
.arg("AUTO_START INT");//自启应用
if (!sql.exec(cmd)) { if (!sql.exec(cmd)) {
qWarning() << m_database.lastError() << cmd; qWarning() << m_database.lastError() << cmd;
return; return;
@ -550,20 +551,23 @@ bool AppDBManager::handleDBItemInsert(const QString &desktopFilePath)
} }
int dontDisplay = 0; int dontDisplay = 0;
if (desktopfile.value("NoDisplay").toString().contains("true") || if (desktopfile.value("NoDisplay").toString().contains("true") || desktopfile.value("NotShowIn").toString().contains("UKUI")) {
desktopfile.value("NotShowIn").toString().contains("UKUI") ||
desktopFilePath.startsWith(AUTOSTART_APP_DESKTOP_PATH)) {
dontDisplay = 1; dontDisplay = 1;
} }
int isAutoStartApp = 0;
if (desktopFilePath.startsWith(AUTOSTART_APP_DESKTOP_PATH + "/")) {
isAutoStartApp = 1;
}
sql.prepare(QString("INSERT INTO appInfo " sql.prepare(QString("INSERT INTO appInfo "
"(DESKTOP_FILE_PATH, MODIFYED_TIME, INSERT_TIME, " "(DESKTOP_FILE_PATH, MODIFYED_TIME, INSERT_TIME, "
"LOCAL_NAME, NAME_EN, NAME_ZH, PINYIN_NAME, " "LOCAL_NAME, NAME_EN, NAME_ZH, PINYIN_NAME, "
"FIRST_LETTER_OF_PINYIN, FIRST_LETTER_ALL, " "FIRST_LETTER_OF_PINYIN, FIRST_LETTER_ALL, "
"ICON, TYPE, CATEGORY, EXEC, COMMENT, MD5, " "ICON, TYPE, CATEGORY, EXEC, COMMENT, MD5, "
"LAUNCH_TIMES, FAVORITES, LAUNCHED, TOP, LOCK, DONT_DISPLAY) " "LAUNCH_TIMES, FAVORITES, LAUNCHED, TOP, LOCK, DONT_DISPLAY, AUTO_START) "
"VALUES(:desktopFilePath, '%0', '%1', :localName, :enName, :zhName, :pinyinName, :firstLetterOfPinyin, :firstLetter2All, " "VALUES(:desktopFilePath, '%0', '%1', :localName, :enName, :zhName, :pinyinName, :firstLetterOfPinyin, :firstLetter2All, "
":icon, :type, :categories, :exec, :comment,'%2',%3,%4,%5,%6,%7,%8)") ":icon, :type, :categories, :exec, :comment,'%2',%3,%4,%5,%6,%7,%8,%9)")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")) .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")) .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
.arg(getAppDesktopMd5(desktopFilePath)) .arg(getAppDesktopMd5(desktopFilePath))
@ -572,7 +576,8 @@ bool AppDBManager::handleDBItemInsert(const QString &desktopFilePath)
.arg(0) .arg(0)
.arg(0) .arg(0)
.arg(0) .arg(0)
.arg(dontDisplay)); .arg(dontDisplay)
.arg(isAutoStartApp));
sql.bindValue(":desktopFilePath", desktopFilePath); sql.bindValue(":desktopFilePath", desktopFilePath);
sql.bindValue(":localName", localName); sql.bindValue(":localName", localName);
sql.bindValue(":enName", desktopfile.value("Name").toString()); sql.bindValue(":enName", desktopfile.value("Name").toString());
@ -704,14 +709,19 @@ bool AppDBManager::handleDBItemDelete(const QString &desktopFilePath)
bool AppDBManager::handleDBItemUpdate(const QString &desktopFilePath) bool AppDBManager::handleDBItemUpdate(const QString &desktopFilePath)
{ {
bool res(true); bool res(true);
int dontDisplay = 0;
XdgDesktopFile desktopfile; XdgDesktopFile desktopfile;
desktopfile.load(desktopFilePath); desktopfile.load(desktopFilePath);
if (desktopfile.value("NoDisplay").toString().contains("true") ||
desktopfile.value("NotShowIn").toString().contains("UKUI") || int dontDisplay = 0;
desktopFilePath.startsWith(AUTOSTART_APP_DESKTOP_PATH)) { if (desktopfile.value("NoDisplay").toString().contains("true") || desktopfile.value("NotShowIn").toString().contains("UKUI")) {
dontDisplay = 1; dontDisplay = 1;
} }
int isAutoStartApp = 0;
if (desktopFilePath.startsWith(AUTOSTART_APP_DESKTOP_PATH + "/")) {
isAutoStartApp = 1;
}
QString hanzi, pinyin, firstLetterOfPinyin; QString hanzi, pinyin, firstLetterOfPinyin;
QString localName = desktopfile.localizedValue("Name", "NULL").toString(); QString localName = desktopfile.localizedValue("Name", "NULL").toString();
QString firstLetter2All = localName; QString firstLetter2All = localName;
@ -757,11 +767,13 @@ bool AppDBManager::handleDBItemUpdate(const QString &desktopFilePath)
"EXEC=:exec," "EXEC=:exec,"
"COMMENT=:comment," "COMMENT=:comment,"
"MD5='%1'," "MD5='%1',"
"DONT_DISPLAY=%2 " "DONT_DISPLAY=%2,"
"AUTO_START=%3 "
"WHERE DESKTOP_FILE_PATH=:desktopFilePath") "WHERE DESKTOP_FILE_PATH=:desktopFilePath")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")) .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
.arg(getAppDesktopMd5(desktopFilePath)) .arg(getAppDesktopMd5(desktopFilePath))
.arg(dontDisplay)); .arg(dontDisplay)
.arg(isAutoStartApp));
sql.bindValue(":desktopFilePath", desktopFilePath); sql.bindValue(":desktopFilePath", desktopFilePath);
sql.bindValue(":localName", localName); sql.bindValue(":localName", localName);
sql.bindValue(":enName", desktopfile.value("Name").toString()); sql.bindValue(":enName", desktopfile.value("Name").toString());
@ -1396,27 +1408,30 @@ bool AppDBManager::handleValueSet(const ApplicationInfoMap appInfoMap)
return res; return res;
} }
QString AppDBManager::tranPidToDesktopFp(int pid) QString AppDBManager::tranPidToDesktopFp(uint pid)
{ {
QString exePath = QFile::symLinkTarget("/proc/" + QString::number(pid) + "/exe"); QString exePath = QFile::symLinkTarget("/proc/" + QString::number(pid) + "/exe");
QString desktopfp; QString desktopFilePath;
QSqlQuery sql(m_database); QSqlQuery sql(m_database);
sql.setForwardOnly(true); sql.setForwardOnly(true);
sql.prepare("SELECT DESKTOP_FILE_PATH, EXEC FROM APPINFO WHERE EXEC LIKE :exePath AND DONT_DISPLAY = 0"); sql.prepare("SELECT DESKTOP_FILE_PATH, EXEC FROM APPINFO WHERE EXEC LIKE :exePath");
sql.bindValue(":exePath", "%" + exePath.section('/', -1) + "%"); sql.bindValue(":exePath", "%" + exePath.section('/', -1) + "%");
if (sql.exec()) { if (sql.exec()) {
QMap<QString, QString> execInfos; QMap<QString, QString> execInfos;
while (sql.next()) { while (sql.next()) {
execInfos[sql.value("DESKTOP_FILE_PATH").toString()] = sql.value("EXEC").toString(); execInfos[sql.value("DESKTOP_FILE_PATH").toString()] = sql.value("EXEC").toString();
desktopfp = sql.value("DESKTOP_FILE_PATH").toString(); desktopFilePath = sql.value("DESKTOP_FILE_PATH").toString();
} }
//筛选后有多个结果时进一步过滤 //筛选后有多个结果时进一步过滤
if (execInfos.size() > 1) { if (execInfos.size() > 1) {
desktopfp.clear(); desktopFilePath.clear();
for (const QString &path : execInfos.values()) { for (auto it = execInfos.constBegin(); it != execInfos.constEnd(); it++) {
QStringList execlist = path.split(" ", QString::SkipEmptyParts); if (it.key().startsWith(AUTOSTART_APP_DESKTOP_PATH + "/")) {
continue;
}
QStringList execlist = it.value().split(" ", QString::SkipEmptyParts);
for (QString &partOfExec : execlist) { for (QString &partOfExec : execlist) {
//remove the cmd option //remove the cmd option
if (partOfExec.contains("%")) { if (partOfExec.contains("%")) {
@ -1427,27 +1442,67 @@ QString AppDBManager::tranPidToDesktopFp(int pid)
partOfExec.remove("\""); partOfExec.remove("\"");
} }
//compare the binary path //compare the binary path
if ((partOfExec.contains("/") && partOfExec == exePath) || if ((partOfExec.contains("/") && partOfExec == exePath) || (partOfExec == exePath.section("/", -1))) {
(partOfExec == exePath.section("/", -1))) { desktopFilePath = it.key();
desktopfp = execInfos.key(path);
break; break;
} }
} }
if (!desktopfp.isEmpty()) { if (!desktopFilePath.isEmpty()) {
break; break;
} }
} }
} }
if (!desktopfp.isEmpty()) { if (!desktopFilePath.isEmpty()) {
qDebug() << "PID: " << pid << "Desktop file path: " << desktopfp; qDebug() << "PID: " << pid << "Desktop file path: " << desktopFilePath;
} else { } else {
qWarning() << "Can not find the desktop file of" << exePath << "by pid:" << pid; qWarning() << "Can not find the desktop file of" << exePath << "by pid:" << pid;
} }
} else { } else {
qWarning() << "Fail to exec cmd" << sql.lastQuery() << m_database.lastError(); qWarning() << "Fail to exec cmd" << sql.lastQuery() << m_database.lastError();
} }
return desktopfp; return desktopFilePath;
}
QString AppDBManager::desktopFilePathFromName(const QString &desktopFileName)
{
QString desktopFilePath;
QSqlQuery query(m_database);
query.setForwardOnly(true);
query.prepare("SELECT DESKTOP_FILE_PATH FROM APPINFO WHERE DESKTOP_FILE_PATH LIKE :desktopFilePath");
query.bindValue(":desktopFilePath", "%/" + desktopFileName + ".desktop");
if (query.exec()) {
QStringList results;
while (query.next()) {
desktopFilePath = query.value("DESKTOP_FILE_PATH").toString();
results.append(desktopFilePath);
}
//筛选后有多个结果时进一步过滤
if (results.size() > 1) {
desktopFilePath.clear();
for (const QString &path : results) {
if (path.startsWith(AUTOSTART_APP_DESKTOP_PATH + "/")) {
continue;
} else {
desktopFilePath = path;
}
if (!desktopFilePath.isEmpty()) {
break;
}
}
}
if (!desktopFilePath.isEmpty()) {
qDebug() << "Desktop file path is" << desktopFilePath;
} else {
qWarning() << "Can not find the desktop file by Name:" << desktopFileName;
}
} else {
qWarning() << "Fail to exec cmd" << query.lastQuery();
}
return desktopFilePath;
} }
void AppDBManager::insertDBItem(const QString &desktopfd) void AppDBManager::insertDBItem(const QString &desktopfd)

View File

@ -37,7 +37,7 @@
#define APP_DATABASE_PATH QDir::homePath()+"/.config/org.ukui/ukui-search/appdata/" #define APP_DATABASE_PATH QDir::homePath()+"/.config/org.ukui/ukui-search/appdata/"
#define APP_DATABASE_NAME "app-info.db" #define APP_DATABASE_NAME "app-info.db"
#define CONNECTION_NAME QLatin1String("ukss-appdb-connection") #define CONNECTION_NAME QLatin1String("ukss-appdb-connection")
static const QString APP_DATABASE_VERSION = QStringLiteral("1.1"); static const QString APP_DATABASE_VERSION = QStringLiteral("1.2");
namespace UkuiSearch { namespace UkuiSearch {
/** /**
@ -84,7 +84,8 @@ public:
public Q_SLOTS: public Q_SLOTS:
//通过pid查找对应的desktop文件 //通过pid查找对应的desktop文件
QString tranPidToDesktopFp(int pid); QString tranPidToDesktopFp(uint pid);
QString desktopFilePathFromName(const QString &desktopFileName);
//对数据库单条所有信息进行增删改 //对数据库单条所有信息进行增删改
void insertDBItem(const QString &desktopfd); void insertDBItem(const QString &desktopfd);
@ -170,7 +171,8 @@ private:
{"LAUNCHED", "INT"}, {"LAUNCHED", "INT"},
{"TOP", "INT"}, {"TOP", "INT"},
{"LOCK", "INT"}, {"LOCK", "INT"},
{"DONT_DISPLAY", "INT"} {"DONT_DISPLAY", "INT"},
{"AUTO_START", "INT"}
}; };
//应用黑名单 //应用黑名单