From cf9d460bad338d6f4419936babe55f8e28ad1a60 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sat, 5 Apr 2014 01:55:56 +0200 Subject: [PATCH] implemented removeconfigureddevice --- libguh/devicemanager.cpp | 25 ++++++++++++++++++ libguh/devicemanager.h | 2 ++ libguh/deviceplugin.cpp | 10 +++++++ libguh/deviceplugin.h | 1 + .../deviceplugins/mock/devicepluginmock.cpp | 5 ++++ plugins/deviceplugins/mock/devicepluginmock.h | 1 + plugins/deviceplugins/mock/httpdaemon.cpp | 10 ------- plugins/deviceplugins/mock/httpdaemon.h | 4 --- server/jsonrpc/devicehandler.cpp | 26 +++++++++++++++++++ server/jsonrpc/devicehandler.h | 2 ++ tests/auto/testjsonrpc.cpp | 18 ++++++++++++- tests/scripts/removeconfigureddevice.sh | 7 +++++ 12 files changed, 96 insertions(+), 15 deletions(-) create mode 100755 tests/scripts/removeconfigureddevice.sh diff --git a/libguh/devicemanager.cpp b/libguh/devicemanager.cpp index 239696fb..e0d26ae8 100644 --- a/libguh/devicemanager.cpp +++ b/libguh/devicemanager.cpp @@ -168,6 +168,30 @@ DeviceManager::DeviceError DeviceManager::addConfiguredDevice(const QUuid &devic return DeviceErrorNoError; } +DeviceManager::DeviceError DeviceManager::removeConfiguredDevice(const QUuid &deviceId) +{ + Device *device = findConfiguredDevice(deviceId); + if (!device) { + return DeviceErrorDeviceNotFound; + } + + m_configuredDevices.removeAll(device); + m_devicePlugins.value(device->pluginId())->deviceRemoved(device); + + m_pluginTimerUsers.removeAll(device); + if (m_pluginTimerUsers.isEmpty()) { + m_pluginTimer.stop(); + } + + device->deleteLater(); + + QSettings settings; + settings.beginGroup(deviceId.toString()); + settings.remove(""); + + return DeviceErrorNoError; +} + /*! Returns the \l{Device} with the given \a id. Null if the id couldn't be found. */ Device *DeviceManager::findConfiguredDevice(const QUuid &id) const { @@ -354,6 +378,7 @@ bool DeviceManager::setupDevice(Device *device) // Additionally fire off one event to initialize stuff QTimer::singleShot(0, this, SLOT(timerEvent())); } + m_pluginTimerUsers.append(device); } if (!plugin->deviceCreated(device)) { diff --git a/libguh/devicemanager.h b/libguh/devicemanager.h index 87a3c9da..229043e1 100644 --- a/libguh/devicemanager.h +++ b/libguh/devicemanager.h @@ -61,6 +61,7 @@ public: QList configuredDevices() const; DeviceError addConfiguredDevice(const QUuid &deviceClassId, const QVariantMap ¶ms, const QUuid id = QUuid::createUuid()); + DeviceError removeConfiguredDevice(const QUuid &deviceId); Device* findConfiguredDevice(const QUuid &id) const; QList findConfiguredDevices(const QUuid &deviceClassId) const; @@ -97,6 +98,7 @@ private: // Hardware Resources Radio433* m_radio433; QTimer m_pluginTimer; + QList m_pluginTimerUsers; friend class DevicePlugin; }; diff --git a/libguh/deviceplugin.cpp b/libguh/deviceplugin.cpp index 958ad50e..c94b2c23 100644 --- a/libguh/deviceplugin.cpp +++ b/libguh/deviceplugin.cpp @@ -109,9 +109,19 @@ DevicePlugin::~DevicePlugin() */ bool DevicePlugin::deviceCreated(Device *device) { + Q_UNUSED(device) return true; } +/*! This will be called when a device removed. The plugin has the chance to do some teardown. + The device is still valid during this call, but already removed from the system. + The device will be deleted as soon as this method returns. +*/ +void DevicePlugin::deviceRemoved(Device *device) +{ + Q_UNUSED(device) +} + /*! This will be called when the DeviceManager initializes the plugin and set up the things behind the scenes. When implementing a new plugin, use \l{DevicePlugin::init()} instead in order to do initialisation work. */ void DevicePlugin::initPlugin(DeviceManager *deviceManager) diff --git a/libguh/deviceplugin.h b/libguh/deviceplugin.h index f551373f..6b133eff 100644 --- a/libguh/deviceplugin.h +++ b/libguh/deviceplugin.h @@ -45,6 +45,7 @@ public: virtual DeviceManager::HardwareResources requiredHardware() const = 0; virtual bool deviceCreated(Device *device); + virtual void deviceRemoved(Device *device); // Hardware input virtual void radioData(QList rawData) {Q_UNUSED(rawData)} diff --git a/plugins/deviceplugins/mock/devicepluginmock.cpp b/plugins/deviceplugins/mock/devicepluginmock.cpp index 145823f5..e21b6ab3 100644 --- a/plugins/deviceplugins/mock/devicepluginmock.cpp +++ b/plugins/deviceplugins/mock/devicepluginmock.cpp @@ -129,6 +129,11 @@ bool DevicePluginMock::deviceCreated(Device *device) return true; } +void DevicePluginMock::deviceRemoved(Device *device) +{ + m_daemons.take(device)->deleteLater(); +} + void DevicePluginMock::executeAction(Device *device, const Action &action) { qDebug() << "Should execute action" << action.actionTypeId(); diff --git a/plugins/deviceplugins/mock/devicepluginmock.h b/plugins/deviceplugins/mock/devicepluginmock.h index 40eff0b7..61457594 100644 --- a/plugins/deviceplugins/mock/devicepluginmock.h +++ b/plugins/deviceplugins/mock/devicepluginmock.h @@ -42,6 +42,7 @@ public: QUuid pluginId() const override; bool deviceCreated(Device *device) override; + void deviceRemoved(Device *device) override; public slots: void executeAction(Device *device, const Action &action) override; diff --git a/plugins/deviceplugins/mock/httpdaemon.cpp b/plugins/deviceplugins/mock/httpdaemon.cpp index f6508542..5a1c4720 100644 --- a/plugins/deviceplugins/mock/httpdaemon.cpp +++ b/plugins/deviceplugins/mock/httpdaemon.cpp @@ -35,16 +35,6 @@ void HttpDaemon::incomingConnection(qintptr socket) } -void HttpDaemon::pause() -{ - disabled = true; -} - -void HttpDaemon::resume() -{ - disabled = false; -} - void HttpDaemon::actionExecuted(const QUuid &actionTypeId) { m_actionList.append(qMakePair(actionTypeId, QDateTime::currentDateTime())); diff --git a/plugins/deviceplugins/mock/httpdaemon.h b/plugins/deviceplugins/mock/httpdaemon.h index 40a5b804..6dceee73 100644 --- a/plugins/deviceplugins/mock/httpdaemon.h +++ b/plugins/deviceplugins/mock/httpdaemon.h @@ -16,10 +16,6 @@ public: void incomingConnection(qintptr socket) override; - void pause(); - - void resume(); - void actionExecuted(const QUuid&actionTypeId); signals: diff --git a/server/jsonrpc/devicehandler.cpp b/server/jsonrpc/devicehandler.cpp index 394a863c..81d4c791 100644 --- a/server/jsonrpc/devicehandler.cpp +++ b/server/jsonrpc/devicehandler.cpp @@ -77,6 +77,14 @@ DeviceHandler::DeviceHandler(QObject *parent) : returns.insert("devices", devices); setReturns("GetConfiguredDevices", returns); + params.clear(); returns.clear(); + setDescription("RemoveConfiguredDevice", "Remove a device from the system."); + params.insert("deviceId", "uuid"); + setParams("RemoveConfiguredDevice", params); + returns.insert("success", "bool"); + returns.insert("errorMessage", "string"); + setReturns("RemoveConfiguredDevice", returns); + params.clear(); returns.clear(); setDescription("GetEventTypes", "Get event types for a specified deviceClassId."); params.insert("deviceClassId", "uuid"); @@ -209,6 +217,24 @@ QVariantMap DeviceHandler::GetConfiguredDevices(const QVariantMap ¶ms) const return returns; } +QVariantMap DeviceHandler::RemoveConfiguredDevice(const QVariantMap ¶ms) +{ + QVariantMap returns; + switch(GuhCore::instance()->deviceManager()->removeConfiguredDevice(params.value("deviceId").toUuid())) { + case DeviceManager::DeviceErrorNoError: + returns.insert("success", true); + returns.insert("errorMessage", ""); + return returns; + case DeviceManager::DeviceErrorDeviceNotFound: + returns.insert("success", false); + returns.insert("errorMessage", "No such device."); + return returns; + } + returns.insert("success", false); + returns.insert("errorMessage", "Unknown error."); + return returns; +} + QVariantMap DeviceHandler::GetEventTypes(const QVariantMap ¶ms) const { QVariantMap returns; diff --git a/server/jsonrpc/devicehandler.h b/server/jsonrpc/devicehandler.h index 9b7e07a2..c2813cd8 100644 --- a/server/jsonrpc/devicehandler.h +++ b/server/jsonrpc/devicehandler.h @@ -39,6 +39,8 @@ public: Q_INVOKABLE QVariantMap GetConfiguredDevices(const QVariantMap ¶ms) const; + Q_INVOKABLE QVariantMap RemoveConfiguredDevice(const QVariantMap ¶ms); + Q_INVOKABLE QVariantMap GetEventTypes(const QVariantMap ¶ms) const; Q_INVOKABLE QVariantMap GetActionTypes(const QVariantMap ¶ms) const; diff --git a/tests/auto/testjsonrpc.cpp b/tests/auto/testjsonrpc.cpp index f2d97f93..bdff050a 100644 --- a/tests/auto/testjsonrpc.cpp +++ b/tests/auto/testjsonrpc.cpp @@ -49,6 +49,7 @@ private slots: void stateChangeEmitsNotifications(); + void removeDevice(); private: QVariant injectAndWait(const QString &method, const QVariantMap ¶ms); @@ -239,10 +240,25 @@ void TestJSONRPC::stateChangeEmitsNotifications() params.insert("stateTypeId", stateTypeId); response = injectAndWait("Devices.GetStateValue", params); - qDebug() << "response" << response; QCOMPARE(response.toMap().value("params").toMap().value("value").toInt(), newVal); } +void TestJSONRPC::removeDevice() +{ + QVERIFY(!m_mockDeviceId.isNull()); + + QVariantMap params; + params.insert("deviceId", m_mockDeviceId); + + QVariant response = injectAndWait("Devices.RemoveConfiguredDevice", params); + + QCOMPARE(response.toMap().value("params").toMap().value("success").toBool(), true); + + // Make sure the device is gone from settings too + QSettings settings; + QCOMPARE(settings.allKeys().count(), 0); +} + QTEST_MAIN(TestJSONRPC) #include "testjsonrpc.moc" diff --git a/tests/scripts/removeconfigureddevice.sh b/tests/scripts/removeconfigureddevice.sh new file mode 100755 index 00000000..05caae18 --- /dev/null +++ b/tests/scripts/removeconfigureddevice.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +if [ -z $2 ]; then + echo "usage: $0 host deviceId" +else + (echo '{"id":1, "method":"Devices.RemoveConfiguredDevice", "params":{"deviceId":"'$2'"}}'; sleep 1) | nc $1 1234 +fi