File indexing completed on 2024-04-28 11:43:35

0001 /*
0002     knewstuff3/xmlloader.cpp.
0003     SPDX-FileCopyrightText: 2002 Cornelius Schumacher <schumacher@kde.org>
0004     SPDX-FileCopyrightText: 2003-2007 Josef Spillner <spillner@kde.org>
0005     SPDX-FileCopyrightText: 2009 Jeremy Whiting <jpwhiting@kde.org>
0006     SPDX-FileCopyrightText: 2010 Frederik Gladhorn <gladhorn@kde.org>
0007 
0008     SPDX-License-Identifier: LGPL-2.1-or-later
0009 */
0010 
0011 #include "xmlloader.h"
0012 
0013 #include "jobs/httpjob.h"
0014 #include "knewstuffcore_debug.h"
0015 
0016 #include <KConfig>
0017 
0018 #include <QByteArray>
0019 #include <QFile>
0020 #include <QTimer>
0021 
0022 namespace KNSCore
0023 {
0024 void handleData(XmlLoader *q, const QByteArray &data)
0025 {
0026     qCDebug(KNEWSTUFFCORE) << "--Xml Loader-START--";
0027     qCDebug(KNEWSTUFFCORE) << QString::fromUtf8(data);
0028     qCDebug(KNEWSTUFFCORE) << "--Xml Loader-END--";
0029     QDomDocument doc;
0030     if (doc.setContent(data)) {
0031         Q_EMIT q->signalLoaded(doc);
0032     } else {
0033         Q_EMIT q->signalFailed();
0034     }
0035 }
0036 
0037 XmlLoader::XmlLoader(QObject *parent)
0038     : QObject(parent)
0039 {
0040 }
0041 
0042 void XmlLoader::load(const QUrl &url)
0043 {
0044     qCDebug(KNEWSTUFFCORE) << "XmlLoader::load(): url: " << url;
0045     // The load call is expected to be asynchronous (to allow for people to connect to signals
0046     // after it is called), and so we need to postpone its implementation until the listeners
0047     // are actually listening
0048     QTimer::singleShot(0, this, [this, url]() {
0049         m_jobdata.clear();
0050         static const QStringList remoteSchemeOptions{QLatin1String{"http"}, QLatin1String{"https"}, QLatin1String{"ftp"}};
0051         if (remoteSchemeOptions.contains(url.scheme())) {
0052             HTTPJob *job = HTTPJob::get(url, Reload, JobFlag::HideProgressInfo);
0053             connect(job, &KJob::result, this, &XmlLoader::slotJobResult);
0054             connect(job, &HTTPJob::data, this, &XmlLoader::slotJobData);
0055             connect(job, &HTTPJob::httpError, this, &XmlLoader::signalHttpError);
0056             Q_EMIT jobStarted(job);
0057         } else if (url.isLocalFile()) {
0058             QFile localProvider(url.toLocalFile());
0059             if (localProvider.open(QFile::ReadOnly)) {
0060                 m_jobdata = localProvider.readAll();
0061                 handleData(this, m_jobdata);
0062             } else {
0063                 Q_EMIT signalFailed();
0064             }
0065         } else {
0066             // This is not supported
0067             qCDebug(KNEWSTUFFCORE) << "Attempted to load data from unsupported URL:" << url;
0068             Q_EMIT signalFailed();
0069         }
0070     });
0071 }
0072 
0073 void XmlLoader::slotJobData(KJob *, const QByteArray &data)
0074 {
0075     qCDebug(KNEWSTUFFCORE) << Q_FUNC_INFO;
0076 
0077     m_jobdata.append(data);
0078 }
0079 
0080 void XmlLoader::slotJobResult(KJob *job)
0081 {
0082     deleteLater();
0083     if (job->error()) {
0084         Q_EMIT signalFailed();
0085     } else {
0086         handleData(this, m_jobdata);
0087     }
0088 }
0089 
0090 QDomElement addElement(QDomDocument &doc, QDomElement &parent, const QString &tag, const QString &value)
0091 {
0092     QDomElement n = doc.createElement(tag);
0093     n.appendChild(doc.createTextNode(value));
0094     parent.appendChild(n);
0095 
0096     return n;
0097 }
0098 } // end KNS namespace
0099 
0100 #include "moc_xmlloader.cpp"