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
17namespace KNSCore
18{
19
20class ProviderBubbleWrap : public Provider
21{
22 Q_OBJECT
23public:
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 loadComments(const KNSCore::Entry &entry, int commentsPerPage, 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
170private:
171 QSharedPointer<KNSCore::ProviderCore> m_core;
172};
173
174} // namespace KNSCore
175

source code of knewstuff/src/core/providerbubblewrap_p.h