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 Ludovic Delfau
0013  *         <a href="mailto:ludovicdelfau at gmail dot com">ludovicdelfau at gmail dot com</a>
0014  *
0015  * This program is free software; you can redistribute it
0016  * and/or modify it under the terms of the GNU General
0017  * Public License as published by the Free Software Foundation;
0018  * either version 2, or (at your option)
0019  * any later version.
0020  *
0021  * This program is distributed in the hope that it will be useful,
0022  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0023  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0024  * GNU General Public License for more details.
0025  *
0026  * ============================================================ */
0027 
0028 #include "querysiteinfousergroups.h"
0029 
0030 
0031 // Qt includes
0032 
0033 #include <QTimer>
0034 #include <QUrl>
0035 #include <QUrlQuery>
0036 #include <QXmlStreamReader>
0037 
0038 #include <QNetworkAccessManager>
0039 #include <QNetworkReply>
0040 #include <QNetworkRequest>
0041 
0042 // Local includes
0043 
0044 #include "mediawiki.h"
0045 #include "job_p.h"
0046 
0047 namespace mediawiki
0048 {
0049 
0050 class QuerySiteinfoUsergroupsPrivate : public JobPrivate
0051 {
0052 public:
0053 
0054     QuerySiteinfoUsergroupsPrivate(MediaWiki& mediawiki, QNetworkAccessManager* const manager, bool includeNumber)
0055             : JobPrivate(mediawiki),
0056               manager(manager),
0057               includeNumber(includeNumber)
0058     {
0059     }
0060 
0061     QNetworkAccessManager* const manager;
0062     bool                         includeNumber;
0063 };
0064 
0065 QuerySiteinfoUsergroups::QuerySiteinfoUsergroups(MediaWiki& mediawiki, QObject* const parent)
0066     : Job(*new QuerySiteinfoUsergroupsPrivate(mediawiki, new QNetworkAccessManager(), false), parent)
0067 {
0068 }
0069 
0070 QuerySiteinfoUsergroups::~QuerySiteinfoUsergroups()
0071 {
0072 }
0073 
0074 void QuerySiteinfoUsergroups::setIncludeNumber(bool includeNumber)
0075 {
0076     Q_D(QuerySiteinfoUsergroups);
0077     d->includeNumber = includeNumber;
0078 }
0079 
0080 void QuerySiteinfoUsergroups::start()
0081 {
0082     QTimer::singleShot(0, this, SLOT(doWorkSendRequest()));
0083 }
0084 
0085 void QuerySiteinfoUsergroups::doWorkSendRequest()
0086 {
0087     Q_D(QuerySiteinfoUsergroups);
0088 
0089     // Set the url
0090     QUrl url = d->mediawiki.url();
0091     QUrlQuery query;
0092     query.addQueryItem(QStringLiteral("format"), QStringLiteral("xml"));
0093     query.addQueryItem(QStringLiteral("action"), QStringLiteral("query"));
0094     query.addQueryItem(QStringLiteral("meta"),   QStringLiteral("siteinfo"));
0095     query.addQueryItem(QStringLiteral("siprop"), QStringLiteral("usergroups"));
0096     if (d->includeNumber)
0097     {
0098         query.addQueryItem(QStringLiteral("sinumberingroup"), QString());
0099     }
0100     url.setQuery(query);
0101 
0102     // Set the request
0103     QNetworkRequest request(url);
0104     request.setRawHeader("User-Agent", d->mediawiki.userAgent().toUtf8());
0105 
0106     // Send the request
0107     d->reply = d->manager->get(request);
0108     connectReply();
0109 
0110     connect(d->reply, SIGNAL(finished()),
0111             this, SLOT(doWorkProcessReply()));
0112 }
0113 
0114 void QuerySiteinfoUsergroups::doWorkProcessReply()
0115 {
0116     Q_D(QuerySiteinfoUsergroups);
0117 
0118     disconnect(d->reply, SIGNAL(finished()),
0119                this, SLOT(doWorkProcessReply()));
0120 
0121     if (d->reply->error() == QNetworkReply::NoError)
0122     {
0123         QList<UserGroup> results;
0124         QString          name;
0125         QList<QString>   rights;
0126         unsigned int     number = 0;
0127         QXmlStreamReader reader(d->reply);
0128 
0129         while (!reader.atEnd() && !reader.hasError())
0130         {
0131             QXmlStreamReader::TokenType token = reader.readNext();
0132 
0133             if (token == QXmlStreamReader::StartElement)
0134             {
0135                 if (reader.name() == QLatin1String("group"))
0136                 {
0137                     name = reader.attributes().value(QStringLiteral("name")).toString();
0138                     if (d->includeNumber)
0139                     {
0140                         number = reader.attributes().value(QStringLiteral("number")).toString().toUInt();
0141                     }
0142                 }
0143                 else if (reader.name() == QLatin1String("rights"))
0144                 {
0145                     rights.clear();
0146                 }
0147                 else if (reader.name() == QLatin1String("permission"))
0148                 {
0149                     reader.readNext();
0150                     rights.push_back(reader.text().toString());
0151                 }
0152             }
0153             else if (token == QXmlStreamReader::EndElement)
0154             {
0155                 if (reader.name() == QLatin1String("group"))
0156                 {
0157                     UserGroup usergroup;
0158                     usergroup.setName(name);
0159                     usergroup.setRights(rights);
0160 
0161                     if(d->includeNumber)
0162                     {
0163                         usergroup.setNumber(number);
0164                     }
0165 
0166                     results.push_back(usergroup);
0167                 }
0168             }
0169         }
0170 
0171         if (!reader.hasError())
0172         {
0173             setError(Job::NoError);
0174             emit usergroups(results);
0175         }
0176         else
0177         {
0178             setError(QuerySiteinfoUsergroups::XmlError);
0179         }
0180     }
0181     else
0182     {
0183         setError(QuerySiteinfoUsergroups::NetworkError);
0184     }
0185 
0186     emitResult();
0187 }
0188 
0189 } // namespace mediawiki