From ee41ef5cfaed7bc6fdc364dc2aa69de92a55f3bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Wed, 10 Jun 2015 14:37:34 +0200 Subject: [PATCH] add displayPin setupMethod --- libguh/devicemanager.cpp | 15 ++++-- libguh/plugin/deviceplugin.cpp | 13 ++++- libguh/plugin/deviceplugin.h | 3 +- .../lgsmarttv/devicepluginlgsmarttv.cpp | 48 ++++++++++++++++--- .../lgsmarttv/devicepluginlgsmarttv.h | 7 +++ .../lgsmarttv/devicepluginlgsmarttv.json | 16 ++----- .../philipshue/devicepluginphilipshue.cpp | 14 +++++- .../philipshue/devicepluginphilipshue.h | 2 +- 8 files changed, 90 insertions(+), 28 deletions(-) diff --git a/libguh/devicemanager.cpp b/libguh/devicemanager.cpp index e227eb39..1a0c61d9 100644 --- a/libguh/devicemanager.cpp +++ b/libguh/devicemanager.cpp @@ -508,9 +508,15 @@ DeviceManager::DeviceError DeviceManager::pairDevice(const PairingTransactionId m_pairingsDiscovery.insert(pairingTransactionId, qMakePair(deviceClassId, deviceDescriptorId)); if (deviceClass.setupMethod() == DeviceClass::SetupMethodDisplayPin) { - // TODO: fetch PIN from device plugin - qCWarning(dcDeviceManager) << "SetupMethodDisplayPin not implemented yet"; - return DeviceErrorSetupFailed; + DeviceDescriptor deviceDescriptor = m_discoveredDevices.value(deviceDescriptorId); + + DevicePlugin *plugin = m_devicePlugins.value(m_supportedDevices.value(deviceClassId).pluginId()); + if (!plugin) { + qWarning() << "Can't find a plugin for this device class"; + return DeviceErrorPluginNotFound; + } + + return plugin->displayPin(pairingTransactionId, deviceDescriptor); } return DeviceErrorNoError; @@ -520,7 +526,6 @@ DeviceManager::DeviceError DeviceManager::pairDevice(const PairingTransactionId * Returns \l{DeviceManager::DeviceError}{DeviceError} to inform about the result. */ DeviceManager::DeviceError DeviceManager::confirmPairing(const PairingTransactionId &pairingTransactionId, const QString &secret) { - Q_UNUSED(secret) if (m_pairingsJustAdd.contains(pairingTransactionId)) { qCWarning(dcDeviceManager) << "this SetupMethod is not implemented yet"; m_pairingsJustAdd.remove(pairingTransactionId); @@ -540,7 +545,7 @@ DeviceManager::DeviceError DeviceManager::confirmPairing(const PairingTransactio return DeviceErrorPluginNotFound; } - DeviceSetupStatus status = plugin->confirmPairing(pairingTransactionId, deviceClassId, deviceDescriptor.params()); + DeviceSetupStatus status = plugin->confirmPairing(pairingTransactionId, deviceClassId, deviceDescriptor.params(), secret); switch (status) { case DeviceSetupStatusSuccess: m_pairingsDiscovery.remove(pairingTransactionId); diff --git a/libguh/plugin/deviceplugin.cpp b/libguh/plugin/deviceplugin.cpp index 4b265353..080b29f4 100644 --- a/libguh/plugin/deviceplugin.cpp +++ b/libguh/plugin/deviceplugin.cpp @@ -357,13 +357,24 @@ void DevicePlugin::deviceRemoved(Device *device) Q_UNUSED(device) } +DeviceManager::DeviceError DevicePlugin::displayPin(const PairingTransactionId &pairingTransactionId, const DeviceDescriptor &deviceDescriptor) +{ + Q_UNUSED(pairingTransactionId) + Q_UNUSED(deviceDescriptor) + + qWarning() << "Plugin does not implement the display pin setup method."; + + return DeviceManager::DeviceErrorNoError; +} + /*! Confirms the pairing of a \a deviceClassId with the given \a pairingTransactionId and \a params. * Returns \l{DeviceManager::DeviceError}{DeviceError} to inform about the result. */ -DeviceManager::DeviceSetupStatus DevicePlugin::confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms) +DeviceManager::DeviceSetupStatus DevicePlugin::confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms, const QString &secret = QString()) { Q_UNUSED(pairingTransactionId) Q_UNUSED(deviceClassId) Q_UNUSED(params) + Q_UNUSED(secret) qCWarning(dcDeviceManager) << "Plugin does not implement pairing."; return DeviceManager::DeviceSetupStatusFailure; diff --git a/libguh/plugin/deviceplugin.h b/libguh/plugin/deviceplugin.h index 14de6588..2535a16b 100644 --- a/libguh/plugin/deviceplugin.h +++ b/libguh/plugin/deviceplugin.h @@ -60,7 +60,8 @@ public: virtual void postSetupDevice(Device *device); virtual void deviceRemoved(Device *device); - virtual DeviceManager::DeviceSetupStatus confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms); + virtual DeviceManager::DeviceError displayPin(const PairingTransactionId &pairingTransactionId, const DeviceDescriptor &deviceDescriptor); + virtual DeviceManager::DeviceSetupStatus confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms, const QString &secret); // Hardware input virtual void radioData(const QList &rawData) {Q_UNUSED(rawData)} diff --git a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.cpp b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.cpp index bd7f0def..34f1b4cd 100644 --- a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.cpp +++ b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.cpp @@ -103,7 +103,6 @@ DeviceManager::DeviceError DevicePluginLgSmartTv::discoverDevices(const DeviceCl DeviceManager::DeviceSetupStatus DevicePluginLgSmartTv::setupDevice(Device *device) { - device->setName("LG Smart Tv (" + device->paramValue("model").toString() + ")"); UpnpDeviceDescriptor upnpDeviceDescriptor; @@ -118,7 +117,7 @@ DeviceManager::DeviceSetupStatus DevicePluginLgSmartTv::setupDevice(Device *devi TvDevice *tvDevice = new TvDevice(this, upnpDeviceDescriptor); // TODO: make dynamic...displayPin setup!!! - tvDevice->setKey("539887"); + //tvDevice->setKey("539887"); connect(tvDevice, &TvDevice::pairingFinished, this, &DevicePluginLgSmartTv::pairingFinished); connect(tvDevice, &TvDevice::sendCommandFinished, this, &DevicePluginLgSmartTv::sendingCommandFinished); @@ -132,7 +131,9 @@ DeviceManager::DeviceSetupStatus DevicePluginLgSmartTv::setupDevice(Device *devi DeviceManager::HardwareResources DevicePluginLgSmartTv::requiredHardware() const { - return DeviceManager::HardwareResourceTimer | DeviceManager::HardwareResourceUpnpDisovery; + return DeviceManager::HardwareResourceTimer | + DeviceManager::HardwareResourceUpnpDisovery | + DeviceManager::HardwareResourceNetworkManager; } DeviceManager::DeviceError DevicePluginLgSmartTv::executeAction(Device *device, const Action &action) @@ -191,10 +192,8 @@ void DevicePluginLgSmartTv::upnpDiscoveryFinished(const QListsetupEventHandler(); } +DeviceManager::DeviceError DevicePluginLgSmartTv::displayPin(const PairingTransactionId &pairingTransactionId, const DeviceDescriptor &deviceDescriptor) +{ + Q_UNUSED(pairingTransactionId) + + QString urlString = "http://" + deviceDescriptor.params().paramValue("host address").toString() + ":" + deviceDescriptor.params().paramValue("port").toString() + "/udap/api/pairing"; + + QNetworkRequest request; + request.setUrl(QUrl(urlString)); + request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("text/xml; charset=utf-8")); + request.setHeader(QNetworkRequest::UserAgentHeader,QVariant("UDAP/2.0")); + + QByteArray data = " showKey"; + + m_showPinReply = networkManagerPost(request, data); + + return DeviceManager::DeviceErrorNoError; +} + +DeviceManager::DeviceSetupStatus DevicePluginLgSmartTv::confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms, const QString &secret) +{ + Q_UNUSED(pairingTransactionId) + Q_UNUSED(deviceClassId) + Q_UNUSED(params) + qDebug() << "pair device with pin: " << secret; + + + + return DeviceManager::DeviceSetupStatusAsync; +} + +void DevicePluginLgSmartTv::networkManagerReplyReady(QNetworkReply *reply) +{ + if (reply == m_showPinReply) { + reply->deleteLater(); + } +} + void DevicePluginLgSmartTv::deviceRemoved(Device *device) { if (!m_tvList.values().contains(device)) { diff --git a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.h b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.h index 6d830c37..9c074244 100644 --- a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.h +++ b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.h @@ -44,11 +44,18 @@ public: void upnpNotifyReceived(const QByteArray ¬ifyData); void postSetupDevice(Device *device) override; + DeviceManager::DeviceError displayPin(const PairingTransactionId &pairingTransactionId, const DeviceDescriptor &deviceDescriptor) override; + DeviceManager::DeviceSetupStatus confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms, const QString &secret) override; + + void networkManagerReplyReady(QNetworkReply *reply) override; + void deviceRemoved(Device *device) override; void guhTimer() override; +private: QHash m_tvList; + QNetworkReply *m_showPinReply; private slots: void pairingFinished(const bool &success); diff --git a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.json b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.json index d436588a..61a7369f 100644 --- a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.json +++ b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.json @@ -11,6 +11,8 @@ "idName": "lgSmartTv", "name": "LG Smart Tv", "createMethods": ["discovery"], + "setupMethod": "displayPin", + "pairingInfo": "Please enter the pairing key displayed on the Tv.", "paramTypes": [ { "name": "name", @@ -18,12 +20,12 @@ "inputType": "TextLine" }, { - "name": "uuid", + "name": "model", "type": "QString", "inputType": "TextLine" }, { - "name": "model", + "name": "uuid", "type": "QString", "inputType": "TextLine" }, @@ -36,16 +38,6 @@ "name": "port", "type": "int" }, - { - "name": "location", - "type": "QString", - "inputType": "Url" - }, - { - "name": "manufacturer", - "type": "QString", - "inputType": "TextLine" - }, { "name": "key", "type": "QString", diff --git a/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp b/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp index 3e79d1aa..56ba6d60 100644 --- a/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp +++ b/plugins/deviceplugins/philipshue/devicepluginphilipshue.cpp @@ -211,9 +211,19 @@ void DevicePluginPhilipsHue::upnpDiscoveryFinished(const QList &upnpDeviceDescriptorList) override; - DeviceManager::DeviceSetupStatus confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms) override; + DeviceManager::DeviceSetupStatus confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList ¶ms, const QString &secret) override; void networkManagerReplyReady(QNetworkReply *reply) override;