diff --git a/libguh/libguh.pro b/libguh/libguh.pro index ff26e6f2..a9971643 100644 --- a/libguh/libguh.pro +++ b/libguh/libguh.pro @@ -37,7 +37,7 @@ SOURCES += plugin/device.cpp \ types/ruleaction.cpp \ types/ruleactionparam.cpp \ types/statedescriptor.cpp \ - loggingcategories.cpp \ + typeutils.cpp \ HEADERS += plugin/device.h \ plugin/deviceclass.h \ diff --git a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.cpp b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.cpp index 34f1b4cd..3df06b87 100644 --- a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.cpp +++ b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.cpp @@ -103,7 +103,13 @@ DeviceManager::DeviceError DevicePluginLgSmartTv::discoverDevices(const DeviceCl DeviceManager::DeviceSetupStatus DevicePluginLgSmartTv::setupDevice(Device *device) { - device->setName("LG Smart Tv (" + device->paramValue("model").toString() + ")"); + + qDebug() << "setup tv"; + qDebug() << device->params(); + + QString key = m_tvKeys.value(device->paramValue("uuid").toString()); + qDebug() << "key for this device" << key; + device->setParamValue("key", key); UpnpDeviceDescriptor upnpDeviceDescriptor; upnpDeviceDescriptor.setFriendlyName(device->paramValue("name").toString()); @@ -112,21 +118,17 @@ DeviceManager::DeviceSetupStatus DevicePluginLgSmartTv::setupDevice(Device *devi upnpDeviceDescriptor.setHostAddress(QHostAddress(device->paramValue("host address").toString())); upnpDeviceDescriptor.setPort(device->paramValue("port").toInt()); upnpDeviceDescriptor.setLocation(QUrl(device->paramValue("location").toString())); - upnpDeviceDescriptor.setManufacturer(device->paramValue("manufacturer").toString()); - // key if there is one... + TvDevice *tvDevice = new TvDevice(this, upnpDeviceDescriptor); + tvDevice->setKey(key); - // TODO: make dynamic...displayPin setup!!! - //tvDevice->setKey("539887"); - - connect(tvDevice, &TvDevice::pairingFinished, this, &DevicePluginLgSmartTv::pairingFinished); + connect(tvDevice, &TvDevice::pairingFinished, this, &DevicePluginLgSmartTv::slotPairingFinished); connect(tvDevice, &TvDevice::sendCommandFinished, this, &DevicePluginLgSmartTv::sendingCommandFinished); connect(tvDevice, &TvDevice::statusChanged, this, &DevicePluginLgSmartTv::statusChanged); - tvDevice->requestPairing(); m_tvList.insert(tvDevice, device); - return DeviceManager::DeviceSetupStatusAsync; + return DeviceManager::DeviceSetupStatusSuccess; } DeviceManager::HardwareResources DevicePluginLgSmartTv::requiredHardware() const @@ -231,20 +233,52 @@ DeviceManager::DeviceError DevicePluginLgSmartTv::displayPin(const PairingTransa 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; + QString urlString = "http://" + params.paramValue("host address").toString() + ":" + 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 guh")); + + QByteArray data = "hello" + secret.toUtf8() + "8080"; + + QNetworkReply *pairingReply = networkManagerPost(request, data); + m_pairingTv.insert(pairingReply, pairingTransactionId); + + m_tvKeys.insert(params.paramValue("uuid").toString(), secret); return DeviceManager::DeviceSetupStatusAsync; } void DevicePluginLgSmartTv::networkManagerReplyReady(QNetworkReply *reply) { + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (reply == m_showPinReply) { reply->deleteLater(); + } else if (m_pairingTv.keys().contains(reply)) { + PairingTransactionId pairingTransactionId = m_pairingTv.take(reply); + if(status != 200) { + qWarning() << "Could not pair: please check the key and retry"; + emit pairingFinished(pairingTransactionId, DeviceManager::DeviceSetupStatusFailure); + } else { + qWarning() << "Paired successfully"; + // now unpair the device, because setupdevice will try that again + QString urlString = "http://" + hostAddress().toString() + ":" + QString::number(port()) + "/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 guh")); + request.setRawHeader("Connection", "Close"); + + QByteArray data = "byebye8080"; + + m_finishingPairingReplay = m_manager->post(request,data); + } + reply->deleteLater(); } } @@ -269,7 +303,7 @@ void DevicePluginLgSmartTv::guhTimer() } -void DevicePluginLgSmartTv::pairingFinished(const bool &success) +void DevicePluginLgSmartTv::slotPairingFinished(const bool &success) { TvDevice *tvDevice = static_cast(sender()); Device *device = m_tvList.value(tvDevice); diff --git a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.h b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.h index 9c074244..e77d1e2a 100644 --- a/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.h +++ b/plugins/deviceplugins/lgsmarttv/devicepluginlgsmarttv.h @@ -54,11 +54,14 @@ public: void guhTimer() override; private: - QHash m_tvList; + QHash m_tvList; + QHash m_pairingTv; + QHash m_unpairTv; + QHash m_tvKeys; QNetworkReply *m_showPinReply; private slots: - void pairingFinished(const bool &success); + void slotPairingFinished(const bool &success); void sendingCommandFinished(const bool &success, const ActionId &actionId); void statusChanged();