// // // C++ Implementation: $MODULE$ // // Description: // // // Author: (C) 2002 by Malte Starostik // Adaption : Gav Wood , (C) 2003 // // Copyright: See COPYING file that comes with this distribution // // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "klircclient.h" KLircClient::KLircClient(QWidget *parent, const char *name) : QObject(parent, name), theSocket(0), listIsUpToDate(false) { connectToLirc(); } bool KLircClient::connectToLirc() { int sock = ::socket(PF_UNIX, SOCK_STREAM, 0); if(sock == -1) return false; sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, "/dev/lircd"); if(::connect(sock, (struct sockaddr *)(&addr), sizeof(addr)) == -1) { ::close(sock); // in case of mandrake... strcpy(addr.sun_path, "/tmp/.lircd"); if(::connect(sock, (struct sockaddr *)(&addr), sizeof(addr)) == -1) { ::close(sock); return false; } } theSocket = new QSocket; theSocket->setSocket(sock); connect(theSocket, SIGNAL(readyRead()), SLOT(slotRead())); connect(theSocket, SIGNAL(connectionClosed()), SLOT(slotClosed())); updateRemotes(); return true; } KLircClient::~KLircClient() { // if(theSocket) delete theSocket; } void KLircClient::slotClosed() { delete theSocket; theSocket = 0; emit connectionClosed(); } const QStringList KLircClient::remotes() const { QStringList remotes; for(QMap::ConstIterator i = theRemotes.begin(); i != theRemotes.end(); ++i) remotes.append(i.key()); remotes.sort(); return remotes; } const QStringList KLircClient::buttons(const QString &theRemote) const { return theRemotes[theRemote]; } void KLircClient::slotRead() { while (theSocket->bytesAvailable()) { QString line = readLine(); if (line == "BEGIN") { // BEGIN // // [SUCCESS|ERROR] // [DATA // n // n lines of data] // END line = readLine(); if (line == "SIGHUP") { // Configuration changed do line = readLine(); while (!line.isEmpty() && line != "END"); updateRemotes(); return; } else if (line == "LIST") { // remote control list if (readLine() != "SUCCESS" || readLine() != "DATA") { do line = readLine(); while (!line.isEmpty() && line != "END"); return; } QStringList remotes; int count = readLine().toInt(); for (int i = 0; i < count; ++i) remotes.append(readLine()); do line = readLine(); while (!line.isEmpty() && line != "END"); if (line.isEmpty()) return; // abort on corrupt data for (QStringList::ConstIterator it = remotes.begin(); it != remotes.end(); ++it) sendCommand("LIST " + *it); return; } else if (line.left(4) == "LIST") { // button list if (readLine() != "SUCCESS" || readLine() != "DATA") { do line = readLine(); while (!line.isEmpty() && line != "END"); return; } QString remote = line.mid(5); QStringList buttons; int count = readLine().toInt(); for (int i = 0; i < count; ++i) { // QString btn = readLine().mid(17); if(btn.isNull()) break; if(btn.startsWith("'") && btn.endsWith("'")) btn = btn.mid(1, btn.length() - 2); buttons.append(btn); } theRemotes.insert(remote, buttons); } do line = readLine(); while (!line.isEmpty() && line != "END"); listIsUpToDate = true; emit remotesRead(); } else { //