summaryrefslogtreecommitdiff
path: root/src/playground.cpp
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-06-22 16:54:02 +0200
committerNikita Kostovsky <nikita@kostovsky.me>2025-06-22 16:54:02 +0200
commitf674e179d602d3ccb9818d28fe06f371059449dc (patch)
tree996fb624986512de91581a18332f004d34220ba2 /src/playground.cpp
parse and insert feeds and items
Diffstat (limited to 'src/playground.cpp')
-rw-r--r--src/playground.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/playground.cpp b/src/playground.cpp
new file mode 100644
index 0000000..476d716
--- /dev/null
+++ b/src/playground.cpp
@@ -0,0 +1,108 @@
+#include "playground.h"
+
+#include <QDebug>
+#include <QLocale>
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QTimer>
+#include <QXmlStreamReader>
+
+#include "atomchannel.h"
+#include "macros.h"
+
+Playground::Playground()
+ : m_networkManager{new QNetworkAccessManager}
+{
+ connect(m_networkManager, &QNetworkAccessManager::finished, this, &Playground::onReplyFinished);
+}
+
+void Playground::fetchUrl(const QUrl &url)
+{
+ m_networkManager->get(QNetworkRequest{url});
+}
+
+void Playground::onReplyFinished(QNetworkReply *reply)
+{
+ // TODO: check for nullptr
+
+ reply->deleteLater();
+
+ qDebug() << "reply size:" << reply->size();
+
+ parseFeed(reply);
+}
+
+std::shared_ptr<AtomChannel> Playground::parseFeed(QIODevice *ioDevice)
+{
+ // TODO: check for nullptr
+ // TODO: try `QNetworkReply::readyRead` instead of `QNetworkAccessManager::finished`
+ std::shared_ptr<AtomChannel> channel{};
+ QXmlStreamReader xmlReader{ioDevice};
+
+ while (!xmlReader.atEnd() && !xmlReader.hasError()) {
+ const auto next = xmlReader.readNext();
+
+ // qDebug() << "\tnext:" << next;
+
+ switch (next) {
+ case QXmlStreamReader::TokenType::NoToken:
+ qDebug() << "NoToken";
+ break;
+ case QXmlStreamReader::TokenType::Invalid:
+ qDebug() << "Invalid";
+ break;
+ case QXmlStreamReader::TokenType::StartDocument:
+ // qDebug() << "StartDocument";
+ break;
+ case QXmlStreamReader::TokenType::EndDocument:
+ // qDebug() << "EndDocument";
+ break;
+ case QXmlStreamReader::TokenType::StartElement: {
+ const auto startElementName = xmlReader.name();
+ // qDebug() << "StartElement: " << startElementName;
+
+ if (startElementName == AtomChannel::xmlTag) {
+ channel = std::make_shared<AtomChannel>(&xmlReader);
+ // qDebug() << *channel;
+ } /* else if (startElementName == itemTag) {
+ const AtomItem item{&xmlReader};
+ qDebug() << item;
+ }*/
+
+ break;
+ }
+ case QXmlStreamReader::TokenType::EndElement:
+ // qDebug() << "EndElement: " << xmlReader.name();
+ break;
+ case QXmlStreamReader::TokenType::Characters: {
+ const auto characters = xmlReader.text().toString().simplified();
+
+ if (characters.isEmpty())
+ break;
+
+ qDebug() << "Characters";
+ break;
+ }
+ case QXmlStreamReader::TokenType::Comment:
+ qDebug() << "Comment";
+ break;
+ case QXmlStreamReader::TokenType::DTD:
+ qDebug() << "DTD";
+ break;
+ case QXmlStreamReader::TokenType::EntityReference:
+ qDebug() << "EntityReference";
+ break;
+ case QXmlStreamReader::TokenType::ProcessingInstruction:
+ qDebug() << "ProcessingInstruction";
+ break;
+ }
+
+ if (xmlReader.hasError()) {
+ qWarning() << "xml parsing error:" << xmlReader.errorString();
+
+ return {};
+ }
+ }
+
+ return channel;
+}