forked from isaevi/PodcastLoader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrssfetcher.cpp
69 lines (62 loc) · 1.9 KB
/
rssfetcher.cpp
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
#include <QString>
#include <QNetworkReply>
#include <QUrl>
#include <QXmlStreamReader>
#include "rssfetcher.h"
#include "parser.h"
#include "feeddata.h"
#include "rssapplication.h"
RssFetcher::RssFetcher(FeedData *feed) : QObject()
{
_feed = feed;
_currentReply = nullptr;
}
void RssFetcher::Fetch(const QUrl &url)
{
QNetworkRequest request(url);
if (_currentReply) {
_currentReply->disconnect(this);
_currentReply->deleteLater();
}
_currentReply = qApp->networkAccessMenager()->get(request);
connect(_currentReply, SIGNAL(finished()), SLOT(finished()));
connect(_currentReply, SIGNAL(metaDataChanged()), this, SLOT(metaDataChanged()));
connect(_currentReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error(QNetworkReply::NetworkError)));
}
void RssFetcher::metaDataChanged()
{
QUrl redirectionTarget = _currentReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
if (redirectionTarget.isValid()) {
Fetch(redirectionTarget);
}
}
void RssFetcher::finished()
{
int statusCode = _currentReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (statusCode >= 200 && statusCode < 300) {
QByteArray data = _currentReply->readAll();
QVector<RecordInfo*> records = Parser::parseXml(data);
QList<RecordInfo*> result;
for(auto rec : records)
{
if(!_feed->isContainsAmongProcessed(rec->guid()))
{
rec->setFeed(_feed);
result.append(rec);
}
}
emit finished(result, _feed);
}
else
emit canceled();
_currentReply->deleteLater();
_currentReply = nullptr;
}
void RssFetcher::error(QNetworkReply::NetworkError)
{
qWarning("error retrieving RSS feed");
_currentReply->disconnect(this);
_currentReply->deleteLater();
_currentReply = nullptr;
emit canceled();
}