File indexing completed on 2024-04-28 04:42:51
0001 /** =========================================================== 0002 * @file 0003 * 0004 * This file is a part of KDE project 0005 * <a href="https://commits.kde.org/libmediawiki">libmediawiki</a> 0006 * 0007 * @date 2011-03-22 0008 * @brief a MediaWiki C++ interface for KDE 0009 * 0010 * @author Copyright (C) 2011-2012 by Gilles Caulier 0011 * <a href="mailto:caulier dot gilles at gmail dot com">caulier dot gilles at gmail dot com</a> 0012 * @author Copyright (C) 2010 by Manuel Campomanes 0013 * <a href="mailto:campomanes dot manuel at gmail dot com">campomanes dot manuel at gmail dot com</a> 0014 * @author Copyright (C) 2010 by Hormiere Guillaume 0015 * <a href="mailto:hormiere dot guillaume at gmail dot com">hormiere dot guillaume at gmail dot com</a> 0016 * 0017 * This program is free software; you can redistribute it 0018 * and/or modify it under the terms of the GNU General 0019 * Public License as published by the Free Software Foundation; 0020 * either version 2, or (at your option) 0021 * any later version. 0022 * 0023 * This program is distributed in the hope that it will be useful, 0024 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0025 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0026 * GNU General Public License for more details. 0027 * 0028 * ============================================================ */ 0029 0030 #include "querysiteinfogeneral.h" 0031 0032 0033 // Qt includes 0034 0035 #include <QTimer> 0036 #include <QUrl> 0037 #include <QUrlQuery> 0038 #include <QXmlStreamReader> 0039 0040 #include <QNetworkAccessManager> 0041 #include <QNetworkReply> 0042 #include <QNetworkRequest> 0043 0044 // Local includes 0045 0046 #include "mediawiki.h" 0047 #include "job_p.h" 0048 0049 namespace mediawiki 0050 { 0051 0052 class QuerySiteInfoGeneralPrivate : public JobPrivate 0053 { 0054 0055 public: 0056 0057 QuerySiteInfoGeneralPrivate(MediaWiki& mediawiki) 0058 : JobPrivate(mediawiki) 0059 { 0060 } 0061 }; 0062 0063 QuerySiteInfoGeneral::QuerySiteInfoGeneral(MediaWiki& mediawiki, QObject* const /*parent*/) 0064 : Job(*new QuerySiteInfoGeneralPrivate(mediawiki)) 0065 { 0066 } 0067 0068 QuerySiteInfoGeneral::~QuerySiteInfoGeneral() 0069 { 0070 } 0071 0072 void QuerySiteInfoGeneral::start() 0073 { 0074 QTimer::singleShot(0, this, SLOT(doWorkSendRequest())); 0075 } 0076 0077 void QuerySiteInfoGeneral::doWorkSendRequest() 0078 { 0079 Q_D(QuerySiteInfoGeneral); 0080 0081 // Set the url 0082 QUrl url = d->mediawiki.url(); 0083 QUrlQuery query; 0084 query.addQueryItem(QStringLiteral("format"), QStringLiteral("xml")); 0085 query.addQueryItem(QStringLiteral("action"), QStringLiteral("query")); 0086 query.addQueryItem(QStringLiteral("meta"), QStringLiteral("siteinfo")); 0087 query.addQueryItem(QStringLiteral("siprop"), QStringLiteral("general")); 0088 url.setQuery(query); 0089 0090 // Set the request 0091 QNetworkRequest request(url); 0092 request.setRawHeader("User-Agent", d->mediawiki.userAgent().toUtf8()); 0093 0094 // Send the request 0095 d->reply = d->manager->get(request); 0096 connectReply(); 0097 0098 connect(d->reply, SIGNAL(finished()), 0099 this, SLOT(doWorkProcessReply())); 0100 } 0101 0102 void QuerySiteInfoGeneral::doWorkProcessReply() 0103 { 0104 Q_D(QuerySiteInfoGeneral); 0105 0106 disconnect(d->reply, SIGNAL(finished()), 0107 this, SLOT(doWorkProcessReply())); 0108 0109 if (d->reply->error() != QNetworkReply::NoError) 0110 { 0111 this->setError(Job::NetworkError); 0112 d->reply->close(); 0113 d->reply->deleteLater(); 0114 emitResult(); 0115 return; 0116 } 0117 0118 Generalinfo generalinfo; 0119 QXmlStreamReader reader(d->reply); 0120 0121 while(!reader.atEnd() && !reader.hasError()) 0122 { 0123 QXmlStreamReader::TokenType token = reader.readNext(); 0124 0125 if(token == QXmlStreamReader::StartElement) 0126 { 0127 if(reader.name() == QLatin1String("general")) 0128 { 0129 generalinfo.setMainPage(reader.attributes().value(QStringLiteral("mainpage")).toString()); 0130 generalinfo.setUrl(QUrl::fromEncoded(reader.attributes().value(QStringLiteral("base")).toString().toLocal8Bit())); 0131 generalinfo.setSiteName(reader.attributes().value(QStringLiteral("sitename")).toString()); 0132 generalinfo.setGenerator(reader.attributes().value(QStringLiteral("generator")).toString()); 0133 generalinfo.setPhpVersion(reader.attributes().value(QStringLiteral("phpversion")).toString()); 0134 generalinfo.setPhpApi(reader.attributes().value(QStringLiteral("phpsapi")).toString()); 0135 generalinfo.setDataBaseType(reader.attributes().value(QStringLiteral("dbtype")).toString()); 0136 generalinfo.setDataBaseVersion(reader.attributes().value(QStringLiteral("dbversion")).toString()); 0137 generalinfo.setRev(reader.attributes().value(QStringLiteral("rev")).toString()); 0138 generalinfo.setCas(reader.attributes().value(QStringLiteral("case")).toString()); 0139 generalinfo.setLicence(reader.attributes().value(QStringLiteral("rights")).toString()); 0140 generalinfo.setLanguage(reader.attributes().value(QStringLiteral("lang")).toString()); 0141 generalinfo.setFallBack8bitEncoding(reader.attributes().value(QStringLiteral("fallback8bitEncoding")).toString()); 0142 generalinfo.setWriteApi(reader.attributes().value(QStringLiteral("writeapi")).toString()); 0143 generalinfo.setTimeZone(reader.attributes().value(QStringLiteral("timezone")).toString()); 0144 generalinfo.setTimeOffset(reader.attributes().value(QStringLiteral("timeoffset")).toString()); 0145 generalinfo.setArticlePath(reader.attributes().value(QStringLiteral("articlepath")).toString()); 0146 generalinfo.setScriptPath(reader.attributes().value(QStringLiteral("scriptpath")).toString()); 0147 generalinfo.setScript(reader.attributes().value(QStringLiteral("script")).toString()); 0148 generalinfo.setVariantArticlePath(reader.attributes().value(QStringLiteral("variantarticlepath")).toString()); 0149 generalinfo.setServerUrl(QUrl::fromEncoded(reader.attributes().value(QStringLiteral("server")).toString().toLocal8Bit())); 0150 generalinfo.setWikiId(reader.attributes().value(QStringLiteral("wikiid")).toString()); 0151 generalinfo.setTime(QDateTime::fromString(reader.attributes().value(QStringLiteral("time")).toString(), QStringLiteral("yyyy-MM-dd'T'hh:mm:ss'Z'"))); 0152 } 0153 else if(reader.name() == QLatin1String("error")) 0154 { 0155 this->setError(QuerySiteInfoGeneral::IncludeAllDenied); 0156 d->reply->close(); 0157 d->reply->deleteLater(); 0158 emitResult(); 0159 return; 0160 } 0161 } 0162 } 0163 0164 if (reader.hasError()) 0165 { 0166 this->setError(Job::XmlError); 0167 } 0168 else 0169 { 0170 emit result(generalinfo); 0171 this->setError(Job::NoError); 0172 } 0173 0174 d->reply->close(); 0175 d->reply->deleteLater(); 0176 emitResult(); 0177 } 0178 0179 } // namespace mediawiki