summaryrefslogtreecommitdiffstats
path: root/src/mqtt/qmqttconnectionproperties.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mqtt/qmqttconnectionproperties.cpp')
-rw-r--r--src/mqtt/qmqttconnectionproperties.cpp651
1 files changed, 651 insertions, 0 deletions
diff --git a/src/mqtt/qmqttconnectionproperties.cpp b/src/mqtt/qmqttconnectionproperties.cpp
new file mode 100644
index 0000000..aae5b58
--- /dev/null
+++ b/src/mqtt/qmqttconnectionproperties.cpp
@@ -0,0 +1,651 @@
+/******************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtMqtt module.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+******************************************************************************/
+
+#include "qmqttconnectionproperties.h"
+
+#include "qmqttconnectionproperties_p.h"
+
+#include <QtCore/QLoggingCategory>
+
+#include <limits>
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_LOGGING_CATEGORY(lcMqttConnection)
+
+/*!
+ \class QMqttConnectionProperties
+
+ \inmodule QtMqtt
+ \since 5.12
+
+ \brief The QMqttConnectionProperties class represents configuration
+ options a QMqttClient can pass to the server when invoking
+ QMqttClient::connectToHost().
+
+ \note Connection properties are part of the MQTT 5.0 specification and
+ cannot be used when connecting with a lower protocol level. See
+ QMqttClient::ProtocolVersion for more information.
+*/
+
+/*!
+ \class QMqttServerConnectionProperties
+
+ \inmodule QtMqtt
+ \since 5.12
+
+ \brief The QMqttServerConnectionProperties class represents configuration
+ options of a server a QMqttClient is connected to.
+
+ When a connection has been established the server might send additional
+ details about the connection properties. Use availableProperties() to
+ identify properties set by the server. If a property is not set by the
+ server, default values are assumed and can be obtained by invoking access
+ functions of this instance.
+
+ \note Connection properties are part of the MQTT 5.0 specification and
+ cannot be used when connecting with a lower protocol level. See
+ QMqttClient::ProtocolVersion for more information.
+*/
+
+/*!
+ \class QMqttLastWillProperties
+
+ \inmodule QtMqtt
+ \since 5.12
+
+ \brief The QMqttLastWillProperties class represents configuration
+ options a QMqttClient can pass to the server when specifying the last will
+ during connecting to a server.
+
+ \note Last Will properties are part of the MQTT 5.0 specification and
+ cannot be used when connecting with a lower protocol level. See
+ QMqttClient::ProtocolVersion for more information.
+*/
+
+/*!
+ \enum QMqttServerConnectionProperties::ServerPropertyDetail
+
+ This enum type specifies the available properties set by the
+ server or the client after establishing a connection.
+
+ \value None
+ No property has been specified.
+ \value SessionExpiryInterval
+ The number of seconds the server keeps the session after
+ a disconnect.
+ \value MaximumReceive
+ The maximum number of QoS 1 and 2 message the server is
+ capable of managing concurrently.
+ \value MaximumQoS
+ The maximum QoS level the server can understand.
+ \value RetainAvailable
+ Specifies whether retained messages are supported.
+ \value MaximumPacketSize
+ Specifies the maximum packet size including the message header
+ and properties.
+ \value AssignedClientId
+ Specifies whether the server assigned a client identifier.
+ \value MaximumTopicAlias
+ Specifies the maximum amount of topic aliases.
+ \value ReasonString
+ Specifies a string providing more details on connection state.
+ \value UserProperty
+ Specifies additional user properties.
+ \value WildCardSupported
+ Specifies whether the server supports wildcard subscriptions.
+ \value SubscriptionIdentifierSupport
+ Specifies whether the server supports subscription identifiers.
+ \value SharedSubscriptionSupport
+ Specifies whether the server supports shared subscriptions.
+ \value ServerKeepAlive
+ Specifies the number of seconds the server expects a keep alive
+ packet from the client.
+ \value ResponseInformation
+ Specifies the response information.
+ \value ServerReference
+ Specifies an alternative server address for the client to
+ connect to.
+ \value AuthenticationMethod
+ Specifies the authentication method.
+ \value AuthenticationData
+ Specifies the authentication data.
+*/
+
+/*!
+ \internal
+*/
+QMqttLastWillProperties::QMqttLastWillProperties() : data(new QMqttLastWillPropertiesData)
+{
+}
+
+/*!
+ \internal
+*/
+QMqttLastWillProperties::QMqttLastWillProperties(const QMqttLastWillProperties &) = default;
+
+QMqttLastWillProperties &QMqttLastWillProperties::operator=(const QMqttLastWillProperties &rhs)
+{
+ if (this != &rhs)
+ data.operator=(rhs.data);
+ return *this;
+}
+
+QMqttLastWillProperties::~QMqttLastWillProperties() = default;
+
+/*!
+ Returns the delay in seconds a last will message will be sent after
+ disconnecting from the server.
+*/
+quint32 QMqttLastWillProperties::willDelayInterval() const
+{
+ return data->willDelayInterval;
+}
+
+/*!
+ Returns the payload format indicator.
+*/
+QMqtt::PayloadFormatIndicator QMqttLastWillProperties::payloadFormatIndicator() const
+{
+ return data->formatIndicator;
+}
+
+/*!
+ Returns the lifetime of the last will message in seconds, starting from
+ the will delay interval.
+*/
+quint32 QMqttLastWillProperties::messageExpiryInterval() const
+{
+ return data->messageExpiryInterval;
+}
+
+/*!
+ Returns the content type of the last will message.
+*/
+QString QMqttLastWillProperties::contentType() const
+{
+ return data->contentType;
+}
+
+/*!
+ Returns the topic that subscribers to the last will message should respond
+ to.
+*/
+QString QMqttLastWillProperties::responseTopic() const
+{
+ return data->responseTopic;
+}
+
+/*!
+ Returns the correlation data to identify the request.
+*/
+QByteArray QMqttLastWillProperties::correlationData() const
+{
+ return data->correlationData;
+}
+
+/*!
+ Returns the user properties.
+*/
+QMqttUserProperties QMqttLastWillProperties::userProperties() const
+{
+ return data->userProperties;
+}
+
+/*!
+ Sets the will delay interval to \a delay.
+*/
+void QMqttLastWillProperties::setWillDelayInterval(quint32 delay)
+{
+ data->willDelayInterval = delay;
+}
+
+/*!
+ Sets the payload format indicator to \a p.
+*/
+void QMqttLastWillProperties::setPayloadFormatIndicator(QMqtt::PayloadFormatIndicator p)
+{
+ data->formatIndicator = p;
+}
+
+/*!
+ Sets the message expiry interval to \a expiry.
+*/
+void QMqttLastWillProperties::setMessageExpiryInterval(quint32 expiry)
+{
+ data->messageExpiryInterval = expiry;
+}
+
+/*!
+ Sets the content type to \a content.
+*/
+void QMqttLastWillProperties::setContentType(const QString &content)
+{
+ data->contentType = content;
+}
+
+/*!
+ Sets the response topic to \a response.
+*/
+void QMqttLastWillProperties::setResponseTopic(const QString &response)
+{
+ data->responseTopic = response;
+}
+
+/*!
+ Sets the correlation data to \a correlation.
+*/
+void QMqttLastWillProperties::setCorrelationData(const QByteArray &correlation)
+{
+ data->correlationData = correlation;
+}
+
+/*!
+ Sets the user properties to \a properties.
+*/
+void QMqttLastWillProperties::setUserProperties(const QMqttUserProperties &properties)
+{
+ data->userProperties = properties;
+}
+
+/*!
+ \internal
+*/
+QMqttConnectionProperties::QMqttConnectionProperties() : data(new QMqttConnectionPropertiesData)
+{
+
+}
+
+/*!
+ \internal
+*/
+QMqttConnectionProperties::QMqttConnectionProperties(const QMqttConnectionProperties &) = default;
+
+QMqttConnectionProperties &QMqttConnectionProperties::operator=(const QMqttConnectionProperties &rhs)
+{
+ if (this != &rhs)
+ data.operator=(rhs.data);
+ return *this;
+}
+
+QMqttConnectionProperties::~QMqttConnectionProperties() = default;
+
+/*!
+ Sets the session expiry interval to \a expiry. The session expiry interval
+ specifies the number of seconds a server holds information on the client
+ state after a connection has been closed.
+
+ The default value is 0, which specifies that the session is closed when
+ the network connection ends. If the value is specified as maximum of
+ quint32, then the session does not expire.
+*/
+void QMqttConnectionProperties::setSessionExpiryInterval(quint32 expiry)
+{
+ data->sessionExpiryInterval = expiry;
+}
+
+/*!
+ Sets the maximum QoS level the client is allowed to receive to \a qos.
+
+ A maximum receive value of 0 is not allowed.
+*/
+void QMqttConnectionProperties::setMaximumReceive(quint16 qos)
+{
+ if (qos == 0) {
+ qCDebug(lcMqttConnection) << "Maximum Receive is not allowed to be 0.";
+ return;
+ }
+ data->maximumReceive = qos;
+}
+
+/*!
+ Sets the maximum packet size to \a packetSize. The maximum packet size
+ specifies the maximum size one packet can contain. This includes the
+ packet header and its properties.
+
+ If no maximum packet size is specified, no limit is imposed beyond the
+ limitations of the protocol itself.
+*/
+void QMqttConnectionProperties::setMaximumPacketSize(quint32 packetSize)
+{
+ if (packetSize == 0) {
+ qCDebug(lcMqttConnection) << "Packet size is not allowed to be 0.";
+ return;
+ }
+ data->maximumPacketSize = packetSize;
+}
+
+/*!
+ Sets the maximum topic alias to \a alias. The maximum topic alias specifies
+ the highest value that the client will accept from the server. The client
+ uses this value to limit the number of topic aliases it is willing to hold
+ for the connection.
+
+ The default value is 0. 0 indicates that the client does not accept any
+ topic aliases on this connection.
+*/
+void QMqttConnectionProperties::setMaximumTopicAlias(quint16 alias)
+{
+ data->maximumTopicAlias = alias;
+}
+
+/*!
+ Sets the request response information to \a response. A client uses this
+ to request the server to return response information after the connection
+ request has been handled.
+
+ The default value is \c false, which indicates that the client must not
+ return any response information. If the value is \c true, the server
+ may return response information, but is not enforced to do so.
+*/
+void QMqttConnectionProperties::setRequestResponseInformation(bool response)
+{
+ data->requestResponseInformation = response;
+}
+
+/*!
+ Sets the request problem information to \a problem. A client uses this
+ to request the server to return additional information in case of failure.
+ Types of failure include connection and message management on the server
+ side.
+
+ The default value is \c false, which indicates that the client must not
+ receive any problem information for anything but connection management.
+ The server still may send problem information for connection handling.
+ If the value is \c true, the server may return problem information.
+
+ Problem information is available in user properties or reason strings
+ of the property classes.
+*/
+void QMqttConnectionProperties::setRequestProblemInformation(bool problem)
+{
+ data->requestProblemInformation = problem;
+}
+
+/*!
+ Sets the user properties of the connection to \a properties.
+
+ The default value is to not send any user information.
+*/
+void QMqttConnectionProperties::setUserProperties(const QMqttUserProperties &properties)
+{
+ data->userProperties = properties;
+}
+
+/*!
+ Sets the authentication method to \a authMethod.
+
+ \sa authenticationData()
+*/
+void QMqttConnectionProperties::setAuthenticationMethod(const QString &authMethod)
+{
+ data->authenticationMethod = authMethod;
+}
+
+/*!
+ Sets the authentication data to \a authData.
+
+ Authentication data can only be used if an authentication method has
+ been specified.
+
+ \sa authenticationMethod()
+*/
+void QMqttConnectionProperties::setAuthenticationData(const QByteArray &authData)
+{
+ data->authenticationData = authData;
+}
+
+/*!
+ Returns the session expiry interval.
+*/
+quint32 QMqttConnectionProperties::sessionExpiryInterval() const
+{
+ return data->sessionExpiryInterval;
+}
+
+/*!
+ Returns the maximum QoS level the client can receive.
+*/
+quint16 QMqttConnectionProperties::maximumReceive() const
+{
+ return data->maximumReceive;
+}
+
+/*!
+ Returns the maximum packet size the client can receive.
+*/
+quint32 QMqttConnectionProperties::maximumPacketSize() const
+{
+ return data->maximumPacketSize;
+}
+
+/*!
+ Returns the maximum topic alias ID the client can use.
+*/
+quint16 QMqttConnectionProperties::maximumTopicAlias() const
+{
+ return data->maximumTopicAlias;
+}
+
+/*!
+ Returns whether the client should receive response information.
+*/
+bool QMqttConnectionProperties::requestResponseInformation() const
+{
+ return data->requestResponseInformation;
+}
+
+/*!
+ Returns whether the client should receive problem information.
+*/
+bool QMqttConnectionProperties::requestProblemInformation() const
+{
+ return data->requestProblemInformation;
+}
+
+/*!
+ Returns the user properties for the connection.
+*/
+QMqttUserProperties QMqttConnectionProperties::userProperties() const
+{
+ return data->userProperties;
+}
+
+/*!
+ Returns the authentication method.
+*/
+QString QMqttConnectionProperties::authenticationMethod() const
+{
+ return data->authenticationMethod;
+}
+
+/*!
+ Returns the authentication data.
+*/
+QByteArray QMqttConnectionProperties::authenticationData() const
+{
+ return data->authenticationData;
+}
+
+/*!
+ \internal
+*/
+QMqttServerConnectionProperties::QMqttServerConnectionProperties()
+ : QMqttConnectionProperties()
+ , serverData(new QMqttServerConnectionPropertiesData)
+{
+
+}
+
+/*!
+ \internal
+*/
+QMqttServerConnectionProperties::QMqttServerConnectionProperties(const QMqttServerConnectionProperties &rhs)
+ : QMqttConnectionProperties(rhs)
+ , serverData(rhs.serverData)
+{
+
+}
+
+QMqttServerConnectionProperties &QMqttServerConnectionProperties::operator=(const QMqttServerConnectionProperties &rhs)
+{
+ if (this != &rhs) {
+ serverData.operator=(rhs.serverData);
+ QMqttConnectionProperties::operator=(rhs);
+ }
+ return *this;
+}
+
+QMqttServerConnectionProperties::~QMqttServerConnectionProperties() = default;
+
+/*!
+ Returns the available properties specified by the server.
+*/
+QMqttServerConnectionProperties::ServerPropertyDetails QMqttServerConnectionProperties::availableProperties() const
+{
+ return serverData->details;
+}
+
+/*!
+ Returns \c true if the server provided properties as part of the connection
+ aknowledgment. Returns \c false if no properties have been provided.
+*/
+bool QMqttServerConnectionProperties::isValid() const
+{
+ return serverData->valid;
+}
+
+/*!
+ Returns the maximum QoS level the server is able to understand.
+ The default value is 2.
+*/
+quint8 QMqttServerConnectionProperties::maximumQoS() const
+{
+ return serverData->maximumQoS;
+}
+
+/*!
+ Returns \c true if the server accepts retained messages.
+ The default value is \c true.
+*/
+bool QMqttServerConnectionProperties::retainAvailable() const
+{
+ return serverData->retainAvailable;
+}
+
+/*!
+ Returns \c true if the server assigned a new client identifier to
+ the client.
+
+ \sa QMqttClient::clientId()
+*/
+bool QMqttServerConnectionProperties::clientIdAssigned() const
+{
+ return serverData->details & QMqttServerConnectionProperties::AssignedClientId;
+}
+
+/*!
+ Returns the reason string associated with this response.
+*/
+QString QMqttServerConnectionProperties::reason() const
+{
+ return serverData->reasonString;
+}
+
+/*!
+ Returns the reason code associated with this response.
+*/
+QMqtt::ReasonCode QMqttServerConnectionProperties::reasonCode() const
+{
+ return serverData->reasonCode;
+}
+
+/*!
+ Returns \c true if the server accepts subscriptions including wildcards.
+ The default value is \c true.
+*/
+bool QMqttServerConnectionProperties::wildcardSupported() const
+{
+ return serverData->wildcardSupported;
+}
+
+/*!
+ Returns \c true if the server accepts subscription identifiers.
+ Subscription identifiers can be passed to the server when creating
+ a new subscription.
+
+ The default value is \c true.
+
+ \sa QMqttSubscriptionProperties::setSubscriptionIdentifier()
+*/
+bool QMqttServerConnectionProperties::subscriptionIdentifierSupported() const
+{
+ return serverData->subscriptionIdentifierSupported;
+}
+
+/*!
+ Returns \c true if the server accepts shared subscriptions.
+ The default value is \c true.
+*/
+bool QMqttServerConnectionProperties::sharedSubscriptionSupported() const
+{
+ return serverData->sharedSubscriptionSupported;
+}
+
+
+/*!
+ Returns the number of seconds the server requested as keep alive. This
+ overwrites the keep alive being set from the client side.
+
+ \sa QMqttClient::setKeepAlive()
+*/
+quint16 QMqttServerConnectionProperties::serverKeepAlive() const
+{
+ return serverData->serverKeepAlive;
+}
+
+/*!
+ Returns the response information.
+*/
+QString QMqttServerConnectionProperties::responseInformation() const
+{
+ return serverData->responseInformation;
+}
+
+/*!
+ Returns a server address which can be used by the client alternatively
+ to connect to. Typically, this is used together with the reason
+ code \c 0x9c (Use another server) or \c 0x9c (Server moved).
+*/
+QString QMqttServerConnectionProperties::serverReference() const
+{
+ return serverData->serverReference;
+}
+
+QT_END_NAMESPACE