File indexing completed on 2024-04-28 03:55:43
0001 /* 0002 This file is part of the KDE project 0003 SPDX-FileCopyrightText: 1999 Simon Hausmann <hausmann@kde.org> 0004 SPDX-FileCopyrightText: 2000 Yves Arrouye <yves@realnames.com> 0005 SPDX-FileCopyrightText: 2002, 2003 Dawit Alemayehu <adawit@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #include "kuriikwsfilter.h" 0011 #include "kuriikwsfiltereng_p.h" 0012 #include "searchprovider.h" 0013 0014 #include <KLocalizedString> 0015 #include <KPluginFactory> 0016 0017 #include <QDBusConnection> 0018 #include <QLoggingCategory> 0019 0020 using namespace KIO; 0021 namespace 0022 { 0023 Q_LOGGING_CATEGORY(category, "kf.kio.urifilters.ikws", QtWarningMsg) 0024 } 0025 0026 K_PLUGIN_CLASS_WITH_JSON(KAutoWebSearch, "kuriikwsfilter.json") 0027 0028 void KAutoWebSearch::populateProvidersList(QList<KUriFilterSearchProvider *> &searchProviders, const KUriFilterData &data, bool allproviders) const 0029 { 0030 QList<SearchProvider *> providers; 0031 KURISearchFilterEngine *filter = KURISearchFilterEngine::self(); 0032 0033 if (allproviders) { 0034 providers = filter->registry()->findAll(); 0035 } else { 0036 // Start with the search engines marked as preferred... 0037 QStringList favEngines = filter->favoriteEngineList(); 0038 if (favEngines.isEmpty()) { 0039 favEngines = data.alternateSearchProviders(); 0040 } 0041 0042 // Get rid of duplicates... 0043 favEngines.removeDuplicates(); 0044 0045 // Sort the items... 0046 std::stable_sort(favEngines.begin(), favEngines.end()); 0047 0048 // Add the search engine set as the default provider... 0049 const QString defaultEngine = filter->defaultSearchEngine(); 0050 if (!defaultEngine.isEmpty()) { 0051 favEngines.removeAll(defaultEngine); 0052 favEngines.insert(0, defaultEngine); 0053 } 0054 0055 QStringListIterator it(favEngines); 0056 while (it.hasNext()) { 0057 SearchProvider *favProvider = filter->registry()->findByDesktopName(it.next()); 0058 if (favProvider) { 0059 providers << favProvider; 0060 } 0061 } 0062 } 0063 0064 for (SearchProvider *p : std::as_const(providers)) { 0065 searchProviders << p; 0066 } 0067 } 0068 0069 bool KAutoWebSearch::filterUri(KUriFilterData &data) const 0070 { 0071 qCDebug(category) << data.typedString(); 0072 0073 KUriFilterData::SearchFilterOptions option = data.searchFilteringOptions(); 0074 0075 // Handle the flag to retrieve only preferred providers, no filtering... 0076 if (option & KUriFilterData::RetrievePreferredSearchProvidersOnly) { 0077 QList<KUriFilterSearchProvider *> searchProviders; 0078 populateProvidersList(searchProviders, data); 0079 if (searchProviders.isEmpty()) { 0080 if (!(option & KUriFilterData::RetrieveSearchProvidersOnly)) { 0081 setUriType(data, KUriFilterData::Error); 0082 setErrorMsg(data, i18n("No preferred search providers were found.")); 0083 return false; 0084 } 0085 } else { 0086 setSearchProvider(data, QString(), data.typedString(), QLatin1Char(KURISearchFilterEngine::self()->keywordDelimiter())); 0087 setSearchProviders(data, searchProviders); 0088 return true; 0089 } 0090 } 0091 0092 if (option & KUriFilterData::RetrieveSearchProvidersOnly) { 0093 QList<KUriFilterSearchProvider *> searchProviders; 0094 populateProvidersList(searchProviders, data, true); 0095 if (searchProviders.isEmpty()) { 0096 setUriType(data, KUriFilterData::Error); 0097 setErrorMsg(data, i18n("No search providers were found.")); 0098 return false; 0099 } 0100 0101 setSearchProvider(data, QString(), data.typedString(), QLatin1Char(KURISearchFilterEngine::self()->keywordDelimiter())); 0102 setSearchProviders(data, searchProviders); 0103 return true; 0104 } 0105 0106 if (data.uriType() == KUriFilterData::Unknown && data.uri().password().isEmpty()) { 0107 KURISearchFilterEngine *filter = KURISearchFilterEngine::self(); 0108 SearchProvider *provider = filter->autoWebSearchQuery(data.typedString(), data.alternateDefaultSearchProvider()); 0109 if (provider) { 0110 const QUrl result = filter->formatResult(provider->query(), provider->charset(), QString(), data.typedString(), true); 0111 setFilteredUri(data, result); 0112 setUriType(data, KUriFilterData::NetProtocol); 0113 setSearchProvider(data, provider->name(), data.typedString(), QLatin1Char(filter->keywordDelimiter())); 0114 0115 QList<KUriFilterSearchProvider *> searchProviders; 0116 populateProvidersList(searchProviders, data); 0117 setSearchProviders(data, searchProviders); 0118 return true; 0119 } 0120 } 0121 return false; 0122 } 0123 0124 #include "kuriikwsfilter.moc" 0125 #include "moc_kuriikwsfilter.cpp"