Rss code optimization

This commit is contained in:
Christophe Dumez
2011-01-25 18:54:27 +00:00
parent f0a2efd481
commit 4b3c04439e
11 changed files with 200 additions and 218 deletions

View File

@@ -99,7 +99,7 @@ void RSSImp::displayItemsListMenu(const QPoint&){
foreach(QTreeWidgetItem *item, selectedItems) { foreach(QTreeWidgetItem *item, selectedItems) {
qDebug("text(3) URL: %s", qPrintable(item->text(NEWS_URL_COL))); qDebug("text(3) URL: %s", qPrintable(item->text(NEWS_URL_COL)));
qDebug("text(2) TITLE: %s", qPrintable(item->text(NEWS_TITLE_COL))); qDebug("text(2) TITLE: %s", qPrintable(item->text(NEWS_TITLE_COL)));
if(listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL))->getItem(item->text(NEWS_ID))->has_attachment()) { if(listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL))->getItem(item->text(NEWS_ID)).hasAttachment()) {
has_attachment = true; has_attachment = true;
break; break;
} }
@@ -308,11 +308,11 @@ void RSSImp::on_updateAllButton_clicked() {
void RSSImp::downloadTorrent() { void RSSImp::downloadTorrent() {
QList<QTreeWidgetItem *> selected_items = listNews->selectedItems(); QList<QTreeWidgetItem *> selected_items = listNews->selectedItems();
foreach(const QTreeWidgetItem* item, selected_items) { foreach(const QTreeWidgetItem* item, selected_items) {
RssArticle* article = listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL))->getItem(item->text(NEWS_ID)); const RssArticle article = listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL))->getItem(item->text(NEWS_ID));
if(article->has_attachment()) { if(article.hasAttachment()) {
QBtSession::instance()->downloadFromUrl(article->getTorrentUrl()); QBtSession::instance()->downloadFromUrl(article.torrentUrl());
} else { } else {
QBtSession::instance()->downloadFromUrl(article->getLink()); QBtSession::instance()->downloadFromUrl(article.link());
} }
} }
} }
@@ -321,8 +321,8 @@ void RSSImp::downloadTorrent() {
void RSSImp::openNewsUrl() { void RSSImp::openNewsUrl() {
QList<QTreeWidgetItem *> selected_items = listNews->selectedItems(); QList<QTreeWidgetItem *> selected_items = listNews->selectedItems();
foreach(const QTreeWidgetItem* item, selected_items) { foreach(const QTreeWidgetItem* item, selected_items) {
RssArticle* news = listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL))->getItem(item->text(NEWS_ID)); const RssArticle news = listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL))->getItem(item->text(NEWS_ID));
QString link = news->getLink(); const QString link = news.link();
if(!link.isEmpty()) if(!link.isEmpty())
QDesktopServices::openUrl(QUrl(link)); QDesktopServices::openUrl(QUrl(link));
} }
@@ -442,7 +442,7 @@ void RSSImp::refreshNewsList(QTreeWidgetItem* item) {
if(!rss_item) return; if(!rss_item) return;
qDebug("Getting the list of news"); qDebug("Getting the list of news");
QList<RssArticle*> news; QList<RssArticle> news;
if(rss_item == rssmanager) if(rss_item == rssmanager)
news = RssManager::sortNewsList(rss_item->getUnreadNewsList()); news = RssManager::sortNewsList(rss_item->getUnreadNewsList());
else if(rss_item) else if(rss_item)
@@ -452,12 +452,12 @@ void RSSImp::refreshNewsList(QTreeWidgetItem* item) {
previous_news = 0; previous_news = 0;
listNews->clear(); listNews->clear();
qDebug("Got the list of news"); qDebug("Got the list of news");
foreach(RssArticle* article, news){ foreach(const RssArticle &article, news){
QTreeWidgetItem* it = new QTreeWidgetItem(listNews); QTreeWidgetItem* it = new QTreeWidgetItem(listNews);
it->setText(NEWS_TITLE_COL, article->getTitle()); it->setText(NEWS_TITLE_COL, article.title());
it->setText(NEWS_URL_COL, article->getParent()->getUrl()); it->setText(NEWS_URL_COL, article.parent()->getUrl());
it->setText(NEWS_ID, article->getId()); it->setText(NEWS_ID, article.guid());
if(article->isRead()){ if(article.isRead()){
it->setData(NEWS_TITLE_COL, Qt::ForegroundRole, QVariant(QColor("grey"))); it->setData(NEWS_TITLE_COL, Qt::ForegroundRole, QVariant(QColor("grey")));
it->setData(NEWS_ICON, Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png"))); it->setData(NEWS_ICON, Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png")));
}else{ }else{
@@ -489,20 +489,20 @@ void RSSImp::refreshTextBrowser() {
previous_news = item; previous_news = item;
} }
RssFeed *stream = listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL)); RssFeed *stream = listStreams->getRSSItemFromUrl(item->text(NEWS_URL_COL));
RssArticle* article = stream->getItem(item->text(NEWS_ID)); RssArticle article = stream->getItem(item->text(NEWS_ID));
QString html; QString html;
html += "<div style='border: 2px solid red; margin-left: 5px; margin-right: 5px; margin-bottom: 5px;'>"; html += "<div style='border: 2px solid red; margin-left: 5px; margin-right: 5px; margin-bottom: 5px;'>";
html += "<div style='background-color: #678db2; font-weight: bold; color: #fff;'>"+article->getTitle() + "</div>"; html += "<div style='background-color: #678db2; font-weight: bold; color: #fff;'>"+article.title() + "</div>";
if(article->getDate().isValid()) { if(article.date().isValid()) {
html += "<div style='background-color: #efefef;'><b>"+tr("Date: ")+"</b>"+article->getDate().toLocalTime().toString(Qt::SystemLocaleLongDate)+"</div>"; html += "<div style='background-color: #efefef;'><b>"+tr("Date: ")+"</b>"+article.date().toLocalTime().toString(Qt::SystemLocaleLongDate)+"</div>";
} }
if(!article->getAuthor().isEmpty()) { if(!article.author().isEmpty()) {
html += "<div style='background-color: #efefef;'><b>"+tr("Author: ")+"</b>"+article->getAuthor()+"</div>"; html += "<div style='background-color: #efefef;'><b>"+tr("Author: ")+"</b>"+article.author()+"</div>";
} }
html += "</div>"; html += "</div>";
html += "<divstyle='margin-left: 5px; margin-right: 5px;'>"+article->getDescription()+"</div>"; html += "<divstyle='margin-left: 5px; margin-right: 5px;'>"+article.description()+"</div>";
textBrowser->setHtml(html); textBrowser->setHtml(html);
article->setRead(); article.markAsRead();
item->setData(NEWS_TITLE_COL, Qt::ForegroundRole, QVariant(QColor("grey"))); item->setData(NEWS_TITLE_COL, Qt::ForegroundRole, QVariant(QColor("grey")));
item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png"))); item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/Icons/sphere.png")));
// Decrement feed nb unread news // Decrement feed nb unread news

