cannam@12: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@12: cannam@12: #include "FDWriteAction.h" cannam@12: cannam@12: #include cannam@12: cannam@12: #include cannam@12: #include cannam@12: #include cannam@12: #include cannam@12: #include cannam@12: Chris@15: #include Chris@15: cannam@12: #include cannam@12: cannam@12: std::map cannam@12: FDWriteAction::m_fdMap; cannam@12: cannam@12: QString cannam@12: FDWriteAction::m_previousData = ""; cannam@12: cannam@12: FDWriteAction::FDWriteAction(QString file, cannam@12: QString data, cannam@12: bool togglePrevious) : cannam@12: m_data(data), cannam@12: m_togglePrevious(togglePrevious) cannam@12: { cannam@12: QMutexLocker locker(&m_mutex); cannam@12: if (m_fdMap.find(file) != m_fdMap.end()) { cannam@12: m_fd = m_fdMap[file]; cannam@12: } else { cannam@12: m_fd = open(file.toLocal8Bit().data(), O_WRONLY | O_NOCTTY); cannam@12: if (m_fd < 0) { cannam@12: perror("Failed to open output file"); cannam@12: std::cerr << "ERROR: FDWriteAction: Unable to open \"" cannam@12: << file.toStdString() << "\" for writing" << std::endl; cannam@12: return; cannam@12: } cannam@12: struct termios t; cannam@12: tcgetattr(m_fd, &t); cannam@12: t.c_cflag = B9600 | CS8 | CLOCAL; cannam@12: t.c_iflag = 0; cannam@12: t.c_oflag = 0; cannam@12: t.c_lflag = ICANON; cannam@12: tcflush(m_fd, TCOFLUSH); cannam@12: tcsetattr(m_fd, TCSANOW, &t); cannam@12: m_fdMap[file] = m_fd; cannam@12: } cannam@12: } cannam@12: cannam@12: FDWriteAction::~FDWriteAction() cannam@12: { cannam@12: // don't close fds -- lazily leave them for program exit rather cannam@12: // than go to the bother of reference counting cannam@12: } cannam@12: cannam@12: QString cannam@12: FDWriteAction::getName() const cannam@12: { cannam@12: return QString("fdwrite: \"%1\",%2") cannam@12: .arg(m_data) cannam@12: .arg(m_togglePrevious); cannam@12: } cannam@12: cannam@12: void cannam@12: FDWriteAction::fire() cannam@12: { cannam@12: if (m_fd < 0) return; cannam@12: QMutexLocker locker(&m_mutex); cannam@12: if (m_togglePrevious) { cannam@12: if (m_previousData == m_data) return; cannam@13: std::cerr << getName().toStdString() << ": fire" << std::endl; cannam@12: if (m_previousData != "") { cannam@12: // bug here cannam@12: write(m_fd, m_previousData.toLocal8Bit().data(), m_previousData.length()); cannam@12: usleep(100000); cannam@12: } cannam@12: } cannam@12: // bug here cannam@12: write(m_fd, m_data.toLocal8Bit().data(), m_data.length()); cannam@12: m_previousData = m_data; cannam@12: usleep(100000); cannam@12: } cannam@12: cannam@12: