File indexing completed on 2024-12-08 04:18:15
0001 /* 0002 SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "wikidataquerymanager.h" 0008 #include "wikidataquery.h" 0009 0010 #include <QNetworkAccessManager> 0011 #include <QNetworkDiskCache> 0012 #include <QNetworkReply> 0013 #include <QStandardPaths> 0014 0015 WikidataQueryManager::WikidataQueryManager(QObject *parent) 0016 : QObject(parent) 0017 { 0018 m_nam = new QNetworkAccessManager(this); 0019 m_nam->setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy); 0020 m_nam->setStrictTransportSecurityEnabled(true); 0021 m_nam->enableStrictTransportSecurityStore(true, QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QLatin1String("/org.kde.osm/hsts/")); 0022 0023 auto diskCache = new QNetworkDiskCache; 0024 diskCache->setCacheDirectory(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QLatin1String("/org.kde.wikidata/http-cache/")); 0025 diskCache->setMaximumCacheSize(1'000'000'000); // 1GB 0026 m_nam->setCache(diskCache); 0027 } 0028 0029 WikidataQueryManager::~WikidataQueryManager() = default; 0030 0031 void WikidataQueryManager::execute(WikidataQuery *query) 0032 { 0033 executeNextSubQuery(query); 0034 } 0035 0036 void WikidataQueryManager::executeNextSubQuery(WikidataQuery *query) 0037 { 0038 auto req = query->nextRequest(); 0039 // see https://www.mediawiki.org/wiki/API:Etiquette 0040 req.setHeader(QNetworkRequest::UserAgentHeader, QStringLiteral("KPublicTransport/KnowledgeDBGenerator (kde-pim@kde.org)")); 0041 const auto reply = m_nam->get(req); 0042 connect(reply, &QNetworkReply::finished, this, [query, reply, this]() { subQueryFinished(query, reply); }); 0043 } 0044 0045 void WikidataQueryManager::subQueryFinished(WikidataQuery *query, QNetworkReply *reply) 0046 { 0047 reply->deleteLater(); 0048 0049 if (reply->error() != QNetworkReply::NoError) { 0050 qWarning() << reply->errorString(); 0051 query->m_error = WikidataQuery::NetworkError; 0052 Q_EMIT query->finished(); 0053 return; 0054 } 0055 0056 if (query->processReply(reply)) { 0057 return; 0058 } 0059 executeNextSubQuery(query); 0060 }