View File

@@ -190,11 +190,7 @@ QDateTime RssArticle::parseDate(const QString &string) {
} }
// public constructor // public constructor
RssArticle::RssArticle(RssFeed* parent, QXmlStreamReader& xml): parent(parent), read(false) { RssArticle::RssArticle(RssFeed* parent, QXmlStreamReader& xml): m_parent(parent), m_read(false) {
is_valid = false;
torrent_url = QString::null;
news_link = QString::null;
title = QString::null;
while(!xml.atEnd()) { while(!xml.atEnd()) {
xml.readNext(); xml.readNext();
@@ -203,107 +199,108 @@ RssArticle::RssArticle(RssFeed* parent, QXmlStreamReader& xml): parent(parent),
if(xml.isStartElement()) { if(xml.isStartElement()) {
if(xml.name() == "title") { if(xml.name() == "title") {
title = xml.readElementText(); m_title = xml.readElementText();
} }
else if(xml.name() == "enclosure") { else if(xml.name() == "enclosure") {
if(xml.attributes().value("type") == "application/x-bittorrent") { if(xml.attributes().value("type") == "application/x-bittorrent") {
torrent_url = xml.attributes().value("url").toString(); m_torrentUrl = xml.attributes().value("url").toString();
} }
} }
else if(xml.name() == "link") { else if(xml.name() == "link") {
news_link = xml.readElementText(); m_link = xml.readElementText();
if(id.isEmpty()) if(m_guid.isEmpty())
id = news_link; m_guid = m_link;
} }
else if(xml.name() == "description") { else if(xml.name() == "description") {
description = xml.readElementText(); m_description = xml.readElementText();
} }
else if(xml.name() == "pubDate") { else if(xml.name() == "pubDate") {
date = parseDate(xml.readElementText()); m_date = parseDate(xml.readElementText());
} }
else if(xml.name() == "author") { else if(xml.name() == "author") {
author = xml.readElementText(); m_author = xml.readElementText();
} }
else if(xml.name() == "guid") { else if(xml.name() == "guid") {
id = xml.readElementText(); m_guid = xml.readElementText();
} }
} }
} }
if(!id.isEmpty())
is_valid = true;
} }
RssArticle::RssArticle(RssFeed* parent, QString _id, QString _title, QString _torrent_url, QString _news_link, QString _description, QDateTime _date, QString _author, bool _read): RssArticle::RssArticle(RssFeed* parent, const QString &guid):
parent(parent), id(_id), title(_title), torrent_url(_torrent_url), news_link(_news_link), description(_description), date(_date), author(_author), read(_read){ m_parent(parent), m_guid(guid) {
if(id.isEmpty())
id = news_link;
if(!id.isEmpty()) {
is_valid = true;
} else {
std::cerr << "ERROR: an invalid RSS item was saved" << std::endl;
is_valid = false;
}
} }
RssArticle::~RssArticle(){ RssArticle::~RssArticle(){
} }
bool RssArticle::has_attachment() const { bool RssArticle::hasAttachment() const {
return !torrent_url.isEmpty(); return !m_torrentUrl.isEmpty();
} }
QHash<QString, QVariant> RssArticle::toHash() const { QVariantHash RssArticle::toHash() const {
QHash<QString, QVariant> item; QVariantHash item;
item["title"] = title; item["title"] = m_title;
item["id"] = id; item["id"] = m_guid;
item["torrent_url"] = torrent_url; item["torrent_url"] = m_torrentUrl;
item["news_link"] = news_link; item["news_link"] = m_link;
item["description"] = description; item["description"] = m_description;
item["date"] = date; item["date"] = m_date;
item["author"] = author; item["author"] = m_author;
item["read"] = read; item["read"] = m_read;
return item; return item;
} }
RssArticle* RssArticle::fromHash(RssFeed* parent, const QHash<QString, QVariant> &h) { RssArticle hashToRssArticle(RssFeed* parent, const QVariantHash &h) {
return new RssArticle(parent, h.value("id", "").toString(), h["title"].toString(), h["torrent_url"].toString(), h["news_link"].toString(), const QString guid = h.value("id").toString();
h["description"].toString(), h["date"].toDateTime(), h["author"].toString(), h["read"].toBool()); if(guid.isEmpty()) return RssArticle();
RssArticle art(parent, guid);
art.m_title = h.value("title", "").toString();
art.m_torrentUrl = h.value("torrent_url", "").toString();
art.m_link = h.value("news_link", "").toString();
art.m_description = h.value("description").toString();
art.m_date = h.value("date").toDateTime();
art.m_author = h.value("author").toString();
art.m_read = h.value("read").toBool();
Q_ASSERT(art.isValid());
return art;
} }
RssFeed* RssArticle::getParent() const { RssFeed* RssArticle::parent() const {
return parent; return m_parent;
} }
bool RssArticle::isValid() const { bool RssArticle::isValid() const {
return is_valid; return !m_guid.isEmpty();
} }
QString RssArticle::getAuthor() const { QString RssArticle::author() const {
return author; return m_author;
} }
QString RssArticle::getTorrentUrl() const{ QString RssArticle::torrentUrl() const{
return torrent_url; return m_torrentUrl;
} }
QString RssArticle::getLink() const { QString RssArticle::link() const {
return news_link; return m_link;
} }
QString RssArticle::getDescription() const{ QString RssArticle::description() const{
if(description.isEmpty()) if(m_description.isNull())
return tr("No description available"); return "";
return description; return m_description;
} }
QDateTime RssArticle::getDate() const { QDateTime RssArticle::date() const {
return date; return m_date;
} }
bool RssArticle::isRead() const{ bool RssArticle::isRead() const{
return read; return m_read;
} }
void RssArticle::setRead(){ void RssArticle::markAsRead(){
read = true; m_read = true;
} }

