e8a15d396a
- Created kf6-attica recipe (minimal core library build providing KF6::Attica cmake target, needed by kf6-knewstuff). v6.10.0, QML/tests/examples disabled. - Added kf6-attica to redbear-full.toml config, integrate-redbear.sh symlink, and recipes/kde/ symlink. - Fixed kf6-knewstuff: removed stale find_package(KF6Attica) suppression; added kf6-attica as dependency. Now publishes to repo (core-only build produces empty package — upstream code structure yields no libs with QtQuick/widgets/tools off). - Cookbook topo-sort: changed cycle fallback from silent Ok(recipes) to Err(Recursion) — surfaces dependency graph bugs instead of hiding them. - Fixed stale QtNetwork comment: QtNetwork IS enabled in qtbase since 2026-04-29 (relibc DNS resolver hardened). - Verified: kf6-attica builds, kf6-knewstuff publishes to repo
94 lines
3.5 KiB
C++
94 lines
3.5 KiB
C++
/*
|
|
This file is part of KDE.
|
|
|
|
SPDX-FileCopyrightText: 2008 Cornelius Schumacher <schumacher@kde.org>
|
|
|
|
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
|
*/
|
|
|
|
#include "contentparser.h"
|
|
|
|
#include <QDateTime>
|
|
#include <QDebug>
|
|
|
|
using namespace Attica;
|
|
|
|
Content Content::Parser::parseXml(QXmlStreamReader &xml)
|
|
{
|
|
Content content;
|
|
|
|
while (!xml.atEnd()) {
|
|
xml.readNext();
|
|
|
|
if (xml.isStartElement()) {
|
|
if (xml.name() == QLatin1String("id")) {
|
|
content.setId(xml.readElementText());
|
|
} else if (xml.name() == QLatin1String("name")) {
|
|
content.setName(xml.readElementText());
|
|
} else if (xml.name() == QLatin1String("score")) {
|
|
content.setRating(xml.readElementText().toInt());
|
|
} else if (xml.name() == QLatin1String("downloads")) {
|
|
content.setDownloads(xml.readElementText().toInt());
|
|
} else if (xml.name() == QLatin1String("comments")) {
|
|
content.setNumberOfComments(xml.readElementText().toInt());
|
|
} else if (xml.name() == QLatin1String("created")) {
|
|
// Qt doesn't accept +-Timezone modifiers, truncate if the string contains them
|
|
QString dateString = xml.readElementText().left(19);
|
|
content.setCreated(QDateTime::fromString(dateString, Qt::ISODate));
|
|
} else if (xml.name() == QLatin1String("changed")) {
|
|
// Qt doesn't accept +-Timezone modifiers, truncate if the string contains them
|
|
QString dateString = xml.readElementText().left(19);
|
|
content.setUpdated(QDateTime::fromString(dateString, Qt::ISODate));
|
|
} else if (xml.name() == QLatin1String("icon")) {
|
|
Icon icon;
|
|
icon.setUrl(QUrl(xml.readElementText()));
|
|
|
|
const QXmlStreamAttributes attributes = xml.attributes();
|
|
|
|
const auto width = attributes.value(QLatin1String("width"));
|
|
if (!width.isEmpty()) {
|
|
icon.setWidth(width.toInt());
|
|
}
|
|
|
|
const auto height = attributes.value(QLatin1String("height"));
|
|
if (!height.isEmpty()) {
|
|
icon.setHeight(height.toInt());
|
|
}
|
|
|
|
// append the icon to the current list of icons
|
|
QList<Icon> icons;
|
|
icons = content.icons();
|
|
icons.append(icon);
|
|
content.setIcons(icons);
|
|
} else if (xml.name() == QLatin1String("video")) {
|
|
QUrl video(xml.readElementText());
|
|
// append the video to the current list of videos
|
|
QList<QUrl> videos;
|
|
videos = content.videos();
|
|
videos.append(video);
|
|
content.setVideos(videos);
|
|
} else if (xml.name() == QLatin1String("tags")) {
|
|
content.setTags(xml.readElementText().split(QLatin1Char(',')));
|
|
} else {
|
|
content.addAttribute(xml.name().toString(), xml.readElementText());
|
|
}
|
|
}
|
|
|
|
if (xml.isEndElement() && xml.name() == QLatin1String("content")) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
// in case the server only sets creation date, use that as updated also
|
|
if (content.updated().isNull()) {
|
|
content.setUpdated(content.created());
|
|
}
|
|
|
|
return content;
|
|
}
|
|
|
|
QStringList Content::Parser::xmlElement() const
|
|
{
|
|
return QStringList(QStringLiteral("content"));
|
|
}
|