From 861f5704ef1fe117a09ca6dd0c6beed72bb0e7f6 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Thu, 19 Jun 2014 23:30:54 +0200 Subject: [PATCH] properly store username in device parameters --- libguh/plugin/device.cpp | 12 +++++++ libguh/plugin/device.h | 1 + .../philipshue/devicepluginphilipshue.cpp | 34 ++++++++++++------- .../philipshue/devicepluginphilipshue.h | 6 ++-- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/libguh/plugin/device.cpp b/libguh/plugin/device.cpp index e5eff79e..08b746e3 100644 --- a/libguh/plugin/device.cpp +++ b/libguh/plugin/device.cpp @@ -111,6 +111,18 @@ QVariant Device::paramValue(const QString ¶mName) const return QVariant(); } +void Device::setParamValue(const QString ¶mName, const QVariant &value) +{ + QList params; + foreach (Param param, m_params) { + if (param.name() == paramName) { + param.setValue(value); + } + params.append(param); + } + m_params = params; +} + /*! Returns the states of this Device. It must match the \l{StateType} description in the associated \l{DeviceClass}. */ QList Device::states() const { diff --git a/libguh/plugin/device.h b/libguh/plugin/device.h index 956cf003..0b79679d 100644 --- a/libguh/plugin/device.h +++ b/libguh/plugin/device.h @@ -49,6 +49,7 @@ public: void setParams(const QList ¶ms); QVariant paramValue(const QString ¶mName) const; + void setParamValue(const QString ¶mName, const QVariant &value); QList states() const; bool hasState(const StateTypeId &stateTypeId) const; diff --git a/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp b/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp index 174b8ce1..fe7bdb71 100644 --- a/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp +++ b/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp @@ -69,6 +69,8 @@ QList DevicePluginPhilipsHue::supportedDevices() const QList paramTypes; ParamType ipParam("ip", QVariant::String); paramTypes.append(ipParam); + ParamType usernameParam("username", QVariant::String); + paramTypes.append(usernameParam); deviceClassHue.setParamTypes(paramTypes); QList hueStates; @@ -146,6 +148,12 @@ DeviceManager::DeviceError DevicePluginPhilipsHue::discoverDevices(const DeviceC return DeviceManager::DeviceErrorAsync; } +QPair DevicePluginPhilipsHue::setupDevice(Device *device) +{ + qDebug() << "setupDevice" << device->params(); + return reportDeviceSetup(); +} + QPair DevicePluginPhilipsHue::confirmPairing(const QUuid &pairingTransactionId, const DeviceClassId &deviceClassId, const QList ¶ms) { Param ipParam; @@ -157,12 +165,19 @@ QPair DevicePluginPhilipsHue::confirm if (!ipParam.isValid()) { return reportDeviceSetup(DeviceManager::DeviceSetupStatusFailure, "Missing parameter: ip"); } - - QString username = "guh-" + QUuid::createUuid().toString().remove(QRegExp("[\\{\\}]*")).remove(QRegExp("\\-[0-9a-f\\-]*")); + Param usernameParam; + foreach (const Param ¶m, params) { + if (param.name() == "username") { + usernameParam = param; + } + } + if (!usernameParam.isValid()) { + return reportDeviceSetup(DeviceManager::DeviceSetupStatusFailure, "Missing parameter: username"); + } QVariantMap createUserParams; createUserParams.insert("devicetype", "guh"); - createUserParams.insert("username", username); + createUserParams.insert("username", usernameParam.value().toString()); QJsonDocument jsonDoc = QJsonDocument::fromVariant(createUserParams); QByteArray data = jsonDoc.toJson(); @@ -171,8 +186,7 @@ QPair DevicePluginPhilipsHue::confirm QNetworkReply *reply = m_nam->post(request, data); connect(reply, &QNetworkReply::finished, this, &DevicePluginPhilipsHue::createUserFinished); - HueBridgeConnection *bridge = new HueBridgeConnection(QHostAddress(ipParam.value().toString()), username); - m_pairings.insert(reply, qMakePair(pairingTransactionId, bridge)); + m_pairings.insert(reply, pairingTransactionId); return reportDeviceSetup(DeviceManager::DeviceSetupStatusAsync); } @@ -202,6 +216,8 @@ void DevicePluginPhilipsHue::discoveryDone(const QList &bridges) QList params; Param param("ip", bridge.toString()); params.append(param); + Param userParam("username", "guh-" + QUuid::createUuid().toString().remove(QRegExp("[\\{\\}]*")).remove(QRegExp("\\-[0-9a-f\\-]*"))); + params.append(userParam); descriptor.setParams(params); deviceDescriptors.append(descriptor); } @@ -214,15 +230,12 @@ void DevicePluginPhilipsHue::createUserFinished() QNetworkReply *reply = static_cast(sender()); QByteArray data = reply->readAll(); - QPair pair = m_pairings.take(reply); - QUuid pairingTransactionId = pair.first; - HueBridgeConnection *bridge = pair.second; + QUuid pairingTransactionId = m_pairings.take(reply); QJsonParseError error; QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); if (error.error != QJsonParseError::NoError) { emit pairingFinished(pairingTransactionId, DeviceManager::DeviceSetupStatusFailure, "Pairing failed. Failed to parse response from Hue Bridge."); - delete bridge; return; } @@ -231,12 +244,9 @@ void DevicePluginPhilipsHue::createUserFinished() if (response.contains("error")) { qDebug() << "Failed to pair Hue bridge:" << response.value("error").toMap().value("description"); emit pairingFinished(pairingTransactionId, DeviceManager::DeviceSetupStatusFailure, "Pairing failed:" + response.value("error").toMap().value("description").toString()); - delete bridge; return; } emit pairingFinished(pairingTransactionId, DeviceManager::DeviceSetupStatusSuccess, QString()); - - m_bridges.append(bridge); qDebug() << "response" << response << data; } diff --git a/plugins/deviceplugins/philipshue/devicepluginphilipshue.h b/plugins/deviceplugins/philipshue/devicepluginphilipshue.h index bac9d0a0..07624f72 100644 --- a/plugins/deviceplugins/philipshue/devicepluginphilipshue.h +++ b/plugins/deviceplugins/philipshue/devicepluginphilipshue.h @@ -48,6 +48,8 @@ public: QList configurationDescription() const override; DeviceManager::DeviceError discoverDevices(const DeviceClassId &deviceClassId, const QVariantMap ¶ms) const override; + QPair setupDevice(Device *device) override; + QPair confirmPairing(const QUuid &pairingTransactionId, const DeviceClassId &deviceClassId, const QList ¶ms) override; public slots: @@ -63,9 +65,7 @@ private: Discovery *m_discovery; QNetworkAccessManager *m_nam; - QHash > m_pairings; - - QList m_bridges; + QHash m_pairings; }; #endif // DEVICEPLUGINBOBLIGHT_H