View File

@@ -33,50 +33,50 @@
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QDateTime> #include <QDateTime>
#include <QHash> #include <QVariantHash>
class RssFeed; class RssFeed;
// Item of a rss stream, single information // Item of a rss stream, single information
class RssArticle: public QObject { class RssArticle {
Q_OBJECT
public: public:
RssArticle(RssFeed* parent, QXmlStreamReader& xml); RssArticle(RssFeed* parent, QXmlStreamReader& xml);
RssArticle(RssFeed* parent, QString _id, QString _title, RssArticle(RssFeed* parent = 0, const QString &guid = QString());
QString _torrent_url, QString _news_link, QString _description,
QDateTime _date, QString _author, bool _read);
~RssArticle(); ~RssArticle();
bool has_attachment() const; // Accessors
inline QString getId() const { return id; }
QHash<QString, QVariant> toHash() const;
static RssArticle* fromHash(RssFeed* parent, const QHash<QString, QVariant> &h);
RssFeed* getParent() const;
bool isValid() const; bool isValid() const;
inline QString getTitle() const { return title; } bool hasAttachment() const;
QString getAuthor() const; inline QString guid() const { return m_guid; }
QString getTorrentUrl() const; RssFeed* parent() const;
QString getLink() const; inline QString title() const { return m_title; }
QString getDescription() const; QString author() const;
QDateTime getDate() const; QString torrentUrl() const;
QString link() const;
QString description() const;
QDateTime date() const;
bool isRead() const; bool isRead() const;
void setRead(); // Setters
void markAsRead();
// Serialization
QVariantHash toHash() const;
friend RssArticle hashToRssArticle(RssFeed* parent, const QVariantHash &hash);
protected: protected:
QDateTime parseDate(const QString &string); QDateTime parseDate(const QString &string);
private: private:
RssFeed* parent; RssFeed* m_parent;
QString id; QString m_guid;
QString title; QString m_title;
QString torrent_url; QString m_torrentUrl;
QString news_link; QString m_link;
QString description; QString m_description;
QDateTime date; QDateTime m_date;
QString author; QString m_author;
bool is_valid; bool m_read;
bool read;
}; };
RssArticle hashToRssArticle(RssFeed* parent, const QVariantHash &hash);
#endif // RSSARTICLE_H #endif // RSSARTICLE_H

