1/*
2 This file is part of the KDE project
3 SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org>
4 SPDX-FileCopyrightText: 2000 Yves Arrouye <yves@realnames.com>
5 SPDX-FileCopyrightText: 2002, 2003 Dawit Alemayehu <adawit@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10#include "kuriikwsfilter.h"
11#include "kuriikwsfiltereng_p.h"
12#include "searchprovider.h"
13
14#include <KLocalizedString>
15#include <KPluginFactory>
16
17#include <QLoggingCategory>
18
19using namespace KIO;
20namespace
21{
22Q_LOGGING_CATEGORY(category, "kf.kio.urifilters.ikws", QtWarningMsg)
23}
24
25K_PLUGIN_CLASS_WITH_JSON(KAutoWebSearch, "kuriikwsfilter.json")
26
27void KAutoWebSearch::populateProvidersList(QList<KUriFilterSearchProvider *> &searchProviders, const KUriFilterData &data, bool allproviders) const
28{
29 QList<SearchProvider *> providers;
30 KURISearchFilterEngine *filter = KURISearchFilterEngine::self();
31
32 if (allproviders) {
33 providers = filter->registry()->findAll();
34 } else {
35 // Start with the search engines marked as preferred...
36 QStringList favEngines = filter->favoriteEngineList();
37 if (favEngines.isEmpty()) {
38 favEngines = data.alternateSearchProviders();
39 }
40
41 // Get rid of duplicates...
42 favEngines.removeDuplicates();
43
44 // Sort the items...
45 std::stable_sort(first: favEngines.begin(), last: favEngines.end());
46
47 // Add the search engine set as the default provider...
48 const QString defaultEngine = filter->defaultSearchEngine();
49 if (!defaultEngine.isEmpty()) {
50 favEngines.removeAll(t: defaultEngine);
51 favEngines.insert(i: 0, t: defaultEngine);
52 }
53
54 QStringListIterator it(favEngines);
55 while (it.hasNext()) {
56 SearchProvider *favProvider = filter->registry()->findByDesktopName(desktopName: it.next());
57 if (favProvider) {
58 providers << favProvider;
59 }
60 }
61 }
62
63 for (SearchProvider *p : std::as_const(t&: providers)) {
64 searchProviders << p;
65 }
66}
67
68bool KAutoWebSearch::filterUri(KUriFilterData &data) const
69{
70 qCDebug(category) << data.typedString();
71
72 KUriFilterData::SearchFilterOptions option = data.searchFilteringOptions();
73
74 // Handle the flag to retrieve only preferred providers, no filtering...
75 if (option & KUriFilterData::RetrievePreferredSearchProvidersOnly) {
76 QList<KUriFilterSearchProvider *> searchProviders;
77 populateProvidersList(searchProviders, data);
78 if (searchProviders.isEmpty()) {
79 if (!(option & KUriFilterData::RetrieveSearchProvidersOnly)) {
80 setUriType(data, type: KUriFilterData::Error);
81 setErrorMsg(data, i18n("No preferred search providers were found."));
82 return false;
83 }
84 } else {
85 setSearchProvider(data, provider: nullptr, term: data.typedString(), separator: QLatin1Char(KURISearchFilterEngine::self()->keywordDelimiter()));
86 setSearchProviders(data, providers: searchProviders);
87 return true;
88 }
89 }
90
91 if (option & KUriFilterData::RetrieveSearchProvidersOnly) {
92 QList<KUriFilterSearchProvider *> searchProviders;
93 populateProvidersList(searchProviders, data, allproviders: true);
94 if (searchProviders.isEmpty()) {
95 setUriType(data, type: KUriFilterData::Error);
96 setErrorMsg(data, i18n("No search providers were found."));
97 return false;
98 }
99
100 setSearchProvider(data, provider: nullptr, term: data.typedString(), separator: QLatin1Char(KURISearchFilterEngine::self()->keywordDelimiter()));
101 setSearchProviders(data, providers: searchProviders);
102 return true;
103 }
104
105 if (data.uriType() == KUriFilterData::Unknown && data.uri().password().isEmpty()) {
106 KURISearchFilterEngine *filter = KURISearchFilterEngine::self();
107 SearchProvider *provider = filter->autoWebSearchQuery(typedString: data.typedString(), defaultShortcut: data.alternateDefaultSearchProvider());
108 if (provider) {
109 const QUrl result = filter->formatResult(url: provider->query(), cset1: provider->charset(), cset2: QString(), query: data.typedString(), isMalformed: true);
110 setFilteredUri(data, uri: result);
111 setUriType(data, type: KUriFilterData::NetProtocol);
112 setSearchProvider(data, provider, term: data.typedString(), separator: QLatin1Char(filter->keywordDelimiter()));
113
114 QList<KUriFilterSearchProvider *> searchProviders;
115 populateProvidersList(searchProviders, data);
116 setSearchProviders(data, providers: searchProviders);
117 return true;
118 }
119 }
120 return false;
121}
122
123#include "kuriikwsfilter.moc"
124#include "moc_kuriikwsfilter.cpp"
125

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