annotate host/FDWriteAction.cpp @ 13:47b0a143db39

...
author cannam
date Tue, 12 Dec 2006 10:38:55 +0000
parents faec23aecc74
children df33703ace3b
rev   line source
cannam@12 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@12 2
cannam@12 3 #include "FDWriteAction.h"
cannam@12 4
cannam@12 5 #include <iostream>
cannam@12 6
cannam@12 7 #include <termios.h>
cannam@12 8 #include <unistd.h>
cannam@12 9 #include <sys/types.h>
cannam@12 10 #include <sys/stat.h>
cannam@12 11 #include <fcntl.h>
cannam@12 12
cannam@12 13 #include <QMutexLocker>
cannam@12 14
cannam@12 15 std::map<QString, int>
cannam@12 16 FDWriteAction::m_fdMap;
cannam@12 17
cannam@12 18 QString
cannam@12 19 FDWriteAction::m_previousData = "";
cannam@12 20
cannam@12 21 FDWriteAction::FDWriteAction(QString file,
cannam@12 22 QString data,
cannam@12 23 bool togglePrevious) :
cannam@12 24 m_data(data),
cannam@12 25 m_togglePrevious(togglePrevious)
cannam@12 26 {
cannam@12 27 QMutexLocker locker(&m_mutex);
cannam@12 28 if (m_fdMap.find(file) != m_fdMap.end()) {
cannam@12 29 m_fd = m_fdMap[file];
cannam@12 30 } else {
cannam@12 31 m_fd = open(file.toLocal8Bit().data(), O_WRONLY | O_NOCTTY);
cannam@12 32 if (m_fd < 0) {
cannam@12 33 perror("Failed to open output file");
cannam@12 34 std::cerr << "ERROR: FDWriteAction: Unable to open \""
cannam@12 35 << file.toStdString() << "\" for writing" << std::endl;
cannam@12 36 return;
cannam@12 37 }
cannam@12 38 struct termios t;
cannam@12 39 tcgetattr(m_fd, &t);
cannam@12 40 t.c_cflag = B9600 | CS8 | CLOCAL;
cannam@12 41 t.c_iflag = 0;
cannam@12 42 t.c_oflag = 0;
cannam@12 43 t.c_lflag = ICANON;
cannam@12 44 tcflush(m_fd, TCOFLUSH);
cannam@12 45 tcsetattr(m_fd, TCSANOW, &t);
cannam@12 46 m_fdMap[file] = m_fd;
cannam@12 47 }
cannam@12 48 }
cannam@12 49
cannam@12 50 FDWriteAction::~FDWriteAction()
cannam@12 51 {
cannam@12 52 // don't close fds -- lazily leave them for program exit rather
cannam@12 53 // than go to the bother of reference counting
cannam@12 54 }
cannam@12 55
cannam@12 56 QString
cannam@12 57 FDWriteAction::getName() const
cannam@12 58 {
cannam@12 59 return QString("fdwrite: \"%1\",%2")
cannam@12 60 .arg(m_data)
cannam@12 61 .arg(m_togglePrevious);
cannam@12 62 }
cannam@12 63
cannam@12 64 void
cannam@12 65 FDWriteAction::fire()
cannam@12 66 {
cannam@12 67 if (m_fd < 0) return;
cannam@12 68 QMutexLocker locker(&m_mutex);
cannam@12 69 if (m_togglePrevious) {
cannam@12 70 if (m_previousData == m_data) return;
cannam@13 71 std::cerr << getName().toStdString() << ": fire" << std::endl;
cannam@12 72 if (m_previousData != "") {
cannam@12 73 // bug here
cannam@12 74 write(m_fd, m_previousData.toLocal8Bit().data(), m_previousData.length());
cannam@12 75 usleep(100000);
cannam@12 76 }
cannam@12 77 }
cannam@12 78 // bug here
cannam@12 79 write(m_fd, m_data.toLocal8Bit().data(), m_data.length());
cannam@12 80 m_previousData = m_data;
cannam@12 81 usleep(100000);
cannam@12 82 }
cannam@12 83
cannam@12 84