summaryrefslogtreecommitdiff
path: root/src/playground.cpp
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;
}