diff options
| author | Linus Jahn <lnj@kaidan.im> | 2019-01-04 20:49:09 +0100 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2019-05-04 10:31:43 +0200 |
| commit | 537e325e2d44e696993b78ae2b8dd8437433c2b9 (patch) | |
| tree | bc4604c1d0894764d25e9237942cd1f13a0cdd17 /src/base/QXmppMixItem.cpp | |
| parent | 754cc5a70479a54659dbc93ccb5bf28e1da77ef4 (diff) | |
| download | qxmpp-537e325e2d44e696993b78ae2b8dd8437433c2b9.tar.gz | |
Implement MIX-CORE XEP-0369: Info/Participant node items
This implements the pubsub items for the MIX participants and info node
as defined by XEP-0369: Mediated Information eXchange (MIX) in version
0.14.2.
https://xmpp.org/extensions/xep-0369.html#participants-node
https://xmpp.org/extensions/xep-0369.html#info-node
Diffstat (limited to 'src/base/QXmppMixItem.cpp')
| -rw-r--r-- | src/base/QXmppMixItem.cpp | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/src/base/QXmppMixItem.cpp b/src/base/QXmppMixItem.cpp new file mode 100644 index 00000000..5b1d7c00 --- /dev/null +++ b/src/base/QXmppMixItem.cpp @@ -0,0 +1,226 @@ +/* + * Copyright (C) 2008-2019 The QXmpp developers + * + * Author: + * Linus Jahn <lnj@kaidan.im> + * + * Source: + * https://github.com/qxmpp-project/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include "QXmppMixItem.h" +#include "QXmppDataForm.h" +#include "QXmppConstants_p.h" +#include "QXmppUtils.h" +#include <QDomElement> +#include <QBuffer> + +class QXmppMixInfoItemPrivate : QSharedData +{ +public: + QString name; + QString description; + QStringList contactJids; +}; + +QXmppMixInfoItem::QXmppMixInfoItem() + : d(new QXmppMixInfoItemPrivate) +{ +} + +/// Returns the user-specified name of the MIX channel. This is not the name +/// part of the channel's JID. + +QString QXmppMixInfoItem::name() const +{ + return d->name; +} + +/// Sets the name of the channel. + +void QXmppMixInfoItem::setName(const QString& name) +{ + d->name = name; +} + +/// Returns the description of the channel. This string might be very long. + +QString QXmppMixInfoItem::description() const +{ + return d->description; +} + +/// Sets the longer channel description. + +void QXmppMixInfoItem::setDescription(const QString& description) +{ + d->description = description; +} + +/// Returns a list of JIDs that are responsible for this channel. + +QStringList QXmppMixInfoItem::contactJids() const +{ + return d->contactJids; +} + +/// Sets a list of public JIDs that are responsible for this channel. + +void QXmppMixInfoItem::setContactJids(const QStringList& contactJids) +{ + d->contactJids = contactJids; +} + +/// Returns true, if the given dom element is a MIX channel info item. + +bool QXmppMixInfoItem::isMixChannelInfo(const QDomElement& element) +{ + QXmppDataForm form; + form.parse(element); + for (const auto &field : form.fields()) { + if (field.key() == "FORM_TYPE") + return field.value() == ns_mix; + } + return false; +} + +void QXmppMixInfoItem::parse(const QXmppElement& element) +{ + QXmppDataForm form; + form.parse(element.sourceDomElement()); + + for (auto& field : form.fields()) { + if (field.key() == "Name") + d->name = field.value().toString(); + else if (field.key() == "Description") + d->description = field.value().toString(); + else if (field.key() == "Contact") + d->contactJids = field.value().toStringList(); + } +} + +QXmppElement QXmppMixInfoItem::toElement() const +{ + QXmppDataForm form; + form.setType(QXmppDataForm::Result); + QList<QXmppDataForm::Field> fields; + + QXmppDataForm::Field formType; + formType.setType(QXmppDataForm::Field::HiddenField); + formType.setKey("FORM_TYPE"); + formType.setValue(ns_mix); + fields << formType; + + QXmppDataForm::Field nameField; + nameField.setKey("Name"); + nameField.setValue(d->name); + fields << nameField; + + QXmppDataForm::Field descriptionField; + descriptionField.setKey("Description"); + descriptionField.setValue(d->description); + fields << descriptionField; + + QXmppDataForm::Field contactsField; + contactsField.setKey("Contact"); + contactsField.setValue(d->contactJids); + contactsField.setType(QXmppDataForm::Field::JidMultiField); + fields << contactsField; + + form.setFields(fields); + + // FIXME: this is too complicated; maybe don't use QXmppElement in QXmppPubSubItem? + QBuffer buffer; + buffer.open(QIODevice::ReadWrite); + QXmlStreamWriter writer(&buffer); + form.toXml(&writer); + + QDomDocument doc; + doc.setContent(buffer.data()); + return QXmppElement(doc.documentElement()); +} + +class QXmppMixParticipantItemPrivate : QSharedData +{ +public: + QString nick; + QString jid; +}; + +QXmppMixParticipantItem::QXmppMixParticipantItem() + : d(new QXmppMixParticipantItemPrivate) +{ +} + +/// Returns the participant's nickname. + +QString QXmppMixParticipantItem::nick() const +{ + return d->nick; +} + +/// Sets the participants nickname. + +void QXmppMixParticipantItem::setNick(const QString& nick) +{ + d->nick = nick; +} + +/// Returns the participant's JID. + +QString QXmppMixParticipantItem::jid() const +{ + return d->jid; +} + +/// Sets the participant's JID. + +void QXmppMixParticipantItem::setJid(const QString& jid) +{ + d->jid = jid; +} + +void QXmppMixParticipantItem::parse(const QXmppElement& itemContent) +{ + d->nick = itemContent.firstChildElement("nick").value(); + d->jid = itemContent.firstChildElement("jid").value(); +} + +QXmppElement QXmppMixParticipantItem::toElement() const +{ + QXmppElement element; + element.setTagName("participant"); + element.setAttribute("xmlns", ns_mix); + + QXmppElement jid; + jid.setTagName("jid"); + jid.setValue(d->jid); + element.appendChild(jid); + + QXmppElement nick; + nick.setTagName("nick"); + nick.setValue(d->nick); + element.appendChild(nick); + + return element; +} + +/// Returns true, if this dom element is a MIX participant item. + +bool QXmppMixParticipantItem::isMixParticipantItem(const QDomElement &element) +{ + return element.tagName() == "participant" && element.namespaceURI() == ns_mix; +} |
