File indexing completed on 2024-04-28 15:28:59
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"