~ubuntu-branches/debian/sid/libmediawiki/sid

« back to all changes in this revision

Viewing changes to src/querysiteinfousergroups.cpp

  • Committer: Package Import Robot
  • Author(s): Steve M. Robbins
  • Date: 2017-11-05 21:15:29 UTC
  • Revision ID: package-import@ubuntu.com-20171105211529-bgfi385yv79030cf
Tags: upstream-5.37.0
ImportĀ upstreamĀ versionĀ 5.37.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/** ===========================================================
 
2
 * @file
 
3
 *
 
4
 * This file is a part of KDE project
 
5
 * <a href="https://projects.kde.org/projects/extragear/libs/libmediawiki">libmediawiki</a>
 
6
 *
 
7
 * @date   2011-03-22
 
8
 * @brief  a MediaWiki C++ interface for KDE
 
9
 *
 
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>
 
14
 *
 
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)
 
19
 * any later version.
 
20
 *
 
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.
 
25
 *
 
26
 * ============================================================ */
 
27
 
 
28
#include "querysiteinfousergroups.h"
 
29
 
 
30
 
 
31
// Qt includes
 
32
 
 
33
#include <QtCore/QTimer>
 
34
#include <QtCore/QUrl>
 
35
#include <QtCore/QUrlQuery>
 
36
#include <QtCore/QXmlStreamReader>
 
37
 
 
38
#include <QtNetwork/QNetworkAccessManager>
 
39
#include <QtNetwork/QNetworkReply>
 
40
#include <QtNetwork/QNetworkRequest>
 
41
 
 
42
// Local includes
 
43
 
 
44
#include "mediawiki.h"
 
45
#include "job_p.h"
 
46
 
 
47
namespace mediawiki
 
48
{
 
49
 
 
50
class QuerySiteinfoUsergroupsPrivate : public JobPrivate
 
51
{
 
52
public:
 
53
 
 
54
    QuerySiteinfoUsergroupsPrivate(MediaWiki& mediawiki, QNetworkAccessManager* const manager, bool includeNumber)
 
55
            : JobPrivate(mediawiki),
 
56
              manager(manager),
 
57
              includeNumber(includeNumber)
 
58
    {
 
59
    }
 
60
 
 
61
    QNetworkAccessManager* const manager;
 
62
    bool                         includeNumber;
 
63
};
 
64
 
 
65
QuerySiteinfoUsergroups::QuerySiteinfoUsergroups(MediaWiki& mediawiki, QObject* const parent)
 
66
    : Job(*new QuerySiteinfoUsergroupsPrivate(mediawiki, new QNetworkAccessManager(), false), parent)
 
67
{
 
68
}
 
69
 
 
70
QuerySiteinfoUsergroups::~QuerySiteinfoUsergroups()
 
71
{
 
72
}
 
73
 
 
74
void QuerySiteinfoUsergroups::setIncludeNumber(bool includeNumber)
 
75
{
 
76
    Q_D(QuerySiteinfoUsergroups);
 
77
    d->includeNumber = includeNumber;
 
78
}
 
79
 
 
80
void QuerySiteinfoUsergroups::start()
 
81
{
 
82
    QTimer::singleShot(0, this, SLOT(doWorkSendRequest()));
 
83
}
 
84
 
 
85
void QuerySiteinfoUsergroups::doWorkSendRequest()
 
86
{
 
87
    Q_D(QuerySiteinfoUsergroups);
 
88
 
 
89
    // Set the url
 
90
    QUrl url = d->mediawiki.url();
 
91
    QUrlQuery query;
 
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"));
 
96
    if (d->includeNumber)
 
97
    {
 
98
        query.addQueryItem(QStringLiteral("sinumberingroup"), QString());
 
99
    }
 
100
    url.setQuery(query);
 
101
 
 
102
    // Set the request
 
103
    QNetworkRequest request(url);
 
104
    request.setRawHeader("User-Agent", d->mediawiki.userAgent().toUtf8());
 
105
 
 
106
    // Send the request
 
107
    d->reply = d->manager->get(request);
 
108
    connectReply();
 
109
 
 
110
    connect(d->reply, SIGNAL(finished()),
 
111
            this, SLOT(doWorkProcessReply()));
 
112
}
 
113
 
 
114
void QuerySiteinfoUsergroups::doWorkProcessReply()
 
115
{
 
116
    Q_D(QuerySiteinfoUsergroups);
 
117
 
 
118
    disconnect(d->reply, SIGNAL(finished()),
 
119
               this, SLOT(doWorkProcessReply()));
 
120
 
 
121
    if (d->reply->error() == QNetworkReply::NoError)
 
122
    {
 
123
        QList<UserGroup> results;
 
124
        QString          name;
 
125
        QList<QString>   rights;
 
126
        unsigned int     number = 0;
 
127
        QXmlStreamReader reader(d->reply);
 
128
 
 
129
        while (!reader.atEnd() && !reader.hasError())
 
130
        {
 
131
            QXmlStreamReader::TokenType token = reader.readNext();
 
132
 
 
133
            if (token == QXmlStreamReader::StartElement)
 
134
            {
 
135
                if (reader.name() == QLatin1String("group"))
 
136
                {
 
137
                    name = reader.attributes().value(QStringLiteral("name")).toString();
 
138
                    if (d->includeNumber)
 
139
                    {
 
140
                        number = reader.attributes().value(QStringLiteral("number")).toString().toUInt();
 
141
                    }
 
142
                }
 
143
                else if (reader.name() == QLatin1String("rights"))
 
144
                {
 
145
                    rights.clear();
 
146
                }
 
147
                else if (reader.name() == QLatin1String("permission"))
 
148
                {
 
149
                    reader.readNext();
 
150
                    rights.push_back(reader.text().toString());
 
151
                }
 
152
            }
 
153
            else if (token == QXmlStreamReader::EndElement)
 
154
            {
 
155
                if (reader.name() == QLatin1String("group"))
 
156
                {
 
157
                    UserGroup usergroup;
 
158
                    usergroup.setName(name);
 
159
                    usergroup.setRights(rights);
 
160
 
 
161
                    if(d->includeNumber)
 
162
                    {
 
163
                        usergroup.setNumber(number);
 
164
                    }
 
165
 
 
166
                    results.push_back(usergroup);
 
167
                }
 
168
            }
 
169
        }
 
170
 
 
171
        if (!reader.hasError())
 
172
        {
 
173
            setError(Job::NoError);
 
174
            emit usergroups(results);
 
175
        }
 
176
        else
 
177
        {
 
178
            setError(QuerySiteinfoUsergroups::XmlError);
 
179
        }
 
180
    }
 
181
    else
 
182
    {
 
183
        setError(QuerySiteinfoUsergroups::NetworkError);
 
184
    }
 
185
 
 
186
    emitResult();
 
187
}
 
188
 
 
189
} // namespace mediawiki