#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()) {
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);
}
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;
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");