From 4b7e6a0ddbb6e9bcf6f5f366e9212967048445b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Thu, 19 Nov 2020 11:11:25 +0100 Subject: [PATCH] Return error if zigbee network is not online yet and fix crash if reply is already finished before getting a response --- libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp | 4 ++-- libnymea-zigbee/backends/nxp/zigbeenetworknxp.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp index 6462663..e6faa5b 100644 --- a/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp +++ b/libnymea-zigbee/backends/deconz/zigbeenetworkdeconz.cpp @@ -72,13 +72,13 @@ ZigbeeNetworkReply *ZigbeeNetworkDeconz::sendRequest(const ZigbeeNetworkRequest }); // Finish the reply right the way if the network is offline - if (!m_controller->available()) { + if (!m_controller->available() || state() != ZigbeeNetwork::StateRunning) { finishNetworkReply(reply, ZigbeeNetworkReply::ErrorNetworkOffline); return reply; } ZigbeeInterfaceDeconzReply *interfaceReply = m_controller->requestSendRequest(request); - connect(interfaceReply, &ZigbeeInterfaceDeconzReply::finished, this, [this, reply, interfaceReply](){ + connect(interfaceReply, &ZigbeeInterfaceDeconzReply::finished, reply, [this, reply, interfaceReply](){ if (interfaceReply->statusCode() != Deconz::StatusCodeSuccess) { qCWarning(dcZigbeeController()) << "Could send request to controller. SQN:" << interfaceReply->sequenceNumber() << interfaceReply->statusCode(); finishNetworkReply(reply, ZigbeeNetworkReply::ErrorInterfaceError); diff --git a/libnymea-zigbee/backends/nxp/zigbeenetworknxp.cpp b/libnymea-zigbee/backends/nxp/zigbeenetworknxp.cpp index 270363f..c711af3 100644 --- a/libnymea-zigbee/backends/nxp/zigbeenetworknxp.cpp +++ b/libnymea-zigbee/backends/nxp/zigbeenetworknxp.cpp @@ -81,13 +81,13 @@ ZigbeeNetworkReply *ZigbeeNetworkNxp::sendRequest(const ZigbeeNetworkRequest &re }); // Finish the reply right the way if the network is offline - if (!m_controller->available()) { + if (!m_controller->available() || state() != ZigbeeNetwork::StateRunning) { finishNetworkReply(reply, ZigbeeNetworkReply::ErrorNetworkOffline); return reply; } ZigbeeInterfaceNxpReply *interfaceReply = m_controller->requestSendRequest(request); - connect(interfaceReply, &ZigbeeInterfaceNxpReply::finished, this, [this, reply, interfaceReply](){ + connect(interfaceReply, &ZigbeeInterfaceNxpReply::finished, reply, [this, reply, interfaceReply](){ if (interfaceReply->status() != Nxp::StatusSuccess) { qCWarning(dcZigbeeController()) << "Could send request to controller. SQN:" << interfaceReply->sequenceNumber() << interfaceReply->status(); finishNetworkReply(reply, ZigbeeNetworkReply::ErrorInterfaceError); @@ -102,7 +102,7 @@ ZigbeeNetworkReply *ZigbeeNetworkNxp::sendRequest(const ZigbeeNetworkRequest &re } quint8 networkRequestId = interfaceReply->responseData().at(0); - qCDebug(dcZigbeeNetwork()) << "Request has network SQN" << networkRequestId; + //qCDebug(dcZigbeeNetwork()) << "Request has network SQN" << networkRequestId; reply->request().setRequestId(networkRequestId); m_pendingReplies.insert(networkRequestId, reply);