diff options
| author | Nikita Kostovsky <nikita@kostovsky.me> | 2025-06-22 16:54:02 +0200 |
|---|---|---|
| committer | Nikita Kostovsky <nikita@kostovsky.me> | 2025-06-22 16:54:02 +0200 |
| commit | f674e179d602d3ccb9818d28fe06f371059449dc (patch) | |
| tree | 996fb624986512de91581a18332f004d34220ba2 /src/playground.cpp | |
parse and insert feeds and items
Diffstat (limited to 'src/playground.cpp')
| -rw-r--r-- | src/playground.cpp | 108 |
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; +} |
