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();