QSocket --> BSD sockets
[irwi] / src / irctrl.cpp
1 #include <cstdlib>
2
3 #include <sys/socket.h>
4 #include <unistd.h>
5 #include <sys/types.h>
6 #include <netinet/in.h>
7 #include <netinet/ip.h>
8 #include <netinet/tcp.h>
9
10 #include <QSettings>
11 #include <QByteArray>
12 #include <QString>
13 #include <QDebug>
14
15 #include "irctrl.h"
16
17 IrCtrl::IrCtrl(QObject *parent)
18     : QObject(parent)
19 {
20     QSettings settings;
21     m_killLircTimer.setInterval(
22             settings.value("idleTimeout", "300").toInt() * 1000);
23     m_killLircTimer.setSingleShot(true);
24     connect(&m_killLircTimer, SIGNAL(timeout()),
25             this, SLOT(stopLirc()));
26     startLirc();
27     m_killLircTimer.start();
28 }
29     
30 IrCtrl::~IrCtrl()
31 {
32 }
33
34 void IrCtrl::sendCmd(const QString &cmd)
35 {
36     if (!m_killLircTimer.isActive()) {
37         startLirc();
38     } else {
39         m_killLircTimer.stop();
40     }
41
42     QSettings settings;
43     QString remoteName = settings.value("remoteName", "").toString();
44     QString cmdStr = "SEND_ONCE " + remoteName + " " + cmd + "\n";
45     QByteArray buf = cmdStr.toAscii();
46
47     sockaddr_in addr;
48     memset(&addr, 0, sizeof(addr));
49     addr.sin_family      = AF_INET;
50     addr.sin_addr.s_addr = INADDR_LOOPBACK;
51     addr.sin_port        = LIRC_PORT;
52     int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
53     if (sock == -1) {
54         qDebug() << "Socket open fail";
55     } else {
56         int c = ::connect(sock, (sockaddr*)&addr, sizeof(sockaddr_in));
57         if (c == 0) {
58             write(sock, buf.constData(), buf.count());
59         } else {
60             qDebug() << "Connect fail";
61         }
62         shutdown(sock, SHUT_RDWR);
63         close(sock);
64     }
65
66     m_killLircTimer.start();
67 }
68
69
70 void IrCtrl::stopLirc()
71 {
72     std::system("sudo /etc/init.d/lirc stop");
73 }
74
75 void IrCtrl::startLirc()
76 {
77     std::system("sudo /etc/init.d/lirc start");
78 }
79
80