| 1 | // SPDX-License-Identifier: LGPL-2.1-or-later |
| 2 | // SPDX-FileCopyrightText: 2009 Jeremy Whiting <jpwhiting@kde.org> |
| 3 | // SPDX-FileCopyrightText: 2009 Frederik Gladhorn <gladhorn@kde.org> |
| 4 | // SPDX-FileCopyrightText: 2021 Dan Leinir Turthra Jensen <admin@leinir.dk> |
| 5 | // SPDX-FileCopyrightText: 2024 Harald Sitter <sitter@kde.org> |
| 6 | |
| 7 | #pragma once |
| 8 | |
| 9 | #include "compat_p.h" |
| 10 | #include "provider.h" |
| 11 | #include "provider_p.h" |
| 12 | #include "providerbase_p.h" |
| 13 | #include "providercore.h" |
| 14 | #include "providercore_p.h" |
| 15 | #include "searchrequest_p.h" |
| 16 | |
| 17 | namespace KNSCore |
| 18 | { |
| 19 | |
| 20 | class ProviderBubbleWrap : public Provider |
| 21 | { |
| 22 | Q_OBJECT |
| 23 | public: |
| 24 | ProviderBubbleWrap(const QSharedPointer<KNSCore::ProviderCore> &core) |
| 25 | : m_core(core) |
| 26 | { |
| 27 | // These are unidirectional. |
| 28 | connect(sender: m_core->d->base, signal: &ProviderBase::basicsLoaded, context: this, slot: [this] { |
| 29 | // The Provider async loads these and eventually emits loaded. Technically they |
| 30 | // could get set by the outside, we actively do not support this though. |
| 31 | setVersion(m_core->d->base->version()); |
| 32 | setWebsite(m_core->d->base->website()); |
| 33 | setHost(m_core->d->base->host()); |
| 34 | setContactEmail(m_core->d->base->contactEmail()); |
| 35 | setSupportsSsl(m_core->d->base->supportsSsl()); |
| 36 | Q_EMIT basicsLoaded(); |
| 37 | }); |
| 38 | connect(sender: m_core->d->base, signal: &ProviderBase::providerInitialized, context: this, slot: [this](const auto & /*providerBase*/) { |
| 39 | Q_EMIT providerInitialized(this); |
| 40 | }); |
| 41 | connect(sender: m_core->d->base, signal: &ProviderBase::entriesLoaded, context: this, slot: [this](const auto &request, const auto &entries) { |
| 42 | Q_EMIT loadingFinished(KNSCompat::searchRequestToLegacy(request), entries); |
| 43 | }); |
| 44 | connect(sender: m_core->d->base, signal: &ProviderBase::loadingDone, context: this, slot: [this](const auto &request) { |
| 45 | Q_EMIT loadingFinished(KNSCompat::searchRequestToLegacy(request), {}); |
| 46 | }); |
| 47 | connect(sender: m_core->d->base, signal: &ProviderBase::loadingFailed, context: this, slot: [this](const auto &request) { |
| 48 | Q_EMIT loadingFailed(KNSCompat::searchRequestToLegacy(request)); |
| 49 | }); |
| 50 | connect(sender: m_core->d->base, signal: &ProviderBase::entryDetailsLoaded, context: this, slot: &Provider::entryDetailsLoaded); |
| 51 | connect(sender: m_core->d->base, signal: &ProviderBase::payloadLinkLoaded, context: this, slot: &Provider::payloadLinkLoaded); |
| 52 | connect(sender: m_core->d->base, signal: &ProviderBase::commentsLoaded, context: this, slot: &Provider::commentsLoaded); |
| 53 | connect(sender: m_core->d->base, signal: &ProviderBase::personLoaded, context: this, slot: &Provider::personLoaded); |
| 54 | connect(sender: m_core->d->base, signal: &ProviderBase::searchPresetsLoaded, context: this, slot: [this](const auto &presets) { |
| 55 | QList<KNSCore::Provider::SearchPreset> legacies; |
| 56 | legacies.reserve(size: presets.size()); |
| 57 | for (const auto &preset : presets) { |
| 58 | legacies.append(KNSCompat::searchPresetToLegacy(preset)); |
| 59 | } |
| 60 | Q_EMIT searchPresetsLoaded(presets: legacies); |
| 61 | }); |
| 62 | connect(sender: m_core->d->base, signal: &ProviderBase::signalInformation, context: this, slot: &Provider::signalInformation); |
| 63 | connect(sender: m_core->d->base, signal: &ProviderBase::signalError, context: this, slot: &Provider::signalError); |
| 64 | connect(sender: m_core->d->base, signal: &ProviderBase::signalErrorCode, context: this, slot: &Provider::signalErrorCode); |
| 65 | connect(sender: m_core->d->base, signal: &ProviderBase::categoriesMetadataLoaded, context: this, slot: [this](const QList<KNSCore::CategoryMetadata> &categories) { |
| 66 | QList<KNSCore::Provider::CategoryMetadata> legacies; |
| 67 | legacies.reserve(asize: categories.size()); |
| 68 | for (const auto &category : categories) { |
| 69 | legacies.append(t: KNSCompat::categoryMetadataToLegacy(metadata: category)); |
| 70 | } |
| 71 | Q_EMIT categoriesMetadataLoded(categories: legacies); |
| 72 | }); |
| 73 | |
| 74 | // These are bidirectional. We do not use public setters for these to avoid change signal loops. |
| 75 | // Bit awkward to hop through all the d pointers but this class is not going to outlife KF6 anyway. |
| 76 | connect(sender: m_core->d->base, signal: &ProviderBase::tagFilterChanged, context: this, slot: [this] { |
| 77 | d->tagFilter = m_core->d->base->tagFilter(); |
| 78 | }); |
| 79 | connect(sender: this, signal: &Provider::tagFilterChanged, context: this, slot: [this] { |
| 80 | m_core->d->base->d->tagFilter = d->tagFilter; |
| 81 | }); |
| 82 | connect(sender: m_core->d->base, signal: &ProviderBase::downloadTagFilterChanged, context: this, slot: [this] { |
| 83 | d->downloadTagFilter = m_core->d->base->downloadTagFilter(); |
| 84 | }); |
| 85 | connect(sender: this, signal: &Provider::downloadTagFilterChanged, context: this, slot: [this] { |
| 86 | m_core->d->base->d->downloadTagFilter = d->downloadTagFilter; |
| 87 | }); |
| 88 | } |
| 89 | |
| 90 | [[nodiscard]] QString id() const override |
| 91 | { |
| 92 | return m_core->d->base->id(); |
| 93 | } |
| 94 | |
| 95 | bool setProviderXML(const QDomElement &xmldata) override |
| 96 | { |
| 97 | return m_core->d->base->setProviderXML(xmldata); |
| 98 | } |
| 99 | |
| 100 | [[nodiscard]] bool isInitialized() const override |
| 101 | { |
| 102 | return m_core->d->base->isInitialized(); |
| 103 | } |
| 104 | |
| 105 | void setCachedEntries(const KNSCore::Entry::List &cachedEntries) override |
| 106 | { |
| 107 | m_core->d->base->setCachedEntries(cachedEntries); |
| 108 | } |
| 109 | |
| 110 | [[nodiscard]] QString name() const override |
| 111 | { |
| 112 | return m_core->d->base->name(); |
| 113 | } |
| 114 | |
| 115 | [[nodiscard]] QUrl icon() const override |
| 116 | { |
| 117 | return m_core->d->base->icon(); |
| 118 | } |
| 119 | |
| 120 | void loadEntries(const KNSCore::Provider::SearchRequest &request) override |
| 121 | { |
| 122 | m_core->d->base->loadEntries(request: searchRequestFromLegacy(request)); |
| 123 | } |
| 124 | |
| 125 | void loadEntryDetails(const KNSCore::Entry &entry) override |
| 126 | { |
| 127 | m_core->d->base->loadEntryDetails(entry); |
| 128 | } |
| 129 | |
| 130 | void loadPayloadLink(const Entry &entry, int linkId) override |
| 131 | { |
| 132 | m_core->d->base->loadPayloadLink(entry, linkId); |
| 133 | } |
| 134 | |
| 135 | void (const KNSCore::Entry &entry, int , int page) override |
| 136 | { |
| 137 | m_core->d->base->loadComments(entry, commentsPerPage, page); |
| 138 | } |
| 139 | |
| 140 | void loadPerson(const QString &username) override |
| 141 | { |
| 142 | m_core->d->base->loadPerson(username); |
| 143 | } |
| 144 | |
| 145 | void loadBasics() override |
| 146 | { |
| 147 | // Noop. Basics (host, website, ssl etc.) now load on-demand. |
| 148 | } |
| 149 | |
| 150 | bool userCanVote() override |
| 151 | { |
| 152 | return m_core->d->base->userCanVote(); |
| 153 | } |
| 154 | |
| 155 | void vote(const Entry &entry, uint rating) override |
| 156 | { |
| 157 | m_core->d->base->vote(entry, rating); |
| 158 | } |
| 159 | |
| 160 | bool userCanBecomeFan() override |
| 161 | { |
| 162 | return m_core->d->base->userCanBecomeFan(); |
| 163 | } |
| 164 | |
| 165 | void becomeFan(const Entry &entry) override |
| 166 | { |
| 167 | m_core->d->base->becomeFan(entry); |
| 168 | } |
| 169 | |
| 170 | private: |
| 171 | QSharedPointer<KNSCore::ProviderCore> m_core; |
| 172 | }; |
| 173 | |
| 174 | } // namespace KNSCore |
| 175 | |