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"