annotate host/FDWriteAction.cpp @ 17:3cbd40805795 tip

Remove obsolete stuff from README
author Chris Cannam
date Tue, 03 Dec 2013 16:33:08 +0000
parents df33703ace3b
children
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
Chris@15 13 #include <cstdio>
Chris@15 14
cannam@12 15 #include <QMutexLocker>
cannam@12 16
cannam@12 17 std::map<QString, int>
cannam@12 18 FDWriteAction::m_fdMap;
cannam@12 19
cannam@12 20 QString
cannam@12 21 FDWriteAction::m_previousData = "";
cannam@12 22
cannam@12 23 FDWriteAction::FDWriteAction(QString file,
cannam@12 24 QString data,
cannam@12 25 bool togglePrevious) :
cannam@12 26 m_data(data),
cannam@12 27 m_togglePrevious(togglePrevious)
cannam@12 28 {
cannam@12 29 QMutexLocker locker(&m_mutex);
cannam@12 30 if (m_fdMap.find(file) != m_fdMap.end()) {
cannam@12 31 m_fd = m_fdMap[file];
cannam@12 32 } else {
cannam@12 33 m_fd = open(file.toLocal8Bit().data(), O_WRONLY | O_NOCTTY);
cannam@12 34 if (m_fd < 0) {
cannam@12 35 perror("Failed to open output file");
cannam@12 36 std::cerr << "ERROR: FDWriteAction: Unable to open \""
cannam@12 37 << file.toStdString() << "\" for writing" << std::endl;
cannam@12 38 return;
cannam@12 39 }
cannam@12 40 struct termios t;
cannam@12 41 tcgetattr(m_fd, &t);
cannam@12 42 t.c_cflag = B9600 | CS8 | CLOCAL;
cannam@12 43 t.c_iflag = 0;
cannam@12 44 t.c_oflag = 0;
cannam@12 45 t.c_lflag = ICANON;
cannam@12 46 tcflush(m_fd, TCOFLUSH);
cannam@12 47 tcsetattr(m_fd, TCSANOW, &t);
cannam@12 48 m_fdMap[file] = m_fd;
cannam@12 49 }
cannam@12 50 }
cannam@12 51
cannam@12 52 FDWriteAction::~FDWriteAction()
cannam@12 53 {
cannam@12 54 // don't close fds -- lazily leave them for program exit rather
cannam@12 55 // than go to the bother of reference counting
cannam@12 56 }
cannam@12 57
cannam@12 58 QString
cannam@12 59 FDWriteAction::getName() const
cannam@12 60 {
cannam@12 61 return QString("fdwrite: \"%1\",%2")
cannam@12 62 .arg(m_data)
cannam@12 63 .arg(m_togglePrevious);
cannam@12 64 }
cannam@12 65
cannam@12 66 void
cannam@12 67 FDWriteAction::fire()
cannam@12 68 {
cannam@12 69 if (m_fd < 0) return;
cannam@12 70 QMutexLocker locker(&m_mutex);
cannam@12 71 if (m_togglePrevious) {
cannam@12 72 if (m_previousData == m_data) return;
cannam@13 73 std::cerr << getName().toStdString() << ": fire" << std::endl;
cannam@12 74 if (m_previousData != "") {
cannam@12 75 // bug here
cannam@12 76 write(m_fd, m_previousData.toLocal8Bit().data(), m_previousData.length());
cannam@12 77 usleep(100000);
cannam@12 78 }
cannam@12 79 }
cannam@12 80 // bug here
cannam@12 81 write(m_fd, m_data.toLocal8Bit().data(), m_data.length());
cannam@12 82 m_previousData = m_data;
cannam@12 83 usleep(100000);
cannam@12 84 }
cannam@12 85
cannam@12 86