blob: 476d716f235a61415dabee6d07e56ff790260318 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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;
}
|