#include "httpdaemon.h" #include "device.h" #include #include #include #include HttpDaemon::HttpDaemon(Device *device, QObject *parent): QTcpServer(parent), disabled(false), m_device(device) { listen(QHostAddress::LocalHost, device->params().value("httpport").toInt()); } void HttpDaemon::incomingConnection(qintptr socket) { qDebug() << "incoming connection"; if (disabled) return; // When a new client connects, the server constructs a QTcpSocket and all // communication with the client is done over this QTcpSocket. QTcpSocket // works asynchronously, this means that all the communication is done // in the two slots readClient() and discardClient(). QTcpSocket* s = new QTcpSocket(this); connect(s, SIGNAL(readyRead()), this, SLOT(readClient())); connect(s, SIGNAL(disconnected()), this, SLOT(discardClient())); s->setSocketDescriptor(socket); } void HttpDaemon::pause() { disabled = true; } void HttpDaemon::resume() { disabled = false; } void HttpDaemon::readClient() { if (disabled) return; // This slot is called when the client sent data to the server. The // server looks if it was a get request and sends a very simple HTML // document back. QTcpSocket* socket = (QTcpSocket*)sender(); if (socket->canReadLine()) { QByteArray data = socket->readLine(); QStringList tokens = QString(data).split(QRegExp("[ \r\n][ \r\n]*")); qDebug() << "incoming data" << tokens[1]; if (tokens[1].contains('?')) { QUrlQuery query(QUrl("http://foo.bar" + tokens[1])); qDebug() << "query is" << query.queryItemValue("eventid"); emit triggerEvent(query.queryItemValue("eventid").toInt()); } if (tokens[0] == "GET") { QTextStream os(socket); os.setAutoDetectUnicode(true); os << QString("HTTP/1.0 200 Ok\r\n" "Content-Type: text/html; charset=\"utf-8\"\r\n" "\r\n" "" "" "

Mock device

\n" "Name: %1
" "ID: %2" "
" "" "" "
" "" "\n").arg(m_device->name()).arg(m_device->id().toString()); socket->close(); qDebug() << "Wrote to client"; if (socket->state() == QTcpSocket::UnconnectedState) { delete socket; qDebug() << "Connection closed"; } } } } void HttpDaemon::discardClient() { QTcpSocket* socket = (QTcpSocket*)sender(); socket->deleteLater(); qDebug() << "Connection closed"; }