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