From 032fccc387155cbf0503d8b44b442469f6a142a3 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 8 Jul 2020 11:30:48 +0200 Subject: [PATCH] Removed obsolete code, some refactorings. --- pri/build_opts.pri | 4 +++ resources/icons.qrc | 1 + src/librssguard/core/feedsmodel.cpp | 2 +- src/librssguard/core/message.cpp | 7 +++- src/librssguard/core/messagesmodel.cpp | 8 ++--- src/librssguard/core/messagesmodel.h | 2 +- .../gui/dialogs/formmessagefiltersmanager.cpp | 5 +++ .../gui/dialogs/formmessagefiltersmanager.ui | 11 +++--- src/librssguard/gui/feedstoolbar.cpp | 14 ++++++-- src/librssguard/gui/feedsview.cpp | 6 ++-- src/librssguard/gui/messagestoolbar.cpp | 22 ++++++++---- src/librssguard/gui/statusbar.cpp | 15 ++++++-- src/librssguard/gui/tabbar.cpp | 16 ++++----- src/librssguard/miscellaneous/application.cpp | 2 +- .../miscellaneous/databasefactory.cpp | 35 ++++++++++++++++--- src/librssguard/miscellaneous/iofactory.cpp | 13 +++++++ src/librssguard/miscellaneous/iofactory.h | 4 +++ .../miscellaneous/simplecrypt/simplecrypt.cpp | 9 +++-- .../miscellaneous/systemfactory.cpp | 6 ++-- .../network-web/adblock/adblockrule.cpp | 22 ++++++++---- .../network-web/adblock/adblocksearchtree.cpp | 3 +- .../adblock/adblocksubscription.cpp | 14 ++++---- src/librssguard/network-web/downloader.cpp | 15 ++++++-- .../network-web/downloadmanager.cpp | 6 ++++ src/librssguard/network-web/webfactory.cpp | 14 ++++---- .../services/abstract/accountcheckmodel.cpp | 4 ++- .../services/abstract/accountcheckmodel.h | 3 ++ .../network/inoreadernetworkfactory.cpp | 4 +-- .../services/owncloud/owncloudfeed.cpp | 3 +- 29 files changed, 193 insertions(+), 77 deletions(-) diff --git a/pri/build_opts.pri b/pri/build_opts.pri index f332dc57a..bdb683e4a 100644 --- a/pri/build_opts.pri +++ b/pri/build_opts.pri @@ -40,6 +40,10 @@ else { DEFINES *= DEBUG=1 gcc:QMAKE_CXXFLAGS_DEBUG *= -Wall clang:QMAKE_CXXFLAGS_DEBUG *= -Wall + msvc:QMAKE_CXXFLAGS_DEBUG *= /W4 /wd4127 + msvc:QMAKE_CXXFLAGS_WARN_ON = "" + msvc:QMAKE_CXXFLAGS_DEBUG -= /W3 + msvc:QMAKE_CXXFLAGS -= /W3 } MOC_DIR = $$OUT_PWD/moc diff --git a/resources/icons.qrc b/resources/icons.qrc index 2dd52cfb9..2c39d2853 100644 --- a/resources/icons.qrc +++ b/resources/icons.qrc @@ -3,6 +3,7 @@ ./graphics/Faenza/actions/64/application-exit.png ./graphics/Faenza/actions/64/back.png ./graphics/Faenza/actions/64/call-start.png + ./graphics/Faenza/actions/64/dialog-no.png ./graphics/Faenza/actions/64/dialog-yes.png ./graphics/Faenza/actions/64/document-edit.png ./graphics/Faenza/actions/64/document-export.png diff --git a/src/librssguard/core/feedsmodel.cpp b/src/librssguard/core/feedsmodel.cpp index bb5b0c9c3..73a9ec008 100644 --- a/src/librssguard/core/feedsmodel.cpp +++ b/src/librssguard/core/feedsmodel.cpp @@ -389,7 +389,7 @@ QModelIndex FeedsModel::indexForItem(const RootItem* item) const { return QModelIndex(); } - QStackchain; + QStack chain; while (item->kind() != RootItemKind::Root) { chain.push(item); diff --git a/src/librssguard/core/message.cpp b/src/librssguard/core/message.cpp index 045da982e..fd46a5483 100644 --- a/src/librssguard/core/message.cpp +++ b/src/librssguard/core/message.cpp @@ -14,7 +14,12 @@ Enclosure::Enclosure(QString url, QString mime) : m_url(std::move(url)), m_mimeT QList Enclosures::decodeEnclosuresFromString(const QString& enclosures_data) { QList enclosures; - for (const QString& single_enclosure : enclosures_data.split(ENCLOSURES_OUTER_SEPARATOR, QString::SkipEmptyParts)) { + for (const QString& single_enclosure : enclosures_data.split(ENCLOSURES_OUTER_SEPARATOR, +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts)) { +#else + QString::SkipEmptyParts)) { +#endif Enclosure enclosure; if (single_enclosure.contains(ECNLOSURES_INNER_SEPARATOR)) { diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp index e29e94c0a..7c75b9948 100644 --- a/src/librssguard/core/messagesmodel.cpp +++ b/src/librssguard/core/messagesmodel.cpp @@ -17,7 +17,7 @@ #include MessagesModel::MessagesModel(QObject* parent) - : QSqlQueryModel(parent), m_cache(new MessagesModelCache(this)), m_messageHighlighter(NoHighlighting), + : QSqlQueryModel(parent), m_cache(new MessagesModelCache(this)), m_messageHighlighter(MessageHighlighter::NoHighlighting), m_customDateFormat(QString()), m_selectedItem(nullptr), m_itemHeight(-1) { setupFonts(); setupIcons(); @@ -286,21 +286,21 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const { case Qt::ForegroundRole: switch (m_messageHighlighter) { - case HighlightImportant: { + case MessageHighlighter::HighlightImportant: { QModelIndex idx_important = index(idx.row(), MSG_DB_IMPORTANT_INDEX); QVariant dta = m_cache->containsData(idx_important.row()) ? m_cache->data(idx_important) : QSqlQueryModel::data(idx_important); return dta.toInt() == 1 ? qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Highlight] : QVariant(); } - case HighlightUnread: { + case MessageHighlighter::HighlightUnread: { QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX); QVariant dta = m_cache->containsData(idx_read.row()) ? m_cache->data(idx_read) : QSqlQueryModel::data(idx_read); return dta.toInt() == 0 ? qApp->skins()->currentSkin().m_colorPalette[Skin::PaletteColors::Highlight] : QVariant(); } - case NoHighlighting: + case MessageHighlighter::NoHighlighting: default: return QVariant(); } diff --git a/src/librssguard/core/messagesmodel.h b/src/librssguard/core/messagesmodel.h index 973f48b4a..176d19667 100644 --- a/src/librssguard/core/messagesmodel.h +++ b/src/librssguard/core/messagesmodel.h @@ -22,7 +22,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer { // Enum which describes basic filtering schemes // for messages. - enum MessageHighlighter { + enum class MessageHighlighter { NoHighlighting = 100, HighlightUnread = 101, HighlightImportant = 102 diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp index 14d45191b..0fa2fa08d 100644 --- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp +++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.cpp @@ -23,7 +23,10 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("view-list-details"))); + m_ui.m_treeFeeds->setIndentation(FEEDS_VIEW_INDENTATION); m_ui.m_treeFeeds->setModel(m_feedsModel); + m_ui.m_btnCheckAll->setIcon(qApp->icons()->fromTheme(QSL("dialog-yes"))); + m_ui.m_btnUncheckAll->setIcon(qApp->icons()->fromTheme(QSL("dialog-no"))); m_ui.m_btnAddNew->setIcon(qApp->icons()->fromTheme(QSL("list-add"))); m_ui.m_btnRemoveSelected->setIcon(qApp->icons()->fromTheme(QSL("list-remove"))); m_ui.m_btnBeautify->setIcon(qApp->icons()->fromTheme(QSL("format-justify-fill"))); @@ -47,6 +50,8 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q loadSelectedAccount(); loadFilterFeedAssignments(); }); + connect(m_ui.m_btnCheckAll, &QPushButton::clicked, m_feedsModel, &AccountCheckModel::checkAllItems); + connect(m_ui.m_btnUncheckAll, &QPushButton::clicked, m_feedsModel, &AccountCheckModel::uncheckAllItems); initializeTestingMessage(); loadFilter(); diff --git a/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui b/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui index 3d9607165..c3b9217f2 100644 --- a/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui +++ b/src/librssguard/gui/dialogs/formmessagefiltersmanager.ui @@ -77,6 +77,9 @@ 150 + + false + true @@ -88,14 +91,14 @@ - + &Check all - + &Uncheck all @@ -406,8 +409,8 @@ m_btnRemoveSelected m_cmbAccounts m_treeFeeds - pushButton - pushButton_2 + m_btnCheckAll + m_btnUncheckAll m_txtTitle m_txtScript m_btnTest diff --git a/src/librssguard/gui/feedstoolbar.cpp b/src/librssguard/gui/feedstoolbar.cpp index 32eae9272..2eb0806b7 100644 --- a/src/librssguard/gui/feedstoolbar.cpp +++ b/src/librssguard/gui/feedstoolbar.cpp @@ -77,10 +77,20 @@ void FeedsToolBar::loadSpecificActions(const QList& actions, bool init } QStringList FeedsToolBar::defaultActions() const { - return QString(GUI::FeedsToolbarActionsDef).split(',', QString::SkipEmptyParts); + return QString(GUI::FeedsToolbarActionsDef).split(',', +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif } QStringList FeedsToolBar::savedActions() const { return qApp->settings()->value(GROUP(GUI), - SETTING(GUI::FeedsToolbarActions)).toString().split(',', QString::SkipEmptyParts); + SETTING(GUI::FeedsToolbarActions)).toString().split(',', +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif } diff --git a/src/librssguard/gui/feedsview.cpp b/src/librssguard/gui/feedsview.cpp index bafffeda8..fb2fbbced 100755 --- a/src/librssguard/gui/feedsview.cpp +++ b/src/librssguard/gui/feedsview.cpp @@ -98,9 +98,9 @@ void FeedsView::saveExpandStates(RootItem* item) { QList items = item->getSubTree(RootItemKind::Category | RootItemKind::ServiceRoot); // Iterate all categories and save their expand statuses. - for (const RootItem* item : items) { - const QString setting_name = item->hashCode(); - QModelIndex source_index = sourceModel()->indexForItem(item); + for (const RootItem* it : items) { + const QString setting_name = it->hashCode(); + QModelIndex source_index = sourceModel()->indexForItem(it); QModelIndex visible_index = model()->mapFromSource(source_index); settings->setValue(GROUP(CategoriesExpandStates), diff --git a/src/librssguard/gui/messagestoolbar.cpp b/src/librssguard/gui/messagestoolbar.cpp index 94df2e0d4..494dc72dd 100644 --- a/src/librssguard/gui/messagestoolbar.cpp +++ b/src/librssguard/gui/messagestoolbar.cpp @@ -118,11 +118,11 @@ void MessagesToolBar::initializeSearchBox() { void MessagesToolBar::initializeHighlighter() { m_menuMessageHighlighter = new QMenu(tr("Menu for highlighting messages"), this); m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme(QSL("mail-mark-read")), - tr("No extra highlighting"))->setData(QVariant::fromValue(MessagesModel::NoHighlighting)); + tr("No extra highlighting"))->setData(QVariant::fromValue(MessagesModel::MessageHighlighter::NoHighlighting)); m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme(QSL("mail-mark-unread")), - tr("Highlight unread messages"))->setData(QVariant::fromValue(MessagesModel::HighlightUnread)); + tr("Highlight unread messages"))->setData(QVariant::fromValue(MessagesModel::MessageHighlighter::HighlightUnread)); m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme(QSL("mail-mark-important")), - tr("Highlight important messages"))->setData(QVariant::fromValue(MessagesModel::HighlightImportant)); + tr("Highlight important messages"))->setData(QVariant::fromValue(MessagesModel::MessageHighlighter::HighlightImportant)); m_btnMessageHighlighter = new QToolButton(this); m_btnMessageHighlighter->setToolTip(tr("Display all messages")); m_btnMessageHighlighter->setMenu(m_menuMessageHighlighter); @@ -138,12 +138,20 @@ void MessagesToolBar::initializeHighlighter() { } QStringList MessagesToolBar::defaultActions() const { - return QString(GUI::MessagesToolbarDefaultButtonsDef).split(',', - QString::SkipEmptyParts); + return QString(GUI::MessagesToolbarDefaultButtonsDef).split(QL1C(','), +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SplitBehavior::SkipEmptyParts); +#endif } QStringList MessagesToolBar::savedActions() const { return qApp->settings()->value(GROUP(GUI), - SETTING(GUI::MessagesToolbarDefaultButtons)).toString().split(',', - QString::SkipEmptyParts); + SETTING(GUI::MessagesToolbarDefaultButtons)).toString().split(QL1C(','), +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SplitBehavior::SkipEmptyParts); +#endif } diff --git a/src/librssguard/gui/statusbar.cpp b/src/librssguard/gui/statusbar.cpp index cc82b8f9d..de791b8a0 100644 --- a/src/librssguard/gui/statusbar.cpp +++ b/src/librssguard/gui/statusbar.cpp @@ -73,11 +73,22 @@ void StatusBar::saveChangeableActions(const QStringList& actions) { } QStringList StatusBar::defaultActions() const { - return QString(GUI::StatusbarActionsDef).split(',', QString::SkipEmptyParts); + return QString(GUI::StatusbarActionsDef).split(',', +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif } QStringList StatusBar::savedActions() const { - return qApp->settings()->value(GROUP(GUI), SETTING(GUI::StatusbarActions)).toString().split(',', QString::SkipEmptyParts); + return qApp->settings()->value(GROUP(GUI), + SETTING(GUI::StatusbarActions)).toString().split(',', +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif } QList StatusBar::getSpecificActions(const QStringList& actions) { diff --git a/src/librssguard/gui/tabbar.cpp b/src/librssguard/gui/tabbar.cpp index 00d909686..9858e1531 100644 --- a/src/librssguard/gui/tabbar.cpp +++ b/src/librssguard/gui/tabbar.cpp @@ -72,17 +72,17 @@ void TabBar::wheelEvent(QWheelEvent* event) { // Make sure rotating works. if (number_of_tabs > 1) { - if (event->delta() > 0) { + if (event->angleDelta().y() > 0) { // Scroll to the LEFT tab. - setCurrentIndex(current_index == 0 ? - number_of_tabs - 1 : - current_index - 1); + setCurrentIndex(current_index == 0 + ? number_of_tabs - 1 + : current_index - 1); } - else if (event->delta() < 0) { + else if (event->angleDelta().y() < 0) { // Scroll to the RIGHT tab. - setCurrentIndex(current_index == number_of_tabs - 1 ? - 0 : - current_index + 1); + setCurrentIndex(current_index == number_of_tabs - 1 + ? 0 + : current_index + 1); } } } diff --git a/src/librssguard/miscellaneous/application.cpp b/src/librssguard/miscellaneous/application.cpp index 6981eef04..29cfe240e 100755 --- a/src/librssguard/miscellaneous/application.cpp +++ b/src/librssguard/miscellaneous/application.cpp @@ -489,7 +489,7 @@ void Application::onAboutToQuit() { finish(); qDebug("Killing local peer connection to allow another instance to start."); - if (QProcess::startDetached(QString("\"") + QDir::toNativeSeparators(applicationFilePath()) + QString("\""))) { + if (QProcess::startDetached(QDir::toNativeSeparators(applicationFilePath()), {})) { qDebug("New application instance was started."); } else { diff --git a/src/librssguard/miscellaneous/databasefactory.cpp b/src/librssguard/miscellaneous/databasefactory.cpp index 1ec87fca2..3b05df7b6 100644 --- a/src/librssguard/miscellaneous/databasefactory.cpp +++ b/src/librssguard/miscellaneous/databasefactory.cpp @@ -218,7 +218,12 @@ QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() { qPrintable(APP_SQL_PATH)); } - const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts); + const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif database.transaction(); @@ -327,7 +332,12 @@ QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString& c qPrintable(APP_SQL_PATH)); } - const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts); + const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif database.transaction(); @@ -407,7 +417,12 @@ bool DatabaseFactory::sqliteUpdateDatabaseSchema(const QSqlDatabase& database, c qFatal("Updating of database schema failed. File '%s' cannot be opened.", qPrintable(QDir::toNativeSeparators(update_file_name))); } - const QStringList statements = QString(update_file_handle.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts); + const QStringList statements = QString(update_file_handle.readAll()).split(APP_DB_COMMENT_SPLIT, +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif for (const QString& statement : statements) { QSqlQuery query = database.exec(statement); @@ -447,7 +462,12 @@ bool DatabaseFactory::mysqlUpdateDatabaseSchema(const QSqlDatabase& database, qFatal("Updating of database schema failed. File '%s' cannot be opened.", qPrintable(QDir::toNativeSeparators(update_file_name))); } - QStringList statements = QString(update_file_handle.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts); + QStringList statements = QString(update_file_handle.readAll()).split(APP_DB_COMMENT_SPLIT, +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif for (QString statement : statements) { QSqlQuery query = database.exec(statement.replace(APP_DB_NAME_PLACEHOLDER, db_name)); @@ -676,7 +696,12 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString& connection_ qPrintable(APP_SQL_PATH)); } - const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts); + const QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif database.transaction(); diff --git a/src/librssguard/miscellaneous/iofactory.cpp b/src/librssguard/miscellaneous/iofactory.cpp index a8587377e..f78ac755b 100755 --- a/src/librssguard/miscellaneous/iofactory.cpp +++ b/src/librssguard/miscellaneous/iofactory.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include IOFactory::IOFactory() = default; @@ -70,6 +71,18 @@ QString IOFactory::filterBadCharsFromFilename(const QString& name) { return value; } +bool IOFactory::startProcessDetached(const QString& program, const QStringList& arguments, + const QString& native_arguments, const QString& working_directory) { + QProcess process; + + process.setProgram(program); + process.setArguments(arguments); + process.setNativeArguments(native_arguments); + process.setWorkingDirectory(working_directory); + + return process.startDetached(nullptr); +} + QByteArray IOFactory::readFile(const QString& file_path) { QFile input_file(file_path); QByteArray input_data; diff --git a/src/librssguard/miscellaneous/iofactory.h b/src/librssguard/miscellaneous/iofactory.h index bcd41a76d..a3dd426e5 100644 --- a/src/librssguard/miscellaneous/iofactory.h +++ b/src/librssguard/miscellaneous/iofactory.h @@ -27,6 +27,10 @@ class IOFactory { // Filters out shit characters from filename. static QString filterBadCharsFromFilename(const QString& name); + static bool startProcessDetached(const QString& program, + const QStringList& arguments, + const QString& native_arguments = {}, + const QString& working_directory = {}); // Returns contents of a file. // Throws exception when no such file exists. diff --git a/src/librssguard/miscellaneous/simplecrypt/simplecrypt.cpp b/src/librssguard/miscellaneous/simplecrypt/simplecrypt.cpp index cd8050e27..5dd1ea909 100644 --- a/src/librssguard/miscellaneous/simplecrypt/simplecrypt.cpp +++ b/src/librssguard/miscellaneous/simplecrypt/simplecrypt.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -38,16 +39,13 @@ SimpleCrypt::SimpleCrypt() : m_key(0), m_compressionMode(CompressionAlways), m_protectionMode(ProtectionHash), - m_lastError(ErrorNoError) { - qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF)); -} + m_lastError(ErrorNoError) {} SimpleCrypt::SimpleCrypt(quint64 key) : m_key(key), m_compressionMode(CompressionAlways), m_protectionMode(ProtectionHash), m_lastError(ErrorNoError) { - qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF)); splitKey(); } @@ -116,7 +114,7 @@ QByteArray SimpleCrypt::encryptToByteArray(QByteArray plaintext) { } //prepend a random char to the string - char randomChar = char(qrand() & 0xFF); + char randomChar = char(QRandomGenerator::global()->generate() & 0xFF); ba = randomChar + integrityProtection + ba; int pos(0); @@ -221,6 +219,7 @@ QByteArray SimpleCrypt::decryptToByteArray(QByteArray cypher) { } quint16 storedChecksum; + { QDataStream s(&ba, QIODevice::ReadOnly); diff --git a/src/librssguard/miscellaneous/systemfactory.cpp b/src/librssguard/miscellaneous/systemfactory.cpp index 635000af7..fc54ecdf1 100644 --- a/src/librssguard/miscellaneous/systemfactory.cpp +++ b/src/librssguard/miscellaneous/systemfactory.cpp @@ -59,7 +59,6 @@ SystemFactory::AutoStartStatus SystemFactory::autoStartStatus() const { return AutoStartStatus::Disabled; } #elif defined(Q_OS_LINUX) - // Use proper freedesktop.org way to auto-start the application on Linux. // INFO: http://standards.freedesktop.org/autostart-spec/latest/ const QString desktop_file_location = autostartDesktopFileLocation(); @@ -82,7 +81,6 @@ SystemFactory::AutoStartStatus SystemFactory::autoStartStatus() const { return AutoStartStatus::Disabled; } #else - // Disable auto-start functionality on unsupported platforms. return AutoStartStatus::Unavailable; #endif @@ -139,7 +137,6 @@ bool SystemFactory::setAutoStartStatus(AutoStartStatus new_status) { return false; } #elif defined(Q_OS_LINUX) - // Note that we expect here that no other program uses // "rssguard.desktop" desktop file. const QString destination_file = autostartDesktopFileLocation(); @@ -279,7 +276,8 @@ bool SystemFactory::isVersionEqualOrNewer(const QString& new_version, const QStr bool SystemFactory::openFolderFile(const QString& file_path) { #if defined(Q_OS_WIN) - return QProcess::startDetached(QString("explorer.exe /select, \"") + QDir::toNativeSeparators(file_path) + "\""); + return QProcess::startDetached(QSL("explorer.exe"), + { "/select,", QDir::toNativeSeparators(file_path)}); #else const QString folder = QDir::toNativeSeparators(QFileInfo(file_path).absoluteDir().absolutePath()); diff --git a/src/librssguard/network-web/adblock/adblockrule.cpp b/src/librssguard/network-web/adblock/adblockrule.cpp index 5e9e199e5..a2eeed39a 100644 --- a/src/librssguard/network-web/adblock/adblockrule.cpp +++ b/src/librssguard/network-web/adblock/adblockrule.cpp @@ -370,7 +370,12 @@ void AdBlockRule::parseFilter() { int optionsIndex = parsedLine.indexOf(QL1C('$')); if (optionsIndex >= 0) { - const QStringList options = parsedLine.mid(optionsIndex + 1).split(QL1C(','), QString::SkipEmptyParts); + const QStringList options = parsedLine.mid(optionsIndex + 1).split(QL1C(','), +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif int handledOptions = 0; for (const QString& option : options) { @@ -497,7 +502,12 @@ void AdBlockRule::parseFilter() { } void AdBlockRule::parseDomains(const QString& domains, const QChar& separator) { - QStringList domainsList = domains.split(separator, QString::SkipEmptyParts); + QStringList domainsList = domains.split(separator, +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif for (const QString& domain : domainsList) { if (domain.isEmpty()) { @@ -618,15 +628,15 @@ QString AdBlockRule::createRegExpFromFilter(const QString& filter) const { } QList AdBlockRule::createStringMatchers(const QStringList& filters) const { - QList matchers; + QList mtchrs; - matchers.reserve(filters.size()); + mtchrs.reserve(filters.size()); for (const QString& filter : filters) { - matchers.append(QStringMatcher(filter, m_caseSensitivity)); + mtchrs.append(QStringMatcher(filter, m_caseSensitivity)); } - return matchers; + return mtchrs; } int AdBlockRule::regexMatched(const QString& str, int offset) const { diff --git a/src/librssguard/network-web/adblock/adblocksearchtree.cpp b/src/librssguard/network-web/adblock/adblocksearchtree.cpp index 06c5f50fd..232baa796 100644 --- a/src/librssguard/network-web/adblock/adblocksearchtree.cpp +++ b/src/librssguard/network-web/adblock/adblocksearchtree.cpp @@ -89,8 +89,7 @@ const AdBlockRule* AdBlockSearchTree::prefixSearch(const QWebEngineUrlRequestInf return nullptr; } - QChar c = choppedUrlString.at(0); - Node* node = m_root->children.value(c); + Node* node = m_root->children.value(choppedUrlString.at(0)); if (node == nullptr) { return nullptr; diff --git a/src/librssguard/network-web/adblock/adblocksubscription.cpp b/src/librssguard/network-web/adblock/adblocksubscription.cpp index 0cdf0feec..6e4c4602e 100644 --- a/src/librssguard/network-web/adblock/adblocksubscription.cpp +++ b/src/librssguard/network-web/adblock/adblocksubscription.cpp @@ -62,7 +62,7 @@ #include #include -AdBlockSubscription::AdBlockSubscription(QString title, QObject* parent) +AdBlockSubscription::AdBlockSubscription(QString title, QObject* parent) : QObject(parent), m_reply(nullptr), m_title(std::move(title)), m_updated(false) {} QString AdBlockSubscription::title() const { @@ -290,11 +290,11 @@ void AdBlockCustomList::loadSubscription(const QStringList& disabledRules) { stream.setCodec("UTF-8"); if (!rules.contains(ddg1 + QL1S("\n"))) { - stream << ddg1 << endl; + stream << ddg1 << Qt::endl; } if (!rules.contains(QL1S("\n") + ddg2)) { - stream << ddg2 << endl; + stream << ddg2 << Qt::endl; } } @@ -313,12 +313,12 @@ void AdBlockCustomList::saveSubscription() { QTextStream textStream(&file); textStream.setCodec("UTF-8"); - textStream << "Title: " << title() << endl; - textStream << "Url: " << url().toString() << endl; - textStream << "[Adblock Plus 1.1.1]" << endl; + textStream << "Title: " << title() << Qt::endl; + textStream << "Url: " << url().toString() << Qt::endl; + textStream << "[Adblock Plus 1.1.1]" << Qt::endl; for (const AdBlockRule* rule : m_rules) { - textStream << rule->filter() << endl; + textStream << rule->filter() << Qt::endl; } file.close(); diff --git a/src/librssguard/network-web/downloader.cpp b/src/librssguard/network-web/downloader.cpp index c6650e92c..d7ca09056 100644 --- a/src/librssguard/network-web/downloader.cpp +++ b/src/librssguard/network-web/downloader.cpp @@ -181,7 +181,13 @@ QList Downloader::decodeMultipartAnswer(QNetworkReply* reply) { QString content_type = reply->header(QNetworkRequest::KnownHeaders::ContentTypeHeader).toString(); QString boundary = content_type.mid(content_type.indexOf(QL1S("boundary=")) + 9); QRegularExpression regex(QL1S("--") + boundary + QL1S("(--)?(\\r\\n)?")); - QStringList list = QString::fromUtf8(data).split(regex, QString::SplitBehavior::SkipEmptyParts); + QStringList list = QString::fromUtf8(data).split(regex, +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts); +#else + QString::SkipEmptyParts); +#endif + QList parts; parts.reserve(list.size()); @@ -197,7 +203,12 @@ QList Downloader::decodeMultipartAnswer(QNetworkReply* reply) { start_of_body - start_of_headers).replace(QRegularExpression(QSL("[\\n\\r]+")), QSL("\n")); - for (const QString& header_line : headers.split(QL1C('\n'), QString::SplitBehavior::SkipEmptyParts)) { + for (const QString& header_line : headers.split(QL1C('\n'), +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + Qt::SplitBehaviorFlags::SkipEmptyParts)) { +#else + QString::SkipEmptyParts)) { +#endif int index_colon = header_line.indexOf(QL1C(':')); if (index_colon > 0) { diff --git a/src/librssguard/network-web/downloadmanager.cpp b/src/librssguard/network-web/downloadmanager.cpp index b18dabf59..d5ffe04d0 100644 --- a/src/librssguard/network-web/downloadmanager.cpp +++ b/src/librssguard/network-web/downloadmanager.cpp @@ -55,7 +55,13 @@ void DownloadItem::init() { m_reply->setParent(this); connect(m_reply, &QNetworkReply::readyRead, this, &DownloadItem::downloadReadyRead); + +#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0 + connect(m_reply, &QNetworkReply::errorOccurred, this, &DownloadItem::error); +#else connect(m_reply, static_cast(&QNetworkReply::error), this, &DownloadItem::error); +#endif + connect(m_reply, &QNetworkReply::downloadProgress, this, &DownloadItem::downloadProgress); connect(m_reply, &QNetworkReply::metaDataChanged, this, &DownloadItem::metaDataChanged); connect(m_reply, &QNetworkReply::finished, this, &DownloadItem::finished); diff --git a/src/librssguard/network-web/webfactory.cpp b/src/librssguard/network-web/webfactory.cpp index 766c79a13..5dd612b58 100644 --- a/src/librssguard/network-web/webfactory.cpp +++ b/src/librssguard/network-web/webfactory.cpp @@ -33,8 +33,7 @@ bool WebFactory::sendMessageViaEmail(const Message& message) { const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailExecutable)).toString(); const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString(); - return QProcess::startDetached(QString("\"") + browser + QSL("\" ") + arguments.arg(message.m_title, - stripTags(message.m_contents))); + return IOFactory::startProcessDetached(browser, {}, arguments.arg(message.m_title, stripTags(message.m_contents))); } else { // Send it via mailto protocol. @@ -49,10 +48,11 @@ bool WebFactory::openUrlInExternalBrowser(const QString& url) const { if (qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserEnabled)).toBool()) { const QString browser = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserExecutable)).toString(); const QString arguments = qApp->settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalBrowserArguments)).toString(); - const QString call_line = "\"" + browser + "\" \"" + arguments.arg(url) + "\""; + auto nice_args = arguments.arg(url); - qDebug("Running command '%s'.", qPrintable(call_line)); - const bool result = QProcess::startDetached(call_line); + qDebug("Arguments for external browser: '%s'.", qPrintable(nice_args)); + + const bool result = IOFactory::startProcessDetached(browser, {}, nice_args); if (!result) { qDebug("External web browser call failed."); @@ -75,7 +75,6 @@ QString WebFactory::escapeHtml(const QString& html) { } QString output = html; - QMapIterator i(m_escapes); while (i.hasNext()) { @@ -92,7 +91,6 @@ QString WebFactory::deEscapeHtml(const QString& text) { } QString output = text; - QMapIterator i(m_deEscapes); while (i.hasNext()) { @@ -174,6 +172,7 @@ void WebFactory::createMenu(QMenu* menu) { menu->clear(); QList actions; + actions << createEngineSettingsAction(tr("Auto-load images"), QWebEngineSettings::AutoLoadImages); actions << createEngineSettingsAction(tr("JS enabled"), QWebEngineSettings::JavascriptEnabled); actions << createEngineSettingsAction(tr("JS can open popup windows"), QWebEngineSettings::JavascriptCanOpenWindows); @@ -204,6 +203,7 @@ void WebFactory::webEngineSettingChanged(bool enabled) { const QAction* const act = qobject_cast(sender()); QWebEngineSettings::WebAttribute attribute = static_cast(act->data().toInt()); + qApp->settings()->setValue(WebEngineAttributes::ID, QString::number(static_cast(attribute)), enabled); QWebEngineProfile::defaultProfile()->settings()->setAttribute(attribute, act->isChecked()); } diff --git a/src/librssguard/services/abstract/accountcheckmodel.cpp b/src/librssguard/services/abstract/accountcheckmodel.cpp index 928368976..b686a44c2 100644 --- a/src/librssguard/services/abstract/accountcheckmodel.cpp +++ b/src/librssguard/services/abstract/accountcheckmodel.cpp @@ -33,6 +33,7 @@ void AccountCheckModel::setRootItem(RootItem* root_item, bool delete_previous_ro m_rootItem->deleteLater(); } + m_checkStates.clear(); m_rootItem = root_item; if (with_layout_change) { @@ -172,7 +173,7 @@ QVariant AccountCheckModel::data(const QModelIndex& index, int role) const { else if (role == Qt::DecorationRole) { auto ic = item->icon(); - return ic.isNull() ? QVariant() : ic; + return item->data(0, Qt::ItemDataRole::DecorationRole); } else if (role == Qt::EditRole) { return QVariant::fromValue(item); @@ -206,6 +207,7 @@ bool AccountCheckModel::setData(const QModelIndex& index, const QVariant& value, // Change data for the actual item. m_checkStates[item] = static_cast(value.toInt()); emit dataChanged(index, index); + emit checkStateChanged(item, m_checkStates[item]); if (m_recursiveChange) { return true; diff --git a/src/librssguard/services/abstract/accountcheckmodel.h b/src/librssguard/services/abstract/accountcheckmodel.h index c0444461e..f11e027bd 100644 --- a/src/librssguard/services/abstract/accountcheckmodel.h +++ b/src/librssguard/services/abstract/accountcheckmodel.h @@ -43,6 +43,9 @@ class AccountCheckModel : public QAbstractItemModel { void checkAllItems(); void uncheckAllItems(); + signals: + void checkStateChanged(RootItem* item, Qt::CheckState); + protected: RootItem* m_rootItem; diff --git a/src/librssguard/services/inoreader/network/inoreadernetworkfactory.cpp b/src/librssguard/services/inoreader/network/inoreadernetworkfactory.cpp index c16d88e5c..b98af5297 100644 --- a/src/librssguard/services/inoreader/network/inoreadernetworkfactory.cpp +++ b/src/librssguard/services/inoreader/network/inoreadernetworkfactory.cpp @@ -394,9 +394,9 @@ RootItem* InoreaderNetworkFactory::decodeFeedCategoriesData(const QString& categ QString title = subscription["title"].toString(); QString url = subscription["htmlUrl"].toString(); QString parent_label; - QJsonArray categories = subscription["categories"].toArray(); + QJsonArray assigned_categories = subscription["categories"].toArray(); - for (const QJsonValue& cat : categories) { + for (const QJsonValue& cat : assigned_categories) { QString potential_id = cat.toObject()["id"].toString(); if (potential_id.contains(QSL("/label/"))) { diff --git a/src/librssguard/services/owncloud/owncloudfeed.cpp b/src/librssguard/services/owncloud/owncloudfeed.cpp index 3805a8b7c..7a9ba9ffe 100644 --- a/src/librssguard/services/owncloud/owncloudfeed.cpp +++ b/src/librssguard/services/owncloud/owncloudfeed.cpp @@ -22,6 +22,7 @@ bool OwnCloudFeed::canBeEdited() const { bool OwnCloudFeed::editViaGui() { QPointer form_pointer = new FormOwnCloudFeedDetails(serviceRoot(), qApp->mainFormWidget()); + form_pointer.data()->addEditFeed(this, nullptr); delete form_pointer.data(); return false; @@ -79,6 +80,4 @@ QList OwnCloudFeed::obtainNewMessages(bool* error_during_obtaining) { *error_during_obtaining = false; return messages.messages(); } - - return QList(); }