From 806a5a0475e471b6ce32822163d7034a571250f2 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 21 Dec 2015 08:45:31 +0100 Subject: [PATCH] Work on adding feeds. --- src/services/tt-rss/definitions.h | 9 +++ src/services/tt-rss/gui/formeditfeed.cpp | 18 +++++- .../tt-rss/network/ttrssnetworkfactory.cpp | 55 +++++++++++++++++++ .../tt-rss/network/ttrssnetworkfactory.h | 12 ++++ src/services/tt-rss/ttrssfeed.cpp | 28 ++++++++++ src/services/tt-rss/ttrssfeed.h | 2 + 6 files changed, 122 insertions(+), 2 deletions(-) diff --git a/src/services/tt-rss/definitions.h b/src/services/tt-rss/definitions.h index f9d5c5368..fde6a541a 100755 --- a/src/services/tt-rss/definitions.h +++ b/src/services/tt-rss/definitions.h @@ -31,4 +31,13 @@ // Get feed tree. #define GFT_TYPE_CATEGORY "category" +// Subscribe to feed. +#define STF_UNKNOWN -1 +#define STF_UPDATED 0 +#define STF_INVALID_URL 2 +#define STF_UNREACHABLE_URL 5 +#define STF_URL_NO_FEED 3 +#define STF_URL_MANY_FEEDS 4 +#define STF_INSERTED 1 + #endif // DEFINITIONS_H diff --git a/src/services/tt-rss/gui/formeditfeed.cpp b/src/services/tt-rss/gui/formeditfeed.cpp index b55bca0d8..21f8d344d 100755 --- a/src/services/tt-rss/gui/formeditfeed.cpp +++ b/src/services/tt-rss/gui/formeditfeed.cpp @@ -198,9 +198,23 @@ void FormEditFeed::saveFeed() { } void FormEditFeed::addNewFeed() { - // Store feed online and if successfull, then store into DB/model. + TtRssFeed *new_feed= new TtRssFeed(); + RootItem *parent = static_cast(m_ui->m_cmbParentCategory->itemData(m_ui->m_cmbParentCategory->currentIndex()).value()); - // TODO: todo + new_feed->setAutoUpdateType(static_cast(m_ui->m_cmbAutoUpdateType->itemData(m_ui->m_cmbAutoUpdateType->currentIndex()).toInt())); + new_feed->setAutoUpdateInitialInterval(m_ui->m_spinAutoUpdateInterval->value()); + + if (new_feed->addItself(parent, m_ui->m_txtUrl->lineEdit()->text(), m_ui->m_gbAuthentication->isChecked(), + m_ui->m_txtUsername->lineEdit()->text(), m_ui->m_txtPassword->lineEdit()->text())) { + m_root->requestItemReassignment(new_feed, parent); + accept(); + } + else { + delete new_feed; + qApp->showGuiMessage(tr("Cannot add feed"), + tr("Feed was not added due to error."), + QSystemTrayIcon::Critical, this, true); + } } void FormEditFeed::loadCategories(const QList categories, RootItem *root_item) { diff --git a/src/services/tt-rss/network/ttrssnetworkfactory.cpp b/src/services/tt-rss/network/ttrssnetworkfactory.cpp index 06f920050..745170645 100755 --- a/src/services/tt-rss/network/ttrssnetworkfactory.cpp +++ b/src/services/tt-rss/network/ttrssnetworkfactory.cpp @@ -28,6 +28,7 @@ #include "network-web/networkfactory.h" #include +#include TtRssNetworkFactory::TtRssNetworkFactory() @@ -229,6 +230,43 @@ TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList return result; } +TtRssSubscribeToFeedResponse TtRssNetworkFactory::subscribeToFeed(const QString &url, int category_id, + bool protectd, const QString &username, + const QString &password) { + QtJson::JsonObject json; + json["op"] = "subscribeToFeed"; + json["sid"] = m_sessionId; + json["feed_url"] = url; + json["category_id"] = category_id; + + if (protectd) { + json["login"] = username; + json["password"] = password; + } + + QByteArray result_raw; + NetworkResult network_reply = NetworkFactory::uploadData(m_url, DOWNLOAD_TIMEOUT, QtJson::serialize(json), CONTENT_TYPE, result_raw, + m_authIsUsed, m_authUsername, m_authPassword); + TtRssSubscribeToFeedResponse result(QString::fromUtf8(result_raw)); + + if (result.isNotLoggedIn()) { + // We are not logged in. + login(); + json["sid"] = m_sessionId; + + network_reply = NetworkFactory::uploadData(m_url, DOWNLOAD_TIMEOUT, QtJson::serialize(json), CONTENT_TYPE, result_raw, + m_authIsUsed, m_authUsername, m_authPassword); + result = TtRssSubscribeToFeedResponse(QString::fromUtf8(result_raw)); + } + + if (network_reply.first != QNetworkReply::NoError) { + qWarning("TT-RSS: updateArticle failed with error %d.", network_reply.first); + } + + m_lastError = network_reply.first; + return result; +} + /* TtRssGetConfigResponse TtRssNetworkFactory::getConfig() { QtJson::JsonObject json; @@ -533,3 +571,20 @@ TtRssGetConfigResponse::TtRssGetConfigResponse(const QString &raw_content) : TtR TtRssGetConfigResponse::~TtRssGetConfigResponse() { } */ + + +TtRssSubscribeToFeedResponse::TtRssSubscribeToFeedResponse(const QString &raw_content) : TtRssResponse(raw_content) { + +} + +TtRssSubscribeToFeedResponse::~TtRssSubscribeToFeedResponse() { +} + +int TtRssSubscribeToFeedResponse::code() const { + if (m_rawContent.contains(QSL("content"))) { + return m_rawContent["content"].toMap()["code"].toInt(); + } + else { + return STF_UNKNOWN; + } +} diff --git a/src/services/tt-rss/network/ttrssnetworkfactory.h b/src/services/tt-rss/network/ttrssnetworkfactory.h index 211b82ac7..9f92dea91 100755 --- a/src/services/tt-rss/network/ttrssnetworkfactory.h +++ b/src/services/tt-rss/network/ttrssnetworkfactory.h @@ -28,6 +28,7 @@ class RootItem; +class TtRssFeed; class TtRssResponse { public: @@ -83,6 +84,14 @@ class TtRssUpdateArticleResponse : public TtRssResponse { int articlesUpdated() const; }; +class TtRssSubscribeToFeedResponse : public TtRssResponse { + public: + explicit TtRssSubscribeToFeedResponse(const QString &raw_content = QString()); + virtual ~TtRssSubscribeToFeedResponse(); + + int code() const; +}; + /* class TtRssGetConfigResponse : public TtRssResponse { public: @@ -156,6 +165,9 @@ class TtRssNetworkFactory { TtRssUpdateArticleResponse updateArticles(const QStringList &ids, UpdateArticle::OperatingField field, UpdateArticle::Mode mode); + TtRssSubscribeToFeedResponse subscribeToFeed(const QString &url, int category_id, bool protectd = false, + const QString &username = QString(), const QString &password = QString()); + //TtRssGetConfigResponse getConfig(); private: diff --git a/src/services/tt-rss/ttrssfeed.cpp b/src/services/tt-rss/ttrssfeed.cpp index 6fbdc0fb1..85f946994 100755 --- a/src/services/tt-rss/ttrssfeed.cpp +++ b/src/services/tt-rss/ttrssfeed.cpp @@ -25,6 +25,7 @@ #include "gui/dialogs/formmain.h" #include "services/tt-rss/definitions.h" #include "services/tt-rss/ttrssserviceroot.h" +#include "services/tt-rss/ttrsscategory.h" #include "services/tt-rss/gui/formeditfeed.h" #include "services/tt-rss/network/ttrssnetworkfactory.h" @@ -237,6 +238,33 @@ void TtRssFeed::setCustomId(int custom_id) { m_customId = custom_id; } +bool TtRssFeed::addItself(RootItem *parent, const QString &url, bool protectd, + const QString &username, const QString &password) { + TtRssServiceRoot *root = parent->kind() == RootItemKind::Category ? + qobject_cast(parent)->serviceRoot() : + qobject_cast(parent); + int category_id = parent->kind() == RootItemKind::ServiceRoot ? + 0 : + qobject_cast(parent)->customId(); + + TtRssSubscribeToFeedResponse response = root->network()->subscribeToFeed(url, category_id, protectd, username, password); + + if (response.code() == STF_INSERTED || response.code() == STF_UPDATED) { + // Feed added on TT-RSS server, get its ID. + + // TODO: ted potrebujeme vyplnit customID toho přidaného kanálu + // asi přes getFeeds + + + // TODO: todo + + return true; + } + else { + return false; + } +} + bool TtRssFeed::editItself(TtRssFeed *new_feed_data) { QSqlDatabase database = qApp->database()->connection("aa", DatabaseFactory::FromSettings); QSqlQuery query_update(database); diff --git a/src/services/tt-rss/ttrssfeed.h b/src/services/tt-rss/ttrssfeed.h index 83a16eeb5..6121c8581 100755 --- a/src/services/tt-rss/ttrssfeed.h +++ b/src/services/tt-rss/ttrssfeed.h @@ -54,6 +54,8 @@ class TtRssFeed : public Feed { int customId() const; void setCustomId(int custom_id); + bool addItself(RootItem *parent, const QString &url, bool protectd = false, + const QString &username = QString(), const QString &password = QString()); bool editItself(TtRssFeed *new_feed_data); private: