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 std::cerr << getName().toStdString() << ": fire" << std::endl;
|
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@12
|
73 if (m_previousData != "") {
|
cannam@12
|
74 // bug here
|
cannam@12
|
75 write(m_fd, m_previousData.toLocal8Bit().data(), m_previousData.length());
|
cannam@12
|
76 usleep(100000);
|
cannam@12
|
77 }
|
cannam@12
|
78 }
|
cannam@12
|
79 // bug here
|
cannam@12
|
80 write(m_fd, m_data.toLocal8Bit().data(), m_data.length());
|
cannam@12
|
81 m_previousData = m_data;
|
cannam@12
|
82 usleep(100000);
|
cannam@12
|
83 }
|
cannam@12
|
84
|
cannam@12
|
85
|