1/*
2 knewstuff3/xmlloader.cpp.
3 SPDX-FileCopyrightText: 2002 Cornelius Schumacher <schumacher@kde.org>
4 SPDX-FileCopyrightText: 2003-2007 Josef Spillner <spillner@kde.org>
5 SPDX-FileCopyrightText: 2009 Jeremy Whiting <jpwhiting@kde.org>
6 SPDX-FileCopyrightText: 2010 Frederik Gladhorn <gladhorn@kde.org>
7
8 SPDX-License-Identifier: LGPL-2.1-or-later
9*/
10
11#include "xmlloader_p.h"
12
13#include "jobs/httpjob.h"
14#include "knewstuffcore_debug.h"
15
16#include <KConfig>
17
18#include <QByteArray>
19#include <QFile>
20#include <QTimer>
21
22namespace KNSCore
23{
24void handleData(XmlLoader *q, const QByteArray &data)
25{
26 qCDebug(KNEWSTUFFCORE) << "--Xml Loader-START--";
27 qCDebug(KNEWSTUFFCORE) << QString::fromUtf8(ba: data);
28 qCDebug(KNEWSTUFFCORE) << "--Xml Loader-END--";
29 QDomDocument doc;
30 if (doc.setContent(data)) {
31 Q_EMIT q->signalLoaded(doc);
32 } else {
33 Q_EMIT q->signalFailed();
34 }
35}
36
37XmlLoader::XmlLoader(QObject *parent)
38 : QObject(parent)
39{
40}
41
42void XmlLoader::load(const QUrl &url)
43{
44 qCDebug(KNEWSTUFFCORE) << "XmlLoader::load(): url: " << url;
45 // The load call is expected to be asynchronous (to allow for people to connect to signals
46 // after it is called), and so we need to postpone its implementation until the listeners
47 // are actually listening
48 QTimer::singleShot(interval: 0, receiver: this, slot: [this, url]() {
49 m_jobdata.clear();
50 static const QStringList remoteSchemeOptions{QLatin1String{"http"}, QLatin1String{"https"}, QLatin1String{"ftp"}};
51 if (remoteSchemeOptions.contains(str: url.scheme())) {
52 HTTPJob *job = HTTPJob::get(source: url, loadType: Reload, flags: JobFlag::HideProgressInfo);
53 connect(sender: job, signal: &KJob::result, context: this, slot: &XmlLoader::slotJobResult);
54 connect(sender: job, signal: &HTTPJob::data, context: this, slot: &XmlLoader::slotJobData);
55 connect(sender: job, signal: &HTTPJob::httpError, context: this, slot: &XmlLoader::signalHttpError);
56 Q_EMIT jobStarted(job);
57 } else if (url.isLocalFile()) {
58 QFile localProvider(url.toLocalFile());
59 if (localProvider.open(flags: QFile::ReadOnly)) {
60 m_jobdata = localProvider.readAll();
61 handleData(q: this, data: m_jobdata);
62 } else {
63 Q_EMIT signalFailed();
64 }
65 } else {
66 // This is not supported
67 qCDebug(KNEWSTUFFCORE) << "Attempted to load data from unsupported URL:" << url;
68 Q_EMIT signalFailed();
69 }
70 });
71}
72
73void XmlLoader::slotJobData(KJob *, const QByteArray &data)
74{
75 m_jobdata.append(a: data);
76}
77
78void XmlLoader::slotJobResult(KJob *job)
79{
80 deleteLater();
81 if (job->error()) {
82 Q_EMIT signalFailed();
83 } else {
84 handleData(q: this, data: m_jobdata);
85 }
86}
87
88QDomElement addElement(QDomDocument &doc, QDomElement &parent, const QString &tag, const QString &value)
89{
90 QDomElement n = doc.createElement(tagName: tag);
91 n.appendChild(newChild: doc.createTextNode(data: value));
92 parent.appendChild(newChild: n);
93
94 return n;
95}
96} // end KNS namespace
97
98#include "moc_xmlloader_p.cpp"
99

source code of knewstuff/src/core/xmlloader.cpp