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