diff --git a/httpcommander/devicepluginhttpcommander.cpp b/httpcommander/devicepluginhttpcommander.cpp index b968ec29..9d52ff91 100644 --- a/httpcommander/devicepluginhttpcommander.cpp +++ b/httpcommander/devicepluginhttpcommander.cpp @@ -34,13 +34,15 @@ DeviceManager::HardwareResources DevicePluginHttpCommander::requiredHardware() c DeviceManager::DeviceSetupStatus DevicePluginHttpCommander::setupDevice(Device *device) { - if (device->deviceClassId() == httpGetDeviceClassId) { + if ((device->deviceClassId() == httpGetDeviceClassId) || (device->deviceClassId() == httpPostDeviceClassId) || (device->deviceClassId() == httpPutDeviceClassId)) { + QUrl url = device->paramValue(urlParamTypeId).toUrl(); + if (!url.isValid()) { + qDebug(dcHttpCommander()) << "Given URL is not valid"; + } + return DeviceManager::DeviceSetupStatusSuccess; } - if (device->deviceClassId() == httpPostDeviceClassId) { - return DeviceManager::DeviceSetupStatusSuccess; - } return DeviceManager::DeviceSetupStatusFailure; } @@ -56,6 +58,10 @@ void DevicePluginHttpCommander::postSetupDevice(Device *device) QNetworkReply *reply = networkManagerGet(request);; m_httpRequests.insert(reply, device); } + if ((device->deviceClassId() == httpPostDeviceClassId) || (device->deviceClassId() == httpPutDeviceClassId)) { + //TODO find a way to check it the URL is reachable + device->setStateValue(reachableStateTypeId, true); + } } @@ -77,6 +83,20 @@ DeviceManager::DeviceError DevicePluginHttpCommander::executeAction(Device *devi return DeviceManager::DeviceErrorActionTypeNotFound; } + if (device->deviceClassId() == httpPutDeviceClassId) { + + // check if this is the "press" action + if (action.actionTypeId() == putActionTypeId) { + + QUrl url = device->paramValue(urlParamTypeId).toUrl(); + url.setPort(device->paramValue(portParamTypeId).toInt()); + QByteArray payload = action.param(putDataParamTypeId).value().toByteArray(); + QNetworkReply *reply = networkManagerPut(QNetworkRequest(url), payload); + m_httpRequests.insert(reply, device); + + return DeviceManager::DeviceErrorNoError; + } + } return DeviceManager::DeviceErrorDeviceClassNotFound; } @@ -116,8 +136,7 @@ void DevicePluginHttpCommander::networkManagerReplyReady(QNetworkReply *reply) Device *device = m_httpRequests.take(reply); if (device->deviceClassId() == httpGetDeviceClassId) { - device->setStateValue(httpResponseStateTypeId, data); - //device->setStateValue(statusStateTypeId, reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()); + device->setStateValue(getDataStateTypeId, data); // check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { qCWarning(dcHttpCommander()) << "Request error:" << status << reply->errorString(); @@ -126,8 +145,8 @@ void DevicePluginHttpCommander::networkManagerReplyReady(QNetworkReply *reply) return; } device->setStateValue(reachableStateTypeId, true); - } else if (device->deviceClassId() == httpPostDeviceClassId) { - + } else if ((device->deviceClassId() == httpPostDeviceClassId) || (device->deviceClassId() == httpPutDeviceClassId) ) { + device->setStateValue(httpResponseStateTypeId, data); // check HTTP status code if (status != 200 || reply->error() != QNetworkReply::NoError) { qCWarning(dcHttpCommander()) << "Request error:" << status << reply->errorString(); diff --git a/httpcommander/devicepluginhttpcommander.json b/httpcommander/devicepluginhttpcommander.json index e929820e..0ad28dc6 100644 --- a/httpcommander/devicepluginhttpcommander.json +++ b/httpcommander/devicepluginhttpcommander.json @@ -17,7 +17,7 @@ "basicTags": [ "Service" ], - "primaryStateTypeId": "137ec5fc-22f5-4201-8921-2896deda0fe6", + "criticalStateTypeId": "8daac0e7-4c2f-4cdf-b528-02cfe04c6b39", "paramTypes": [ { "id": "1a3fcb23-931b-4ba1-b134-c49b656c76f7", @@ -42,7 +42,15 @@ "name": "reachable", "type": "bool", "defaultValue": false, - "eventTypeName": "reachable status changed" + "eventTypeName": "reachability changed" + }, + { + "id": "69f32ec8-114d-43f4-9241-1f6a57261f32", + "idName": "httpResponse", + "name": "response", + "type": "QString", + "defaultValue": "", + "eventTypeName": "response received" } ], "actionTypes": [ @@ -63,6 +71,69 @@ } ] }, + { + "id": "05bf65f5-ff13-43e3-b6ae-77019e79d8a1", + "idName": "httpPut", + "name": "http put", + "deviceIcon": "Network", + "createMethods": ["user"], + "basicTags": [ + "Service" + ], + "criticalStateTypeId": "8daac0e7-4c2f-4cdf-b528-02cfe04c6b39", + "paramTypes": [ + { + "id": "1a3fcb23-931b-4ba1-b134-c49b656c76f7", + "idName": "url", + "name": "url or ipv4 address", + "type": "QString", + "inputType": "None", + "defaultValue": "http://nymea.io" + }, + { + "id": "bee8b151-815a-4159-9d8a-42b76e99b42c", + "idName": "port", + "name": "port", + "type": "int", + "defaultValue": "80" + } + ], + "stateTypes": [ + { + "id": "8daac0e7-4c2f-4cdf-b528-02cfe04c6b39", + "idName": "reachable", + "name": "reachable", + "type": "bool", + "defaultValue": false, + "eventTypeName": "reachability changed" + }, + { + "id": "69f32ec8-114d-43f4-9241-1f6a57261f32", + "idName": "httpResponse", + "name": "response", + "type": "QString", + "defaultValue": "", + "eventTypeName": "response received" + } + ], + "actionTypes": [ + { + "id": "a9f165dc-cdf1-48f0-b4b6-7c24373cb77c", + "idName": "put", + "name": "put", + "paramTypes": [ + { + "id": "7742d445-8fc1-4b20-87f2-1bb35929fce1", + "idName": "putData", + "name": "put data", + "type": "QString", + "defaultValue": "", + "eventTypeName": "post data sent" + } + ] + } + ] + }, { "id": "8f3f6dde-9db3-4237-800b-bb7f804098c9", "idName": "httpGet", @@ -72,7 +143,7 @@ "basicTags": [ "Service" ], - "primaryStateTypeId": "137ec5fc-22f5-4201-8921-2896deda0fe6", + "criticalStateTypeId": "8daac0e7-4c2f-4cdf-b528-02cfe04c6b39", "paramTypes": [ { "id": "1a3fcb23-931b-4ba1-b134-c49b656c76f7", @@ -92,20 +163,20 @@ ], "stateTypes":[ { - "id": "137ec5fc-22f5-4201-8921-2896deda0fe6", - "idName": "status", - "name": "status", - "type": "QString", - "defaultValue": "Undefined", - "eventTypeName": "connection status changed" + "id": "8daac0e7-4c2f-4cdf-b528-02cfe04c6b39", + "idName": "reachable", + "name": "reachable", + "type": "bool", + "defaultValue": false, + "eventTypeName": "reachability changed" }, { - "id": "5a97ca56-b334-411b-adba-116496ffe83d", - "idName": "httpResponse", - "name": "response", + "id": "d81f0644-b94e-48ed-ae48-1b8ff6cebc0c", + "idName": "getData", + "name": "data", "type": "QString", "defaultValue": "", - "eventTypeName": "response received" + "eventTypeName": "get data received" } ] }