Line data Source code
1 : #include "FeedParser.h"
2 :
3 : #include "RawFeed.h"
4 : #include "RSSAtomParser.h"
5 : #include "JSONFeedParser.h"
6 :
7 106 : FeedParseResult FeedParser::parse(const QByteArray& data)
8 : {
9 106 : if (data.trimmed().isEmpty()) {
10 2 : return FeedParseResult::failure(FeedParseError::EmptyInput);
11 : }
12 :
13 104 : if (looksLikeJSON(data)) {
14 10 : auto feed = JSONFeedParser::parse(data);
15 10 : if (feed) {
16 9 : return FeedParseResult::success(std::move(feed));
17 : }
18 :
19 : // Couldn't parse JSON, maybe it's RSS/Atom?
20 1 : return parseXML(data);
21 10 : }
22 :
23 94 : FeedParseResult xmlResult = parseXML(data);
24 94 : if (xmlResult.ok()) {
25 93 : return xmlResult;
26 : }
27 :
28 : // RSS/Atom parser failed, try JSON parser as fallback.
29 1 : auto feed = JSONFeedParser::parse(data);
30 1 : if (feed) {
31 1 : return FeedParseResult::success(std::move(feed));
32 : }
33 :
34 : // We tried. *shrugs*
35 0 : return xmlResult;
36 94 : }
37 :
38 104 : bool FeedParser::looksLikeJSON(const QByteArray& data)
39 : {
40 104 : for (int i = 0; i < data.size(); ++i) {
41 104 : char ch = data.at(i);
42 104 : if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') {
43 0 : continue;
44 : }
45 104 : return ch == '{';
46 : }
47 0 : return false;
48 : }
49 :
50 95 : FeedParseResult FeedParser::parseXML(const QByteArray& data)
51 : {
52 95 : auto feed = RSSAtomParser::parse(data);
53 95 : if (feed) {
54 93 : return FeedParseResult::success(std::move(feed));
55 : }
56 2 : return FeedParseResult::failure(FeedParseError::MalformedXML);
57 95 : }
|