Fixed compilation error
[irwi] / src / irctrl.cpp
index 92b4942..dbc2309 100644 (file)
@@ -1,72 +1,98 @@
 #include <cstdlib>
 
+#ifdef LIRC_USEQTSOCKET
 #include <QTcpSocket>
-#include <QSettings>
-#include <QString>
-#include <QIODevice>
 #include <QHostAddress>
-#include <QAbstractSocket>
+#else
+#include <sys/socket.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#endif
+
 #include <QSettings>
+#include <QByteArray>
+#include <QString>
+#include <QDebug>
 
 #include "irctrl.h"
 
-IrCtrl::IrCtrl()
-    : settings(NULL)
+IrCtrl::IrCtrl(QObject *parent)
+    : QObject(parent)
 {
-    settings = new QSettings(this);
-    std::system("lircctl start");
+    QSettings settings;
+    m_killLircTimer.setInterval(
+            settings.value("idleTimeout", "300").toInt() * 1000);
+    m_killLircTimer.setSingleShot(true);
+    connect(&m_killLircTimer, SIGNAL(timeout()),
+            this, SLOT(stopLirc()));
+    startLirc();
+    m_killLircTimer.start();
 }
-
+    
 IrCtrl::~IrCtrl()
 {
-    delete settings;
-    settings = NULL;
-    std::system("lircctl stop");
 }
 
-void IrCtrl::genericSendCmd(const QString &commandName)
+void IrCtrl::sendCmd(const QString &cmd)
 {
-    QTcpSocket sock(this);
-//    sock.setSocketOption(QAbstractSocket::LowDelayOption, 1);
-    sock.connectToHost(QHostAddress::LocalHost, 
-            settings->value("lircPort", LIRC_PORT).toInt(),
-            QIODevice::WriteOnly|QIODevice::Unbuffered);
+    if (!m_killLircTimer.isActive()) {
+        startLirc();
+    } else {
+        m_killLircTimer.stop();
+    }
+
+    QSettings settings;
+    // Integer demotion. QVariant has no support for unsigned short
+    unsigned short lircPort = (unsigned short)
+        settings.value("lircPort", LIRC_PORT).toInt();
+    QString remoteName = settings.value("remoteName", "").toString();
+    QString cmdStr = "SEND_ONCE " + remoteName + " " + cmd + "\n";
+    QByteArray buf = cmdStr.toAscii();
+
+#ifdef LIRC_USEQTSOCKET
+    QTcpSocket sock;
+    sock.setSocketOption(QAbstractSocket::LowDelayOption, 1);
+    sock.connectToHost(QHostAddress::LocalHost, lircPort,
+            QIODevice::WriteOnly | QIODevice::Unbuffered);
     sock.waitForConnected();
-    QString remoteName =
-        settings->value("remoteName", "REMOTE_NAME_MISSING").toString();
-    QString cmd = "SEND_ONCE " + remoteName + " " + commandName + "\n";
-    sock.write(cmd.toAscii());
+    sock.write(buf);
     sock.waitForBytesWritten();
     sock.close();
-}
+#else
+    sockaddr_in addr;
+    memset(&addr, 0, sizeof(addr));
+    addr.sin_family      = AF_INET;
+    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+    addr.sin_port        = htons(lircPort);
+    int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    if (sock == -1) {
+        qDebug() << "Socket open fail";
+    } else {
+        int c = ::connect(sock, (sockaddr*)&addr, sizeof(sockaddr_in));
+        if (c == 0) {
+            write(sock, buf.constData(), buf.count());
+        } else {
+            qDebug() << "Connect fail";
+        }
+        shutdown(sock, SHUT_RDWR);
+        close(sock);
+    }
+#endif
 
-void IrCtrl::sendCmd0()
-{
-    genericSendCmd(settings->value("cmd0", "VOL+").toString());
+    m_killLircTimer.start();
 }
 
-void IrCtrl::sendCmd1()
+void IrCtrl::stopLirc()
 {
-    genericSendCmd(settings->value("cmd1", "VOL-").toString());
+    std::system("sudo /etc/init.d/lirc stop");
 }
 
-void IrCtrl::sendCmd2()
+void IrCtrl::startLirc()
 {
-    genericSendCmd(settings->value("cmd2", "P+").toString());
+    std::system("sudo /etc/init.d/lirc start");
 }
 
-void IrCtrl::sendCmd3()
-{
-    genericSendCmd(settings->value("cmd3", "P-").toString());
-}
-
-void IrCtrl::sendCmd4()
-{
-    genericSendCmd(settings->value("cmd4", "ON/OFF").toString());
-}
-
-void IrCtrl::sendCmd5()
-{
-    genericSendCmd(settings->value("cmd5", "MUTE").toString());
-}