File indexing completed on 2024-04-21 15:32:08

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