diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2019-02-04 16:41:44 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2019-02-05 22:12:32 +0000 |
commit | b722c69cb1199c022cfe99adcf5b072b93faeddd (patch) | |
tree | bf7e8012a3d4fbac25a39660b24bf56af9f9168b | |
parent | a4b51aacb04119dc95e31eb14009bbcadc52618b (diff) |
Rename and merge merge duplicated code into setup function
Change-Id: If13f39ff5efe0db5c4b06823e69320f40b25e317
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
-rw-r--r-- | src/knx/netip/qknxnetipendpointconnection.cpp | 165 | ||||
-rw-r--r-- | src/knx/netip/qknxnetipendpointconnection_p.h | 10 |
2 files changed, 67 insertions, 108 deletions
diff --git a/src/knx/netip/qknxnetipendpointconnection.cpp b/src/knx/netip/qknxnetipendpointconnection.cpp index 36f60e8..5f37390 100644 --- a/src/knx/netip/qknxnetipendpointconnection.cpp +++ b/src/knx/netip/qknxnetipendpointconnection.cpp @@ -498,9 +498,35 @@ QKnxNetIp::ServiceType return serviceType; } -void QKnxNetIpEndpointConnectionPrivate::setup() +bool QKnxNetIpEndpointConnectionPrivate::initConnection(const QHostAddress &a, quint16 p, + QKnxNetIp::HostProtocol hp) { - setupTimer(); + if (!QKnxNetIp::isStructType(hp)) + return false; + + if (m_state != QKnxNetIpEndpointConnection::State::Disconnected) + return false; + + auto isIPv4 = false; + a.toIPv4Address(&isIPv4); + if (!isIPv4) { + setAndEmitErrorOccurred(QKnxNetIpEndpointConnection::Error::NotIPv4, + QKnxNetIpEndpointConnection::tr("Only IPv4 addresses as remote control endpoint " + "supported.")); + return false; + } + m_remoteControlEndpoint = { a, p, hp }; + + isIPv4 = false; + m_user.address.toIPv4Address(&isIPv4); + if (!isIPv4) { + setAndEmitErrorOccurred(QKnxNetIpEndpointConnection::Error::NotIPv4, + QKnxNetIpEndpointConnection::tr("Only IPv4 addresses as local control endpoint " + "supported.")); + return false; + } + + setAndEmitStateChanged(QKnxNetIpEndpointConnection::State::Starting); m_channelId = -1; @@ -518,9 +544,21 @@ void QKnxNetIpEndpointConnectionPrivate::setup() m_errorString = QString(); m_error = QKnxNetIpEndpointConnection::Error::None; + m_natEndpoint.hostProtocol = hp; + m_remoteDataEndpoint.hostProtocol = hp; + + m_sessionId = 0; + m_sequenceNumber = 0; + m_waitForAuthentication = false; + + setupTimer(); + + QKnxPrivate::clearSocket(&m_tcpSocket); + QKnxPrivate::clearSocket(&m_udpSocket); + QAbstractSocket *socket = nullptr; - if (m_tcpSocket) { - socket = m_tcpSocket; + if (hp == QKnxNetIp::HostProtocol::TCP_IPv4) { + socket = m_tcpSocket = new QTcpSocket(q_func());; QObject::connect(m_tcpSocket, &QTcpSocket::readyRead, [&]() { if (m_tcpSocket->bytesAvailable() < QKnxNetIpFrameHeader::HeaderSize10) return; @@ -535,8 +573,8 @@ void QKnxNetIpEndpointConnectionPrivate::setup() m_rxBuffer.remove(0, header.totalSize()); processReceivedFrame(frame); }); - } else if (m_udpSocket) { - socket = m_udpSocket; + } else if (hp == QKnxNetIp::HostProtocol::UDP_IPv4) { + socket = m_udpSocket = new QUdpSocket(q_func()); QObject::connect(m_udpSocket, &QUdpSocket::readyRead, [&]() { while (m_udpSocket && m_udpSocket->state() == QUdpSocket::BoundState && m_udpSocket->hasPendingDatagrams()) { @@ -555,6 +593,8 @@ void QKnxNetIpEndpointConnectionPrivate::setup() } } }); + } else { + return false; } if (socket) { @@ -565,7 +605,12 @@ void QKnxNetIpEndpointConnectionPrivate::setup() Q_Q(QKnxNetIpEndpointConnection); q->disconnectFromHost(); }); + } else { + return false; } + + setAndEmitStateChanged(QKnxNetIpEndpointConnection::State::Connecting); + return true; } void QKnxNetIpEndpointConnectionPrivate::cleanup() @@ -1158,37 +1203,14 @@ void QKnxNetIpEndpointConnection::connectToHost(const QKnxNetIpHpai &controlEndp } /*! - Establishes a connection to the host with \a address and \a port. + Establishes a connection to the host with \a address and \a port via UDP. */ void QKnxNetIpEndpointConnection::connectToHost(const QHostAddress &address, quint16 port) { Q_D(QKnxNetIpEndpointConnection); - if (d->m_state != State::Disconnected) - return; - - auto isIPv4 = false; - address.toIPv4Address(&isIPv4); - if (!isIPv4) { - d->setAndEmitErrorOccurred(Error::NotIPv4, tr("Only IPv4 addresses as remote control " - "endpoint supported.")); - return; - } - d->m_remoteControlEndpoint = { address, port }; - - isIPv4 = false; - d->m_user.address.toIPv4Address(&isIPv4); - if (!isIPv4) { - d->setAndEmitErrorOccurred(Error::NotIPv4, tr("Only IPv4 addresses as local control " - "endpoint supported.")); + if (!d->initConnection(address, port, QKnxNetIp::HostProtocol::UDP_IPv4)) return; - } - - d->setAndEmitStateChanged(QKnxNetIpEndpointConnection::State::Starting); - - QKnxPrivate::clearSocket(&(d->m_udpSocket)); - d->m_udpSocket = new QUdpSocket(this); - d->setup(); if (!d->m_udpSocket->bind(d->m_user.address, d->m_user.port)) return; @@ -1218,52 +1240,20 @@ void QKnxNetIpEndpointConnection::connectToHost(const QHostAddress &address, qui void QKnxNetIpEndpointConnection::connectToHost(const QHostAddress &address, quint16 port, QKnxNetIp::HostProtocol protocol) { - if (!QKnxNetIp::isStructType(protocol)) - return; + if (protocol == QKnxNetIp::HostProtocol::UDP_IPv4) + return connectToHost(address, port); - if (protocol == QKnxNetIp::HostProtocol::UDP_IPv4) { - connectToHost(address, port); - return; - } - - // establishing TCP connection Q_D(QKnxNetIpEndpointConnection); - if (d->m_state != State::Disconnected) + if (!d->initConnection(address, port, protocol)) return; - auto isIPv4 = false; - address.toIPv4Address(&isIPv4); - if (!isIPv4) { - d->setAndEmitErrorOccurred(Error::NotIPv4, tr("Only IPv4 addresses as remote control " - "endpoint supported.")); - return; - } - d->m_remoteControlEndpoint = { address, port, QKnxNetIp::HostProtocol::TCP_IPv4 }; - - isIPv4 = false; - d->m_user.address.toIPv4Address(&isIPv4); - if (!isIPv4) { - d->setAndEmitErrorOccurred(Error::NotIPv4, tr("Only IPv4 addresses as local control " - "endpoint supported.")); - return; - } - - d->setAndEmitStateChanged(QKnxNetIpEndpointConnection::State::Starting); - - QKnxPrivate::clearSocket(&(d->m_tcpSocket)); - d->m_tcpSocket = new QTcpSocket(this); - d->setup(); - - d->setAndEmitStateChanged(QKnxNetIpEndpointConnection::State::Connecting); d->m_tcpSocket->connectToHost(address, port); - d->m_localEndpoint = { d->m_tcpSocket->localAddress(), d->m_tcpSocket->localPort(), - QKnxNetIp::HostProtocol::TCP_IPv4 }; - d->m_natEndpoint.code = QKnxNetIp::HostProtocol::TCP_IPv4; - d->m_remoteDataEndpoint.code = QKnxNetIp::HostProtocol::TCP_IPv4; - connect(d->m_tcpSocket, &QTcpSocket::connected, this, [&]() { Q_D(QKnxNetIpEndpointConnection); + d->m_localEndpoint = { d->m_tcpSocket->localAddress(), d->m_tcpSocket->localPort(), + QKnxNetIp::HostProtocol::TCP_IPv4 }; + auto request = QKnxNetIpConnectRequestProxy::builder() .setControlEndpoint(d->m_nat ? d->m_natEndpoint : d->m_localEndpoint) .setDataEndpoint(d->m_nat ? d->m_natEndpoint : d->m_localEndpoint) @@ -1354,7 +1344,7 @@ void QKnxNetIpEndpointConnection::connectToHostEncrypted(const QKnxNetIpHpai &co void QKnxNetIpEndpointConnection::connectToHostEncrypted(const QHostAddress &address, quint16 port) { Q_D(QKnxNetIpEndpointConnection); - if (d->m_state != State::Disconnected) + if (!d->initConnection(address, port, QKnxNetIp::HostProtocol::TCP_IPv4)) return; if (!d->m_secureConfig.isValid()) @@ -1363,43 +1353,12 @@ void QKnxNetIpEndpointConnection::connectToHostEncrypted(const QHostAddress &add if (d->m_serialNumber.size() != 6) return d->setAndEmitErrorOccurred(Error::SerialNumber, tr("Invalid device serial number.")); - auto isIPv4 = false; - address.toIPv4Address(&isIPv4); - if (!isIPv4) { - d->setAndEmitErrorOccurred(Error::NotIPv4, tr("Only IPv4 addresses as remote control " - "endpoint supported.")); - return; - } - d->m_remoteControlEndpoint = { address, port, QKnxNetIp::HostProtocol::TCP_IPv4 }; - - isIPv4 = false; - d->m_user.address.toIPv4Address(&isIPv4); - if (!isIPv4) { - d->setAndEmitErrorOccurred(Error::NotIPv4, tr("Only IPv4 addresses as local control " - "endpoint supported.")); - return; - } - - d->setAndEmitStateChanged(QKnxNetIpEndpointConnection::State::Starting); - - QKnxPrivate::clearSocket(&(d->m_tcpSocket)); - d->m_tcpSocket = new QTcpSocket(this); - d->setup(); - - d->m_sessionId = 0; - d->m_sequenceNumber = 0; - d->m_waitForAuthentication = false; - - d->setAndEmitStateChanged(QKnxNetIpEndpointConnection::State::Connecting); d->m_tcpSocket->connectToHost(address, port); - d->m_localEndpoint = Endpoint(d->m_tcpSocket->localAddress(), - d->m_tcpSocket->localPort(), QKnxNetIp::HostProtocol::TCP_IPv4); - d->m_natEndpoint.code = QKnxNetIp::HostProtocol::TCP_IPv4; - d->m_remoteDataEndpoint.code = QKnxNetIp::HostProtocol::TCP_IPv4; - connect(d->m_tcpSocket, &QTcpSocket::connected, this, [&]() { Q_D(QKnxNetIpEndpointConnection); + d->m_localEndpoint = Endpoint(d->m_tcpSocket->localAddress(), + d->m_tcpSocket->localPort(), QKnxNetIp::HostProtocol::TCP_IPv4); auto request = QKnxNetIpSessionRequestProxy::builder() .setControlEndpoint(d->m_nat ? d->m_natEndpoint : d->m_localEndpoint) diff --git a/src/knx/netip/qknxnetipendpointconnection_p.h b/src/knx/netip/qknxnetipendpointconnection_p.h index 13873ca..71922ba 100644 --- a/src/knx/netip/qknxnetipendpointconnection_p.h +++ b/src/knx/netip/qknxnetipendpointconnection_p.h @@ -85,7 +85,7 @@ struct Endpoint final Endpoint(const QHostAddress &addr, quint16 p, QKnxNetIp::HostProtocol c) : address(addr) , port(p) - , code(c) + , hostProtocol(c) {} explicit Endpoint(const QKnxNetIpHpaiProxy &hpai) : address(hpai.hostAddress()) @@ -98,7 +98,7 @@ struct Endpoint final Endpoint &operator=(const QKnxNetIpHpai &s) { const QKnxNetIpHpaiProxy hpai(s); - code = hpai.hostProtocol(); address = hpai.hostAddress(); port = hpai.port(); + hostProtocol = hpai.hostProtocol(); address = hpai.hostAddress(); port = hpai.port(); return *this; } operator QKnxNetIpHpai() const @@ -106,13 +106,13 @@ struct Endpoint final return QKnxNetIpHpaiProxy::builder() .setHostAddress(address) .setPort(port) - .setHostProtocol(code) + .setHostProtocol(hostProtocol) .create(); } QHostAddress address { QHostAddress::LocalHost }; quint16 port { 0 }; - QKnxNetIp::HostProtocol code { QKnxNetIp::HostProtocol::UDP_IPv4 }; + QKnxNetIp::HostProtocol hostProtocol { QKnxNetIp::HostProtocol::UDP_IPv4 }; }; class Q_KNX_EXPORT QKnxNetIpEndpointConnectionPrivate : public QObjectPrivate @@ -129,8 +129,8 @@ public: {} ~QKnxNetIpEndpointConnectionPrivate() override = default; - void setup(); void setupTimer(); + bool initConnection(const QHostAddress &address, quint16 port, QKnxNetIp::HostProtocol hp); void cleanup(); bool sendCemiRequest(); |