From 0ba03ab8bb55e9c62e933e2731a9e477fe474fb5 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 24 Aug 2021 16:37:01 +0200 Subject: [PATCH] Add api to handle discovery errors better --- libnymea-app/thingdiscovery.cpp | 29 ++++++++++++++++++++--------- libnymea-app/thingdiscovery.h | 14 +++++++------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/libnymea-app/thingdiscovery.cpp b/libnymea-app/thingdiscovery.cpp index 50ddc839..0affa5e8 100644 --- a/libnymea-app/thingdiscovery.cpp +++ b/libnymea-app/thingdiscovery.cpp @@ -32,6 +32,7 @@ #include "engine.h" +#include #include Q_DECLARE_LOGGING_CATEGORY(dcThingManager) @@ -73,7 +74,7 @@ QHash ThingDiscovery::roleNames() const return roles; } -void ThingDiscovery::discoverThings(const QUuid &thingClassId, const QVariantList &discoveryParams) +int ThingDiscovery::discoverThings(const QUuid &thingClassId, const QVariantList &discoveryParams) { beginResetModel(); m_foundThings.clear(); @@ -82,32 +83,35 @@ void ThingDiscovery::discoverThings(const QUuid &thingClassId, const QVariantLis if (!m_engine) { qCWarning(dcThingManager()) << "Cannot discover things. No Engine set"; - return; + return -1; } if (!m_engine->jsonRpcClient()->connected()) { qCWarning(dcThingManager()) << "Cannot discover things. Not connected."; - return; + return -1; } - discoverThingsInternal(thingClassId, discoveryParams); + int commandId = discoverThingsInternal(thingClassId, discoveryParams); m_displayMessage.clear(); emit busyChanged(); + return commandId; } -void ThingDiscovery::discoverThingsByInterface(const QString &interfaceName) +QList ThingDiscovery::discoverThingsByInterface(const QString &interfaceName) { beginResetModel(); m_foundThings.clear(); endResetModel(); emit countChanged(); + QList pendingCommands; + if (!m_engine) { qCWarning(dcThingManager()) << "Cannot discover things. No Engine set"; - return; + return pendingCommands; } if (!m_engine->jsonRpcClient()->connected()) { qCWarning(dcThingManager()) << "Cannot discover things. Not connected."; - return; + return pendingCommands; } for (int i = 0; i < m_engine->thingManager()->thingClasses()->rowCount(); i++) { @@ -115,11 +119,12 @@ void ThingDiscovery::discoverThingsByInterface(const QString &interfaceName) if (!thingClass->interfaces().contains(interfaceName)) { continue; } - discoverThingsInternal(thingClass->id()); + pendingCommands.append(discoverThingsInternal(thingClass->id())); } m_displayMessage.clear(); emit busyChanged(); + return pendingCommands; } ThingDescriptor *ThingDiscovery::get(int index) const @@ -153,7 +158,7 @@ QString ThingDiscovery::displayMessage() const return m_displayMessage; } -void ThingDiscovery::discoverThingsInternal(const QUuid &thingClassId, const QVariantList &discoveryParams) +int ThingDiscovery::discoverThingsInternal(const QUuid &thingClassId, const QVariantList &discoveryParams) { qCDebug(dcThingManager()) << "Starting thing discovery for thing class" << m_engine->thingManager()->thingClasses()->getThingClass(thingClassId)->name() << thingClassId; QVariantMap params; @@ -163,6 +168,7 @@ void ThingDiscovery::discoverThingsInternal(const QUuid &thingClassId, const QVa } int commandId = m_engine->jsonRpcClient()->sendCommand("Integrations.DiscoverThings", params, this, "discoverThingsResponse"); m_pendingRequests.append(commandId); + return commandId; } void ThingDiscovery::discoverThingsResponse(int commandId, const QVariantMap ¶ms) @@ -199,6 +205,11 @@ void ThingDiscovery::discoverThingsResponse(int commandId, const QVariantMap &pa // Note: in case of multiple discoveries we'll just overwrite the message... Not ideal but multiple error messages from different plugins // wouldn't be of much use to the user anyways. m_displayMessage = params.value("displayMessage").toString(); + + QMetaEnum metaEnum = QMetaEnum::fromType(); + Thing::ThingError thingError = static_cast(metaEnum.keyToValue(params.value("thingError").toByteArray())); + emit discoverThingsReply(commandId, thingError, m_displayMessage); + m_pendingRequests.removeAll(commandId); if (m_pendingRequests.isEmpty()) { emit busyChanged(); diff --git a/libnymea-app/thingdiscovery.h b/libnymea-app/thingdiscovery.h index fa918fea..cbf395ee 100644 --- a/libnymea-app/thingdiscovery.h +++ b/libnymea-app/thingdiscovery.h @@ -85,8 +85,8 @@ public: QHash roleNames() const override; - Q_INVOKABLE void discoverThings(const QUuid &thingClassId, const QVariantList &discoveryParams = {}); - Q_INVOKABLE void discoverThingsByInterface(const QString &interfaceName); + Q_INVOKABLE int discoverThings(const QUuid &thingClassId, const QVariantList &discoveryParams = {}); + Q_INVOKABLE QList discoverThingsByInterface(const QString &interfaceName); Q_INVOKABLE ThingDescriptor* get(int index) const; @@ -96,15 +96,15 @@ public: bool busy() const; QString displayMessage() const; -private slots: - void discoverThingsInternal(const QUuid &thingClassId, const QVariantList &discoveryParams = {}); - - void discoverThingsResponse(int commandId, const QVariantMap ¶ms); - signals: void busyChanged(); void countChanged(); void engineChanged(); + void discoverThingsReply(int commandId, Thing::ThingError thingError, const QString &displayMessage); + +private slots: + int discoverThingsInternal(const QUuid &thingClassId, const QVariantList &discoveryParams = {}); + void discoverThingsResponse(int commandId, const QVariantMap ¶ms); private: Engine *m_engine = nullptr;