diff --git a/src/librssguard/core/feedsmodel.cpp b/src/librssguard/core/feedsmodel.cpp index f9cbedf41..5a7b9daca 100644 --- a/src/librssguard/core/feedsmodel.cpp +++ b/src/librssguard/core/feedsmodel.cpp @@ -302,24 +302,6 @@ QListFeedsModel::serviceRoots() const { return roots; } -bool FeedsModel::containsServiceRootFromEntryPoint(const ServiceEntryPoint* point) const { - return boolinq::from(serviceRoots()).any([=](ServiceRoot* root) { - return root->code() == point->code(); - }); -} - -StandardServiceRoot* FeedsModel::standardServiceRoot() const { - for (ServiceRoot* root : serviceRoots()) { - StandardServiceRoot* std_service_root; - - if ((std_service_root = dynamic_cast(root)) != nullptr) { - return std_service_root; - } - } - - return nullptr; -} - QListFeedsModel::feedsForScheduledUpdate(bool auto_update_now) { QListfeeds_for_update; diff --git a/src/librssguard/core/feedsmodel.h b/src/librssguard/core/feedsmodel.h index 02d9c9487..2db669f91 100644 --- a/src/librssguard/core/feedsmodel.h +++ b/src/librssguard/core/feedsmodel.h @@ -47,12 +47,6 @@ class RSSGUARD_DLLSPEC FeedsModel : public QAbstractItemModel { // the model root item. QList serviceRoots() const; - // Determines if there is any account activated from given entry point. - bool containsServiceRootFromEntryPoint(const ServiceEntryPoint* point) const; - - // Direct and the only global accessor to standard service root. - StandardServiceRoot* standardServiceRoot() const; - // Returns the list of feeds which should be updated // according to auto-update schedule. // Variable "auto_update_now" is true, when global timeout diff --git a/src/librssguard/gui/dialogs/formaddaccount.cpp b/src/librssguard/gui/dialogs/formaddaccount.cpp index 9af2ba473..66d6782a0 100644 --- a/src/librssguard/gui/dialogs/formaddaccount.cpp +++ b/src/librssguard/gui/dialogs/formaddaccount.cpp @@ -52,14 +52,7 @@ void FormAddAccount::loadEntryPoints() { for (const ServiceEntryPoint* entry_point : m_entryPoints) { QListWidgetItem* item = new QListWidgetItem(entry_point->icon(), entry_point->name(), m_ui->m_listEntryPoints); - if (entry_point->isSingleInstanceService() && m_model->containsServiceRootFromEntryPoint(entry_point)) { - // Oops, this item cannot be added, it is single instance and is already added. - item->setFlags(Qt::ItemFlag::NoItemFlags); - item->setToolTip(tr("This account can be added only once.")); - } - else { - item->setToolTip(entry_point->description()); - } + item->setToolTip(entry_point->description()); } m_ui->m_listEntryPoints->setCurrentRow(m_entryPoints.size() - 1); diff --git a/src/librssguard/miscellaneous/application.cpp b/src/librssguard/miscellaneous/application.cpp index b47843664..b4a3b68bc 100755 --- a/src/librssguard/miscellaneous/application.cpp +++ b/src/librssguard/miscellaneous/application.cpp @@ -2,6 +2,7 @@ #include "miscellaneous/application.h" +#include "3rd-party/boolinq/boolinq.h" #include "dynamic-shortcuts/dynamicshortcuts.h" #include "exceptions/applicationexception.h" #include "gui/dialogs/formabout.h" @@ -361,10 +362,12 @@ void Application::processExecutionMessage(const QString& message) { } else if (msg.startsWith(QL1S(URI_SCHEME_FEED_SHORT))) { // Application was running, and someone wants to add new feed. - StandardServiceRoot* root = qApp->feedReader()->feedsModel()->standardServiceRoot(); + ServiceRoot* rt = boolinq::from(feedReader()->feedsModel()->serviceRoots()).firstOrDefault([](ServiceRoot* root) { + return root->supportsFeedAdding(); + }); - if (root != nullptr) { - root->checkArgumentForFeedAdding(msg); + if (rt != nullptr) { + rt->addNewFeed(nullptr, msg); } else { showGuiMessage(tr("Cannot add feed"), diff --git a/src/librssguard/services/abstract/serviceentrypoint.h b/src/librssguard/services/abstract/serviceentrypoint.h index 0003d5fea..369ab4c6d 100644 --- a/src/librssguard/services/abstract/serviceentrypoint.h +++ b/src/librssguard/services/abstract/serviceentrypoint.h @@ -28,11 +28,6 @@ class ServiceEntryPoint { // to the global feed model. virtual QList initializeSubtree() const = 0; - // Can this service account be added just once? - // NOTE: This is true particularly for "standard" service - // which operates with normal RSS/ATOM feeds. - virtual bool isSingleInstanceService() const = 0; - // Human readable service name, for example "TT-RSS". virtual QString name() const = 0; diff --git a/src/librssguard/services/gmail/gmailentrypoint.cpp b/src/librssguard/services/gmail/gmailentrypoint.cpp index d876b1b70..a4156a4e9 100644 --- a/src/librssguard/services/gmail/gmailentrypoint.cpp +++ b/src/librssguard/services/gmail/gmailentrypoint.cpp @@ -24,10 +24,6 @@ QList GmailEntryPoint::initializeSubtree() const { return DatabaseQueries::getGmailAccounts(database); } -bool GmailEntryPoint::isSingleInstanceService() const { - return false; -} - QString GmailEntryPoint::name() const { return QSL("Gmail"); } diff --git a/src/librssguard/services/gmail/gmailentrypoint.h b/src/librssguard/services/gmail/gmailentrypoint.h index 75145ac49..d07af7898 100644 --- a/src/librssguard/services/gmail/gmailentrypoint.h +++ b/src/librssguard/services/gmail/gmailentrypoint.h @@ -7,15 +7,13 @@ class GmailEntryPoint : public ServiceEntryPoint { public: - ServiceRoot* createNewRoot() const; - - QList initializeSubtree() const; - bool isSingleInstanceService() const; - QString name() const; - QString code() const; - QString description() const; - QString author() const; - QIcon icon() const; + virtual ServiceRoot* createNewRoot() const; + virtual QList initializeSubtree() const; + virtual QString name() const; + virtual QString code() const; + virtual QString description() const; + virtual QString author() const; + virtual QIcon icon() const; }; #endif // GMAILENTRYPOINT_H diff --git a/src/librssguard/services/inoreader/inoreaderentrypoint.cpp b/src/librssguard/services/inoreader/inoreaderentrypoint.cpp index 8701b1fb1..0713ad2db 100644 --- a/src/librssguard/services/inoreader/inoreaderentrypoint.cpp +++ b/src/librssguard/services/inoreader/inoreaderentrypoint.cpp @@ -25,10 +25,6 @@ QList InoreaderEntryPoint::initializeSubtree() const { return DatabaseQueries::getInoreaderAccounts(database); } -bool InoreaderEntryPoint::isSingleInstanceService() const { - return false; -} - QString InoreaderEntryPoint::name() const { return QSL("Inoreader"); } diff --git a/src/librssguard/services/inoreader/inoreaderentrypoint.h b/src/librssguard/services/inoreader/inoreaderentrypoint.h index 2da77e98c..fbfd8244f 100644 --- a/src/librssguard/services/inoreader/inoreaderentrypoint.h +++ b/src/librssguard/services/inoreader/inoreaderentrypoint.h @@ -7,15 +7,13 @@ class InoreaderEntryPoint : public ServiceEntryPoint { public: - ServiceRoot* createNewRoot() const; - - QList initializeSubtree() const; - bool isSingleInstanceService() const; - QString name() const; - QString code() const; - QString description() const; - QString author() const; - QIcon icon() const; + virtual ServiceRoot* createNewRoot() const; + virtual QList initializeSubtree() const; + virtual QString name() const; + virtual QString code() const; + virtual QString description() const; + virtual QString author() const; + virtual QIcon icon() const; }; #endif // INOREADERENTRYPOINT_H diff --git a/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp b/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp index cdf89f890..09012cda2 100644 --- a/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp +++ b/src/librssguard/services/owncloud/owncloudserviceentrypoint.cpp @@ -22,10 +22,6 @@ QList OwnCloudServiceEntryPoint::initializeSubtree() const { return DatabaseQueries::getOwnCloudAccounts(database); } -bool OwnCloudServiceEntryPoint::isSingleInstanceService() const { - return false; -} - QString OwnCloudServiceEntryPoint::name() const { return QSL("Nextcloud News"); } diff --git a/src/librssguard/services/owncloud/owncloudserviceentrypoint.h b/src/librssguard/services/owncloud/owncloudserviceentrypoint.h index 48d687a6c..bd358e19d 100644 --- a/src/librssguard/services/owncloud/owncloudserviceentrypoint.h +++ b/src/librssguard/services/owncloud/owncloudserviceentrypoint.h @@ -7,15 +7,13 @@ class OwnCloudServiceEntryPoint : public ServiceEntryPoint { public: - ServiceRoot* createNewRoot() const; - - QList initializeSubtree() const; - bool isSingleInstanceService() const; - QString name() const; - QString code() const; - QString description() const; - QString author() const; - QIcon icon() const; + virtual ServiceRoot* createNewRoot() const; + virtual QList initializeSubtree() const; + virtual QString name() const; + virtual QString code() const; + virtual QString description() const; + virtual QString author() const; + virtual QIcon icon() const; }; #endif // OWNCLOUDSERVICEENTRYPOINT_H diff --git a/src/librssguard/services/standard/gui/formstandardfeeddetails.cpp b/src/librssguard/services/standard/gui/formstandardfeeddetails.cpp index fbe5275fb..015aabe37 100644 --- a/src/librssguard/services/standard/gui/formstandardfeeddetails.cpp +++ b/src/librssguard/services/standard/gui/formstandardfeeddetails.cpp @@ -10,6 +10,7 @@ #include "services/abstract/serviceroot.h" #include "services/standard/gui/standardfeeddetails.h" #include "services/standard/standardfeed.h" +#include "services/standard/standardserviceroot.h" #include #include @@ -32,7 +33,10 @@ int FormStandardFeedDetails::addEditFeed(StandardFeed* input_feed, RootItem* par if (input_feed == nullptr) { // User is adding new feed. setWindowTitle(tr("Add new feed")); - m_standardFeedDetails->prepareForNewFeed(parent_to_select, url); + + auto processed_url = qobject_cast(m_serviceRoot)->processFeedUrl(url); + + m_standardFeedDetails->prepareForNewFeed(parent_to_select, processed_url); } else { setEditableFeed(input_feed); diff --git a/src/librssguard/services/standard/standardserviceentrypoint.cpp b/src/librssguard/services/standard/standardserviceentrypoint.cpp index 2836b7673..d5620c929 100644 --- a/src/librssguard/services/standard/standardserviceentrypoint.cpp +++ b/src/librssguard/services/standard/standardserviceentrypoint.cpp @@ -7,10 +7,6 @@ #include "miscellaneous/databasequeries.h" #include "services/standard/standardserviceroot.h" -bool StandardServiceEntryPoint::isSingleInstanceService() const { - return true; -} - QString StandardServiceEntryPoint::name() const { return QObject::tr("Standard online feeds (RSS/ATOM/JSON)"); } diff --git a/src/librssguard/services/standard/standardserviceentrypoint.h b/src/librssguard/services/standard/standardserviceentrypoint.h index 38f3a8887..0d40528df 100644 --- a/src/librssguard/services/standard/standardserviceentrypoint.h +++ b/src/librssguard/services/standard/standardserviceentrypoint.h @@ -7,16 +7,13 @@ class StandardServiceEntryPoint : public ServiceEntryPoint { public: - bool isSingleInstanceService() const; - QString name() const; - QString description() const; - QString author() const; - QIcon icon() const; - QString code() const; - - ServiceRoot* createNewRoot() const; - - QList initializeSubtree() const; + virtual QString name() const; + virtual QString description() const; + virtual QString author() const; + virtual QIcon icon() const; + virtual QString code() const; + virtual ServiceRoot* createNewRoot() const; + virtual QList initializeSubtree() const; }; #endif // STANDARDSERVICEENTRYPOINT_H diff --git a/src/librssguard/services/standard/standardserviceroot.cpp b/src/librssguard/services/standard/standardserviceroot.cpp index 3e065f03a..709b848ee 100644 --- a/src/librssguard/services/standard/standardserviceroot.cpp +++ b/src/librssguard/services/standard/standardserviceroot.cpp @@ -146,7 +146,7 @@ void StandardServiceRoot::checkArgumentsForFeedAdding() { QString StandardServiceRoot::processFeedUrl(const QString& feed_url) { if (feed_url.startsWith(QL1S(URI_SCHEME_FEED_SHORT))) { - QString without_feed_prefix = feed_url.mid(5); + QString without_feed_prefix = feed_url.mid(QSL(URI_SCHEME_FEED_SHORT).size()); if (without_feed_prefix.startsWith(QL1S("https:")) || without_feed_prefix.startsWith(QL1S("http:"))) { return without_feed_prefix; diff --git a/src/librssguard/services/standard/standardserviceroot.h b/src/librssguard/services/standard/standardserviceroot.h index e1e660632..d40e262d3 100644 --- a/src/librssguard/services/standard/standardserviceroot.h +++ b/src/librssguard/services/standard/standardserviceroot.h @@ -46,6 +46,7 @@ class StandardServiceRoot : public ServiceRoot { // NOTE: This is used for import/export of the model. bool mergeImportExportModel(FeedsImportExportModel* model, RootItem* target_root_node, QString& output_message); + QString processFeedUrl(const QString& feed_url); void loadFromDatabase(); void checkArgumentForFeedAdding(const QString& argument); @@ -56,7 +57,6 @@ class StandardServiceRoot : public ServiceRoot { void exportFeeds(); private: - QString processFeedUrl(const QString& feed_url); void checkArgumentsForFeedAdding(); QPointer m_feedForMetadata = {}; diff --git a/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp b/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp index 2ab73b94d..f4dc2c498 100644 --- a/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp +++ b/src/librssguard/services/tt-rss/ttrssserviceentrypoint.cpp @@ -9,10 +9,6 @@ #include "services/tt-rss/gui/formeditttrssaccount.h" #include "services/tt-rss/ttrssserviceroot.h" -bool TtRssServiceEntryPoint::isSingleInstanceService() const { - return false; -} - QString TtRssServiceEntryPoint::name() const { return QSL("Tiny Tiny RSS"); } diff --git a/src/librssguard/services/tt-rss/ttrssserviceentrypoint.h b/src/librssguard/services/tt-rss/ttrssserviceentrypoint.h index 159f92a67..74b018f3b 100644 --- a/src/librssguard/services/tt-rss/ttrssserviceentrypoint.h +++ b/src/librssguard/services/tt-rss/ttrssserviceentrypoint.h @@ -7,16 +7,13 @@ class TtRssServiceEntryPoint : public ServiceEntryPoint { public: - bool isSingleInstanceService() const; - QString name() const; - QString description() const; - QString author() const; - QIcon icon() const; - QString code() const; - - ServiceRoot* createNewRoot() const; - - QList initializeSubtree() const; + virtual QString name() const; + virtual QString description() const; + virtual QString author() const; + virtual QIcon icon() const; + virtual QString code() const; + virtual ServiceRoot* createNewRoot() const; + virtual QList initializeSubtree() const; }; #endif // TTRSSSERVICEENTRYPOINT_H