File indexing completed on 2024-05-05 04:44:07
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