#include "playground.h" #include #include #include #include #include #include #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 Playground::parseFeed(QIODevice *ioDevice) { // TODO: check for nullptr // TODO: try `QNetworkReply::readyRead` instead of `QNetworkAccessManager::finished` std::shared_ptr 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(&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; }