X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/32764c9696bcdbaf8136e47376ec6fe7a1c8ce05..01e4f60a0931aba506b184d384a4e2f926b2233c:/src/search/filenamesearchprotocol.cpp diff --git a/src/search/filenamesearchprotocol.cpp b/src/search/filenamesearchprotocol.cpp index d2391874c..b56a99580 100644 --- a/src/search/filenamesearchprotocol.cpp +++ b/src/search/filenamesearchprotocol.cpp @@ -19,12 +19,13 @@ #include "filenamesearchprotocol.h" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -34,40 +35,45 @@ 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) +void FileNameSearchProtocol::listDir(const QUrl& url) { - delete m_regExp; - m_regExp = 0; + cleanup(); - const QString search = url.queryItem("search"); + const QString search = url.queryItemValue("search"); if (!search.isEmpty()) { m_regExp = new QRegExp(search, Qt::CaseInsensitive, QRegExp::Wildcard); } m_checkContent = false; - const QString checkContent = url.queryItem("checkContent"); + const QString checkContent = url.queryItemValue("checkContent"); if (checkContent == QLatin1String("yes")) { m_checkContent = true; } - const QString urlString = url.queryItem("url"); + const QString urlString = url.queryItemValue("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); @@ -75,8 +81,8 @@ void FileNameSearchProtocol::searchDirectory(const KUrl& directory) dirLister->openUrl(directory); QEventLoop eventLoop; - QObject::connect(dirLister, SIGNAL(canceled()), &eventLoop, SLOT(quit())); - QObject::connect(dirLister, SIGNAL(completed()), &eventLoop, SLOT(quit())); + QObject::connect(dirLister, static_cast(&KDirLister::canceled), &eventLoop, &QEventLoop::quit); + QObject::connect(dirLister, static_cast(&KDirLister::completed), &eventLoop, &QEventLoop::quit); eventLoop.exec(); // Visualize all items that match the search pattern @@ -84,9 +90,9 @@ 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/"))) { + } else if (m_checkContent && item.determineMimeType().inherits(QLatin1String("text/plain"))) { addItem = contentContainsPattern(item.url()); } @@ -97,11 +103,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 +130,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 +168,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");