#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);
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
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());
}
}
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;
bool FileNameSearchProtocol::contentContainsPattern(const KUrl& fileName) const
{
- Q_ASSERT(m_regExp != 0);
+ Q_ASSERT(m_regExp);
QString path;
KTemporaryFile tempFile;
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");