2
* Copyright (C) 2006 Remko Troncon
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public License
6
* as published by the Free Software Foundation; either version 2
7
* of the License, or (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this library; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
#include "xmpp_xmlcommon.h"
24
#include "xmpp_task.h"
26
#include "psiprivacymanager.h"
27
#include "privacymanager.h"
28
#include "privacylist.h"
30
#define PRIVACY_NS "jabber:iq:privacy"
34
// -----------------------------------------------------------------------------
36
class PrivacyListListener : public Task
41
PrivacyListListener(Task* parent) : Task(parent) {
44
bool take(const QDomElement &e) {
45
if(e.tagName() != "iq" || e.attribute("type") != "set")
48
QString ns = queryNS(e);
49
if(ns == "jabber:iq:privacy") {
50
// TODO: Do something with update
53
QDomElement iq = createIQ(doc(), "result", e.attribute("from"), e.attribute("id"));
62
// -----------------------------------------------------------------------------
64
class GetPrivacyListsTask : public Task
71
QString default_, active_;
74
GetPrivacyListsTask(Task* parent) : Task(parent) {
75
iq_ = createIQ(doc(), "get", "", id());
76
QDomElement query = doc()->createElement("query");
77
query.setAttribute("xmlns",PRIVACY_NS);
78
iq_.appendChild(query);
85
bool take(const QDomElement &x) {
86
if(!iqVerify(x, "", id()))
89
//qDebug("privacy.cpp: Got reply for privacy lists.");
90
if (x.attribute("type") == "result") {
91
QDomElement tag, q = queryTag(x);
93
for (QDomNode n = q.firstChild(); !n.isNull(); n = n.nextSibling()) {
94
QDomElement e = n.toElement();
95
if (e.tagName() == "active")
96
active_ = e.attribute("name");
97
else if (e.tagName() == "default")
98
default_ = e.attribute("name");
99
else if (e.tagName() == "list")
100
lists_.append(e.attribute("name"));
102
qWarning("privacy.cpp: Unknown tag in privacy lists.");
113
const QStringList& lists() {
117
const QString& defaultList() {
121
const QString& activeList() {
127
class SetPrivacyListsTask : public Task
132
bool changeDefault_, changeActive_, changeList_;
137
SetPrivacyListsTask(Task* parent) : Task(parent), changeDefault_(false), changeActive_(false), changeList_(false), list_("") {
141
QDomElement iq_ = createIQ(doc(), "set", "", id());
142
QDomElement query = doc()->createElement("query");
143
query.setAttribute("xmlns",PRIVACY_NS);
144
iq_.appendChild(query);
147
if (changeDefault_) {
148
//qDebug("privacy.cpp: Changing default privacy list.");
149
e = doc()->createElement("default");
150
if (!value_.isEmpty())
151
e.setAttribute("name",value_);
153
else if (changeActive_) {
154
//qDebug("privacy.cpp: Changing active privacy list.");
155
e = doc()->createElement("active");
156
if (!value_.isEmpty())
157
e.setAttribute("name",value_);
159
else if (changeList_) {
160
//qDebug("privacy.cpp: Changing privacy list.");
161
e = list_.toXml(*doc());
164
qWarning("privacy.cpp: Empty active/default list change request.");
168
query.appendChild(e);
172
void setActive(const QString& active) {
174
changeDefault_ = false;
175
changeActive_ = true;
179
void setDefault(const QString& d) {
181
changeDefault_ = true;
182
changeActive_ = false;
186
void setList(const PrivacyList& list) {
187
//qDebug() << "setList: " << list.toString();
189
changeDefault_ = false;
190
changeActive_ = false;
194
bool take(const QDomElement &x) {
195
if(!iqVerify(x, "", id()))
198
if (x.attribute("type") == "result") {
199
//qDebug("privacy.cpp: Got succesful reply for list change.");
203
qWarning("privacy.cpp: Got error reply for list change.");
210
class GetPrivacyListTask : public Task
220
GetPrivacyListTask(Task* parent, const QString& name) : Task(parent), name_(name), list_(PrivacyList("")) {
221
iq_ = createIQ(doc(), "get", "", id());
222
QDomElement query = doc()->createElement("query");
223
query.setAttribute("xmlns",PRIVACY_NS);
224
iq_.appendChild(query);
225
QDomElement list = doc()->createElement("list");
226
list.setAttribute("name",name);
227
query.appendChild(list);
231
//qDebug() << "privacy.cpp: Requesting privacy list %1." << name_;
235
bool take(const QDomElement &x) {
236
if(!iqVerify(x, "", id()))
239
//qDebug() << QString("privacy.cpp: Got privacy list %1 reply.").arg(name_);
240
if (x.attribute("type") == "result") {
241
QDomElement q = queryTag(x);
243
QDomElement listTag = findSubTag(q,"list",&found);
245
list_ = PrivacyList(listTag);
248
qWarning("privacy.cpp: No valid list found.");
258
const PrivacyList& list() {
263
// -----------------------------------------------------------------------------
265
PsiPrivacyManager::PsiPrivacyManager(XMPP::Task* rootTask) : rootTask_(rootTask), getDefault_waiting_(false), block_waiting_(false)
267
listener_ = new PrivacyListListener(rootTask_);
270
PsiPrivacyManager::~PsiPrivacyManager()
275
void PsiPrivacyManager::requestListNames()
277
GetPrivacyListsTask* t = new GetPrivacyListsTask(rootTask_);
278
connect(t,SIGNAL(finished()),SLOT(receiveLists()));
282
void PsiPrivacyManager::requestList(const QString& name)
284
GetPrivacyListTask* t = new GetPrivacyListTask(rootTask_, name);
285
connect(t,SIGNAL(finished()),SLOT(receiveList()));
289
void PsiPrivacyManager::block(const QString& target)
291
block_targets_.push_back(target);
292
if (!block_waiting_) {
293
block_waiting_ = true;
294
connect(this,SIGNAL(defaultListAvailable(const PrivacyList&)),SLOT(block_getDefaultList_success(const PrivacyList&)));
295
connect(this,SIGNAL(defaultListError()),SLOT(block_getDefaultList_error()));
300
void PsiPrivacyManager::block_getDefaultList_success(const PrivacyList& l_)
303
disconnect(this,SIGNAL(defaultListAvailable(const PrivacyList&)),this,SLOT(block_getDefault_success(const PrivacyList&)));
304
disconnect(this,SIGNAL(defaultListError()),this,SLOT(block_getDefault_error()));
305
block_waiting_ = false;
306
while (!block_targets_.isEmpty())
307
l.insertItem(0,PrivacyListItem::blockItem(block_targets_.takeFirst()));
311
void PsiPrivacyManager::block_getDefaultList_error()
313
disconnect(this,SIGNAL(defaultListAvailable(const PrivacyList&)),this,SLOT(block_getDefault_success(const PrivacyList&)));
314
disconnect(this,SIGNAL(defaultListError()),this,SLOT(block_getDefault_error()));
315
block_waiting_ = false;
316
block_targets_.clear();
319
void PsiPrivacyManager::getDefaultList()
321
connect(this,SIGNAL(listsReceived(const QString&, const QString&, const QStringList&)),SLOT(getDefault_listsReceived(const QString&, const QString&, const QStringList&)));
322
connect(this,SIGNAL(listsError()),SLOT(getDefault_listsError()));
326
void PsiPrivacyManager::getDefault_listsReceived(const QString& defaultList, const QString&, const QStringList&)
328
disconnect(this,SIGNAL(listsReceived(const QString&, const QString&, const QStringList&)),this,SLOT(getDefault_listsReceived(const QString&, const QString&, const QStringList&)));
329
disconnect(this,SIGNAL(listsError()),this,SLOT(getDefault_listsError()));
331
getDefault_default_ = defaultList;
332
if (!defaultList.isEmpty()) {
333
getDefault_waiting_ = true;
334
connect(this,SIGNAL(listReceived(const PrivacyList&)),SLOT(getDefault_listReceived(const PrivacyList&)));
335
connect(this,SIGNAL(listError()),SLOT(getDefault_listError()));
336
requestList(defaultList);
339
emit defaultListAvailable(PrivacyList(""));
343
void PsiPrivacyManager::getDefault_listsError()
345
disconnect(this,SIGNAL(listsReceived(const QString&, const QString&, const QStringList&)),this,SLOT(getDefault_listsReceived(const QString&, const QString&, const QStringList&)));
346
disconnect(this,SIGNAL(listsError()),this,SLOT(getDefault_listsError()));
347
emit defaultListError();
350
void PsiPrivacyManager::getDefault_listReceived(const PrivacyList& l)
352
if (l.name() == getDefault_default_ && getDefault_waiting_) {
353
disconnect(this,SIGNAL(listReceived(const PrivacyList&)),this,SLOT(getDefault_listReceived(const PrivacyList&)));
354
disconnect(this,SIGNAL(listError()),this,SLOT(getDefault_listError()));
355
getDefault_waiting_ = false;
356
emit defaultListAvailable(l);
360
void PsiPrivacyManager::getDefault_listError()
362
emit defaultListError();
365
void PsiPrivacyManager::changeDefaultList(const QString& name)
367
SetPrivacyListsTask* t = new SetPrivacyListsTask(rootTask_);
369
connect(t,SIGNAL(finished()),SLOT(changeDefaultList_finished()));
373
void PsiPrivacyManager::changeDefaultList_finished()
375
SetPrivacyListsTask *t = (SetPrivacyListsTask*)sender();
377
qWarning("privacy.cpp:changeDefault_finished(): Unexpected sender.");
382
emit changeDefaultList_success();
385
emit changeDefaultList_error();
389
void PsiPrivacyManager::changeActiveList(const QString& name)
391
SetPrivacyListsTask* t = new SetPrivacyListsTask(rootTask_);
393
connect(t,SIGNAL(finished()),SLOT(changeActiveList_finished()));
397
void PsiPrivacyManager::changeActiveList_finished()
399
SetPrivacyListsTask *t = (SetPrivacyListsTask*)sender();
401
qWarning("privacy.cpp:changeActive_finished(): Unexpected sender.");
406
emit changeActiveList_success();
409
emit changeActiveList_error();
413
void PsiPrivacyManager::changeList(const PrivacyList& list)
415
SetPrivacyListsTask* t = new SetPrivacyListsTask(rootTask_);
417
connect(t,SIGNAL(finished()),SLOT(changeList_finished()));
421
void PsiPrivacyManager::changeList_finished()
423
SetPrivacyListsTask *t = (SetPrivacyListsTask*)sender();
425
qWarning("privacy.cpp:changeList_finished(): Unexpected sender.");
430
emit changeList_success();
433
emit changeList_error();
437
void PsiPrivacyManager::receiveLists()
439
GetPrivacyListsTask *t = (GetPrivacyListsTask*)sender();
441
qWarning("privacy.cpp:receiveLists(): Unexpected sender.");
446
emit listsReceived(t->defaultList(),t->activeList(),t->lists());
449
qDebug("privacy.cpp: Error in lists receiving.");
454
void PsiPrivacyManager::receiveList()
456
GetPrivacyListTask *t = (GetPrivacyListTask*)sender();
458
qWarning("privacy.cpp:receiveList(): Unexpected sender.");
463
emit listReceived(t->list());
466
qDebug("privacy.cpp: Error in list receiving.");
471
#include "psiprivacymanager.moc"