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);
145 mCurrentRequest = request;
148 if (request.page > 0) {
149 Q_EMIT loadingFinished(request, Entry::List());
153 if (request.filter == Installed) {
154 qCDebug(KNEWSTUFFCORE) <<
"Installed entries: " << mId << installedEntries().size();
155 if (request.page == 0) {
156 Q_EMIT loadingFinished(request, installedEntries());
158 Q_EMIT loadingFinished(request, Entry::List());
163 QUrl url = downloadUrl(request.sortMode);
167 XmlLoader *loader =
new XmlLoader(
this);
168 connect(loader, &XmlLoader::signalLoaded,
this, &StaticXmlProvider::slotFeedFileLoaded);
169 connect(loader, &XmlLoader::signalFailed,
this, &StaticXmlProvider::slotFeedFailed);
170 loader->setFilter(request.filter);
171 loader->setSearchTerm(request.searchTerm);
173 mFeedLoaders.insert(request.sortMode, loader);
177 Q_EMIT loadingFailed(request);
181QUrl StaticXmlProvider::downloadUrl(SortMode mode)
const
186 url = mDownloadUrls.value(QStringLiteral(
"score"));
189 url = mDownloadUrls.value(
QString());
192 url = mDownloadUrls.value(QStringLiteral(
"latest"));
195 url = mDownloadUrls.value(QStringLiteral(
"downloads"));
199 url = mDownloadUrls.value(
QString());
204void StaticXmlProvider::slotFeedFileLoaded(
const QDomDocument &doc)
206 XmlLoader *loader = qobject_cast<KNSCore::XmlLoader *>(sender());
208 qWarning() <<
"Loader not found!";
209 Q_EMIT loadingFailed(mCurrentRequest);
217 TagsFilterChecker checker(tagFilter());
218 TagsFilterChecker downloadschecker(downloadTagFilter());
224 entry.setStatus(KNSCore::Entry::Downloadable);
225 entry.setProviderId(mId);
227 int index = mCachedEntries.indexOf(entry);
229 Entry cacheEntry = mCachedEntries.takeAt(index);
231 if ((cacheEntry.status() == KNSCore::Entry::Installed)
232 && ((cacheEntry.version() != entry.version()) || (cacheEntry.releaseDate() != entry.releaseDate()))) {
233 entry.setStatus(KNSCore::Entry::Updateable);
234 entry.setUpdateVersion(entry.version());
235 entry.setVersion(cacheEntry.version());
236 entry.setUpdateReleaseDate(entry.releaseDate());
237 entry.setReleaseDate(cacheEntry.releaseDate());
239 entry.setStatus(cacheEntry.status());
244 if (checker.filterAccepts(entry.tags())) {
245 bool filterAcceptsDownloads =
true;
246 if (entry.downloadCount() > 0) {
247 const auto downloadInfoList = entry.downloadLinkInformationList();
248 for (
const KNSCore::Entry::DownloadLinkInformation &dli : downloadInfoList) {
249 if (downloadschecker.filterAccepts(dli.tags)) {
250 filterAcceptsDownloads =
true;
255 if (filterAcceptsDownloads) {
256 mCachedEntries.append(entry);
258 if (searchIncludesEntry(entry)) {
259 switch (loader->filter()) {
264 if (entry.status() == KNSCore::Entry::Updateable) {
269 if (entry.uniqueId() == loader->searchTerm()) {
279 qCDebug(KNEWSTUFFCORE) <<
"Filter has excluded" << entry.name() <<
"on download filter" << downloadTagFilter();
282 qCDebug(KNEWSTUFFCORE) <<
"Filter has excluded" << entry.name() <<
"on entry filter" << tagFilter();
285 Q_EMIT loadingFinished(mCurrentRequest, entries);
288void StaticXmlProvider::slotFeedFailed()
290 Q_EMIT loadingFailed(mCurrentRequest);
293bool StaticXmlProvider::searchIncludesEntry(
const KNSCore::Entry &entry)
const
295 if (mCurrentRequest.filter == Updates) {
296 if (entry.status() != KNSCore::Entry::Updateable) {
301 if (mCurrentRequest.searchTerm.isEmpty()) {
304 QString search = mCurrentRequest.searchTerm;
312void StaticXmlProvider::loadPayloadLink(
const KNSCore::Entry &entry,
int)
314 qCDebug(KNEWSTUFFCORE) <<
"Payload: " << entry.
payload();
315 Q_EMIT payloadLinkLoaded(entry);
318Entry::List StaticXmlProvider::installedEntries()
const
321 for (
const Entry &entry : std::as_const(mCachedEntries)) {
322 if (entry.status() == KNSCore::Entry::Installed || entry.status() == KNSCore::Entry::Updateable) {
323 entries.append(entry);
331#include "moc_staticxmlprovider_p.cpp"
KNewStuff data entry container.
QString payload() const
Retrieve the file name of the object.
QString name(GameStandardAction 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
QString & insert(qsizetype position, QChar ch)
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