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 };