11#include "staticxmlprovider_p.h"
13#include "xmlloader_p.h"
16#include <knewstuffcore_debug.h>
17#include <tagsfilterchecker.h>
21StaticXmlProvider::StaticXmlProvider()
26QString StaticXmlProvider::id()
const
31bool StaticXmlProvider::setProviderXML(
const QDomElement &xmldata)
37 mUploadUrl =
QUrl(xmldata.
attribute(QStringLiteral(
"uploadurl")));
38 mNoUploadUrl =
QUrl(xmldata.
attribute(QStringLiteral(
"nouploadurl")));
45 url = xmldata.
attribute(QStringLiteral(
"downloadurl-latest"));
47 mDownloadUrls.insert(QStringLiteral(
"latest"),
QUrl(url));
50 url = xmldata.
attribute(QStringLiteral(
"downloadurl-score"));
52 mDownloadUrls.insert(QStringLiteral(
"score"),
QUrl(url));
55 url = xmldata.
attribute(QStringLiteral(
"downloadurl-downloads"));
57 mDownloadUrls.insert(QStringLiteral(
"downloads"),
QUrl(url));
62 if (!iconurl.isValid()) {
74 bool useThisTitle{
false};
81 if (systemLanguage == locale.language()) {
87 qCDebug(KNEWSTUFFCORE) <<
"add name for provider (" <<
this <<
"): " << e.
text();
94 if (
name().isEmpty()) {
100 if ((mNoUploadUrl.isValid()) && (mUploadUrl.isValid())) {
101 qWarning() <<
"StaticXmlProvider: both uploadurl and nouploadurl given";
105 if ((!mNoUploadUrl.isValid()) && (!mUploadUrl.isValid())) {
106 qWarning() <<
"StaticXmlProvider: neither uploadurl nor nouploadurl given";
110 if (mUploadUrl.isValid()) {
111 setWebsite(mUploadUrl);
113 setWebsite(mNoUploadUrl);
116 mId = mDownloadUrls[
QString()].url();
118 mId = mDownloadUrls[mDownloadUrls.begin().key()].url();
126void StaticXmlProvider::slotEmitProviderInitialized()
129 Q_EMIT providerInitialized(
this);
132bool StaticXmlProvider::isInitialized()
const
139 qCDebug(KNEWSTUFFCORE) <<
"Set cached entries " << cachedEntries.
size();
140 mCachedEntries.append(cachedEntries);
146 if (request.page > 0) {
147 Q_EMIT loadingFinished(request, Entry::List());
151 if (request.filter == Installed) {
152 qCDebug(KNEWSTUFFCORE) <<
"Installed entries: " << mId << installedEntries().size();
153 if (request.page == 0) {
154 Q_EMIT loadingFinished(request, installedEntries());
156 Q_EMIT loadingFinished(request, Entry::List());
161 QUrl url = downloadUrl(request.sortMode);
165 XmlLoader *loader =
new XmlLoader(
this);
167 slotFeedFileLoaded(request, doc);
169 connect(loader, &XmlLoader::signalFailed,
this, [
this, request] {
170 Q_EMIT loadingFailed(request);
172 loader->setFilter(request.filter);
173 loader->setSearchTerm(request.searchTerm);
175 mFeedLoaders.insert(request.sortMode, loader);
179 Q_EMIT loadingFailed(request);
183QUrl StaticXmlProvider::downloadUrl(SortMode mode)
const
188 url = mDownloadUrls.value(QStringLiteral(
"score"));
191 url = mDownloadUrls.value(
QString());
194 url = mDownloadUrls.value(QStringLiteral(
"latest"));
197 url = mDownloadUrls.value(QStringLiteral(
"downloads"));
201 url = mDownloadUrls.value(
QString());
208 XmlLoader *loader = qobject_cast<KNSCore::XmlLoader *>(sender());
210 qWarning() <<
"Loader not found!";
211 Q_EMIT loadingFailed(request);
219 TagsFilterChecker checker(tagFilter());
220 TagsFilterChecker downloadschecker(downloadTagFilter());
226 entry.setStatus(KNSCore::Entry::Downloadable);
227 entry.setProviderId(mId);
229 int index = mCachedEntries.indexOf(entry);
231 Entry cacheEntry = mCachedEntries.takeAt(index);
233 if ((cacheEntry.status() == KNSCore::Entry::Installed)
234 && ((cacheEntry.version() != entry.version()) || (cacheEntry.releaseDate() != entry.releaseDate()))) {
235 entry.setStatus(KNSCore::Entry::Updateable);
236 entry.setUpdateVersion(entry.version());
237 entry.setVersion(cacheEntry.version());
238 entry.setUpdateReleaseDate(entry.releaseDate());
239 entry.setReleaseDate(cacheEntry.releaseDate());
241 entry.setStatus(cacheEntry.status());
246 if (checker.filterAccepts(entry.tags())) {
247 bool filterAcceptsDownloads =
true;
248 if (entry.downloadCount() > 0) {
249 const auto downloadInfoList = entry.downloadLinkInformationList();
250 for (
const KNSCore::Entry::DownloadLinkInformation &dli : downloadInfoList) {
251 if (downloadschecker.filterAccepts(dli.tags)) {
252 filterAcceptsDownloads =
true;
257 if (filterAcceptsDownloads) {
258 mCachedEntries.append(entry);
260 if (searchIncludesEntry(request, entry)) {
261 switch (loader->filter()) {
266 if (entry.status() == KNSCore::Entry::Updateable) {
271 if (entry.uniqueId() == loader->searchTerm()) {
281 qCDebug(KNEWSTUFFCORE) <<
"Filter has excluded" << entry.name() <<
"on download filter" << downloadTagFilter();
284 qCDebug(KNEWSTUFFCORE) <<
"Filter has excluded" << entry.name() <<
"on entry filter" << tagFilter();
287 Q_EMIT loadingFinished(request, entries);
292 if (request.filter == Updates) {
293 if (entry.status() != KNSCore::Entry::Updateable) {
298 if (request.searchTerm.
isEmpty()) {
301 QString search = request.searchTerm;
309void StaticXmlProvider::loadPayloadLink(
const KNSCore::Entry &entry,
int)
311 qCDebug(KNEWSTUFFCORE) <<
"Payload: " << entry.
payload();
312 Q_EMIT payloadLinkLoaded(entry);
315Entry::List StaticXmlProvider::installedEntries()
const
318 for (
const Entry &entry : std::as_const(mCachedEntries)) {
319 if (entry.status() == KNSCore::Entry::Installed || entry.status() == KNSCore::Entry::Updateable) {
320 entries.append(entry);
328#include "moc_staticxmlprovider_p.cpp"
KNewStuff data entry container.
QString payload() const
Retrieve the file name of the object.
QString name(StandardAction id)
QDomElement documentElement() const const
QString attribute(const QString &name, const QString &defValue) const const
QString tagName() const const
QString text() const const
QDomNode firstChild() const const
QDomElement firstChildElement(const QString &tagName, const QString &namespaceURI) const const
bool isNull() const const
QDomNode nextSibling() const const
QDomElement nextSiblingElement(const QString &tagName, const QString &namespaceURI) const const
QDomElement toElement() const const
qsizetype size() const const
Language language() const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
QString trimmed() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QUrl fromLocalFile(const QString &localFile)
bool isEmpty() const const
used to keep track of a search