File indexing completed on 2024-05-12 15:42:12

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"