RssFeed::RssFeed(RssManager* manager, RssFolder* parent, const QString& url): m_manager(manager), m_parent(parent), m_url (QUrl::fromEncoded(url.toUtf8()).toString()), m_icon(":/Icons/oxygen/application-rss+xml.png"), m_unreadCount(0), m_dirty(false), m_inErrorState(false), m_loading(false) { qDebug() << Q_FUNC_INFO << m_url; // Listen for new RSS downloads connect(manager->rssDownloader(), SIGNAL(downloadFinished(QString,QString)), SLOT(handleFinishedDownload(QString,QString))); connect(manager->rssDownloader(), SIGNAL(downloadFailure(QString,QString)), SLOT(handleDownloadFailure(QString,QString))); connect(manager->rssParser(), SIGNAL(feedTitle(QString,QString)), SLOT(handleFeedTitle(QString,QString))); connect(manager->rssParser(), SIGNAL(newArticle(QString,QVariantHash)), SLOT(handleNewArticle(QString,QVariantHash))); connect(manager->rssParser(), SIGNAL(feedParsingFinished(QString,QString)), SLOT(handleFeedParsingFinished(QString,QString))); // Download the RSS Feed icon m_iconUrl = iconUrl(); manager->rssDownloader()->downloadUrl(m_iconUrl); // Load old RSS articles loadItemsFromDisk(); }
// read and create items from a rss document void RssParser::parseFeed(const ParsingJob& job) { qDebug() << Q_FUNC_INFO << job.feedUrl << job.filePath; QFile fileRss(job.filePath); if (!fileRss.open(QIODevice::ReadOnly | QIODevice::Text)) { reportFailure(job, tr("Failed to open downloaded RSS file.")); return; } QXmlStreamReader xml(&fileRss); bool found_channel = false; while (xml.readNextStartElement()) { if (xml.name() == "rss") { // Find channels while (xml.readNextStartElement()) { if (xml.name() == "channel") { parseRSSChannel(xml, job.feedUrl); found_channel = true; break; } else { qDebug() << "Skip rss item: " << xml.name(); xml.skipCurrentElement(); } } break; } else if (xml.name() == "feed") { // Atom feed parseAtomChannel(xml, job.feedUrl); found_channel = true; break; } else { qDebug() << "Skip root item: " << xml.name(); xml.skipCurrentElement(); } } if (xml.hasError()) { reportFailure(job, xml.errorString()); return; } if (!found_channel) { reportFailure(job, tr("Invalid RSS feed at %1.").arg(job.feedUrl)); return; } // Clean up fileRss.close(); emit feedParsingFinished(job.feedUrl, QString()); fsutils::forceRemove(job.filePath); }
void RssParser::reportFailure(const ParsingJob& job, const QString& error) { emit feedParsingFinished(job.feedUrl, error); fsutils::forceRemove(job.filePath); }