From e86882ccc14cb10797673ff292d631d05d3ebba6 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Tue, 2 Feb 2021 15:19:49 +0100 Subject: [PATCH] Working on #265. --- src/librssguard/definitions/definitions.h | 1 + .../services/standard/standardfeed.cpp | 95 +++++++++++-------- .../services/standard/standardfeed.h | 3 + 3 files changed, 62 insertions(+), 37 deletions(-) diff --git a/src/librssguard/definitions/definitions.h b/src/librssguard/definitions/definitions.h index 42765833d..6cb52d1d1 100755 --- a/src/librssguard/definitions/definitions.h +++ b/src/librssguard/definitions/definitions.h @@ -81,6 +81,7 @@ #define RELOAD_MODEL_BORDER_NUM 10 #define EXTERNAL_TOOL_SEPARATOR "###" #define EXTERNAL_TOOL_PARAM_SEPARATOR "|||" +#define EXECUTION_LINE_USER_DATA_PLACEHOLDER "%data%" #define CLI_LOG_SHORT "l" #define CLI_LOG_LONG "log" diff --git a/src/librssguard/services/standard/standardfeed.cpp b/src/librssguard/services/standard/standardfeed.cpp index ed3740321..8ad4123fb 100644 --- a/src/librssguard/services/standard/standardfeed.cpp +++ b/src/librssguard/services/standard/standardfeed.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -468,47 +469,54 @@ void StandardFeed::setEncoding(const QString& encoding) { } QList StandardFeed::obtainNewMessages(bool* error_during_obtaining) { - QByteArray feed_contents; - int download_timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); - QList> headers; - - headers << NetworkFactory::generateBasicAuthHeader(username(), password()); - m_networkError = NetworkFactory::performNetworkOperation(url(), - download_timeout, - QByteArray(), - feed_contents, - QNetworkAccessManager::Operation::GetOperation, - headers, - false, - {}, - {}, - getParentServiceRoot()->networkProxy()).first; - - if (m_networkError != QNetworkReply::NetworkError::NoError) { - qWarningNN << LOGSEC_CORE - << "Error" - << QUOTE_W_SPACE(m_networkError) - << "during fetching of new messages for feed" - << QUOTE_W_SPACE_DOT(url()); - setStatus(Status::NetworkError); - *error_during_obtaining = true; - return QList(); - } - else { - *error_during_obtaining = false; - } - - // Encode downloaded data for further parsing. - QTextCodec* codec = QTextCodec::codecForName(encoding().toLocal8Bit()); QString formatted_feed_contents; + int download_timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); - if (codec == nullptr) { - // No suitable codec for this encoding was found. - // Use non-converted data. - formatted_feed_contents = feed_contents; + if (sourceType() == SourceType::Url) { + QByteArray feed_contents; + QList> headers; + + headers << NetworkFactory::generateBasicAuthHeader(username(), password()); + m_networkError = NetworkFactory::performNetworkOperation(url(), + download_timeout, + QByteArray(), + feed_contents, + QNetworkAccessManager::Operation::GetOperation, + headers, + false, + {}, + {}, + getParentServiceRoot()->networkProxy()).first; + + if (m_networkError != QNetworkReply::NetworkError::NoError) { + qWarningNN << LOGSEC_CORE + << "Error" + << QUOTE_W_SPACE(m_networkError) + << "during fetching of new messages for feed" + << QUOTE_W_SPACE_DOT(url()); + setStatus(Status::NetworkError); + *error_during_obtaining = true; + return QList(); + } + else { + *error_during_obtaining = false; + } + + // Encode downloaded data for further parsing. + QTextCodec* codec = QTextCodec::codecForName(encoding().toLocal8Bit()); + + if (codec == nullptr) { + // No suitable codec for this encoding was found. + // Use non-converted data. + formatted_feed_contents = feed_contents; + } + else { + formatted_feed_contents = codec->toUnicode(feed_contents); + } } else { - formatted_feed_contents = codec->toUnicode(feed_contents); + // Use script to generate feed file. + formatted_feed_contents = generateFeedFileWithScript(url(), download_timeout); } // Feed data are downloaded and encoded. @@ -540,6 +548,19 @@ QList StandardFeed::obtainNewMessages(bool* error_during_obtaining) { return messages; } +QPair StandardFeed::prepareExecutionLine(const QString& execution_line) { + auto split_exec = execution_line.split('#', Qt::SplitBehaviorFlags::KeepEmptyParts); + auto user_data_folder = qApp->userDataFolder(); + + return { split_exec[0].replace(EXECUTION_LINE_USER_DATA_PLACEHOLDER, user_data_folder), + split_exec[1].replace(EXECUTION_LINE_USER_DATA_PLACEHOLDER, user_data_folder) }; +} + +QString StandardFeed::generateFeedFileWithScript(const QString& execution_line, int run_timeout) { + auto prepared_query = prepareExecutionLine(execution_line); + +} + QNetworkReply::NetworkError StandardFeed::networkError() const { return m_networkError; } diff --git a/src/librssguard/services/standard/standardfeed.h b/src/librssguard/services/standard/standardfeed.h index 355bc61d7..7984b3613 100644 --- a/src/librssguard/services/standard/standardfeed.h +++ b/src/librssguard/services/standard/standardfeed.h @@ -78,6 +78,9 @@ class StandardFeed : public Feed { QList obtainNewMessages(bool* error_during_obtaining); + static QPair prepareExecutionLine(const QString& execution_line); + static QString generateFeedFileWithScript(const QString& execution_line, int run_timeout); + // Tries to guess feed hidden under given URL // and uses given credentials. // Returns pointer to guessed feed (if at least partially