File indexing completed on 2024-05-05 16:49:22

0001 /*
0002  * SPDX-FileCopyrightText: 2021 Han Young <hanyoung@protonmail.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 #include "pendingcap.h"
0007 #include "capparser.h"
0008 #include <QNetworkReply>
0009 namespace KWeatherCore {
0010 class PendingCAPPrivate : public QObject
0011 {
0012     Q_OBJECT
0013 public:
0014     PendingCAPPrivate(QNetworkReply *reply = nullptr, QObject *parent = nullptr);
0015     bool isFinished = false;
0016     QByteArray data;
0017 Q_SIGNALS:
0018     void networkError();
0019     void finished();
0020 private:
0021     void parseCAP(QNetworkReply *reply);
0022 };
0023 PendingCAPPrivate::PendingCAPPrivate(QNetworkReply *reply, QObject *parent)
0024     : QObject(parent)
0025 {
0026     if (reply) {
0027         connect(reply, &QNetworkReply::finished, this, [this, reply] {
0028             this->parseCAP(reply);
0029         });
0030         connect(reply, &QNetworkReply::errorOccurred, this, &PendingCAPPrivate::networkError);
0031     }
0032 }
0033 
0034 void PendingCAPPrivate::parseCAP(QNetworkReply *reply)
0035 {
0036     reply->deleteLater();
0037     if (reply->error()) {
0038         qWarning() << "network error when fetching alerts:"
0039                    << reply->errorString();
0040         return;
0041     }
0042 
0043     data = reply->readAll();
0044     isFinished = true;
0045     Q_EMIT finished();
0046 }
0047 std::unique_ptr<AlertEntry> PendingCAP::value() const
0048 {
0049     if (d->data.isEmpty())
0050         return {};
0051 
0052     CAPParser parser(d->data);
0053     return parser.parse();
0054 }
0055 PendingCAP::PendingCAP(QNetworkReply *reply)
0056     : d(new PendingCAPPrivate(reply, this))
0057 {
0058     connect(d, &PendingCAPPrivate::finished, this, &PendingCAP::finished);
0059     connect(d, &PendingCAPPrivate::networkError, this, &PendingCAP::networkError);
0060 }
0061 bool PendingCAP::isFinished() const
0062 {
0063     return d->isFinished;
0064 }
0065 }
0066 #include "pendingcap.moc"