add displayPin setupMethod

pull/135/head
Simon Stürz 2015-06-10 14:37:34 +02:00 committed by Michael Zanetti
parent edb95e36fd
commit ee41ef5cfa
8 changed files with 90 additions and 28 deletions

View File

@ -508,9 +508,15 @@ DeviceManager::DeviceError DeviceManager::pairDevice(const PairingTransactionId
m_pairingsDiscovery.insert(pairingTransactionId, qMakePair<DeviceClassId, DeviceDescriptorId>(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);

View File

@ -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 &params)
DeviceManager::DeviceSetupStatus DevicePlugin::confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList &params, 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;

View File

@ -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 &params);
virtual DeviceManager::DeviceError displayPin(const PairingTransactionId &pairingTransactionId, const DeviceDescriptor &deviceDescriptor);
virtual DeviceManager::DeviceSetupStatus confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList &params, const QString &secret);
// Hardware input
virtual void radioData(const QList<int> &rawData) {Q_UNUSED(rawData)}

View File

@ -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 QList<UpnpDeviceDescript
params.append(Param("uuid", upnpDeviceDescriptor.uuid()));
params.append(Param("model", upnpDeviceDescriptor.modelName()));
params.append(Param("host address", upnpDeviceDescriptor.hostAddress().toString()));
params.append(Param("location", upnpDeviceDescriptor.hostAddress().toString()));
params.append(Param("port", upnpDeviceDescriptor.port()));
params.append(Param("manufacturer", upnpDeviceDescriptor.manufacturer()));
params.append(Param("key", "539887"));
params.append(Param("key", QString()));
descriptor.setParams(params);
deviceDescriptors.append(descriptor);
}
@ -212,6 +211,43 @@ void DevicePluginLgSmartTv::postSetupDevice(Device *device)
tvDevice->setupEventHandler();
}
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 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><envelope><api type=\"pairing\"> <name>showKey</name></api></envelope>";
m_showPinReply = networkManagerPost(request, data);
return DeviceManager::DeviceErrorNoError;
}
DeviceManager::DeviceSetupStatus DevicePluginLgSmartTv::confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList &params, 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)) {

View File

@ -44,11 +44,18 @@ public:
void upnpNotifyReceived(const QByteArray &notifyData);
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 &params, const QString &secret) override;
void networkManagerReplyReady(QNetworkReply *reply) override;
void deviceRemoved(Device *device) override;
void guhTimer() override;
private:
QHash<TvDevice*, Device*> m_tvList;
QNetworkReply *m_showPinReply;
private slots:
void pairingFinished(const bool &success);

View File

@ -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",

View File

@ -211,9 +211,19 @@ void DevicePluginPhilipsHue::upnpDiscoveryFinished(const QList<UpnpDeviceDescrip
emit devicesDiscovered(hueBridgeDeviceClassId, deviceDescriptors);
}
DeviceManager::DeviceSetupStatus DevicePluginPhilipsHue::confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList &params)
DeviceManager::DeviceSetupStatus DevicePluginPhilipsHue::confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList &params, const QString &secret)
{
if (deviceClassId != hueBridgeDeviceClassId) {
Q_UNUSED(deviceClassId)
Q_UNUSED(secret)
Param ipParam;
foreach (const Param &param, params) {
if (param.name() == "ip") {
ipParam = param;
}
}
if (!ipParam.isValid()) {
qWarning() << "Missing parameter: ip";
return DeviceManager::DeviceSetupStatusFailure;
}

View File

@ -44,7 +44,7 @@ public:
void deviceRemoved(Device *device) override;
void upnpDiscoveryFinished(const QList<UpnpDeviceDescriptor> &upnpDeviceDescriptorList) override;
DeviceManager::DeviceSetupStatus confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList &params) override;
DeviceManager::DeviceSetupStatus confirmPairing(const PairingTransactionId &pairingTransactionId, const DeviceClassId &deviceClassId, const ParamList &params, const QString &secret) override;
void networkManagerReplyReady(QNetworkReply *reply) override;