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 | |