File indexing completed on 2025-09-14 04:47:31
0001 /** 0002 * SPDX-FileCopyrightText: 2020 Tobias Fella <tobias.fella@kde.org> 0003 * SPDX-FileCopyrightText: 2021-2022 Bart De Vries <bart@mogwai.be> 0004 * 0005 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0006 */ 0007 0008 #pragma once 0009 0010 #include <QFile> 0011 #include <QNetworkAccessManager> 0012 #include <QNetworkReply> 0013 #include <QObject> 0014 #include <QQmlEngine> 0015 #include <QUrl> 0016 #include <Syndication/Syndication> 0017 0018 #include "enclosure.h" 0019 #include "error.h" 0020 0021 class Fetcher : public QObject 0022 { 0023 Q_OBJECT 0024 QML_ELEMENT 0025 QML_SINGLETON 0026 0027 Q_PROPERTY(int updateProgress MEMBER m_updateProgress NOTIFY updateProgressChanged) 0028 Q_PROPERTY(int updateTotal MEMBER m_updateTotal NOTIFY updateTotalChanged) 0029 Q_PROPERTY(bool updating MEMBER m_updating NOTIFY updatingChanged) 0030 0031 public: 0032 static Fetcher &instance() 0033 { 0034 static Fetcher _instance; 0035 return _instance; 0036 } 0037 static Fetcher *create(QQmlEngine *engine, QJSEngine *) 0038 { 0039 engine->setObjectOwnership(&instance(), QQmlEngine::CppOwnership); 0040 return &instance(); 0041 } 0042 0043 Q_INVOKABLE void fetch(const QString &url); 0044 Q_INVOKABLE void fetch(const QStringList &urls); 0045 Q_INVOKABLE void fetchAll(); 0046 Q_INVOKABLE QString image(const QString &url); 0047 Q_INVOKABLE QNetworkReply *download(const QString &url, const QString &fileName) const; 0048 void getRedirectedUrl(const QUrl &url); 0049 0050 QNetworkReply *get(QNetworkRequest &request) const; 0051 QNetworkReply *post(QNetworkRequest &request, const QByteArray &data) const; 0052 0053 Q_SIGNALS: 0054 void entryAdded(const QString &feedurl, const QString &id); 0055 void entryUpdated(const QString &feedurl, const QString &id); 0056 void feedUpdated(const QString &url); 0057 void feedDetailsUpdated(const QString &url, 0058 const QString &name, 0059 const QString &image, 0060 const QString &link, 0061 const QString &description, 0062 const QDateTime &lastUpdated, 0063 const QString &dirname); 0064 void feedUpdateStatusChanged(const QString &url, bool status); 0065 void cancelFetching(); 0066 0067 void updateProgressChanged(int progress); 0068 void updateTotalChanged(int nrOfFeeds); 0069 void updatingChanged(bool state); 0070 0071 void error(Error::Type type, const QString &url, const QString &id, const int errorId, const QString &errorString, const QString &title); 0072 void downloadFinished(QString url) const; 0073 void foundRedirectedUrl(const QUrl &url, const QUrl &newUrl); 0074 0075 private: 0076 Fetcher(); 0077 0078 QNetworkReply *head(QNetworkRequest &request) const; 0079 void setHeader(QNetworkRequest &request) const; 0080 0081 QSet<QString> m_ongoingImageDownloads; 0082 0083 QNetworkAccessManager *manager; 0084 int m_updateProgress; 0085 int m_updateTotal; 0086 bool m_updating; 0087 };