]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/search/filenamesearchprotocol.cpp
Fixes Bug 305783 - dragging a file over a directory #c4
[dolphin.git] / src / search / filenamesearchprotocol.cpp
index d2391874c379b63516285dc6f5a8605bfc12f22e..4d6f59fa4c608e92598a1465b80aedcbc94f343f 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 <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)
 {
-    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");