1 /*
2     SPDX-FileCopyrightText: 2008-2010 Sebastian Trueg <trueg at kde.org>
3     SPDX-FileCopyrightText: 2012-2014 Vishesh Handa <me@vhanda.in>
4     SPDX-FileCopyrightText: 2020 Stefan Brüns <bruns@kde.org>
5 
6     SPDX-License-Identifier: GPL-2.0-or-later
7 */
8 
9 #include "kio_search.h"
10 #include "../common/udstools.h"
11 
12 #include "query.h"
13 #include "resultiterator.h"
14 #include <sys/stat.h>
15 
16 #include <QUrl>
17 #include <QUrlQuery>
18 #include <KUser>
19 #include <QCoreApplication>
20 #include <KLocalizedString>
21 
22 using namespace Baloo;
23 
24 // Pseudo plugin class to embed meta data
25 class KIOPluginForMetaData : public QObject
26 {
27     Q_OBJECT
28     Q_PLUGIN_METADATA(IID "org.kde.kio.slave.baloosearch" FILE "baloosearch.json")
29 };
30 
31 namespace
32 {
33 
statSearchFolder(const QUrl & url)34 KIO::UDSEntry statSearchFolder(const QUrl& url)
35 {
36     KIO::UDSEntry uds;
37     uds.reserve(9);
38 #ifdef Q_OS_WIN
39     uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, _S_IREAD );
40 #else
41     uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR);
42 #endif
43     uds.fastInsert(KIO::UDSEntry::UDS_USER, KUser().loginName());
44     uds.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
45     uds.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
46     uds.fastInsert(KIO::UDSEntry::UDS_ICON_OVERLAY_NAMES, QStringLiteral("baloo"));
47     uds.fastInsert(KIO::UDSEntry::UDS_DISPLAY_TYPE, i18n("Search Folder"));
48     uds.fastInsert(KIO::UDSEntry::UDS_URL, url.url());
49 
50     QUrlQuery query(url);
51     QString title = query.queryItemValue(QStringLiteral("title"), QUrl::FullyDecoded);
52     if (!title.isEmpty()) {
53         uds.fastInsert(KIO::UDSEntry::UDS_NAME, title);
54         uds.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, title);
55     }
56 
57     return uds;
58 }
59 
60 }
61 
SearchProtocol(const QByteArray & poolSocket,const QByteArray & appSocket)62 SearchProtocol::SearchProtocol(const QByteArray& poolSocket, const QByteArray& appSocket)
63     : KIO::SlaveBase("baloosearch", poolSocket, appSocket)
64 {
65 }
66 
67 
~SearchProtocol()68 SearchProtocol::~SearchProtocol()
69 {
70 }
71 
listDir(const QUrl & url)72 void SearchProtocol::listDir(const QUrl& url)
73 {
74     Query q = Query::fromSearchUrl(url);
75 
76     q.setSortingOption(Query::SortNone);
77     ResultIterator it = q.exec();
78 
79     UdsFactory udsf;
80 
81     while (it.next()) {
82         KIO::UDSEntry uds = udsf.createUdsEntry(it.filePath());
83         if (uds.count()) {
84 	    listEntry(uds);
85         }
86     }
87 
88     KIO::UDSEntry uds;
89     uds.reserve(5);
90     uds.fastInsert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
91     uds.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
92     uds.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
93 #ifdef Q_OS_WIN
94     uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, _S_IREAD );
95 #else
96     uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR);
97 #endif
98     uds.fastInsert(KIO::UDSEntry::UDS_USER, KUser().loginName());
99     listEntry(uds);
100 
101     finished();
102 }
103 
104 
mimetype(const QUrl &)105 void SearchProtocol::mimetype(const QUrl&)
106 {
107     mimeType(QStringLiteral("inode/directory"));
108     finished();
109 }
110 
111 
stat(const QUrl & url)112 void SearchProtocol::stat(const QUrl& url)
113 {
114     statEntry(statSearchFolder(url));
115     finished();
116 }
117 
118 extern "C"
119 {
kdemain(int argc,char ** argv)120     Q_DECL_EXPORT int kdemain(int argc, char** argv)
121     {
122         QCoreApplication app(argc, argv);
123         app.setApplicationName(QStringLiteral("kio_baloosearch"));
124         Baloo::SearchProtocol slave(argv[2], argv[3]);
125         slave.dispatchLoop();
126         return 0;
127     }
128 }
129 
130 #include "kio_search.moc"
131