]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/search/filenamesearchprotocol.cpp
Increase version
[dolphin.git] / src / search / filenamesearchprotocol.cpp
index 8464205ff34b251ee065bb273a76df9094acd0c3..b56a9958024832107c0a186422d048dd335ee193 100644 (file)
 
 #include "filenamesearchprotocol.h"
 
-#include <kcomponentdata.h>
-#include <kdirlister.h>
-#include <kfileitem.h>
-#include <kio/netaccess.h>
-#include <kio/job.h>
-#include <kurl.h>
+#include <KComponentData>
+#include <KDirLister>
+#include <KFileItem>
+#include <KIO/NetAccess>
+#include <KIO/Job>
+#include <KUrl>
+#include <kdemacros.h>
 #include <ktemporaryfile.h>
 
 #include <QCoreApplication>
 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<void(KDirLister::*)()>(&KDirLister::canceled), &eventLoop, &QEventLoop::quit);
+    QObject::connect(dirLister, static_cast<void(KDirLister::*)()>(&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,22 +103,22 @@ void FileNameSearchProtocol::searchDirectory(const KUrl& directory)
         }
 
         if (item.isDir()) {
-            bool skipDir = false;
-            const KUrl itemDir = item.url();
             if (item.isLink()) {
-                // Assure that no endless searching is done if a link points
-                // to a parent directory
-                const KUrl linkDestDir = item.linkDest();
-                skipDir = linkDestDir.isParentOf(itemDir);
-            }
-
-            if (!skipDir) {
-                pendingDirs.append(itemDir);
+                // 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;
 
@@ -124,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;
@@ -162,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");