summaryrefslogtreecommitdiff
authorpaule <paule>2007-02-07 10:14:11 (UTC)
committer paule <paule>2007-02-07 10:14:11 (UTC)
commitd7a838e0f4352522fb2c12feea58129b16e76b89 (patch) (unidiff)
tree54a293a13b7bcf1d51869857c4350abcf3af06b1
parent97b2152a21890f05a2217dddfcba6c820c00aa24 (diff)
downloadopie-d7a838e0f4352522fb2c12feea58129b16e76b89.zip
opie-d7a838e0f4352522fb2c12feea58129b16e76b89.tar.gz
opie-d7a838e0f4352522fb2c12feea58129b16e76b89.tar.bz2
Add functions for handling /etc/lircd.conf; do basic check of /etc/lircd.conf before attempting to commit in order to avoid timeouts
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/tools/remote/lirchandler.cpp166
-rw-r--r--noncore/tools/remote/lirchandler.h8
2 files changed, 174 insertions, 0 deletions
diff --git a/noncore/tools/remote/lirchandler.cpp b/noncore/tools/remote/lirchandler.cpp
index ec1e275..6022573 100644
--- a/noncore/tools/remote/lirchandler.cpp
+++ b/noncore/tools/remote/lirchandler.cpp
@@ -25,6 +25,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25#include <qstring.h> 25#include <qstring.h>
26#include <qmessagebox.h> 26#include <qmessagebox.h>
27#include <qobject.h> 27#include <qobject.h>
28#include <qtextstream.h>
28#include <opie2/oprocess.h> 29#include <opie2/oprocess.h>
29#include <qpe/qcopenvelope_qws.h> 30#include <qpe/qcopenvelope_qws.h>
30 31
@@ -34,6 +35,7 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
34#define TIMEOUT 3 35#define TIMEOUT 3
35#define LIRCD_SOCKET "/dev/lircd" 36#define LIRCD_SOCKET "/dev/lircd"
36#define LIRCD_SERVICECMD "/etc/init.d/lircd" 37#define LIRCD_SERVICECMD "/etc/init.d/lircd"
38#define LIRCD_CONF "/etc/lircd.conf"
37 39
38using namespace Opie::Core; 40using namespace Opie::Core;
39 41
@@ -46,6 +48,9 @@ LircHandler::LircHandler(void)
46 48
47bool LircHandler::connectLirc(void) 49bool LircHandler::connectLirc(void)
48{ 50{
51 if(!checkLircdConfValid(false))
52 return false;
53
49 fd = socket(AF_UNIX, SOCK_STREAM, 0); 54 fd = socket(AF_UNIX, SOCK_STREAM, 0);
50 if(fd == -1) 55 if(fd == -1)
51 { 56 {
@@ -269,6 +274,15 @@ bool LircHandler::isLircdRunning(void)
269 return (OProcess::processPID("lircd") != 0); 274 return (OProcess::processPID("lircd") != 0);
270} 275}
271 276
277void LircHandler::reloadLircdConf(void)
278{
279 int pid = OProcess::processPID("lircd");
280 if(pid > -1)
281 kill(pid, SIGHUP);
282 else
283 startLircd();
284}
285
272bool LircHandler::setupModules(void) 286bool LircHandler::setupModules(void)
273{ 287{
274 // Remove IrDA modules which get in the way 288 // Remove IrDA modules which get in the way
@@ -291,3 +305,155 @@ void LircHandler::disableIrDA(void)
291{ 305{
292 QCopEnvelope e("QPE/IrDaApplet", "disableIrda()"); 306 QCopEnvelope e("QPE/IrDaApplet", "disableIrda()");
293} 307}
308
309void LircHandler::mergeRemoteConfig(const QString &newconfig)
310{
311 QStringList contents;
312 QStringList newcontents;
313 QFile conf(LIRCD_CONF);
314 QFile newconf(newconfig);
315
316 readFromFile(conf, contents);
317 readFromFile(newconf, newcontents);
318 contents += newcontents;
319
320 writeToFile(conf, contents);
321}
322
323void LircHandler::removeRemote(const QString &remotetodelete)
324{
325 QStringList contents;
326 QFile conf(LIRCD_CONF);
327 bool found = false;
328 bool inremote = false;
329 QString remotename("");
330 int lineidx = 0;
331 int startidx = 0;
332 int lastendidx = 0;
333
334 readFromFile(conf, contents);
335
336 for (QStringList::Iterator it = contents.begin(); it != contents.end(); ++it ) {
337 QString line = (*it).stripWhiteSpace();
338 if(line == "begin remote") {
339 startidx = lastendidx;
340 inremote = true;
341 }
342 else if(line == "end remote") {
343 lastendidx = lineidx + 1;
344 if(remotename == remotetodelete) {
345 found = true;
346 break;
347 }
348 inremote = false;
349 }
350 else if(inremote && line.left(4) == "name") {
351 remotename = line.mid(4).stripWhiteSpace();
352 }
353 lineidx++;
354 }
355
356 if(found) {
357 // Remove the remote and any preceding lines (most likely associated comments)
358 int linecount = lastendidx - startidx;
359 QStringList::Iterator it = contents.at(startidx);
360 for (int i = 0; i < linecount; i++ ) {
361 it = contents.remove(it);
362 }
363
364 // Check if there is at least one remote still defined
365 found = false;
366 for (it = contents.begin(); it != contents.end(); ++it ) {
367 QString line = (*it).stripWhiteSpace();
368 if(line == "begin remote") {
369 found = true;
370 break;
371 }
372 }
373
374 if(found)
375 writeToFile(conf, contents);
376 else
377 conf.remove();
378 }
379}
380
381bool LircHandler::checkRemoteExists(const QString &remote)
382{
383 QStringList contents;
384 QFile conf(LIRCD_CONF);
385 bool inremote = false;
386
387 readFromFile(conf, contents);
388
389 for (QStringList::Iterator it = contents.begin(); it != contents.end(); ++it ) {
390 QString line = (*it).stripWhiteSpace();
391 if(line == "begin remote") {
392 inremote = true;
393 }
394 else if(line == "end remote") {
395 inremote = false;
396 }
397 else if(inremote && line.left(4) == "name") {
398 QString rname = line.mid(4).stripWhiteSpace();
399 if(rname == remote)
400 return true;
401 }
402 }
403 return false;
404}
405
406bool LircHandler::checkLircdConfValid(bool silent)
407{
408 QStringList contents;
409 QFile conf(LIRCD_CONF);
410 bool inremote = false;
411
412 if(conf.exists()) {
413 readFromFile(conf, contents);
414
415 for (QStringList::Iterator it = contents.begin(); it != contents.end(); ++it ) {
416 QString line = (*it).stripWhiteSpace();
417 if(line == "begin remote") {
418 inremote = true;
419 }
420 else if(line == "end remote") {
421 if(inremote)
422 return true;
423 }
424 }
425 }
426
427 if(!silent) {
428 QMessageBox::information(NULL, QObject::tr("No remote"),
429 QObject::tr("No remotes have been learned.\nPlease go to the Learn tab\nand learn a remote."),
430 QMessageBox::Ok, QMessageBox::NoButton);
431 }
432
433 return false;
434}
435
436bool LircHandler::readFromFile(QFile &file, QStringList &strlist)
437{
438 if(file.open(IO_ReadOnly)) {
439 QTextStream in(&file);
440
441 strlist = QStringList::split('\n', in.read(), true);
442 file.close();
443 if(strlist.count() > 0)
444 strlist.remove(strlist.at(strlist.count() - 1)); // remove extra blank line
445 }
446 return true;
447}
448
449bool LircHandler::writeToFile(QFile &file, QStringList &strlist)
450{
451 if(file.open(IO_WriteOnly | IO_Truncate)) {
452 QTextStream out(&file);
453 for (QStringList::Iterator it = strlist.begin(); it != strlist.end(); ++it ) {
454 out << (*it) << "\n";
455 }
456 file.close();
457 }
458 return true;
459}
diff --git a/noncore/tools/remote/lirchandler.h b/noncore/tools/remote/lirchandler.h
index 4e56b6b..5ba14b7 100644
--- a/noncore/tools/remote/lirchandler.h
+++ b/noncore/tools/remote/lirchandler.h
@@ -18,12 +18,15 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18#define LIRCHANDLER_H 18#define LIRCHANDLER_H
19 19
20#include <sys/un.h> 20#include <sys/un.h>
21#include <qfile.h>
21 22
22class LircHandler 23class LircHandler
23{ 24{
24private: 25private:
25 bool connectLirc(void); 26 bool connectLirc(void);
26 const char *readPacket(); 27 const char *readPacket();
28 bool readFromFile(QFile &file, QStringList &strlist);
29 bool writeToFile(QFile &file, QStringList &strlist);
27 30
28 struct sockaddr_un addr; 31 struct sockaddr_un addr;
29 int fd; 32 int fd;
@@ -35,9 +38,14 @@ public:
35 bool startLircd(void); 38 bool startLircd(void);
36 bool stopLircd(void); 39 bool stopLircd(void);
37 bool isLircdRunning(void); 40 bool isLircdRunning(void);
41 void reloadLircdConf(void);
38 bool setupModules(void); 42 bool setupModules(void);
39 bool cleanupModules(void); 43 bool cleanupModules(void);
40 void disableIrDA(void); 44 void disableIrDA(void);
45 void mergeRemoteConfig(const QString &newconfig);
46 void removeRemote(const QString &remotetodelete);
47 bool checkRemoteExists(const QString &remote);
48 bool checkLircdConfValid(bool silent);
41}; 49};
42 50
43#endif 51#endif