1/*
2 This file is part of the KDE project
3 SPDX-FileCopyrightText: 2017 David Faure <faure@kde.org>
4
5 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
6*/
7
8#include "searchprovider.h"
9#include "searchproviderregistry_p.h"
10
11#include <QDir>
12#include <QStandardPaths>
13
14using namespace KIO;
15SearchProviderRegistry::SearchProviderRegistry()
16{
17 reload();
18}
19
20SearchProviderRegistry::~SearchProviderRegistry()
21{
22 qDeleteAll(c: m_searchProviders);
23}
24
25QStringList SearchProviderRegistry::directories() const
26{
27 const QString testDir = QFile::decodeName(localFileName: qgetenv(varName: "KIO_SEARCHPROVIDERS_DIR")); // for unittests
28 if (!testDir.isEmpty()) {
29 return {testDir};
30 }
31 return QStandardPaths::locateAll(type: QStandardPaths::GenericDataLocation, QStringLiteral("kf6/searchproviders/"), options: QStandardPaths::LocateDirectory);
32}
33
34void SearchProviderRegistry::reload()
35{
36 m_searchProvidersByKey.clear();
37 m_searchProvidersByDesktopName.clear();
38 qDeleteAll(c: m_searchProviders);
39 m_searchProviders.clear();
40
41 const QStringList servicesDirs = directories();
42 for (const QString &dirPath : servicesDirs) {
43 QDir dir(dirPath);
44 const auto files = dir.entryList(nameFilters: {QStringLiteral("*.desktop")}, filters: QDir::Files);
45 for (const QString &file : files) {
46 if (!m_searchProvidersByDesktopName.contains(key: file)) {
47 const QString filePath = dir.path() + QLatin1Char('/') + file;
48 auto *provider = new SearchProvider(filePath);
49 m_searchProvidersByDesktopName.insert(key: file, value: provider);
50 m_searchProviders.append(t: provider);
51 const auto keys = provider->keys();
52 for (const QString &key : keys) {
53 m_searchProvidersByKey.insert(key, value: provider);
54 }
55 }
56 }
57 }
58}
59
60QList<SearchProvider *> SearchProviderRegistry::findAll()
61{
62 return m_searchProviders;
63}
64
65SearchProvider *SearchProviderRegistry::findByKey(const QString &key) const
66{
67 return m_searchProvidersByKey.value(key);
68}
69
70SearchProvider *SearchProviderRegistry::findByDesktopName(const QString &name) const
71{
72 return m_searchProvidersByDesktopName.value(key: name + QLatin1String(".desktop"));
73}
74

source code of kio/src/urifilters/ikws/searchproviderregistry.cpp