/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This file is part of guh. * * * * Guh is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, version 2 of the License. * * * * Guh is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with guh. If not, see . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "wemoswitch.h" WemoSwitch::WemoSwitch(QObject *parent, UpnpDeviceDescriptor upnpDeviceDescriptor): UpnpDevice(parent, upnpDeviceDescriptor) { m_manager = new QNetworkAccessManager(this); connect(m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*))); } WemoSwitch::~WemoSwitch() { } bool WemoSwitch::powerState() { return m_powerState; } bool WemoSwitch::reachable() { return m_reachable; } void WemoSwitch::replyFinished(QNetworkReply *reply) { if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != 200) { // clean up if (reply == m_setPowerReplay) { emit setPowerFinished(false,m_actionId); m_setPowerReplay->deleteLater(); } if (reply == m_refrashReplay) { m_refrashReplay->deleteLater(); } m_reachable = false; emit stateChanged(); return; } else { m_reachable = true; } // if this is the answerer to a refresh request if (reply == m_refrashReplay) { QByteArray data = reply->readAll(); if (data.contains("0")) { m_powerState = false; } if (data.contains("1")) { m_powerState = true; } m_refrashReplay->deleteLater(); } // if this is the answerer to a "set power" request if (reply == m_setPowerReplay) { QByteArray data = reply->readAll(); if (data.contains("1") || data.contains("0")) { emit setPowerFinished(true,m_actionId); } else { emit setPowerFinished(false,m_actionId); } refresh(); m_setPowerReplay->deleteLater(); } emit stateChanged(); } void WemoSwitch::refresh() { QByteArray getBinarayStateMessage("1"); QNetworkRequest request; request.setUrl(QUrl("http://" + hostAddress().toString() + ":" + QString::number(port()) + "/upnp/control/basicevent1")); request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("text/xml; charset=\"utf-8\"")); request.setHeader(QNetworkRequest::UserAgentHeader,QVariant("guh")); request.setRawHeader("SOAPACTION", "\"urn:Belkin:service:basicevent:1#GetBinaryState\""); m_refrashReplay = m_manager->post(request,getBinarayStateMessage); } bool WemoSwitch::setPower(const bool &power, const ActionId &actionId) { m_actionId = actionId; // check if the power state changed... if (m_powerState == power) { return false; } QByteArray setPowerMessage("" + QByteArray::number((int)power) + ""); QNetworkRequest request; request.setUrl(QUrl("http://" + hostAddress().toString() + ":" + QString::number(port()) + "/upnp/control/basicevent1")); request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("text/xml; charset=\"utf-8\"")); request.setHeader(QNetworkRequest::UserAgentHeader,QVariant("guh")); request.setRawHeader("SOAPACTION", "\"urn:Belkin:service:basicevent:1#SetBinaryState\""); m_setPowerReplay = m_manager->post(request,setPowerMessage); return true; }