aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppStreamFeatures.cpp
diff options
context:
space:
mode:
authorNiels Ole Salscheider <niels_ole@salscheider-online.de>2017-02-12 17:18:06 +0100
committerJeremy Lainé <jeremy.laine@m4x.org>2017-02-12 17:18:06 +0100
commit084eb01fb395488a0a3aee799be2b72ce11aa220 (patch)
tree6fec32386c116b0560b9c5d81412993361a2f453 /src/base/QXmppStreamFeatures.cpp
parent9deb86b248fee6bb9bcee14d595a933c8fdc4aa2 (diff)
Implement XEP-0198: Stream Management (client only) (#99)
* Some features can be available with different namespaces (e.g. SM) * Provide static functions to convert between strings and stream errors Stream management will reuse this for <failed />. * [travis] test builds using clang * Implement XEP-0198: Stream Management (client only) * QXmppOutgoingClient: Move private methods to QXmppOutgoingClientPrivate
Diffstat (limited to 'src/base/QXmppStreamFeatures.cpp')
-rw-r--r--src/base/QXmppStreamFeatures.cpp34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/base/QXmppStreamFeatures.cpp b/src/base/QXmppStreamFeatures.cpp
index 322530b5..fd2832dc 100644
--- a/src/base/QXmppStreamFeatures.cpp
+++ b/src/base/QXmppStreamFeatures.cpp
@@ -30,7 +30,8 @@ QXmppStreamFeatures::QXmppStreamFeatures()
: m_bindMode(Disabled),
m_sessionMode(Disabled),
m_nonSaslAuthMode(Disabled),
- m_tlsMode(Disabled)
+ m_tlsMode(Disabled),
+ m_streamManagementMode(Disabled)
{
}
@@ -94,6 +95,16 @@ void QXmppStreamFeatures::setTlsMode(QXmppStreamFeatures::Mode mode)
m_tlsMode = mode;
}
+QXmppStreamFeatures::Mode QXmppStreamFeatures::streamManagementMode() const
+{
+ return m_streamManagementMode;
+}
+
+void QXmppStreamFeatures::setStreamManagementMode(QXmppStreamFeatures::Mode mode)
+{
+ m_streamManagementMode = mode;
+}
+
/// \cond
bool QXmppStreamFeatures::isStreamFeatures(const QDomElement &element)
{
@@ -104,15 +115,18 @@ bool QXmppStreamFeatures::isStreamFeatures(const QDomElement &element)
static QXmppStreamFeatures::Mode readFeature(const QDomElement &element, const char *tagName, const char *tagNs)
{
QDomElement subElement = element.firstChildElement(tagName);
- if (subElement.namespaceURI() == tagNs)
- {
- if (!subElement.firstChildElement("required").isNull())
- return QXmppStreamFeatures::Required;
- else
- return QXmppStreamFeatures::Enabled;
- } else {
- return QXmppStreamFeatures::Disabled;
+ QXmppStreamFeatures::Mode mode = QXmppStreamFeatures::Disabled;
+ while (!subElement.isNull()) {
+ if (subElement.namespaceURI() == tagNs)
+ {
+ if (!subElement.firstChildElement("required").isNull())
+ mode = QXmppStreamFeatures::Required;
+ else if (mode != QXmppStreamFeatures::Required)
+ mode = QXmppStreamFeatures::Enabled;
+ }
+ subElement = subElement.nextSiblingElement(tagName);
}
+ return mode;
}
void QXmppStreamFeatures::parse(const QDomElement &element)
@@ -121,6 +135,7 @@ void QXmppStreamFeatures::parse(const QDomElement &element)
m_sessionMode = readFeature(element, "session", ns_session);
m_nonSaslAuthMode = readFeature(element, "auth", ns_authFeature);
m_tlsMode = readFeature(element, "starttls", ns_tls);
+ m_streamManagementMode = readFeature(element, "sm", ns_stream_management);
// parse advertised compression methods
QDomElement compression = element.firstChildElement("compression");
@@ -165,6 +180,7 @@ void QXmppStreamFeatures::toXml(QXmlStreamWriter *writer) const
writeFeature(writer, "session", ns_session, m_sessionMode);
writeFeature(writer, "auth", ns_authFeature, m_nonSaslAuthMode);
writeFeature(writer, "starttls", ns_tls, m_tlsMode);
+ writeFeature(writer, "sm", ns_stream_management, m_streamManagementMode);
if (!m_compressionMethods.isEmpty())
{