View File

@@ -129,9 +129,9 @@ void RssDownloadRule::setSavePath(const QString &save_path)
QStringList RssDownloadRule::findMatchingArticles(const RssFeed *feed) const QStringList RssDownloadRule::findMatchingArticles(const RssFeed *feed) const
{ {
QStringList ret; QStringList ret;
foreach(const RssArticle *art, feed->values()) { foreach(const RssArticle &art, feed->values()) {
if(matches(art->getTitle())) if(matches(art.title()))
ret << art->getTitle(); ret << art.title();
} }
return ret; return ret;
} }

View File

@@ -42,15 +42,13 @@ RssFeed::RssFeed(RssFolder* parent, QString _url): parent(parent), alias(""), ic
QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss"); QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss");
url = QUrl(_url).toString(); url = QUrl(_url).toString();
QHash<QString, QVariant> all_old_items = qBTRSS.value("old_items", QHash<QString, QVariant>()).toHash(); QHash<QString, QVariant> all_old_items = qBTRSS.value("old_items", QHash<QString, QVariant>()).toHash();
QVariantList old_items = all_old_items.value(url, QVariantList()).toList(); const QVariantList old_items = all_old_items.value(url, QVariantList()).toList();
qDebug("Loading %d old items for feed %s", old_items.size(), getName().toLocal8Bit().data()); qDebug("Loading %d old items for feed %s", old_items.size(), getName().toLocal8Bit().data());
foreach(const QVariant &var_it, old_items) { foreach(const QVariant &var_it, old_items) {
QHash<QString, QVariant> item = var_it.toHash(); QHash<QString, QVariant> item = var_it.toHash();
RssArticle *rss_item = RssArticle::fromHash(this, item); const RssArticle rss_item = hashToRssArticle(this, item);
if(rss_item->isValid()) { if(rss_item.isValid()) {
(*this)[rss_item->getId()] = rss_item; insert(rss_item.guid(), rss_item);
} else {
delete rss_item;
} }
} }
} }
@@ -60,16 +58,14 @@ RssFeed::~RssFeed(){
if(refreshed) { if(refreshed) {
QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss"); QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss");
QVariantList old_items; QVariantList old_items;
foreach(RssArticle *item, this->values()) { foreach(const RssArticle &item, this->values()) {
old_items << item->toHash(); old_items << item.toHash();
} }
qDebug("Saving %d old items for feed %s", old_items.size(), getName().toLocal8Bit().data()); qDebug("Saving %d old items for feed %s", old_items.size(), getName().toLocal8Bit().data());
QHash<QString, QVariant> all_old_items = qBTRSS.value("old_items", QHash<QString, QVariant>()).toHash(); QHash<QString, QVariant> all_old_items = qBTRSS.value("old_items", QHash<QString, QVariant>()).toHash();
all_old_items[url] = old_items; all_old_items[url] = old_items;
qBTRSS.setValue("old_items", all_old_items); qBTRSS.setValue("old_items", all_old_items);
} }
qDebug("Removing all item from feed");
removeAllItems();
qDebug("All items were removed"); qDebug("All items were removed");
if(QFile::exists(filePath)) if(QFile::exists(filePath))
misc::safeRemove(filePath); misc::safeRemove(filePath);
@@ -85,12 +81,6 @@ void RssFeed::refresh() {
parent->refreshStream(url); parent->refreshStream(url);
} }
// delete all the items saved
void RssFeed::removeAllItems() {
qDeleteAll(this->values());
this->clear();
}
void RssFeed::removeAllSettings() { void RssFeed::removeAllSettings() {
QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss"); QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss");
QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on", QHash<QString, QVariant>()).toHash(); QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on", QHash<QString, QVariant>()).toHash();
@@ -174,8 +164,8 @@ void RssFeed::setIconPath(QString path) {
iconPath = path; iconPath = path;
} }
RssArticle* RssFeed::getItem(QString id) const{ RssArticle& RssFeed::getItem(QString id) {
return this->value(id); return (*this)[id];
} }
unsigned int RssFeed::getNbNews() const{ unsigned int RssFeed::getNbNews() const{
@@ -183,29 +173,30 @@ unsigned int RssFeed::getNbNews() const{
} }
void RssFeed::markAllAsRead() { void RssFeed::markAllAsRead() {
foreach(RssArticle *item, this->values()){ QHash<QString, RssArticle>::iterator it;
item->setRead(); for(it = this->begin(); it != this->end(); it++) {
it.value().markAsRead();
} }
RssManager::instance()->forwardFeedInfosChanged(url, getName(), 0); RssManager::instance()->forwardFeedInfosChanged(url, getName(), 0);
} }
unsigned int RssFeed::getNbUnRead() const{ unsigned int RssFeed::getNbUnRead() const{
unsigned int nbUnread=0; unsigned int nbUnread=0;
foreach(RssArticle *item, this->values()) { foreach(const RssArticle &item, this->values()) {
if(!item->isRead()) if(!item.isRead())
++nbUnread; ++nbUnread;
} }
return nbUnread; return nbUnread;
} }
QList<RssArticle*> RssFeed::getNewsList() const{ QList<RssArticle> RssFeed::getNewsList() const{
return this->values(); return this->values();
} }
QList<RssArticle*> RssFeed::getUnreadNewsList() const { QList<RssArticle> RssFeed::getUnreadNewsList() const {
QList<RssArticle*> unread_news; QList<RssArticle> unread_news;
foreach(RssArticle *item, this->values()) { foreach(const RssArticle &item, this->values()) {
if(!item->isRead()) if(!item.isRead())
unread_news << item; unread_news << item;
} }
return unread_news; return unread_news;
@@ -274,11 +265,9 @@ short RssFeed::readDoc(QIODevice* device) {
image = xml.attributes().value("url").toString(); image = xml.attributes().value("url").toString();
} }
else if(xml.name() == "item") { else if(xml.name() == "item") {
RssArticle * item = new RssArticle(this, xml); RssArticle item(this, xml);
if(item->isValid() && !itemAlreadyExists(item->getId())) { if(item.isValid() && !itemAlreadyExists(item.guid())) {
this->insert(item->getId(), item); this->insert(item.guid(), item);
} else {
delete item;
} }
} }
} }
@@ -291,21 +280,23 @@ short RssFeed::readDoc(QIODevice* device) {
// RSS Feed Downloader // RSS Feed Downloader
if(RssSettings().isRssDownloadingEnabled()) { if(RssSettings().isRssDownloadingEnabled()) {
foreach(RssArticle* item, values()) { QHash<QString, RssArticle>::iterator it;
if(item->isRead()) continue; for(it = this->begin(); it != this->end(); it++) {
RssArticle &item = it.value();
if(item.isRead()) continue;
QString torrent_url; QString torrent_url;
if(item->has_attachment()) if(item.hasAttachment())
torrent_url = item->getTorrentUrl(); torrent_url = item.torrentUrl();
else else
torrent_url = item->getLink(); torrent_url = item.link();
// Check if the item should be automatically downloaded // Check if the item should be automatically downloaded
const RssDownloadRule matching_rule = RssDownloadRuleList::instance()->findMatchingRule(url, item->getTitle()); const RssDownloadRule matching_rule = RssDownloadRuleList::instance()->findMatchingRule(url, item.title());
if(matching_rule.isValid()) { if(matching_rule.isValid()) {
// Download the torrent // Download the torrent
QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item->getTitle()).arg(getName())); QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item.title()).arg(getName()));
QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule.savePath(), matching_rule.label()); QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule.savePath(), matching_rule.label());
// Item was downloaded, consider it as Read // Item was downloaded, consider it as Read
item->setRead(); item.markAsRead();
} }
} }
} }
@@ -316,11 +307,10 @@ void RssFeed::resizeList() {
const unsigned int max_articles = RssSettings().getRSSMaxArticlesPerFeed(); const unsigned int max_articles = RssSettings().getRSSMaxArticlesPerFeed();
const unsigned int nb_articles = this->size(); const unsigned int nb_articles = this->size();
if(nb_articles > max_articles) { if(nb_articles > max_articles) {
QList<RssArticle*> listItem = RssManager::sortNewsList(this->values()); const QList<RssArticle> listItem = RssManager::sortNewsList(this->values());
const int excess = nb_articles - max_articles; const int excess = nb_articles - max_articles;
for(int i=0; i<excess; ++i){ for(uint i=nb_articles-excess; i<nb_articles; ++i){
RssArticle *lastItem = listItem.takeLast(); this->remove(listItem.at(i).guid());
delete this->take(lastItem->getId());
} }
} }
} }

