From 7dd09cfd8961c5df54e355e84edbbaee944db1ad Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 4 Nov 2015 06:56:26 +0100 Subject: [PATCH] Added method to feed interface to obtain all undeleted messages. --- CMakeLists.txt | 1 + src/core/feedsmodel.cpp | 26 +-------- src/core/message.cpp | 50 +++++++++++++++++ src/core/message.h | 44 +++++++++++++++ src/core/messagesmodel.h | 78 +------------------------- src/services/abstract/feed.h | 5 +- src/services/standard/standardfeed.cpp | 30 ++++++++++ src/services/standard/standardfeed.h | 4 +- 8 files changed, 135 insertions(+), 103 deletions(-) create mode 100755 src/core/message.cpp create mode 100755 src/core/message.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cd6c78b8a..6e387d3d8 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -413,6 +413,7 @@ set(APP_SOURCES src/core/parsingfactory.cpp src/core/feeddownloader.cpp src/core/feedsselection.cpp + src/core/message.cpp # ABSTRACT service sources. src/services/abstract/serviceentrypoint.cpp diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index faa773715..7f136c76e 100755 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -305,30 +305,8 @@ QList FeedsModel::feedsForScheduledUpdate(bool auto_update_now) { QList FeedsModel::messagesForFeeds(const QList &feeds) { QList messages; - QSqlDatabase database = qApp->database()->connection(objectName(), DatabaseFactory::FromSettings); - QSqlQuery query_read_msg(database); - query_read_msg.setForwardOnly(true); - query_read_msg.prepare("SELECT title, url, author, date_created, contents " - "FROM Messages " - "WHERE is_deleted = 0 AND feed = :feed;"); - - foreach (Feed *feed, feeds) { - query_read_msg.bindValue(QSL(":feed"), feed->id()); - - if (query_read_msg.exec()) { - while (query_read_msg.next()) { - Message message; - - message.m_feedId = feed->id(); - message.m_title = query_read_msg.value(0).toString(); - message.m_url = query_read_msg.value(1).toString(); - message.m_author = query_read_msg.value(2).toString(); - message.m_created = TextFactory::parseDateTime(query_read_msg.value(3).value()); - message.m_contents = query_read_msg.value(4).toString(); - - messages.append(message); - } - } + foreach (const Feed *feed, feeds) { + messages.append(feed->undeletedMessages()); } return messages; diff --git a/src/core/message.cpp b/src/core/message.cpp new file mode 100755 index 000000000..0dbcc1e86 --- /dev/null +++ b/src/core/message.cpp @@ -0,0 +1,50 @@ +#include "core/message.h" + + +Enclosure::Enclosure(const QString &url, const QString &mime) : m_url(url), m_mimeType(mime) { +} + +QList Enclosures::decodeEnclosuresFromString(const QString &enclosures_data) { + QList enclosures; + + foreach (const QString &single_enclosure, enclosures_data.split(ENCLOSURES_OUTER_SEPARATOR, QString::SkipEmptyParts)) { + Enclosure enclosure; + + if (single_enclosure.contains(ECNLOSURES_INNER_SEPARATOR)) { + QStringList mime_url = single_enclosure.split(ECNLOSURES_INNER_SEPARATOR); + + enclosure.m_mimeType = QByteArray::fromBase64(mime_url.at(0).toLocal8Bit()); + enclosure.m_url = QByteArray::fromBase64(mime_url.at(1).toLocal8Bit()); + } + else { + enclosure.m_url = QByteArray::fromBase64(single_enclosure.toLocal8Bit()); + } + + enclosures.append(enclosure); + } + + return enclosures; +} + +QString Enclosures::encodeEnclosuresToString(const QList &enclosures) { + QStringList enclosures_str; + + foreach (const Enclosure &enclosure, enclosures) { + if (enclosure.m_mimeType.isEmpty()) { + enclosures_str.append(enclosure.m_url.toLocal8Bit().toBase64()); + } + else { + enclosures_str.append(QString(enclosure.m_mimeType.toLocal8Bit().toBase64()) + + ECNLOSURES_INNER_SEPARATOR + + enclosure.m_url.toLocal8Bit().toBase64()); + } + } + + return enclosures_str.join(QString(ENCLOSURES_OUTER_SEPARATOR)); +} + +Message::Message() { + m_title = m_url = m_author = m_contents = ""; + m_feedId = 0; + m_enclosures = QList(); +} diff --git a/src/core/message.h b/src/core/message.h new file mode 100755 index 000000000..f76a4544f --- /dev/null +++ b/src/core/message.h @@ -0,0 +1,44 @@ +#ifndef MESSAGE_H +#define MESSAGE_H + +#include "definitions/definitions.h" + +#include +#include + +// Represents single enclosuresh + +struct Enclosure { + QString m_url; + QString m_mimeType; + + explicit Enclosure(const QString &url = QString(), const QString &mime = QString()); +}; + +// Represents single enclosure. +class Enclosures { + public: + static QList decodeEnclosuresFromString(const QString &enclosures_data); + static QString encodeEnclosuresToString(const QList &enclosures); +}; + +// Represents single message. +class Message { + public: + explicit Message(); + + QString m_title; + QString m_url; + QString m_author; + QString m_contents; + QDateTime m_created; + int m_feedId; + + QList m_enclosures; + + // Is true if "created" date was obtained directly + // from the feed, otherwise is false + bool m_createdFromFeed; +}; + +#endif // MESSAGE_H diff --git a/src/core/messagesmodel.h b/src/core/messagesmodel.h index 3c2138d7c..ad0d42a24 100755 --- a/src/core/messagesmodel.h +++ b/src/core/messagesmodel.h @@ -21,89 +21,13 @@ #include "definitions/definitions.h" #include "core/feedsselection.h" +#include "core/message.h" #include #include #include -#include -// Represents single enclosuresh - -struct Enclosure { - QString m_url; - QString m_mimeType; - - explicit Enclosure(const QString &url = QString(), const QString &mime = QString()) : m_url(url), m_mimeType(mime) { - } -}; - -// Represents single enclosure. -class Enclosures { - public: - static QList decodeEnclosuresFromString(const QString &enclosures_data) { - QList enclosures; - - foreach (const QString &single_enclosure, enclosures_data.split(ENCLOSURES_OUTER_SEPARATOR, QString::SkipEmptyParts)) { - Enclosure enclosure; - - if (single_enclosure.contains(ECNLOSURES_INNER_SEPARATOR)) { - QStringList mime_url = single_enclosure.split(ECNLOSURES_INNER_SEPARATOR); - - enclosure.m_mimeType = QByteArray::fromBase64(mime_url.at(0).toLocal8Bit()); - enclosure.m_url = QByteArray::fromBase64(mime_url.at(1).toLocal8Bit()); - } - else { - enclosure.m_url = QByteArray::fromBase64(single_enclosure.toLocal8Bit()); - } - - enclosures.append(enclosure); - } - - return enclosures; - } - - static QString encodeEnclosuresToString(const QList &enclosures) { - QStringList enclosures_str; - - foreach (const Enclosure &enclosure, enclosures) { - if (enclosure.m_mimeType.isEmpty()) { - enclosures_str.append(enclosure.m_url.toLocal8Bit().toBase64()); - } - else { - enclosures_str.append(QString(enclosure.m_mimeType.toLocal8Bit().toBase64()) + - ECNLOSURES_INNER_SEPARATOR + - enclosure.m_url.toLocal8Bit().toBase64()); - } - } - - return enclosures_str.join(QString(ENCLOSURES_OUTER_SEPARATOR)); - } -}; - -// Represents single message. -class Message { - public: - explicit Message() { - m_title = m_url = m_author = m_contents = ""; - m_feedId = 0; - m_enclosures = QList(); - } - - QString m_title; - QString m_url; - QString m_author; - QString m_contents; - QDateTime m_created; - int m_feedId; - - QList m_enclosures; - - // Is true if "created" date was obtained directly - // from the feed, otherwise is false - bool m_createdFromFeed; -}; - class MessagesModel : public QSqlTableModel { Q_OBJECT diff --git a/src/services/abstract/feed.h b/src/services/abstract/feed.h index 8d6c5fb40..ad41f8d04 100755 --- a/src/services/abstract/feed.h +++ b/src/services/abstract/feed.h @@ -20,6 +20,8 @@ #include "core/rootitem.h" +#include "core/message.h" + // Base class for "feed" nodes. class Feed : public RootItem { @@ -58,7 +60,8 @@ class Feed : public RootItem { // Updates counts of all/unread messages for this feed. virtual void updateCounts(bool including_total_count = true, bool update_feed_statuses = true) = 0; - + // Get ALL undeleted messages from this feed in one single list. + virtual QList undeletedMessages() const = 0; inline int autoUpdateInitialInterval() const { return m_autoUpdateInitialInterval; diff --git a/src/services/standard/standardfeed.cpp b/src/services/standard/standardfeed.cpp index 078fba56b..a8bd20436 100755 --- a/src/services/standard/standardfeed.cpp +++ b/src/services/standard/standardfeed.cpp @@ -110,6 +110,36 @@ void StandardFeed::editViaDialog() { */ } +QList StandardFeed::undeletedMessages() const { + QList messages; + + QSqlDatabase database = qApp->database()->connection("StandardFeed", DatabaseFactory::FromSettings); + QSqlQuery query_read_msg(database); + query_read_msg.setForwardOnly(true); + query_read_msg.prepare("SELECT title, url, author, date_created, contents " + "FROM Messages " + "WHERE is_deleted = 0 AND feed = :feed;"); + + query_read_msg.bindValue(QSL(":feed"), id()); + + if (query_read_msg.exec()) { + while (query_read_msg.next()) { + Message message; + + message.m_feedId = id(); + message.m_title = query_read_msg.value(0).toString(); + message.m_url = query_read_msg.value(1).toString(); + message.m_author = query_read_msg.value(2).toString(); + message.m_created = TextFactory::parseDateTime(query_read_msg.value(3).value()); + message.m_contents = query_read_msg.value(4).toString(); + + messages.append(message); + } + } + + return messages; +} + QString StandardFeed::typeToString(StandardFeed::Type type) { switch (type) { case Atom10: diff --git a/src/services/standard/standardfeed.h b/src/services/standard/standardfeed.h index 52fe743b5..4696709a1 100755 --- a/src/services/standard/standardfeed.h +++ b/src/services/standard/standardfeed.h @@ -68,6 +68,8 @@ class StandardFeed : public Feed { void editViaDialog(); + QList undeletedMessages() const; + // Obtains data related to this feed. QVariant data(int column, int role) const; @@ -157,7 +159,7 @@ class StandardFeed : public Feed { private: void init(); - private: + private: bool m_passwordProtected; QString m_username; QString m_password;