diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-03-10 09:36:08 +0100 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-03-10 10:03:30 +0100 |
| commit | 686b7f7c2ab6b3987925241888fa387be35a97a8 (patch) | |
| tree | a8f79c68f804926732267792086d97005eb68a4c /src/base/QXmppMixItems.cpp | |
| parent | 523030f0751d69e4f33ee7dc3a4078e213ee94aa (diff) | |
| download | qxmpp-686b7f7c2ab6b3987925241888fa387be35a97a8.tar.gz | |
Rename MixItem.h to MixItems.h
Diffstat (limited to 'src/base/QXmppMixItems.cpp')
| -rw-r--r-- | src/base/QXmppMixItems.cpp | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/src/base/QXmppMixItems.cpp b/src/base/QXmppMixItems.cpp new file mode 100644 index 00000000..35ed3335 --- /dev/null +++ b/src/base/QXmppMixItems.cpp @@ -0,0 +1,267 @@ +// SPDX-FileCopyrightText: 2019 Linus Jahn <lnj@kaidan.im> +// +// SPDX-License-Identifier: LGPL-2.1-or-later + +#include "QXmppConstants_p.h" +#include "QXmppDataFormBase.h" +#include "QXmppMixInfoItem.h" +#include "QXmppMixParticipantItem.h" + +static const auto NAME = QStringLiteral("Name"); +static const auto DESCRIPTION = QStringLiteral("Description"); +static const auto CONTACT_JIDS = QStringLiteral("Contact"); + +class QXmppMixInfoItemPrivate : public QSharedData, public QXmppDataFormBase +{ +public: + QString name; + QString description; + QStringList contactJids; + + ~QXmppMixInfoItemPrivate() override = default; + + void reset() + { + name.clear(); + description.clear(); + contactJids.clear(); + } + + QString formType() const override + { + return ns_mix; + } + + void parseForm(const QXmppDataForm &form) override + { + const auto fields = form.fields(); + for (const auto &field : fields) { + const auto key = field.key(); + const auto value = field.value(); + + if (key == NAME) { + name = value.toString(); + } else if (key == DESCRIPTION) { + description = value.toString(); + } else if (key == CONTACT_JIDS) { + contactJids = value.toStringList(); + } + } + } + void serializeForm(QXmppDataForm &form) const override + { + using Type = QXmppDataForm::Field::Type; + serializeNullable(form, Type::TextSingleField, NAME, name); + serializeNullable(form, Type::TextSingleField, DESCRIPTION, description); + serializeEmptyable(form, Type::JidMultiField, CONTACT_JIDS, contactJids); + } +}; + +/// +/// \class QXmppMixInfoItem +/// +/// \brief The QXmppMixInfoItem class represents a PubSub item of a MIX +/// channel containing channel information as defined by \xep{0369, Mediated +/// Information eXchange (MIX)}. +/// +/// \since QXmpp 1.5 +/// +/// \ingroup Stanzas +/// + +QXmppMixInfoItem::QXmppMixInfoItem() + : d(new QXmppMixInfoItemPrivate) +{ +} + +/// Default copy-constructor +QXmppMixInfoItem::QXmppMixInfoItem(const QXmppMixInfoItem &) = default; + +/// Default assignment operator +QXmppMixInfoItem &QXmppMixInfoItem::operator=(const QXmppMixInfoItem &) = default; + +QXmppMixInfoItem::~QXmppMixInfoItem() = default; + +/// +/// Returns the user-specified name of the MIX channel. This is not the name +/// part of the channel's JID. +/// +const QString &QXmppMixInfoItem::name() const +{ + return d->name; +} + +/// +/// Sets the name of the channel. +/// +void QXmppMixInfoItem::setName(QString name) +{ + d->name = std::move(name); +} + +/// +/// Returns the description of the channel. This string might be very long. +/// +const QString &QXmppMixInfoItem::description() const +{ + return d->description; +} + +/// +/// Sets the longer channel description. +/// +void QXmppMixInfoItem::setDescription(QString description) +{ + d->description = std::move(description); +} + +/// +/// Returns a list of JIDs that are responsible for this channel. +/// +const QStringList &QXmppMixInfoItem::contactJids() const +{ + return d->contactJids; +} + +/// +/// Sets a list of public JIDs that are responsible for this channel. +/// +void QXmppMixInfoItem::setContactJids(QStringList contactJids) +{ + d->contactJids = std::move(contactJids); +} + +/// +/// Returns true, if the given dom element is a MIX channel info item. +/// +bool QXmppMixInfoItem::isItem(const QDomElement &element) +{ + return QXmppPubSubItem::isItem(element, [](const QDomElement &payload) { + // check FORM_TYPE without parsing a full QXmppDataForm + if (payload.tagName() != u'x' || payload.namespaceURI() != ns_data) { + return false; + } + for (auto fieldEl = payload.firstChildElement(); + !fieldEl.isNull(); + fieldEl = fieldEl.nextSiblingElement()) { + if (fieldEl.attribute(QStringLiteral("var")) == QStringLiteral(u"FORM_TYPE")) { + return fieldEl.firstChildElement(QStringLiteral("value")).text() == ns_mix; + } + } + return false; + }); +} + +/// \cond +void QXmppMixInfoItem::parsePayload(const QDomElement &payload) +{ + d->reset(); + + QXmppDataForm form; + form.parse(payload); + + d->parseForm(form); +} + +void QXmppMixInfoItem::serializePayload(QXmlStreamWriter *writer) const +{ + auto form = d->toDataForm(); + form.setType(QXmppDataForm::Result); + form.toXml(writer); +} +/// \endcond + +class QXmppMixParticipantItemPrivate : public QSharedData +{ +public: + QString nick; + QString jid; +}; + +/// +/// \class QXmppMixParticipantItem +/// +/// The QXmppMixParticipantItem class represents a PubSub item of a MIX channel +/// participant as defined by \xep{0369, Mediated Information eXchange (MIX)}. +/// +/// \since QXmpp 1.5 +/// +/// \ingroup Stanzas +/// + +QXmppMixParticipantItem::QXmppMixParticipantItem() + : d(new QXmppMixParticipantItemPrivate) +{ +} + +/// Default copy-constructor +QXmppMixParticipantItem::QXmppMixParticipantItem(const QXmppMixParticipantItem &) = default; + +/// Default assignment operator +QXmppMixParticipantItem &QXmppMixParticipantItem::operator=(const QXmppMixParticipantItem &) = default; + +QXmppMixParticipantItem::~QXmppMixParticipantItem() = default; + +/// +/// Returns the participant's nickname. +/// +const QString &QXmppMixParticipantItem::nick() const +{ + return d->nick; +} + +/// +/// Sets the participants nickname. +/// +void QXmppMixParticipantItem::setNick(QString nick) +{ + d->nick = std::move(nick); +} + +/// +/// Returns the participant's JID. +/// +const QString &QXmppMixParticipantItem::jid() const +{ + return d->jid; +} + +/// +/// Sets the participant's JID. +/// +void QXmppMixParticipantItem::setJid(QString jid) +{ + d->jid = std::move(jid); +} + +/// \cond +void QXmppMixParticipantItem::parsePayload(const QDomElement &payload) +{ + d->nick = payload.firstChildElement(QStringLiteral("nick")).text(); + d->jid = payload.firstChildElement(QStringLiteral("jid")).text(); +} + +void QXmppMixParticipantItem::serializePayload(QXmlStreamWriter *writer) const +{ + writer->writeStartElement(QStringLiteral("participant")); + writer->writeDefaultNamespace(ns_mix); + if (!d->jid.isEmpty()) { + writer->writeTextElement("jid", d->jid); + } + if (!d->nick.isEmpty()) { + writer->writeTextElement("nick", d->nick); + } + writer->writeEndElement(); +} +/// \endcond + +/// +/// Returns true, if this dom element is a MIX participant item. +/// +bool QXmppMixParticipantItem::isItem(const QDomElement &element) +{ + return QXmppPubSubItem::isItem(element, [](const QDomElement &payload) { + return payload.tagName() == QStringLiteral("participant") && + payload.namespaceURI() == ns_mix; + }); +} |