View File

@@ -37,9 +37,49 @@
class RssManager; class RssManager;
class RssFeed: public RssFile, public QHash<QString, RssArticle*> { class RssFeed: public RssFile, public QHash<QString, RssArticle> {
Q_OBJECT Q_OBJECT
public:
RssFeed(RssFolder* parent, QString _url);
~RssFeed();
RssFolder* getParent() const { return parent; }
void setParent(RssFolder* _parent) { parent = _parent; }
FileType getType() const;
void refresh();
QString getID() const { return url; }
void removeAllSettings();
bool itemAlreadyExists(QString hash);
void setLoading(bool val);
bool isLoading();
QString getTitle() const;
void rename(QString _alias);
QString getName() const;
QString getLink() const;
QString getUrl() const;
QString getDescription() const;
QString getImage() const;
QString getFilePath() const;
QString getIconPath() const;
bool hasCustomIcon() const;
void setIconPath(QString path);
RssArticle& getItem(QString name);
unsigned int getNbNews() const;
void markAllAsRead();
unsigned int getNbUnRead() const;
QList<RssArticle> getNewsList() const;
QList<RssArticle> getUnreadNewsList() const;
QString getIconUrl();
public slots:
void processDownloadedFile(QString file_path);
void setDownloadFailed();
private:
short readDoc(QIODevice* device);
void resizeList();
short openRss();
private: private:
RssFolder *parent; RssFolder *parent;
QString title; QString title;
@@ -55,46 +95,6 @@ private:
bool downloadFailure; bool downloadFailure;
bool currently_loading; bool currently_loading;
public slots:
void processDownloadedFile(QString file_path);
void setDownloadFailed();
public:
RssFeed(RssFolder* parent, QString _url);
~RssFeed();
RssFolder* getParent() const { return parent; }
void setParent(RssFolder* _parent) { parent = _parent; }
FileType getType() const;
void refresh();
QString getID() const { return url; }
void removeAllItems();
void removeAllSettings();
bool itemAlreadyExists(QString hash);
void setLoading(bool val);
bool isLoading();
QString getTitle() const;
void rename(QString _alias);
QString getName() const;
QString getLink() const;
QString getUrl() const;
QString getDescription() const;
QString getImage() const;
QString getFilePath() const;
QString getIconPath() const;
bool hasCustomIcon() const;
void setIconPath(QString path);
RssArticle* getItem(QString name) const;
unsigned int getNbNews() const;
void markAllAsRead();
unsigned int getNbUnRead() const;
QList<RssArticle*> getNewsList() const;
QList<RssArticle*> getUnreadNewsList() const;
QString getIconUrl();
private:
short readDoc(QIODevice* device);
void resizeList();
short openRss();
}; };

