diff --git a/libsearch/appsearch/app-match.cpp b/libsearch/appsearch/app-match.cpp index c2815b0..3ad1ee2 100644 --- a/libsearch/appsearch/app-match.cpp +++ b/libsearch/appsearch/app-match.cpp @@ -21,6 +21,7 @@ #include #include "file-utils.h" #include "app-search-plugin.h" +#define ANDROID_APP_DESKTOP_PATH QDir::homePath() + "/.local/share/applications/" using namespace Zeeker; static AppMatch *app_match_Class = nullptr; @@ -35,10 +36,11 @@ AppMatch::AppMatch(QObject *parent) : QThread(parent) { m_watchAppDir = new QFileSystemWatcher(this); m_watchAppDir->addPath("/usr/share/applications/"); - QDir androidPath(QDir::homePath() + "/.local/share/applications/"); - if(androidPath.exists()) { - m_watchAppDir->addPath(QDir::homePath() + "/.local/share/applications/"); + QDir androidPath(ANDROID_APP_DESKTOP_PATH); + if(!androidPath.exists()) { + androidPath.mkpath(ANDROID_APP_DESKTOP_PATH); } + m_watchAppDir->addPath(ANDROID_APP_DESKTOP_PATH); qDBusRegisterMetaType>(); qDBusRegisterMetaType>>(); m_interFace = new QDBusInterface("com.kylin.softwarecenter.getsearchresults", "/com/kylin/softwarecenter/getsearchresults", @@ -76,7 +78,6 @@ void AppMatch::getAllDesktopFilePath(QString path) { char* name; char* icon; - QStringList applist; GKeyFileFlags flags = G_KEY_FILE_NONE; GKeyFile* keyfile = g_key_file_new(); @@ -154,9 +155,14 @@ void AppMatch::getAllDesktopFilePath(QString path) { icon = g_key_file_get_locale_string(keyfile, "Desktop Entry", "Icon", nullptr, nullptr); if(!m_filePathList.contains(filePathStr)) { NameString appname; + QStringList appInfolist; + appname.app_name = QString::fromLocal8Bit(name); - m_installAppMap.insert(appname, applist << filePathStr << QString::fromLocal8Bit(icon) << "" << ""); - applist.clear(); + appInfolist << filePathStr << QString::fromLocal8Bit(icon); + appInfolist.append(QString::fromLocal8Bit(g_key_file_get_string(keyfile, "Desktop Entry", "Name", nullptr))); + appInfolist.append(QString::fromLocal8Bit(g_key_file_get_string(keyfile, "Desktop Entry", "Name[zh_CN]", nullptr))); + + m_installAppMap.insert(appname, appInfolist); } // m_filePathList.append(filePathStr); } @@ -251,9 +257,12 @@ void AppMatch::appNameMatch(QString keyWord, size_t uniqueSymbol, DataQueueenqueue(ri); + AppSearchPlugin::m_mutex.unlock(); } else { + AppSearchPlugin::m_mutex.unlock(); break; } // installed.insert(name, list); @@ -268,9 +277,12 @@ void AppMatch::appNameMatch(QString keyWord, size_t uniqueSymbol, DataQueueenqueue(ri); + AppSearchPlugin::m_mutex.unlock(); } else { + AppSearchPlugin::m_mutex.unlock(); break; } // installed.insert(name, list); @@ -281,16 +293,37 @@ void AppMatch::appNameMatch(QString keyWord, size_t uniqueSymbol, DataQueueenqueue(ri); + AppSearchPlugin::m_mutex.unlock(); } else { + AppSearchPlugin::m_mutex.lock(); break; } // installed.insert(name, list); break; } } + QStringList tmpList; + tmpList << iter.value().at(2) << iter.value().at(3); + for(QString s : tmpList) { + if(s.contains(keyWord, Qt::CaseInsensitive)) { + SearchPluginIface::ResultInfo ri; + AppSearchPlugin::m_mutex.lock(); + creatResultInfo(ri, iter, true); + if (uniqueSymbol == AppSearchPlugin::uniqueSymbol) { + searchResult->enqueue(ri); + AppSearchPlugin::m_mutex.unlock(); + } else { + AppSearchPlugin::m_mutex.unlock(); + break; + } + // installed.insert(name, list); + continue; + } + } } } @@ -331,9 +364,12 @@ void AppMatch::parseSoftWareCenterReturn(QList> list, siz ri.description.append(di); ri.actionKey = list.at(i).value("appname"); ri.type = 1; //1 means not installed apps. + AppSearchPlugin::m_mutex.lock(); if (uniqueSymbol == AppSearchPlugin::uniqueSymbol) { searchResult->enqueue(ri); + AppSearchPlugin::m_mutex.unlock(); } else { + AppSearchPlugin::m_mutex.unlock(); break; } } @@ -371,18 +407,12 @@ void AppMatch::run() { qDebug() << "AppMatch is run"; this->getDesktopFilePath(); this->getAllDesktopFilePath("/usr/share/applications/"); - QDir androidPath(QDir::homePath() + "/.local/share/applications/"); - if(androidPath.exists()) - this->getAllDesktopFilePath(QDir::homePath() + "/.local/share/applications/"); - connect(m_watchAppDir, &QFileSystemWatcher::directoryChanged, this, [ = ](const QString & path) { - this->getDesktopFilePath(); + this->getAllDesktopFilePath(ANDROID_APP_DESKTOP_PATH); + connect(m_watchAppDir, &QFileSystemWatcher::directoryChanged, this, [ = ](const QString & path) { if(path == "/usr/share/applications/") { this->getAllDesktopFilePath("/usr/share/applications/"); - } - if(androidPath.exists()) { - if(path == QDir::homePath() + "/.local/share/applications/") { - this->getAllDesktopFilePath(QDir::homePath() + "/.local/share/applications/"); - } + } else if(path == ANDROID_APP_DESKTOP_PATH) { + this->getAllDesktopFilePath(ANDROID_APP_DESKTOP_PATH); } }); } diff --git a/libsearch/index/file-search-plugin.cpp b/libsearch/index/file-search-plugin.cpp index 0167870..699535b 100644 --- a/libsearch/index/file-search-plugin.cpp +++ b/libsearch/index/file-search-plugin.cpp @@ -33,17 +33,17 @@ QString FileSearchPlugin::getPluginName() void Zeeker::FileSearchPlugin::KeywordSearch(QString keyword, DataQueue *searchResult) { - SearchManager::m_mutex1.lock(); - ++SearchManager::uniqueSymbol1; - SearchManager::m_mutex1.unlock(); + SearchManager::m_mutexFile.lock(); + ++SearchManager::uniqueSymbolFile; + SearchManager::m_mutexFile.unlock(); if(FileUtils::SearchMethod::DIRECTSEARCH == FileUtils::searchMethod) { DirectSearch *directSearch; - directSearch = new DirectSearch(keyword, searchResult, FILE_SEARCH_VALUE, SearchManager::uniqueSymbol1); + directSearch = new DirectSearch(keyword, searchResult, FILE_SEARCH_VALUE, SearchManager::uniqueSymbolFile); m_pool.start(directSearch); } else if(FileUtils::SearchMethod::INDEXSEARCH == FileUtils::searchMethod) { FileSearch *filesearch; - filesearch = new FileSearch(searchResult, SearchManager::uniqueSymbol1, keyword, FILE_SEARCH_VALUE, 1, 0, 5); + filesearch = new FileSearch(searchResult, SearchManager::uniqueSymbolFile, keyword, FILE_SEARCH_VALUE, 1, 0, 5); m_pool.start(filesearch); } } @@ -222,17 +222,17 @@ QString DirSearchPlugin::getPluginName() void Zeeker::DirSearchPlugin::KeywordSearch(QString keyword, DataQueue *searchResult) { - SearchManager::m_mutex2.lock(); - ++SearchManager::uniqueSymbol2; - SearchManager::m_mutex2.unlock(); + SearchManager::m_mutexDir.lock(); + ++SearchManager::uniqueSymbolDir; + SearchManager::m_mutexDir.unlock(); if(FileUtils::SearchMethod::DIRECTSEARCH == FileUtils::searchMethod) { DirectSearch *directSearch; - directSearch = new DirectSearch(keyword, searchResult, DIR_SEARCH_VALUE, SearchManager::uniqueSymbol2); + directSearch = new DirectSearch(keyword, searchResult, DIR_SEARCH_VALUE, SearchManager::uniqueSymbolDir); m_pool.start(directSearch); } else if(FileUtils::SearchMethod::INDEXSEARCH == FileUtils::searchMethod) { FileSearch *filesearch; - filesearch = new FileSearch(searchResult, SearchManager::uniqueSymbol2, keyword, DIR_SEARCH_VALUE, 1, 0, 5); + filesearch = new FileSearch(searchResult, SearchManager::uniqueSymbolDir, keyword, DIR_SEARCH_VALUE, 1, 0, 5); m_pool.start(filesearch); } } @@ -402,16 +402,16 @@ QString FileContengSearchPlugin::getPluginName() void Zeeker::FileContengSearchPlugin::KeywordSearch(QString keyword, DataQueue *searchResult) { - SearchManager::m_mutex3.lock(); - ++SearchManager::uniqueSymbol3; - SearchManager::m_mutex3.unlock(); + SearchManager::m_mutexContent.lock(); + ++SearchManager::uniqueSymbolContent; + SearchManager::m_mutexContent.unlock(); m_keyWord = keyword; if(FileUtils::SearchMethod::DIRECTSEARCH == FileUtils::searchMethod) { return; } else if(FileUtils::SearchMethod::INDEXSEARCH == FileUtils::searchMethod) { FileContentSearch *fileContentSearch; - fileContentSearch = new FileContentSearch(searchResult, SearchManager::uniqueSymbol3, keyword, 0, 5); + fileContentSearch = new FileContentSearch(searchResult, SearchManager::uniqueSymbolContent, keyword, 0, 5); m_pool.start(fileContentSearch); } } diff --git a/libsearch/index/search-manager.cpp b/libsearch/index/search-manager.cpp index acccf8f..f9068c5 100644 --- a/libsearch/index/search-manager.cpp +++ b/libsearch/index/search-manager.cpp @@ -18,14 +18,13 @@ * */ #include "search-manager.h" - using namespace Zeeker; -size_t SearchManager::uniqueSymbol1 = 0; -size_t SearchManager::uniqueSymbol2 = 0; -size_t SearchManager::uniqueSymbol3 = 0; -QMutex SearchManager::m_mutex1; -QMutex SearchManager::m_mutex2; -QMutex SearchManager::m_mutex3; +size_t SearchManager::uniqueSymbolFile = 0; +size_t SearchManager::uniqueSymbolDir = 0; +size_t SearchManager::uniqueSymbolContent = 0; +QMutex SearchManager::m_mutexFile; +QMutex SearchManager::m_mutexDir; +QMutex SearchManager::m_mutexContent; SearchManager::SearchManager(QObject *parent) : QObject(parent) { m_pool.setMaxThreadCount(3); m_pool.setExpiryTimeout(1000); @@ -46,31 +45,30 @@ int SearchManager::getCurrentIndexCount() { void SearchManager::onKeywordSearch(QString keyword, QQueue *searchResultFile, QQueue *searchResultDir, QQueue> *searchResultContent) { - m_mutex1.lock(); - ++uniqueSymbol1; - m_mutex1.unlock(); - m_mutex2.lock(); - ++uniqueSymbol2; - m_mutex2.unlock(); - m_mutex3.lock(); - ++uniqueSymbol3; - m_mutex3.unlock(); - +// m_mutexFile.lock(); +// ++uniqueSymbolFile; +// m_mutexFile.unlock(); +// m_mutexDir.lock(); +// ++uniqueSymbolDir; +// m_mutexDir.unlock(); +// m_mutexContent.lock(); +// ++uniqueSymbolContent; +// m_mutexContent.unlock(); // if(FileUtils::SearchMethod::DIRECTSEARCH == FileUtils::searchMethod) { // DirectSearch *directSearch; -// directSearch = new DirectSearch(keyword, searchResultFile, searchResultDir, uniqueSymbol1); +// directSearch = new DirectSearch(keyword, searchResultFile, searchResultDir, uniqueSymbolFile); // m_pool.start(directSearch); // } else if(FileUtils::SearchMethod::INDEXSEARCH == FileUtils::searchMethod) { // FileSearch *filesearch; -// filesearch = new FileSearch(searchResultFile, uniqueSymbol1, keyword, "0", 1, 0, 5); +// filesearch = new FileSearch(searchResultFile, uniqueSymbolFile, keyword, "0", 1, 0, 5); // m_pool.start(filesearch); // FileSearch *dirsearch; -// dirsearch = new FileSearch(searchResultDir, uniqueSymbol2, keyword, "1", 1, 0, 5); +// dirsearch = new FileSearch(searchResultDir, uniqueSymbolDir, keyword, "1", 1, 0, 5); // m_pool.start(dirsearch); // FileContentSearch *contentSearch; -// contentSearch = new FileContentSearch(searchResultContent, uniqueSymbol3, keyword, 0, 5); +// contentSearch = new FileContentSearch(searchResultContent, uniqueSymbolContent, keyword, 0, 5); // m_pool.start(contentSearch); // } else { // qWarning() << "Unknown search method! FileUtils::searchMethod: " << static_cast(FileUtils::searchMethod); @@ -119,9 +117,20 @@ FileSearch::~FileSearch() { } void FileSearch::run() { - if(!m_search_result->isEmpty()) { - m_search_result->clear(); + if(m_value == "0") { + SearchManager::m_mutexFile.lock(); + if(!m_search_result->isEmpty()) { + m_search_result->clear(); + } + SearchManager::m_mutexFile.unlock(); + } else if(m_value == "1") { + SearchManager::m_mutexDir.lock(); + if(!m_search_result->isEmpty()) { + m_search_result->clear(); + } + SearchManager::m_mutexDir.unlock(); } + int resultCount = 0; int total = 0; while(total < 100) { @@ -197,23 +206,23 @@ int FileSearch::getResult(Xapian::MSet &result) { if(SearchManager::creatResultInfo(ri, path)) { switch(m_value.toInt()) { case 1: - SearchManager::m_mutex1.lock(); - if(m_uniqueSymbol == SearchManager::uniqueSymbol2) { + SearchManager::m_mutexDir.lock(); + if(m_uniqueSymbol == SearchManager::uniqueSymbolDir) { m_search_result->enqueue(ri); - SearchManager::m_mutex1.unlock(); + SearchManager::m_mutexDir.unlock(); } else { - SearchManager::m_mutex1.unlock(); + SearchManager::m_mutexDir.unlock(); return -1; } break; case 0: - SearchManager::m_mutex2.lock(); - if(m_uniqueSymbol == SearchManager::uniqueSymbol1) { + SearchManager::m_mutexFile.lock(); + if(m_uniqueSymbol == SearchManager::uniqueSymbolFile) { m_search_result->enqueue(ri); - SearchManager::m_mutex2.unlock(); + SearchManager::m_mutexFile.unlock(); } else { - SearchManager::m_mutex2.unlock(); + SearchManager::m_mutexFile.unlock(); return -1; } break; @@ -243,9 +252,11 @@ FileContentSearch::~FileContentSearch() { } void FileContentSearch::run() { + SearchManager::m_mutexContent.lock(); if(!m_search_result->isEmpty()) { m_search_result->clear(); } + SearchManager::m_mutexContent.unlock(); int resultCount = 0; int total = 0; @@ -396,14 +407,15 @@ int FileContentSearch::getResult(Xapian::MSet &result, std::string &keyWord) { // QString().swap(snippet); // } - SearchManager::m_mutex3.lock(); - if(m_uniqueSymbol == SearchManager::uniqueSymbol3) { + + SearchManager::m_mutexContent.lock(); + if(m_uniqueSymbol == SearchManager::uniqueSymbolContent) { m_search_result->enqueue(ri); - SearchManager::m_mutex3.unlock(); + SearchManager::m_mutexContent.unlock(); // snippets.clear(); // QStringList().swap(snippets); } else { - SearchManager::m_mutex3.unlock(); + SearchManager::m_mutexContent.unlock(); return -1; } // searchResult.insert(path,snippets); @@ -441,7 +453,6 @@ void DirectSearch::run() { list = dir.entryInfoList(); for (auto i : list) { if (i.isDir() && (!(i.isSymLink()))) { - bool findIndex = false; for (QString j : blockList) { if (FileUtils::isOrUnder(i.absoluteFilePath(), j)) { @@ -449,30 +460,39 @@ void DirectSearch::run() { break; } } - if (findIndex == true) { qDebug() << "path is blocked:" << i.absoluteFilePath(); continue; } - bfs.enqueue(i.absoluteFilePath()); } if(i.fileName().contains(m_keyword, Qt::CaseInsensitive)) { // qWarning() << i.fileName() << m_keyword; if(m_searchResult->length() > 49) return; - if((i.isDir() && m_value == DIR_SEARCH_VALUE) || (i.isFile() && m_value == FILE_SEARCH_VALUE)) { + if((i.isDir() && m_value == DIR_SEARCH_VALUE)) { SearchPluginIface::ResultInfo ri; if(SearchManager::creatResultInfo(ri,i.absoluteFilePath())) { - SearchManager::m_mutex1.lock(); - if(m_uniqueSymbol == SearchManager::uniqueSymbol1) { + SearchManager::m_mutexDir.lock(); + if(m_uniqueSymbol == SearchManager::uniqueSymbolDir) { m_searchResult->enqueue(ri); - SearchManager::m_mutex1.unlock(); + SearchManager::m_mutexDir.unlock(); } else { - SearchManager::m_mutex1.unlock(); + SearchManager::m_mutexDir.unlock(); + return; + } + } + } else if (i.isFile() && m_value == FILE_SEARCH_VALUE) { + SearchPluginIface::ResultInfo ri; + if(SearchManager::creatResultInfo(ri,i.absoluteFilePath())) { + SearchManager::m_mutexFile.lock(); + if(m_uniqueSymbol == SearchManager::uniqueSymbolFile) { + m_searchResult->enqueue(ri); + SearchManager::m_mutexFile.unlock(); + } else { + SearchManager::m_mutexFile.unlock(); return; } - } } } diff --git a/libsearch/index/search-manager.h b/libsearch/index/search-manager.h index e458a47..773f1d7 100644 --- a/libsearch/index/search-manager.h +++ b/libsearch/index/search-manager.h @@ -57,12 +57,12 @@ public: static int getCurrentIndexCount(); - static size_t uniqueSymbol1; - static size_t uniqueSymbol2; - static size_t uniqueSymbol3; - static QMutex m_mutex1; - static QMutex m_mutex2; - static QMutex m_mutex3; + static size_t uniqueSymbolFile; + static size_t uniqueSymbolDir; + static size_t uniqueSymbolContent; + static QMutex m_mutexFile; + static QMutex m_mutexDir; + static QMutex m_mutexContent; public Q_SLOTS: void onKeywordSearch(QString keyword, QQueue *searchResultFile, QQueue *searchResultDir, QQueue> *searchResultContent); diff --git a/src/search-result.cpp b/src/search-result.cpp index fdf5d7e..00e87ca 100644 --- a/src/search-result.cpp +++ b/src/search-result.cpp @@ -44,31 +44,31 @@ void SearchResult::run() { int emptyLists = 0; while(!isInterruptionRequested()) { emptyLists = 0; - m_mainwindow->m_searcher->m_mutex1.lock(); + m_mainwindow->m_searcher->m_mutexFile.lock(); if(!m_mainwindow->m_search_result_file->isEmpty()) { Q_EMIT this->searchResultFile(m_mainwindow->m_search_result_file->dequeue()); - m_mainwindow->m_searcher->m_mutex1.unlock(); + m_mainwindow->m_searcher->m_mutexFile.unlock(); } else { emptyLists ++; - m_mainwindow->m_searcher->m_mutex1.unlock(); + m_mainwindow->m_searcher->m_mutexFile.unlock(); } - m_mainwindow->m_searcher->m_mutex2.lock(); + m_mainwindow->m_searcher->m_mutexDir.lock(); if(!m_mainwindow->m_search_result_dir->isEmpty()) { Q_EMIT this->searchResultDir(m_mainwindow->m_search_result_dir->dequeue()); - m_mainwindow->m_searcher->m_mutex2.unlock(); + m_mainwindow->m_searcher->m_mutexDir.unlock(); } else { emptyLists ++; - m_mainwindow->m_searcher->m_mutex2.unlock(); + m_mainwindow->m_searcher->m_mutexDir.unlock(); } - m_mainwindow->m_searcher->m_mutex3.lock(); + m_mainwindow->m_searcher->m_mutexContent.lock(); // if (!m_mainwindow->m_search_result_content->isEmpty()) // qDebug() << m_mainwindow->m_search_result_content->head(); if(!m_mainwindow->m_search_result_content->isEmpty()) { Q_EMIT this->searchResultContent(m_mainwindow->m_search_result_content->dequeue()); - m_mainwindow->m_searcher->m_mutex3.unlock(); + m_mainwindow->m_searcher->m_mutexContent.unlock(); } else { emptyLists ++; - m_mainwindow->m_searcher->m_mutex3.unlock(); + m_mainwindow->m_searcher->m_mutexContent.unlock(); } if(m_timer->isActive() && m_timer->remainingTime() < 0.01) { this->requestInterruption();