From 5e818464c84129fe894c719b61a82fbfe16e70f6 Mon Sep 17 00:00:00 2001 From: baijunjie Date: Fri, 8 Apr 2022 11:15:18 +0800 Subject: [PATCH] Story#8966:the '/data' directory can be searched by direct search. --- libsearch/dirwatcher/dir-watcher.cpp | 67 +++++++++++++++++----------- libsearch/dirwatcher/dir-watcher.h | 4 ++ libsearch/index/search-manager.cpp | 15 +++++-- 3 files changed, 57 insertions(+), 29 deletions(-) diff --git a/libsearch/dirwatcher/dir-watcher.cpp b/libsearch/dirwatcher/dir-watcher.cpp index 0776bf7..33a1358 100644 --- a/libsearch/dirwatcher/dir-watcher.cpp +++ b/libsearch/dirwatcher/dir-watcher.cpp @@ -6,6 +6,8 @@ #include #include #include +#include + static std::once_flag flag; static DirWatcher *global_intance = nullptr; @@ -36,17 +38,15 @@ DirWatcher *DirWatcher::getDirWatcher() QStringList DirWatcher::currentindexableDir() { - s_mutex.lock(); + QMutexLocker locker(&s_mutex); QStringList indexableDirList = m_indexableDirList; - s_mutex.unlock(); return indexableDirList; } QStringList DirWatcher::currentBlackListOfIndex() { - s_mutex.lock(); + QMutexLocker locker(&s_mutex); QStringList blackListOfIndex = m_blackListOfIndex; - s_mutex.unlock(); return blackListOfIndex; } @@ -59,7 +59,7 @@ QStringList DirWatcher::blackListOfDir(const QString &dirPath) //new TODO: Optimize the search algorithm. //There is no processing for the subvolumes.May be a bug. QStringList blackListOfDir; - s_mutex.lock(); + QMutexLocker locker(&s_mutex); for (auto t = m_repeatedlyMountedDeviceInfo.constBegin(); t != m_repeatedlyMountedDeviceInfo.constEnd(); t++) { QString topRepeatedMountPoint; for (QString mountPoint: t.value()) { @@ -76,40 +76,59 @@ QStringList DirWatcher::blackListOfDir(const QString &dirPath) } } } - s_mutex.unlock(); + for (auto i = m_infoOfSubvolume.constBegin(); i != m_infoOfSubvolume.constEnd(); i++) { + QString mountPoint = i.value(); + QString spec = i.key(); + //排除搜索列表指定多个目录时子卷会重复包含的情况,比如同时指定/home和/data/home + QString tmp = dirPath; + if (dirPath.startsWith(mountPoint)) { + blackListOfDir.append(tmp.replace(0, mountPoint.length(), spec)); + } + if (dirPath.startsWith(spec)) { + blackListOfDir.append(tmp.replace(0, spec.length(), mountPoint)); + } + } return blackListOfDir; } void DirWatcher::appendBlackListItemOfIndex(const QString &path) { - s_mutex.lock(); + QMutexLocker locker(&s_mutex); m_blackListOfIndex.append(path); m_blackListOfIndex = m_blackListOfIndex.toSet().toList(); - s_mutex.unlock(); } void DirWatcher::appendBlackListItemOfIndex(const QStringList &pathList) { - s_mutex.lock(); + QMutexLocker locker(&s_mutex); m_blackListOfIndex.append(pathList); m_blackListOfIndex = m_blackListOfIndex.toSet().toList(); - s_mutex.unlock(); } void DirWatcher::removeBlackListItemOfIndex(const QString &path) { - s_mutex.lock(); + QMutexLocker locker(&s_mutex); m_blackListOfIndex.removeAll(path); - s_mutex.unlock(); } void DirWatcher::removeBlackListItemOfIndex(const QStringList &pathList) { - s_mutex.lock(); + QMutexLocker locker(&s_mutex); for (QString path: pathList) { m_blackListOfIndex.removeAll(path); } - s_mutex.unlock(); +} + +QStringList DirWatcher::currentSearchableDir() +{ + QMutexLocker locker(&s_mutex); + return m_searchableDirList; +} + +QStringList DirWatcher::searchableDirForSearchApplication() +{ + QMutexLocker locker(&s_mutex); + return m_searchableListForApplication; } void DirWatcher::mountAddCallback(GVolumeMonitor *monitor, GMount *gmount, DirWatcher *pThis) @@ -121,7 +140,7 @@ void DirWatcher::mountAddCallback(GVolumeMonitor *monitor, GMount *gmount, DirWa void DirWatcher::mountRemoveCallback(GVolumeMonitor *monitor, GMount *gmount, DirWatcher *pThis) { qDebug() << "Mount Removed"; - s_mutex.lock(); + QMutexLocker locker(&s_mutex); //处理u盘设备 if (pThis->m_removedUDiskDevice != NULL) { pThis->m_currentUDiskDeviceInfo.remove(pThis->m_removedUDiskDevice); @@ -130,7 +149,6 @@ void DirWatcher::mountRemoveCallback(GVolumeMonitor *monitor, GMount *gmount, Di qDebug() << "m_currentUDiskDeviceInfo:" << pThis->m_currentUDiskDeviceInfo; qDebug() << "m_blackListOfIndex:" << pThis->m_blackListOfIndex; pThis->m_removedUDiskDevice = ""; - s_mutex.unlock(); return; } @@ -138,12 +156,10 @@ void DirWatcher::mountRemoveCallback(GVolumeMonitor *monitor, GMount *gmount, Di GFile* rootFile; rootFile = g_mount_get_root(mount); if (!rootFile) { - s_mutex.unlock(); return; } QString mountPoint = g_file_get_uri(rootFile); if (mountPoint.isEmpty()) { - s_mutex.unlock(); return; } //处理uri转码,处理子卷情况 @@ -158,13 +174,11 @@ void DirWatcher::mountRemoveCallback(GVolumeMonitor *monitor, GMount *gmount, Di pThis->m_blackListOfIndex.removeAll(removedMountPoint.replace(t.key(), t.value())); } } - s_mutex.unlock(); qDebug() << "m_currentMountedDeviceInfo:" << pThis->m_currentMountedDeviceInfo; qDebug() << "m_repeatedlyMountedDeviceInfo:" << pThis->m_repeatedlyMountedDeviceInfo; qDebug() << "m_currentUDiskDeviceInfo:" << pThis->m_currentUDiskDeviceInfo; qDebug() << "m_blackListOfIndex:" << pThis->m_blackListOfIndex; } else { - s_mutex.unlock(); qWarning() << "There's someting wrong with the MountPoint!"; } g_object_unref(rootFile); @@ -176,6 +190,10 @@ void DirWatcher::initData() m_indexableDirList << "/data" << QDir::homePath(); m_blackListOfIndex << "/data/home" << "/data/root"; + //目前方案:可搜索目录(服务)默认根目录,可搜索目录(应用)默认家目录和/data目录 + m_searchableListForApplication << "/data" << QDir::homePath(); + m_searchableDirList << "/"; + //init auto mounted device list setfsent(); while (1) { @@ -225,7 +243,7 @@ void DirWatcher::initDiskWatcher() void DirWatcher::handleDisk() { //init current mounted device info - s_mutex.lock(); + QMutexLocker locker(&s_mutex); m_currentMountedDeviceInfo.clear(); for (QStorageInfo &storage: QStorageInfo::mountedVolumes()) { if (storage.isValid() && storage.isReady() && QString(storage.device()).contains(QRegExp("/sd[a-z][1-9]"))) { @@ -270,17 +288,15 @@ void DirWatcher::handleDisk() qDebug() << "m_currentUDiskDeviceInfo:" << m_currentUDiskDeviceInfo; qDebug() << "m_blackListOfIndex:" << m_blackListOfIndex; - s_mutex.unlock(); } void DirWatcher::handleAddedUDiskDevice(QDBusMessage msg) { QDBusObjectPath objPath = msg.arguments().at(0).value(); if (objPath.path().contains(QRegExp("/sd[a-z][1-9]"))) { - s_mutex.lock(); + QMutexLocker locker(&s_mutex); m_addedUDiskDeviceList.append(objPath.path().section("/",-1)); qDebug() << "Add Udisk:" << m_addedUDiskDeviceList; - s_mutex.unlock(); } } @@ -289,9 +305,8 @@ void DirWatcher::handleRemovedUDiskDevice(QDBusMessage msg) Q_EMIT this->udiskRemoved(); QDBusObjectPath objPath = msg.arguments().at(0).value(); if (objPath.path().contains(QRegExp("/sd[a-z][1-9]"))) { - s_mutex.lock(); + QMutexLocker locker(&s_mutex); m_removedUDiskDevice = objPath.path().section("/",-1); m_addedUDiskDeviceList.removeAll(m_removedUDiskDevice); - s_mutex.unlock(); } } diff --git a/libsearch/dirwatcher/dir-watcher.h b/libsearch/dirwatcher/dir-watcher.h index a13debf..410844a 100644 --- a/libsearch/dirwatcher/dir-watcher.h +++ b/libsearch/dirwatcher/dir-watcher.h @@ -27,6 +27,8 @@ public: void removeBlackListItemOfIndex(const QString &path); void removeBlackListItemOfIndex(const QStringList &pathList); + QStringList currentSearchableDir(); + QStringList searchableDirForSearchApplication(); QStringList blackListOfDir(const QString &dirPath); static void mountAddCallback(GVolumeMonitor *monitor, GMount *gmount, DirWatcher *pThis); @@ -49,6 +51,8 @@ private: QStringList m_blackListOfIndex; QStringList m_indexableDirList; + QStringList m_searchableDirList; + QStringList m_searchableListForApplication; QStringList m_autoMountList; QMultiMap m_infoOfSubvolume; QMap m_currentMountedDeviceInfo; diff --git a/libsearch/index/search-manager.cpp b/libsearch/index/search-manager.cpp index 7024c92..2543943 100644 --- a/libsearch/index/search-manager.cpp +++ b/libsearch/index/search-manager.cpp @@ -18,6 +18,7 @@ * */ #include "search-manager.h" +#include "dir-watcher.h" using namespace UkuiSearch; size_t SearchManager::uniqueSymbolFile = 0; @@ -523,11 +524,19 @@ DirectSearch::DirectSearch(QString keyword, DataQueuegetBlockDirs(); - if(blockList.contains(QStandardPaths::writableLocation(QStandardPaths::HomeLocation).remove(0,1), Qt::CaseSensitive)) { + QStringList searchPath = DirWatcher::getDirWatcher()->searchableDirForSearchApplication(); + QQueue bfs; + for (const QString &path : searchPath) { + if (blockList.contains(path)) { + continue; + } + blockList.append(DirWatcher::getDirWatcher()->blackListOfDir(path)); + bfs.enqueue(path); + } + if (bfs.isEmpty()) { return; } - QQueue bfs; - bfs.enqueue(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); + QFileInfoList list; QDir dir; // QDir::Hidden