diff options
| author | Linus Jahn <lnj@kaidan.im> | 2015-10-24 00:19:25 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2018-10-29 21:41:31 +0100 |
| commit | 5559ed29681d031f36e7a7d011e3ec4bec3635f5 (patch) | |
| tree | b639a8c68f1d1255b5528bde34412ffc64a34fb6 /src | |
| parent | 3e2ca3c04a5a681fa97ebabf6f31b301ec9753a0 (diff) | |
Implement XEP-0352: Client State Indication
This commit is based on a pull request by fbeutel (GitHub) (see #87) and
was rebased and slightly modified by me.
Diffstat (limited to 'src')
| -rw-r--r-- | src/base/QXmppConstants.cpp | 2 | ||||
| -rw-r--r-- | src/base/QXmppConstants_p.h | 2 | ||||
| -rw-r--r-- | src/base/QXmppStreamFeatures.cpp | 15 | ||||
| -rw-r--r-- | src/base/QXmppStreamFeatures.h | 9 | ||||
| -rw-r--r-- | src/client/QXmppClient.cpp | 23 | ||||
| -rw-r--r-- | src/client/QXmppClient.h | 3 | ||||
| -rw-r--r-- | src/client/QXmppOutgoingClient.cpp | 14 | ||||
| -rw-r--r-- | src/client/QXmppOutgoingClient.h | 1 |
8 files changed, 68 insertions, 1 deletions
diff --git a/src/base/QXmppConstants.cpp b/src/base/QXmppConstants.cpp index 7813b144..1ab2c70d 100644 --- a/src/base/QXmppConstants.cpp +++ b/src/base/QXmppConstants.cpp @@ -124,3 +124,5 @@ const char* ns_forwarding = "urn:xmpp:forward:0"; const char* ns_mam = "urn:xmpp:mam:1"; // XEP-0333: Chat Markers const char* ns_chat_markers = "urn:xmpp:chat-markers:0"; +// XEP-0352: Client State Indication +const char* ns_csi = "urn:xmpp:csi:0"; diff --git a/src/base/QXmppConstants_p.h b/src/base/QXmppConstants_p.h index 853f8222..cc113e3d 100644 --- a/src/base/QXmppConstants_p.h +++ b/src/base/QXmppConstants_p.h @@ -136,5 +136,7 @@ extern const char* ns_forwarding; extern const char* ns_mam; // XEP-0333: Char Markers extern const char* ns_chat_markers; +// XEP-0352: Client State Indication +extern const char* ns_csi; #endif // QXMPPCONSTANTS_H diff --git a/src/base/QXmppStreamFeatures.cpp b/src/base/QXmppStreamFeatures.cpp index fd2832dc..b4b51cfc 100644 --- a/src/base/QXmppStreamFeatures.cpp +++ b/src/base/QXmppStreamFeatures.cpp @@ -31,7 +31,8 @@ QXmppStreamFeatures::QXmppStreamFeatures() m_sessionMode(Disabled), m_nonSaslAuthMode(Disabled), m_tlsMode(Disabled), - m_streamManagementMode(Disabled) + m_streamManagementMode(Disabled), + m_csiMode(Disabled) { } @@ -105,6 +106,16 @@ void QXmppStreamFeatures::setStreamManagementMode(QXmppStreamFeatures::Mode mode m_streamManagementMode = mode; } +QXmppStreamFeatures::Mode QXmppStreamFeatures::clientStateIndicationMode() const +{ + return m_csiMode; +} + +void QXmppStreamFeatures::setClientStateIndicationMode(QXmppStreamFeatures::Mode mode) +{ + m_csiMode = mode; +} + /// \cond bool QXmppStreamFeatures::isStreamFeatures(const QDomElement &element) { @@ -136,6 +147,7 @@ void QXmppStreamFeatures::parse(const QDomElement &element) m_nonSaslAuthMode = readFeature(element, "auth", ns_authFeature); m_tlsMode = readFeature(element, "starttls", ns_tls); m_streamManagementMode = readFeature(element, "sm", ns_stream_management); + m_csiMode = readFeature(element, "csi", ns_csi); // parse advertised compression methods QDomElement compression = element.firstChildElement("compression"); @@ -181,6 +193,7 @@ void QXmppStreamFeatures::toXml(QXmlStreamWriter *writer) const writeFeature(writer, "auth", ns_authFeature, m_nonSaslAuthMode); writeFeature(writer, "starttls", ns_tls, m_tlsMode); writeFeature(writer, "sm", ns_stream_management, m_streamManagementMode); + writeFeature(writer, "csi", ns_csi, m_csiMode); if (!m_compressionMethods.isEmpty()) { diff --git a/src/base/QXmppStreamFeatures.h b/src/base/QXmppStreamFeatures.h index 242f748c..20507364 100644 --- a/src/base/QXmppStreamFeatures.h +++ b/src/base/QXmppStreamFeatures.h @@ -65,6 +65,14 @@ public: /// \pa mode The mode to set. void setStreamManagementMode(Mode mode); + /// Returns the mode for XEP-0352: Client State Indication + Mode clientStateIndicationMode() const; + + /// Sets the mode for XEP-0352: Client State Indication + /// + /// \pa mode The mode to set. + void setClientStateIndicationMode(Mode mode); + /// \cond void parse(const QDomElement &element); void toXml(QXmlStreamWriter *writer) const; @@ -78,6 +86,7 @@ private: Mode m_nonSaslAuthMode; Mode m_tlsMode; Mode m_streamManagementMode; + Mode m_csiMode; QStringList m_authMechanisms; QStringList m_compressionMethods; }; diff --git a/src/client/QXmppClient.cpp b/src/client/QXmppClient.cpp index bd28288f..e851e5fe 100644 --- a/src/client/QXmppClient.cpp +++ b/src/client/QXmppClient.cpp @@ -54,6 +54,9 @@ public: int reconnectionTries; QTimer *reconnectionTimer; + // Client state indication + bool isActive; + void addProperCapability(QXmppPresence& presence); int getNextReconnectTime() const; @@ -68,6 +71,7 @@ QXmppClientPrivate::QXmppClientPrivate(QXmppClient *qq) , receivedConflict(false) , reconnectionTries(0) , reconnectionTimer(0) + , isActive(true) , q(qq) { } @@ -320,6 +324,25 @@ bool QXmppClient::isConnected() const return d->stream->isConnected(); } +/// Returns true if the current client state is "active", false if it is +/// "inactive". See XEP-0352 for details. + +bool QXmppClient::isActive() const +{ + return d->isActive; +} + +/// Sets the client state as described in XEP-0352 + +void QXmppClient::setActive(bool active) +{ + if (active != d->isActive && d->stream->isClientStateIndicationEnabled()) { + d->isActive = active; + QString packet = "<%1 xmlns='%2'/>"; + d->stream->sendData(packet.arg(active ? "active" : "inactive", ns_csi).toUtf8()); + } +} + /// Returns the reference to QXmppRosterManager object of the client. /// \return Reference to the roster object of the connected client. Use this to /// get the list of friends in the roster and their presence information. diff --git a/src/client/QXmppClient.h b/src/client/QXmppClient.h index 22a7af65..6771f20c 100644 --- a/src/client/QXmppClient.h +++ b/src/client/QXmppClient.h @@ -140,6 +140,9 @@ public: bool isAuthenticated() const; bool isConnected() const; + bool isActive() const; + void setActive(bool active); + QXmppPresence clientPresence() const; void setClientPresence(const QXmppPresence &presence); diff --git a/src/client/QXmppOutgoingClient.cpp b/src/client/QXmppOutgoingClient.cpp index 9d5043d0..04929362 100644 --- a/src/client/QXmppOutgoingClient.cpp +++ b/src/client/QXmppOutgoingClient.cpp @@ -106,6 +106,9 @@ public: QString resumeHost; quint16 resumePort; + // Client State Indication + bool clientStateIndicationEnabled; + // Timers QTimer *pingTimer; QTimer *timeoutTimer; @@ -126,6 +129,7 @@ QXmppOutgoingClientPrivate::QXmppOutgoingClientPrivate(QXmppOutgoingClient *qq) , canResume(false) , isResuming(false) , resumePort(0) + , clientStateIndicationEnabled(false) , pingTimer(0) , timeoutTimer(0) , q(qq) @@ -294,6 +298,13 @@ bool QXmppOutgoingClient::isConnected() const return QXmppStream::isConnected() && d->sessionStarted; } +/// Returns true if client state indication (xep-0352) is supported by the server + +bool QXmppOutgoingClient::isClientStateIndicationEnabled() const +{ + return d->clientStateIndicationEnabled; +} + void QXmppOutgoingClient::_q_socketDisconnected() { debug("Socket disconnected"); @@ -400,6 +411,9 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv) QXmppStreamFeatures features; features.parse(nodeRecv); + if(features.clientStateIndicationMode() == QXmppStreamFeatures::Enabled) + d->clientStateIndicationEnabled = true; + if (!socket()->isEncrypted()) { // determine TLS mode to use diff --git a/src/client/QXmppOutgoingClient.h b/src/client/QXmppOutgoingClient.h index 0edd0a5d..84607b83 100644 --- a/src/client/QXmppOutgoingClient.h +++ b/src/client/QXmppOutgoingClient.h @@ -55,6 +55,7 @@ public: void connectToHost(); bool isAuthenticated() const; bool isConnected() const; + bool isClientStateIndicationEnabled() const; QSslSocket *socket() const { return QXmppStream::socket(); }; QXmppStanza::Error::Condition xmppStreamError(); |
