1
/** ===========================================================
4
* This file is a part of KDE project
5
* <a href="https://projects.kde.org/projects/extragear/libs/libmediawiki">libmediawiki</a>
8
* @brief a MediaWiki C++ interface for KDE
10
* @author Copyright (C) 2011-2012 by Gilles Caulier
11
* <a href="mailto:caulier dot gilles at gmail dot com">caulier dot gilles at gmail dot com</a>
12
* @author Copyright (C) 2010 by Ludovic Delfau
13
* <a href="mailto:ludovicdelfau at gmail dot com">ludovicdelfau at gmail dot com</a>
15
* This program is free software; you can redistribute it
16
* and/or modify it under the terms of the GNU General
17
* Public License as published by the Free Software Foundation;
18
* either version 2, or (at your option)
21
* This program is distributed in the hope that it will be useful,
22
* but WITHOUT ANY WARRANTY; without even the implied warranty of
23
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24
* GNU General Public License for more details.
26
* ============================================================ */
28
#include "querysiteinfousergroups.h"
33
#include <QtCore/QTimer>
34
#include <QtCore/QUrl>
35
#include <QtCore/QUrlQuery>
36
#include <QtCore/QXmlStreamReader>
38
#include <QtNetwork/QNetworkAccessManager>
39
#include <QtNetwork/QNetworkReply>
40
#include <QtNetwork/QNetworkRequest>
44
#include "mediawiki.h"
50
class QuerySiteinfoUsergroupsPrivate : public JobPrivate
54
QuerySiteinfoUsergroupsPrivate(MediaWiki& mediawiki, QNetworkAccessManager* const manager, bool includeNumber)
55
: JobPrivate(mediawiki),
57
includeNumber(includeNumber)
61
QNetworkAccessManager* const manager;
65
QuerySiteinfoUsergroups::QuerySiteinfoUsergroups(MediaWiki& mediawiki, QObject* const parent)
66
: Job(*new QuerySiteinfoUsergroupsPrivate(mediawiki, new QNetworkAccessManager(), false), parent)
70
QuerySiteinfoUsergroups::~QuerySiteinfoUsergroups()
74
void QuerySiteinfoUsergroups::setIncludeNumber(bool includeNumber)
76
Q_D(QuerySiteinfoUsergroups);
77
d->includeNumber = includeNumber;
80
void QuerySiteinfoUsergroups::start()
82
QTimer::singleShot(0, this, SLOT(doWorkSendRequest()));
85
void QuerySiteinfoUsergroups::doWorkSendRequest()
87
Q_D(QuerySiteinfoUsergroups);
90
QUrl url = d->mediawiki.url();
92
query.addQueryItem(QStringLiteral("format"), QStringLiteral("xml"));
93
query.addQueryItem(QStringLiteral("action"), QStringLiteral("query"));
94
query.addQueryItem(QStringLiteral("meta"), QStringLiteral("siteinfo"));
95
query.addQueryItem(QStringLiteral("siprop"), QStringLiteral("usergroups"));
98
query.addQueryItem(QStringLiteral("sinumberingroup"), QString());
103
QNetworkRequest request(url);
104
request.setRawHeader("User-Agent", d->mediawiki.userAgent().toUtf8());
107
d->reply = d->manager->get(request);
110
connect(d->reply, SIGNAL(finished()),
111
this, SLOT(doWorkProcessReply()));
114
void QuerySiteinfoUsergroups::doWorkProcessReply()
116
Q_D(QuerySiteinfoUsergroups);
118
disconnect(d->reply, SIGNAL(finished()),
119
this, SLOT(doWorkProcessReply()));
121
if (d->reply->error() == QNetworkReply::NoError)
123
QList<UserGroup> results;
125
QList<QString> rights;
126
unsigned int number = 0;
127
QXmlStreamReader reader(d->reply);
129
while (!reader.atEnd() && !reader.hasError())
131
QXmlStreamReader::TokenType token = reader.readNext();
133
if (token == QXmlStreamReader::StartElement)
135
if (reader.name() == QLatin1String("group"))
137
name = reader.attributes().value(QStringLiteral("name")).toString();
138
if (d->includeNumber)
140
number = reader.attributes().value(QStringLiteral("number")).toString().toUInt();
143
else if (reader.name() == QLatin1String("rights"))
147
else if (reader.name() == QLatin1String("permission"))
150
rights.push_back(reader.text().toString());
153
else if (token == QXmlStreamReader::EndElement)
155
if (reader.name() == QLatin1String("group"))
158
usergroup.setName(name);
159
usergroup.setRights(rights);
163
usergroup.setNumber(number);
166
results.push_back(usergroup);
171
if (!reader.hasError())
173
setError(Job::NoError);
174
emit usergroups(results);
178
setError(QuerySiteinfoUsergroups::XmlError);
183
setError(QuerySiteinfoUsergroups::NetworkError);
189
} // namespace mediawiki