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
|