File indexing completed on 2024-05-12 16:21:30
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 <QUrl> 0015 #include <Syndication/Syndication> 0016 0017 #include "enclosure.h" 0018 #include "error.h" 0019 0020 class Fetcher : public QObject 0021 { 0022 Q_OBJECT 0023 0024 Q_PROPERTY(int updateProgress MEMBER m_updateProgress NOTIFY updateProgressChanged) 0025 Q_PROPERTY(int updateTotal MEMBER m_updateTotal NOTIFY updateTotalChanged) 0026 Q_PROPERTY(bool updating MEMBER m_updating NOTIFY updatingChanged) 0027 0028 public: 0029 static Fetcher &instance() 0030 { 0031 static Fetcher _instance; 0032 return _instance; 0033 } 0034 0035 Q_INVOKABLE void fetch(const QString &url); 0036 Q_INVOKABLE void fetch(const QStringList &urls); 0037 Q_INVOKABLE void fetchAll(); 0038 Q_INVOKABLE QString image(const QString &url); 0039 Q_INVOKABLE QNetworkReply *download(const QString &url, const QString &fileName) const; 0040 void getRedirectedUrl(const QUrl &url); 0041 0042 QNetworkReply *get(QNetworkRequest &request) const; 0043 QNetworkReply *post(QNetworkRequest &request, const QByteArray &data) const; 0044 0045 Q_SIGNALS: 0046 void entryAdded(const QString &feedurl, const QString &id); 0047 void entryUpdated(const QString &feedurl, const QString &id); 0048 void feedUpdated(const QString &url); 0049 void feedDetailsUpdated(const QString &url, 0050 const QString &name, 0051 const QString &image, 0052 const QString &link, 0053 const QString &description, 0054 const QDateTime &lastUpdated, 0055 const QString &dirname); 0056 void feedUpdateStatusChanged(const QString &url, bool status); 0057 void cancelFetching(); 0058 0059 void updateProgressChanged(int progress); 0060 void updateTotalChanged(int nrOfFeeds); 0061 void updatingChanged(bool state); 0062 0063 void error(Error::Type type, const QString &url, const QString &id, const int errorId, const QString &errorString, const QString &title); 0064 void downloadFinished(QString url) const; 0065 void foundRedirectedUrl(const QUrl &url, const QUrl &newUrl); 0066 0067 private: 0068 Fetcher(); 0069 0070 QNetworkReply *head(QNetworkRequest &request) const; 0071 void setHeader(QNetworkRequest &request) const; 0072 0073 QSet<QString> m_ongoingImageDownloads; 0074 0075 QNetworkAccessManager *manager; 0076 int m_updateProgress; 0077 int m_updateTotal; 0078 bool m_updating; 0079 };