mirror of
https://github.com/qt/qtmqtt.git
synced 2026-10-25 16:16:26 +00:00
Replace raw m_transport pointer with std::shared_ptr
Preparing for the add websocket change request. Using shared_ptr gives automatic lifetime management and is needed when adding more transport types. Task-number: QTBUG-129171 Change-Id: I347175c018963130f403f8e9fe764e77203383a9 Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
This commit is contained in:
parent
aa2fb73ac4
commit
24f5eceea2
@ -342,7 +342,7 @@ QMqttClient::~QMqttClient()
|
||||
\l Disconnected state.
|
||||
|
||||
\note Setting a custom transport for a client does not pass over responsibility
|
||||
on connection management. The transport has to be opened for QIODevice based
|
||||
on connection management or ownership. The transport has to be opened for QIODevice based
|
||||
transports or connected for socket type transports before calling QMqttClient::connectToHost().
|
||||
*/
|
||||
void QMqttClient::setTransport(QIODevice *device, QMqttClient::TransportType transport)
|
||||
|
||||
@ -64,9 +64,7 @@ QMqttConnection::~QMqttConnection()
|
||||
{
|
||||
if (m_internalState == BrokerConnected)
|
||||
sendControlDisconnect();
|
||||
|
||||
if (m_ownTransport && m_transport)
|
||||
delete m_transport;
|
||||
m_transport = nullptr;
|
||||
}
|
||||
|
||||
void QMqttConnection::timerEvent(QTimerEvent *event)
|
||||
@ -83,37 +81,34 @@ void QMqttConnection::setTransport(QIODevice *device, QMqttClient::TransportType
|
||||
{
|
||||
qCDebug(lcMqttConnection) << Q_FUNC_INFO << device << " Type:" << transport;
|
||||
|
||||
if (m_transport) {
|
||||
disconnect(m_transport, &QIODevice::aboutToClose, this, &QMqttConnection::transportConnectionClosed);
|
||||
disconnect(m_transport, &QIODevice::readyRead, this, &QMqttConnection::transportReadyRead);
|
||||
if (m_ownTransport)
|
||||
delete m_transport;
|
||||
if (m_transport.get()) {
|
||||
disconnect(m_transport.get(), &QIODevice::aboutToClose, this, &QMqttConnection::transportConnectionClosed);
|
||||
disconnect(m_transport.get(), &QIODevice::readyRead, this, &QMqttConnection::transportReadyRead);
|
||||
}
|
||||
|
||||
m_transport = device;
|
||||
// We do not take ownership of the transport here, lifetime
|
||||
// management is done by calling code.
|
||||
m_transport = std::shared_ptr<QIODevice>(device, [](QIODevice *) { ; });
|
||||
m_transportType = transport;
|
||||
m_ownTransport = false;
|
||||
m_customTransport = true;
|
||||
|
||||
connect(m_transport, &QIODevice::aboutToClose, this, &QMqttConnection::transportConnectionClosed);
|
||||
connect(m_transport, &QIODevice::readyRead, this, &QMqttConnection::transportReadyRead);
|
||||
connect(m_transport.get(), &QIODevice::aboutToClose, this, &QMqttConnection::transportConnectionClosed);
|
||||
connect(m_transport.get(), &QIODevice::readyRead, this, &QMqttConnection::transportReadyRead);
|
||||
}
|
||||
|
||||
QIODevice *QMqttConnection::transport() const
|
||||
{
|
||||
return m_transport;
|
||||
return m_transport.get();
|
||||
}
|
||||
|
||||
bool QMqttConnection::ensureTransport(bool createSecureIfNeeded)
|
||||
{
|
||||
Q_UNUSED(createSecureIfNeeded); // QT_NO_SSL
|
||||
qCDebug(lcMqttConnection) << Q_FUNC_INFO << m_transport;
|
||||
qCDebug(lcMqttConnection) << Q_FUNC_INFO << m_transport.get();
|
||||
|
||||
if (m_transport) {
|
||||
if (m_ownTransport)
|
||||
delete m_transport;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
if (m_customTransport)
|
||||
return true; // transport set by setTransport
|
||||
m_transport = nullptr;
|
||||
|
||||
// We are asked to create a transport layer
|
||||
if (m_clientPrivate->m_hostname.isEmpty() || m_clientPrivate->m_port == 0) {
|
||||
@ -125,8 +120,7 @@ bool QMqttConnection::ensureTransport(bool createSecureIfNeeded)
|
||||
createSecureIfNeeded ? new QSslSocket() :
|
||||
#endif
|
||||
new QTcpSocket();
|
||||
m_transport = socket;
|
||||
m_ownTransport = true;
|
||||
m_transport = std::shared_ptr<QIODevice>(socket);
|
||||
m_transportType =
|
||||
#ifndef QT_NO_SSL
|
||||
createSecureIfNeeded ? QMqttClient::SecureSocket :
|
||||
@ -142,8 +136,8 @@ bool QMqttConnection::ensureTransport(bool createSecureIfNeeded)
|
||||
connect(socket, &QAbstractSocket::disconnected, this, &QMqttConnection::transportConnectionClosed);
|
||||
connect(socket, &QAbstractSocket::errorOccurred, this, &QMqttConnection::transportError);
|
||||
|
||||
connect(m_transport, &QIODevice::aboutToClose, this, &QMqttConnection::transportConnectionClosed);
|
||||
connect(m_transport, &QIODevice::readyRead, this, &QMqttConnection::transportReadyRead);
|
||||
connect(m_transport.get(), &QIODevice::aboutToClose, this, &QMqttConnection::transportConnectionClosed);
|
||||
connect(m_transport.get(), &QIODevice::readyRead, this, &QMqttConnection::transportReadyRead);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -164,7 +158,7 @@ bool QMqttConnection::ensureTransportOpen(const QString &sslPeerName)
|
||||
}
|
||||
|
||||
if (m_transportType == QMqttClient::AbstractSocket) {
|
||||
auto socket = qobject_cast<QTcpSocket *>(m_transport);
|
||||
auto socket = qobject_cast<QTcpSocket *>(m_transport.get());
|
||||
Q_ASSERT(socket);
|
||||
if (socket->state() == QAbstractSocket::ConnectedState)
|
||||
return sendControlConnect();
|
||||
@ -174,7 +168,7 @@ bool QMqttConnection::ensureTransportOpen(const QString &sslPeerName)
|
||||
}
|
||||
#ifndef QT_NO_SSL
|
||||
else if (m_transportType == QMqttClient::SecureSocket) {
|
||||
auto socket = qobject_cast<QSslSocket *>(m_transport);
|
||||
auto socket = qobject_cast<QSslSocket *>(m_transport.get());
|
||||
Q_ASSERT(socket);
|
||||
if (socket->state() == QAbstractSocket::ConnectedState)
|
||||
return sendControlConnect();
|
||||
|
||||
@ -26,6 +26,8 @@
|
||||
#include <QtCore/QSharedPointer>
|
||||
#include <QtCore/QtEndian>
|
||||
|
||||
#include <memory>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QMqttClientPrivate;
|
||||
@ -82,9 +84,9 @@ protected:
|
||||
void timerEvent(QTimerEvent *event) override;
|
||||
|
||||
public:
|
||||
QIODevice *m_transport{nullptr};
|
||||
std::shared_ptr<QIODevice> m_transport;
|
||||
QMqttClient::TransportType m_transportType{QMqttClient::IODevice};
|
||||
bool m_ownTransport{false};
|
||||
bool m_customTransport{false}; // connectTo* does not reset m_transport;
|
||||
QMqttClientPrivate *m_clientPrivate{nullptr};
|
||||
#ifndef QT_NO_SSL
|
||||
QSslConfiguration m_sslConfiguration;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user