View File

@@ -50,15 +50,14 @@ public:
virtual FileType getType() const = 0; virtual FileType getType() const = 0;
virtual QString getName() const = 0; virtual QString getName() const = 0;
virtual QString getID() const = 0; virtual QString getID() const = 0;
virtual void removeAllItems() = 0;
virtual void rename(QString new_name) = 0; virtual void rename(QString new_name) = 0;
virtual void markAllAsRead() = 0; virtual void markAllAsRead() = 0;
virtual RssFolder* getParent() const = 0; virtual RssFolder* getParent() const = 0;
virtual void setParent(RssFolder*) = 0; virtual void setParent(RssFolder*) = 0;
virtual void refresh() = 0; virtual void refresh() = 0;
virtual void removeAllSettings() = 0; virtual void removeAllSettings() = 0;
virtual QList<RssArticle*> getNewsList() const = 0; virtual QList<RssArticle> getNewsList() const = 0;
virtual QList<RssArticle*> getUnreadNewsList() const = 0; virtual QList<RssArticle> getUnreadNewsList() const = 0;
QStringList getPath() const { QStringList getPath() const {
QStringList path; QStringList path;
if(getParent()) { if(getParent()) {

View File

@@ -89,7 +89,6 @@ void RssFolder::removeFile(QString ID) {
if(this->contains(ID)) { if(this->contains(ID)) {
RssFile* child = this->take(ID); RssFile* child = this->take(ID);
child->removeAllSettings(); child->removeAllSettings();
child->removeAllItems();
delete child; delete child;
} }
} }
@@ -124,17 +123,17 @@ void RssFolder::refresh() {
} }
} }
QList<RssArticle*> RssFolder::getNewsList() const { QList<RssArticle> RssFolder::getNewsList() const {
QList<RssArticle*> news; QList<RssArticle> news;
foreach(RssFile *child, this->values()) { foreach(const RssFile *child, this->values()) {
news << child->getNewsList(); news << child->getNewsList();
} }
return news; return news;
} }
QList<RssArticle*> RssFolder::getUnreadNewsList() const { QList<RssArticle> RssFolder::getUnreadNewsList() const {
QList<RssArticle*> unread_news; QList<RssArticle> unread_news;
foreach(RssFile *child, this->values()) { foreach(const RssFile *child, this->values()) {
unread_news << child->getUnreadNewsList(); unread_news << child->getUnreadNewsList();
} }
return unread_news; return unread_news;
@@ -295,9 +294,6 @@ void RssFolder::addFile(RssFile * item) {
} }
void RssFolder::removeAllItems() { void RssFolder::removeAllItems() {
foreach(RssFile* child, values()) {
child->removeAllItems();
}
qDeleteAll(values()); qDeleteAll(values());
clear(); clear();
} }

View File

@@ -59,8 +59,8 @@ public:
QString getName() const; QString getName() const;
QString getID() const; QString getID() const;
bool hasChild(QString ID); bool hasChild(QString ID);
QList<RssArticle*> getNewsList() const; QList<RssArticle> getNewsList() const;
QList<RssArticle*> getUnreadNewsList() const; QList<RssArticle> getUnreadNewsList() const;
void removeAllSettings(); void removeAllSettings();
void removeAllItems(); void removeAllItems();

View File

@@ -126,17 +126,17 @@ void RssManager::saveStreamList(){
settings.setRssFeedsAliases(aliases); settings.setRssFeedsAliases(aliases);
} }
void RssManager::insertSortElem(QList<RssArticle*> &list, RssArticle *item) { void RssManager::insertSortElem(QList<RssArticle> &list, const RssArticle &item) {
int i = 0; int i = 0;
while(i < list.size() && item->getDate() < list.at(i)->getDate()) { while(i < list.size() && item.date() < list.at(i).date()) {
++i; ++i;
} }
list.insert(i, item); list.insert(i, item);
} }
QList<RssArticle*> RssManager::sortNewsList(const QList<RssArticle*>& news_list) { QList<RssArticle> RssManager::sortNewsList(const QList<RssArticle>& news_list) {
QList<RssArticle*> new_list; QList<RssArticle> new_list;
foreach(RssArticle *item, news_list) { foreach(const RssArticle &item, news_list) {
insertSortElem(new_list, item); insertSortElem(new_list, item);
} }
return new_list; return new_list;

View File

@@ -45,8 +45,8 @@ public:
static RssManager* instance(); static RssManager* instance();
static void drop(); static void drop();
~RssManager(); ~RssManager();
static void insertSortElem(QList<RssArticle*> &list, RssArticle *item); static void insertSortElem(QList<RssArticle> &list, const RssArticle &item);
static QList<RssArticle*> sortNewsList(const QList<RssArticle*>& news_list); static QList<RssArticle> sortNewsList(const QList<RssArticle>& news_list);
public slots: public slots:
void loadStreamList(); void loadStreamList();