File indexing completed on 2024-05-05 03:52:16

0001 /*
0002     SPDX-FileCopyrightText: 2008-2010 Sebastian Trueg <trueg at kde.org>
0003     SPDX-FileCopyrightText: 2012-2014 Vishesh Handa <me@vhanda.in>
0004     SPDX-FileCopyrightText: 2020 Stefan BrĂ¼ns <bruns@kde.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "kio_search.h"
0010 #include "../common/udstools.h"
0011 
0012 #include "query.h"
0013 #include "resultiterator.h"
0014 #include <sys/stat.h>
0015 
0016 #include <QUrl>
0017 #include <QUrlQuery>
0018 #include <KUser>
0019 #include <QCoreApplication>
0020 #include <KLocalizedString>
0021 
0022 using namespace Baloo;
0023 
0024 // Pseudo plugin class to embed meta data
0025 class KIOPluginForMetaData : public QObject
0026 {
0027     Q_OBJECT
0028     Q_PLUGIN_METADATA(IID "org.kde.kio.worker.baloosearch" FILE "baloosearch.json")
0029 };
0030 
0031 namespace
0032 {
0033 
0034 KIO::UDSEntry statSearchFolder(const QUrl& url)
0035 {
0036     KIO::UDSEntry uds;
0037     uds.reserve(9);
0038 #ifdef Q_OS_WIN
0039     uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, _S_IREAD );
0040 #else
0041     uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR);
0042 #endif
0043     uds.fastInsert(KIO::UDSEntry::UDS_USER, KUser().loginName());
0044     uds.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
0045     uds.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
0046     uds.fastInsert(KIO::UDSEntry::UDS_ICON_OVERLAY_NAMES, QStringLiteral("baloo"));
0047     uds.fastInsert(KIO::UDSEntry::UDS_DISPLAY_TYPE, i18n("Search Folder"));
0048     uds.fastInsert(KIO::UDSEntry::UDS_URL, url.url());
0049 
0050     QUrlQuery query(url);
0051     QString title = query.queryItemValue(QStringLiteral("title"), QUrl::FullyDecoded);
0052     if (!title.isEmpty()) {
0053         uds.fastInsert(KIO::UDSEntry::UDS_NAME, title);
0054         uds.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, title);
0055     }
0056 
0057     return uds;
0058 }
0059 
0060 }
0061 
0062 SearchProtocol::SearchProtocol(const QByteArray& poolSocket, const QByteArray& appSocket)
0063     : KIO::WorkerBase("baloosearch", poolSocket, appSocket)
0064 {
0065 }
0066 
0067 SearchProtocol::~SearchProtocol()
0068 {
0069 }
0070 
0071 KIO::WorkerResult SearchProtocol::listDir(const QUrl& url)
0072 {
0073     Query q = Query::fromSearchUrl(url);
0074 
0075     q.setSortingOption(Query::SortNone);
0076     ResultIterator it = q.exec();
0077 
0078     UdsFactory udsf;
0079 
0080     while (it.next()) {
0081         KIO::UDSEntry uds = udsf.createUdsEntry(it.filePath());
0082         if (uds.count()) {
0083         listEntry(uds);
0084         }
0085     }
0086 
0087     KIO::UDSEntry uds;
0088     uds.reserve(5);
0089     uds.fastInsert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
0090     uds.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
0091     uds.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
0092 #ifdef Q_OS_WIN
0093     uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, _S_IREAD );
0094 #else
0095     uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR);
0096 #endif
0097     uds.fastInsert(KIO::UDSEntry::UDS_USER, KUser().loginName());
0098     listEntry(uds);
0099 
0100     return KIO::WorkerResult::pass();
0101 }
0102 
0103 KIO::WorkerResult SearchProtocol::mimetype(const QUrl&)
0104 {
0105     mimeType(QStringLiteral("inode/directory"));
0106     return KIO::WorkerResult::pass();
0107 }
0108 
0109 KIO::WorkerResult SearchProtocol::stat(const QUrl& url)
0110 {
0111     statEntry(statSearchFolder(url));
0112     return KIO::WorkerResult::pass();
0113 }
0114 
0115 extern "C"
0116 {
0117     Q_DECL_EXPORT int kdemain(int argc, char** argv)
0118     {
0119         QCoreApplication app(argc, argv);
0120         app.setApplicationName(QStringLiteral("kio_baloosearch"));
0121         Baloo::SearchProtocol worker(argv[2], argv[3]);
0122         worker.dispatchLoop();
0123         return 0;
0124     }
0125 }
0126 
0127 #include "kio_search.moc"