ukui-search/libsearch/appsearch/app-match.cpp

372 lines
14 KiB
C++
Raw Normal View History

2021-01-29 11:43:07 +08:00
/*
* Copyright (C) 2020, KylinSoft Co., Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* Authors: sunfengsheng <sunfengsheng@kylinos.cn>
*
*/
2020-12-30 15:31:36 +08:00
#include "app-match.h"
#include <glib.h>
2020-12-30 21:41:00 +08:00
#include "file-utils.h"
2020-12-30 15:31:36 +08:00
AppMatch::AppMatch(QObject *parent) : QObject(parent)
2021-02-26 11:21:41 +08:00
// m_versionCommand(new QProcess(this))
2020-12-30 15:31:36 +08:00
{
2021-02-26 11:21:41 +08:00
2020-12-30 15:31:36 +08:00
this->getDesktopFilePath();
2021-02-27 00:57:47 +08:00
m_watchAppDir=new QFileSystemWatcher(this);
m_watchAppDir->addPath("/usr/share/applications/");
connect(m_watchAppDir,&QFileSystemWatcher::directoryChanged,[this](){
this->getDesktopFilePath();
});
2021-02-26 11:21:41 +08:00
qDBusRegisterMetaType<QMap<QString,QString>>();
qDBusRegisterMetaType<QList<QMap<QString,QString>>>();
m_interFace=new QDBusInterface ("com.kylin.softwarecenter.getsearchresults", "/com/kylin/softwarecenter/getsearchresults",
"com.kylin.getsearchresults",
QDBusConnection::sessionBus());
if (!m_interFace->isValid())
{
qWarning() << qPrintable(QDBusConnection::sessionBus().lastError().message());
}
2020-12-30 15:31:36 +08:00
}
2021-02-26 11:38:22 +08:00
AppMatch::~AppMatch(){
if(m_interFace){
delete m_interFace;
m_interFace=NULL;
}
2021-02-27 00:57:47 +08:00
if(m_watchAppDir){
delete m_watchAppDir;
m_watchAppDir=NULL;
}
2021-02-26 11:38:22 +08:00
}
2021-03-01 13:28:18 +08:00
//QStringList AppMatch::startMatchApp(QString input){
// input.replace(" ","");
// m_sourceText=input;
// m_softWareCenterMap.clear();
// m_matchInstallAppMap.clear();
// m_returnResult1.clear();
// if(input.isEmpty()){
// return m_returnResult;
// }
// softWareCenterSearch();
// getAppName();
// returnAppMap();
// m_returnResult1=m_midResult;
// m_midResult.clear();
// qWarning()<<"m_returnResult :"<<m_returnResult1;
// return m_returnResult;
//}
2020-12-30 15:31:36 +08:00
2021-03-01 13:28:18 +08:00
/**
* @brief AppMatch::startMatchApp
* @param input
* @param i
* @return QMap<QString,QList<QString>> QMap<{.desktop(),()}>
*/
QMap<QString,QList<QString>> AppMatch::startMatchApp(QString input){
2021-02-26 11:21:41 +08:00
input.replace(" ","");
m_sourceText=input;
m_softWareCenterMap.clear();
m_matchInstallAppMap.clear();
m_returnResult1.clear();
if(input.isEmpty()){
return m_returnResult1;
}
softWareCenterSearch();
getAppName();
returnAppMap();
m_returnResult1=m_midResult;
m_midResult.clear();
qWarning()<<"m_returnResult :"<<m_returnResult1;
return m_returnResult1;
}
2020-12-30 21:41:00 +08:00
/**
* @brief AppMatch::getAllDesktopFilePath desktop文件
* @param path desktop文件夹
*/
2020-12-30 15:31:36 +08:00
void AppMatch::getAllDesktopFilePath(QString path){
2021-02-26 11:21:41 +08:00
char* name;
char* icon;
QStringList applist;
2020-12-30 15:31:36 +08:00
GKeyFileFlags flags=G_KEY_FILE_NONE;
GKeyFile* keyfile=g_key_file_new ();
QDir dir(path);
if (!dir.exists()) {
return;
}
dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot);
dir.setSorting(QDir::DirsFirst);
QFileInfoList list = dir.entryInfoList();
list.removeAll(QFileInfo("/usr/share/applications/screensavers"));
if(list.size()< 1 ) {
return;
}
int i=0;
//递归算法的核心部分
do{
QFileInfo fileInfo = list.at(i);
//如果是文件夹,递归
bool isDir = fileInfo.isDir();
if(isDir) {
getAllDesktopFilePath(fileInfo.filePath());
}
else{
//过滤LXQt、KDE
QString filePathStr=fileInfo.filePath();
if(filePathStr.contains("KDE",Qt::CaseInsensitive)||
filePathStr.contains("mate",Qt::CaseInsensitive)||
filePathStr.contains("LX",Qt::CaseInsensitive) ){
i++;
continue;
}
//过滤后缀不是.desktop的文件
if(!filePathStr.endsWith(".desktop"))
{
i++;
continue;
}
QByteArray fpbyte=filePathStr.toLocal8Bit();
char* filepath=fpbyte.data();
g_key_file_load_from_file(keyfile,filepath,flags,nullptr);
char* ret_1=g_key_file_get_locale_string(keyfile,"Desktop Entry","NoDisplay", nullptr, nullptr);
if(ret_1!=nullptr)
{
QString str=QString::fromLocal8Bit(ret_1);
if(str.contains("true"))
{
i++;
continue;
}
}
char* ret_2=g_key_file_get_locale_string(keyfile,"Desktop Entry","NotShowIn", nullptr, nullptr);
if(ret_2!=nullptr)
{
QString str=QString::fromLocal8Bit(ret_2);
if(str.contains("UKUI"))
{
i++;
continue;
}
}
//过滤中英文名为空的情况
QLocale cn;
QString language=cn.languageToString(cn.language());
if(QString::compare(language,"Chinese")==0)
{
char* nameCh=g_key_file_get_string(keyfile,"Desktop Entry","Name[zh_CN]", nullptr);
char* nameEn=g_key_file_get_string(keyfile,"Desktop Entry","Name", nullptr);
if(QString::fromLocal8Bit(nameCh).isEmpty() && QString::fromLocal8Bit(nameEn).isEmpty())
{
i++;
continue;
}
}
else {
char* name=g_key_file_get_string(keyfile,"Desktop Entry","Name", nullptr);
if(QString::fromLocal8Bit(name).isEmpty())
{
i++;
continue;
}
}
2021-02-26 11:21:41 +08:00
name=g_key_file_get_locale_string(keyfile,"Desktop Entry","Name", nullptr, nullptr);
icon=g_key_file_get_locale_string(keyfile,"Desktop Entry","Icon", nullptr, nullptr);
m_installAppMap.insert(QString::fromLocal8Bit(name),applist<<filePathStr<<QString::fromLocal8Bit(icon));
applist.clear();
2020-12-30 15:31:36 +08:00
m_filePathList.append(filePathStr);
}
i++;
} while(i < list.size());
g_key_file_free(keyfile);
}
2020-12-30 21:41:00 +08:00
/**
* @brief AppMatch::getDesktopFilePath
*
*/
2020-12-30 15:31:36 +08:00
void AppMatch::getDesktopFilePath()
{
m_filePathList.clear();
getAllDesktopFilePath("/usr/share/applications/");
m_filePathList.removeAll("/usr/share/applications/software-properties-livepatch.desktop");
m_filePathList.removeAll("/usr/share/applications/mate-color-select.desktop");
m_filePathList.removeAll("/usr/share/applications/blueman-adapters.desktop");
m_filePathList.removeAll("/usr/share/applications/blueman-manager.desktop");
m_filePathList.removeAll("/usr/share/applications/mate-user-guide.desktop");
m_filePathList.removeAll("/usr/share/applications/nm-connection-editor.desktop");
m_filePathList.removeAll("/usr/share/applications/debian-uxterm.desktop");
m_filePathList.removeAll("/usr/share/applications/debian-xterm.desktop");
m_filePathList.removeAll("/usr/share/applications/im-config.desktop");
m_filePathList.removeAll("/usr/share/applications/fcitx.desktop");
m_filePathList.removeAll("/usr/share/applications/fcitx-configtool.desktop");
m_filePathList.removeAll("/usr/share/applications/onboard-settings.desktop");
m_filePathList.removeAll("/usr/share/applications/info.desktop");
m_filePathList.removeAll("/usr/share/applications/ukui-power-preferences.desktop");
m_filePathList.removeAll("/usr/share/applications/ukui-power-statistics.desktop");
m_filePathList.removeAll("/usr/share/applications/software-properties-drivers.desktop");
m_filePathList.removeAll("/usr/share/applications/software-properties-gtk.desktop");
m_filePathList.removeAll("/usr/share/applications/gnome-session-properties.desktop");
m_filePathList.removeAll("/usr/share/applications/org.gnome.font-viewer.desktop");
m_filePathList.removeAll("/usr/share/applications/xdiagnose.desktop");
m_filePathList.removeAll("/usr/share/applications/gnome-language-selector.desktop");
m_filePathList.removeAll("/usr/share/applications/mate-notification-properties.desktop");
m_filePathList.removeAll("/usr/share/applications/transmission-gtk.desktop");
m_filePathList.removeAll("/usr/share/applications/mpv.desktop");
m_filePathList.removeAll("/usr/share/applications/system-config-printer.desktop");
m_filePathList.removeAll("/usr/share/applications/org.gnome.DejaDup.desktop");
m_filePathList.removeAll("/usr/share/applications/yelp.desktop");
m_filePathList.removeAll("/usr/share/applications/peony-computer.desktop");
m_filePathList.removeAll("/usr/share/applications/peony-home.desktop");
m_filePathList.removeAll("/usr/share/applications/peony-trash.desktop");
m_filePathList.removeAll("/usr/share/applications/peony.desktop");
//v10
m_filePathList.removeAll("/usr/share/applications/mate-about.desktop");
m_filePathList.removeAll("/usr/share/applications/time.desktop");
m_filePathList.removeAll("/usr/share/applications/network.desktop");
m_filePathList.removeAll("/usr/share/applications/shares.desktop");
m_filePathList.removeAll("/usr/share/applications/mate-power-statistics.desktop");
m_filePathList.removeAll("/usr/share/applications/display-im6.desktop");
m_filePathList.removeAll("/usr/share/applications/display-im6.q16.desktop");
m_filePathList.removeAll("/usr/share/applications/openjdk-8-policytool.desktop");
m_filePathList.removeAll("/usr/share/applications/kylin-io-monitor.desktop");
m_filePathList.removeAll("/usr/share/applications/wps-office-uninstall.desktop");
2021-02-26 11:21:41 +08:00
QString desktop;
QStringList applist;
QMap<QString, QList<QString>>::const_iterator i;
for(i=m_installAppMap.constBegin();i!=m_installAppMap.constEnd();++i){
applist=i.value();
if(m_filePathList.contains(applist.at(0)))
m_filterInstallAppMap.insert(i.key(),applist);
}
2020-12-30 15:31:36 +08:00
}
2020-12-30 21:41:00 +08:00
/**
* @brief AppMatch::getAppName
*
*/
2020-12-30 15:31:36 +08:00
void AppMatch::getAppName()
{
2021-02-26 11:21:41 +08:00
QMap<QString, QList<QString>>::const_iterator i;
for(i=m_filterInstallAppMap.constBegin();i!=m_filterInstallAppMap.constEnd();++i){
appNameMatch(i.key());
}
2020-12-30 15:31:36 +08:00
}
2020-12-30 21:41:00 +08:00
/**
* @brief AppMatch::appNameMatch
*
* @param appname
*
* @param desktoppath
* desktop路径
*/
2021-02-26 11:21:41 +08:00
void AppMatch::appNameMatch(QString appname){
2021-01-06 09:13:13 +08:00
if(appname.contains(m_sourceText,Qt::CaseInsensitive)){
2021-02-26 11:21:41 +08:00
m_matchInstallAppMap.insert(appname,m_filterInstallAppMap.value(appname));
2020-12-30 21:41:00 +08:00
return;
}
QString shouzimu=FileUtils::findMultiToneWords(appname).at(1);// 中文转首字母
if(shouzimu.contains(m_sourceText,Qt::CaseInsensitive)){
2021-02-26 11:21:41 +08:00
m_matchInstallAppMap.insert(appname,m_filterInstallAppMap.value(appname));
2020-12-30 21:41:00 +08:00
return;
2020-12-30 15:31:36 +08:00
}
if(m_sourceText.size()<2)
return;
QString pinyin=FileUtils::findMultiToneWords(appname).at(0);// 中文转拼音
if(pinyin.contains(m_sourceText,Qt::CaseInsensitive)){
2021-02-26 11:21:41 +08:00
m_matchInstallAppMap.insert(appname,m_filterInstallAppMap.value(appname));
}
}
void AppMatch::softWareCenterSearch(){
// 调用D-Bus接口的方法
// QDBusPendingCall pcall = m_interFace->asyncCall("get_search_result", m_sourceText);
// 设置等待异步消息的信号槽
// QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(pcall, nullptr);
// QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, &AppMatch::slotDBusCallFinished);
slotDBusCallFinished();
}
void AppMatch::slotDBusCallFinished()
{
QDBusReply<QList<QMap<QString,QString>>> reply = m_interFace->call("get_search_result",m_sourceText); //阻塞,直到远程方法调用完成。
// QDBusPendingReply<QList<QMap<QString,QString>>> reply = *call;
if (reply.isValid())
{
parseSoftWareCenterReturn(reply.value());
}
else
{
qWarning() << "value method called failed!";
}
// call->deleteLater();
}
void AppMatch::parseSoftWareCenterReturn(QList<QMap<QString,QString>> list){
// qWarning()<<list;
QString appname;
QString appicon;
QStringList applist;
for(int i=0;i<list.size();i++){
// qWarning()<<list.at(i).keys();
appname=list.at(i).value("appname");
appicon=list.at(i).value("icon");
m_softWareCenterMap.insert(appname,applist<<""<<appicon);
applist.clear();
2020-12-30 15:31:36 +08:00
}
}
2021-02-26 11:21:41 +08:00
void AppMatch::getInstalledAppsVersion(QString appname){
// qWarning()<<"apt show "+appname;
// m_versionCommand->start("apt show "+appname);
// m_versionCommand->startDetached(m_versionCommand->program());
// m_versionCommand->waitForFinished();
// connect(m_versionCommand,&QProcess::readyReadStandardOutput,this,[=](){
// QString result=m_versionCommand->readAllStandardOutput();
// if(!result.isEmpty()){
// QStringList strlist=result.split("\n");
// QString str=strlist.at(1);
// if(!str.contains("Version")){
// return;
// }
// qWarning()<<strlist.at(1);
// qWarning()<<"-----------------------------------------------";
// }
// });
// m_versionCommand->close();
}
void AppMatch::returnAppMap(){
QMap<QString, QList<QString>>::const_iterator i;
for(i=m_matchInstallAppMap.constBegin();i!=m_matchInstallAppMap.constEnd();++i){
m_midResult.insert(i.key(),i.value());
}
QMap<QString, QList<QString>>::const_iterator j;
for(j=m_softWareCenterMap.constBegin();j!=m_softWareCenterMap.constEnd();++j){
m_midResult.insert(j.key(),j.value());
}
}