Website updated.
[irwi] / src / irctrl.cpp
1 #include <cstdlib>
2
3 #ifdef LIRC_USEQTSOCKET
4 #include <QTcpSocket>
5 #include <QHostAddress>
6 #else
7 #include <sys/socket.h>
8 #include <unistd.h>
9 #include <sys/types.h>
10 #include <netinet/in.h>
11 #include <netinet/ip.h>
12 #include <netinet/tcp.h>
13 #endif
14
15 #include <QSettings>
16 #include <QByteArray>
17 #include <QString>
18 #include <QDebug>
19
20 #include "irctrl.h"
21
22 IrCtrl::IrCtrl(QObject *parent)
23     : QObject(parent)
24 {
25     QSettings settings;
26     m_killLircTimer.setInterval(
27             settings.value("idleTimeout", "300").toInt() * 1000);
28     m_killLircTimer.setSingleShot(true);
29     connect(&m_killLircTimer, SIGNAL(timeout()),
30             this, SLOT(stopLirc()));
31     startLirc();
32     m_killLircTimer.start();
33 }
34     
35 IrCtrl::~IrCtrl()
36 {
37 }
38
39 void IrCtrl::sendCmd(const QString &cmd)
40 {
41     if (!m_killLircTimer.isActive()) {
42         startLirc();
43     } else {
44         m_killLircTimer.stop();
45     }
46
47     QSettings settings;
48     // Integer demotion. QVariant has no support for unsigned short
49     unsigned short lircPort = (unsigned short)
50         settings.value("lircPort", LIRC_PORT).toInt();
51     QString remoteName = settings.value("remoteName", "").toString();
52     QString cmdStr = "SEND_ONCE " + remoteName + " " + cmd + "\n";
53     QByteArray buf = cmdStr.toAscii();
54
55 #ifdef LIRC_USEQTSOCKET
56     QTcpSocket sock;
57     sock.setSocketOption(QAbstractSocket::LowDelayOption, 1);
58     sock.connectToHost(QHostAddress::LocalHost, lircPort,
59             QIODevice::WriteOnly | QIODevice::Unbuffered);
60     sock.waitForConnected();
61     sock.write(buf);
62     sock.waitForBytesWritten();
63     sock.close();
64 #else
65     sockaddr_in addr;
66     memset(&addr, 0, sizeof(addr));
67     addr.sin_family      = AF_INET;
68     addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
69     addr.sin_port        = htons(lircPort);
70     int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
71     if (sock == -1) {
72         qDebug() << "Socket open fail";
73     } else {
74         int c = ::connect(sock, (sockaddr*)&addr, sizeof(sockaddr_in));
75         if (c == 0) {
76             write(sock, buf.constData(), buf.count());
77         } else {
78             qDebug() << "Connect fail";
79         }
80         shutdown(sock, SHUT_RDWR);
81         close(sock);
82     }
83 #endif
84
85     m_killLircTimer.start();
86 }
87
88 void IrCtrl::stopLirc()
89 {
90     std::system("sudo /etc/init.d/lirc stop");
91 }
92
93 void IrCtrl::startLirc()
94 {
95     std::system("sudo /etc/init.d/lirc start");
96 }
97
98