File indexing completed on 2024-05-12 11:54:36
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 "ikwsopts.h" 0012 #include "kuriikwsfiltereng.h" 0013 #include "searchprovider.h" 0014 0015 #include <KLocalizedString> 0016 #include <KPluginFactory> 0017 0018 #include <QDBusConnection> 0019 #include <QLoggingCategory> 0020 0021 namespace 0022 { 0023 Q_LOGGING_CATEGORY(category, "kf.kio.urifilters.ikws", QtWarningMsg) 0024 } 0025 0026 /** 0027 * IMPORTANT: If you change anything here, make sure you run the kurifiltertest 0028 * regression test (this should be included as part of "make test"). 0029 */ 0030 0031 K_PLUGIN_CLASS_WITH_JSON(KAutoWebSearch, "kuriikwsfilter.json") 0032 0033 KAutoWebSearch::KAutoWebSearch(QObject *parent, const QVariantList &) 0034 : KUriFilterPlugin(QStringLiteral("kuriikwsfilter"), parent) 0035 { 0036 QDBusConnection::sessionBus() 0037 .connect(QString(), QStringLiteral("/"), QStringLiteral("org.kde.KUriFilterPlugin"), QStringLiteral("configure"), this, SLOT(configure())); 0038 } 0039 0040 KAutoWebSearch::~KAutoWebSearch() 0041 { 0042 } 0043 0044 void KAutoWebSearch::configure() 0045 { 0046 qCDebug(category) << "Config reload requested..."; 0047 KURISearchFilterEngine::self()->loadConfig(); 0048 } 0049 0050 void KAutoWebSearch::populateProvidersList(QList<KUriFilterSearchProvider *> &searchProviders, const KUriFilterData &data, bool allproviders) const 0051 { 0052 QList<SearchProvider *> providers; 0053 KURISearchFilterEngine *filter = KURISearchFilterEngine::self(); 0054 0055 if (allproviders) { 0056 providers = filter->registry()->findAll(); 0057 } else { 0058 // Start with the search engines marked as preferred... 0059 QStringList favEngines = filter->favoriteEngineList(); 0060 if (favEngines.isEmpty()) { 0061 favEngines = data.alternateSearchProviders(); 0062 } 0063 0064 // Get rid of duplicates... 0065 favEngines.removeDuplicates(); 0066 0067 // Sort the items... 0068 std::stable_sort(favEngines.begin(), favEngines.end()); 0069 0070 // Add the search engine set as the default provider... 0071 const QString defaultEngine = filter->defaultSearchEngine(); 0072 if (!defaultEngine.isEmpty()) { 0073 favEngines.removeAll(defaultEngine); 0074 favEngines.insert(0, defaultEngine); 0075 } 0076 0077 QStringListIterator it(favEngines); 0078 while (it.hasNext()) { 0079 SearchProvider *favProvider = filter->registry()->findByDesktopName(it.next()); 0080 if (favProvider) { 0081 providers << favProvider; 0082 } 0083 } 0084 } 0085 0086 for (SearchProvider *p : std::as_const(providers)) { 0087 searchProviders << p; 0088 } 0089 } 0090 0091 bool KAutoWebSearch::filterUri(KUriFilterData &data) const 0092 { 0093 qCDebug(category) << data.typedString(); 0094 0095 KUriFilterData::SearchFilterOptions option = data.searchFilteringOptions(); 0096 0097 // Handle the flag to retrieve only preferred providers, no filtering... 0098 if (option & KUriFilterData::RetrievePreferredSearchProvidersOnly) { 0099 QList<KUriFilterSearchProvider *> searchProviders; 0100 populateProvidersList(searchProviders, data); 0101 if (searchProviders.isEmpty()) { 0102 if (!(option & KUriFilterData::RetrieveSearchProvidersOnly)) { 0103 setUriType(data, KUriFilterData::Error); 0104 setErrorMsg(data, i18n("No preferred search providers were found.")); 0105 return false; 0106 } 0107 } else { 0108 setSearchProvider(data, QString(), data.typedString(), QLatin1Char(KURISearchFilterEngine::self()->keywordDelimiter())); 0109 setSearchProviders(data, searchProviders); 0110 return true; 0111 } 0112 } 0113 0114 if (option & KUriFilterData::RetrieveSearchProvidersOnly) { 0115 QList<KUriFilterSearchProvider *> searchProviders; 0116 populateProvidersList(searchProviders, data, true); 0117 if (searchProviders.isEmpty()) { 0118 setUriType(data, KUriFilterData::Error); 0119 setErrorMsg(data, i18n("No search providers were found.")); 0120 return false; 0121 } 0122 0123 setSearchProvider(data, QString(), data.typedString(), QLatin1Char(KURISearchFilterEngine::self()->keywordDelimiter())); 0124 setSearchProviders(data, searchProviders); 0125 return true; 0126 } 0127 0128 if (data.uriType() == KUriFilterData::Unknown && data.uri().password().isEmpty()) { 0129 KURISearchFilterEngine *filter = KURISearchFilterEngine::self(); 0130 SearchProvider *provider = filter->autoWebSearchQuery(data.typedString(), data.alternateDefaultSearchProvider()); 0131 if (provider) { 0132 const QUrl result = filter->formatResult(provider->query(), provider->charset(), QString(), data.typedString(), true); 0133 setFilteredUri(data, result); 0134 setUriType(data, KUriFilterData::NetProtocol); 0135 setSearchProvider(data, provider->name(), data.typedString(), QLatin1Char(filter->keywordDelimiter())); 0136 0137 QList<KUriFilterSearchProvider *> searchProviders; 0138 populateProvidersList(searchProviders, data); 0139 setSearchProviders(data, searchProviders); 0140 return true; 0141 } 0142 } 0143 return false; 0144 } 0145 0146 #include "kuriikwsfilter.moc" 0147 0148 #include "moc_kuriikwsfilter.cpp"