| 1 | // Copyright (C) 2017 The Qt Company Ltd. |
| 2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only |
| 3 | |
| 4 | #include "qmqttsubscription.h" |
| 5 | #include "qmqttsubscription_p.h" |
| 6 | #include "qmqttclient.h" |
| 7 | |
| 8 | QT_BEGIN_NAMESPACE |
| 9 | |
| 10 | /*! |
| 11 | \class QMqttSubscription |
| 12 | |
| 13 | \inmodule QtMqtt |
| 14 | \brief The QMqttSubscription class receives notifications from an MQTT |
| 15 | broker about a specified topic. |
| 16 | */ |
| 17 | |
| 18 | /*! |
| 19 | \property QMqttSubscription::state |
| 20 | \brief This property holds the state of the subscription. |
| 21 | */ |
| 22 | |
| 23 | /*! |
| 24 | \property QMqttSubscription::qos |
| 25 | \brief This property holds the QoS level at which the subscription has been |
| 26 | made. |
| 27 | |
| 28 | The QoS level of the subscription specifies the \e maximum QoS level at |
| 29 | which the client will receive messages. The publisher can still send |
| 30 | messages at a lower level. |
| 31 | */ |
| 32 | |
| 33 | /*! |
| 34 | \property QMqttSubscription::topic |
| 35 | \brief This property holds the topic of the subscription. |
| 36 | */ |
| 37 | |
| 38 | /*! |
| 39 | \enum QMqttSubscription::SubscriptionState |
| 40 | |
| 41 | This enum type describes the states a subscription can have. |
| 42 | |
| 43 | \value Unsubscribed |
| 44 | The topic has been unsubscribed from. |
| 45 | \value SubscriptionPending |
| 46 | A request for a subscription has been sent, but is has not been |
| 47 | confirmed by the broker yet. |
| 48 | \value Subscribed |
| 49 | The subscription was successful and messages will be received. |
| 50 | \value UnsubscriptionPending |
| 51 | A request to unsubscribe from a topic has been sent, but it has not |
| 52 | been confirmed by the broker yet. |
| 53 | \value Error |
| 54 | An error occured. |
| 55 | */ |
| 56 | |
| 57 | /*! |
| 58 | \fn QMqttSubscription::messageReceived(QMqttMessage msg) |
| 59 | |
| 60 | This signal is emitted when the new message \a msg has been received. |
| 61 | */ |
| 62 | |
| 63 | /*! |
| 64 | \property QMqttSubscription::reason |
| 65 | \since 5.12 |
| 66 | \brief This property holds the reason string for the subscription. |
| 67 | |
| 68 | A reason string is used by the server to provide additional information |
| 69 | about the subscription. It is optional for the server to send it. |
| 70 | */ |
| 71 | |
| 72 | /*! |
| 73 | \property QMqttSubscription::reasonCode |
| 74 | \since 5.12 |
| 75 | \brief This property holds the reason code for the subscription. |
| 76 | |
| 77 | The reason code specifies the error type if a subscription has failed, |
| 78 | or the level of QoS for success. |
| 79 | */ |
| 80 | |
| 81 | /*! |
| 82 | \property QMqttSubscription::sharedSubscription |
| 83 | \since 5.12 |
| 84 | \brief This property holds whether the subscription is shared. |
| 85 | */ |
| 86 | |
| 87 | /*! |
| 88 | \property QMqttSubscription::sharedSubscriptionName |
| 89 | \since 5.12 |
| 90 | \brief This property holds the name of the shared subscription. |
| 91 | */ |
| 92 | |
| 93 | QMqttSubscription::QMqttSubscription(QObject *parent) : QObject(*(new QMqttSubscriptionPrivate), parent) |
| 94 | { |
| 95 | |
| 96 | } |
| 97 | |
| 98 | /*! |
| 99 | Deletes a subscription. If the \l topic was not already unsubscribed from, |
| 100 | it will be unsubscribed from automatically. |
| 101 | */ |
| 102 | QMqttSubscription::~QMqttSubscription() |
| 103 | { |
| 104 | Q_D(const QMqttSubscription); |
| 105 | if (d->m_state == Subscribed) |
| 106 | unsubscribe(); |
| 107 | } |
| 108 | |
| 109 | QMqttSubscription::SubscriptionState QMqttSubscription::state() const |
| 110 | { |
| 111 | Q_D(const QMqttSubscription); |
| 112 | return d->m_state; |
| 113 | } |
| 114 | |
| 115 | QMqttTopicFilter QMqttSubscription::topic() const |
| 116 | { |
| 117 | Q_D(const QMqttSubscription); |
| 118 | return d->m_topic; |
| 119 | } |
| 120 | |
| 121 | quint8 QMqttSubscription::qos() const |
| 122 | { |
| 123 | Q_D(const QMqttSubscription); |
| 124 | return d->m_qos; |
| 125 | } |
| 126 | |
| 127 | QString QMqttSubscription::reason() const |
| 128 | { |
| 129 | Q_D(const QMqttSubscription); |
| 130 | return d->m_reasonString; |
| 131 | } |
| 132 | |
| 133 | QMqtt::ReasonCode QMqttSubscription::reasonCode() const |
| 134 | { |
| 135 | Q_D(const QMqttSubscription); |
| 136 | return d->m_reasonCode; |
| 137 | } |
| 138 | |
| 139 | /*! |
| 140 | \since 5.12 |
| 141 | |
| 142 | Returns the user properties received from the broker when the subscription |
| 143 | has been accepted. |
| 144 | |
| 145 | \note This function will only provide valid data when the client |
| 146 | specifies QMqttClient::MQTT_5_0 as QMqttClient::ProtocolVersion. |
| 147 | */ |
| 148 | QMqttUserProperties QMqttSubscription::userProperties() const |
| 149 | { |
| 150 | Q_D(const QMqttSubscription); |
| 151 | return d->m_userProperties; |
| 152 | } |
| 153 | |
| 154 | bool QMqttSubscription::isSharedSubscription() const |
| 155 | { |
| 156 | Q_D(const QMqttSubscription); |
| 157 | return d->m_shared; |
| 158 | } |
| 159 | |
| 160 | QString QMqttSubscription::sharedSubscriptionName() const |
| 161 | { |
| 162 | Q_D(const QMqttSubscription); |
| 163 | return d->m_sharedSubscriptionName; |
| 164 | } |
| 165 | |
| 166 | void QMqttSubscription::setState(QMqttSubscription::SubscriptionState state) |
| 167 | { |
| 168 | Q_D(QMqttSubscription); |
| 169 | if (d->m_state == state) |
| 170 | return; |
| 171 | |
| 172 | d->m_state = state; |
| 173 | emit stateChanged(state: d->m_state); |
| 174 | } |
| 175 | |
| 176 | /*! |
| 177 | Unsubscribes from \l topic. |
| 178 | |
| 179 | \note This might affect all shared pointer instances returned by |
| 180 | \l QMqttClient::subscribe(). |
| 181 | */ |
| 182 | void QMqttSubscription::unsubscribe() |
| 183 | { |
| 184 | Q_D(QMqttSubscription); |
| 185 | d->m_client->unsubscribe(topic: d->m_topic); |
| 186 | } |
| 187 | |
| 188 | void QMqttSubscription::setTopic(const QMqttTopicFilter &topic) |
| 189 | { |
| 190 | Q_D(QMqttSubscription); |
| 191 | d->m_topic = topic; |
| 192 | } |
| 193 | |
| 194 | void QMqttSubscription::setClient(QMqttClient *client) |
| 195 | { |
| 196 | Q_D(QMqttSubscription); |
| 197 | d->m_client = client; |
| 198 | } |
| 199 | |
| 200 | void QMqttSubscription::setQos(quint8 qos) |
| 201 | { |
| 202 | Q_D(QMqttSubscription); |
| 203 | d->m_qos = qos; |
| 204 | } |
| 205 | |
| 206 | void QMqttSubscription::setSharedSubscription(bool s) |
| 207 | { |
| 208 | Q_D(QMqttSubscription); |
| 209 | d->m_shared = s; |
| 210 | } |
| 211 | |
| 212 | void QMqttSubscription::setSharedSubscriptionName(const QString &name) |
| 213 | { |
| 214 | Q_D(QMqttSubscription); |
| 215 | d->m_sharedSubscriptionName = name; |
| 216 | } |
| 217 | |
| 218 | QMqttSubscriptionPrivate::QMqttSubscriptionPrivate() |
| 219 | : QObjectPrivate() |
| 220 | { |
| 221 | |
| 222 | } |
| 223 | |
| 224 | QT_END_NAMESPACE |
| 225 | |