forked from openkylin/ukui-search
Add AUTO_START field.
Add a interface to get desktop file path by desktop file name.
This commit is contained in:
parent
65060337de
commit
b59d0a57d8
|
@ -52,7 +52,8 @@ public:
|
|||
QString lastError(void) const;
|
||||
|
||||
//通过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);
|
||||
|
|
|
@ -176,7 +176,7 @@ QString AppInfoTablePrivate::lastError() const
|
|||
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);
|
||||
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 res(true);
|
||||
|
@ -556,11 +568,16 @@ QString AppInfoTable::lastError() const
|
|||
return d->lastError();
|
||||
}
|
||||
|
||||
bool AppInfoTable::tranPidToDesktopFp(int pid, QString &desktopfp)
|
||||
bool AppInfoTable::tranPidToDesktopFp(uint pid, QString &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)
|
||||
{
|
||||
|
|
|
@ -95,7 +95,9 @@ public:
|
|||
* @param desktopfp: the desktop file path of the process corresponding to pid
|
||||
* @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:
|
||||
//暂不外放的接口
|
||||
|
|
|
@ -96,3 +96,13 @@ bool ApplicationInfo::tranPidToDesktopFp(int pid, QString &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);
|
||||
}
|
||||
|
|
|
@ -109,7 +109,17 @@ public:
|
|||
* @param desktopFilePath: the desktop file path of the process corresponding to pid
|
||||
* @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:
|
||||
void DBOpenFailed();
|
||||
|
|
|
@ -105,6 +105,10 @@ ApplicationPropertyHelper::ApplicationPropertyHelper(ApplicationProperty::Proper
|
|||
case ApplicationProperty::DontDisplay:
|
||||
d->m_databaseField = "DONT_DISPLAY";
|
||||
d->m_valueType = QMetaType::Int;
|
||||
break;
|
||||
case ApplicationProperty::AutoStart:
|
||||
d->m_databaseField = "AUTO_START";
|
||||
d->m_valueType = QMetaType::Int;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -52,7 +52,8 @@ enum Property {
|
|||
Launched, //是否从开始菜单启动过
|
||||
Top, //置顶顺序(0 未置顶)
|
||||
Lock, //是否锁定(不允许显示或打开)
|
||||
DontDisplay //是否不需要显示(设置了Nodisplay等字段)
|
||||
DontDisplay, //是否不需要显示(设置了Nodisplay等字段)
|
||||
AutoStart //是否自启动(位于自启动目录/etc/xdg/autostart下)
|
||||
};
|
||||
} //namespace ApplicationProperty
|
||||
typedef QVector<ApplicationProperty::Property> ApplicationProperties;
|
||||
|
|
|
@ -29,12 +29,12 @@
|
|||
#define GENERAL_APP_DESKTOP_PATH "/usr/share/applications"
|
||||
#define ANDROID_APP_DESKTOP_PATH QDir::homePath() + "/.local/share/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 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_VALUE "AppDatabaseVersion"
|
||||
static const QString AUTOSTART_APP_DESKTOP_PATH = "/etc/xdg/autostart";
|
||||
using namespace UkuiSearch;
|
||||
|
||||
static AppDBManager *global_instance;
|
||||
|
@ -207,7 +207,7 @@ void AppDBManager::buildAppInfoDB()
|
|||
{
|
||||
qDebug() << "I'm going to build app info 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("DESKTOP_FILE_PATH TEXT PRIMARY KEY NOT NULL")//desktop文件路径
|
||||
.arg("MODIFYED_TIME TEXT")//YYYYMMDDHHmmSS 修改日期
|
||||
|
@ -229,7 +229,8 @@ void AppDBManager::buildAppInfoDB()
|
|||
.arg("LAUNCHED INT")//应用安装后是否打开过0:未打开过;1:打开过
|
||||
.arg("TOP INT")//置顶顺序 0:未置顶;>0的数字表示置顶顺序
|
||||
.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)) {
|
||||
qWarning() << m_database.lastError() << cmd;
|
||||
return;
|
||||
|
@ -550,20 +551,23 @@ bool AppDBManager::handleDBItemInsert(const QString &desktopFilePath)
|
|||
}
|
||||
|
||||
int dontDisplay = 0;
|
||||
if (desktopfile.value("NoDisplay").toString().contains("true") ||
|
||||
desktopfile.value("NotShowIn").toString().contains("UKUI") ||
|
||||
desktopFilePath.startsWith(AUTOSTART_APP_DESKTOP_PATH)) {
|
||||
if (desktopfile.value("NoDisplay").toString().contains("true") || desktopfile.value("NotShowIn").toString().contains("UKUI")) {
|
||||
dontDisplay = 1;
|
||||
}
|
||||
|
||||
int isAutoStartApp = 0;
|
||||
if (desktopFilePath.startsWith(AUTOSTART_APP_DESKTOP_PATH + "/")) {
|
||||
isAutoStartApp = 1;
|
||||
}
|
||||
|
||||
sql.prepare(QString("INSERT INTO appInfo "
|
||||
"(DESKTOP_FILE_PATH, MODIFYED_TIME, INSERT_TIME, "
|
||||
"LOCAL_NAME, NAME_EN, NAME_ZH, PINYIN_NAME, "
|
||||
"FIRST_LETTER_OF_PINYIN, FIRST_LETTER_ALL, "
|
||||
"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, "
|
||||
":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(getAppDesktopMd5(desktopFilePath))
|
||||
|
@ -572,7 +576,8 @@ bool AppDBManager::handleDBItemInsert(const QString &desktopFilePath)
|
|||
.arg(0)
|
||||
.arg(0)
|
||||
.arg(0)
|
||||
.arg(dontDisplay));
|
||||
.arg(dontDisplay)
|
||||
.arg(isAutoStartApp));
|
||||
sql.bindValue(":desktopFilePath", desktopFilePath);
|
||||
sql.bindValue(":localName", localName);
|
||||
sql.bindValue(":enName", desktopfile.value("Name").toString());
|
||||
|
@ -704,14 +709,19 @@ bool AppDBManager::handleDBItemDelete(const QString &desktopFilePath)
|
|||
bool AppDBManager::handleDBItemUpdate(const QString &desktopFilePath)
|
||||
{
|
||||
bool res(true);
|
||||
int dontDisplay = 0;
|
||||
XdgDesktopFile desktopfile;
|
||||
desktopfile.load(desktopFilePath);
|
||||
if (desktopfile.value("NoDisplay").toString().contains("true") ||
|
||||
desktopfile.value("NotShowIn").toString().contains("UKUI") ||
|
||||
desktopFilePath.startsWith(AUTOSTART_APP_DESKTOP_PATH)) {
|
||||
|
||||
int dontDisplay = 0;
|
||||
if (desktopfile.value("NoDisplay").toString().contains("true") || desktopfile.value("NotShowIn").toString().contains("UKUI")) {
|
||||
dontDisplay = 1;
|
||||
}
|
||||
|
||||
int isAutoStartApp = 0;
|
||||
if (desktopFilePath.startsWith(AUTOSTART_APP_DESKTOP_PATH + "/")) {
|
||||
isAutoStartApp = 1;
|
||||
}
|
||||
|
||||
QString hanzi, pinyin, firstLetterOfPinyin;
|
||||
QString localName = desktopfile.localizedValue("Name", "NULL").toString();
|
||||
QString firstLetter2All = localName;
|
||||
|
@ -757,11 +767,13 @@ bool AppDBManager::handleDBItemUpdate(const QString &desktopFilePath)
|
|||
"EXEC=:exec,"
|
||||
"COMMENT=:comment,"
|
||||
"MD5='%1',"
|
||||
"DONT_DISPLAY=%2 "
|
||||
"DONT_DISPLAY=%2,"
|
||||
"AUTO_START=%3 "
|
||||
"WHERE DESKTOP_FILE_PATH=:desktopFilePath")
|
||||
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
|
||||
.arg(getAppDesktopMd5(desktopFilePath))
|
||||
.arg(dontDisplay));
|
||||
.arg(dontDisplay)
|
||||
.arg(isAutoStartApp));
|
||||
sql.bindValue(":desktopFilePath", desktopFilePath);
|
||||
sql.bindValue(":localName", localName);
|
||||
sql.bindValue(":enName", desktopfile.value("Name").toString());
|
||||
|
@ -1396,27 +1408,30 @@ bool AppDBManager::handleValueSet(const ApplicationInfoMap appInfoMap)
|
|||
return res;
|
||||
}
|
||||
|
||||
QString AppDBManager::tranPidToDesktopFp(int pid)
|
||||
QString AppDBManager::tranPidToDesktopFp(uint pid)
|
||||
{
|
||||
QString exePath = QFile::symLinkTarget("/proc/" + QString::number(pid) + "/exe");
|
||||
QString desktopfp;
|
||||
QString desktopFilePath;
|
||||
|
||||
QSqlQuery sql(m_database);
|
||||
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) + "%");
|
||||
|
||||
if (sql.exec()) {
|
||||
QMap<QString, QString> execInfos;
|
||||
while (sql.next()) {
|
||||
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) {
|
||||
desktopfp.clear();
|
||||
for (const QString &path : execInfos.values()) {
|
||||
QStringList execlist = path.split(" ", QString::SkipEmptyParts);
|
||||
desktopFilePath.clear();
|
||||
for (auto it = execInfos.constBegin(); it != execInfos.constEnd(); it++) {
|
||||
if (it.key().startsWith(AUTOSTART_APP_DESKTOP_PATH + "/")) {
|
||||
continue;
|
||||
}
|
||||
QStringList execlist = it.value().split(" ", QString::SkipEmptyParts);
|
||||
for (QString &partOfExec : execlist) {
|
||||
//remove the cmd option
|
||||
if (partOfExec.contains("%")) {
|
||||
|
@ -1427,27 +1442,67 @@ QString AppDBManager::tranPidToDesktopFp(int pid)
|
|||
partOfExec.remove("\"");
|
||||
}
|
||||
//compare the binary path
|
||||
if ((partOfExec.contains("/") && partOfExec == exePath) ||
|
||||
(partOfExec == exePath.section("/", -1))) {
|
||||
desktopfp = execInfos.key(path);
|
||||
if ((partOfExec.contains("/") && partOfExec == exePath) || (partOfExec == exePath.section("/", -1))) {
|
||||
desktopFilePath = it.key();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!desktopfp.isEmpty()) {
|
||||
if (!desktopFilePath.isEmpty()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!desktopfp.isEmpty()) {
|
||||
qDebug() << "PID: " << pid << "Desktop file path: " << desktopfp;
|
||||
if (!desktopFilePath.isEmpty()) {
|
||||
qDebug() << "PID: " << pid << "Desktop file path: " << desktopFilePath;
|
||||
} else {
|
||||
qWarning() << "Can not find the desktop file of" << exePath << "by pid:" << pid;
|
||||
}
|
||||
} else {
|
||||
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)
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
#define APP_DATABASE_PATH QDir::homePath()+"/.config/org.ukui/ukui-search/appdata/"
|
||||
#define APP_DATABASE_NAME "app-info.db"
|
||||
#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 {
|
||||
/**
|
||||
|
@ -84,7 +84,8 @@ public:
|
|||
|
||||
public Q_SLOTS:
|
||||
//通过pid查找对应的desktop文件
|
||||
QString tranPidToDesktopFp(int pid);
|
||||
QString tranPidToDesktopFp(uint pid);
|
||||
QString desktopFilePathFromName(const QString &desktopFileName);
|
||||
|
||||
//对数据库单条所有信息进行增删改
|
||||
void insertDBItem(const QString &desktopfd);
|
||||
|
@ -170,7 +171,8 @@ private:
|
|||
{"LAUNCHED", "INT"},
|
||||
{"TOP", "INT"},
|
||||
{"LOCK", "INT"},
|
||||
{"DONT_DISPLAY", "INT"}
|
||||
{"DONT_DISPLAY", "INT"},
|
||||
{"AUTO_START", "INT"}
|
||||
};
|
||||
|
||||
//应用黑名单
|
||||
|
|
Loading…
Reference in New Issue