diff --git a/kdirshare/kded/kdirshareimpl.cpp b/kdirshare/kded/kdirshareimpl.cpp index 32818e32..5efb05a1 100644 --- a/kdirshare/kded/kdirshareimpl.cpp +++ b/kdirshare/kded/kdirshareimpl.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -96,7 +97,59 @@ static QByteArray styleSheetForPalette(const QPalette &palette) return stylesheet; } -static QByteArray contentForDirectory(const QString &path, const QString &basedir) +static QByteArray contentForFile(const QString &basedir, const QFileInfo &fileinfo) +{ + QByteArray data; + + const QString fullpath = fileinfo.absoluteFilePath(); + + // chromium does weird stuff if the link starts with two slashes - removes, the host and + // port part of the link (or rather does not prepend them) and converts the first directory + // to lower-case + const QString cleanpath = QDir::cleanPath(fullpath.mid(basedir.size())); + + data.append(" \n"); + + const bool isdotdot = (fileinfo.fileName() == QLatin1String("..")); + if (isdotdot) { + const QString fileicon = QString::fromLatin1(""); + data.append(" "); + data.append(fileicon.toUtf8()); + data.append("\n"); + } else { + const QString fileicon = QString::fromLatin1("").arg(KMimeType::iconNameForUrl(KUrl(fullpath))); + data.append(" "); + data.append(fileicon.toUtf8()); + data.append("\n"); + } + + // qDebug() << Q_FUNC_INFO << fullpath << basedir << cleanpath; + data.append(" "); + data.append(fileinfo.fileName().toUtf8()); + data.append("
\n"); + + data.append(" "); + if (!isdotdot) { + const QString filemime = getFileMIME(fullpath); + data.append(filemime.toUtf8()); + } + data.append("\n"); + + data.append(" "); + if (fileinfo.isFile()) { + const QString filesize = KGlobal::locale()->formatByteSize(fileinfo.size(), 1); + data.append(filesize.toUtf8()); + } + data.append("\n"); + + data.append(" \n"); + + return data; +} + +static QByteArray contentForMatch(const QString &path, const QString &match) { const QString pathtitle = getTitle(path); @@ -116,55 +169,55 @@ static QByteArray contentForDirectory(const QString &path, const QString &basedi data.append(" MIME\n"); data.append(" Size\n"); data.append(" \n"); + const QDir::Filters dirfilters = (QDir::Files | QDir::NoDotAndDotDot); + QDirIterator diriterator(path, QStringList() << match, dirfilters, QDirIterator::Subdirectories); + while (diriterator.hasNext()) { + (void)diriterator.next(); + const QFileInfo dirinfo = diriterator.fileInfo(); + if (dirinfo.isDir()) { + // sub-directory + continue; + } + data.append(contentForFile(path, dirinfo)); + } + data.append(" \n"); + data.append(" \n"); + data.append(""); + return data; +} + +static QByteArray contentForDirectory(const QString &path, const QString &basedir) +{ + const QString pathtitle = getTitle(path); + + QByteArray data; + data.append("\n"); + data.append(" \n"); + data.append(" "); + data.append(" \n"); + data.append("
\n"); + data.append(" \n"); + data.append(" \n"); + data.append(" \n"); + data.append("
\n"); + data.append(" \n"); + data.append(" "); + data.append(pathtitle.toUtf8()); + data.append("\n"); + data.append(" \n"); + data.append(" \n"); + data.append(" \n"); // icon + data.append(" \n"); + data.append(" \n"); + data.append(" \n"); + data.append(" \n"); QDir::Filters dirfilters = (QDir::Files | QDir::AllDirs | QDir::NoDot); if (QDir::cleanPath(path) == QDir::cleanPath(basedir)) { dirfilters = (QDir::Files | QDir::AllDirs | QDir::NoDotAndDotDot); } QDir dir(path); foreach (const QFileInfo &fileinfo, dir.entryInfoList(dirfilters, s_dirsortflags)) { - const QString fullpath = path + QLatin1Char('/') + fileinfo.fileName(); - // chromium does weird stuff if the link starts with two slashes - removes, the host and - // port part of the link (or rather does not prepend them) and converts the first directory - // to lower-case - const QString cleanpath = QDir::cleanPath(fullpath.mid(basedir.size())); - - data.append(" \n"); - - const bool isdotdot = (fileinfo.fileName() == QLatin1String("..")); - if (isdotdot) { - const QString fileicon = QString::fromLatin1(""); - data.append(" \n"); - } else { - const QString fileicon = QString::fromLatin1("").arg(KMimeType::iconNameForUrl(KUrl(fullpath))); - data.append(" \n"); - } - - // qDebug() << Q_FUNC_INFO << fullpath << basedir << cleanpath; - data.append(" \n"); - - data.append(" \n"); - - data.append(" \n"); - - data.append(" \n"); + data.append(contentForFile(basedir, fileinfo)); } data.append("
FilenameMIMESize
"); - data.append(fileicon.toUtf8()); - data.append(""); - data.append(fileicon.toUtf8()); - data.append(""); - data.append(fileinfo.fileName().toUtf8()); - data.append("
"); - if (!isdotdot) { - const QString filemime = getFileMIME(fullpath); - data.append(filemime.toUtf8()); - } - data.append(""); - if (fileinfo.isFile()) { - const QString filesize = KGlobal::locale()->formatByteSize(fileinfo.size(), 1); - data.append(filesize.toUtf8()); - } - data.append("
\n"); data.append(" \n"); @@ -227,6 +280,11 @@ void KDirServer::respond(const QByteArray &url, QByteArray *outdata, *outhttpstatus = 200; outheaders->insert("Content-Type", "text/css"); outdata->append(styleSheetForPalette(KGlobalSettings::createApplicationPalette())); + } else if (normalizedpath.startsWith(QLatin1String("/kdirsharesearch.html"))) { + const QString match = QUrl::fromEncoded(url).queryItemValue("match"); + *outhttpstatus = 200; + outheaders->insert("Content-Type", "text/html; charset=UTF-8"); + outdata->append(contentForMatch(m_directory, match)); } else if (pathinfo.isDir()) { *outhttpstatus = 200; outheaders->insert("Content-Type", "text/html; charset=UTF-8");