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 <KLocalizedString> |
17 | #include <KUser> |
18 | #include <QCoreApplication> |
19 | #include <QFileInfo> |
20 | #include <QUrl> |
21 | #include <QUrlQuery> |
22 | |
23 | using namespace Baloo; |
24 | |
25 | // Pseudo plugin class to embed meta data |
26 | class KIOPluginForMetaData : public QObject |
27 | { |
28 | Q_OBJECT |
29 | Q_PLUGIN_METADATA(IID "org.kde.kio.worker.baloosearch" FILE "baloosearch.json" ) |
30 | }; |
31 | |
32 | namespace |
33 | { |
34 | |
35 | KIO::UDSEntry statSearchFolder(const QUrl& url) |
36 | { |
37 | KIO::UDSEntry uds; |
38 | uds.reserve(size: 9); |
39 | #ifdef Q_OS_WIN |
40 | uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, _S_IREAD ); |
41 | #else |
42 | uds.fastInsert(field: KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR); |
43 | #endif |
44 | uds.fastInsert(field: KIO::UDSEntry::UDS_USER, value: KUser().loginName()); |
45 | uds.fastInsert(field: KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); |
46 | uds.fastInsert(field: KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory" )); |
47 | uds.fastInsert(field: KIO::UDSEntry::UDS_ICON_OVERLAY_NAMES, QStringLiteral("baloo" )); |
48 | uds.fastInsert(field: KIO::UDSEntry::UDS_DISPLAY_TYPE, i18n("Search Folder" )); |
49 | uds.fastInsert(field: KIO::UDSEntry::UDS_URL, value: url.url()); |
50 | |
51 | QUrlQuery query(url); |
52 | QString title = query.queryItemValue(QStringLiteral("title" ), encoding: QUrl::FullyDecoded); |
53 | if (!title.isEmpty()) { |
54 | uds.fastInsert(field: KIO::UDSEntry::UDS_NAME, value: title); |
55 | uds.fastInsert(field: KIO::UDSEntry::UDS_DISPLAY_NAME, value: title); |
56 | } |
57 | |
58 | return uds; |
59 | } |
60 | |
61 | } |
62 | |
63 | SearchProtocol::SearchProtocol(const QByteArray& poolSocket, const QByteArray& appSocket) |
64 | : KIO::WorkerBase("baloosearch" , poolSocket, appSocket) |
65 | { |
66 | } |
67 | |
68 | SearchProtocol::~SearchProtocol() |
69 | { |
70 | } |
71 | |
72 | KIO::WorkerResult SearchProtocol::listDir(const QUrl& url) |
73 | { |
74 | Query q = Query::fromSearchUrl(url); |
75 | |
76 | // Canonicalise the search base directory |
77 | const QString folder = q.includeFolder(); |
78 | if (!folder.isEmpty()) { |
79 | const QString canonicalPath = QFileInfo(folder).canonicalFilePath(); |
80 | if (!canonicalPath.isEmpty()) { |
81 | q.setIncludeFolder(canonicalPath); |
82 | } |
83 | } |
84 | |
85 | q.setSortingOption(Query::SortNone); |
86 | ResultIterator it = q.exec(); |
87 | |
88 | UdsFactory udsf; |
89 | |
90 | while (it.next()) { |
91 | KIO::UDSEntry uds = udsf.createUdsEntry(filePath: it.filePath()); |
92 | if (uds.count()) { |
93 | listEntry(entry: uds); |
94 | } |
95 | } |
96 | |
97 | KIO::UDSEntry uds; |
98 | uds.reserve(size: 5); |
99 | uds.fastInsert(field: KIO::UDSEntry::UDS_NAME, QStringLiteral("." )); |
100 | uds.fastInsert(field: KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); |
101 | uds.fastInsert(field: KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory" )); |
102 | #ifdef Q_OS_WIN |
103 | uds.fastInsert(KIO::UDSEntry::UDS_ACCESS, _S_IREAD ); |
104 | #else |
105 | uds.fastInsert(field: KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR); |
106 | #endif |
107 | uds.fastInsert(field: KIO::UDSEntry::UDS_USER, value: KUser().loginName()); |
108 | listEntry(entry: uds); |
109 | |
110 | return KIO::WorkerResult::pass(); |
111 | } |
112 | |
113 | KIO::WorkerResult SearchProtocol::mimetype(const QUrl&) |
114 | { |
115 | mimeType(QStringLiteral("inode/directory" )); |
116 | return KIO::WorkerResult::pass(); |
117 | } |
118 | |
119 | KIO::WorkerResult SearchProtocol::stat(const QUrl& url) |
120 | { |
121 | statEntry(entry: statSearchFolder(url)); |
122 | return KIO::WorkerResult::pass(); |
123 | } |
124 | |
125 | extern "C" |
126 | { |
127 | Q_DECL_EXPORT int kdemain(int argc, char** argv) |
128 | { |
129 | QCoreApplication app(argc, argv); |
130 | app.setApplicationName(QStringLiteral("kio_baloosearch" )); |
131 | Baloo::SearchProtocol worker(argv[2], argv[3]); |
132 | worker.dispatchLoop(); |
133 | return 0; |
134 | } |
135 | } |
136 | |
137 | #include "kio_search.moc" |
138 | |