X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/32764c9696bcdbaf8136e47376ec6fe7a1c8ce05..c8d8556950005dfd96ebdb41d2f43ad90356367c:/src/search/filenamesearchprotocol.cpp diff --git a/src/search/filenamesearchprotocol.cpp b/src/search/filenamesearchprotocol.cpp index d2391874c..4d6f59fa4 100644 --- a/src/search/filenamesearchprotocol.cpp +++ b/src/search/filenamesearchprotocol.cpp @@ -19,12 +19,12 @@ #include "filenamesearchprotocol.h" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include @@ -34,20 +34,19 @@ FileNameSearchProtocol::FileNameSearchProtocol( const QByteArray &pool, const QByteArray &app ) : SlaveBase("search", pool, app), m_checkContent(false), - m_regExp(0) + m_regExp(0), + m_iteratedDirs() { } FileNameSearchProtocol::~FileNameSearchProtocol() { - delete m_regExp; - m_regExp = 0; + cleanup(); } void FileNameSearchProtocol::listDir(const KUrl& url) { - delete m_regExp; - m_regExp = 0; + cleanup(); const QString search = url.queryItem("search"); if (!search.isEmpty()) { @@ -63,11 +62,17 @@ void FileNameSearchProtocol::listDir(const KUrl& url) const QString urlString = url.queryItem("url"); searchDirectory(KUrl(urlString)); + cleanup(); finished(); } void FileNameSearchProtocol::searchDirectory(const KUrl& directory) { + if (directory.path() == QLatin1String("/proc")) { + // Don't try to iterate the /proc directory of Linux + return; + } + // Get all items of the directory KDirLister *dirLister = new KDirLister(); dirLister->setDelayedMimeTypes(false); @@ -84,7 +89,7 @@ void FileNameSearchProtocol::searchDirectory(const KUrl& directory) const KFileItemList items = dirLister->items(); foreach (const KFileItem& item, items) { bool addItem = false; - if ((m_regExp == 0) || item.name().contains(*m_regExp)) { + if (!m_regExp || item.name().contains(*m_regExp)) { addItem = true; } else if (m_checkContent && item.mimetype().startsWith(QLatin1String("text/"))) { addItem = contentContainsPattern(item.url()); @@ -97,11 +102,25 @@ void FileNameSearchProtocol::searchDirectory(const KUrl& directory) } if (item.isDir()) { - pendingDirs.append(item.url()); + if (item.isLink()) { + // Assure that no endless searching is done in directories that + // have already been iterated. + const KUrl linkDest(item.url(), item.linkDest()); + if (!m_iteratedDirs.contains(linkDest.path())) { + pendingDirs.append(linkDest); + } + } else { + pendingDirs.append(item.url()); + } } } listEntry(KIO::UDSEntry(), true); + m_iteratedDirs.insert(directory.path()); + + delete dirLister; + dirLister = 0; + // Recursively iterate all sub directories foreach (const KUrl& pendingDir, pendingDirs) { searchDirectory(pendingDir); @@ -110,7 +129,7 @@ void FileNameSearchProtocol::searchDirectory(const KUrl& directory) bool FileNameSearchProtocol::contentContainsPattern(const KUrl& fileName) const { - Q_ASSERT(m_regExp != 0); + Q_ASSERT(m_regExp); QString path; KTemporaryFile tempFile; @@ -148,6 +167,13 @@ bool FileNameSearchProtocol::contentContainsPattern(const KUrl& fileName) const return false; } +void FileNameSearchProtocol::cleanup() +{ + delete m_regExp; + m_regExp = 0; + m_iteratedDirs.clear(); +} + extern "C" int KDE_EXPORT kdemain( int argc, char **argv ) { KComponentData instance("kio_search");